アドインファイルのクラスをインスタンス化しようとすると
Newキーワードの使用方法が不正です
とエラーが発生してしまいました
これは、クラスモジュールのInstancingが、2- PublicNotCreatable であるためです
Public ← 外部から読み込んだ場合
NotCreatable ← インスタンス化できません
では、Instancing を 1- Private にすればいい?
Private にすると、外部から呼び出すことさえできなくなります
このようなときの解決方法について解説します
手順
大まかな手順です
- アドインファイル内に、標準モジュールを作成
- 標準モジュール内に、クラスをインスタンス化するFunction関数を作成
- 外部ファイルから、標準モジュール内のFunction関数を呼び出して、関数にSetする
外部ファイル → アドインファイル内のクラスをインスタンス化 (× これはできない)
外部ファイル → アドインファイル内の標準モジュールを呼び出す → アドインファイル内のクラスをインスタンス化する (◎ これはできる)
このようなイメージです
つまり、外部ファイルから直接アドインファイル内のクラスをインスタンス化できないので、
間に、アドインファイル内の標準モジュールをかませることで、インスタンス化を可能にしています
ソースコード
3つのモジュールを使用します
- 標準モジュール(外部ファイル)
- 標準モジュール(アドインファイル)
- クラスモジュール(アドインファイル)
標準モジュール(外部ファイル)
Set c1 = New Class1 の代わりに、 Set c1 = CreateClass を記述します
CreateClass は、アドインファイル内の標準モジュールの関数です
この関数内に、アドインファイル内のクラスのインスタンスが Set されています
Public Sub MyProcess()
Dim c1 As Class1
'Set c1 = New Class1
Set c1 = CreateClass
c1.Name = "nobby"
Call c1.Greeding
End Sub
標準モジュール(アドインファイル)
CreateClass に、Class1 のインスタンスを Set します
Public Function CreateClass()
Dim tmpClass As Class1
Set tmpClass = New Class1
Set CreateClass = tmpClass
End Function
クラスモジュール(アドインファイル)
こちらは、変更なしで OK です
Public name As String
Public Sub Greeding()
Debug.Print "Hello " & name & " !"
End Sub
コメント