这是一个基础课:
Public MyData As Dictionary
Private Sub Class_Initialize()
Set MyData = New Dictionary
End Sub
无法访问公共词典:
Sub Test()
Dim myClass As New cMyClass
myClass.MyData("A") = 1
Debug.Print myClass.MyData("A")
End Sub
错误:
Compile error: Wrong number of arguments or invalid property assignment
我想这与我们不能在类中拥有公共数组这一事实有关。
根本原因在于VBA提供了索引属性,因此在表达式myClass.MyData
中,VBA认为MyData
只能是索引属性 >,并且不会搜索其他任何内容,例如公共词典。
按照这个路径,我确实可以写:
Private pMyData As Dictionary
Private Sub Class_Initialize()
Set pMyData = New Dictionary
End Sub
Public Property Get MyData(key As String) As Variant
MyData = pMyData(key)
End Property
Public Property Let MyData(key As String, value As Variant)
pMyData(key) = value
End Property
我上面的Test
示例工作正常。
您确认此限制的由来吗?
还有其他方法吗?
我已经尝试过(myClass.MyData)("A") = 1
,但是它也失败了,并显示了Syntax error
。
答案 0 :(得分:4)
首先,让我们澄清一下。在您的示例代码中,MyData
不是属性,而是一个 field 。如果它是一个属性,则需要这样声明:
Private memberData As Dictionary
Private Sub Class_Initialize()
Set memberData = New Dictionary
End Sub
Public Property Get MyData() As Dictionary
Set MyData = memberData
End Property
有了该类声明,您的示例调用代码就可以正常工作:
Sub Test()
Dim myClass As New cMyClass
myClass.MyData("A") = 1
Debug.Print myClass.MyData("A")
End Sub
这里显而易见的是,VBA不会在类的内部TypeInfo中将公共字段Public MyData As Dictionary
公开为Property Get
,或者将其声明为字段而不是{{1} }混淆了VBA的运行时绑定程序。
不幸的是,我没有访问检查内部VBA TypeInfos ATM的工具,但是我可以在可用时使用更多信息来更新此答案...
答案 1 :(得分:1)
由于myData
是Dictionary
对象,因此您必须使用Dictionary
类方法向其中添加元素
使用:
myClass.MyData.Add "A", 1
因此:
Sub Test()
Dim myClass As New cMyClass
myClass.MyData.Add "A", 1
Debug.Print myClass.MyData("A")
End Sub