With Application.OnTime method, you can set Excel to run some VBA at a specific time, or repeatedly at set intervals. In this guide, we're going to show you how to run macro at a specified time in Excel.

Download Workbook


VBA’s Application.OnTime method is the direct answer of the topic. The method allows you to schedule a procedure to be run at a specified time in the future. The time can be either a specific time of day or a specific amount of time will pass.


Application.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

The Application.OnTime method has 4 parameters which includes 2 optional inputs:

Name Required/Optional Data type Description
EarliestTime Required Variant The time when you want this procedure to be run.
Procedure Required String The name of the procedure to be run.
LatestTime Optional Variant The latest time at which the procedure can be run. If this argument is omitted, Excel will wait until the procedure can be run.
Schedule Optional Variant

True to schedule a new OnTime procedure.

False to clear a previously set procedure.

The default value is True.

Examples to run macro at a specified time

Schedule a macro to run at 1 pm today

Supply 2 arguments to run the OnTime method in its basic form. To set a macro to run at a specific time, enter the time in TimeValue method as a string.

Application.OnTime TimeValue("13:00:00"), "BestMacroEver"

Schedule a macro to run 5 minutes from now

If would like to run a macro after a specific amount of time has passed, add the amount of time to the Now command, which returns the current time.

Application.OnTime Now + TimeValue("00:05:00"), "BestMacroEver"

Schedule a macro to run after midnight

To schedule a macro at a specific time after midnight, you have to specify the next day’s date. You can use the DateSerial method by adding 1 to the current day to populate next day’s date. The following code triggers the macro BestMacroEver after 5 minutes from midnight.

Application.OnTime DateSerial(Year(Now) + Month(Now), Day(Now) + 1) + TimeValue("00:05:00"), "BestMacroEver"

Running a code at set intervals

You can call OnTime method recursively to run a macro at set intervals. The following code makes subroutine CallMeMaybe call itself with 5-minute intervals, until 5 pm.

Sub CallMeMaybe()
 'Enter you code here
  Application.OnTime Now + TimeValue("00:05:00"), "CallMeMaybe", TimeValue("17:00:00")
End Sub

Cancel the scheduled task

Set the Schedule argument as False to cancel a scheduled task. You can use their names to specify arguments to skip optional argument LatestTime.

Application.OnTime EarliestTime:=TimeValue("13:00:00"), Procedure:="BestMacroEver", Schedule:=False