- 최초 작성일: 2004-06-24
- 최종 수정일: 2026-09-30
- 조회수: 22 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 도착시간 찾아내기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
도착시간 찾아내기
핵심 요약: 차량번호로 도착 시간 찾기
도착 시각별로 정리된 차량 번호 목록에서 각 출발 차량이 언제 도착했는지 찾아 표시하는 VBA 코드입니다. 차량 수나 도착 시각이 다양해져도 그대로 사용할 수 있습니다.
- 1단계: 이름 정의로 차량번호 목록, 시작 셀, 도착 데이터 영역을 지정합니다.
- 2단계: Do ~ Loop로 차량번호마다 Find 메서드를 실행합니다.
- 3단계: 찾으면 End(xlUp)로 도착 시각을 가져오고, 못 찾으면 No Data!를 표시합니다.
Step 1: 어떤 질문이었을까요?
질문 하나
> 궁금한게 있어서 이렇게 질문 올립니다. > 다름이 아니오라 제가 하고자 하는 것은 차량번호 매칭하는 겁니다.
> 예를 들면 A열의 7시에 출발점에서 출발한 10대의 차량번호가 있구요. > BC열에는 각각 7시 10분, 20분에 도착점에 도착한 차량의 번호가 있습니다. > A열의 10대의 차량들이 각각 언제 도착했는지 알고 싶습니다.
출발 차량(A열)과 각 시각의 도착 차량 번호는 다음과 같습니다.
| A열 | B열 | C열 |
|---|---|---|
| 7시10분 | 7시20분 | 7시30분 |
| 1000 | 2000 | 1000 |
| 2000 | 3000 | 9999 |
| 3000 | 5000 | 4000 |
| 4000 | 6000 | 7000 |
| 5000 | 8000 | 9000 |
| 6000 | ||
| 7000 | ||
| 8000 | ||
| 9000 | ||
| 9999 |
> 최종적으로 나타내고 싶은 것은 형태는 A옆에 행 삽입해서...
A열 옆에 열을 삽입해 아래와 같이 도착 시간을 표시하고 싶다는 것입니다.
| A열 | (삽입한 열) | C열 | D열 |
|---|---|---|---|
| 7시10분 | - | 7시20분 | 7시30분 |
| 1000 | 7시30분 | 2000 | 1000 |
| 2000 | 7시20분 | 3000 | 9999 |
| 3000 | 7시20분 | 5000 | 4000 |
| 4000 | 7시30분 | 6000 | 7000 |
| 5000 | 7시20분 | 8000 | 9000 |
| 6000 | 7시20분 | ||
| 7000 | 7시30분 | ||
| 8000 | 7시20분 | ||
| 9000 | 7시30분 | ||
| 9999 | 7시30분 |
> 이렇게 하고 싶은데 어케 해야 되나요? > vlookup, match 등등 해 봤는데 n/a라고만 하네요... > 갈쳐 주세요.
이 질문에 대해 Exceller의 홈 페이지에서 어떤 분(오태호님)이 이런 답변을 주셨군요.
"7시 10분"이라는 데이터가 들어있는 셀을 A1으로 보고 B2셀에 아래 수식을 입력하시면…
=IF(ISERROR(MATCH(A2,C2:C6,0)),IF(ISERROR(MATCH(A2,D2:D6,0)),"",D1),C1)
만약 수식을 아래로 복사해야 하는 경우를 감안한다면,
=IF(ISERROR(MATCH(A2,$C$2:$C$6,0)),IF(ISERROR(MATCH(A2,$D$2:$D$6,0)),"",$D$1),$C$1)
이렇게 해 주시면 되겠습니다.
그런데, 만약 차량 대수가 더 많아지고 도착시간도 7시15분, 16분, 17분,… 등과 같이 다양해진다면 이같은 수식으로는 한계가 있습니다. 이런 경우 VBA를 이용하면 보다 융통성있게 대처할 수 있습니다. 아래 버튼을 눌러 확인해 보고 돌아오시기 바랍니다.
Step 2: 코드 살펴보기
편의상 데이터 형태를 조금 바꾸었습니다. 자료도 추가해 넣고…
프로그래밍을 하기에 앞서, Stage 시트 상의 몇 군데에 이름을 정의해 두고 후속 작업을 진행합니다. '삽입-이름-정의' 메뉴를 선택하신 다음, 어느 영역에 어떤 이름들이 정의되어 있는지 살펴보십시오(3개의 이름이 정의되어 있습니다 ^^).
Sub ArrivalTime()
' 필요한 변수들을 선언합니다.
Dim rngCarNumList As Range
Dim rngArrive As Range
Dim rngCell As Range
Dim rngStart As Range
Dim strTime As String
Dim strBlank As String
Dim strMsg As String
Dim i As Long
Dim intNoData As Integer
' 변수의 값을 지정합니다. 사전에 정의해 둔 이름을 여기서 활용합니다.
Set rngCarNumList = Range("CarNumList")
Set rngStart = Range("Start")
Set rngArrive = Range("Arrive").CurrentRegion
' 이미 입력되어 있는 내용(도착시간)을 지웁니다.
MsgBox "기존 입력된 데이터를 지웁니다!", , "www.iExceller.com"
rngCarNumList.Offset(0, 1).ClearContents
' 오래간만에 Do ~ Loop 문을 사용해 보았습니다.
Do
strTime = ""
' rngArrive, 즉 차량들의 도착시간 데이터가 들어있는 영역 중에서 각 차량의 번호를
' 찾아냅니다. 이 때 Find 메서드를 사용하였군요.
Set rngCell = rngArrive.Find(What:=Range("Start").Offset(i, 0), LookIn:=xlValues, LookAt:=xlWhole)
' 차량번호를 도착 시간 데이터에서 찾았느냐 못찾았느냐에 따라 조건분기 처리를 합니다.
If Not rngCell Is Nothing Then
strTime = rngCell.End(xlUp)
Else
strTime = "No Data!"
strBlank = strBlank & Range("Start").Offset(i, 0) & vbCr
intNoData = intNoData + 1
End If
Range("Start").Offset(i, 1) = strTime
i = i + 1
' 루프문을 언제 종료할 지 지정합니다. Start 영역, 즉 A2 셀에서 한 간씩 아래로 내려가다가
' 값이 들어있지 않는 셀을 만나면 종료를 하는군요.
Loop While Range("Start").Offset(i, 0) <> ""
strMsg = strMsg & "작업을 완료하였습니다." & vbCr
strMsg = strMsg & "도착기록이 없는 차량은 " & intNoData & "대 입니다" & vbCr & vbCr
strMsg = strMsg & strBlank
MsgBox strMsg, vbInformation, "www.iExceller.com"
End Sub
다음 시간에…
정리 — 도착시간 찾기 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 영역 지정 | Range("Arrive").CurrentRegion | 도착 시각별 차량번호 영역 |
| 번호 검색 | rngArrive.Find(What:=..., LookAt:=xlWhole) | 차량번호와 정확히 일치하는 셀 검색 |
| 도착 시각 | rngCell.End(xlUp) | 찾은 열의 맨 위 머리글 값 |
| 미도착 처리 | strTime = "No Data!" | 도착 기록이 없는 차량 표시 |
| 반복 종료 | Loop While Range("Start").Offset(i, 0) <> "" | 차량번호가 없을 때까지 반복 |
자주 묻는 질문 (FAQ)
Q1. Find 메서드에서 LookAt:=xlWhole을 지정하는 이유는 무엇인가요?
LookAt을 지정하지 않으면 마지막 검색 설정이 적용되어 일부만 일치해도 찾아질 수 있습니다. 예를 들어 1000을 찾을 때 10000이 검색될 수 있으므로 xlWhole로 전체가 일치하는 셀만 찾도록 지정합니다.
Q2. IF와 MATCH 수식만으로는 왜 한계가 있나요?
도착 시각이 7시 20분, 30분뿐이라면 중첩 IF로 풀 수 있지만 7시 15분, 16분, 17분처럼 시각이 다양해지면 수식이 감당하기 어려워집니다. VBA로는 시각이 몇 개든 같은 코드로 처리할 수 있습니다.
Q3. End(xlUp)은 무엇을 하나요?
현재 셀에서 위쪽으로 데이터가 끝나는 지점까지 이동합니다. 도착 데이터가 열마다 위에서부터 연속되어 있으므로, 찾은 셀에서 End(xlUp)을 하면 맨 위의 머리글(도착 시각)이 선택됩니다.
마치며
데이터가 많아지고 조건이 다양해지면 수식보다 VBA가 훨씬 융통성 있게 대처할 수 있습니다. Find와 End(xlUp)의 조합을 익혀 두세요.