AI 해결 노트 · 2026-09-18 · 실측 2026-09-18
엑셀 중복값 지우기 — 이름 기준과 이름+부서 기준이 얼마나 다른지 세어 봤습니다
한 줄로
같은 15행 명단에 「중복된 항목 제거」를 돌렸더니 기준을 무엇으로 잡느냐에 따라 7행·9행·12행으로 갈렸습니다. 이름만 기준으로 잡으면 같은 이름 중 맨 위 한 행만 남아, 사번이 다른 동명이인도 함께 지워집니다. 지우기 전에 「이 표에서 한 건을 가리키는 열이 무엇인가」를 먼저 정하셔야 합니다.
이런 분께
- 명단을 합쳤더니 같은 사람이 두 번씩 들어가 있어 정리해야 하는 분.
- 「중복된 항목 제거」를 눌렀는데 남은 행 수가 예상과 달라 불안한 분.
- 동명이인이 있는 명단을 다루는 분.
실측 환경
| 항목 | 값 |
|---|---|
| OS | Microsoft Windows 11 Home 10.0.26200 (build 26200) |
| 셸 | PowerShell 7.6.6 |
| 엑셀 | Excel 16.0, build 20326 |
| 대조용 | Python 3.12.10 + pandas 3.0.3 + openpyxl 3.1.5 |
| 시험 파일 | 직접 만든 더미 명단 — 사번·이름·부서 3열 × 15행 |
시험에 쓴 명단
일부러 세 가지를 섞었습니다. 완전히 같은 행(사번까지 같음), 이름은 같지만 부서가 다른 동명이인, 이름과 부서가 같은데 사번이 다른 동명이인입니다.
| 엑셀 행 | 사번 | 이름 | 부서 | 어떤 행인가 |
|---|---|---|---|---|
| 2 | K2101 | 홍길동 | 영업1팀 | |
| 3 | K2102 | 김철수 | 인사팀 | |
| 4 | K2103 | 이영희 | 개발팀 | |
| 5 | K2104 | 홍길동 | 생산팀 | 2행과 이름만 같은 다른 사람 |
| 6 | K2101 | 홍길동 | 영업1팀 | 2행과 완전히 같은 행 |
| 7 | K2105 | 박민수 | 영업2팀 | |
| 8 | K2102 | 김철수 | 인사팀 | 3행과 완전히 같은 행 |
| 9 | K2106 | 이영희 | 개발팀 | 4행과 이름·부서가 같고 사번만 다름 |
| 10 | K2107 | 최지우 | 총무팀 | |
| 11 | K2108 | 박민수 | 생산팀 | 7행과 이름만 같은 다른 사람 |
| 12 | K2103 | 이영희 | 개발팀 | 4행과 완전히 같은 행 |
| 13 | K2109 | 강한별 | 영업1팀 | |
| 14 | K2110 | 홍길동 | 영업1팀 | 2행과 이름·부서가 같고 사번만 다름 |
| 15 | K2111 | 최지우 | 총무팀 | 10행과 이름·부서가 같고 사번만 다름 |
| 16 | K2112 | 정다은 | 개발팀 |
이름·사번·부서는 전부 지어낸 값입니다.

