Excel VBAで業務マクロを作成していると、
「前の処理が終わる前に次の処理が動いてしまう」
「ファイルを開いた直後に操作してエラーになる」
「Web連携・RPA連携で処理速度が追いつかない」
といった問題に必ず直面します。
これらの原因の多くは、
VBAが“速すぎる”こと にあります。
VBAは基本的に上から下へ一気に処理を進めるため、
- 画面描画
- ファイルオープン
- 外部アプリ連携
- 再計算
などの 完了を待たずに次へ進んでしまう ことがよくあります。
そこで重要になるのが、
処理が終わるまで待機させる仕組み です。
この記事では、Excel VBAにおける代表的な待機方法である
- Sleep関数
- Application.Waitメソッド
を中心に、
- それぞれの仕組みと違い
- 実務での正しい使い分け
- 待機処理でやりがちな失敗
- RPA(UiPath)連携を意識した設計
まで、実務でそのまま使えるコード例付きで徹底解説します。
目次
- ✅ VBAで「待機処理」が必要になる理由
- ・VBAは処理完了を保証してくれない
- ・待機しないことで起きる典型的なトラブル
- ✅ VBAで使える代表的な待機方法
- ✅ Sleep関数とは何か
- ・Sleep関数の基本的な役割
- ・Sleep関数を使うための宣言
- ・Sleep関数の基本的な使い方
- ✅ Sleep関数の特徴と注意点
- ・処理が完全に止まる
- ・ミリ秒単位で待機できる
- ✅ Application.Waitメソッドとは何か
- ・Application.Waitの基本動作
- ・WaitはExcel標準機能
- ✅ Application.Waitの特徴と注意点
- ・秒単位での待機になる
- ・指定時刻の考え方に注意
- ✅ Sleep関数とApplication.Waitの違い
- ✅ 実務での正しい使い分け
- ・Sleepが向いているケース
- ・Application.Waitが向いているケース
- ✅ 待機処理を安全に書く基本パターン
- ・短時間+確認の組み合わせ
- ✅ DoEventsと組み合わせる考え方
- ✅ RPA(UiPath)連携を意識した待機設計
- ✅ よくある失敗パターン
- ・長時間Sleepで固まる
- ・Waitの指定時刻ミス
- ・待機理由が分からない
- ✅ まとめ:VBAの待機処理を正しく使い分けよう
✅ 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が向いているケース
- Web操作の待機
- 外部アプリ起動直後
- RPA連携で短時間調整
参考:【VBA】処理が終わるまで待機する方法|Sleep関数の使い方と実務例
・Application.Waitが向いているケース
- ファイルオープン後の待機
- 再計算完了待ち
- 画面描画の安定化
参考:【VBA】処理が終わってから次の処理を実行する方法|DoEvents・待機・同期制御の基本と実例
✅ 待機処理を安全に書く基本パターン
※待たせっぱなしにしない設計が重要です。
・短時間+確認の組み合わせ
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 を作ります。