- 최초 작성일: 2000-12-29
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 동명이인 검색하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에도 메일로 받은 질문 하나를 살펴봅니다.
안녕하세요 엑셀러님!
궁금한 것이 생겨서 이렇게 메일을 드리게 되었습니다.
저는 워드로 주소록 관리를 해 왔었는데 엑셀과 엑셀러님을 알고 나서부터는
엑셀로 주소록을 관리하고 있습니다.
VB로 프로그램을 하나 만들려고 하는데 다른 부분은 대충 해결이 가능하나
혹시 엑셀러님이 사용하고 계신 주소록 관리 프로그램이 있으시면 한번 소개해
주실 수는 없을까요?
주소록 관리 프로그램은 언제 시간나면 하나 만든다 만든다 하면서 하루이틀 미루다 보니 아직 못만들고 있습니다. 하지만 동명이인을 검색해 낼 수 있는 간단한 검색 프로그램을 한번 만들어 보도록 하지요. 그동안 강좌를 충실히 따라오신 분이라면 얼마든지 만드실 수 있으리란 생각은 듭니다만…
동명이인 검색하기
핵심 요약: 동명이인 검색
이름 영역을 순환하며 같은 이름을 만날 때마다 카운터를 늘리고, 두 번째부터는 계속 검색할지 물어봅니다.
- 1단계: 이름 영역에 List라는 이름을 정의합니다.
- 2단계: For Each로 순환하며 입력한 이름과 같은 셀을 찾습니다.
- 3단계: 두 번째부터는 MsgBox로 확인하고 Offset으로 관련 정보를 표시합니다.
Step 1: 예제 데이터와 이름 정의
주소록 데이터가 아래와 같이 입력되어 있다고 가정합니다. 이름이 있는 B30:B43 영역에는 미리 List라는 이름을 정의해 둡니다.
| 이름 | 전화번호 | 주소 | 회사명 | 직책 |
|---|---|---|---|---|
| 이순신 | 111-1111 | 서울시 영등포구 | 태평양 | 과장 |
| 김유신 | 222-2222 | 서울시 용산구 | 삼호물산 | 대리 |
| 홍길동 | 333-3333 | 서울시 동작구 | 삼도식품 | 사장 |
| 김유신 | 444-4444 | 서울시 종로구 | 태평양 | 부장 |
| 이순신 | 555-5555 | 서울시 도봉구 | 삼송양행 | 차장 |
| 성춘향 | 666-6666 | 경기도 고양시 | 남해수산 | 사원 |
| 심청이 | 777-7777 | 경기도 성남시 | 성남식품 | 경리 |
| 월매 | 888-8888 | 서울시 양천구 | 삼성 | 부사장 |
| 향단이 | 999-9999 | 강원도 춘천시 | 대우 | 상무 |
| 허주니 | 123-1234 | 경기도 하남시 | 현대 | 이사 |
| 예지니 | 234-5678 | 경기도 광명시 | 동해수산 | 이사대우 |
| 김유신 | 345-6789 | 서울시 강남구 | 태평양 | 대리 |
| 이순신 | 456-7890 | 서울시 서초구 | 동양건설 | 주임 |
| 홍길동 | 567-8901 | 서울시 양천구 | 남해중공업 | 과장 |
이런 식으로 얼마든지 가능합니다. 코드를 볼까요?
Step 2: btnOK_Click 프로시저
Private Sub btnOK_Click()
Dim rngCell As Range
Dim r As Integer
r = 1
For Each rngCell In Range("List")
'//이름들이 있는 B30:B43까지의 영역에 List라는 이름을 미리 정의해 두고 사용합니다.
If rngCell = txtName Then
'//rngCell의 값과 텍스트 박스를 통해 입력받은 값이 서로 같은지를 비교해서 같을 경우
'//아래 구문을 실행합니다.
If r > 1 Then
If MsgBox("동명이인이 있습니다. 계속 검색할까요?", vbYesNo, _
"동명이인 발견//Exceller") = vbNo Then Exit Sub
'//r이 1보다 크다는 것은 같은 값(이름)이 하나 이상이라는 의미이겠지요? 따라서
'//그럴 경우에는 메시지 박스를 띄우고 사용자가 계속 검색하고자 할 경우에만
'//다음 작업을 수행합니다.
End If
lblPhone = rngCell.Offset(0, 1)
lblAddress = rngCell.Offset(0, 2)
lblCompany = rngCell.Offset(0, 3)
lblGrade = rngCell.Offset(0, 4)
r = r + 1
End If
Next rngCell
End Sub
엄청 간단하지요? 많이 응용하셔서 여러분 자신만의 주소록을 만들어 보도록 하세요. 만들어서 Exceller에게 보내주시면 등록해 드리겠습니다.
마무리
어느덧 내일모레면 올 한해도 가는군요. 아마 이번 강좌가 2000년의 마지막 강좌가 될 것 같습니다. 한해동안 강좌를 보시느라 수고들 많으셨습니다. 주말, 연휴 잘 쉬시고 새로운 마음으로 2001년 새해에 뵙도록 하겠습니다.
Happy New Year!!!
정리 — 동명이인 검색 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 검색 영역 | Range("List") | 이름이 있는 영역 |
| 이름 비교 | If rngCell = txtName Then | 입력값과 같은 이름 찾기 |
| 동명이인 확인 | If r > 1 Then MsgBox(..., vbYesNo) | 계속 검색 여부 |
| 정보 표시 | rngCell.Offset(0, 1) | 같은 행의 다른 열 값 |
| 횟수 세기 | r = r + 1 | 찾은 개수 기록 |
자주 묻는 질문 (FAQ)
Q1. 동명이인은 어떻게 찾아내나요?
이름 영역을 순환하며 같은 이름을 발견할 때마다 카운터를 늘려, 두 번째부터는 동명이인이 있다고 알려 주면 됩니다.
Q2. 검색한 사람의 전화번호와 주소는 어떻게 가져오나요?
이름 셀에서 Offset 속성으로 오른쪽 셀들의 값을 읽어 옵니다.
Q3. 영역에 이름을 정의하면 어떤 점이 좋은가요?
코드에서 Range("List")처럼 짧게 참조할 수 있고 영역이 바뀌어도 코드를 수정하지 않아도 됩니다.
마치며
간단한 순환문과 카운터만으로 동명이인을 알려 주는 검색 기능을 만들 수 있습니다.