본문 바로가기
VBA

[VBA] 딕셔너리 배열로 대체하기

by 일등미노왕국 2022. 4. 8.

딕셔너리를 두고 자꾸 왜 뻘짓을 하는지...

딕셔너리를 대체하는 배열을 만들어 보았다...

데이터가 많으면 컴이 뻗어 버린다....

 

딕셔너리 열심히 하자...

Option Explicit

Sub Haja_딕셔너리_대체()

    Dim vall: vall = Range([c3], [c3].End(2).End(4))        '= 영역설정
    Dim Va, Vresult()                                       '= 결과 배열과 개체순환배열
    Dim Str                                                 '= 배열의 index 위치값
    Dim n&, i&, r&: r = 1                                   '= 결과 배열과 전체배열의 반복 변수
    Dim Cmax&: Cmax = 2                                     '= 결과 배열의 전체 열너비 크기
    
    [j2].CurrentRegion.Clear                                '= 초기화
    
    ReDim Vresult(1 To UBound(vall, 1), 1 To 2)             '= 결과 배열을 임시로 크기를 잡음
    
    For Each Va In Application.Index(vall, , 1)             '= 전체 배열을 순환
    
        Str = Application.Match(Va, Application.Index(Vresult, , 1), 0)  '= 결과 배열에서 개체배열을 찾아라
        
        If TypeName(Str) = "Error" Then                     '= 찾은 값이 없다면 / 에러가 난다면
            n = n + 1                                       '= N값을 +1
            Vresult(n, 1) = Va                              '= 결과 배열의 key값에 Va를 넣고
            Vresult(n, 2) = vall(r, 2)                      '= Item값에 배열의 두번째 값을 넣어라
            
        Else                                                '= 찾는 값이 결과 배열에 있다면 / 에러가 안 난다면
            For i = 2 To UBound(Vresult, 1)                 '= 전체길이를 순환해라
            
                If Cmax < i Then                            '= Cmax 보다 i값이 크다면 / 열 너비가 업데이트 된다면
                
                   Cmax = i                                 '= Cmax 에 해당 i값을 넣어라
                   ReDim Preserve Vresult(1 To UBound(vall, 1), 1 To Cmax)  '= 열너비를 증가해라
                   
                End If
                
                If Vresult(Str, i) = Empty Then              '= 배열의 열방향으로 비교하다가 비어있는 자리에
                                
                   Vresult(Str, i) = vall(r, 2)              '= 신규값을 업데이트해라
                   
                   Exit For
                End If
            
            Next i
            
        End If
        r = r + 1
    
    Next Va
    
    Call haja_header(Cmax)                                   '= 헤더값 표시
    
    [j3].Resize(n, Cmax) = Vresult                           '= 결과값을 출력해라
    
    With Range([j2], [j2].End(2))
        .Font.Bold = True
        .Interior.Color = 15983321
        
    End With
    
    With Range("j2").CurrentRegion
        .HorizontalAlignment = xlCenter
        .Borders.LineStyle = 1
    End With

End Sub

Sub haja_header(Cmax&)
    
    Dim i&
    [j2] = "지역"
    
    For i = 1 To Cmax - 1
    
        Cells(2, i + 10) = "값" & i
    
    Next i
    
End Sub

딕셔너리 대체.xlsm
0.09MB

댓글