ExcelVBAでマクロを書いていると、次のような場面に出くわすことがあります。
- 処理の途中で「少し待ちたい」
- 画面を更新させながら処理を続けたい
- 「固まったように見える」状態を回避したい
そんなときに登場するのが Application.Wait と DoEvents です。
ただしこの2つ、名前はよく聞くものの
役割がまったく違うため、使い分けを間違えると逆に不具合の原因になります。
この記事では、初心者向けに 「何が違うのか」「どんな場面で使うべきか」を実例つきで解説します。
結論:Wait と DoEvents は目的がまったく違う
| 命令 | 目的 | 特徴 |
|---|---|---|
| Application.Wait | 処理を止める | 指定時間、完全に停止 |
| DoEvents | Excelに処理を返す | 画面更新・操作を受け付ける |
「待つ」= Wait、 「固まらないようにする」= DoEvents と覚えると分かりやすいです。
Application.Waitとは?(完全に止まる)
Application.Wait は、指定した時刻まで処理を完全に停止します。
Application.Wait Now + TimeValue("00:00:03")
この例では、3秒間マクロが止まります。
この間、次の行の処理は一切実行されません。
よくある使いどころ
- 外部処理の完了待ち
- 連続処理の間に間隔を空けたいとき
- 人が画面を確認する時間を作りたいとき
注意点
- Wait中は操作できない
- 画面も更新されにくい
- 長時間使うと「フリーズした」と誤解されやすい
DoEventsとは?(Excelを固まらせない)
DoEvents は、処理を止める命令ではありません。
一時的にExcelへ処理を返す命令です。
DoEvents
これを入れると、
- 画面更新が反映される
- Excelが「応答なし」になりにくい
- キャンセル操作を受け付けやすくなる
よくある使いどころ
- 大量ループ処理
- 進捗表示(セルやステータスバー)
- 「固まっていない感」を出したいとき
実例①:Waitを使った単純な待機処理
Sub Sample_Wait()
MsgBox "3秒待ちます"
Application.Wait Now + TimeValue("00:00:03")
MsgBox "再開しました"
End Sub
確実に「止めたい」場合は、Waitが一番シンプルです。
実例②:DoEventsを使って固まらないループ
Sub Sample_DoEvents()
Dim i As Long
For i = 1 To 100000
Cells(1, 1).Value = i
DoEvents
Next i
End Sub
DoEventsを入れないと、処理中にExcelが固まったように見えます。
入れることで、画面が更新され続けます。
WaitとDoEventsを組み合わせるパターン(実務向け)
「少し待ちつつ、固まらせたくない」場合は次の書き方が便利です。
Sub Sample_WaitWithDoEvents()
Dim endTime As Double
endTime = Timer + 3 ' 3秒待つ
Do While Timer < endTime
DoEvents
Loop
MsgBox "完了"
End Sub
この方法なら、待機中も操作・画面更新が可能です。
よくある勘違い
❌ DoEventsは待機命令ではない
DoEventsを1回書いても「待ち時間」は発生しません。
あくまで「Excelに処理を返す」だけです。
❌ Waitは画面更新用ではない
Wait中にDoEventsが無いと、画面はほぼ止まります。
おすすめの使い分けルール
- 確実に止めたい → Application.Wait
- 固まらせたくない → DoEvents
- 両方必要 → Timer + DoEvents
まとめ:目的を間違えなければトラブルは防げる
- Waitは「停止」
- DoEventsは「解放」
- 混同するとフリーズや暴走の原因になる
処理速度・安定性・操作性を両立させるためにも、 この2つの役割の違いはぜひ押さえておきましょう。

コメント