2017-03-29 25 views
2

現在、アイテムのコレクションを構築しようとしています。コレクションを別のコレクション内のアイテムとして追加する - クラス - Excel VBA

私は2つのコレクションを設定し、それぞれに対してクラスモジュールを作成しました。 col1 - (Class1にリンクされています)。そして、col2 - 以下(クラス2にリンクされている)

は、私のクラスモジュールです:

のClass1:

Option Explicit 
Private pTestC1A As String 
Private pTestC1B As Collection 

Public Property Let TestC1A(Value As String) 
pTestC1A = Value 
End Property 

Public Property Get TestC1A() As String 
TestC1A = pTestC1A 
End Property 

Property Set TestC1B(col2 As Collection) 
Set pTestC1B = col2 
End Property 

Property Get TestC1BElements(v As Integer) As String 
    TestC1B = pTestC1B(v) 
End Property 

クラス2:以下

Option Explicit 
Private pTestC2A As String 

Public Property Let TestC2A(Value As String) 
pTestC2A = Value 
End Property 

Public Property Get TestC2A() As String 
TestC2A = pTestC2A 
End Property 

は私モジュールですコード

上記のコードを1として
Sub Test() 

Set col1 = New Collection 
Set col2 = New Collection 

Set cV = New Class1 
cV.TestC1A = "First Collection" 

Set aV = New Class2 
aV.TestC2A = "Second Collection" 
sKey1 = CStr(aV.TestC2A) 
col2.Add aV, sKey1 

Set cV.TestC1B = col2 

sKey2 = CStr(cV.TestC1A) 
col1.Add cV, sKey2 
    If Err.Number = 457 Then 
     MsgBox "Error Occured" 
    ElseIf Err.Number <> 0 Then Stop 
    End If 
    Err.Clear 

Msgbox col1(1).TestC1A ' works fine 
Msgbox col2(1).TestC2A ' works file 
MsgBox col1(1).TestC1B(1).TestC2A ' does not work - 450 run-time error 

End Sub 

、私は成功し、私はそれぞれのコレクションを参照する場合の項目の値を取得することができるよ、しかし私は実行を「引数の数が間違っまたは無効なプロパティの割り当て」を取得していますネストされた方法でアイテムの値を取得しようとすると、タイムアウトエラーが発生します。

誰かが私が間違っているところを指摘し、おそらくクラスモジュールがプロパティセットを処理する方法を明らかにすることができれば幸いです。&コレクションのパラメータを取得します。

答えて

3

あなたのClass1クラスモジュールでGet TestC1Bプロパティが欠落しています

Property Get TestC1B() As Collection 
    Set TestC1B = pTestC1B 
End Property 

それが存在したら、あなたがcol1(1).TestC1B(1)とアクセスに呼び出しを行うことができるようになります、それは.TestC2A財産


背景です

あなたのクラスでプライベート変数を使用し、プロパティを使用してプライベート変数への読み取り/書き込みアクセスを与えることで、あなたはこのように多くのコントロールを得るでしょう。

プロパティGetは、そのプロパティ(広義にはプライベート変数)に読み取りアクセス権を与えます。たとえば、Range.Addressを使用して、範囲オブジェクトのアドレスを返します(となります)。

プロパティLetおよびSetは、プロパティへの書き込みアクセス権を与えます。オブジェクトにはSetを使用してください。たとえば、Range.Value = 1となります。新しい値が範囲に書き込まれます。

と考えると、Range.Address = $A$1。範囲のアドレスにはProperty Setが存在しないため、範囲のアドレスは変更されません。 Range.Addressの部分をGetと呼び、評価すると$A$1 = $A$1のようになります。この例ではTRUEが返されます

+1

ニースの回答!追加するものはありません!;-) –

+0

非常に明確な、おかげであなたの迅速なヘルプのための多くの。高く評価!それは今、完璧に動作します。 – CaptainABC

+0

@ Mat'sMugありがとう! :D – CallumDA

関連する問題