VBAテクニック集 VBA一覧 エラーハンドリング・処理制御 デバッグ・エラー処理

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

Excel VBAで業務マクロを作成していると、
前の処理が終わる前に次の処理が動いてしまう
ファイルを開いた直後に操作してエラーになる
Web連携・RPA連携で処理速度が追いつかない
といった問題に必ず直面します。

これらの原因の多くは、
VBAが“速すぎる”こと にあります。

VBAは基本的に上から下へ一気に処理を進めるため、

  • 画面描画
  • ファイルオープン
  • 外部アプリ連携
  • 再計算

などの 完了を待たずに次へ進んでしまう ことがよくあります。

そこで重要になるのが、
処理が終わるまで待機させる仕組み です。

この記事では、Excel VBAにおける代表的な待機方法である

  • Sleep関数
  • Application.Waitメソッド

を中心に、

  • それぞれの仕組みと違い
  • 実務での正しい使い分け
  • 待機処理でやりがちな失敗
  • RPA(UiPath)連携を意識した設計

まで、実務でそのまま使えるコード例付きで徹底解説します。

✅ VBAで「待機処理」が必要になる理由

※ここを理解していないと、待機コードを入れても不安定になります。

・VBAは処理完了を保証してくれない

VBAは、

  • ファイルを開く
  • シートを切り替える
  • 再計算を走らせる

といった命令を出しても、
「完全に終わったかどうか」までは保証しません

そのため、次のようなコードは一見正しく見えても、
実行時エラーを引き起こすことがあります。

Workbooks.Open path
Worksheets("Data").Range("A1").Value = 1

「開いた直後」に操作しているため、
環境によっては まだ開ききっていない 状態なのです。


・待機しないことで起きる典型的なトラブル

実務でよくあるのが、次のような症状です。

  • 処理が途中で止まる
  • たまに成功し、たまに失敗する
  • RPAから呼ぶと失敗率が上がる
  • 人の操作と競合してエラーになる

これらはほぼすべて、
待機不足が原因 です。


✅ VBAで使える代表的な待機方法

※まず全体像を押さえておくことが重要です。

Excel VBAで使われる待機方法は、主に以下です。

  • Sleep関数(Windows API)
  • Application.Wait
  • DoEvents(補助的)

この記事では、
Sleep関数とApplication.Wait を中心に解説します。


✅ Sleep関数とは何か

※時間単位で厳密に待ちたい場合に重要です。

・Sleep関数の基本的な役割

Sleep関数は、
指定した時間(ミリ秒)だけ処理を完全に停止 させる関数です。

VBA標準の機能ではなく、
Windows API を利用します。


・Sleep関数を使うための宣言

Sleep関数を使うには、
事前に宣言が必要です。

#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

この宣言を標準モジュールに記述します。


・Sleep関数の基本的な使い方

Sleep 1000   ' 1秒待機

このコードを実行すると、
VBAは完全に停止 し、1秒後に次の行へ進みます。


✅ Sleep関数の特徴と注意点

※便利な反面、使い方を誤ると問題になります。

・処理が完全に止まる

Sleep中は、

  • 画面更新
  • ユーザー操作
  • 再描画

すべてが停止します。

そのため、

  • 長時間のSleep
  • ループ内での多用

は、
「Excelが固まった」ように見える 原因になります。


・ミリ秒単位で待機できる

Sleepの最大の強みは、
ミリ秒単位で正確に待てることです。

Sleep 300   ' 0.3秒

Web操作や外部アプリ連携など、
細かい待機制御が必要な場面で有効です。


✅ Application.Waitメソッドとは何か

※Excel標準で安全に使える待機方法です。

・Application.Waitの基本動作

Application.Waitは、
指定した時刻まで処理を停止 させるメソッドです。

Application.Wait Now + TimeValue("00:00:01")

この場合、
現在時刻から1秒後まで待機します。


・WaitはExcel標準機能

Sleepと違い、

  • 宣言不要
  • 環境差異が少ない

というメリットがあります。

初心者にも比較的安全に使える待機方法です。


✅ Application.Waitの特徴と注意点

※Sleepとの違いを意識することが重要です。

・秒単位での待機になる

Application.Waitは、
最小単位が「秒」です。

ミリ秒単位の厳密な制御には向きません。


・指定時刻の考え方に注意

Application.Waitは、
「〇秒待つ」ではなく
「〇時〇分〇秒まで待つ」 という考え方です。

Application.Wait Now + TimeSerial(0, 0, 5)

この場合、
5秒後の時刻まで待機します。


✅ Sleep関数とApplication.Waitの違い

※ここを理解できているかが実務レベルの分かれ目です。

項目Sleep関数Application.Wait
単位ミリ秒
宣言必要不要
停止の強さ完全停止比較的穏やか
精度高い低め
初心者向け

✅ 実務での正しい使い分け

※「どちらか一択」ではありません。

・Sleepが向いているケース

・Application.Waitが向いているケース


✅ 待機処理を安全に書く基本パターン

※待たせっぱなしにしない設計が重要です。

・短時間+確認の組み合わせ

Dim i As Long

For i = 1 To 10
    DoEvents
    Sleep 300
    If Workbooks.Count > 0 Then Exit For
Next i

「待つ+確認」 を組み合わせることで、
無駄な待機を減らせます。


✅ DoEventsと組み合わせる考え方

※完全停止を避けたい場合に有効です。

Sleep 200
DoEvents

DoEventsを入れることで、

  • 画面更新
  • ユーザー操作

を一時的に受け付けられます。


✅ RPA(UiPath)連携を意識した待機設計

※業務自動化では非常に重要です。

RPAからExcelマクロを呼ぶ場合、

  • VBAが速すぎる
  • UI操作が追いつかない

という問題が起きやすくなります。

そのため、

  • VBA側で適切に待機
  • RPA側の安定性を上げる

という設計が求められます。

Sleepの微調整 は、
RPA連携では特に効果的です。


✅ よくある失敗パターン

※このあたりは実務で本当によく見ます。

・長時間Sleepで固まる

→ ユーザーは「フリーズ」と判断します。

参考:【VBA】変数の宣言はなぜ必要?書かないと何が起こるのかを徹底解説

・Waitの指定時刻ミス

→ 思ったより長く待つ。

・待機理由が分からない

→ 後から誰も直せません。


 

✅ まとめ:VBAの待機処理を正しく使い分けよう

  • VBAは処理が速すぎることがある
  • 待機は「安定性のための設計」
  • Sleepは高精度、Waitは安全
  • 使い分けができると実務で強い
  • RPA連携では待機が品質を左右する

「待つ」ことは、サボりではなく 制御 です。

処理を止める勇気が、安定したVBA を作ります。

    -VBAテクニック集, VBA一覧, エラーハンドリング・処理制御, デバッグ・エラー処理