EXCEL VBA

엑셀 VBA에서 Dictionary 사용하기

카루루1007 2024. 8. 21. 11:20
728x90
반응형

딕셔너리(Dictionary)키(Key)와 값(Value)을 한 쌍으로 데이터를 저장합니다.

사전에서 단어(키)를 찾아 의미(값)를 찾는 것과 비슷합니다.

엑셀 VBA에서 역시 딕셔너리(Dictionary)를 사용할 수 있으며,

딕셔너리(Dictionary)를 사용하면 데이터를 효율적으로 관리하고 빠르게 검색할 수 있습니다.

 

딕셔너리(Dictionary)에서 

키(Key)는 고유한 값을 가집니다.

마치, 우리의 주민등록번호와 비슷한 역할을 합니다.

 

주민등록번호 - 이름 - 나이 - 성별

이라는 데이터를 만들었을 때

이름과 나이, 그리고 성별이 같은 사람은 여러 사람이 있을 수 있지만,

주민등록번호가 같은 사람은 없는 것과 비슷한 의미입니다.

 

728x90

 딕셔너리(Dictionary) 생성하는 방법

 

딕셔너리(Dictionary)를 생성하는 방법은 간단합니다.

Dim dict as Object

set dict = CreateObject("Scripting.Dictionary")

 

 딕셔너리(Dictionary) 주요 사용법

 

딕셔너리(Dictionary)키와 값을 추가하기 위해서는

Add 메서드를 사용합니다.

Sub dict()
    Dim dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    
    MsgBox dict("사과")
End Sub

 

아래와 같이 키값이 있다면 값만 별도로 할당할 수도 있습니다.

이때 이미 키에 값이 할당되어 있었다면

그 값은 지워지고 새로운 값이 할당이 됩니다.

Sub dict()
    Dim dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    
    dict("사과") = 2000
    
    MsgBox dict("사과")
End Sub

 

딕셔너리(Dictionary)지정된 키가 존재하는지 확인할 때에는

exists 메서드를 사용합니다.

Sub dict()
    Dim dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    
    MsgBox dict("사과")
    
    If dict.exists("사과") Then
        MsgBox "사과가 존재합니다."
    End If
End Sub

 

딕셔너리(Dictionary)항목 삭제하는 방법은

한 번에 모든 키와 값을 삭제하는 방법이 있고

하나씩 삭제하는 방법입니다.

 

한번에 모든 키와 값을 삭제할 때에는

RemoveAll 메서드를 사용합니다.

Sub dict()
    Dim dict As Object
    Dim key As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    dict.Add "배", 2000
    
    For Each key In dict.keys
        Debug.Print key & " : " & dict(key)
    Next key
End Sub

이 코드를 실행하면 딕셔너리(Dictionary)의 키와 값을 확인할 수 있습니다.

하지만 중간에 RemoveAll 메서드를 사용하면 아무것도 확인이 되지 않습니다.

Sub dict()
    Dim dict As Object
    Dim key As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    dict.Add "배", 2000
    
    dict.RemoveAll
    
    For Each key In dict.keys
        Debug.Print key & " : " & dict(key)
    Next key
End Sub

 

하나씩 지울 때Remove(key)를 사용합니다.

Sub dict()
    Dim dict As Object
    Dim key As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "사과", 1000
    dict.Add "배", 2000
    
    dict.Remove ("사과")
    
    For Each key In dict.keys
        Debug.Print key & " : " & dict(key)
    Next key
End Sub

 

반응형

마지막으로 위 예시들에서 딕셔너리(Dictionary)

키를 불러올 때dict.kyes 를 사용했습니다.

값을 불러올 때는 dict.items를 사용합니다.

 

딕셔너리(Dictionary)의 값배열을 사용할 수 있습니다.

이럴 경우 하나의 키가 여러 개의 값을 가질 수 있습니다.

Sub dict()
    Dim dict As Object
    Dim score As Variant
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "홍길동", Array(90, 85, 78)
    dict.Add "김철수", Array(88, 92, 95)
    
    For Each score In dict("홍길동")
        Debug.Print score
Next score

 

딕셔너리(Dictionary) 안에 딕셔너리(Dictionary)를 중첩하여 사용이 가능합니다.

Sub dict()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    dict.Add "홍길동", CreateObject("Scripting.Dictionary")
    dict("홍길동").Add "국어", 90
    dict("홍길동").Add "영어", 85
    dict("홍길동").Add "수학", 78
    
    dict.Add "김철수", CreateObject("Scripting.Dictionary")
    dict("김철수").Add "국어", 88
    dict("김철수").Add "영어", 92
    dict("김철수").Add "수학", 95
    
    Debug.Print dict("홍길동")("국어")
End Sub

 

 딕셔너리(Dictionary) 개체 생성하기

 

마지막으로 딕셔너리(Dictionary) 개체를 생성하는 방법을 알아보겠습니다.

VBA 편집기에서 도구 참조를 누르면 아래와 같은 창이 나타납니다.

Microsoft Scripting Runtime를 체크하고 확인을 누릅니다.

 

이제 아래와 같이 사용이 가능합니다.

Sub dict()
    Dim dict As Dictionary
    
    Set dict = New Scripting.Dictionary
        
    dict.Add "홍길동", New Scripting.Dictionary
    dict("홍길동").Add "국어", 90
    dict("홍길동").Add "영어", 85
    dict("홍길동").Add "수학", 78
    
    dict.Add "김철수", New Scripting.Dictionary
    dict("김철수").Add "국어", 88
    dict("김철수").Add "영어", 92
    dict("김철수").Add "수학", 95
    
    Debug.Print dict("홍길동")("국어")
End Sub

 

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

728x90
반응형