Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:ステータスバーに1秒ごとに時刻が表示
#VBA100本ノック 70本目
ブックが開かれたら、自動的にステータスバーに1秒ごとに時刻が表示されるようにしてください。
ただし、1分後には時刻表示を終了してください。
※セル入力中は、時刻は更新されなくて構いません。

◇ 出題ページはこちら
ソースコード
ThisWorkbookモジュール
Option Explicit ' 100本ノック070:ステータスバーに1秒ごとに時刻が表示 Private 終了時刻 As Date Private Sub Workbook_Open() 終了時刻 = Now() + TimeSerial(0, 0, 60) Call ステータスバーに時刻を表示して1秒後に自身を再予約する End Sub Sub ステータスバーに時刻を表示して1秒後に自身を再予約する() Application.StatusBar = Format(Now(), "h:mm:ss") If Now() < 終了時刻 Then Application.OnTime Now() + TimeSerial(0, 0, 1), "ThisWorkbook.ステータスバーに時刻を表示して1秒後に自身を再予約する" End If End Sub
解説
Application.OnTimeメソッドを利用して、60個のマクロを実行予約する問題です。
Do ~ Loop 文で1つのマクロを60秒間回す方法もありますが、
CPUを占有する上他のマクロが実行できないためこちらが良いと思います。
OnTimeメソッドは複数のマクロを一括で予約できるため、
今回のコードは↓のように簡単に作ることもできます。
Private Sub Workbook_Open() Dim 秒 As Long For 秒 = 1 To 60 Application.OnTime Now() + TimeSerial(0, 0, 秒), "ThisWorkbook.ステータスバーに時刻を表示する" Next End Sub Sub ステータスバーに時刻を表示する() Application.StatusBar = Format(Now(), "h:mm:ss") End Sub
しかしこのコードはマクロが60個一気に予約されてしまうため、
途中で止めたくなっても止める方法がありません。
対して解答のコードは「OnTimeで呼ばれるたびに次のOnTimeを呼び出す」仕様のため、好きなタイミングでマクロを止めることが出来ます。
OnTimeを連続で使用する場合は途中で止めることを考え、
連鎖的にCallする仕様にしておきましょう。