@ポケじゃらし

音楽ゲームとかボーカロイドとか

【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が呼び出されるか分からなくなってしまいます。
このクラスはプロシージャ開始時にいろいろ設定したりするのが目的ですので、この書き方は避けるべきです。

注意2
Set pu = Nothing

と記述することで、任意のタイミングでインスタンスを破棄させてClass_Terminateを呼び出すこともできます。

以上、それではまた。