ExcelVBAでマクロを実行していると、次の処理を始める前に一定時間待ちたい場面があります。
例えば、外部ファイルを開いた直後に読み込みが終わるまで待機したり、Web操作の完了を待つ場合です。
そんなときに活躍するのが Sleep 関数 です。
この記事では、「vba 処理が終わるまで待機 Sleep」 というテーマで、以下を詳しく解説します。
✅ Sleep 関数の基本構文と使い方
✅ ExcelVBAでSleepを使うための宣言方法
✅ 処理を待機させる実例(ファイル操作・Web操作など)
✅ Sleep と DoEvents の違い
✅ 実務での注意点と代替手段
目次
✅ Sleep関数とは?
Sleep は Windows API関数 の一つで、指定したミリ秒(1秒=1000ミリ秒)の間、処理を停止させることができます。
ExcelVBAには標準でこの機能はなく、使用するには宣言が必要です。
参考:【VBA】処理が終わるまで待機させる【Sleep関数・Application.Waitメソッド】
✅ Sleepを使うための宣言
ExcelVBAでSleepを使う場合、以下の宣言をモジュールの先頭に書きます。
#If VBA7 Then
' 64bit版Excel
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
' 32bit版Excel
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
・宣言のポイント
- 64bit版と32bit版で宣言が異なるため、
#If VBA7 Thenを使って分岐します。 dwMillisecondsに待機時間をミリ秒で指定します。
✅ Sleepの基本構文
Sleep ミリ秒
・3秒間処理を停止
Sleep 3000
この場合、マクロは3秒間完全に停止し、ユーザー操作も受け付けません。
参考:【VBA】処理が終わってから次の処理を実行する方法|DoEvents・待機・同期制御の基本と実例
✅ 基本的な使い方例
・メッセージ表示後に3秒待って次の処理へ
Sub WaitExample()
MsgBox "処理開始"
Sleep 3000 ' 3秒待機
MsgBox "次の処理を開始"
End Sub
✅ 実務での活用例
・ 外部ファイルの読み込みを待つ
Sub WaitForFileOpen()
Workbooks.Open "C:\Test.xlsx"
Sleep 2000 ' ファイル読み込み待機
MsgBox "ファイルを開きました"
End Sub
・Webページ読み込みの待機
Sub WaitForWeb()
' Internet Explorer操作例
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "https://www.google.com"
Sleep 3000 ' ページ読み込み待機
MsgBox "ページ読み込み完了"
IE.Quit
End Sub
・ バッチ処理の間隔をあける
Sub BatchProcess()
Dim i As Long
For i = 1 To 5
Debug.Print "処理 " & i & " 開始"
Sleep 1000 ' 1秒間隔で処理
Next i
End Sub
参考:「前の処理が終わってから」次へ進める方法|同期制御・DoEvents・待機の基本を徹底解説
■ SleepとDoEventsの違い
| 項目 | Sleep | DoEvents |
|---|---|---|
| 動作 | 完全に処理を停止 | 他の処理(画面更新・ユーザー操作)を許可 |
| 操作受付 | 不可 | 可 |
| 主な用途 | 外部処理の待機、確実な停止 | ユーザー操作や画面描画を許可しながら待機 |
📌 補足
Sleepは本当に「止める」ので、その間はExcelが応答しません。DoEventsは待機ではなく「一時的に他の処理を実行させる」ものです。
■ Sleepを使うときの注意点
- 完全停止するためUIが固まる
- 長時間のSleepはユーザーにフリーズと誤解される可能性があります。
- 待機時間は環境によって適切に設定
- ネットワーク速度やPC性能で必要な待機時間が変わります。
- ループ内での多用は避ける
- 処理全体の速度が大幅に低下します。
■ Sleepの代替手段
場合によっては、Sleep よりも以下の方法が適しています。
1. Application.Wait
ExcelVBA標準機能で、秒単位の待機が可能です。
Application.Wait Now + TimeValue("0:00:03") ' 3秒待機
- ミリ秒単位ではなく秒単位。
- Sleepよりも簡単に書けるが、精度は低め。
参考:【VBA】Application.ReferenceStyle プロパティの使い方と活用方法
2. Do Untilループ+DoEvents
処理が終わる条件を監視しながら待機。
Do Until 条件式
DoEvents
Loop
例:シートの値が更新されるまで待機
Do Until Range("A1").Value <> ""
DoEvents
Loop
■ 実務でのSleep活用パターンまとめ
| パターン | 推奨待機方法 | 備考 |
|---|---|---|
| 外部ファイル読み込み待ち | Sleep / Wait | 高精度ならSleep |
| Webページ読み込み待ち | Sleep+条件確認 | 読み込み確認を併用 |
| ユーザー入力待ち | DoEvents | 完全停止は避ける |
| 大量データ処理の間隔調整 | Sleep | 負荷軽減に有効 |
■ まとめ
Sleep関数はWindows APIを使って処理をミリ秒単位で停止できる。- 宣言が必要で、32bit/64bitの違いに注意。
- 外部処理やWeb操作など、「確実な待機」が必要な場面で活躍。
- 長時間のSleepはUIが固まるため、適切な時間設定が重要。
- 場合によっては
Application.WaitやDoEventsを使う方が望ましい。