【ExcelVBA・マクロ】Application.OnTimeの使い方|指定した時刻や一定間隔でマクロを自動実行する方法【コピペOK】

ExcelVBA

Application.OnTimeとは

Application.OnTimeは、指定した時刻や一定時間後に、任意のマクロを自動で実行できるVBAのメソッドです。「毎日決まった時刻にデータを更新したい」「一定間隔でステータスを自動保存したい」といった、時間を基準にした自動処理を組みたいときに活用できます。

ボタンをクリックして実行する通常のマクロと違い、OnTimeを使うと「ユーザーが何も操作しなくても、決めた時刻になったら自動的にマクロが動く」という仕組みを作れるのが特徴です。この記事では、基本的な使い方から繰り返し実行、予約のキャンセル方法までを解説します。

スポンサーリンク
スポンサーリンク

基本構文

Application.OnTime EarliestTime:=時刻, Procedure:=実行するマクロ名, _
    LatestTime:=許容限界時刻, Schedule:=True/False
引数 説明
EarliestTime マクロを実行する時刻(必須)
Procedure 実行するマクロ名を文字列で指定(必須)
LatestTime この時刻を過ぎたら実行を諦める限界時刻(省略可)
Schedule Trueで予約、Falseで予約をキャンセル(省略時はTrue)

Procedureには、実行したいマクロの名前を必ず文字列(ダブルクォーテーション付き)で指定する点に注意してください。

指定した時刻に実行する

特定の時刻にマクロを実行したい場合は、TimeValue関数と組み合わせて時刻を指定します。

Sub ScheduleAt18()
    Application.OnTime TimeValue("18:00:00"), "SendDailyReport"
End Sub

Sub SendDailyReport()
    MsgBox "18時になりました。日次レポートを作成します。"
End Sub

ScheduleAt18を実行しておくと、その日の18時になったタイミングで自動的にSendDailyReportが呼び出されます。

一定間隔で繰り返し実行する

OnTimeは1回きりの予約ですが、実行されたマクロの中で再び自分自身をOnTimeで予約すれば、一定間隔での繰り返し実行を実現できます。

Dim nextRunTime As Date

Sub StartAutoSave()
    nextRunTime = Now + TimeValue("00:10:00") '10分後
    Application.OnTime nextRunTime, "AutoSaveBook"
End Sub

Sub AutoSaveBook()
    ThisWorkbook.Save
    Debug.Print Now & " に自動保存しました"

    '10分後に再度AutoSaveBookを予約する
    nextRunTime = Now + TimeValue("00:10:00")
    Application.OnTime nextRunTime, "AutoSaveBook"
End Sub

AutoSaveBookが実行されるたびに、その中でもう一度10分後のOnTimeを予約し直すことで、「10分おきに自動保存し続ける」という繰り返し処理になります。次回の予約時刻をnextRunTimeというモジュールレベル変数に保持しておくことで、後述するキャンセル処理でも同じ時刻を指定できます。

予約をキャンセルする(Schedule:=False)

繰り返し予約したマクロを止めたい場合は、Schedule:=Falseを指定して同じ時刻・同じマクロ名でキャンセルの呼び出しを行います。

Sub StopAutoSave()
    On Error Resume Next
    Application.OnTime EarliestTime:=nextRunTime, Procedure:="AutoSaveBook", Schedule:=False
    On Error GoTo 0

    Debug.Print "自動保存の予約をキャンセルしました"
End Sub

キャンセルする際は、予約したときと同じEarliestTime(予約時刻)を指定する必要があるため、nextRunTimeのようなモジュールレベル変数で直近の予約時刻を覚えておくのが定番のやり方です。予約がすでに実行済みで存在しない場合にエラーにならないよう、On Error Resume Nextで囲んでおくと安全です。

Workbook_Openと組み合わせて自動起動する

ブックを開いた瞬間に定期実行を開始したい場合は、ThisWorkbookモジュールのWorkbook_OpenイベントからStartAutoSaveを呼び出します。

Private Sub Workbook_Open()
    StartAutoSave
End Sub

これにより、ブックを開くと自動的に10分おきの自動保存がスタートします。あわせて、ブックを閉じるときに予約をキャンセルする処理も入れておくと安全です。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    StopAutoSave
End Sub

OnTimeの予約はブックを閉じても自動的には消えないため、ブックを閉じる前に必ずStopAutoSaveでキャンセルしておくことが重要です。

注意点

  • OnTimeで指定するマクロ名は、標準モジュールに書かれたPublicなプロシージャである必要があります。クラスモジュールやユーザーフォーム内のプロシージャは直接指定できません。
  • ブックを閉じてもOnTimeの予約が残っていると、Excel自体は閉じているのに指定時刻になった瞬間にExcelが再起動したり、エラーメッセージが表示されたりすることがあります。ブックを閉じる前に必ずキャンセル処理を行ってください。
  • LatestTimeを指定しない場合、PCがスリープしていたりExcelが他の処理でビジー状態だったりすると、指定時刻を過ぎてからマクロが実行されることがあります。厳密な時刻管理が必要な場合はLatestTimeもあわせて指定してください。

まとめ

Application.OnTimeを使うと、指定した時刻や一定間隔でマクロを自動実行できるようになり、定期的な自動保存やデータ更新といった処理をユーザーの操作なしで進められます。繰り返し実行させたい場合は、実行されたマクロの中で次回分を再度予約し、Workbook_Openで開始、Workbook_BeforeCloseでキャンセルという流れをセットで組んでおくと、安全に運用できます。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました