VB(A)

[Dictionary] 일정 정보만을 그대로 두고 여럿 존재하는 값(행렬 전환하여 붙이기)

당근쨈 2016. 12. 27. 07:30

http://cafe.naver.com/excelmaster/134021


고객번호, 성명, 주소는 동일하나

물품순번, 물품대금, 배송료, 물품코드, 배송기관이 여러 건일 경우

여럿 존재하는 값인 물품순번, 물품대금, 배송료, 물품코드, 배송기관을 행렬 전환하여 붙여주는 매크로


Dictionary를 사용하여 중복값을 제거하고 배열을 사용하였다.

임시배열을 사용하여 2차원 배열 중 1차배열을 증가시켜주었다.


뭐든지 짜고 나면 별 거 아닌 코드들.

짜기 전엔 세상에서 가장 어려운 코드들.

게다가 이제는 그 코드가 그 코드같은 느낌이...



Option Explicit
Option Base 1
 
Sub Macro()
 
    Dim D As Object
    Dim MyData As Range
    Dim CustomerNumber, v(), tmp
    Dim MaxGoods%, i%, j%, a%, b%, CountD%
    Dim f&, ff&
    
    '기존자료 삭제
    Range("K2").CurrentRegion.Offset(1).ClearContents
    
    '변수설정
    Set D = CreateObject("scripting.dictionary")    'Dictionary 선언
    j = 1   '배열 초기값
    With Range("A1").CurrentRegion  '데이터영역
        Set MyData = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    With MyData
        CustomerNumber = .Value '전체 데이터를 배열에 삽입
        MaxGoods = 3 + WorksheetFunction.Max(.Columns(4)) * 5   '최대물품순번을 변수에
    End With
    
    '최종 데이터를 담을 배열 선언
    ReDim v(j, MaxGoods)
    
    '고객번호를 순환(고객번호가 기본키이므로)
    For i = 1 To UBound(CustomerNumber, 1)
    
        '고객번호가 처음 나오면 배열에 삽입
        If Not D.exists(CustomerNumber(i, 1)) Then
            
            D.Add CustomerNumber(i, 1), j   '중복되지 않은 고객번호를 Dictionary에 삽입
            
            '1차원 배열을 늘려줌(팬텀s님, 고맙습니다)
            If j > 1 Then
                tmp = v
                ReDim v(j, MaxGoods)
                
                For f = 1 To UBound(tmp, 1)
                    For ff = 1 To UBound(tmp, 2)
                        v(f, ff) = tmp(f, ff)
                    Next ff
                Next f
            End If
            
            '최종 배열에 데이터 입력
            For a = 1 To 8
                v(j, a) = CustomerNumber(i, a)
            Next a
            
            j = j + 1
        
        '고객번호가 있으면(물품순번이 2 이상일 때) 기존 배열에 자료 삽입
        Else
            CountD = D.Item(CustomerNumber(i, 1))   'Dictionary에서 고객번호가 일치하는 키를 찾음
            b = CustomerNumber(i, 4* 5    '물품순번이 2부터 시작할 때 배열 순서 지정
            
            '물품순번이 2부터 시작할 때 물품순번~배송기관을 배열에 삽입
            For a = -1 To 3
                v(CountD, a + b) = CustomerNumber(i, a + 5)
            Next a
            
        End If
    Next i
    
    Erase tmp   '임시 배열 초기화
    Range("K2").Resize(f, MaxGoods) = v '자료 출력
    
End Sub
 
 
 
 
cs


엑셀방법.xlsm