Excel上で所定の時間になるとなんらかの処理を行う、OnTimeメソッドのご紹介です。
所定の時間になったら処理を行う
時間になったらマクロを実行
Application.OnTime 時間,マクロ名
Application.OnTime 時間,マクロ名

ひとつマクロを作って、マクロ名は「alarm」とし、メッセージボックスを表示する命令を作ります。

別のマクロを作ります。別のウィンドウにしてますが、sub~で分けて下にそのまま書いても大丈夫です。

Application.OnTime TimeValue(“7:00”), “alarm”(7時になったら「alarm」メソッドを実行)と記述します。
Applicationというのはメソッドを命令する相手で、アプリ=ソフト=Excelのことです。
Applicationというのはメソッドを命令する相手で、アプリ=ソフト=Excelのことです。

では、時間までお茶でも飲んで待ちましょう。

時間になりました。

するとalarmメソッドが実行され、メッセージボックスが自動的に表示されました。

timevalue~は引数名で言うと「EarliestTime」、指定するマクロは「Procedure」なので、
Application.OnTime EarliestTime:=TimeValue(“7:15″), Procedure:=”alarm”
と書いても同じ意味になります。
Application.OnTime EarliestTime:=TimeValue(“7:15″), Procedure:=”alarm”
と書いても同じ意味になります。
指定した時間が過ぎたら処理を実行

さっきのコードをちょっといじって、Application.OnTime Now + TimeSerial(0, 0, 10), “alarm”とします。Nowは今、TimeSerial(0, 0, 10)はプラス10秒という意味です。
Now + TimeValue(“00:00:10”)と書いても同じ意味になります。
Now + TimeValue(“00:00:10”)と書いても同じ意味になります。

マクロをセットして、しばし天井を見つめて過ごします。

10秒経過するとアラームが表示されます。
指定の時間ごとに同じ処理を繰り返す

今までは時間になるとマクロ「alarm」を実行していましたが、これを「setalarm」に変更します。
時間指定をしたマクロ「setalarm」内で「setalarm」を実行するということは、指定した時間ごとに自分自身を繰り返し実行するマクロということになります。
時間指定をしたマクロ「setalarm」内で「setalarm」を実行するということは、指定した時間ごとに自分自身を繰り返し実行するマクロということになります。

秒数をちょっと縮めて、その下にalarmと記述し、マクロ「alarm」も呼び出すようにしておきます。

これで、5秒ごとにメッセージボックスが表示される鬱陶しいマクロとなります。

ほっとけば無限に繰り返し処理を行いますが、マクロ編集画面の「中断」を押せば止められますし、なんならExcelを一回閉じればマクロは中断されます。
アラームを中断する

アラームを停止するマクロも作ることができますが、意外と手ごわいです。
また別のマクロを作り、「stopalarm」とします。
基本的には「Schedule」という引数をFalseにする(OnTimeが有効になっている状態はScheduleがTrue)ことでタイマーをストップできるので、Application.OnTime stoptime, “setalarm”, , Falseと書くとか……(途中の,と,の間はまた別の引数を入れられる場所ですが、省略可能)。
また別のマクロを作り、「stopalarm」とします。
基本的には「Schedule」という引数をFalseにする(OnTimeが有効になっている状態はScheduleがTrue)ことでタイマーをストップできるので、Application.OnTime stoptime, “setalarm”, , Falseと書くとか……(途中の,と,の間はまた別の引数を入れられる場所ですが、省略可能)。

またはApplication.OnTime stoptime, “setalarm”,schedule:=Falseと書けばいけそうなもんですが、

これだとガッツリエラーになります。

理由①としては、OnTimeを実行前は当然ScheduleがFalseなわけですが、その状態でさらにScheduleにFalseを設定しようとするとエラーになります。
なので先にOnTimeを実行してからFalseにするとエラーになりません(Scheduleの記述を省略した場合もTrueになります)。ただこれだと繰り返しになりません。
なので先にOnTimeを実行してからFalseにするとエラーになりません(Scheduleの記述を省略した場合もTrueになります)。ただこれだと繰り返しになりません。

理由②としては、Trueにする時とFalseにする時ではEarliestTimeに同じパラメーターを指定する必要があります。
ScheduleをTrueにする時Now + TimeValue(“00:00:05”)、Falseにする時Nowを指定すると、これもエラーになります。
ScheduleをTrueにする時Now + TimeValue(“00:00:05”)、Falseにする時Nowを指定すると、これもエラーになります。

そこで対処法としては、まずpublicで時間を代入する変数を作成します。publicで作った変数は他のマクロと使い回すことができます。as Dateと付けることで日付(時間)を扱う値であることを指定し、今回はPublic alarmtime As Dateと入力します。

マクロ「setalarm」内では、このalarmtimeにNow + TimeValue(“00:00:05”)を指定します。
詐欺みたいですが、同じ変数名であればふたつのマクロで実質違う時間であってもOKです。
詐欺みたいですが、同じ変数名であればふたつのマクロで実質違う時間であってもOKです。

EarliestTimeにalarmtimeを指定します。

マクロ「stopalarm」のほうでも、EarliestTimeにalarmtimeを指定します。
as Dateで作った変数に何も代入しないと、自動的に現在時間が適用されます。
as Dateで作った変数に何も代入しないと、自動的に現在時間が適用されます。

この状態で「setalarm」を実行すると、5秒ごとにメッセージボックスが表示され……、

stopalarmを実行すると、繰り返し処理が中断されます。

ついでに「stopalarm」単体で実行した時のエラーも出なくしておきましょう。
OnTimeを実行する前にOn Error Resume Nextと記述します。エラーが出ても無視して次へ進む、という意味です。
OnTimeを実行する前にOn Error Resume Nextと記述します。エラーが出ても無視して次へ進む、という意味です。

これでscheduleをFalseにするだけの命令を実行しても、エラーが出なくなりました。

やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ

関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント