根据 C 列值对 B 列求和

Sum up column B based on colum C values

我有一个简单的问题:如果第 1 列和第 3 列中的值匹配,我尝试在第 2 列的 4 列中总结 table。我在此处找到了关于堆栈溢出的示例代码,但它目前基于第 1 列计数。我是 VBA 的新手,不知道要更改什么或如何调整代码以使我的计算基于第 1 列和 3. 这是示例代码:

Option Explicit

Sub testFunction()
   Dim rng As Excel.Range
   Dim arrProducts() As String
   Dim i As Long

Set rng = Sheet1.Range("A2:A9")

arrProducts = getSumOfCountArray(rng)

Sheet2.Range("A1:B1").Value = Array("Product", "Sum of Count")

' go through array and output to Sheet2
For i = 0 To UBound(arrProducts, 2)
    Sheet2.Cells(i + 2, "A").Value = arrProducts(0, i)
    Sheet2.Cells(i + 2, "B").Value = arrProducts(1, i)
Next

End Sub

' Pass in the range of the products
Function getSumOfCountArray(ByRef rngProduct As Excel.Range) As String()
Dim arrProducts() As String
Dim i As Long, j As Long
Dim index As Long

ReDim arrProducts(1, 0)

For j = 1 To rngProduct.Rows.Count
    index = getProductIndex(arrProducts, rngProduct.Cells(j, 1).Value)
    If (index = -1) Then
        ' create value in array
        ReDim Preserve arrProducts(1, i)
        arrProducts(0, i) = rngProduct.Cells(j, 1).Value ' product name
        arrProducts(1, i) = rngProduct.Cells(j, 2).Value ' count value
        i = i + 1
    Else
        ' value found, add to id
        arrProducts(1, index) = arrProducts(1, index) + rngProduct.Cells(j, 2).Value
    End If
Next

getSumOfCountArray = arrProducts
End Function

Function getProductIndex(ByRef arrProducts() As String, ByRef strSearch As String) As Long
' returns the index of the array if found
Dim i As Long
For i = 0 To UBound(arrProducts, 2)
    If (arrProducts(0, i) = strSearch) Then
        getProductIndex = i
        Exit Function
    End If
Next

' not found
getProductIndex = -1
End Function

Sum Column B based on Column A using Excel VBA Macro

你能告诉我如何解决这个问题吗?下面你可以找到我的小table的示例图片。比如黄色部分的数量要合计,删除第二行。

Sample Table - Picture

你说“我试着在一个 table 的 4 列第 2 列中总结”但是从你的 "Sample Table - Picture" 我会理解你想要总结第 4 列

已编辑 OP 数据范围变化后

假设您可以尝试以下内容

Option Explicit

Sub main()
On Error GoTo 0

With ActiveSheet '<== set here the actual sheet reference needed
'    With .Range("A:D").Resize(.cells(.Rows.Count, 1).End(xlUp).row) '<== here adjust "A:D" to whatever colums range you need
    With .Range("A51:D" & .cells(.Rows.Count, "A").End(xlUp).row) '<== here adjust "A:D" to whatever colums range you need
        With .Offset(1).Resize(.Rows.Count - 1)
            .Offset(, .Columns.Count).Resize(, 1).FormulaR1C1 = "=SUMIFS(C2, C1,RC1,C3, RC3)" '1st "helper column is the 1st column at the right of data columns (since ".Offset(, .Columns.Count)")
            .Columns(2).Value = .Offset(, .Columns.Count).Resize(, 1).Value 'reference to 1st "helper" column (since ".Offset(, .Columns.Count)")

            .Offset(, .Columns.Count).Resize(, 1).FormulaR1C1 = "=concatenate(RC1,RC3)"

            With .Offset(, .Columns.Count + 1).Resize(, 1) '2nd "helper" column is the 2nd column at the right of data columns (since ".Offset(, .Columns.Count + 1)"
                .FormulaR1C1 = "=IF(countIF(R1C[-1]:RC[-1],RC[-1])=countif(C[-1],RC[-1]),1,"""")" 'reference to 1st "helper" column (with all those "C[-1]")
                .Value = .Value
                .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
                .Offset(, -1).Resize(, 2).ClearContents ' reference to both "helper" columns: ".Offset(, -1)" reference the 1st since it shifts one column to the left from the one referenced in the preceeding "With.." statement (which is the 2nd column at thre right of data columns) and ".Resize(, 2)" enlarges to encose the adjacent column to the right
            End With
        End With
    End With
End With

End Sub

它使用了两个 "helper" 列,我假设它们可能是与最后一个数据列相邻的两个列(即:如果数据列是 "A:D" 那么辅助列是 "E:F")

如果您需要使用不同的 "helper" 列,请查看关于它们的位置的评论并相应地更改代码