세 가지 기준으로 각각 돌렸습니다
화면에서는 표 안을 한 번 누른 뒤 데이터 탭 → 데이터 도구 그룹 → 중복된 항목 제거 를 누르고, 뜬 창에서 기준으로 삼을 열만 체크합니다. 다만 이 글의 숫자는 그 창을 눌러서 얻은 값이 아닙니다. COM의 RemoveDuplicates 에 기준 열을 넘겨서 얻었고, 화면 조작 결과와 한 줄씩 대조하지는 못했습니다.
$ws = $wb.Worksheets.Item(1)
# 기준 A — 이름(2번째 열)만. Header:=xlYes 는 두 번째 인수 1
$ws.Range("A1:C16").RemoveDuplicates(2, 1)
# 기준 B — 이름+부서(2·3번째 열)
$cols = New-Object object[] 2; $cols[0] = 2; $cols[1] = 3
$ws.Range("A1:C16").RemoveDuplicates($cols, 1)
# 기준 C — 사번+이름+부서 세 열 전부
$cols3 = New-Object object[] 3; $cols3[0] = 1; $cols3[1] = 2; $cols3[2] = 3
$ws.Range("A1:C16").RemoveDuplicates($cols3, 1)기준마다 원본 파일을 새로 복사해서 돌렸습니다. 한 파일에 이어서 돌리면 앞 기준에서 이미 지워진 행이 빠진 채로 계산돼 결과가 섞입니다.
남은 행 수는 이렇게 셌습니다. A열 맨 끝 칸에서 위쪽으로 올라가며(-4162 = xlUp) 값이 있는 마지막 행을 찾는 방식입니다. 이 명단은 머리글 아래로 빈칸 없이 이어지므로 마지막 행 번호에서 1을 빼면 데이터 행 수가 됩니다.
$last = $ws.Cells.Item($ws.Rows.Count, 1).End(-4162).Row
"남은 데이터 행 수 = " + ($last - 1)결과 — 15행이 7행·9행·12행으로 갈립니다
| 기준 | 체크하는 열 | 남은 행 | 지워진 행 |
|---|---|---|---|
| A | 이름 | 7행 | 8행 |
| B | 이름 + 부서 | 9행 | 6행 |
| C | 사번 + 이름 + 부서 | 12행 | 3행 |
기준 A로 남은 7행은 홍길동(K2101)·김철수(K2102)·이영희(K2103)·박민수(K2105)·최지우(K2107)·강한별(K2109)·정다은(K2112)이었습니다. 생산팀 홍길동(K2104)과 생산팀 박민수(K2108)가 사라졌습니다. 이름이 겹친다는 이유만으로 다른 부서 사람이 명단에서 빠진 것입니다.

기준 B로 남은 9행에는 생산팀 홍길동(K2104)과 생산팀 박민수(K2108)가 돌아왔습니다. 대신 개발팀 이영희(K2106)와 영업1팀 홍길동(K2110), 총무팀 최지우(K2111)가 빠졌습니다. 이름과 부서가 같은 동명이인은 여전히 구분되지 않습니다.

