엑셀 VBA #118 / Dictionary 개체_기본 [VBA]
[New Dictionary]
Dim dict As Oject
Set dict = CreateObject("scripting.dictionary")
위 두 문장으로 된 구문( Late Binding이라 함)을
아래 하나의 문장으로 된 구문( Early Binding이라 함)으로 할 수 있다.
Dim dict As New Scripting.Dictionary
1.구조
Dictionary이름명. Add Key Item
2. 예시
dict.Add "사과",111
dict.Add "바나나",222
dict.Add "딸기",333
3. For ~ Next문에 적용
3.1. 기본
Dim dict As New Scripting.Dictionary
Dim i As Long
dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333
For i = 0 To 2
Cells(i + 1, 1) = dict.Items(i)
Next
위 구문의 문제점은 Item 갯수가 아주 많은 경우에는 처리속도가 느려진다는 것이다..
그래서 Key 및 Item값을 워크시트에 한꺼번 뿌려줄 필요가 있다.
이것을 할 수 있는 방법이 '배열'이다.
3.1. 동적배열
Dim dict As New Scripting.Dictionary
Dim i As Long
Dim arr() As Variant '동적배열 적용. arr()의 값 유형을 모르니 Variant로 한다.
dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333
For i = 0 To 2
'Cells(i + 1, 1) = dict.Items(i)
ReDim Preserve arr(i) ' 동적배열 적용문으로 동적배열의 사이즈를 i값으로 재선언
arr(i) = dict.Items(i) 'item(i)값을 arr방에 집어넣기!!!!
Next
이제는 arr방에 들어온 item(i)값을 시트에 뿌려보자
......
arr(i) = dict.Items(i)
Next
range("A1:A3") =arr
메모리 상에서는 arr은 아래 그림처럼 가로로 담겨져 있다.
이를 A1:A3로 올바르게 뿌려지기 위해서는 Transpose함수를 아래처럼 적용해야 한다.
range("A1:A3") =Application.transpose(arr)
3.1.1. UBound & LBound
For~Next문에서 i의 마지막 값을 프로그램이 자동으로 지정할 수 있도록 해야한다. 하드코딩하는 방법을 바람직하지 않다.프로그램이 알아서 값을 지정할 수 있도록 하는 변수에는 UBound와 LBound가 있다.
For i = 0 To 2
For i = 0 To UBound(dict.Items)
4. 최종 코드
Sub Pdictionary()
Dim dict As New Scripting.Dictionary
Dim i As Long
Dim arr() As Variant
dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333
For i = 0 To UBound(dict.Items)
'Cells(i + 1, 1) = dict.Items(i)
ReDim Preserve arr(i)
arr(i) = dict.Items(i)
Next
Range("A1:A3") = Application.Transpose(arr)
End Sub
VBA - Dictionary(Late vs Early Binding) by 우노사설
https://www.youtube.com/watch?v=1yBE6MGkIA4&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=120
'엑셀로 풀어가는 세상' 카테고리의 다른 글
[엑셀이뭐니]매크로 기초 11강-Match 함수로 찾기(응용편)/ 중단모드 해제하기/ 엑셀 VBA 기초 (0) | 2023.12.21 |
---|---|
엑셀 VBA #122 / 헷갈리는 시트, 셀 제어 [VBA] (0) | 2023.12.20 |
엑셀 VBA #126 / Vlookup시리즈2_배열 활용 [VBA] (0) | 2023.12.19 |
엑셀 VBA #119 / Dictionary 개체_실무 [VBA] (0) | 2023.12.19 |
엑셀 VBA #65 / 질문 답변(데이터 취합) [VBA] (0) | 2023.12.19 |
엑셀 VBA #52 / 중복데이터 처리_5 [VBA]-고유항목별 합계구하기 (0) | 2023.12.16 |
엑셀 VBA #51 / 중복데이터 처리_4 [VBA] - 사용자정의함수 (0) | 2023.12.16 |
엑셀 VBA #50 / 중복데이터 처리_3 [VBA]-Union (0) | 2023.12.15 |