VBA で特定の時間待機する方法として、一般的によく使われるのが「Sleep」、「Application.Wait」、「DoEvents」です。 この記事では、それぞれの使い方、特徴、メリットとデメリットについて詳しく解説します。
各方法の比較
まず最初に、この記事で紹介する 3 つの方法を比較した表を示します。
| 方法名 | 単位 | 精度 | メリット | デメリット |
|---|---|---|---|---|
| Sleep | ミリ秒 | 高い | 高精度、シンプルなコード | API 宣言が必要、他の処理をブロック |
| Application.Wait | 秒 | 普通 | 簡単に使用可能、Excel 標準 | 精度が低い、他の処理をブロック |
| DoEvents | ループ次第 | ループ次第 | 待機中も画面操作・再描画を処理できる | 待機関数ではないため、ループ設計が必要 |
それぞれの方法には、精度や使いやすさ、他の処理との並行性などに違いがあります。以下では、それぞれの方法について詳しく解説します。
Sleep を使った待機方法
使い方
Sleep 関数は、Win32 API を利用してミリ秒単位で待機する方法です。以下のコードは、VBA で Sleep を利用する例です。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Sub WaitWithSleep()
Sleep 3000 ' 3000ミリ秒(3秒)待機
End Sub
Declare ステートメントは、プロシージャの中ではなく標準モジュールの先頭など、モジュールレベルに記述します。
特徴
- 単位:ミリ秒
- 精度:高い(実際の待機時間は OS のタイマー精度に依存)
- 必要な宣言:Win32 API「kernel32.dll」を利用
メリット
- 精度が高い:ミリ秒単位での待機が可能。
- シンプルなコード:短いコードで待機を実現。
デメリット
- API の宣言が必要:VBA 標準の機能ではなく、外部の Windows API を利用する必要がある。
- 他の処理をブロック:待機中は VBA の処理だけでなく Excel の画面操作も止まり、応答なしに見えることがある。
- Windows 専用:Mac の Excel では
kernel32が使えません。
Sleep関数のより詳細な使い方や具体例については、以下の記事を参照してください。
VBAでWindows APIのSleepを使い、ミリ秒単位で処理を一時停止する方法を解説します。64bit Officeで必要なPtrSafe宣言、モジュールレベルでの宣言位置、実務での注意点も紹介します。
Application.Wait を使った待機方法
使い方
Application.Wait は、Excel の VBA で定義されているメソッドで、指定した時刻まで待機します。以下のコードは、Application.Wait を利用する例です。
Sub WaitWithApplicationWait()
Application.Wait (Now + TimeValue("00:00:05")) ' 5秒待機
End Sub
特徴
- 単位:秒(実質 1 秒未満の指定は不向き)
- 精度:普通
- Excel 限定:Excel VBA でのみ使用可能
メリット
- 簡単に使用可能:API 宣言が不要で、Excel VBA で簡単に利用できる。
- Excel 標準の機能:追加ライブラリや API を使わないため、汎用性が高い。
デメリット
- 精度が低い:秒単位での待機しかできない。
- 他の処理をブロック:待機中に他の VBA 処理が完全に停止する。
Application.Wait関数のより詳細な使い方や具体例については、以下の記事を参照してください。
VBA の`Application.Wait`メソッドは、指定した時刻までコードの実行を一時停止するために使用されます。このメソッドを使うことで、一定の時間を待つ処理をスクリプト内に組み込むことが可能です。
DoEvents を使った待機方法
使い方
DoEvents は、VBA のループ内で使用され、他のイベントを処理しながら待機する方法です。以下のコードは、DoEvents を利用する例です。
Sub WaitWithDoEvents()
Dim endTime As Double
endTime = Timer + 5 ' 5秒後の時刻を設定
Do While Timer < endTime
DoEvents ' 他のイベントを処理
Loop
End Sub
特徴
- 単位:
Timer関数の値(秒)で判定 - 精度:ループ次第
- 他の処理:待機中も画面の再描画やユーザー操作などのイベントを処理
メリット
- 画面が固まらない:待機中も再描画やユーザー操作を処理できる。VBA は単一スレッドのため、別の VBA 処理が並行して動くわけではありません。
- 条件に応じて細かく制御できる:
Timer関数などと組み合わせることで、待機条件を柔軟に設定できる。
デメリット
- 複雑なコード:他の方法と比較してコードがやや複雑。
- CPU 使用率が高い:ループ内での処理のため、CPU 使用率が高くなる可能性がある。
- 日付をまたぐと不具合:
Timerは午前 0 時に 0 に戻るため、深夜をまたぐ待機ではループが終わらない場合がある。 - 想定外の再入:待機中にボタンを再度押されるなど、同じマクロが再実行される恐れがある。
DoEvents関数のより詳細な使い方や具体例については、以下の記事を参照してください。
VBA の`DoEvents`関数の構文と使い方、マクロ実行中に Excel が「応答なし」になるのを防ぐ方法、処理を遅くしないための注意点を解説します。指定時間待機するサンプルも紹介します。
まとめ
VBA で指定した時間待機する方法として、「Sleep」、「Application.Wait」、「DoEvents」の 3 つの方法を紹介しました。 それぞれに特徴やメリット、デメリットがあるため、用途や状況に応じて適切な方法を選択することが重要です。高精度な待機が必要なら「Sleep」、Excel 標準の機能を使いたいなら「Application.Wait」、待機中も画面を応答させたいなら「DoEvents」を使ったループを選ぶと良いでしょう。