VB(A)

Dictionary

당근쨈 2015. 9. 12. 18:50

고유값 추출과 배열 삽입 등 Dictionary를 사용한 예.

예제 파일에 텍스트의 셀서식이 회계로 돼있어서 약간 헷갈렸네.

거래처별 고유값을 추출하지 않아도 된다는 점은 함정.

그것도 모르고 고유값 추출...;;

Option Explicit
Sub Macro()
 
    Dim rngA As Range
    Dim rngK As Range
    Dim rnG As Range
    Dim X As Object
    Dim dicA As Variant
    Dim vObj As Variant
    Dim vDic() As String
    Dim i As Byte
    
    Application.ScreenUpdating = False
    
    'A열 K열 범위 설정
    Set X = CreateObject("Scripting.Dictionary")
    Set rngA = Range("A4", Cells(Rows.Count, "A").End(3))
    Set rngK = Range("K4", Cells(Rows.Count, "K").End(3))
    
    'A열과 K열의 고유값 추출 후 배열에 삽입
    For Each rnG In Union(rngA, rngK)
        If Not X.exists(rnG.Text) Then
            X.Add rnG.Text, CStr(rnG)
        End If
    Next rnG
    dicA = X.items
    
    'G열 기존자료 삭제 후 고유값 입력
    With Range("G4")
        Range(.Cells, .End(4)).ClearContents
    End With
    Range("G4").Resize(X.Count) = WorksheetFunction.Transpose(dicA)
    
    'A열과 G열 비교해서 A열에 없는 거래처명을 A열의 아래쪽에 입력
    For Each vObj In dicA
        If WorksheetFunction.CountIf(rngA, vObj) = 0 Then
            ReDim Preserve vDic(i)
            vDic(i) = vObj
            i = i + 1
        End If
    Next vObj
    
    On Error Resume Next
        Cells(Rows.Count, "A").End(3)(2).Resize(UBound(vDic) + 1= WorksheetFunction.Transpose(vDic)
    On Error GoTo 0
    
    '배열 및 변수 초기화
    Erase vDic
    i = 0
    
    'K열과 G열 비교해서 A열에 없는 거래처명을 A열의 아래쪽에 입력
    For Each vObj In dicA
        If WorksheetFunction.CountIf(rngK, vObj) = 0 Then
            ReDim Preserve vDic(i)
            vDic(i) = vObj
            i = i + 1
        End If
    Next vObj
    
    On Error Resume Next
        Cells(Rows.Count, "K").End(3)(2).Resize(UBound(vDic) + 1= WorksheetFunction.Transpose(vDic)
    On Error GoTo 0
    
    Application.ScreenUpdating = True
        
End Sub
cs








'VB(A)' 카테고리의 다른 글

엑셀 2010 이상 이미지 삽입  (0) 2015.09.22
맨 앞의 값만 가져오기  (0) 2015.09.15
같은 내용끼리 셀병합  (2) 2015.09.03
알파벳과 숫자의 최대값  (0) 2015.09.01
각 시트에서 중복된 연락처만 가져오기  (0) 2015.08.21