본문 바로가기
Dictionary

Dictionary를 이용하여 행/열 변환하기

2024. 2. 16.
Sub TransformAndWriteData()

    Dim Data As Variant    ' 원본 데이터를 저장할 변수
    Dim Temp As Variant    ' 변환된 데이터를 저장할 변수
    Dim dict As Object    ' 딕셔너리 객체를 저장할 변수
    Dim Valu As Long    ' 데이터 열의 최대  개수를 저장할 변수
    Dim i As Long    ' 반복문에서  사용할  인덱스 변수
    Dim x As Long    ' 새로운 행의  인덱스를 저장할 변수
    Dim xx As Long    ' 데이터 열의  인덱스를 저장할 변수

' Data 시트에서 데이터를  가져옴
    Data = Sheets("Data").Cells(2, 2).CurrentRegion

    ' 딕셔너리 객체를 생성
    Set dict = CreateObject("Scripting.Dictionary")

    ' 변환된 데이터를 저장할 배열을 초기화
    ReDim Temp(1 To UBound(Data), 1 To UBound(Data))

    For i = 2 To UBound(Data)
        ' 딕셔너리에  해당 ID가 없으면 새로운 행을 추가
        If Not dict.Exists(Data(i, 1)) Then
            dict.Add Data(i, 1), ""
            x = x + 1
            xx = 3
            Temp(x, 1) = x
            Temp(x, 2) = Data(i, 1)
            Temp(x, xx) = Data(i, 2) & "-" & Data(i, 3)
        Else
            ' 딕셔너리에  해당 ID가 있으면 데이터를 추가
            xx = xx + 1
            Temp(x, xx) = Data(i, 2) & "-" & Data(i, 3)
        End If

        ' 데이터 열의 최대  개수를 업데이트
        If xx > Valu Then Valu = xx
    Next i

    ' Result 시트에 결과를 작성
    With Sheets("Result")
        .UsedRange.Clear
        .Cells(1, 1).Resize(, 2) = Array("No", "Id")   ' 헤더
        .Cells(1, 3).Resize(, Valu - 2) = "Data"   ' 데이터 열의 헤더
        .Cells(2, 1).Resize(x, Valu).Value = Temp  ' 변환된 데이터

        ' 셀 크기를  자동으로  조정하고 테두리를 설정
        With .UsedRange: .Columns.AutoFit
            .Borders.Weight = 2
        End With
    End With
End Sub

 

매크로 실행 전

 

매크로 실행 후

 

* 이 코드는 공부용으로 이런 작업은 파워쿼리로 간단하게 해결 가능합니다.

'Dictionary' 카테고리의 다른 글

카테고리별로 시트 생성하여 나누기  (0) 2024.02.19