Excelマクロの高速化設定をクラスにまとめる方法【VBA入門】

前回紹介したExcelマクロを高速化する設定をクラスモジュールにまとめると、様々なマクロで再利用(使い回す)できるようになります。

Sponsored Link

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
Sponsored Link

クラスの使い方(呼び出し側)

クラスモジュールを使用する場合は、以下のように変数を宣言した後に、

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のプロジェクトにインポートすると次のように表示されます。

今回はこの辺で。

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました