2013年2月14日木曜日

Excel 2013:Application.OnTimeの再帰呼び出し

自宅に2013導入したというだけで2010でも同じ話です。

Application.OnTimeというメソッドを使ったことがありませんでした。
ところが同じプロシージャを一定時間ごとに自動で実行させたいケースがあり、調べたらこのメソッドで再帰呼び出しをやればいいことがわかりました。しかしそんなかんたんにできるんだろうか。

Application.OnTime メソッド (Excel) - MSDN

例えば上のリンク先にあるサンプル:

Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

これをmy_Procedure自体の中に入れて実行すれば、たしかに15秒毎に繰り返し呼び出されます。セルの編集中や他のプロシージャが実行中などに15秒後が来た場合は、実行可能になるまで待機します(待機時間に期限をつけるのが引数LatestTime)。

ただしこれだけでは問題があります。このブックを閉じてもExcelは15秒後にまたmy_Procedureを実行しようと、閉じたブックを開いてしまいます。EarliestTime=実行時間の予約は、Excel自体に対してかけられるもののようです。Excelを終了すればもちろん無効になりますが。

そのためにあるのがScheduleという最後の引数でした。EarliestTimeとProcedureを指定してScheduleをFalseにすることにより、Excelにかけられた実行時間の予約はキャンセルされます。
しかし上の例だとEarliestTimeであるNow + TimeValue("00:00:15")は、"my_Procedure"を実行するたびに更新されてしまいます。そこで最後のNow + TimeValue("00:00:15")を保存しておく必要があります。
わかりやすいサンプルコードがありました:

セルを点滅させる方法 - MSDN

上のリンク先のコードをブックが開いている間ずっと実行させたければ、Workbook_OpenでStartBlinking、Workbook_BeforeCloseでStopBlinkingを実行すればいいんじゃないかと。

一つ気になるのは最後のEarliestTimeを変数に格納している点です。ずっとブックを開いていたら、他のプロシージャでエラーが出た際などに変数はクリアされてしまうかもしれません。どこかのセルに保存しておく方が安全じゃないかと思いました。実際そのようにしてこのメソッドを利用していますが、特に問題なく動作しています。こんなかんたんなことならもっと早く知るべきでした。

0 件のコメント:

コメントを投稿