VBAで自動化 VBA一覧 エラー対策

【VBA】処理が終わるまで待機させる【Sleep関数・Application.Waitメソッド】

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関数の使用を検討するべきです。

-VBAで自動化, VBA一覧, エラー対策