← コード一覧へ戻る
実務Excel・Windows連携

10秒後のマクロを予約し、必要なら取り消す

Application.OnTimeで一度だけ実行を予約し、同じ時刻・プロシージャ名で取り消せるよう保存します。

実行前に確認

  • 待機中にブックを閉じる前にCancelTimer8025を実行してください。閉じたブックが予約により再び開かれることがあります。
  • Excelを閉じた状態で動くスケジューラではありません。セル編集中や別マクロ実行中は遅れます。
  • 実行期限を過ぎて通知が出なかった場合も、再予約前にCancelTimer8025を実行します。失効した予約状態を解除できます。
  • VBEのリセットやEndで保存変数が消えると取消に必要な情報を失います。実験中にコードを編集・リセットしないでください。
  • 公式仕様とコードを照合した例です。Excel実機での実行は未検証です。業務ブックではなくコピーで試してください。

1サンプルコード

Option Explicit
Private scheduledAt8025 As Date
Private scheduledProc8025 As String
Private pending8025 As Boolean
Sub PracticeAdvanced8025()
    If pending8025 Then
        MsgBox "予約済みです。先にCancelTimer8025を実行してください。": Exit Sub
    End If
    scheduledAt8025 = Now + TimeSerial(0, 0, 10)
    scheduledProc8025 = "'" & Replace(ThisWorkbook.Name, "'", "''") & "'!RunTimer8025"
    On Error GoTo Failed
    Application.OnTime EarliestTime:=scheduledAt8025, Procedure:=scheduledProc8025, _
        LatestTime:=scheduledAt8025 + TimeSerial(0, 0, 20), Schedule:=True
    pending8025 = True
    Debug.Print "予約: "; scheduledAt8025
    Exit Sub
Failed:
    pending8025 = False
    MsgBox "予約できません: " & Err.Description
End Sub
Public Sub RunTimer8025()
    pending8025 = False
    MsgBox "予約した練習用マクロが実行されました。"
End Sub
Public Sub CancelTimer8025()
    Dim errorNumber As Long
    If Not pending8025 Then Exit Sub
    On Error Resume Next
    Application.OnTime EarliestTime:=scheduledAt8025, Procedure:=scheduledProc8025, Schedule:=False
    errorNumber = Err.Number
    On Error GoTo 0
    If errorNumber = 0 Then
        pending8025 = False
        MsgBox "予約を取り消しました。"
    ElseIf Now > scheduledAt8025 + TimeSerial(0, 0, 20) Then
        pending8025 = False
        MsgBox "予約の実行期限を過ぎています。"
    Else
        MsgBox "予約を取り消せませんでした。ブックを閉じずに、CancelTimer8025を再実行してください。"
    End If
End Sub

図で見る操作の流れ

イメージ図

準備、実行する操作、確認する結果の順で示しています。

  1. 準備

    3つのSubとモジュール先頭の変数を全部同じ標準モジュールへ貼り付けます。練習中はブックを閉じたり名前を変えたりしません。

  2. 操作

    Application.OnTimeで一度だけ実行を予約し、同じ時刻・プロシージャ名で取り消せるよう保存します。

  3. 結果

    Excelが処理できる状態なら約10秒後に通知が1回出ます。予約時刻から20秒を過ぎるまで実行できないと予約は失効します。

待機中にブックを閉じる前にCancelTimer8025を実行してください。閉じたブックが予約により再び開かれることがあります。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。

  2. 2

    3つのSubとモジュール先頭の変数を全部同じ標準モジュールへ貼り付けます。練習中はブックを閉じたり名前を変えたりしません。

  3. 3

    PracticeAdvanced8025を実行してExcelのセル画面へ戻り、編集せず待ちます。取り消すなら10秒以内にAlt+F8でCancelTimer8025を実行します。

  4. 4

    Excelが処理できる状態なら約10秒後に通知が1回出ます。予約時刻から20秒を過ぎるまで実行できないと予約は失効します。

使っている機能の公式ドキュメント(Microsoft Learn)