VBAテクニック集 VBA一覧 処理制御・待機・停止 文法・構文

【VBA】処理が終わるまで待機する方法|Sleep関数の使い方と実務例

ExcelVBAでマクロを実行していると、次の処理を始める前に一定時間待ちたい場面があります。
例えば、外部ファイルを開いた直後に読み込みが終わるまで待機したり、Web操作の完了を待つ場合です。

そんなときに活躍するのが Sleep 関数 です。

この記事では、「vba 処理が終わるまで待機 Sleep」 というテーマで、以下を詳しく解説します。


Sleep 関数の基本構文と使い方
✅ ExcelVBAでSleepを使うための宣言方法
✅ 処理を待機させる実例(ファイル操作・Web操作など)
SleepDoEvents の違い
✅ 実務での注意点と代替手段


✅ Sleep関数とは?

SleepWindows 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の違い

項目SleepDoEvents
動作完全に処理を停止他の処理(画面更新・ユーザー操作)を許可
操作受付不可
主な用途外部処理の待機、確実な停止ユーザー操作や画面描画を許可しながら待機

📌 補足

  • Sleep は本当に「止める」ので、その間はExcelが応答しません。
  • DoEvents は待機ではなく「一時的に他の処理を実行させる」ものです。

■ Sleepを使うときの注意点

  1. 完全停止するためUIが固まる
    • 長時間のSleepはユーザーにフリーズと誤解される可能性があります。
  2. 待機時間は環境によって適切に設定
    • ネットワーク速度やPC性能で必要な待機時間が変わります。
  3. ループ内での多用は避ける
    • 処理全体の速度が大幅に低下します。

■ 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.WaitDoEvents を使う方が望ましい。

    -VBAテクニック集, VBA一覧, 処理制御・待機・停止, 文法・構文