- 최초 작성일: 2001-01-12
- 최종 수정일: 2026-09-30
- 조회수: 6 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 중복자료 삭제하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
"어떻게 하면 중복자료 중에서 유일한 것만 추려낼 수 있습니까?"하는 질문을 자주 받곤 합니다. 그럴 때마다 Exceller는,
- 고급 필터 중에서 "고유 레코드만" 항목에 체크를 하고 사용하시거나
- VB0028, 29, 30 강좌를 참고하시라고 답변을 드립니다.
그런데 이런 질문을 하신 분이 있군요.
질문드릴 사항이 있습니다. VB0030 강좌에서 보면 중복아이템을 추려내는
방법에 대해 소개해 주셨는데요, 조건이 하나일 경우말고 조건이 두 가지일
경우에는 어떻게 하면 되는지요?
응용을 해 보려고 시도는 하는데 머리가 받쳐주지 않아서 잘 안됩니다.
미리 감사드립니다.
또 같은 질문입니다.
저번에 중복 아이템 추려내기를 통해서 하나의 Column은 가능했습니다.
그런데 여러 개의 Column을 추려내기가 잘 안되네여.
하나만 추려내면 옆에 있는 Column의 내용은 무시가 돼서 다른게 있어도
지정한 Column 기준으로 해서 다 사라지더군여.
그래서 이렇게 다시 질문을 합니다.
여러 개의 Column을 비교해서 똑같은 것을 삭제하는 걸 원하고 있습니다.
어떻게 해야 하는지 모르겠네여.
몇 개가 있든지 간에 각각의 Column을 비교해서 Cell까지 비교를 해서
어떻게든 다른게 있으면 손을 안대고 Cell까지 똑같으면 없애는 그런 걸
알고 싶네여.
제 말을 알아 들으셨는지 모르겠네요. 하도 주절주절 적어서여.
알려주실거라 믿고
즐거운 하루 되세여.
중복자료 삭제하기
핵심 요약: 중복 레코드 삭제
같은 값이 여러 열에서 반복되는 레코드에 색을 칠해 표시하고 확인 후 아래쪽부터 삭제합니다.
- 1단계: 이름, 전화번호, 주소가 모두 같은 레코드를 찾아 분홍색으로 표시합니다.
- 2단계: 표시한 개수를 알려 주고 삭제 여부를 묻습니다.
- 3단계: 삭제할 때는 마지막 행부터 위로 올라가며 지웁니다.
Step 1: 중복 레코드 예제
아래와 같은 자료가 있습니다. 여기에서 이름, 전화번호, 주소가 모두 같은 자료(레코드)는 중복이 되는 자료들로써 이것을 삭제하는 방법이 없는가 하는 질문입니다. 일단 예제를 실행시켜 보도록 하지요.
| 이름 | 전화번호 | 주소 | 회사명 | 직책 |
|---|---|---|---|---|
| 이순신 | 111-1111 | 서울시 영등포구 | 태평양 | 과장 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 홍길동 | 333-3333 | 서울시 동작구 | 삼도식품 | 사장 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 이순신 | 111-1111 | 서울시 영등포구 | 태평양 | 과장 |
| 성춘향 | 666-6666 | 경기도 고양시 | 남해수산 | 사원 |
| 홍길동 | 333-3333 | 서울시 동작구 | 삼도식품 | 사장 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 향단이 | 999-9999 | 강원도 춘천시 | 대우 | 상무 |
| 성춘향 | 666-6666 | 경기도 고양시 | 남해수산 | 사원 |
| 예지니 | 234-5678 | 경기도 광명시 | 동해수산 | 이사대우 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 이순신 | 123-1234 | 서울시 영등포구 | 대성유통 | 차장 |
| 홍길동 | 333-3333 | 서울시 동작구 | 삼도식품 | 사장 |
| 성춘향 | 666-6666 | 경기도 고양시 | 남해수산 | 사원 |
| 예지니 | 234-5678 | 경기도 광명시 | 동해수산 | 이사대우 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 이순신 | 111-1111 | 서울시 영등포구 | 태평양 | 과장 |
| 홍길동 | 333-3333 | 서울시 동작구 | 삼도식품 | 사장 |
Step 2: DelDupData 프로시저
그러면 코드를 볼까요? 아마 생각보다 엄청 간단할 것입니다. 오늘 코드는 다른 분의 아이디어를 약간 수정한 것입니다. WorkPlace 시트의 A2 셀에는 Start라는 이름을 정의해 둡니다.
Sub DelDupData()
Dim rngStart As Range
Dim rngEnd As Range
Dim rngTarget As Range
Dim rngCell As Range
Dim i As Integer
Dim r As Integer
Dim intNum As Integer
Dim intCount As Integer
Dim Msg As String
Dim strYesNo As String
'//늘 그래왔듯이 등장인물(변수)과 배역을 먼저 지정합니다.
Set rngStart = Range("Start")
Set rngEnd = rngStart.End(xlDown)
Set rngTarget = Range(rngStart, rngEnd)
r = rngTarget.Rows.Count + 1
'//작업대상이 되는 영역을 설정하는 부분입니다. WorkPlace 시트의 A2 셀에 "Start"라는 이름을
'//미리 정의해 두고 사용합니다. 코드 상에서 범위명을 지정할 수도 있으나 코드를 한 줄이라도
'//줄이기 위해서…
For Each rngCell In rngTarget
'//이제 순환문을 돌면서 본격적인 작업에 들어갑니다.
'//아래에 코드를 길게 나열하였습니다만 우리말로 요약을 하자면, "순환문을 계속 돌면서
'//이름/전화번호/주소가 같은 레코드를 발견하면 그 레코드에 분홍색으로 표시를 하라"
'//이렇게 될 것입니다.
'//그렇다면 왜 색깔을 칠해 주는 것일까요? 보기 좋으라고? 아니면 시간이 남아서??
'//나중에 삭제해야 할 레코드를 구분하기 위해서 입니다.
'//예를 들어, 운동장을 30바퀴 돌아야 한다고 가정을 해 보지요. 머리가 좋으면 상관없지만
'//대개의 경우, 한 10바퀴 정도 돌고나면 그 다음부터는 내가 몇 바퀴를 돌았는지 잘 생각이
'//나지 않을 것입니다. 따라서 한 바퀴 돌 때마다 손가락을 하나씩 접든지 아니면 전봇대에
'//분필로 한줄씩 긋든지 하여 어떤 표시를 해 두면 헷갈리지 않겠지요?
'//이처럼 전봇대에 표시를 해 주는 것입니다. 나중에 헷갈리지 않도록 하기 위해서…
intNum = 1
If rngCell.Interior.ColorIndex = 22 Then GoTo ByPass
'//이미 전봇대에 표시가 되어 있으면 따로 표시를 하지 않고 계속 달립니다.
Do While rngCell.Offset(intNum, 0) <> ""
If rngCell = rngCell.Offset(intNum, 0) And rngCell.Offset(0, 1) = rngCell.Offset(intNum, 1) _
And rngCell.Offset(0, 2) = rngCell.Offset(intNum, 2) Then
rngCell.Offset(intNum, 0).Select
Range(Selection, Selection.End(xlToRight)).Interior.ColorIndex = 22
intCount = intCount + 1
End If
intNum = intNum + 1
'//바로 여기가 한 바퀴 돌고나면 분필로 전봇대에 한 줄씩 그어나가는 부분입니다.
Loop
ByPass:
Next rngCell
If intCount = 0 Then
MsgBox "중복되는 자료가 하나도 없습니다", , "중복 자료 미발견//Exceller"
Exit Sub
End If
Msg = "중복되는 자료에 표시를 하였습니다" & vbCr
Msg = Msg & "총 " & intCount & " 개의 중복되는 자료가 발견되었습니다" & vbCr
Msg = Msg & "삭제할까요?"
strYesNo = MsgBox(Msg, vbYesNo, "삭제 여부 확인//Exceller")
'//중복되는 자료에 대해서 분홍색으로 칠하는 작업이 완료된 다음, 이 자료들을 삭제할 것인지
'//아니면 그냥 표시만 해 둘 것인지를 사용자에게 물어봅니다.
If strYesNo = vbYes Then
For i = r To 1 Step -1
If Rows(i).Cells(1).Interior.ColorIndex = 22 Then
Rows(i).EntireRow.Delete
End If
Next i
'//만약 "삭제"를 선택하였으면 다시 한번 순환문을 돌면서 대상 자료들을 지워 나갑니다.
'//행이나 열을 삭제하는 방법에 대해서는 얼마 전에(VB0074) 자세히 설명을 드렸으므로
'//설명은 생략합니다. 맨 마지막 라인부터 지워 나간다는 점에 주의!!!
Else
Exit Sub
End If
End Sub
Excel 2007 이후에는 데이터 탭의 중복 항목 제거 기능과 Range.RemoveDuplicates 메서드로 여러 열을 기준으로 한 번에 중복을 지울 수 있습니다. 예: Range("A1:F20").RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes. 이 글의 코드는 표시를 해 두고 확인한 뒤 지우는 방식의 원리를 이해하는 데 의미가 있습니다.
마무리
영어를 배울 때, 모든 문장은 S+V, S+V+C, S+V+O, S+V+IO+DO, S+V+O+OC 이렇게 다섯 가지 형식 중 하나에 포함된다고 배우셨지요? VBA는 이것보다 더 간단합니다. 예전에 한번 설명을 드린 것도 같은데, 눈사람 만드는 것과 똑같습니다. 눈을 뭉칠 때, 처음에는 잘 뭉쳐지지가 않지요? 그러다가 일정 시점이 지나게되면 기하급수적으로 크기가 늘어나고 작업도 수월해집니다.
VBA도 마찬가지입니다. 아니, VBA뿐만 아니라 모든 지식이 다 그러합니다. 목마른 사람이 물을 갈구하듯, VBA(지식)도 한번 빠져본 사람이 더 많은 것을 추구하게 마련입니다. 돈에만 빈익빈 부익부가 있는 것이 아니지요. 지식 추구에 있어 부의 편향은 물질적 편재보다 훨씬 더한듯 합니다.
잠시 헛소리 좀 했습니다. 널리 이해를… ^^
다음 시간에…
정리 — 중복 삭제 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 작업 영역 | Range("Start").End(xlDown) | 대상 범위 설정 |
| 중복 판별 | rngCell = rngCell.Offset(intNum, 0) And ... | 세 열 값 비교 |
| 표시 | Interior.ColorIndex = 22 | 삭제 대상 구분 |
| 확인 | MsgBox(Msg, vbYesNo, ...) | 삭제 여부 확인 |
| 삭제 | For i = r To 1 Step -1 | 아래쪽부터 삭제 |
자주 묻는 질문 (FAQ)
Q1. 여러 열이 모두 같은 자료만 삭제하려면?
열별 값을 모두 비교하는 조건을 If 문에 사용하고 조건이 모두 맞을 때만 삭제 대상으로 표시합니다.
Q2. 행을 삭제할 때 아래쪽부터 지우는 이유는?
위쪽 행을 먼저 지우면 아래 행의 번호가 바뀌어 일부 행을 놓치기 때문입니다.
Q3. 고급 필터로도 중복을 제거할 수 있나요?
고급 필터에서 고유 레코드만 항목을 체크하면 중복을 제외한 목록을 얻을 수 있습니다.
마치며
중복 레코드에 표시를 해 두는 방법을 활용하면 여러 열을 기준으로 안전하게 중복을 삭제할 수 있습니다.