答案1
您可以透過製作二維字典來做到這一點。我建議使用字典,因為它可以保證唯一性。我已經編寫了一個執行該任務的巨集(至少在您的範例資料上)。它首先設定二維資料結構,然後按字母順序列印出來。它包括我在這裡找到的排序函數的簡化版本:https://exceloffthegrid.com/sorting-an-array-alphabetically-with-vba/
在我的巨集中,資料是從第 1 行 ( For i = 1 To Cells(Row.Count...
) 讀取到包含資料的最後一行。必要時進行調整。您可能還設定了正確的列字母(只需搜尋 ActiveSheet.Range,您就會看到)。
請注意,排序函數按字母順序排序,因此標籤11 將出現在標籤2 之前。轉換為數字。我知道,我知道這會帶來糟糕的效能,但希望這並不重要:)
首先,巨集讀取所有輸入行並用 , 字元分割它們(刪除先前的空格 - 如果元件和標籤始終用逗號和空格分隔,則可以簡化)。它為每個組件創建一個子字典,其中存儲標籤並填充它們。如果某個元件出現多次,則更新現有字典。這是第一個主 For 迴圈。如果資料已設置,它將列印排序到 D 列和 E 列的資料。
最後是程式碼(我將其放在工作簿部分中,而不是在工作表的程式碼模組中,但也可以在那裡工作):
Sub CollectLabels()
Dim spl() As String
Dim dict
Dim subDict
Dim lbl As String
' Collect data into a 2-dimensional dictionary
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
comps = Split(Replace(ActiveSheet.Range("A" & i).Text, " ", ""), ",")
For Each comp In comps
If Not dict.Exists(comp) Then
Set subDict = CreateObject("Scripting.Dictionary")
dict.Add comp, subDict
End If
Labels = Split(Replace(ActiveSheet.Range("B" & i).Text, " ", ""), ",")
For Each Label In Labels
dict(comp)(Label) = 1
Next Label
Next comp
Next i
i = 1
' Output the dictionary contents
For Each Key In SortArray(dict.Keys)
ActiveSheet.Range("D" & i).Value = Key
lbl = ""
For Each Key2 In SortArray(dict(Key).Keys)
lbl = lbl & Key2 & ", "
Next Key2
ActiveSheet.Range("E" & i).Value = lbl
i = i + 1
Next Key
End Sub
Function SortArray(arr As Variant)
Dim i As Long
Dim j As Long
Dim Temp
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
Temp = arr(j)
arr(j) = arr(i)
arr(i) = Temp
End If
Next j
Next i
SortArray = arr
End Function