以下の内容はhttps://www.limecode.jp/entry/fungo/070-display-clock-in-statusbar-every-secondより取得しました。


70本目:ステータスバーに1秒ごとに時刻が表示

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()

    DimAs 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する仕様にしておきましょう。




以上の内容はhttps://www.limecode.jp/entry/fungo/070-display-clock-in-statusbar-every-secondより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14