こんにちは。VBA講師の〇〇です。今回は、業務効率化の「隠し玉」とも言えるOnTimeメソッドについて深掘りします。
多くの解説記事では「定時にメッセージを出す」といった単純な例が紹介されますが、実務の現場では「もっと泥臭く、かつ堅牢な設計」が求められます。今回は、ただ実行するだけでなく、現場でトラブルを起こさないためのテクニックを解説します。
OnTimeの基本構造と「二重起動」の罠
OnTimeメソッドは、指定した時刻にプロシージャを呼び出す機能ですが、最も多い失敗が「ボタンを連打して同じ処理が複数回予約されてしまう」ことです。これを防ぐには、「現在の予約を一度キャンセルしてから再予約する」という手順が鉄則です。
以下のコードを見てください。
Sub 予約処理()
‘ 前回の予約をキャンセルしてから再予約する
On Error Resume Next
Application.OnTime EarliestTime:=TimeValue(“17:00:00″), _
Procedure:=”メイン処理”, Schedule:=False
On Error GoTo 0
‘ 17時に予約を入れる
Application.OnTime EarliestTime:=TimeValue(“17:00:00″), _
Procedure:=”メイン処理”, Schedule:=True
End Sub
このようにSchedule:=Falseを一度実行することで、誤操作による多重予約を確実に回避できます。
実務で使える「定期実行」の応用テクニック
単発の予約よりも、実務では「10分おきに最新データをサーバーから取得する」といった周期的な実行が求められるシーンが多いはずです。その場合は、プロシージャの最後に自分自身を再予約する「再帰的呼び出し」を使います。
Sub 定期データ取得()
‘ 実際のデータ更新処理
Call 最新データ取得ロジック
‘ 次の予約(10分後)を入れる
Application.OnTime EarliestTime:=Now + TimeValue(“00:10:00″), _
Procedure:=”定期データ取得”
End Sub
注意点:PCを閉じたらどうなる?
ここで一つ重要な注意点があります。OnTimeメソッドは、「Excelが開いていること」が前提です。PCをシャットダウンしたり、Excelを閉じてしまったりすると予約は消滅します。
もし「PCを閉じていても動かしたい」のであれば、VBAではなくWindowsの「タスクスケジューラ」を利用するのが正解です。VBAでのOnTimeは、あくまで「業務時間中にバックグラウンドで動かしておきたい処理」に限定して活用するようにしましょう。
まとめ:保守性を高めるために
OnTimeを使う際、プロシージャ名は「標準モジュール」に記述することをお勧めします。シートモジュールやThisWorkbookに書くと、外部から呼び出せない場合があるからです。
「予約の解除」と「再帰によるループ」。この2つをマスターするだけで、あなたのExcelは「単なる計算ツール」から「自律的に働く業務アシスタント」へと進化します。ぜひ、明日の定型業務から取り入れてみてください。
