访问班级中的公共词典

时间:2018-10-26 10:15:25

标签: excel vba

这是一个基础课:

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

2 个答案:

答案 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)

由于myDataDictionary对象,因此您必须使用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