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)
'컴퓨터 > 엑셀' 카테고리의 다른 글
| vba 임대료 주소 배열에 저장 배열에 저장된 주소에 셀색 칠하기, access 외부데이터 가져오기 (0) | 2024.04.20 |
|---|---|
| vba 2차원배열 variant 이용, range 이용 (0) | 2024.04.19 |
| 엑셀vba 시트 지우기 (0) | 2024.03.01 |
| 엑셀vba 항목별 각 시트로 나누기-계정별원장-ADODB.Recordset-excelandvba (0) | 2024.02.29 |
| 엑셀디자인 엑셀vba 시트나누기 - 계정별원장 (0) | 2024.02.24 |