はじめに
前回にExcel VBAの高速化の記事を書きました。
https://qiita.com/loach/items/3ae9100034ecf2d804ce
今回は記事内で紹介している画面更新の設定のクラス化を書きます.
画面更新の停止をコンストラクタに書くことで、クラスをインスタンス化した時点で画面の更新を止めて高速化し、更新を有効化をデストラクタに書くことによってオブジェクトが開放された時点で自動的に更新を有効化することが出来ます。
前回の記事では通常のプロシージャでしたが今回はクラスという事でインスタンス化するためほんの少し処理負荷が大きくなりますが、本当に些細な差であり処理の最初に一回だけ実行するものである為、問題になることはないでしょう。
また、通常のプロシージャの場合、早期リターン等で終了条件が複数ある場合、そのたびに更新の有効化を明示的に書く必要がありましたがクラスのデストラクタの場合はその必要がありません。
※エラー等で処理が止まってしまった場合はデストラクタが実行されませんので注意してください.
高速化クラス作成
クラスモジュールを作成して以下コードを記入してください。
今回はクラス名はAccelerator
としています。
Private Sub Class_Initialize()
'画面の更新を停止
With Application
.ScreenUpdating = False
.Calculation = xlCalclationManual
.EnableEvents = False
.Cursor = xlWait
End With
End Sub
Private Sub Class_Terminate()
'画面の更新を有効化
With Application
.ScreenUpdating = True
.Calculation = xlCalclationAutomatic
.EnableEvents = True
.Cursor = xlDefault
End With
End Sub
Public Sub Init()
' 宣言時にNewをした場合コンストラクタが走らないためこのプロシージャを使用する
End Sub
使用方法
処理の先頭でインスタンス化して下さい。
Dim Ac As Accelerator
Set Ac = New Accelerator
宣言時にNew
をする場合は以下のようにInit
を使用してください
Dim Ac As New Accelerator
Ac.Init
処理が終わりオブジェクトが開放された時点で画面の更新は有効化されます。
終わりに
以上がExcel VBA高速化クラスの作成方法です。
この記事を読んでくださりありがとうございます。