- 최초 작성일: 2008-01-24
- 최종 수정일: 2026-09-30
- 조회수: 16 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 중복 없이 하나로 합치고 정렬하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
A열의 번호에 B열의 추가 번호를 합하여 E열에 나열하고 싶습니다. 공통된 숫자는(40, 80) 한번만 나열하려고 합니다. A열과 B열을 E열에 복사한후 오름차로 정렬하는 것 말고 자동으로 E열을 정렬하고 싶습니다. 매크로로 가능할까요 ?
중복 없이 하나로 합치고 정렬하기
핵심 요약: 두 열의 값을 중복 없이 합쳐 자동 정렬하기
A열과 B열에 흩어진 숫자에서 중복(예: 40, 80)을 제거하고 E열에 오름차순으로 정렬해 표시하는 방법 두 가지를 살펴봅니다. 하나는 고급 필터, 다른 하나는 컬렉션 오브젝트를 이용합니다.
- 1단계: Union 메서드로 A열과 B열의 데이터 영역을 하나로 합칩니다.
- 2단계: 고급 필터의 고유 레코드 옵션 또는 Collection의 Key 중복 오류로 중복을 제거합니다.
- 3단계: 결과 열을 Sort 메서드로 오름차순 정렬합니다.
Step 1: 어떤 질문이었을까요?
Workplace 시트를 보면, A열과 B열에 데이터가 입력되어 있습니다. 그런데 데이터 중간 중간에 중복되는 번호(예를 들면 40과 80)가 있는데, 이것을 중복되지 않게 E열에 표시한 다음 오름차순 정렬을 하고 싶다는 것입니다.
아래 버튼을 클릭해 보세요.
Step 2: 고급 필터를 이용한 방법
게시판에서 많은 활동을 하고 계시는 신정수님께서 이런 코드를 올려 주셨습니다. 기억을 더듬어 작성한 것이므로 원래의 소스 코드와 다를 수 있습니다. 혹시라도 크게 차이나는 부분이 있을 경우, 알려주시면 수정해 드리겠습니다.
Sub UniqueItem()
Dim rngCell As Range
Dim rngMyRng1 As Range
Dim rngMyRng2 As Range
Dim rngUnion As Range
Dim rngTarget As Range
Dim intNum As Integer
'작업에 필요한 범위들을 지정해 줍니다.
'Union 메서드를 이용하여 rngMyRng1과 rngMyRng2, 즉 Workplace 시트의 A열과 B열에서
'데이터가 있는 부분을 하나로 합친 부분만 주의해서 보시면 되겠습니다.
'나머지 부분은 대부분 아주 직설적인(straight-forward) 표현이므로 별도의 설명은 없어도
'이해하시리라 생각합니다.
Set rngTarget = Range("A2").Offset(0, 4)
Set rngMyRng1 = Range(Range("A2"), Range("A2").End(xlDown))
Set rngMyRng2 = Range(Range("A2"), Range("B2").End(xlDown))
Set rngUnion = Union(rngMyRng1, rngMyRng2)
rngTarget.EntireColumn.ClearContents
For Each rngCell In rngUnion
rngTarget.Offset(intNum).Value = rngCell.Value
intNum = intNum + 1
Next
rngTarget.Offset(-1, 0) = "결과"
Set rngTarget = rngTarget.EntireColumn.SpecialCells(xlTextValues)
rngTarget.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("F1"), Unique:=True
rngTarget.EntireColumn.ClearContents
Columns(6).Copy Columns(5)
Columns(6).ClearContents
rngTarget.Sort Key1:=rngTarget, Order1:=xlAscending, Header:=xlGuess
End Sub
Step 3: 컬렉션 오브젝트를 이용한 방법
위와 같은 방법으로도 가능하며, 다음처럼 컬렉션 오브젝트를 사용할 수도 있습니다.
Sub UniqueItem2()
Dim rngCell As Range
Dim rngUnion As Range
Dim rngMyRng1 As Range
Dim rngMyRng2 As Range
Dim rngTarget As Range
Dim X As New Collection
'컬렉션 오브젝트 변수인 X를 선언합니다.
Dim varItem
Dim sht As Worksheet
Dim intNum As Integer
On Error Resume Next
'컬렉션 오브젝트를 사용할 때에는 반드시 이 구문을 써 주어야 합니다.
'작업 대상 영역을 설정하는 것은 앞에서와 같고…
Set rngTarget = Range("A2").Offset(0, 4)
Set rngMyRng1 = Range(Range("A2"), Range("A2").End(xlDown))
Set rngMyRng2 = Range(Range("A2"), Range("B2").End(xlDown))
Set rngUnion = Union(rngMyRng1, rngMyRng2)
rngTarget.EntireColumn.ClearContents
For Each rngCell In rngUnion
X.Add rngCell.Value, CStr(rngCell.Value)
'컬렉션 오브젝트는 [오브젝트명.Add Item, key, (before), (after)]의 형태로 사용합니다.
'여기서 key argument는 unique한 텍스트, 즉 중복되지 않는 텍스트일 경우에만 유효합니다.
'만약에 앞에서 나왔던 값이 뒤에 또 나오면 에러가 발생하게 되고, 따라서 컬렉션 오브젝트에
'추가가 되지 않게 됩니다.
Next rngCell
For Each varItem In X
rngTarget.Offset(intNum, 0) = varItem
intNum = intNum + 1
'컬렉션 오브젝트인 X에 저장된 값들을 지정한 위치에 차례로 뿌려줍니다.
Next varItem
rngTarget.Offset(-1, 0) = "결과"
rngTarget.Sort Key1:=rngTarget, Order1:=xlAscending, Header:=xlGuess
End Sub
참고 - 컬렉션으로 중복을 걸러내는 원리: Collection에 항목을 추가할 때 Key 값이 이미 존재하면 오류가 발생하고 추가되지 않습니다. 그래서 On Error Resume Next로 오류를 무시하면 중복된 값은 자연스럽게 걸러지고 처음 나온 값만 남습니다.
물론 이런 방법들말고도 다양한 방법으로 해결이 가능합니다. 나머지 방법들에 대해서는 여러분이 직접 연구해 보시기 바랍니다.
오늘은 여기까지…
정리 — 두 가지 방법 비교
| 구분 | 고급 필터 방식 | Collection 방식 |
|---|---|---|
| 프로시저 | UniqueItem | UniqueItem2 |
| 중복 제거 | AdvancedFilter의 Unique:=True 옵션 | Add 메서드의 Key 중복 시 오류 발생을 이용 |
| 오류 처리 | 별도 처리 불필요 | On Error Resume Next 필요 |
| 공통 처리 | Union으로 A열·B열 영역 합치기 | Union으로 A열·B열 영역 합치기 |
| 정렬 | rngTarget.Sort ... xlAscending | rngTarget.Sort ... xlAscending |
자주 묻는 질문 (FAQ)
Q1. 두 방법 중 어느 쪽이 더 좋은가요?
결과는 같으므로 취향과 상황에 따라 선택하면 됩니다. 고급 필터 방식은 워크시트 기능을 그대로 활용하고, 컬렉션 방식은 메모리에서 처리하므로 워크시트를 오가는 작업이 적다는 장점이 있습니다.
Q2. 컬렉션 방식에서 On Error Resume Next를 빼면 어떻게 되나요?
이미 존재하는 Key를 다시 추가하려고 하는 순간 오류가 발생해 코드가 중단됩니다. 중복 값을 오류로 걸러내는 방식이므로 오류를 무시하는 구문이 반드시 필요합니다.
Q3. 엑셀 최신 버전에서는 함수로도 가능한가요?
Microsoft 365나 엑셀 2021 이상에서는 UNIQUE 함수와 SORT 함수를 조합하면 매크로 없이도 중복 없이 정렬된 목록을 만들 수 있습니다.
마치며
같은 문제도 고급 필터로 풀 수 있고 컬렉션으로도 풀 수 있습니다. 여러 가지 방법을 비교해 보면서 여러분에게 맞는 방식을 골라 보세요!