Excel VBAでマクロの実行を一時停止し、指定された期間待機させる方法は非常に役立つことがあります。外部プロセスの完了を待つ、ユーザーへの警告表示後に処理を継続する前に一時停止する、あるいはAPIからのレスポンスを待つ場合などです。ここでは、Sleep関数とApplication.Waitメソッドの2つの主な方法を紹介します。
目次
Sleep関数の宣言
Sleep関数を使うには、マクロの実行を指定したミリ秒数だけ停止させることができます。この関数はWindows APIの一部であり、VBA自体には直接組み込まれていないため、使用するにはWindows API関数の宣言を追加する必要があります。
これにより、kernel32.dllライブラリ内のSleep関数をVBAコードから呼び出すことが可能になります。
【32ビット版のOfficeでは以下の宣言を使用】
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
【64ビット版のOfficeではPtrSafeキーワードとLongPtr型を使用した宣言が必要】
(ポインタおよび整数のサイズが異なるため)
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Sleep関数の使用例
Sleep関数を宣言した後は、任意の場所でこの関数を呼び出して、マクロの実行を一時停止させることができます。引数には、待機したい時間をミリ秒単位で指定します。
Sub PauseMacro()
' 1000ミリ秒(1秒)の待機
Sleep 1000
' 待機後の処理をここに記述
MsgBox "1秒待機した後のメッセージ"
End Sub
Sleep関数の特徴
- 外部プロセスが完了するのを待つ、あるいはユーザーがメッセージボックスを読む時間を与える場合など、さまざまなシナリオで役立ちます。
- ループ内で繰り返し実行されるマクロがある場合、各繰り返しの間に一時停止を挟むことでCPUの負荷を軽減することができます。
- Sleep関数で指定された時間を完全に停止させている間、Excelは反応しなくなるため、長い時間の使用は避けるべきです。
- ExcelのUIがフリーズしているように見える場合でも、Sleep関数による一時停止は正常な動作です。待機時間が終了すれば、マクロは自動的に再開されます。
Application.Waitメソッドの基本的な使用方法
Application.Waitメソッドは、指定された時刻までVBAマクロの実行を停止します。このメソッドは、現在時刻から特定の期間を加算して、その時刻まで待機する形で使用します。
【基本的な文法】
Application.Wait(Time)
Timeには、マクロの実行を再開させたい具体的な時刻を指定します。
時刻はNow + TimeValue("hh:mm:ss")の形式で加算して指定することが一般的です。
Application.Waitメソッドの使用例
現在の時刻から10秒後まで処理を停止します。
TimeValue関数は、時間のみを表すDate型の値を返します。この方法を使用すると、マクロの実行を秒単位で簡単に制御できます。
Sub DemoApplicationWait()
' 現在時刻から10秒後までマクロの実行を停止
Application.Wait Now + TimeValue("00:00:10")
MsgBox "10秒経過しました"
End Sub
Application.Waitメソッドの特徴
- マクロの実行を一時停止して、指定された時刻まで待機させることができます。短時間の待機が必要な場合やVBAマクロの実行を指定した時間まで遅延させたい場合に便利です。
- Application.WaitはCPUリソースを使用します。実行中、Excelは応答しなくなることはありませんが、大規模なデータ処理や複雑な計算を行うマクロの場合、パフォーマンスに影響を与える可能性があります。
- 待機中はExcelが完全にはフリーズしないため、ユーザーは他の操作を行うことができます。しかし、これによってマクロの実行結果に影響が出る場合があるため、使用する際は注意が必要です。
- Application.Waitメソッドは、Sleep関数と比較して精度が低い場合があります。システムのタイマー解像度に依存するため、非常に短い待機時間(数秒以下)を正確に制御する場合はSleep関数の使用を検討するべきです。