エクセルVBAで自作アドインの便利クラスを活用する方法


reference

photo credit: Melinda * Young The Old Books via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAで実行時間を測定するクラス、処理の高速化をするクラスを作っておりました。

前回は、以下の記事でそれらのクラスをアドイン化して便利に使いまわそう!という内容でお送りしました。

便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法
便利なクラスはあちこちで使い回ししたいですよね。「アドイン」という機能を使うと、参照設定のみで使えるようになります。今回は便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法をお伝えします。

アドインファイルを作るところまでお伝えしたのですが、まだそれを活用する方法をお伝えできていなかったので、本記事はその続編となります。

ということで、エクセルVBAで自作アドインの便利クラスを活用する方法です。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

まずは、お題となる標準モジュールのプロシージャからご覧ください。

こちらです。

Sub MySub()
                      
    Dim timerObj As TimerObject: Set timerObj = New TimerObject
    Dim booster As PerformanceBooster: Set booster = New PerformanceBooster
       
    Sheet1.Cells.Clear
    Sheet2.Cells.Clear
            
    With Sheet1
        Dim i As Long
        For i = 1 To 300
            .Cells(i, 1).Value = i
            .Cells(i, 2).FormulaLocal = "=SUM(A1:A" & i & ")"
            .Rows(i).Copy
            Sheet2.Cells(i, 1).PasteSpecial
        Next i
    End With
                    
    timerObj.ReportTimer
    
End Sub

処理自体はあまり意味がありませんが、2つの便利なクラスの使用例となっています。

まず、実行速度を測定するTimerObjectクラス。

Public Start As Date
Public Finish As Date

Private Sub Class_Initialize()
    Start = Time
End Sub

Public Sub ReportTimer()
    Finish = Time
    MsgBox "実行時間は " & Format(Finish - Start, "nn分ss秒") & " でした", vbInformation + vbOKOnly
End Sub
エクセルVBAで実行時間を手軽に測定するTimerObjectクラスを作る
エクセルVBAでは使い回しをするような機能をクラス化しておくと便利ですよね。今回は、使用頻度が高い機能ということで、エクセルVBAで実行時間を測定するのに便利なタイマークラスの作り方をお伝えしていきます。

そして、処理の高速化を行うPerformanceBoosterクラスです。

Private initCalculationValue_ As XlCalculation

Private Sub Class_Initialize()

    With Application
        initCalculationValue_ = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
        .ScreenUpdating = False
    End With

End Sub

Private Sub Class_Terminate()

    With Application
        .Calculation = initCalculationValue_
        .EnableEvents = True
        .ScreenUpdating = True
    End With

End Sub
エクセルVBAの実行速度を高速化するための処理をクラス化する方法
作成したプロシージャの中に「高速化」をするためのルーチンを入れることがよくありますが、「使い回し」できちゃったほうが便利ですよね。今回は、エクセルVBAの実行速度を高速化するための処理をクラス化する方法です。

この2つのクラス…あちこちで使い回しそうなので、アドイン化して使い回しをしやすくしよう!というのが前回からの内容です。

アドインブックの作成や設定などは、前回の以下記事をご覧くださいね。

便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法
便利なクラスはあちこちで使い回ししたいですよね。「アドイン」という機能を使うと、参照設定のみで使えるようになります。今回は便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法をお伝えします。

そして、そのアドインブックにインスタンス生成用のパブリックなFunctionプロシージャを作成する必要がありまして、それはコチラです。

Public Function CreateTimer()

    Dim t As TimerObject: Set t = New TimerObject
    Set CreateTimer = t

End Function

Public Function CreateBooster()

    Dim b As PerformanceBooster: Set b = New PerformanceBooster
    Set CreateBooster = b

End Function

…と、ここまでがおさらいです(長)。

今回はこの作成したアドインを活用していく方法を見ていきましょう。

アドインを他のプロジェクトから活用する

では、元のブック「実行速度.xlsm」からアドインを活用できるようにしていきましょう。

クラスモジュールを開放する

まず、「実行速度.xlsm」には、まだ以下のクラスモジュールが存在しています。

  • TimerObject
  • PerformanceBooster

これら、2つのクラスモジュールは、アドインブックに移設しました。

後ほど参照設定して使えるようになりますので、このブックには存在している必要がありません。

プロジェクトエクスプローラー上で右クリックして「解放」してあげましょう。

クラスモジュールを開放する

アドインを参照設定する

続いて、アドインブックを参照設定していきます。

参照設定の手順は、実はライブラリの参照設定と同じです。

まず、VBEの「ツール」メニューの「参照設定」を選択します。

VBEから参照設定を開く

続いて、以下のように進めますよ。

  1. 参照設定ダイアログで「参照」ボタンをクリック
  2. ファイルの参照ダイアログでユーザーアドインフォルダを選択
  3. ファイル形式を「Microsoft Excel Files」を選択
  4. 作成したアドインブックを選択
  5. 「開く」ボタンをクリック

アドインブックの参照設定
おさらいですが、ユーザーアドインフォルダは以下のようなパスでしたね。

C:Usersユーザー名AppDataRoamingMicrosoftAddIns

すると、以下のように参照設定ダイアログには「Performance」にチェックが入りますね。

また、プロジェクトエクスプローラーでも「Performance(実行速度.xlam)」の存在が確認(非表示ではありながらもアドインブックが開いている)でき、かつVBAProjectからの参照先として設定されていることがわかります。

アドインブックの参照設定を確認する

アドインのクラスを活用する

では、コードをアドインを活用するものに変更していきましょう。

他のプロジェクトのクラスは「PublicNotCreatable」ですから、Newキーワードでインスタンスを生成できませんでした。

なので、インスタンス生成用のFunctionプロシージャCreateTimerおよびCreateBoosterを使ってあげるんでしたね。

それらに修正したコードがこちらです。

Sub MySub()
                      
    Dim timerObj As TimerObject: Set timerObj = CreateTimer
    Dim booster As PerformanceBooster: Set booster = CreateBooster
       
    Sheet1.Cells.Clear
    Sheet2.Cells.Clear
            
    With Sheet1
        Dim i As Long
        For i = 1 To 300
            .Cells(i, 1).Value = i
            .Cells(i, 2).FormulaLocal = "=SUM(A1:A" & i & ")"
            .Rows(i).Copy
            Sheet2.Cells(i, 1).PasteSpecial
        Next i
    End With
                    
    timerObj.ReportTimer
    
End Sub

3,4行目をちょっと変更するだけでいけますね。

では、実行して動作確認をしてみましょう。

アドインのクラスを用いる動作確認

無事に動作し、変わらず5秒という記録を叩き出しましたね。

まとめ

以上、エクセルVBAで自作アドインの便利クラスを活用する方法をお伝えしました。

ちょっと手順はいりますが、いつも使うクラスがあれば今回紹介した2つのクラスに限らずアドインブックに入れておくと良さそうですね。

どうぞご活用ください!

連載目次:エクセルVBAのタイマー&高速化クラスとアドインを作る

エクセルVBAで実行時間を測定するタイマークラス、また処理速度を高速化するブースタークラスを作成し、それを使い回ししやすいようにアドイン化する方法をお伝えします。
  1. エクセルVBAで実行時間を手軽に測定するTimerObjectクラスを作る
  2. エクセルVBAの実行速度を高速化するための処理をクラス化する方法
  3. 便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法
  4. エクセルVBAで自作アドインの便利クラスを活用する方法

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