VBAを高速化する3つの方法(汎用クラスにすると便利)
この記事は次のような人に向けて書いています。
- 作成したVBAが遅すぎて困っている
- VBAを高速化する方法が知りたい
- 高速化処理をクラスにまとめる方法を知りたい
大きく3つあるVBAを高速化する方法と、この処理を汎用クラスにするメリットを紹介します。
VBAを高速化する3つの方法
1. 画像描画をオフにする(ScreenUpdatingプロパティ)
Sub 画像描画をオフ()
Application.ScreenUpdating = False '画像描画オフ
'ここに処理を書く
Application.ScreenUpdating = True '画像描画オン
End Sub
画面の描画をオフにすると、VBAでシートに値を書き出しても画面が変化しなくなります。
その分だけCPUの負荷が少なくなるため処理速度が速くなります。
今回紹介する3つの処理の中でも効果が出やすいため、まずは画面描画のオフを試してみましょう。
2. 自動計算をオフにする(Calculationプロパティ)
Sub 自動計算をオフ()
Application.Calculation = xlCalculationManual '手動計算
'ここに処理を書く
Application.Calculation = xlCalculationAutomatic '自動計算
End Sub
計算式を含んだシートにVBAで値を書き出すと処理速度が一気に落ちることがあります。
これは値を書き出す度に計算式が再実行され、CPUに負荷がかかるためです。
この場合、VBAの処理中は計算式をオフにすると処理速度が一気に速くなります。
ただし、最後に計算式を自動計算に戻すのを忘れないように気をつけてください。
また、途中でエラー終了した場合も自動計算に戻らないので注意する必要があります。
3. イベント動作をオフにする(EnableEventsプロパティ)
Sub イベント動作をオフ()
Application.EnableEvents = False 'イベント動作オフ
'ここに処理を書く
Application.EnableEvents = True 'イベント動作オン
End Sub
セルの変更などをトリガーとしたイベントマクロを仕込んでいる場合は、イベント動作をオフにすることも重要です。
計算式と同様にセルの変更で毎回イベント動作が発生していると処理速度が大きく下がります。
このような場合はイベント動作をオフにすることが有効です。
計算式の場合と同じく最後にイベント動作をオンにするのを忘れないように気をつけてください。
また、途中でエラー終了した場合もイベント動作がオフのままとなるので注意する必要があります。
汎用クラスにするメリット
ここまで紹介した3つの高速化は汎用クラスにすることをおすすめします。
自動計算とイベント動作ではプログラムがエラー終了すると設定が元に戻らないと説明しました。
この問題点ですが、汎用クラスを用いると解決することができます。
'汎用クラス側 クラス名:HighSpeed
Private Sub Class_Initialize()
Application.ScreenUpdating = False '画像描画オフ
Application.Calculation = xlCalculationManual '手動計算
Application.EnableEvents = False 'イベント動作オフ
End Sub
Private Sub Class_Terminate()
Application.ScreenUpdating = True '画像描画オン
Application.Calculation = xlCalculationAutomatic '自動計算
Application.EnableEvents = True 'イベント動作オン
End Sub
Sub 標準モジュール側()
'’高速化処理
Dim hs As HighSpeed
Set hs = New HighSpeed
'ここに処理を書く
''終了処理
Set hs = Nothing
End Sub
クラスにはデストラクタ(Class_Terminate)と呼ばれるクラスインスタンスが消えるときに自動的に実行される処理を入れることができます。
エラー終了した場合でもクラスインスタンスが消えるため、自動的にデストラクタが働き、設定を自動的に元に戻してくれます。
サンプルコードの上が汎用クラスのコードでクラス名はHighSpeedとしています。
クラスインスタンスが生成されたときにコンストラクタ(Class_Initialize)によって高速化処理を実行させるようにしています。
そのため、クラス呼び出す標準モジュール側はHighSpeedクラスのインスタンスを生成するだけで済みます。
また、高速化を終了するときにはインスタンス変数にNothingを代入するだけで済みます。
この方法を取れば標準モジュール側はたった3行書くだけで済むため、非常にすっきりとしたコードにすることができます。