VBAで
・処理を高速化させる「あるある」な方法
を紹介します!
ざっくりいうと
・各種処理を無効化
することで、高速化させます!
※処理を無効化(=停止)させた分だけ高速化します。
また
・繰り返し処理の中で
・セルへのアクセスは避けるべき
旨を説明します!
処理を高速化させる「あるある」な方法
以下の4つの処理を
・「無効化」または「手動化」にすることで
・処理が高速化
します。
※どれも多くのサイトで紹介されている「あるある」な方法です。
※無効化や手動化(=停止)させた分だけ高速化します。
行いたい処理が完了したら、上記の処理を元に戻します。
※「有効化」または「自動化」に戻します。
具体的な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
参考①
処理時間を計測することで、処理が高速化したかどうかを確認できます。
処理時間の計測については、以下の記事をご確認ください。
参考②
上記のVBAコードで使用した以下の詳細は、公式サイトをご確認ください。
●「Applicationオブジェクト」の「ScreenUpdating」プロパティ
●「Applicationオブジェクト」の「EnableEvents」プロパティ
●「Applicationオブジェクト」の「DisplayAlerts」プロパティ
●「Applicationオブジェクト」の「Calculation」プロパティ
●「Applicationオブジェクト」の「Calculation」プロパティに設定する値
※「Excel関数による計算」を「手動化」または「自動化」するために設定する値。
備考(セルへのアクセスについて)
セルへのアクセス(RangeやCellsを使用した処理)は、コストが高いとされています。
ただコストが高くとも、数十回アクセスする程度ならば特に問題ありません。
ですが
・繰り返し処理の中で数百回アクセスしたりすると
・VBAの処理が重く(=遅く)なりがち
です。
よって
・繰り返し処理の中でセルへのアクセスを何度も行うのは避けるべき
・セルへのアクセスは一括(1度で)行うべき
です。
例えば
・シート上の表をCSVファイルへ出力したい時は
・繰り返し処理で1行ずつ出力するのではなく
・一括で出力する方が良い
です。
シート上の表をCSVファイルへ一括で出力する方法は、以下の記事をご確認ください。
また例えば
・CSVファイルの内容をシート上に読み込みたい場合も
・繰り返し処理で1行ずつ読み込み/セルに設定するのではなく
・一括で読み込み/セルに設定した方が良い
です。
CSVファイルをシート上へ一括で読み込む方法は、以下の記事をご確認ください。
また例えば
・指定した範囲のデータを取得したい場合も
・繰り返し処理で1セルずつ取得するのではなく
・一括で取得した方が良い
です。
指定した範囲のデータを一括で取得する方法は、以下の記事をご確認ください。
また例えば
・配列をセルへ張り付けたい場合も
・繰り返し処理で1セルずつ貼り付けるのではなく
・一括で張り付ける方が良い
です。
配列を一括で貼り付ける方法は、以下の記事をご確認ください。