便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法


add

photo credit: mikecogh Blank Equation via photopin (license)

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

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

エクセルVBAで実行時間を手軽に測定するTimerObjectクラスを作る
エクセルVBAでは使い回しをするような機能をクラス化しておくと便利ですよね。今回は、使用頻度が高い機能ということで、エクセル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

処理自体にはあまり意味がないのですが、実行時間がかさみそうな処理です。

TimerObjectクラスはインスタンスの生成時から、ReportTimerメソッドまでの実行時間を測定して、メッセージ表示するものです。

エクセルVBAで実行時間を手軽に測定するTimerObjectクラスを作る
エクセルVBAでは使い回しをするような機能をクラス化しておくと便利ですよね。今回は、使用頻度が高い機能ということで、エクセルVBAで実行時間を測定するのに便利なタイマークラスの作り方をお伝えしていきます。

PerformanceBoosterクラスは、Applicationクラスのいくつかのプロパティを変更して、高速化するものです。

インスタンス生成時にプロパティをセットして、インスタンスの破棄時にプロパティを元に戻します。

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

今回は、この二つのクラスをアドインとして利用できるようにしていきます。

アドインとは

アドインというのは、拡張子xlam形式のブックのことで、非表示でブックを開くことができるものです。

よく、VBEの「ツール」メニュー「参照設定」からライブラリを追加しますよね。

実は他のxlsm形式のブックのマクロも、そこから参照設定して使用することができるわけですが、xlsm形式だと、もう一丁Excelブックが立ち上がっちゃってちょっと邪魔なんですね。

そこで非表示のアドインです。

アドインは非表示なので、邪魔にならないように参照設定できます。

ですが、アドインもExcelブックの一種なので、通常のマクロと同じように開発できる…つまり、自作ライブラリを作る感じですね。

それで、今回はアドインに自作クラスを記述したマクロを用意しておいて、それを参照設定して、他のブックからクラスを使えるようにしちゃおうということです。

マクロブックをアドインブックとして保存

では、進めていきましょう。

まず、これまで作ってきたクラスモジュールと標準モジュールを含むブックをアドインとして保存します。

エクセルの「ファイル」メニューの「名前をつけて保存」から、「Excelアドイン(*.xlam)」を選択して保存します。

Excelマクロブックをアドインとして保存

それで、保存する形式を「Excelアドイン(*.xlam)」にすると、自動的に保存するフォルダが

C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns

というようなフォルダになります。

このフォルダはアドインを保存する専用のフォルダで、ユーザーアドインフォルダといいます。

Excelのユーザーアドインフォルダ

これでアドインとしての保存はOK。

アドインの設定とマクロの編集

プロジェクト名の変更

こうして保存したアドインですが、いくつか設定やマクロの編集が必要です。

まず、プロジェクト名を変更します。

というのも、参照元のプロジェクトと、参照先のこのアドインのプロジェクトで同じ名前だとうまくいかないのです。

なので、こちらのアドインのほうのプロジェクト名を変更します。

まず、VBEの「ツール」メニューから「VBAProjectのプロパティ」を選択します。

VBAProjectのプロパティを開く

「プロジェクトプロパティ」というダイアログが開きますので、「プロジェクト名」を入力して、「OK」をクリックします。

プロジェクト名を変更

プロジェクトエクスプローラーを確認すると、プロジェクト名が変更されていることを確認できます。

プロジェクトエクスプローラーでプロジェクト名を確認

クラスモジュールをPublicNotCreatableにする

続いて、クラスモジュールにもちょっと設定が必要です。

プロジェクトエクスプローラーでクラスモジュールを選択しているときの、プロパティウィンドウを見てください。

クラスモジュールには「Instancing」という唯一のプロパティがあるのですが、その設定が「1 – Private」となっているはずです。

なんとなく意味がわかると思いますが、「インスタンスはプライベートでしか使えない」という設定になっているんですね。

なので、これを「2- PublicNotCreatable」とします。

クラスモジュールのプロパティを「2- PublicNotCreatable」に変更

つまり、これで他のプロジェクトからも「インスタンスがパブリックでも使える」状態になったわけです。

これを、TimerObjectクラスと、PerformanceBoosterクラスと両方で設定しておきます。

インスタンス生成用のFunctionプロシージャを作る

…ただし、Instancingプロパティの値「NotCreatable」とありますね。

つまり、他のプロジェクトからはインスタンスを作成できないっつーわけですね。

なので、アドインの標準モジュールに、インスタンスを生成して返すFunctionプロシージャを作っておいてあげます。

それらのFunctionプロシージャをパブリックにしておけば、それは他のプロジェクトから呼び出せます。

そして、その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

これで保存すれば、アドイン側の準備はOKです。

ちょっと長くなりそうなので、続きは次回!

まとめ

以上、便利なクラスを使い回す!エクセルVBAで自作クラスをアドイン化する方法をお伝えしました。

あとは、このアドインを参照設定して、他のプロジェクトから使用できるようにすればよいですね。

それについては、次回お伝えしていきます。

エクセルVBAで自作アドインの便利クラスを活用する方法
前回の記事でアドインファイルを作るところまでお伝えしたのですが、それを活用する方法を続編としてお伝えします。エクセルVBAで自作アドインを参照設定して、便利クラスを使い回して活用する方法です。

どうぞお楽しみに!


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