アドインファイルのクラスをインスタンス化する方法

アドインファイルのクラスをインスタンス化しようとすると

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

コメント

この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
タイトルとURLをコピーしました