VBAにて、Collectionにクラス(ユーザ定義オブジェクト)のインスタンスをaddして入れて、インスタンスとして取り出す際にエラーになります。
メソッドチェーンで、インスタンスを取り出さないでインスタンス内部にアクセスする場合はエラーとなりませんが、インスタンスを取り出すとエラーになります。
VBAでコレクションでクラスを扱う方法をご教示いただきたいです・・・。
(Dictionaryだとインスタンス入れられない。)
試してみたコードは追加で貼ります。
サンプルコード
クラスモジュール
```sampleClass
Public name As String
Public Sub Class_Initialize()
End Sub
```
メインモジュール
```main
Sub testCollection()
Dim i As Integer
Dim sampleClasses As New Collection
Dim sampleClassInstance As sampleClass
Set sampleClassInstance = New sampleClass
sampleClassInstance.name = "hogehoge"
sampleClasses.Add sampleClassInstance, "こんにちは"
Set sampleClassInstance = New sampleClass
sampleClassInstance.name = "fugafuga"
sampleClasses.Add sampleClassInstance, "さようなら"
sampleClasses.Add 5, "おはよう"
'' パターン1
'Dim sampleClassInstances As Variant
'sampleClassInstances = sampleClasses.item("こんにちは") ' エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません
'MsgBox sampleClassInstances.name
'' パターン2
'Dim sampleClassInstances As sampleClass
'Set sampleClassInstances = New sampleClass
'sampleClassInstances = sampleClasses.item("こんにちは") ' エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません
'MsgBox sampleClassInstances.name
'' パターン3
'Dim sampleClassInstances As sampleClass
'sampleClassInstances = sampleClasses.item("こんにちは") ' エラー 91 オブジェクト変数またはwithブロック変数が設定されていません
'MsgBox sampleClassInstances.name
'' パターン4
'Dim sampleClassInstances As sampleClass
'Set sampleClassInstances = sampleClass ' エラー 424 オブジェクトが必要です
'sampleClassInstances = sampleClasses.item("こんにちは")
'MsgBox sampleClassInstances.name
'' パターン5
MsgBox sampleClasses.item("こんにちは").name ' エラーは出ない
'' パターン6
Dim res As Integer
res = sampleClasses.item("おはよう") ' エラーは出ない
MsgBox res
End Sub
```
質問文を編集しました。詳細はこちら。
パターン1~3については
「Set」を使って
sampleClassInstances = sampleClasses.item("こんにちは")
↓
Set sampleClassInstances = sampleClasses.Item("こんにちは")
とすればいいと思います。
パターン4は
インスタンスではなくクラス名をオブジェクト変数に入れようとしているためエラーになっています。