Application.OnTimeとは
Application.OnTimeは、指定した時刻や一定時間後に、任意のマクロを自動で実行できるVBAのメソッドです。「毎日決まった時刻にデータを更新したい」「一定間隔でステータスを自動保存したい」といった、時間を基準にした自動処理を組みたいときに活用できます。
ボタンをクリックして実行する通常のマクロと違い、OnTimeを使うと「ユーザーが何も操作しなくても、決めた時刻になったら自動的にマクロが動く」という仕組みを作れるのが特徴です。この記事では、基本的な使い方から繰り返し実行、予約のキャンセル方法までを解説します。
基本構文
Application.OnTime EarliestTime:=時刻, Procedure:=実行するマクロ名, _
LatestTime:=許容限界時刻, Schedule:=True/False
| 引数 | 説明 |
|---|---|
| EarliestTime | マクロを実行する時刻(必須) |
| Procedure | 実行するマクロ名を文字列で指定(必須) |
| LatestTime | この時刻を過ぎたら実行を諦める限界時刻(省略可) |
| Schedule | Trueで予約、Falseで予約をキャンセル(省略時はTrue) |
Procedureには、実行したいマクロの名前を必ず文字列(ダブルクォーテーション付き)で指定する点に注意してください。
指定した時刻に実行する
特定の時刻にマクロを実行したい場合は、TimeValue関数と組み合わせて時刻を指定します。
Sub ScheduleAt18()
Application.OnTime TimeValue("18:00:00"), "SendDailyReport"
End Sub
Sub SendDailyReport()
MsgBox "18時になりました。日次レポートを作成します。"
End Sub
ScheduleAt18を実行しておくと、その日の18時になったタイミングで自動的にSendDailyReportが呼び出されます。
一定間隔で繰り返し実行する
OnTimeは1回きりの予約ですが、実行されたマクロの中で再び自分自身をOnTimeで予約すれば、一定間隔での繰り返し実行を実現できます。
Dim nextRunTime As Date
Sub StartAutoSave()
nextRunTime = Now + TimeValue("00:10:00") '10分後
Application.OnTime nextRunTime, "AutoSaveBook"
End Sub
Sub AutoSaveBook()
ThisWorkbook.Save
Debug.Print Now & " に自動保存しました"
'10分後に再度AutoSaveBookを予約する
nextRunTime = Now + TimeValue("00:10:00")
Application.OnTime nextRunTime, "AutoSaveBook"
End Sub
AutoSaveBookが実行されるたびに、その中でもう一度10分後のOnTimeを予約し直すことで、「10分おきに自動保存し続ける」という繰り返し処理になります。次回の予約時刻をnextRunTimeというモジュールレベル変数に保持しておくことで、後述するキャンセル処理でも同じ時刻を指定できます。
予約をキャンセルする(Schedule:=False)
繰り返し予約したマクロを止めたい場合は、Schedule:=Falseを指定して同じ時刻・同じマクロ名でキャンセルの呼び出しを行います。
Sub StopAutoSave()
On Error Resume Next
Application.OnTime EarliestTime:=nextRunTime, Procedure:="AutoSaveBook", Schedule:=False
On Error GoTo 0
Debug.Print "自動保存の予約をキャンセルしました"
End Sub
キャンセルする際は、予約したときと同じEarliestTime(予約時刻)を指定する必要があるため、nextRunTimeのようなモジュールレベル変数で直近の予約時刻を覚えておくのが定番のやり方です。予約がすでに実行済みで存在しない場合にエラーにならないよう、On Error Resume Nextで囲んでおくと安全です。
Workbook_Openと組み合わせて自動起動する
ブックを開いた瞬間に定期実行を開始したい場合は、ThisWorkbookモジュールのWorkbook_OpenイベントからStartAutoSaveを呼び出します。
Private Sub Workbook_Open()
StartAutoSave
End Sub
これにより、ブックを開くと自動的に10分おきの自動保存がスタートします。あわせて、ブックを閉じるときに予約をキャンセルする処理も入れておくと安全です。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
StopAutoSave
End Sub
OnTimeの予約はブックを閉じても自動的には消えないため、ブックを閉じる前に必ずStopAutoSaveでキャンセルしておくことが重要です。
注意点
OnTimeで指定するマクロ名は、標準モジュールに書かれたPublicなプロシージャである必要があります。クラスモジュールやユーザーフォーム内のプロシージャは直接指定できません。- ブックを閉じても
OnTimeの予約が残っていると、Excel自体は閉じているのに指定時刻になった瞬間にExcelが再起動したり、エラーメッセージが表示されたりすることがあります。ブックを閉じる前に必ずキャンセル処理を行ってください。 LatestTimeを指定しない場合、PCがスリープしていたりExcelが他の処理でビジー状態だったりすると、指定時刻を過ぎてからマクロが実行されることがあります。厳密な時刻管理が必要な場合はLatestTimeもあわせて指定してください。
まとめ
Application.OnTimeを使うと、指定した時刻や一定間隔でマクロを自動実行できるようになり、定期的な自動保存やデータ更新といった処理をユーザーの操作なしで進められます。繰り返し実行させたい場合は、実行されたマクロの中で次回分を再度予約し、Workbook_Openで開始、Workbook_BeforeCloseでキャンセルという流れをセットで組んでおくと、安全に運用できます。

コメント