본문 바로가기

엑셀로 풀어가는 세상

[VBA] Dictionary에 대한 이해2 - Double Dictionary

Dictionary의 Item으로 올 수 있는 것들은 String,Number,Sheet,Workbook,Dictionary,Collection,True,False,.. 등이 있다.

즉 눈에 띄는 것이 Dictionary이다.

Dictionary의 Item으로 다른 Dictionary를 쓸 수 있다는 것이다.

Sub Double_Dictionary240116()

      Dim oDic As New Scripting.Dictionary
      Dim rngO As Range
      Dim vData As Variant
      Dim sKey As String, r As Long
      
      Set rngO = Range("a2").CurrentRegion
      vData = rngO.Offset(1).Resize(rngO.Rows.Count - 1).Value
      '"rngO.Offset(1).Resize(rngO.Rows.Count - 1)"구간의 값을 vData라는 배열방에 집어넣는다.
      
      Dim oDicX As Scripting.Dictionary
      
      For r = 1 To UBound(vData, 1)
            sKey = Join(Array(vData(r, 2), vData(r, 3), vData(r, 4), vData(r, 5)), "-")
            If oDic.Exists(sKey) Then
                  Set oDicX = oDic.Item(sKey)    
                  'odic(딕셔너리)의 item값은 odicx(딕셔너리)이다.
                  '--->odic의 item값은 odicx이다
                  oDicX.Item("money") = oDicX.Item("money") & "+" & vData(r, 6)   
                  'oDicX.Item("money")의미:odicx의 key값이 money인 item의 값! 
                  '즉 딕셔너리odicx에서 money의 item값!!
                  oDicX.Item("subject") = oDicX.Item("subject") & "/" & vData(r, 8)
            Else
                  Set oDicX = New Scripting.Dictionary 'odicx라는 새로운 딕셔너리 생성하여
                  oDicX.Add "money", vData(r, 6)   
                  'key값이 money이며 vdata(r,6)을 item값으로 하여 odicx(딕셔너리)에 더한다.
                  oDicX.Add "subject", vData(r, 8)   
                  'key값이 subject이며 vdata(r,8)을 item값으로 하여 odicx(딕셔너리)에 더한다.
                  oDic.Add sKey, oDicX    
                  'key값이 skey이며 odicx를 item값으로 하여 odic(딕셔너리)에 더한다.
            End If
      Next r
           
      Dim key As Variant
      Dim rTarget As Range
      Dim iR As Long
      Dim vMoney As String, vSubject As String
      
      Set rTarget = Range("a20")
      iR = 1
      
      For Each key In oDic.Keys
            vMoney = oDic.Item(key).Item("money")  
            'odic.item(key)는 odicx딕셔너리임!!!.
            '따라서 odicx.item("money")는 vdata(r,6)임??
            vSubject = oDic.Item(key).Item("subject")
            
            rTarget.Offset(0, 1).Resize(1, 4).Value = Split(key, "-")
            rTarget.Offset(0, 5).Value = Application.Evaluate(vMoney)
            rTarget.Offset(0, 7).Value = vSubject
          
            rTarget.Value = iR   '??????
            iR = iR + UBound(Split(vSubject, "/")) + 1   '???????
            
            Set rTarget = rTarget.Offset(1, 0)
      Next
End Sub

 

Double Dictionary.xlsm
0.02MB

 

https://www.youtube.com/watch?v=IMhzMtDCUO8&t=1075s

 

반응형