[VBA] 엑셀(EXCEL) 중복데이터 병합 방법

반응형
    반응형

    엑셀 데이터를 다루다보면 중복데이터 포함되어 있는 경우가 왕왕 있다.

     

    이 경우 [홈]-[조건부 서식]-[셀 강조 규칙]을 이용해서 중복되는 데이터를 표시해놓고 하나, 하나 삭제하고는 했다.

     

    데이터가 수십 ~ 수백개 정도면 이렇게 할 수 있다.

     

    그런데 데이터가 수천개인 경우라면? 하나하나 체크해서 삭제하는 것도 수시간이 걸린다.

     

    데이터 중 일부는 중복하면서 합쳐야 하는 경우라면 문제는 심각해진다. 

     

    예시

     

    예를 들어, 위 데이터에서 이름은 철수가 있는 2개의 행을 합치되, 서로 다른 주문 내역은 병합하고 싶은 경우가 있다. 

     

    VBA를 이용하면 이 문제를 해결할 수 있다. 

    Sub MergeDuplicateRows()
        Dim ws As Worksheet
        Dim lastRow As Long
        Dim dict As Object
        Dim i As Long
        Dim key As String
        
        Set ws = ActiveSheet
        lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
        
        Set dict = CreateObject("Scripting.Dictionary")
        
        ' 각 행 순회, 중복된 값을 찾아서 A열의 값들을 "/"로 구분하여 합침
        For i = 2 To lastRow
            key = ws.Cells(i, "B").Value
            
            If dict.Exists(key) Then
                dict(key) = dict(key) & "/" & ws.Cells(i, "A").Value
            Else
                dict.Add key, ws.Cells(i, "A").Value
            End If
        Next i
        
        ' 역순으로 행 순회, 중복된 값을 가진 행들 중 마지막에 발견된 행에 합쳐진 결과를 저장하고 다른 행을 삭제
        For i = lastRow To 2 Step -1
            key = ws.Cells(i, "B").Value
            
            If dict.Exists(key) Then
                ws.Cells(i, "A").Value = dict(key)
                dict.Remove(key)
            Else
                ws.Rows(i).Delete
            End If
        Next i
        
        Application.DisplayAlerts = False
        ThisWorkbook.Save
        Application.DisplayAlerts = True
        
        Set dict = Nothing
        Set ws = Nothing
    End Sub

    위의 코드를 엑셀의 [개발 도구]-[VISUAL BASIC]을 열어서, [입력]-[모듈]에 넣어주면 된다.

    그 후에 엑셀의 [개발 도구]-[매크로]에서 제작한 코드를 [실행]해주면 끝. 

     

    결과

    위의 결과처럼 주문 내역이 모여서 병합된 것을 알 수 있다. 

     

    [끝]

    반응형

    댓글

    Designed by JB FACTORY