VBA 중복 제거: 내장 기능과 Dictionary 추출 비교

VBA 중복 제거를 자동화할 때 먼저 정할 것은 속도가 아니라 남길 행입니다. 같은 Key가 두 번 나오면 첫 행의 Name을 남기는 작은 표로 시작해 보겠습니다. 내장 중복 제거와 Dictionary 추출을 비교하되, 두 예제 모두 원본 대신 새 통합문서에 결과를 만듭니다.

준비 환경과 중복 기준

데스크톱 Excel의 VBA 편집기와 매크로 실행 권한이 필요합니다. 웹에서 파일을 열어 수식을 보는 작업과는 다릅니다. 조직에서 매크로를 차단한다면 보안 설정을 전체 해제하지 말고 관리자 지침을 따르세요. Dictionary 방식은 해당 환경에서 Scripting.Dictionary 개체를 만들 수 있어야 합니다. 이 글은 특정 Windows 또는 Mac 버전에서 실행했다는 기록을 제공하지 않습니다.

실습 기준은 A열 Key만 같으면 중복, 위에 있는 첫 행을 유지입니다. 이름이 같아도 Key가 다르면 다른 행입니다. 반대로 이름이 달라도 Key가 같으면 뒤의 이름은 결과에서 빠집니다. 실제 명단에서 이름만으로 사람을 합치는 규칙으로 바꾸면 안 됩니다.

DataA1:B5의 E1·E2·E1·E3 네 행에서 첫 Alpha를 유지해 E1·E2·E3 세 행을 기대하는 도해
DataA1:B5의 E1·E2·E1·E3 네 행에서 첫 Alpha를 유지해 E1·E2·E3 세 행을 기대하는 도해. 실제 앱 실행 화면이 아닌 설명 도해이며 Microsoft Excel·VBA·Outlook의 실행이나 성공을 확인한 증거가 아닙니다.

설명용 이미지입니다. 실제 Excel 실행 결과는 아래 입력표와 기대값으로 비교합니다.

1. Data 시트에 네 행 준비하기

첨부 ZIP의 input.csv를 Excel에서 열고 시트 이름을 정확히 Data로 바꿉니다. 파일은 별도 폴더에 매크로 사용 통합문서 .xlsm으로 저장합니다. 예제 코드는 이 통합문서에 넣어야 합니다. 이미 업무 데이터가 든 파일에 붙여 넣지 마세요.

셀 범위 Key Name
A1:B1 Key Name
A2:B2 E1 Alpha
A3:B3 E2 Beta
A4:B4 E1 Alpha duplicate
A5:B5 E3 Gamma

헤더를 제외하면 입력은 4행입니다. A2와 A4는 Key가 E1으로 같고, Name은 다릅니다. 이 차이를 일부러 넣었습니다. 결과에 Alpha가 남는지까지 확인해야 첫 행 보존 규칙을 확인할 수 있습니다.

범위는 Data!A1:B5로 고정합니다. 동적으로 마지막 행을 찾는 코드가 아니므로 A6 아래의 데이터를 추가해도 이 예제에서는 처리하지 않습니다. 빈 Key, 오류 셀, 날짜, 숫자와 문자열이 섞인 키는 이번 입력에서 제외합니다.

2. 두 매크로를 같은 모듈에 넣기

VBA 편집기에서 실습 통합문서의 프로젝트를 선택합니다. ZIP의 DuplicateExamples.bas를 가져오거나, 표준 모듈 하나를 추가한 뒤 아래 코드를 붙여 넣습니다. 두 방법을 동시에 하지 마세요. 같은 이름의 프로시저가 중복될 수 있습니다.

Option Explicit

Public Sub RemoveDuplicatesInCopy()
    Dim src As Worksheet, dst As Worksheet
    Set src = ThisWorkbook.Worksheets("Data")
    If src.Range("A1").Value2 <> "Key" Or src.Range("B1").Value2 <> "Name" Then
        Err.Raise vbObjectError + 71, "RemoveDuplicatesInCopy", "Expected Key and Name headers."
    End If
    Set dst = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    dst.Range("A1:B5").Value2 = src.Range("A1:B5").Value2
    dst.Range("A1:B5").RemoveDuplicates Columns:=Array(1), Header:=xlYes
End Sub

