请测试下一个代码。它将返回(在下一张表中的上述代码中,但它可以在任何一张表中返回)唯一客户,然后是总产品数,在接下来的列中是订购的产品:
Sub ProductsPerClient()
Dim sh As Worksheet, sh1 As Worksheet, lastR As Long, arr, arrSpl, arrFin, colMax As Long
Dim i As Long, j As Long, dict As Object
Set sh = ActiveSheet
Set sh1 = sh.Next 'use here the sheet you need
lastR = sh.Range("A" & sh.rows.count).End(xlUp).row
arr = sh.Range("A2:C" & lastR).value
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr)
arrSpl = Split(Trim(arr(i, 3)), ",")
If Not dict.Exists(arr(i, 1)) Then
dict.Add arr(i, 1), Join(arrSpl, "|")
If UBound(arrSpl) + 1 > colMax Then colMax = UBound(arrSpl) + 1
Else
dict(arr(i, 1)) = dict(arr(i, 1)) & "|" & Join(arrSpl, "|")
If UBound(Split(dict(arr(i, 1)), "|")) + 1 > colMax Then colMax = UBound(Split(dict(arr(i, 1)), "|")) + 1
End If
Next i
ReDim arrFin(1 To dict.count, 1 To colMax + 2)
For i = 0 To dict.count - 1
arrFin(i + 1, 1) = dict.Keys()(i)
arrSpl = Split(dict.items()(i), "|")
arrFin(i + 1, 2) = UBound(arrSpl) + 1
For j = 0 To UBound(arrSpl)
arrFin(i + 1, j + 3) = arrSpl(j)
Next j
Next i
'drop the final array content:
sh1.Range("A2").Resize(UBound(arrFin), UBound(arrFin, 2)).value = arrFin
End Sub