我目前正在尝试构建一个项目集合,其中集合可能包含另一个集合作为项目。
我已经设置了两个集合并为每个集合创建了一个类模块: col1 - (链接到Class1);和col2 - (链接到Class2)
以下是我的课程模块:
的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
以下是我的模块代码
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
根据上面的代码,如果我分别引用每个集合,我就能成功获取项目的值,但是我得到“错误的参数数量或无效的属性赋值”如果我尝试以嵌套方式获取项值,则运行时错误。
如果有人可以帮助指出我出错的地方,并且可能会对类模块处理属性集的方式有所了解,那将不胜感激。获取集合的参数。
答案 0 :(得分:3)
您在Get TestC1B
课程模块中缺少Class1
媒体资源:
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
之类的内容