みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセル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メソッドまでの実行時間を測定して、メッセージ表示するものです。
PerformanceBoosterクラスは、Applicationクラスのいくつかのプロパティを変更して、高速化するものです。
インスタンス生成時にプロパティをセットして、インスタンスの破棄時にプロパティを元に戻します。
今回は、この二つのクラスをアドインとして利用できるようにしていきます。
アドインとは
アドインというのは、拡張子xlam形式のブックのことで、非表示でブックを開くことができるものです。
よく、VBEの「ツール」メニュー「参照設定」からライブラリを追加しますよね。
実は他のxlsm形式のブックのマクロも、そこから参照設定して使用することができるわけですが、xlsm形式だと、もう一丁Excelブックが立ち上がっちゃってちょっと邪魔なんですね。
そこで非表示のアドインです。
アドインは非表示なので、邪魔にならないように参照設定できます。
ですが、アドインもExcelブックの一種なので、通常のマクロと同じように開発できる…つまり、自作ライブラリを作る感じですね。
それで、今回はアドインに自作クラスを記述したマクロを用意しておいて、それを参照設定して、他のブックからクラスを使えるようにしちゃおうということです。
マクロブックをアドインブックとして保存
では、進めていきましょう。
まず、これまで作ってきたクラスモジュールと標準モジュールを含むブックをアドインとして保存します。
エクセルの「ファイル」メニューの「名前をつけて保存」から、「Excelアドイン(*.xlam)」を選択して保存します。
それで、保存する形式を「Excelアドイン(*.xlam)」にすると、自動的に保存するフォルダが
というようなフォルダになります。
このフォルダはアドインを保存する専用のフォルダで、ユーザーアドインフォルダといいます。
これでアドインとしての保存はOK。
アドインの設定とマクロの編集
プロジェクト名の変更
こうして保存したアドインですが、いくつか設定やマクロの編集が必要です。
まず、プロジェクト名を変更します。
というのも、参照元のプロジェクトと、参照先のこのアドインのプロジェクトで同じ名前だとうまくいかないのです。
なので、こちらのアドインのほうのプロジェクト名を変更します。
まず、VBEの「ツール」メニューから「VBAProjectのプロパティ」を選択します。
「プロジェクトプロパティ」というダイアログが開きますので、「プロジェクト名」を入力して、「OK」をクリックします。
プロジェクトエクスプローラーを確認すると、プロジェクト名が変更されていることを確認できます。
クラスモジュールをPublicNotCreatableにする
続いて、クラスモジュールにもちょっと設定が必要です。
プロジェクトエクスプローラーでクラスモジュールを選択しているときの、プロパティウィンドウを見てください。
クラスモジュールには「Instancing」という唯一のプロパティがあるのですが、その設定が「1 – Private」となっているはずです。
なんとなく意味がわかると思いますが、「インスタンスはプライベートでしか使えない」という設定になっているんですね。
なので、これを「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で自作クラスをアドイン化する方法をお伝えしました。
あとは、このアドインを参照設定して、他のプロジェクトから使用できるようにすればよいですね。
それについては、次回お伝えしていきます。
どうぞお楽しみに!