Sum up column B based on colum C values

帅比萌擦擦* 提交于 2019-12-08 13:46:26

问题


I have a quick question: I try to sum up in a table of 4 columns column number 2 if the value in column number 1 AND 3 matches. I found a sample code here on stack overflow, but it counts currently based on column 1. I'm new to VBA and don't know what to change or how to adjust the code to base my calculations on column 1 and 3. Here is the sample code:

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

Could you please advise me how I can solve this problem. Below you can find a sample picture of my small table. The quantity of the yellow part, for instance, shall be summed up and the second row shall be deleted.

Sample Table - Picture


回答1:


you said "I try to sum up in a table of 4 columns column number 2" but from your "Sample Table - Picture" I'd understand you want to sum up column number 4

edited after OP variation of data range

Assuming what above you could try the following

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

it makes use of two "helper" columns, which I assumed could be the two adjacent to the last data columns (i.e.: if data columns are "A:D" then helper columns are "E:F")

should you need to use different "helper" columns then see comments about how they are located and change code accordingly



来源:https://stackoverflow.com/questions/36673117/sum-up-column-b-based-on-colum-c-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!