初心者から実務利用者まで
わかりやすいVBA解説サイト
実務サンプル

10秒ごとに「10秒経ちました」とメッセージを出す

指定の時間が来たらマクロを実行するメソッドを
Ontime(オンタイム)メソッドと言います。

ビデオのタイマー予約録画の様な働きをするので
一見とても便利な機能ですが、

実際に組んでみるとコードを書くルールに独特のクセがあり
マクロの構築に苦労する事もしばしばです。

更に困ったことに、いまOnTimeが働いているのか
そうでないのかを確認する手段がありません。

何か工夫をしながら使用しないと
現在マクロが動いているかがユーザーに伝わらないし
マクロのテストもとてもやりづらいです。

書き方

OnTime(EarliestTime,Procedure,LatestTime,Schedule)

OnTime(①実行の時刻,②プロシージャ名,③もし実行できなかったらどのくらい待つか,④起動か停止か)

①実行する時刻を指定します。
②実行するプロシージャ名を指定します。
③指定した時刻にプロシージャが実行できなかった場合、どのくらい待つかです。
 省略すると、プロシージャが実行できるまでいつまでも待ちます。
④指定した時刻に実行するか、停止するかをTrueかFalseで指定できます。

コードサンプル

※事前に下記の様なセルをアクティブシートに用意します。

解説

①変数を設定します。

②マクロが今起動中であるか、停止中かを確認する方法がないため
起動した時にB3セルに「起動中」、
停止した時にB3セルに「停止中」と記載します。

③オンタイムメソッドを記載します。

Application.OnTimeのあとに

・開始時間+起動の間隔(StartTime + TimeValue(TimeAdd))
・実行するプロシージャ名(オンタイム)
・LastTimeは省略
・指定時刻に起動して欲しいので「True」

を記載します。

④現在時刻(Time)がB2セルに記載しておいた終了時刻を超えたら
プロシージャの自動実行を中止します。

・MsgBoxで終了メッセージを出し
・B3セルを「停止中」に切り替え、
・Application.OnTimeをFalse

に、しています。

ここで大きく注意しなくてはならないのが
OnTimeを終了する時には、
開始した時刻を正確に記載しなくては
OnTimeが終了しないという妙なクセです。

今回はOnTime実行時に、開始時刻を

StartTime = Time
Application.OnTime StartTime + TimeValue(TimeAdd),”オンタイム”, , True

と、記載しましたが、
下記の様に、OnTimeにNowを組み込んで記述してしまうケースが
散見されます。

Application.OnTime Now + TimeValue(TimeAdd),”オンタイム”, , True

しかし、この様にコードを記述してしまうと停止する時に

Application.OnTime Now + TimeValue(TimeAdd),”オンタイム”, , False

これで止まりません。
なぜなら、起動した時の「Now」と
停止する時の「Now」は違う時間だからです。

そのため、サンプルでは「StartTime」という変数にわざわざ
起動した時間を記録してOnTimeに組み込んでいます。

この仕組みをしらない事で、OnTimeを組んだけど
うまく止まらない…と、まごまごしてしまう事が
最初はよくありますので気を付けてください。