|
▼Taka さん:
こんにちは。
>現在、Excelプログラムの共通部分はアドイン化(xla)してさまざまなプログラムから呼び出して利用(VBAの参照設定でアドインを追加後)しているのですが、クラスモジュールはうまくいきません。なにか情報お持ちの方がいらっしゃったらお教え願えますでしょうか?
例として、汎用クラスモジュールを含んだアドインブックをclstest.xlaとしましょう。
クラスモジュール(名前はclass1)には、簡単なコードとして、
'==============================
Private mes As String
'==============================
Sub set_mes(dspmes As String)
mes = dspmes
End Sub
'==============================
Sub disp_mes()
MsgBox mes
End Sub
メッセージをプールして、必要なときに表示するみたいなコードです。
問題は、呼び出し側のブックではインタンスが作れませんね(これは、無理みたい)
よって、アドイン側でインタンスを作成して返すFunctionが必要になります。
標準モジュールに
'============================================
Function mk_cls()
Set mk_cls = New Class1
End Function
となりますが、
インタンスの作成方法によって意味合いが違ってきますから、ご注意を。
↑
と
'=============================
pbulic ccc as new class1
Function mk_cls()
Set mk_cls = ccc
End Function
の違いを言っています。
後は、呼び出し側では、
'====================================
Sub test()
Set clsobj = Application.Run("clstest.xla!mk_cls")
clsobj.set_mes "Classtest"
clsobj.disp_mes
End Sub
とすれば、クラスの実行は可能です。
が、呼び出し側でクラスのコードを実際に記述してみれば実感されると思いますが、
clsobj.でメンバリストが表示されません(呼び出し側でClass1が見えないから
当たり前なのですが)。
すごく不便を感じます。
これは、
・呼び出し側でアドインを参照設定すること
・クラスモジュールのプロパティの「instancing」というところを規定値のprivate
から、PublicNotCreatableに変更する事で克服できます。
この場合でも呼び出し側でインスタンスを作成する事はできませんが・・。
呼び出し側は、参照設定がしてあるので、
'==========================================
Sub test()
Dim clsobj As class1
' アドインのクラスが宣言できる
Set clsobj = mk_cls
' ↑参照設定してあるからRunが不要
' ↓コード記述時にメンバリストが表示される
clsobj.set_mes "Classtest"
clsobj.disp_mes
End Sub
と言うコードが書けます。
以上です。
|
|