サイトアイコン HIBISEI Blog

Excel VBAが遅い原因はこれ!ScreenUpdating・Calculation・EnableEventsを正しく使って処理速度を劇的に改善

ScreenUpdating・Calculation・EnableEventsの意味と使い方

Excel VBAでマクロを作っていると、

といった経験をしたことはないでしょうか。

実はその原因、多くの場合
「VBAの処理そのもの」ではなく、Excelの標準機能にあります。

このページでは、VBA高速化の基本として必ず押さえておきたい

この3つが何をしているのか、そしてなぜ高速化につながるのかを、できるだけ分かりやすく解説します。


VBAの処理が遅くなる本当の理由

Excelは、ユーザーが操作しやすいように次のような処理を自動で行っています。

VBAで大量のセルを更新すると、Excelは
「1行変更するたびに全部やる」
という動きをします。

これが、マクロが遅くなる最大の原因です。


Application.ScreenUpdating の役割

ScreenUpdating = False がしていること

Application.ScreenUpdating = False

これは、Excelの画面更新を一時的に止める設定です。

通常、セルの値が変わるたびにExcelは、

という処理を行っています。

大量データを処理している最中にこれを毎回行うと、
処理速度が大きく低下します。

ScreenUpdatingをFalseにすると、

という状態になります。


ScreenUpdating = True を忘れるとどうなる?

Application.ScreenUpdating = True

これは、画面更新を元に戻す処理です。

これを忘れると、

といった状態になります。

だから、必ず元に戻すことが重要です。


Application.Calculation の役割

Calculation = xlCalculationManual がしていること

Application.Calculation = xlCalculationManual

これは、数式の自動再計算を止める設定です。

通常のExcelでは、

という動作が行われます。

これを、
「1行ずつ」「何千回も」
繰り返すと、処理が極端に遅くなります。

Manualに設定すると、下記のようになります。

そのため、大量データ処理では必須の設定です。


Calculation = xlCalculationAutomatic の重要性

Application.Calculation = xlCalculationAutomatic

これを戻し忘れると、

というトラブルが発生します。

だから、ユーザー環境を壊さないためにも必須です。


Application.EnableEvents の役割

EnableEvents = False がしていること

Application.EnableEvents = False

これは、イベントマクロを無効化する設定です。

イベントとは、次のようなものです。

例えば、

  1. VBAでセルを書き換える
  2. Worksheet_Change が発動
  3. その中でさらにセルを書き換える

このような処理をすると、

といった問題が起こります。

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点です。

これらを正しく理解して使うことで、

を作ることができます。

VBAで大量データや複雑な処理を行う場合は、
必ずこの高速化設定をセットで使うようにしましょう。

モバイルバージョンを終了