두 개의 열에 구성 요소와 레이블을 데이터베이스로 내보냈습니다. A 열에는 구성 요소가 포함되고 B 열에는 구성 요소와 관련된 레이블이 포함됩니다. 동일한 구성 요소가 A열에 여러 번 표시될 수 있지만 레이블 집합은 다릅니다.
셀 D에 고유한 구성 요소 목록을 만들고 E 열의 구성 요소 옆에 있는 셀에 관련된 모든 레이블을 나열해야 합니다.
A열에 고유한 값 목록을 만드는 방법은 알고 있지만 동일한 셀에 둘 이상의 값이 나타나는 경우 값을 구분하는 방법은 모릅니다. 데이터베이스가 이 데이터를 내보내는 방법을 변경할 수 없습니다.
이것이 유일한 방법이라면 이를 위한 매크로를 만들 수 있을 만큼 VBA에 대해 충분히 알고 있습니다. 어떤 도움이라도 주시면 감사하겠습니다.
내가 해야 할 일은 다음과 같습니다.
답변1
2차원 사전을 만들면 이렇게 할 수 있습니다. 나는 고유성을 고려하기 때문에 사전을 제안했습니다. 나는 작업을 수행하는 매크로를 작성했습니다(적어도 예제 데이터에서는). 먼저 2차원 데이터 구조를 설정한 다음 알파벳순으로 정렬하여 인쇄합니다. 여기에는 내가 찾은 정렬 기능의 단순화된 버전이 포함되어 있습니다.https://exceloffthegrid.com/sorting-an-array-alphabetically-with-vba/
내 매크로 데이터는 라인 1( For i = 1 To Cells(Row.Count...
)부터 데이터가 포함된 마지막 라인까지 읽혀집니다. 필요한 경우 조정하십시오. 올바른 열 문자를 설정했을 수도 있습니다(ActiveSheet.Range를 검색하면 표시됩니다).
정렬 기능은 알파벳순으로 정렬되므로 레이블 11이 레이블 2 앞에 옵니다. 이것이 문제인 경우 가장 빠른 방법은 비교하기 전에 레이블을 숫자로 변환하는 레이블 배열에 대한 두 번째 정렬 함수를 만드는 것입니다. 나는 이것이 끔찍한 성능을 가져온다는 것을 알고 있지만 그것이 중요하지 않기를 바랍니다 :)
먼저 매크로는 모든 입력 줄을 읽고 , 문자로 나눕니다(공백을 먼저 제거합니다. 구성 요소와 레이블이 항상 쉼표와 공백으로 구분되어 있으면 단순화할 수 있습니다). 각 구성요소에 대해 라벨이 저장되고 채워지는 하위 사전이 생성됩니다. 구성 요소가 여러 번 발생하면 기존 사전이 업데이트됩니다. 이것이 첫 번째 주요 For 루프입니다. 데이터가 설정되면 D열과 E열로 정렬된 데이터가 인쇄됩니다. 이것이 두 번째 주요 For Each 루프입니다.
마지막으로 코드(시트의 코드 모듈이 아닌 통합 문서 섹션에 있지만 거기에서도 작동할 수 있음):
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