VBA를 사용하여 Excel에서 중복 값 제거하기
In this Article
이 튜토리얼에서는 VBA에서 RemoveDuplicates 메서드를 사용하여 중복을 제거하는 방법을 보여 줍니다.
RemoveDuplicates 메서드
Excel 워크시트로 데이터를 가져오거나 붙여넣을 때 종종 중복된 값이 포함될 수 있습니다. 데이터를 정리하고 중복을 제거해야 하는 경우가 있습니다.
다행히도 VBA의 Range 객체 내에서 이 작업을 수행할 수 있는 간단한 방법이 있습니다.
Range(“A1:C8”).RemoveDuplicates Columns:=1, Header:=xlYes
구문은 아래와 같습니다:
RemoveDuplicates [Columns],[Header]
- [Columns] – 중복 값을 검사할 열들을 지정합니다. 입력한 모든 열이 일치하면 중복으로 간주됩니다.
- [Header] – 데이터에 헤더가 있는지 확인합니다. xlNo (기본값), xlYes, xlYesNoGuess
엄밀히 말하면 두 매개변수는 모두 선택 사항입니다. 그러나 Columns 인수를 지정하지 않으면 중복이 제거되지 않습니다.
[Header]의 기본값은 xlNo. 물론 이 인수를 지정하는 것이 더 좋지만 헤더 행이 있는 경우 헤더 행이 중복으로 일치할 가능성은 거의 없습니다.
RemoveDuplicates 사용 참고 사항
- RemoveDuplicates 메서드를 사용하기 전에 사용할 범위를 지정해야 합니다.
- RemoveDuplicates 메서드는 원본 행은 유지한 상태에서 중복이 발견된 나머지 행을 제거합니다.
- RemoveDuplicates 메서드는 행이 아닌 열에서만 작동하지만 VBA 코드를 사용하여 열에서도 작동하도록 할 수 있습니다(이 방법에 대해서는 다음에 살펴보겠습니다).
VBA 예제를 위한 샘플데이터
예제 코드의 작동 방식을 보여주기 위해 다음 샘플 데이터가 사용됩니다:
중복 행 제거하기
이 코드는 A 열의 값만 기준으로 모든 중복 행을 제거합니다:
Sub RemoveDupsEx1()
Range(“A1:C8”).RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
“A1:C8” 범위를 정의한 것을 알 수 있습니다. 정의된 범위 대신 UsedRange를 사용할 수 있습니다. UsedRange는 데이터의 마지막 행과 열을 결정하고 해당 전체 범위에 RemoveDuplicates를 적용합니다:
Sub RemoveDups_UsedRange()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
UsedRange는 범위를 명시적으로 정의할 필요가 없어 매우 유용합니다.
코드를 실행하면 다음과 같이 표시됩니다:
A 열(1열)만 지정되었으므로 이전 샘플데이터의 5행에 있던 ‘사과’ 중복이 제거된 것을 알 수 있습니다. 중복행의 수량(2열)은 값이 다르게 되어 있었습니다.
여러 열을 비교하여 중복을 제거하려면 Array 메서드를 사용하여 해당 열들을 지정할 수 있습니다.
여러 열을 비교하여 중복 제거하기
Sub RemoveDups_MultColumns()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2) , Header:=xlYes
End Sub
배열은 VBA에 1열과 2열(A와 B)을 모두 사용하여 데이터를 비교하도록 지시합니다.
배열내에 정의된 열은 연속된 순서일 필요는 없습니다.
Sub SimpleExample()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(3, 1) , Header:=xlYes
End Sub
이 예제에서는 1열과 3열이 중복 비교에 사용됩니다.
이 코드 예제에서는 세 열을 모두 사용하여 중복 여부를 확인합니다:
Sub SimpleExample()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3) , Header:=xlYes
End Sub
Table에서 중복 행 제거하기
RemoveDuplicates를 Excel table 에도 똑같은 방식으로 적용할 수 있습니다. 하지만 구문은 약간 다릅니다.
Sub SimpleExample()
ActiveSheet.ListObjects("Table1").DataBodyRange.RemoveDuplicates Columns:=Array(1, 3), _
Header:=xlYes
End Sub
이렇게 하면 열 1과 3(A와 C)을 기준으로 테이블의 중복 항목이 제거됩니다. 그러나 표의 색상 서식을 정리하지는 않으며 표 하단에 색상이 지정된 빈 행이 남게 됩니다.
배열에서 중복 제거하기
배열에서 중복된 값을 제거해야 하는 경우, 배열을 Excel로 출력하고 RemoveDuplicates 메서드를 사용한 다음 배열을 다시 가져올 수 있습니다.
배열에서 중복을 제거하는 VBA 프로시저는 여기를 참고해 주세요.
VBA를 사용하여 데이터 행에서 중복 제거하기
RemoveDuplicates 메서드는 데이터 열에서만 작동하지만, 창의적인 사고를 통해 데이터 행을 처리하는 VBA 프로시저를 만들 수 있습니다.
워크시트에서 데이터가 다음과 같이 보인다고 가정해 보겠습니다:
B열과 E열에 이전과 동일한 중복이 있지만 RemoveDuplicates 메서드를 사용하여 제거할 수 없습니다.
VBA를 사용하여 추가 워크시트를 만들고, 데이터를 열로 바꾸어 복사한 다음, 중복을 제거한 다음, 다시 행으로 바꾸어 복사하면 데이터 행에 있는 중복을 RemoveDuplicates 메서드를 통해 제거할 수 있습니다.
Sub DuplicatesInRows()
'화면 업데이트 및 알림 끄기 - 사용자가 현재 실행되고 있는 화면을 보지 않고 코드가 원할하게 실행됩니다.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'새로운 워크시트를 추가합니다
Sheets.Add After:=ActiveSheet
'새로운 워크시트의 이름을 "CopySheet"로 설정합니다.
ActiveSheet.Name = "CopySheet"
'원본 워크시트에서 데이터를 복사합니다.
Sheets("DataInRows").UsedRange.Copy
'생성된 새 시트를 활성화합니다.
Sheets("CopySheet").Activate
'열 기준으로 데이터를 정렬하도록 데이터의 행/열을 바꾸어서 붙여넣습니다.
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
'1열과 3열에 대한 중복을 제거합니다.
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 3), Header _
:=xlYes
'원본시트의 데이터를 삭제합니다.
Sheets("DataInRows").UsedRange.ClearContents
'새로운 워크시트의 데이터를 복사합니다.
Sheets("Copysheet").UsedRange.Copy
'원본 시트를 활성화합니다.
Sheets("DataInRows").Activate
'중복이 제거된 데이터의 열과 행을 바꾸어서 붙여넣습니다.
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
'CopySheet를 제거합니다 - 더 이상 필요 없음
Sheets("Copysheet").Delete
'원본 시트를 활성화합니다.
Sheets("DataInRows").Activate
'화면 업데이트 및 알람을 다시 켭니다.
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
이 코드는 행 단위의 원본 데이터가 ‘DataInRows’라는 워크시트에 있다고 가정합니다.
코드를 실행하면 다음과 같이 표시됩니다:
이제 E 열의 ‘사과’ 중복이 제거되었습니다. 사용자는 불필요한 워크시트 없이 깔끔한 상태로 돌아왔으며, 화면 깜박임이나 경고 메시지 없이 전체 프로세스가 원활하게 완료되었습니다.