Application.OnTime
は、VBA(Visual Basic for Applications)で利用される Excelアプリケーションのメソッド の一つで、指定した時刻にマクロを自動的に実行させることができます。これは「一定時間後に処理を開始する」「スケジュールされた処理を行う」「処理を分割して非同期風に実行する」といった用途で非常に有用です。
1. 概要:Application.OnTimeとは
Application.OnTime
メソッドは、指定した時刻に指定したマクロを実行するようにExcelに予約する機能です。時間指定は「日付+時刻」または「現在時刻+一定時間」として設定します。
Application.OnTime EarliestTime:=<実行時刻>, Procedure:="<マクロ名>"
2. 書式と引数
vApplication.OnTime(
EarliestTime As Date,
Procedure As String,
Optional LatestTime As Variant,
Optional Schedule As Boolean = True
)
引数の意味:
引数名 | 説明 |
---|---|
EarliestTime | 実行予約する日時(Now + TimeValue("00:01:00") など) |
Procedure | 実行するマクロ(サブルーチン)の名前(文字列) |
LatestTime | 実行を許容する最も遅い時間(通常は省略) |
Schedule | 実行予約を設定(True )またはキャンセル(False ) |
3. 基本的な使用例
数秒後にマクロを実行する例
Sub スケジュール処理()
Application.OnTime Now + TimeValue("00:00:05"), "実行処理"
End Sub
Sub 実行処理()
MsgBox "5秒後に実行されました"
End Sub
この例では、スケジュール処理
を実行すると、5秒後に 実行処理
というマクロが自動的に呼び出されます。
4. 使用用途と応用
(1) 処理の遅延実行
時間のかかる処理や、Excelの他の操作が完了した後に実行したい処理を少し遅らせて実行できます。
(2) タイマー機能の代用
一定時間ごとに処理を繰り返すことで、擬似的なタイマーとして使用することも可能です。
Sub タイマー開始()
Application.OnTime Now + TimeValue("00:00:10"), "繰り返し処理"
End Sub
Sub 繰り返し処理()
' 任意の処理
Debug.Print "10秒ごとの処理"
' 再スケジュール
タイマー開始
End Sub
(3) 自動バックアップなどの定時処理
定時にファイルを保存、特定セルを監視して変化があれば処理、などの定期的な監視処理に利用できます。
5. 実行予約のキャンセル方法
一度予約した OnTime
は、実行される前であればキャンセルすることが可能です。
Sub キャンセル処理()
On Error Resume Next
Application.OnTime 時刻変数, "実行処理", , False
End Sub
キャンセルには、予約時とまったく同じEarliestTime
とProcedure
名が必要です。したがって、予約時に時刻を変数に記録しておく必要があります。
Dim 時刻変数 As Date
Sub スケジュール設定()
時刻変数 = Now + TimeValue("00:01:00")
Application.OnTime 時刻変数, "実行処理"
End Sub
6. 注意点と制限
(1) Excelが開いている必要がある
Application.OnTime
による処理は、Excelが起動していて、ファイルが開かれている状態でなければ実行されません。Excelを閉じると予約も失効します。
(2) マクロが有効なブックである必要
マクロが定義されているブックが開いていないとマクロを実行できません。保存されているだけでは実行されません。
(3) プロシージャ名の誤り
Procedure
引数は文字列として渡されるため、誤字があってもコンパイルエラーにならず、実行時に失敗します。
7. よくあるエラーと対処法
症状 | 原因 | 解決方法 |
---|---|---|
実行されない | Procedure 名が違う | 正しいマクロ名を指定 |
キャンセルできない | 同じEarliestTime でない | スケジュール時の時刻を変数に保存 |
実行後にフリーズ | 再帰的にOnTime を使っている | 終了条件を明確に設ける |
8. DoEvents との違い
DoEvents
: 現在の処理中に一時的にOSに制御を渡すOnTime
: 処理自体を未来の特定時間にスケジュールする
まとめ
Application.OnTime
は、VBAで処理をスケジュール実行したい場合に非常に強力なツールです。以下のような用途に最適です:
- 処理の遅延実行
- 定期的な処理の実現
- フリーズしない処理分割の工夫
- ユーザー操作を妨げずにバックグラウンド処理
ただし、予約のキャンセルが難しかったり、Excelを閉じると失効したりという制約があるため、使いどころには注意が必要です。うまく使えば、VBAでも「タイマー処理」や「スケジューリング処理」が可能になります。