Public Sub UniqueRowsWithDictionary()
    Dim src As Worksheet, dst As Worksheet, seen As Object
    Dim r As Long, nextRow As Long, key As String
    Set src = ThisWorkbook.Worksheets("Data")
    If src.Range("A1").Value2 <> "Key" Or src.Range("B1").Value2 <> "Name" Then
        Err.Raise vbObjectError + 72, "UniqueRowsWithDictionary", "Expected Key and Name headers."
    End If
    Set seen = CreateObject("Scripting.Dictionary")
    seen.CompareMode = vbTextCompare
    Set dst = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    dst.Range("A1:B1").Value2 = src.Range("A1:B1").Value2
    nextRow = 2
    For r = 2 To 5
        key = Trim$(CStr(src.Cells(r, 1).Value2))
        If Len(key) > 0 And Not seen.Exists(key) Then
            seen.Add key, True
            dst.Cells(nextRow, 1).Resize(1, 2).Value2 = src.Cells(r, 1).Resize(1, 2).Value2
            nextRow = nextRow + 1
        End If
    Next r
End Sub

VBA 편집기의 컴파일 메뉴로 문법 오류부터 확인한 뒤, 실습 통합문서에 들어 있는 RemoveDuplicatesInCopy를 실행합니다. 새 결과 통합문서가 열리면 원본과 구별할 수 있게 창을 나란히 배치합니다. 그다음 원본 프로젝트에 들어 있는 UniqueRowsWithDictionary를 실행해 두 번째 결과 통합문서를 만듭니다.

ThisWorkbook은 코드를 담은 통합문서입니다. 결과 창을 클릭했다고 원본을 가리키는 대상이 바뀌지는 않습니다. 코드를 개인용 매크로 통합문서에 넣으면 그쪽에서 Data 시트를 찾으므로, 이번에는 반드시 실습 파일의 프로젝트를 선택하세요.

내장 중복 제거와 Dictionary가 각각 새 통합 문서에 값만 만드는 흐름과 두 방식의 빈 키·공백 처리 차이를 설명한 도해
내장 중복 제거와 Dictionary가 각각 새 통합 문서에 값만 만드는 흐름과 두 방식의 빈 키·공백 처리 차이를 설명한 도해. 실제 앱 실행 화면이 아닌 설명 도해이며 Microsoft Excel·VBA·Outlook의 실행이나 성공을 확인한 증거가 아닙니다.

실행 순서는 입력 4행 준비, 모듈 가져오기, 두 방법 각각 실행, 결과 비교입니다.

3. 내장 기능과 Dictionary의 차이 읽기

첫 매크로는 A1:B5의 값을 새 통합문서로 옮긴 다음 RemoveDuplicates를 실행합니다. Columns:=Array(1)은 지정한 범위 안의 첫 번째 열을 중복 기준으로 삼는다는 뜻입니다. Header:=xlYes로 첫 행이 헤더임을 명시합니다. 인수의 의미는 Microsoft Range.RemoveDuplicates 문서를 참고하세요.

두 번째 매크로는 위에서부터 Key를 읽고, 아직 등록되지 않은 키의 두 셀만 새 결과에 기록합니다. seen.Exists(key)로 이미 본 키를 구별합니다. Dictionary의 키 등록과 조회 기능은 Microsoft Dictionary 문서에 설명되어 있습니다.

비교 항목 내장 중복 제거 Dictionary 추출
처리 대상 새 통합문서로 복사한 A1:B5 원본 A2:A5에서 읽은 키
결과 쓰기 복사본 범위에서 중복 제거 처음 본 키의 A:B 값만 기록
이번 입력의 기대 결과 첫 E1, E2, E3 첫 E1, E2, E3
빈 키 처리 별도 제외 규칙을 두지 않음 길이 0인 키는 건너뜀
앞뒤 공백 처리 코드에서 따로 정리하지 않음 Trim$로 키의 앞뒤 일반 공백 제거
적용 범위 지정한 열 기준의 간단한 제거 별도 조건을 코드로 표현할 때

vbTextCompare는 문자열 키를 텍스트 비교하도록 지정합니다. 데이터가 들어간 뒤 비교 모드를 바꾸면 오류가 날 수 있어 키를 추가하기 전에 설정했습니다. 이 동작은 Microsoft CompareMode 문서에서 확인할 수 있습니다.

