请测试下一个代码。根据您的问题和 cmets,它应该返回看起来合乎逻辑。它假定您代表所需输出的图片是错误的。它从“E1”开始在同一张表中返回。当然,它可以很容易地适应任何地方返回:
Sub TestExtractFruitsPerAccount()
Dim sh As Worksheet, lastR As Long, arr, arrIt, i As Long
Dim arrFin, j As Long, dict As Object
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.rows.count).End(xlUp).Row
arr = sh.Range("A1:C" & lastR).value
Set dict = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(arr)
If Not dict.Exists(arr(i, 1)) Then
dict.Add arr(i, 1), Array(arr(i, 2) & "|" & arr(i, 3))
Else
arrIt = dict(arr(i, 1)): ReDim Preserve arrIt(UBound(arrIt) + 1)
arrIt(UBound(arrIt)) = arr(i, 2) & "|" & arr(i, 3)
dict(arr(i, 1)) = arrIt
End If
Next i
ReDim arrFin(1 To dict.count, 1 To 4)
Dim strApp As String, strBan As String, strMng As String
For i = 0 To dict.count - 1
arrFin(i + 1, 1) = dict.Keys()(i)
arrIt = dict.Items()(i)
For j = 0 To UBound(arrIt)
Select Case Split(arrIt(j), "|")(1)
Case "APPLE"
If strApp = "" Then
strApp = "Pkt." & Split(arrIt(j), "|")(0)
Else
strApp = strApp & "," & Split(arrIt(j), "|")(0)
End If
Case "BANANA"
If strBan = "" Then
strBan = "Pkt." & Split(arrIt(j), "|")(0)
Else
strBan = strBan & "," & Split(arrIt(j), "|")(0)
End If
Case "MANGO"
If strMng = "" Then
strMng = "Pkt." & Split(arrIt(j), "|")(0)
Else
strMng = strMng & "," & Split(arrIt(j), "|")(0)
End If
End Select
Next j
If strApp <> "" Then arrFin(i + 1, 2) = strApp
If strBan <> "" Then arrFin(i + 1, 3) = strBan
If strMng <> "" Then arrFin(i + 1, 4) = strMng
strApp = "": strBan = "": strMng = ""
Next i
sh.Range("E1").Resize(1, 4).value = Array("Account", "APPLE", "BANANA", "MANGO")
sh.Range("E2").Resize(dict.count, 4).value = arrFin
End Sub
我把你的问题当作一个挑战,即使根据我的口味至少它很奇怪。
请进行测试并发送一些反馈。这不是你需要的吗?如果没有,请尝试根据上述代码返回的内容更好地描述您的需求。
如果有不清楚的地方,请随时要求澄清。我可以评论代码行。我按原样发布它,以确保您会看到它。你的问题,事实上,很可能会被删除......