ScreenUpdating・Calculation・EnableEventsの意味と使い方
Excel VBAでマクロを作っていると、
- 処理がなかなか終わらない
- 大量データを扱うと極端に遅くなる
- Excelが固まったように見える
といった経験をしたことはないでしょうか。
実はその原因、多くの場合
「VBAの処理そのもの」ではなく、Excelの標準機能にあります。
このページでは、VBA高速化の基本として必ず押さえておきたい
Application.ScreenUpdatingApplication.CalculationApplication.EnableEvents
この3つが何をしているのか、そしてなぜ高速化につながるのかを、できるだけ分かりやすく解説します。
VBAの処理が遅くなる本当の理由
Excelは、ユーザーが操作しやすいように次のような処理を自動で行っています。
- 画面の再描画
- 数式の再計算
- セル変更時のイベント実行
VBAで大量のセルを更新すると、Excelは
「1行変更するたびに全部やる」
という動きをします。
これが、マクロが遅くなる最大の原因です。
Application.ScreenUpdating の役割
ScreenUpdating = False がしていること
Application.ScreenUpdating = False
これは、Excelの画面更新を一時的に止める設定です。
通常、セルの値が変わるたびにExcelは、
- 表示を更新
- 画面を再描画
という処理を行っています。
大量データを処理している最中にこれを毎回行うと、
処理速度が大きく低下します。
ScreenUpdatingをFalseにすると、
- 画面は更新されない
- 内部処理だけが高速に進む
という状態になります。
ScreenUpdating = True を忘れるとどうなる?
Application.ScreenUpdating = True
これは、画面更新を元に戻す処理です。
これを忘れると、
- マクロは終わっているのに画面が変わらない
- Excelが固まったように見える
といった状態になります。
だから、必ず元に戻すことが重要です。
Application.Calculation の役割
Calculation = xlCalculationManual がしていること
Application.Calculation = xlCalculationManual
これは、数式の自動再計算を止める設定です。
通常のExcelでは、
- セルの値が変わる
→ 関連する数式をすべて再計算
という動作が行われます。
これを、
「1行ずつ」「何千回も」
繰り返すと、処理が極端に遅くなります。
Manualに設定すると、下記のようになります。
- マクロ実行中は再計算しない
- 最後にまとめて再計算できる
そのため、大量データ処理では必須の設定です。
Calculation = xlCalculationAutomatic の重要性
Application.Calculation = xlCalculationAutomatic
これを戻し忘れると、
- 数式が更新されない
- 値が変わらないExcelになる
というトラブルが発生します。
だから、ユーザー環境を壊さないためにも必須です。
Application.EnableEvents の役割
EnableEvents = False がしていること
Application.EnableEvents = False
これは、イベントマクロを無効化する設定です。
イベントとは、次のようなものです。
Worksheet_ChangeSelectionChangeWorkbook_Open
例えば、
- VBAでセルを書き換える
Worksheet_Changeが発動- その中でさらにセルを書き換える
このような処理をすると、
- 無限ループ
- 処理が極端に遅くなる
といった問題が起こります。
EnableEventsをFalseにすると、
マクロ実行中にイベントが発動しなくなります。
EnableEvents = True を戻さないと起きる問題
Application.EnableEvents = True
これを忘れると、
- イベントマクロが一切動かない
- 「昨日まで動いてたのに…」状態
になります。
これは、トラブル率が非常に高いポイントです。
高速化の三種の神器まとめ
| 設定 | 止めているもの | 効果 |
|---|---|---|
| ScreenUpdating | 画面更新 | 体感速度アップ |
| Calculation | 数式再計算 | 処理時間短縮 |
| EnableEvents | イベント | 無限ループ防止 |
実務で使う鉄板テンプレート
Sub Sample()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' メイン処理を書く
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
この形を基本形として覚えておくと、
どんなマクロでも安定して高速化できます。
エラー対策も含めた安全な書き方
実務では、途中でエラーが出ることもあります。
その場合に備えて、必ず復帰処理を書くのがおすすめです。
Sub Sample()
On Error GoTo ExitHandler
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' メイン処理
ExitHandler:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
これができると「実務で信頼されるVBA」により近づきます。
まとめ
Excel VBAの処理が遅いと感じたら、まず見直すべきなのは以下の3点です。
- 画面更新(ScreenUpdating)
- 再計算(Calculation)
- イベント処理(EnableEvents)
これらを正しく理解して使うことで、
- 処理速度が大幅に向上
- 無限ループやトラブルを回避
- 実務で安心して使えるマクロ
を作ることができます。
VBAで大量データや複雑な処理を行う場合は、
必ずこの高速化設定をセットで使うようにしましょう。

