컴퓨터/엑셀
엑셀vba arraylist [엑셀 실무]Dictionary+ArrayList를 이용한 Key(Name+Id) 별로 데이타 통합
풍경소리^^
2024. 3. 1. 16:29
https://www.youtube.com/watch?v=6c3oYe6TYp0
원시데이터
Name | ID | Product |
AAA | 11111 | Bible |
BBB | 22222 | Water |
AAA | 11111 | NoteBook |
BBB | 22222 | Pc |
CCC | 33333 | Mouse |
AAA | 11111 | Dictionary |
DDD | 44444 | Keyboard |
'-------------------------------------------'
Sub get_key_values()
'-------------------------------------------
'https://www.youtube.com/watch?v=6c3oYe6TYp0
'도구-참조-Microsoft Scripting Runtime
Dim varX As Variant: varX = Range("B2").CurrentRegion.Value '1부터 시작
Dim i As Long
Dim oDic As New Scripting.Dictionary ' key, value
Dim sKey As String ' key = name+id
Dim oList As Object
'-------------------------------------------
For i = 2 To UBound(varX, 1)
'-------------------------------------------
' Name, Id를 키로 사용
sKey = varX(i, 1) & "-" & varX(i, 2)
'-------------------------------------------
If oDic.Exists(sKey) Then ' 키가 있으면
'-------------------------------------------
oDic.Item(sKey).Add varX(i, 3)
Else ' 키가 없으면
'
Set oList = CreateObject("System.collections.ArrayList")
oList.Add varX(i, 3)
oDic.Add sKey, oList 'key, value(arraylist)
End If
Next i
' 데이타 붙여 넣을 시작 셀
Dim rngX As Range: Set rngX = [B11]
Dim vKey As Variant, vValue As Variant
' Dictionary Key를 돌며
For Each Key In oDic.Keys
' "-"구분자로 배열로 변환
vKey = Split(Key, "-")
' Name, Id입력
rngX.Resize(1, 2).Value = vKey ' vKey(0) AAA, vKey(1) 11111
' 소트
oDic.Item(Key).Sort
vValue = oDic.Item(Key).toArray ' ArrayList의 요소를 배열로 변환
rngX.Offset(0, 2).Value = Join(vValue, ",")
' rngX.Offset(0, 2).Resize(1, UBound(vValue, 1) + 1).Value = vValue
Set rngX = rngX.Offset(1)
Next
End Sub
Dim varX As Variant: varX = Range("B2").CurrentRegion.Value
' Name, Id를 키로 사용
sKey = varX(i, 1) & "-" & varX(i, 2)
Else ' 키가 없으면
oList.Add varX(i, 3)
oDic.Add sKey, oList
' key, value(arraylist)
첫번째
?oDic.keys()(0)
AAA-11111
?oList.Item(0)
Bible
두번째
세번째
네번째
다섯번째
여섯번째
일곱번째
' Dictionary Key를 돌며
For Each Key In oDic.Keys
' "-"구분자로 배열로 변환
vKey = Split(Key, "-") ' Name, Id입력
rngX.Resize(1, 2).Value = vKey ' vKey(0) AAA, vKey(1) 11111
oDic.Item(Key).Sort ' 항목 소트
vValue = oDic.Item(Key).toArray ' ArrayList의 요소를 배열로 변환
rngX.Offset(0, 2).Resize(1, UBound(vValue, 1) + 1).Value = vValue '오른쪽 셀로 뿌리기
rngX.Offset(0, 2).Value = Join(vValue, ",") ' 한 셀에 ","로 항목넣기
Set rngX = rngX.Offset(1)