Я выбрал другое решение, используя смесь VBA и формул.Я думаю, что это немного более читабельно и, конечно, короче.Может быть, это не пуристская идея кода VBA, но именно так мне нравится делать вещи.Код предполагает, что входная таблица находится в столбцах A: D, а выходные данные будут в столбцах E: I - это, конечно, можно изменить.
Sub unique()
Dim arr As New Collection, a
Dim tmp() As Variant, var() As Variant
Dim i As Long, j As Long, iRowCount As Long, iNewRowCount As Long
Dim str As String
Dim rng As Range
iRowCount = Cells(Rows.Count, "A").End(xlUp).Row
Set rng = Range("A2:C" & iRowCount)
' Columns 1 & 3 - create unique list
tmp = rng
For i = 1 To UBound(tmp, 1)
ReDim Preserve var(i)
var(i) = CStr(tmp(i, 1) & tmp(i, 3))
Next
On Error Resume Next
For Each a In var
arr.Add a, a
Next
On Error GoTo 0
For i = 2 To arr.Count + 1
Cells(i, 6) = Left(arr(i - 1), Len(arr(i - 1)) - 1)
Cells(i, 8) = Right(arr(i - 1), 1)
Next
iNewRowCount = Cells(Rows.Count, "F").End(xlUp).Row
' Column 2 - sum based on columns 1 & 3
Range("G2") = "=SUMIFS($B$2:$B$" & iRowCount & ",$A$2:$A$" & iRowCount & ",""=""&F2,$C$2:$C$" & iRowCount & ",""=""&H2)"
Range("G2:G" & iNewRowCount).FillDown
'Column 4 concatenate with comma
For i = 2 To iNewRowCount
For j = 2 To iRowCount
If Cells(j, 1) & Cells(j, 3) = Cells(i, 6) & Cells(i, 8) Then
str = str & Cells(j, 4) & ","
End If
Next
Cells(i, 9) = Left(str, Len(str) - 1)
str = ""
Next
End Sub
Или просто сделайте это ленивым способом, создайте сводную таблицу и используйте формулы для объединения строк: