VBAのApplication.OnTimeは解除が意外と面倒です。
-----------------------------------
Sub 予約コード()
Application.OnTime Now + TimeValue("00:00:05"), "目的コード"
End Sub
Sub 目的コード()
MsgBox "実行しました。"
End Sub
-----------------------------------
上記において
8:00:00と8:00:02に予約コードを行うと(連続2回予約)
8:00:05と8:00:07に目的コードが実行されます。(2回実行)
複数のApplication.OnTimeを連続して行うと、
前の予約が上書きされるのではなく、予約した回数分が実行されます。
しかし、上記のように連続2回予約した場合にやりたいことは ↓
8:00:05の目的コードはキャンセルして、
8:00:07の1回だけ実行したい。(複数回予約しても最後の1回だけを実行)
そこで8:00:05の目的コードをキャンセルするつもりで下記を実行しても ↓
Application.OnTime Now + TimeValue("00:00:05"), "目的コード", , False
目的コードはキャンセルされません。 Now が刻々と変化するため、
Now + TimeValue("00:00:05")が8:00:05ではなくなってしまうからです。
8:00:00と8:00:02に連続して2回予約コードを行ったら
8:00:05は無しとして、8:00:07に1回だけ目的コードを実行したい。
例え連続10回予約コードを実行しても、最後の1回だけを有効にしたい。
さて、どのようにしたらよいか・・・
試行錯誤して簡便な方法を思いつきました。 ↓
-----------------------------------
Dim 時刻 As Variant 'モジュール変数:モジュールの先頭に置く。
Sub 予約コード()
If 時刻 <> 0 Then Application.OnTime 時刻, "目的コード", , False
時刻 = Now + TimeValue("00:00:05")
Application.OnTime 時刻, "目的コード"
End Sub
Sub 目的コード()
時刻 = 0
MsgBox "実行しました。"
End Sub
-----------------------------------
・ 実行の予約時刻をモジュール変数とする。(パブリック変数でもOK)
・ 時刻が0でないなら(目的コードが予約済&実行前)、キャンセルする(予約なしとなる)。
・ 時刻が0なら(予約なし、または目的コード実行済)、目的コードを予約。
・ 目的コードでは最初に時刻を0にリセットする。
解説が不要なくらい簡単です。 色々と応用できそう。 (^^)
こちらもどうぞ。