OnTimeでの設定を解除する
繰り返し実行するのには便利なOnTimeメソッドですが、
いろいろと不明な部分もあります。
OnTimeで繰り返しを始めたかを忘れてしまって
2回目の繰り返しを始めてしまうことがあります。
結果パラレルワールドです。
なぜそのようなことになってしまうかと考えてみると
OnTimeで設定したものが調べられないからです。
調べられないから解除もできない。
実はOnTimeメソッドは解除もできます。
前にVBAヘルプのOnTimeメソッドを読んだときには
気が付きませんでした。
しかしこの解除の方法…
なかなか使えないシロモノです。
OnTimeで10秒後に設定するときはこうです。
Application.OnTime _
Now() + TimeValue("00:00:10"), _
"マクロ名"
上のコードを実行する時点で
Now() + TimeValue("00:00:10") = "2011/05/21 9:32:20"とする。
このコードで設定したものを解除するには
同じ日時、同じマクロ名で
最後に「, , False」を付加します。
詳細はVBAヘルプにあります。
Application.OnTime _
CDate("2011/05/21 9:32:20"), _
"マクロ名", , False
これで解除できます。
次のコードでは解除できずにエラーになります。
Application.OnTime _
Now() + TimeValue("00:00:10"), _
"マクロ名", , False
理由はNow関数はその時々によって値が変化していくので
同じ「Now() + TimeValue("00:00:10")」でも
値が違ってきます。
以上の理由でOnTimeの設定をキャンセルするには
どこかに設定した日時を残しておかなければいけません。
なにかいい方法はないかと調べてみました。
マイクロソフトサポートに下のページがありました。
XL2000: Canceling OnTime Macro When Time Argument Is Volatile
このページに書かれている方法は要するに、
開始した時刻から59秒間だけ
15秒間隔でTestMacroプロシージャを実行するということです。
ん~使えない、
やはりシートに日時を残すしかないのか?
まあこの簡便さがVBAがいいなと思うところでもあります。
ではまず
それ用の"OnTime"シートを作成します。
OnTimeメソッドを使用したときには、
ここに引数の値を残します。
もし解除したいときは、
"OnTime"シートの値を使います。
以上
コードはこちら
Sub OnTimeFunc(d As Date, mName As String) Sub macro110521a() '次回の実行を設定 Sub macro110521b() Debug.Print "macro110521b実行" |
繰り返し実行したい処理は
macro110521aのコメントで指定した箇所に入れてください。
macro110521bは直前のOnTimeをキャンセルします。
"OnTime"シートの様子:
OnTimeメソッドで何を設定したか忘れて
それを実行したくないときは、
Excelを一旦終了しましょう。
または繰り返しているマクロの途中に
Stopかブレークポイントを作ると中断して停止できます。
| 固定リンク
この記事へのコメントは終了しました。

コメント
エクセルでタイマー的なものを探していたところ、このHPに巡り会いました(OnTimeメソッド)。
会社でデータを定期的に取り込むエクセルを使用した簡単なシステムを作っています。
自由に使用して構いませんでしょうか?
著作について、留意する点はありますでしょうか?
返信を頂けると幸いです。
投稿: MT | 2012年4月24日 (火) 16時07分
申し訳ございません、
返信が大変遅くなりました。
当ブログで公開しているコードについて、
すべて自由に使用してもらって構いません。
参考にしていただけること、
大変嬉しく思います。
今後も
当ブログをよろしくお願いします。
投稿: 管理人やむえむ | 2012年8月11日 (土) 12時26分
8年経過していますが、Office2013でもやりたいことがすぐにできました。とても感謝しています。
投稿: | 2020年3月18日 (水) 16時22分