• 최초 작성일: 2015-06-02
  • 최종 수정일: 2026-09-30
  • 조회수: 15 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: VBA 파워 코딩 232회 - 중복 없이 자료 통합

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

여러 사람이 나누어 입력한 자료를 하나로 합쳐야 하는데, 같은 항목이 여기저기 중복으로 들어가 있는 경우가 종종 있습니다. 일일이 정렬해서 손으로 지워나가는 대신, VBA로 순식간에 중복 없이 통합해 보겠습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

여러 사람이 입력한 자료, 중복 없이 하나로 합치기

핵심 요약: 중복 없이 자료를 통합하는 ConsolData 프로시저

ConsolData 프로시저는 여러 영역을 Union으로 합친 뒤, Collection 개체의 키 중복 불가 특성을 이용해 단 몇 줄의 코드로 중복 없는 목록을 만들어 냅니다.

  • 영역 결합: Union(rngAdd1, rngAdd2, rngAdd3)으로 세 영역을 하나로
  • 중복 제거 원리: Collection.Add에서 키가 중복되면 오류 발생 → On Error Resume Next로 무시
  • 결과 출력: For Each 문으로 Collection을 순회하며 Result 영역에 나열
  • 완료 안내: MsgBox로 중복 없는 자료 개수 표시

질문 하나: A열의 데이터에 B열의 데이터를 합하여 E열에 나열하고 싶습니다. 공통된 자료는 한 번만 나열하려고 합니다. A열과 B열 자료를 E열에 복사한 다음 정렬하는 것 말고 자동으로 E열에 표시하고 싶습니다. 매크로로 가능할까요?

오래전에 받은 질문인 것 같은데… 질문 내용만 있고 예제 데이터는 어디로 달아났는지 보이지 않는군요. 요약하자면, 아래 그림과 같이 비슷한 성격의 자료를 여러 사람이 입력했는데, 문제는 중복 입력된 것과 새로운 것이 마구 섞여있다는 것입니다.

김담당, 이담당, 박담당 세 사람이 각자 입력한 이름 데이터가 세 개 열에 섞여 있는 워크시트
아이엑셀러

흔히 벌어지는 일인 것 같습니다. 이런 경우에는 흔히 (1) 각자가 입력한 데이터를 주욱 붙여넣고 '정렬'한 다음 하나씩 지워나가거나, (2) '고급 필터'에서 '동일한 레코드는 하나만' 항목을 이용하여 처리하는, 그리 아름답지 않은 방식을 볼 때마다 안타까워하곤 했던 기억이 납니다.

ConsolData 프로시저로 한 번에 통합하기

몇 명이서, 얼마나 많은 데이터를 입력했느냐에 상관없이 순식간에 처리할 수 있습니다. 그것도 아래와 같은 단 몇 줄의 코딩만으로 말입니다.

Sub ConsolData()

    Dim rngStart As Range
    Dim rngAdd1 As Range
    Dim rngAdd2 As Range
    Dim rngAdd3 As Range
    Dim rngUnion As Range
    Dim rngTarget As Range
    Dim rngCell As Range
    Dim colX As New Collection
    Dim varItem As Variant
    Dim intRow As Integer
    On Error Resume Next

    ' 각 담당자별로 입력한 영역을 Range 변수에 지정합니다.
    ' Add1, Add2, Add3은 Workplace 시트에 미리 이름 정의해 두었습니다.
    Set rngAdd1 = Range(Range("Add1"), Range("Add1").End(xlDown))
    Set rngAdd2 = Range(Range("Add2"), Range("Add2").End(xlDown))
    Set rngAdd3 = Range(Range("Add3"), Range("Add3").End(xlDown))
    Set rngUnion = Union(rngAdd1, rngAdd2, rngAdd3)
    ' 각 영역을 Union 메서드를 이용하여 하나의 영역으로 합칩니다.

    Range("Result").EntireColumn.ClearContents
    Range("Result") = "통합"

    For Each rngCell In rngUnion
        colX.Add rngCell.Value, CStr(rngCell.Value)
        ' Collection 개체를 이용하여 중복 없는(Unique) 항목들만 추려냅니다.
    Next rngCell

    For Each varItem In colX
        intRow = intRow + 1
        Range("Result").Offset(intRow, 0) = varItem
        ' 중복 없는 항목들을 지정한 영역에 차례대로 뿌려줍니다.

        If intRow > 22 Then ActiveWindow.SmallScroll down:=1
    Next varItem

    Application.Goto Range("A1"), True
    MsgBox "중복되지 않는 자료는 모두 " & intRow & "개입니다!", , "아이엑셀러 닷컴"
    On Error GoTo 0
    Application.Goto Sheets("Preface").Range("A1"), True

End Sub

코드 설명

세 담당자가 입력한 영역을 각각 Range 변수에 담은 뒤 Union 메서드로 하나의 영역으로 합칩니다. 그런 다음 Collection 개체에 값을 하나씩 Add하는데, 이미 있는 값을 다시 추가하려고 하면 오류가 발생하는 Collection의 특성(키 중복 불가)을 이용해 On Error Resume Next와 함께 자연스럽게 중복을 걸러냅니다.

바로 이런 경우에 써먹으려고 VBA를 배우는 것이겠지요. On Error GoTo 문에 대해서는 오류 처리 기법을 다룬 강좌를 참고하시기 바랍니다.

많이 응용해 보세요. 이 방법 말고 다른 방법으로도 해결할 수 있으니 한번 연구해 보시고요.

정리 — ConsolData 프로시저 핵심 요소

요소 역할
Union(rngAdd1, rngAdd2, rngAdd3) 세 담당자가 입력한 영역을 하나의 Range로 결합
colX.Add rngCell.Value, CStr(rngCell.Value) 값을 키로 사용해 Collection에 추가 — 중복 키는 오류로 자동 배제
On Error Resume Next 중복 추가 시 발생하는 오류를 무시하고 다음 항목 진행
Range("Result").Offset(intRow, 0) 중복 없는 항목을 지정 영역에 순서대로 출력

자주 묻는 질문 (FAQ)

Q1. Collection 개체가 왜 중복 제거에 사용되나요?

Collection.Add 메서드는 두 번째 인수(키)로 같은 값을 다시 추가하려고 하면 '이미 이 컬렉션에 지정한 키를 가진 멤버가 있습니다'라는 오류를 냅니다. 이 오류를 On Error Resume Next로 무시하면 결과적으로 각 값이 딱 한 번씩만 추가되는 효과를 얻습니다.

Q2. 담당자가 4명 이상이면 어떻게 하나요?

rngAdd4, rngAdd5 등의 이름 정의를 추가로 만들고, Union 함수의 인수에 해당 Range 변수를 추가해 주면 됩니다.

Q3. 정렬된 순서로 결과를 받고 싶습니다.

이 코드는 Collection에 추가된 순서(입력된 순서)대로 결과를 출력합니다. 정렬까지 하고 싶다면 결과가 출력된 뒤 별도로 정렬 기능을 실행하거나, 정렬 코드를 추가해야 합니다.

마치며

바로 이런 자잘하지만 반복되는 불편함을 해결하려고 VBA를 배우는 것 아니겠습니까. Collection 개체의 특성을 잘 활용하면 생각보다 훨씬 간단하게 문제를 풀 수 있습니다!