반응형
반응형
엑셀 데이터를 다루다보면 중복데이터 포함되어 있는 경우가 왕왕 있다.
이 경우 [홈]-[조건부 서식]-[셀 강조 규칙]을 이용해서 중복되는 데이터를 표시해놓고 하나, 하나 삭제하고는 했다.
데이터가 수십 ~ 수백개 정도면 이렇게 할 수 있다.
그런데 데이터가 수천개인 경우라면? 하나하나 체크해서 삭제하는 것도 수시간이 걸린다.
데이터 중 일부는 중복하면서 합쳐야 하는 경우라면 문제는 심각해진다.

예를 들어, 위 데이터에서 이름은 철수가 있는 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]을 열어서, [입력]-[모듈]에 넣어주면 된다.
그 후에 엑셀의 [개발 도구]-[매크로]에서 제작한 코드를 [실행]해주면 끝.

위의 결과처럼 주문 내역이 모여서 병합된 것을 알 수 있다.
[끝]
반응형
'0th Pipeline - Self-development > How to programming' 카테고리의 다른 글
[파이썬] 데이터 언패킹(data unpacking): 효율적으로 코드 짜는 Tip (0) | 2023.07.16 |
---|---|
[파이썬] 리스트 메소드(함수)의 종류 (0) | 2023.07.16 |
[파이썬] n-그램 생성기: 인접하는 단어 조합 생성기 (0) | 2023.07.07 |
[파이썬] 문자열 메소드 종류 및 예시 (0) | 2023.06.13 |
<5> 파이썬의 자료형 살펴보기 (0) | 2022.12.25 |