【Excel VBA】処理を高速化する方法|ScreenUpdating・Calculation・EnableEventsの使い方

みなさんこんにちは。

Excel VBAで大量のデータを処理していると、「処理が遅い」「画面がちらつく」「なかなか終わらない」と感じることがあるかと思います。

特に、セルを大量に更新したり、数式が多いシートを操作したり、Worksheet_Changeなどのイベント処理が動作している場合は、同じコードでも実行時間が長くなることがあります。

このような場合は、Excel側の画面更新・自動計算・イベント処理を一時的に停止することで、処理を高速化できる場合があります。

今回は、ScreenUpdating・Calculation・EnableEventsを使用してVBAの処理を高速化する方法について、それぞれの役割から、安全に元の状態へ戻す方法まで順番にご紹介したいと思います。


この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • Excel VBAの処理が遅くて困っている人
  • 大量データをVBAで処理している人
  • マクロ実行中の画面のちらつきを抑えたい人
  • 数式が多いブックをVBAで操作している人
  • 高速化したあとに設定を安全に元へ戻す方法を知りたい人

といったところでしょうか。

VBAの処理が遅くなる主な原因

VBAの処理が遅くなる原因はコードによってさまざまですが、Excel側の動作としては主に以下のようなものがあります。

  • セルを変更するたびに画面が再描画される
  • セルを変更するたびに数式が再計算される
  • セルの変更によってWorksheet_Changeなどのイベントが実行される

これらをマクロ実行中だけ一時的に停止することで、処理時間を短縮できる場合があります。

ScreenUpdating=Falseで画面更新を停止する

まずは、画面の更新を停止する方法です。

Excelでは、VBAでセルを選択したり値を書き換えたりすると、そのたびに画面が更新されます。大量のセルを操作する場合は、この画面更新自体が処理時間へ影響することがあります。

Application.ScreenUpdating = False

'ここに処理を記述する

Application.ScreenUpdating = True

False を指定すると画面更新が停止し、処理中の画面のちらつきも抑えることができます。

Microsoft Learnでも、画面更新を停止することでマクロの実行速度を向上できると説明されています。処理が終了したら、必ず True に戻すようにしてください。

CalculationをManualにして自動計算を停止する

数式が多いブックでは、VBAでセルの値を変更するたびに再計算が発生し、処理速度へ大きく影響する場合があります。

Application.Calculation = xlCalculationManual

'ここに処理を記述する

Application.Calculation = xlCalculationAutomatic

xlCalculationManual を指定すると、自動計算を手動計算へ切り替えることができます。

大量のデータを更新したあとにまとめて再計算する方が、セルを変更するたびに再計算するより効率的な場合があります。ただし、CalculationはExcel全体の計算モードに影響するため、処理終了後に元の設定へ戻すことが重要です。

EnableEvents=Falseでイベント処理を停止する

Worksheet_ChangeやWorkbook_BeforeSaveなどのイベント処理を使用している場合は、VBAからセルやブックを操作したことでイベントが実行されることがあります。

Application.EnableEvents = False

'ここに処理を記述する

Application.EnableEvents = True

Microsoft Learnでも、EnableEventsはExcelのイベントを有効・無効にするためのBooleanプロパティとして提供されています。

3つの設定をまとめて使用する

Sub 高速化する()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    '高速化したい処理をここに記述する

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True

End Sub

この形でも動作しますが、実務ではもう少し安全に書いておくことをおすすめします。

元の設定を保存してから変更する

例えば、マクロ実行前から計算方法が手動になっている利用者もいるかもしれません。その状態で最後に必ず xlCalculationAutomatic へ戻してしまうと、マクロ実行前とは異なる設定になってしまいます。

そのため、現在の設定を変数へ保存しておき、最後に元の値へ戻す方法が安全です。

Sub 高速化する_安全版()

    Dim oldScreenUpdating As Boolean
    Dim oldCalculation As XlCalculation
    Dim oldEnableEvents As Boolean

    oldScreenUpdating = Application.ScreenUpdating
    oldCalculation = Application.Calculation
    oldEnableEvents = Application.EnableEvents

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    '処理をここに記述する

    Application.ScreenUpdating = oldScreenUpdating
    Application.Calculation = oldCalculation
    Application.EnableEvents = oldEnableEvents

End Sub

エラーが発生しても設定を元へ戻す

高速化処理で特に注意したいのが、マクロの途中でエラーが発生した場合です。例えばEnableEvents=Falseのまま処理が停止してしまうと、その後もイベントが動作しない状態が続く可能性があります。

On Error GoToの使い方については、以下の記事でも詳しくご紹介しています。

https://epsilon-delta-blog.com/vba-on-error-goto
Sub 高速化する_エラー対応版()

    Dim oldScreenUpdating As Boolean
    Dim oldCalculation As XlCalculation
    Dim oldEnableEvents As Boolean

    On Error GoTo ErrHandler

    oldScreenUpdating = Application.ScreenUpdating
    oldCalculation = Application.Calculation
    oldEnableEvents = Application.EnableEvents

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    '高速化したい処理

ExitHandler:

    Application.ScreenUpdating = oldScreenUpdating
    Application.Calculation = oldCalculation
    Application.EnableEvents = oldEnableEvents

    Exit Sub

ErrHandler:

    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号:" & Err.Number & vbCrLf & _
           "エラー内容:" & Err.Description, _
           vbExclamation

    Resume ExitHandler

End Sub

高速化前と高速化後の処理時間を比較する

高速化の効果を確認したい場合は、処理開始前と終了後の時間を計測すると分かりやすいです。

Sub 処理時間を計測する()

    Dim startTime As Double

    startTime = Timer

    '計測したい処理

    MsgBox "処理時間:" & Format(Timer - startTime, "0.00") & "秒"

End Sub
Excel VBAで高速化設定を使用する前の処理時間を計測した画面
Excel VBAでScreenUpdating・Calculation・EnableEventsを停止した後の処理時間を計測した画面

処理内容によって効果は異なりますが、画面更新・再計算・イベントが多く発生する処理ほど差が出やすくなります。

3つの設定の違い

設定停止するもの効果が出やすい処理
ScreenUpdating画面の再描画セル選択・画面切替・大量の表示変更
Calculation自動計算数式が多いブックで大量のセルを変更
EnableEventsExcelイベントWorksheet_Changeなどのイベントを使用

注意点

  • 必ず処理終了時に元の設定へ戻す
  • エラー発生時にも復旧できる処理を用意する
  • CalculationをManualにした場合、必要であれば処理後に再計算する
  • EnableEvents=FalseのままExcelを使用し続けない
  • 高速化設定だけでなく、セルへの1件ずつの読み書きなどコード自体の見直しも行う

これらの設定は便利ですが、すべてのマクロが劇的に速くなるわけではありません。処理内容によっては配列を使用したり、SelectやActivateを減らしたりする方が大きな効果が出る場合もあります。

参考情報

最後に

いかがでしたでしょうか。

今回は、Excel VBAの処理を高速化するために、ScreenUpdating・Calculation・EnableEventsを使用する方法についてご紹介しました。

大量のセルを処理する場合や、数式・イベントが多いブックでは、これらの設定を一時的に停止することで処理時間を短縮できる場合があります。

ただし、高速化することだけではなく、処理終了時やエラー発生時に必ず設定を元へ戻すことも重要です。

処理速度で困った際に、少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA