OnTime の構文

VBA — OnTime 構文
' Application.OnTime EarliestTime, Procedure, [LatestTime], [Schedule]
' EarliestTime : 実行する時刻(Date型)
' Procedure    : 実行するプロシージャ名(文字列)
' Schedule     : True=登録(既定)/ False=キャンセル

指定時刻に1回実行

VBA — 30秒後に実行
Option Explicit

Sub ScheduleOnce()
    ' 30秒後に DoTask を実行
    Application.OnTime Now + TimeValue("00:00:30"), "DoTask"
End Sub

Sub DoTask()
    MsgBox "30秒後の処理が実行されました: " & Now
End Sub

一定間隔で定期実行

VBA — 10秒ごとに定期実行
Option Explicit

Private g_NextTime As Date
Private g_Running  As Boolean

Sub StartTimer()
    g_Running  = True
    g_NextTime = Now + TimeValue("00:00:10")
    Application.OnTime g_NextTime, "TimerTick"
    MsgBox "タイマー開始"
End Sub

Sub TimerTick()
    If Not g_Running Then Exit Sub

    ' ── 定期処理 ──
    Debug.Print "実行: " & Now
    ThisWorkbook.Sheets(1).Cells(1, 1).Value = Now

    ' 次回を予約
    g_NextTime = Now + TimeValue("00:00:10")
    Application.OnTime g_NextTime, "TimerTick"
End Sub

Sub StopTimer()
    g_Running = False
    On Error Resume Next
    Application.OnTime g_NextTime, "TimerTick", Schedule:=False
    On Error GoTo 0
    MsgBox "タイマー停止"
End Sub

タイマーのキャンセル

Schedule:=False で登録済みのタイマーをキャンセルできます。同一の時刻とプロシージャ名を指定する必要があります。

制約と注意事項

制約内容
Excelが開いている必要ありExcelを閉じるとタイマーは無効化される
マクロ実行中はキューイング他のマクロ実行中は OnTime の時刻が来てもキューに積まれ、完了後に実行される
精度は1秒単位ミリ秒以下の精度は出ない
引数なしプロシージャのみ引数付きプロシージャは直接指定できない(グローバル変数経由で代替)
キャンセル時の注意タイマー時刻を変数に保持しておかないとキャンセルできない

⚠️ ブックを閉じる前にタイマーを必ず停止する

Workbook_BeforeCloseStopTimer を呼び出すか、g_Running = False を設定してください。停止せずに閉じると次回開いたときに意図しない実行が起きる場合があります。

まとめ

Application.OnTime は定期実行ツールや自動保存・自動更新処理に有効です。ただし「Excelを閉じると止まる」「精度1秒」「引数なし限定」という制約を理解したうえで使いましょう。

次の章では…

PART 13 では API呼び出し を解説します。Declare Function でWin32 APIを呼び出し、64bit対応の PtrSafe についても解説します。

→ PART 13 — API呼び出しへ