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図で見る操作の流れ
イメージ図準備、実行する操作、確認する結果の順で示しています。
準備
3つのSubとモジュール先頭の変数を全部同じ標準モジュールへ貼り付けます。練習中はブックを閉じたり名前を変えたりしません。
操作
Application.OnTimeで一度だけ実行を予約し、同じ時刻・プロシージャ名で取り消せるよう保存します。
結果
Excelが処理できる状態なら約10秒後に通知が1回出ます。予約時刻から20秒を過ぎるまで実行できないと予約は失効します。
待機中にブックを閉じる前にCancelTimer8025を実行してください。閉じたブックが予約により再び開かれることがあります。
コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。
使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
- 1
Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。
- 2
3つのSubとモジュール先頭の変数を全部同じ標準モジュールへ貼り付けます。練習中はブックを閉じたり名前を変えたりしません。
- 3
PracticeAdvanced8025を実行してExcelのセル画面へ戻り、編集せず待ちます。取り消すなら10秒以内にAlt+F8でCancelTimer8025を実行します。
- 4
Excelが処理できる状態なら約10秒後に通知が1回出ます。予約時刻から20秒を過ぎるまで実行できないと予約は失効します。