• 최초 작성일: 2004-06-24
  • 최종 수정일: 2026-09-30
  • 조회수: 22 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 도착시간 찾아내기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

도착시간 찾아내기

핵심 요약: 차량번호로 도착 시간 찾기

도착 시각별로 정리된 차량 번호 목록에서 각 출발 차량이 언제 도착했는지 찾아 표시하는 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분
100020001000
200030009999
300050004000
400060007000
500080009000
6000
7000
8000
9000
9999

> 최종적으로 나타내고 싶은 것은 형태는 A옆에 행 삽입해서...

A열 옆에 열을 삽입해 아래와 같이 도착 시간을 표시하고 싶다는 것입니다.

A열(삽입한 열)C열D열
7시10분-7시20분7시30분
10007시30분20001000
20007시20분30009999
30007시20분50004000
40007시30분60007000
50007시20분80009000
60007시20분
70007시30분
80007시20분
90007시30분
99997시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)의 조합을 익혀 두세요.