ExcelVBAで複雑な処理を実行しているとき、画面が固まったり、途中でキャンセルボタンを押しても反応しない、という経験はありませんか?こうした問題の多くは、VBAが処理中にユーザーやシステムの操作を受け付けない状態になっていることが原因です。
この記事では、そんな場面で役立つ「DoEvents」という命令について、vba 処理が終わるまで待機 doevents という検索キーワードで情報を探している方に向けて、次の内容をわかりやすく解説していきます。
✅ DoEventsの基本的な役割とは?
✅ DoEventsを使うと「処理を待つ」ことになる理由
✅ 処理が終わるまで待機させたいときの活用法
✅ 実務でのDoEventsの使用例と注意点
✅ DoEventsを使わない別の待機方法
目次
- ✅ DoEventsとは?処理を中断せずに他の操作を受け付ける命令
- ✅ DoEventsは「処理の一時中断+イベント処理の許可」
- ✅ 処理が終わるまで待機させたい=DoEventsで実質的な「待機状態」を作る
- ・セルA1が「完了」になるまで処理を待つ
- ✅ 実務で使えるDoEventsの活用例
- ・処理中にキャンセルボタンを反応させる
- ・フォームのロード中にExcelのフリーズを回避する
- ・処理の合間に進捗バーを更新
- ■ DoEvents使用時の注意点
- ・ 無限ループにならないように条件を明確にする
- ・ DoEventsを多用すると処理速度が落ちる
- ・ セキュリティ上の懸念
- ✅ DoEventsを使わない待機方法もある
- ・ Application.Waitを使う
- ・ Sleep関数(API)の使用
- ■ まとめ|DoEventsでスムーズかつ安全な処理待機を実現
- ・ 本記事の要点まとめ
✅ DoEventsとは?処理を中断せずに他の操作を受け付ける命令
DoEvents は、VBAの処理中に一時的に制御をOS側(Windows)に戻して、他のイベント処理を許可する命令です。
DoEvents
この1行を処理の途中に入れるだけで、次のような効果が得られます。
- フォームのボタンや×ボタンなどが反応するようになる
- 他の処理(ウィンドウの再描画やマウス操作など)も実行可能になる
- 処理の合間にキャンセルや強制終了ができるようになる
✅ DoEventsは「処理の一時中断+イベント処理の許可」
実際に DoEvents を使うと、処理そのものが停止するわけではありません。処理の途中で「割り込みを許す」ことによって、外部イベントを処理できるようにするのです。
Sub LoopWithDoEvents()
Dim i As Long
For i = 1 To 100000
Cells(i, 1).Value = i
DoEvents ' イベント処理のタイミングを与える
Next i
End Sub
このように使うと、ループ中でもExcelがフリーズせず、ウィンドウの操作やキャンセルが可能になります。
【VBA】With ステートメントの入れ子(ネスト)の方法と活用例
✅ 処理が終わるまで待機させたい=DoEventsで実質的な「待機状態」を作る
たとえば、「別プロセスが終わるのを待ちたい」「ユーザーの操作完了まで待ちたい」といった場面で、VBAには「待て」という命令が基本的にありません。
そこで DoEvents をループの中に使い、待機ループを自作することがよくあります。
・セルA1が「完了」になるまで処理を待つ
Sub WaitUntilDone()
Do
DoEvents
Loop Until Range("A1").Value = "完了"
MsgBox "A1セルが完了になりました。次の処理に進みます。"
End Sub
このように、DoEventsを組み込んだ無限ループを使うことで、処理が終わるまで「待機」する状態を実現できます。
✅ 実務で使えるDoEventsの活用例
・処理中にキャンセルボタンを反応させる
Dim cancelFlag As Boolean
Sub StartProcess()
cancelFlag = False
Dim i As Long
For i = 1 To 100000
If cancelFlag Then Exit For
Cells(i, 1).Value = i
DoEvents
Next i
End Sub
Sub CancelProcess()
cancelFlag = True
End Sub
この構成により、CancelProcess をボタンに割り当てることで途中キャンセル可能な処理になります。
・フォームのロード中にExcelのフリーズを回避する
UserForm1.Show vbModeless
DoEvents
フォームをモデルレスで表示する際に DoEvents を入れると、フォーム表示中でも他の処理がスムーズに動作します。
・処理の合間に進捗バーを更新
Sub ProgressBarExample()
Dim i As Long
For i = 1 To 100
UserForm1.Label1.Width = i * 2
DoEvents
Next i
End Sub
DoEvents を入れることで、ユーザーフォーム上のプログレスバーがリアルタイムに反映されます。
■ DoEvents使用時の注意点
・ 無限ループにならないように条件を明確にする
Do
DoEvents
Loop ' → 無限に実行されてExcelが固まる危険あり
→ 終了条件を必ず指定すること!
【VBA】For-Nextループが上手く動作しない原因と対応策
・ DoEventsを多用すると処理速度が落ちる
DoEvents を1回実行するごとに、VBAはシステム全体に制御を渡して各種イベントを処理します。そのため、大量のDoEventsをループに入れるとパフォーマンスが落ちる原因になります。
対策:
- 必要最小限にとどめる
- 一定回数ごとにDoEventsを実行する
If i Mod 100 = 0 Then DoEvents
・ セキュリティ上の懸念
DoEvents を悪意あるコードに使うと、他のウィンドウ操作を受け入れることにもつながります。信頼できるコードだけで使用するように注意が必要です。
✅ DoEventsを使わない待機方法もある
処理の種類によっては、DoEvents を使わずに待機状態を作る方法もあります。
・ Application.Waitを使う
Application.Wait Now + TimeValue("00:00:05")
5秒間だけ待機する処理。シンプルですが、その間は完全に処理が止まります(イベントは受け付けない)。
【VBA】処理が終わるまで待機させる【Sleep関数・Application.Waitメソッド】
・ Sleep関数(API)の使用
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub PauseFor3Seconds()
Sleep 3000 ' 3秒間待機(ミリ秒指定)
End Sub
こちらも「イベント処理なしで完全停止」するので、ユーザー操作や再描画は受け付けません。
■ まとめ|DoEventsでスムーズかつ安全な処理待機を実現
「VBA処理が終わるまで待機させたい」「ユーザーの操作完了まで止めておきたい」
そんなときに DoEvents を適切に使うことで、画面フリーズや操作不能といったストレスを軽減できます。
・ 本記事の要点まとめ
DoEventsは処理中に一時的に制御を外部に渡し、ユーザー操作や再描画を許可する命令- 無限ループと組み合わせることで「処理待ち」のような制御が可能
- フォーム表示、途中キャンセル、プログレスバーなどに活用できる
- 過剰な使用はパフォーマンス低下の原因になるため、頻度は調整する
- 単純に時間待ちする場合は
Application.WaitやSleepも選択肢