Excel VBAで特定の処理の実行を一時的に止めたい場面はありませんか。
例えば、Webサイトからデータを取得する際に、サーバーに負荷をかけすぎないよう一定間隔でアクセスしたい場合や、ユーザーに処理の進行状況を視覚的に伝えたい場合などが考えられます。
VBAには、こうした処理の一時停止を実現するためのWait関数とSleep関数が存在します。
この記事では、それぞれの関数の使い方と、処理を一時停止する具体的な方法を解説します。
VBAの処理を意図通りに制御できるようになり、より高度な自動化が可能になります。
【要点】VBAで処理を一時停止するWait関数とSleep関数の使い方
- Wait関数: 指定した時間だけExcelの処理を待機させ、その間Excelは操作可能になる。
- Sleep関数: 指定した時間だけプログラムの実行を停止させる。その間Excelは操作不能になる。
- 使い分け: Excelの操作を止めずに待機したい場合はWait関数、プログラムの実行自体を完全に止めたい場合はSleep関数を使用する。
ADVERTISEMENT
目次
VBAにおける処理の一時停止の仕組み
Excel VBAで処理を一時停止させる主な方法として、Wait関数とSleep関数が挙げられます。
これらの関数は、コードの実行を一定時間保留することで、プログラムの進行をコントロールします。
Wait関数はExcelアプリケーション自体は操作可能にしたまま待機しますが、Sleep関数はプログラムの実行を完全に停止させるため、Excelの操作もできなくなります。
それぞれの特性を理解し、目的に応じて使い分けることが重要です。
VBAのWait関数を使った処理の一時停止
Wait関数は、指定した時間だけVBAコードの実行を一時停止させます。
この関数を使用している間も、Excelアプリケーション自体は操作可能な状態を維持します。
そのため、ユーザーが他の操作を行ったり、Excelの画面を見たりすることができます。
Wait関数の基本的な使い方
Wait関数は、現在時刻から指定した時間だけ経過するまで待機します。
- 待機時間を設定する
WorksheetFunction.Now + TimeValue(“00:00:05”)のように、現在時刻に待機したい時間を加算した値を指定します。
TimeValue関数は、文字列で指定された時間をシリアル値に変換します。 - Wait関数を実行する
Application.Wait DateSerial(Year(Now), Month(Now), Day(Now)) + TimeSerial(Hour(Now), Minute(Now), Second(Now) + 5))のように、待機する時刻を指定して実行します。
または、Application.Wait Now + TimeValue(“00:00:05”)のように、現在時刻に加算する形式でも指定できます。
Wait関数を使った具体的なサンプルコード
以下のコードは、メッセージボックスを表示した後、5秒間待機してから次のメッセージボックスを表示する例です。
- 最初のメッセージを表示する
MsgBox “処理を開始します。5秒後に次のメッセージを表示します。” - 5秒間待機する
Application.Wait Now + TimeValue(“00:00:05”) - 次のメッセージを表示する
MsgBox “5秒経過しました。処理を続行します。”
Wait関数の注意点
Wait関数は、指定した待機時間が経過するまでExcelの画面をフリーズさせるわけではありません。
Excel自体は操作可能ですが、Wait関数を実行しているVBAコードの実行は一時停止します。
また、Wait関数は指定された時刻にならないと処理を再開しないため、例えば「5秒待つ」という単純な処理でも、正確に5秒待つとは限りません。
これは、Excelの内部的な処理サイクル(タイマーの精度)に依存するためです。
VBAのSleep関数を使った処理の一時停止
Sleep関数は、指定したミリ秒数だけプログラムの実行を完全に停止させます。
この間、Excelアプリケーションを含む、そのプログラムのすべての動作が停止します。
したがって、ユーザーはExcelを操作することができません。
Sleep関数の基本的な使い方
Sleep関数は、Windows API関数であるため、VBAから呼び出すためには宣言が必要です。
引数には、停止させたい時間をミリ秒単位で指定します。
- API宣言を行う
コードの先頭(SubやFunctionプロシージャの外)に、以下の宣言を記述します。Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Microsoft 365や64bit版OfficeではPtrSafeとLongPtrを使用します。Excel 2019以前の32bit版Officeでは、Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)となります。
- Sleep関数を実行する
Sleep 5000 のように、引数にミリ秒単位で待機時間を指定して実行します。
5000ミリ秒は5秒に相当します。
Sleep関数を使った具体的なサンプルコード
以下のコードは、メッセージボックスを表示した後、3秒間プログラムの実行を停止させ、その後次のメッセージボックスを表示する例です。
- API宣言(コードの先頭に記述)
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
- 最初のメッセージを表示する
MsgBox “処理を開始します。3秒間プログラムを停止します。” - 3秒間プログラムを停止する
Sleep 3000 - 次のメッセージを表示する
MsgBox “3秒経過しました。処理を続行します。”
Sleep関数の注意点
Sleep関数はプログラムの実行を完全に停止させるため、実行中はExcelの画面が固まったように見えます。
長時間の停止を指定すると、ユーザーはアプリケーションが応答しなくなったと感じる可能性があります。
したがって、ユーザー体験を考慮して、適切な停止時間を選択することが重要です。
また、API宣言の有無や、32bit版/64bit版Officeによる記述の違いに注意が必要です。
ADVERTISEMENT
Wait関数とSleep関数の使い分け
Wait関数とSleep関数は、どちらも処理を一時停止させる機能ですが、その動作には明確な違いがあります。
どちらの関数を使用すべきかは、実現したい処理の内容によって判断します。
Wait関数が適しているケース
Wait関数は、Excelの操作を止めずに、バックグラウンドで処理を待機させたい場合に適しています。
例えば、以下のようなケースです。
- Webスクレイピングで、サーバーへの負荷を軽減するためにアクセス間隔を空けたい場合。
- 外部アプリケーションとの連携で、一定時間待ってから次の処理を実行したい場合。
- ユーザーに処理の進行状況を見せながら、一時的な待機を挟みたい場合。
Sleep関数が適しているケース
Sleep関数は、プログラムの実行自体を完全に停止させたい場合に有効です。
これは、以下のような状況で役立ちます。
- 特定の処理が完了するまで、他の処理に進みたくない場合。
- デバッグ時に、コードの特定の箇所で一時停止させて、状態を確認したい場合(ただし、ブレークポイントの方が適しています)。
- 短時間で処理を完全に止め、リソースを一時的に解放したい場合。
両者の比較表
それぞれの関数の特徴を比較表にまとめました。
| 項目 | Wait関数 | Sleep関数 |
|---|---|---|
| Excel操作の可否 | 可能 | 不可 |
| プログラム実行の停止 | VBAコードの実行のみ | プログラム全体の実行 |
| 指定単位 | 時刻または時間間隔 | ミリ秒 |
| API宣言 | 不要 | 必要 (kernel32.dll) |
| 主な用途 | 外部連携、負荷軽減 | 処理の完全な中断 |
Wait関数・Sleep関数使用時の注意点とトラブルシューティング
Wait関数とSleep関数は便利ですが、使用方法を誤ると意図しない動作を引き起こしたり、Excelの操作性を損なったりする可能性があります。
ここでは、よくある注意点やトラブルシューティングについて解説します。
Wait関数で指定した時間待たない場合の対処
Wait関数は、指定した時刻に達するまで処理を待機しますが、Excelのタイマーの精度によっては、指定した時間よりわずかに早く処理が再開されることがあります。
これは、Wait関数がExcelのイベントループに依存しているためです。
- 対処法: より確実な待機が必要な場合は、Wait関数を複数回実行したり、Sleep関数と組み合わせたりすることを検討します。
例えば、Wait関数で目標時刻の少し前まで待機させ、その後Sleep関数で残りの時間を正確に待機させる方法が考えられます。
Sleep関数でExcelが応答しなくなる場合の対処
Sleep関数で長すぎる時間を指定すると、Excelが応答しなくなり、強制終了せざるを得ない状況になることがあります。
特に、ユーザーが処理の進行を把握できない長時間の場合に発生しやすいです。
- 対処法: Sleep関数の引数には、ユーザーが許容できる範囲の短い時間を指定します。
例えば、数秒程度にとどめ、長時間待機が必要な場合は、Wait関数を使用するか、処理を分割してユーザーに進捗を伝える工夫をします。
また、ループ処理の中でSleep関数を使用する場合は、ループごとにDoEventsを実行してExcelの応答性を保つことも有効です。
DoEventsは、Excelに他の処理(ユーザー操作など)を実行する機会を与えます。
API宣言に関するエラーの対処
Sleep関数を使用する際にAPI宣言を間違えると、「Compile error: Declare statement only valid at module level」のようなエラーや、実行時エラーが発生します。
- 対処法: Sleep関数はSubプロシージャの外、モジュールの先頭に記述する必要があります。
また、Microsoft 365や64bit版Officeでは`Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)`と記述します。
Excel 2019以前の32bit版Officeでは`Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)`となります。
使用しているExcelのバージョンとビット数に合わせて、正しい宣言を行ってください。
Wait関数で指定した時刻を過ぎても処理が再開されない場合の対処
まれに、Wait関数で指定した時刻を過ぎても処理が再開されない場合があります。
これは、Excelの処理が非常に重い場合や、他の処理によってWait関数の実行がブロックされている場合に起こり得ます。
- 対処法: Wait関数の前にDoEventsを実行して、Excelの処理キューをクリアすることを試みます。
また、Wait関数の引数に指定する時刻が、現在時刻より過去になっていないか確認してください。
場合によっては、Application.OnTimeメソッドを使用して、より正確な時間指定と処理の再開を試みることも有効です。
まとめ
VBAのWait関数とSleep関数を使えば、Excel VBAの処理を意図した通りに一時停止させることが可能です。
Wait関数はExcelの操作性を保ちながら待機するのに適しており、Sleep関数はプログラムの実行を完全に止める場合に有効です。
それぞれの特性を理解し、Webスクレイピングでの負荷軽減や、処理の確実な中断といった目的に応じて適切に使い分けることで、より洗練された自動化処理を作成できます。
API宣言の有無やExcelのバージョンによる記述の違いに注意し、サンプルコードを参考にしながら、ご自身の業務に合わせた処理を実装してみてください。
