【VBA】処理を高速化させる「あるある」な方法

VBAで
 ・処理を高速化させる「あるある」な方法
を紹介します! 

ざっくりいうと
 ・各種処理を無効化
することで、高速化させます!
※処理を無効化(=停止)させた分だけ高速化します。

また
 ・繰り返し処理の中で
 ・セルへのアクセスは避けるべき
旨を説明します!

PR

処理を高速化させる「あるある」な方法

以下の4つの処理を
 ・「無効化」または「動化」にすることで
 ・処理が高速化
します。
※どれも多くのサイトで紹介されている「あるある」な方法です。
無効化や手動化(=停止)させた分だけ高速化します

処理を高速化させる「あるある」な方法
  • 画面更新を無効

  • イベントを無効

  • メッセージ表示を無効

  • 計算を動化

上記の「計算の動化」の「計算」とは、「Excel関数による計算」のことです。

「計算を動化」とは、「Excel関数による計算を(動で)実行させないようにする」ということです。

「計算の動化/動化」は、[数式]タブの「計算方法の設定」でも変更できます。

 計算の手動化/自動化の設定
計算の手動化/自動化の設定


行いたい処理が完了したら、上記の処理を元に戻します。
※「有効化」または「動化」に戻します。

具体的なVBAコードは以下となります。

Sub sample()
    
    '画面更新を無効化
    Application.ScreenUpdating = False
    'イベントを無効化
    Application.EnableEvents = False
    'メッセージ表示を無効化
    Application.DisplayAlerts = False
    '計算を手動化
    Application.Calculation = xlCalculationManual

    
    '行いたい処理を記載する
    '・
    '・
    '・
    

    '画面更新を有効化
    Application.ScreenUpdating = True
    'イベントを有効化
    Application.EnableEvents = True
    'メッセージ表示を有効化
    Application.DisplayAlerts = True
    '計算を自動化
    Application.Calculation = xlCalculationAutomatic

End Sub

「Applicationオブジェクト」の「ScreenUpdating」プロパティで、「画面更新を無効化/有効化」を設定します(4、20行目)。
※「False」で無効化、「True」で有効化になります。
※無効化中は、例えばVBAでセルの内容を書き換えても見た目(=画面)変わりません。
※デバッグ等で「VBA実行中に書き換わったセルの内容を確認しながら実行したい時」は、無効化しないでください。

「Applicationオブジェクト」の「EnableEvents」プロパティで、「イベントを無効化/有効化」を設定します(6、22行目)。
※「False」で無効化、「True」で有効化になります。
※無効化中は、例えばエクセルを開いた際に発生するOpenイベント等は実行されません。
※デバッグ等で「各種イベント等が発生することを確認したい時」は、無効化しないでください。

「Applicationオブジェクト」の「DisplayAlerts」プロパティで、「メッセージ表示を無効化/有効化」を設定します(8、24行目)。
※「False」で無効化、「True」で有効化になります。

「Applicationオブジェクト」の「Calculation」プロパティで、「計算を手動化/自動化」を設定します(10、26行目)。
※「xlCalculationManual」で手動化、「xlCalculationAutomatic」で自動化になります。
※無効化中は、Excel関数による計算は実行されません。
※デバッグ等で「VBA実行中にExcel関数の計算結果を確認したい時」は、無効化しないでください。

PR

参考①

処理時間を計測することで、処理が高速化したかどうかを確認できます。

処理時間の計測については、以下の記事をご確認ください。

PR

参考②

上記のVBAコードで使用した以下の詳細は、公式サイトをご確認ください。

●「Applicationオブジェクト」の「ScreenUpdating」プロパティ


●「Applicationオブジェクト」の「EnableEvents」プロパティ


●「Applicationオブジェクト」の「DisplayAlerts」プロパティ


●「Applicationオブジェクト」の「Calculation」プロパティ


「Applicationオブジェクト」の「Calculation」プロパティに設定する値
※「Excel関数による計算」を動化」または「動化」するために設定する値。

PR

備考(セルへのアクセスについて)

セルへのアクセス(RangeやCellsを使用した処理)は、コストが高いとされています。

ただコストが高くとも、数十回アクセスする程度ならば特に問題ありません。

ですが
 ・繰り返し処理の中で数百回アクセスしたりすると
 ・VBAの処理が重く(=遅く)なりがち
です。

よって
 ・繰り返し処理の中でセルへのアクセスを何度も行うのは避けるべき
 ・セルへのアクセスは一括(1度で)行うべき
です。



例えば
 ・シート上の表をCSVファイルへ出力したい時は
 ・繰り返し処理で1行ずつ出力するのではなく
 ・一括で出力する方が良い
です。

シート上の表をCSVファイルへ一括で出力する方法は、以下の記事をご確認ください。




また例えば
 ・CSVファイルの内容をシート上に読み込みたい場合も
 ・繰り返し処理で1行ずつ読み込み/セルに設定するのではなく
 ・一括で読み込み/セルに設定した方が良い
です。

CSVファイルをシート上へ一括で読み込む方法は、以下の記事をご確認ください。





また例えば
 ・指定した範囲のデータを取得したい場合も
 ・繰り返し処理で1セルずつ取得するのではなく
 ・一括で取得した方が良い
です。

指定した範囲のデータを一括で取得する方法は、以下の記事をご確認ください。







また例えば
 ・配列をセルへ張り付けたい場合も
 ・繰り返し処理で1セルずつ貼り付けるのではなく
 ・一括で張り付ける方が良い
です。

配列を一括で貼り付ける方法は、以下の記事をご確認ください。