HOME > 即効テクニック > Excel VBA > 日付・時刻関連のテクニック > 指定した時刻にマクロを実行する(OnTimeメソッド)

指定した時刻にマクロを実行する(OnTimeメソッド)|Excel VBA

日付・時刻関連のテクニック

指定した時刻にマクロを実行する(OnTimeメソッド)

(Excel 2000/2002/2003/2007/2010/2013/2016)

オフィスなどで仕事をしていて、12時になったら出かけなければならないとします。
それまではExcelで作業を続けるのなら、時間になったことをExcelが教えてくれたら便利ですね。
Excelには、指定した時刻に指定したマクロを実行する機能がありますので、それを使えば簡単なスケジュール管理に応用できるかもしれません。

指定した時刻にマクロを実行するには、ApplicationオブジェクトのOnTimeメソッドを使います。OnTimeメソッドの書式は次の通りです。

構文 Object.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

設定項目内容
ObjectApplicationオブジェクト
EarliestTimeマクロを実行する時刻を指定
Procedure指定した時刻に実行するプロシージャ名を指定
LatestTimeプロシージャを実行する最終時刻を指定 [省略可能]
ScheduleOnTimeメソッドの設定を有効にする(True:既定値)、無効にする(False) [省略可能]

まず、指定した時刻に実行するマクロを作成します。

Sub Test()
  MsgBox "時間です"
End Sub

次に、次のマクロを実行します。

Sub Sample1()
  Application.OnTime EarliestTime:=TimeValue("11:58:00"), Procedure:="Test"
End Sub

これでスケジュールが有効になりましたので、普通にExcelで作業を続けます。
指定した時刻になると「時間です」というメッセージが表示されます。

指定した時刻にほかのマクロが起動していると、OnTimeメソッドで指定したマクロを実行できません。引数LatestTimeを指定するとその時刻まで実行を待ち、それまでに実行できなければマクロの実行はキャンセルされます。引数LatestTimeを省略するといつまでも待ち続けます。

OnTimeメソッドで設定したスケジュールが有効になるのは、OnTimeメソッドを実行したブックがExcel上で開かれている間です。もちろん、Excelを再起動すると、スケジュールは無効になります。

複数のスケジュールを設定することもできます。
また、スケジュールを解除するには、引数ScheduleにFalseを指定します。このとき、引数EarliestTimeとProfedureに解除したいスケジュールのプロシージャ名と時刻を指定します。
存在しないスケジュールを指定した場合はエラーになります。

セルA1:A3に「hh:mm:ss」の形式で時刻が設定されているとします。
次のサンプルでは、3つのスケジュールを設定した後、2つめのスケジュールをキャンセルしているので、「1つめ 時刻」「3つめ 時刻」のメッセージボックスが表示されます。

Sub AlermSample()
    '3つのスケジュールを設定
    Application.OnTime EarliestTime:=Range("A1").Value, _
                       Procedure:="'EchoTime ""1""'"
                                 
    Application.OnTime EarliestTime:=Range("A2").Value, _
                       Procedure:="'EchoTime ""2""'"
                       
    Application.OnTime EarliestTime:=Range("A3").Value, _
                       Procedure:="'EchoTime ""3""'"

    '2つめのスケジュールをキャンセル
    Application.OnTime EarliestTime:=Range("A2").Value, _
                       Procedure:="'EchoTime ""2""'", _
                       Schedule:=False
End Sub

Sub EchoTime(n As Long)
    MsgBox n & "つめ" & vbTab & Time
End Sub