기준 C에서 지워진 3행은 6행(K2101 홍길동)·8행(K2102 김철수)·12행(K2103 이영희)뿐이었습니다. 세 열이 전부 같은, 말 그대로 완전히 겹친 행들입니다.
세 기준 모두 겹친 행 가운데 가장 위에 있는 행이 남았습니다. 기준 A에서 홍길동 자리에 2행의 K2101이 남고 5행 K2104·14행 K2110이 지워진 것이 그 결과입니다. 그러니 남기고 싶은 행이 따로 있다면 지우기 전에 정렬로 그 행을 위로 올려 두는 편이 안전합니다. 다만 저희가 날짜 열로 정렬한 뒤 최신 행이 남는지까지 시험해 보지는 않았습니다.
파이썬으로 같은 일을 하면
pandas 의 drop_duplicates 에 keep="first" 를 주면 엑셀과 같이 첫 행을 남깁니다.
import pandas as pd
df = pd.read_excel("E1_명단.xlsx")
df.drop_duplicates(subset=["이름"], keep="first") # 7행
df.drop_duplicates(subset=["이름", "부서"], keep="first") # 9행
df.drop_duplicates(subset=["사번", "이름", "부서"], keep="first") # 12행엑셀이 남긴 행과 pandas가 남긴 행을 한 줄씩 대조했더니 세 기준 모두 행 수와 내용이 같았습니다.
| 기준 | 엑셀 | pandas | 내용 일치 |
|---|---|---|---|
| 이름만 | 7행 | 7행 | True |
| 이름+부서 | 9행 | 9행 | True |
| 사번+이름+부서 | 12행 | 12행 | True |
저희는 세 기준 모두 subset 에 열 이름을 직접 적었습니다.
어떤 기준을 골라야 하나
이 명단에서 한 사람을 가리키는 열은 사번입니다. 그러니 답은 「사번을 포함해서 지운다」입니다. 판단은 이렇게 해 보시면 됩니다.
- 그 번호가 무엇을 하나로 세는 번호인가 — 사번처럼 사람 하나에 하나씩 붙는 번호라면 기준에 넣습니다. 반대로 주문번호는 한 주문에 품목이 여러 줄일 수 있어서, 번호가 같다고 같은 행은 아닙니다. 번호가 세는 단위를 먼저 확인하셔야 합니다.
- 고유 번호가 없다면, 무엇이 같아야 같은 사람인가 — 이름만으로는 부족하고, 이름+전화번호나 이름+생년월일처럼 겹칠 확률이 낮은 조합을 찾습니다.
- 지우기 전에 세어 둡니다 — 지우기 전 행 수와 지운 뒤 행 수를 적어 두고, 줄어든 숫자가 납득되는지 봅니다. 15행이 7행이 되면 절반이 넘는 8행이 지워진 것이니 한 번 멈춰야 할 신호입니다.
- 원본을 따로 둡니다 — 「중복된 항목 제거」는 행을 실제로 지웁니다. 저희도 기준마다 원본 파일을 새로 복사해서 돌렸습니다. 한 파일에 세 기준을 이어서 돌리면 결과가 섞입니다.
실패한 것
- 「중복된 항목 제거」 대화상자(열 체크박스가 있는 창)를 캡처하지 못했습니다. 다른 프로그램의 로그인 창이 화면 맨 앞을 계속 잡고 있어 엑셀 창에 키 입력을 보낼 수 없었습니다. 창 제목과 체크박스 생김새는 저희가 눈으로 본 것이 아닙니다.
- 처음 시험에서는
RemoveDuplicates뒤에Save()없이Close($false)로 닫아, 파일에 결과가 들어가지 않은 채로 pandas와 대조할 뻔했습니다. 일부러 다시 재현해 보니 지운 직후 메모리 위에서는 7행이었는데, 저장하지 않고 닫은 파일을 열면 15행 그대로였습니다. RemoveDuplicates에 열 번호 여러 개를 넘길 때 PowerShell에서[int[]]@(2,3)을 쓰면Value does not fall within the expected range.오류가 났습니다.New-Object object[] 2로 만든 배열로 바꾸니 통과했고, 같은 자리에서 9행이 나왔습니다.
확인하지 않은 것
- 「중복된 항목 제거」를 화면에서 직접 눌렀을 때 뜨는 결과 알림(몇 개를 지웠다는 메시지)의 문구는 확인하지 않았습니다. 저희는 COM에서
DisplayAlerts = $false로 두고 돌렸습니다. - 대소문자·앞뒤 공백이 다른 값(
홍길동과홍길동)을 엑셀이 같게 보는지 다르게 보는지는 시험하지 않았습니다. 이 명단에는 그런 값을 넣지 않았습니다. - 숫자 1과 문자열 "1"처럼 자료형이 다른 값이 섞였을 때의 판정도 시험하지 않았습니다.
- 데이터 탭 → 데이터 도구 그룹 → 중복된 항목 제거 라는 메뉴 경로는 이번 시험에서 화면으로 확인한 것이 아닙니다. 위 그림 세 장은 시트만 캡처한 것이고, 대화상자는 띄우지 못했습니다.
- 조건부 서식의 「중복 값」으로 겹친 칸에 색만 칠하는 기능은 시험하지 않았습니다.
- 표 안에 병합된 셀이나 빈 행이 있을 때의 동작은 다루지 않았습니다.