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にリセットする。

 

 

解説が不要なくらい簡単です。  色々と応用できそう。 (^^)

 

こちらもどうぞ。