【ExcelVBA】クラスモジュールの使い方その1
どうも、じゃらしです。
今回もExcelVBAネタです。
VBAのクラスモジュールに関する記事です。
突然ですが、このコードを見たことがありますか?
Application.ScreenUpdating = False
ScreenUpdatingは、Excelの画面更新に関するApplicationのプロパティで、Falseにすると見かけ上画面描写されなくなります。
セルの値を操作するときは、これをFalseにしておくと次にTrueになる時まで見かけ上の画面描写を止めておくことができて、処理がまあまあ早くなります。
こんな感じで、マクロ実行時に必ず行わせたい処理があったりしますよね。
各プロシージャにScreenUpdating...をコーディングしていっても良いのですが、クラスモジュール化しておくと後々別のマクロでもインポートして使用したりできて便利なので紹介します。
実際のコード
今回は、パフォーマンス向上用クラスとして「PerformanceUp.cls」を作成します。
'PerformanceUp.cls Private saved_ScreenUpdating As Long Private saved_EnableEvents As Long Private Sub Class_Initialize() With Application saved_ScreenUpdating = .ScreenUpdating saved_EnableEvents = .EnableEvents .ScreenUpdating = False .EnableEvents = False End With End Sub Private Sub Class_Terminate() With Application .ScreenUpdating = saved_ScreenUpdating .EnableEvents = saved_EnableEvents End With End Sub
そして、PerformanceUpを標準モジュール上でインスタンス化します。
'Module1.bas Sub test() Dim pu As PerformanceUp Set pu = New PerformanceUp '以下処理を記述 Debug.Print "ちくわ" End Sub
こんな感じに記述すると、testプロシージャ実行時にPerformanceUpのClass_Initializeが呼び出されます。
そして、End Sub時にPerformanceUpのClass_Terminateが呼び出されます。
Application.ScreenUpdatingは画面更新
Application.EnableEventsはシート削除時などのダイアログ有無
ここら辺は切っちゃうことが多いので、WithでApplicationを括って記述しています。
特別なプロシージャ
Class_Initialize:コンストラクタ
Class_Terminate:デストラクタ
これらのプロシージャは特別で、コンストラクタはそのクラスがNewされる時(インスタンス生成時)に自動的に呼び出されます。
また、デストラクタはNewされたインスタンスがどこからも参照されなくなった時に自動的に呼び出されます。
注意1
Dim pu As New PerformanceUp
上記のようにpu宣言時にインスタンスを生成する書き方もありますが、この場合Class_Initializeは「次にpuが参照されるタイミング」で呼び出されます。つまり、Class_Initializeが呼び出されるか分からなくなってしまいます。
このクラスはプロシージャ開始時にいろいろ設定したりするのが目的ですので、この書き方は避けるべきです。