前回紹介したExcelマクロを高速化する設定をクラスモジュールにまとめると、様々なマクロで再利用(使い回す)できるようになります。
Excelマクロの高速化設定をまとめたクラス
クラスモジュールの実装は以下のようになります。ここでは仮にProcessControlをいう名前にしています。
Option Explicit '*** 'Process Control 'マクロの開始、終了、エラー発生時の処理を受け持つクラス '*** '--- '事前処理 'マクロができるだけ速く動くように、計算の邪魔になる処理を止める '--- Public Sub Class_Initialize() With Application .ScreenUpdating = False '画面描画停止 .Calculation = xlCalculationManual '自動計算停止 .EnableEvents = False 'イベント動作停止 .EnableCancelKey = xlErrorHandler 'Escキーでエラーストップする .Cursor = xlWait 'カーソルを砂時計にする End With End Sub '--- '事後処理 '--- Public Sub Class_Terminate() With Application .Cursor = xlDefault .StatusBar = False .EnableCancelKey = xlInterrupt .EnableEvents = True .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub '--- 'エラー処理 '--- Public Sub ErrorProcess() MsgBox "ERROR!" & Err.Description Call Class_Terminate End Sub
クラスの使い方(呼び出し側)
クラスモジュールを使用する場合は、以下のように変数を宣言した後に、
Dim 変数名 As クラス名 Set 変数名 = New クラス名
と書くと、変数にクラス用のメモリ領域が割り当てられて、クラスに定義されている関数を使用できるようになります。
使い終わったら
Set 変数名 = Nothing
と書くと、変数に割り当てられたメモリ領域を開放することができます。
また、冒頭のProcessControlクラスでは、「Set 変数名 = New クラス名」が実行されると「Class_Initialize」関数が動きます。
更に、(「Set 変数名 = Nothing」と書かなくても)関数が終了する際には「Class_Terminate」関数が動きます。
なお、マクロ実行中に予期せぬエラーが発生した場合に備えて
On Error GoTo ラベル名 ラベル名:
と書くと、エラー発生時に「ラベル名:」以降の処理を実行します。
以上を踏まえて、ProcessControlクラスを使用するVBAのサンプルソースは以下のようになります。
Sub Main() Dim PC As ProcessControl '--- '開始処理 '--- On Error GoTo ErrorHandler '--- '個別処理呼び出し '--- Set PC = New ProcessControl Call DoSomething '--- '終了処理 '--- Exit Sub '--- 'エラー発生時 '--- ErrorHandler: PC.ErrorProcess End Sub
VBAのプロジェクトにインポートすると次のように表示されます。
今回はこの辺で。
コメント