VBA를 사용하여 Excel에서 중복 값 제거하기

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Younjung Kim

Last updated on 3월 26, 2023

이 튜토리얼에서는 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 열의 ‘사과’ 중복이 제거되었습니다. 사용자는 불필요한 워크시트 없이 깔끔한 상태로 돌아왔으며, 화면 깜박임이나 경고 메시지 없이 전체 프로세스가 원활하게 완료되었습니다.

vba-free-addin

VBA 코드 예시 추가 기능

본 웹사이트에 있는 모든 코드 예시에 쉽게 접근해보세요.

메뉴로 이동하여 클릭만 하면 코드는 모듈에 바로 입력됩니다. .xlam 추가 기능.

(설치가 필요 없습니다!)

무료 다운로드

VBA 코드 예시로 돌아가기