- 최초 작성일: 2002-07-09
- 최종 수정일: 2026-09-30
- 조회수: 8 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 지정된 시간에 프로시저 실행하기 (OnTime)
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
컴퓨터에는 날짜와 시간을 관리하는 타이머(Timer)가 있습니다. 이 타이머를 활용하면 반복적으로 일어나는 여러 가지 일을 편리하게 처리할 수 있습니다(타이머란 쉽게 얘기하면… 그냥 시계랍니다).
언뜻 생각나는 응용 방법이…
- 일정한 시간마다 프로시저를 (반복적으로) 실행할 수 있습니다.
- 매일매일 작성하는 일자별 보고서의 파일명을 자동으로 부여할 수 있습니다.
- 작성한 프로시저를 디버그할 때 프로시저 실행을 일시적으로 중지할 수 있습니다.
이것 이외에도 활용 여하에 따라서는 수도 없이 좋은 아이디어가 나올 수 있겠지요? 날짜나 시간과 관련된 기본적인 워크시트 함수에 대해서는 도움말을 참고하세요.
지정된 시간에 프로시저 실행하기 (OnTime)
핵심 요약: 시간을 이용한 프로시저 제어
Stop 문은 디버그를 위한 중단, Wait 메서드는 지정 시간 정지, OnTime 메서드는 지정한 시각에 프로시저를 실행하는 데 사용합니다.
- 1단계: 디버깅이 필요하면 Stop 문으로 실행을 중단합니다.
- 2단계: 일정 시간 동안 멈추려면 Application.Wait를 사용합니다.
- 3단계: 특정 시각에 실행하려면 Application.OnTime으로 프로시저를 예약합니다.
Step 1: 프로시저 실행을 잠시 정지시키기
VBA에서 프로시저의 실행을 제어하는 방법으로는 아래와 같은 방법들이 있습니다.
- Stop 문(Statement): 프로시저의 실행을 중지
- Wait 메서드: 지정한 시간 동안 프로시저의 실행을 중지
Stop 문을 사용하면 프로시저의 실행이 중단되고 VB Editor가 나타나면서 디버그 상태가 됩니다. 예제 버튼을 누르면 메시지 상자가 나타나고, 확인을 선택하면 아래 그림과 같은 디버깅 상태가 됩니다. 이때 실행 아이콘을 누르면 나머지 코드가 계속 실행됩니다.
Sub StopStatement()
MsgBox "Stop문을 실행하겠습니다!", , "www.iExceller.com"
Stop
MsgBox "Stop문을 실행하였습니다!", , "www.iExceller.com"
End Sub
Stop 문을 사용하는 것은 아래와 같이 프로그램 상에 '중단점'을 두는 것과 비슷한 역할을 수행합니다.
그런데 예를 들어 "프로시저를 5초간 실행 정지한다, 10초간 정지한다" 라고 할 때에는 Wait 메서드를 사용하면 됩니다.
Sub WaitMethod()
MsgBox "5초 동안 프로시저 실행을 정지합니다. 확인 버튼을 누르세요", , "www.iExceller.com"
Application.Wait Now + TimeValue("00:00:05")
MsgBox "5초가 지났습니다!", , "www.iExceller.com"
End Sub
Wait 메서드로 실행하는 도중에는 엑셀을 손으로 조작할 수는 없게 됩니다. 다만 인쇄 등과 같은 백그라운드로 작동되는 작업은 중단없이 계속 실행됩니다.
Step 2: 지정된 시간에 프로시저 실행하기
이번에는 미리 설정한 시간에 프로시저가 실행되도록 하는 방법에 대해 살펴보도록 하겠습니다. 이 방법을 이용하면 영업장의 일일 마감이 끝난 오후 7시에 정기적인 실적 집계를 실행한다거나 하루 동안 서버에 저장해 둔 데이터를 부하가 적은 새벽 시간에 자동으로 집계하고 결과 처리를 한다거나 하는 등의 작업을 수행할 수 있게 됩니다.
이러한 기능을 구현할 때 사용하는 것이 OnTime 메서드입니다.
Sub OnTimeMethod()
Dim Msg As String
Msg = Msg & "10초 후에 ""영업실적집계"" 프로시저를 실행합니다" & vbCr
Msg = Msg & "확인 버튼을 누르세요"
MsgBox Msg, , "www.iExceller.com"
Application.OnTime Now + TimeValue("00:00:10"), "영업실적집계"
' OnTime 메서드는 프로시저가 지정한 시간, 즉 하루 중 특정 시간 또는 지정한 만큼의
' 시간이 경과된 후에 실행되도록 해 줍니다. 여기서는 지금부터 10초 후에 "영업실적집계"
' 라는 프로시저를 실행하도록 설정하였습니다. 물론 이 때에는 Wait 메서드와는 달리
' 10초가 되기 전에도 사용자는 다른 작업을 수행할 수 있습니다.
' 만약 오후 7시에 "집계처리"라는 프로시저를 실행하려면 아래와 같이 하면 되겠지요?
' Application.OnTime TimeValue("19:00:00"), "집계처리"
' 앞 예제의 OnTime 설정을 해제하려면…
' Application.OnTime EarliestTime:=TimeValue("19:00:00"), Procedure:="집계처리", Schedule:=False
End Sub
Sub 영업실적집계()
' 필요한 작업들을 이 부분에 기재하시면 되겠지요?
MsgBox "영업실적집계 프로시저가 실행되었습니다", , "www.iExceller.com"
End Sub
OnTime 메서드를 여러 번 사용하면 여러 시간대에 걸쳐 실행되는 프로시저를 각각 작성, 사용할 수 있습니다. 이 방법 외에도 다양한 용도로 응용해 보시기 바랍니다.
다음 시간에…
정리 — 시간 제어 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 디버그 중단 | Stop | VB Editor 디버그 상태로 |
| 일정 시간 정지 | Application.Wait Now + TimeValue("00:00:05") | 5초 동안 정지 |
| 경과 시간 후 실행 | Application.OnTime Now + TimeValue("00:00:10"), 프로시저 | 10초 후 실행 |
| 특정 시각 실행 | Application.OnTime TimeValue("19:00:00"), 프로시저 | 오후 7시에 실행 |
| 예약 취소 | Schedule:=False | 예약 해제 |
자주 묻는 질문 (FAQ)
Q1. Wait와 OnTime은 어떻게 다른가요?
Wait는 지정한 시간 동안 프로시저 실행 자체를 멈추어 엑셀을 조작할 수 없게 하지만, OnTime은 예약만 해 두므로 그 사이에도 다른 작업을 할 수 있습니다.
Q2. 정해진 시각에 프로시저를 실행하려면 어떻게 하나요?
Application.OnTime 메서드에 시각(TimeValue)과 실행할 프로시저 이름을 지정합니다. 예를 들어 오후 7시에 실행하려면 TimeValue("19:00:00")을 사용합니다.
Q3. OnTime 예약을 취소하려면 어떻게 하나요?
같은 시각과 프로시저 이름에 Schedule:=False를 지정해 OnTime을 다시 호출합니다.
마치며
OnTime을 여러 번 사용하면 여러 시간대에 실행되는 프로시저를 각각 예약할 수 있으니 다양한 용도로 응용해 보시기 바랍니다.