Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


73059 / 76732 ←次へ | 前へ→

【8156】Re:クラスモジュールのアドイン化
回答  ichinose  - 03/10/2(木) 12:03 -

引用なし
パスワード
   ▼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

と言うコードが書けます。

以上です。
0 hits

【8153】クラスモジュールのアドイン化 Taka 03/10/2(木) 11:07 質問
【8156】Re:クラスモジュールのアドイン化 ichinose 03/10/2(木) 12:03 回答
【8172】できました!! Taka 03/10/2(木) 16:49 お礼

73059 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free