このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

VBAを高速化する3つの方法(汎用クラスにすると便利)

2024年8月10日

この記事は次のような人に向けて書いています。

  • 作成したVBAが遅すぎて困っている
  • VBAを高速化する方法が知りたい
  • 高速化処理をクラスにまとめる方法を知りたい

大きく3つあるVBAを高速化する方法と、この処理を汎用クラスにするメリットを紹介します。

VBAが難しいと感じたら
ココナラにて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行書くだけで済むため、非常にすっきりとしたコードにすることができます。

《VBA上級者になりたい人へ》
VBA上級者を目指したい人にはパーフェクトExcel VBA一択です。
この本を読み切れば間違いなくVBA上級者になれます。

VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから

VBA

Posted by やろまい