Ваш код гораздо динамичнее c, но, учитывая то, как представлены ваши данные, вам может не потребоваться учитывать столько вещей.
Это то, что я сделал и получил желаемый результат. При необходимости измените / добавьте диапазоны.
Sub Unique_List_Sum()
'First generate unique list for products**************
Dim X
Dim objDict As Object
Dim lngRow As Long
Dim r As Range
Set objDict = CreateObject("Scripting.Dictionary")
X = Application.Transpose(Range([B1], Cells(Rows.Count, "B").End(xlUp)))
For lngRow = 1 To UBound(X, 1)
objDict(X(lngRow)) = 1
Next
Range("E1:E" & objDict.Count) = Application.Transpose(objDict.keys)
'Secont sumif each unique*****************
Set r = ActiveSheet.Range("E2:E" & objDict.Count) 'no need to sum "Product"
For Each prod In r
'end loop at blank cell
If prod = "" Then
Exit For
End If
prod.Offset(0, 1).Value = Application.WorksheetFunction.SumIf(Range("B:B"), prod, Range("A:A"))
Next prod
End Sub
Кредит метода уникального списка: Заполнение уникальных значений в массив VBA из Excel user brettdj
****** Если значение вашего снимка экрана «Данные:» находится в ячейке A1, измените имена вкладок на «Madds Data» и «Madds Output», и это запустится для вас:
Sub Madds_Dups()
Sheets("Madds Data").Select
Range("E:E").Copy Destination:=Sheets("Madds Output").Range("A1")
Sheets("Madds Output").Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo
Sheets("Madds Output").Select
'delete blank row
Rows("1:1").Select
Selection.Delete shift:=xlUp
'Loop sums
Set r = ActiveSheet.Range("A2:A1000")
For Each prod In r
'end loop at blank cell
If prod = "" Then
Exit For
End If
prod.Offset(0, 1).Value = Application.WorksheetFunction.SumIf(Sheets("Madds Data").Range("E:E"), prod, Sheets("Madds Data").Range("C:C"))
Next prod
End Sub