두 방법이 모든 데이터에서 같은 결과를 낸다는 뜻은 아닙니다. 여기서는 빈칸과 서식 차이가 없는 E1, E2, E3 텍스트 키만 비교합니다. Trim$만 적용한다고 탭, 줄바꿈, 모든 유니코드 공백이 정리되는 것도 아닙니다. 공백·대소문자·숫자·날짜까지 포함하는 업무 규칙은 별도로 정의하고 입력을 늘려 확인해야 합니다.

4. 합격 값은 3행과 첫 번째 이름

두 결과 통합문서의 A1:B4를 아래 표 또는 ZIP의 expected.csv와 비교합니다. 입력을 기준으로 E1 두 행 중 첫 행을 남겼으므로 데이터 행 수는 3입니다.

Key 기대 Name
E1 Alpha
E2 Beta
E3 Gamma
  1. 결과의 키 순서가 E1, E2, E3인지 확인합니다.

  2. E1의 Name이 Alpha인지 확인합니다. Alpha duplicate라면 이번 글의 첫 행 보존 규칙과 다릅니다.

  3. 결과 A5:B5에 네 번째 데이터가 남아 있지 않은지 확인합니다.

  4. 원본 Data 시트의 A2:B5에는 Alpha duplicate를 포함한 입력 4행이 그대로 있는지 확인합니다.

  5. 각 결과 통합문서가 별개인지 확인하고, 필요한 결과만 다른 이름으로 저장합니다.

성공 메시지가 떴는지보다 키, 값, 순서, 행 수, 원본 보존을 함께 비교하는 것이 중요합니다. 제공한 expected.csv는 예제 규칙으로 작성한 고정 기대값이며, 실제 Excel 실행으로 얻은 로그가 아닙니다.

5. 실패했을 때 확인할 위치와 복구

증상 먼저 볼 곳 다음 행동
Data 시트를 찾지 못함 코드를 넣은 통합문서와 시트 탭 이름 원본 프로젝트에 모듈을 넣고 Data로 이름 통일
Expected Key and Name headers 오류 A1과 B1의 값 Key, Name을 공백 없이 입력
같은 이름의 프로시저 오류 기존 모듈과 새 모듈 중복으로 가져온 실습 모듈 하나만 제거
Dictionary 개체 생성 오류 실행 환경의 개체 지원 Dictionary 방식은 중단하고 내장 방식으로 실습
결과가 기대값과 다름 A1:B5 입력과 실행한 매크로 업무 파일에 적용하지 말고 샘플 네 행으로 복귀

중간 오류가 났다면 새로 생긴 결과 통합문서만 저장하지 않고 닫고 원인을 확인합니다. 두 코드에는 원본 쓰기나 자동 저장 명령이 없습니다. 그래도 실습 전에 별도 파일로 복사해 두는 이유는 코드 수정이나 잘못된 프로젝트 선택까지 자동으로 복구해 주지는 않기 때문입니다.

E1·E2·E3 순서와 첫 Alpha, 결과 A5:B5 빈칸, 원본4행 보존과 별도 결과 통합문서를 확인하는 도해
E1·E2·E3 순서와 첫 Alpha, 결과 A5:B5 빈칸, 원본4행 보존과 별도 결과 통합문서를 확인하는 도해. 실제 앱 실행 화면이 아닌 설명 도해이며 Microsoft Excel·VBA·Outlook의 실행이나 성공을 확인한 증거가 아닙니다.

원본 4행 보존과 결과 3행의 키·이름을 함께 확인합니다.

적용 한계: 고정 범위와 값 복사

이 예제는 값만 복사하므로 원본 수식, 셀 서식, 표 개체를 보존하는 변환기가 아닙니다. 여러 열의 조합을 키로 쓰려면 단순 문자열 이어 붙이기에서 구분자 충돌이 없는지도 생각해야 합니다. 최신 행을 남기거나 빈 키를 별도로 보고하는 요구도 현재 코드에는 들어 있지 않습니다.

대량 데이터의 처리 시간을 측정하지 않았으므로 몇 초 안에 끝난다는 보장은 하지 않습니다. 먼저 복사본의 작은 범위에서 규칙을 합의하고, 기대값이 같은지 확인한 뒤 범위와 코드의 반복 구간을 함께 조정하세요.

이어서 볼 내용

공식 문서 확인일: 2026-09-11. 실제 Office 앱 실행 검증과는 별개의 출처 확인입니다.

작성자 소개