好的,感谢 Alain 和 KyleNZ,我现在找到了一种可行的方法来做到这一点,而下面没有集合或可枚举的对象。
基本上,多亏了 !运算符,我发现,通过 bang/pling 运算符进行的访问等同于访问对象的默认成员。如果属性Value 是我的类模块的默认成员,那么有三个等效语句可以访问该属性:
obj.Value("param")
obj("param")
obj!param
因此,要为自定义类模块制作简短的语法,只需定义一个默认成员即可。例如,我现在使用了以下Value 属性:
Property Get Value(name As String) As String
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
通常,您现在可以像这样访问它:
obj.Value("foo") = "New value"
MsgBox obj.Value("foo")
现在要使该属性成为默认成员,您必须在属性定义中添加一行:
Attribute Value.VB_UserMemId = 0
所以,我最终得到了这个:
Property Get Value(name As String) As String
Attribute Value.VB_UserMemId = 0
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
Attribute Value.VB_UserMemId = 0
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
然后,这可以工作并且等效于上面显示的代码:
obj("foo") = "New value"
MsgBox obj("foo")
' As well as
obj!foo = "New value"
MsgBox obj!foo
' Or for more complex `name` entries (i.e. with invalid identifier symbols)
obj![foo] = "New value"
MsgBox obj![foo]
请注意,除了 Microsoft Office 附带的 VBA 编辑器之外,您必须在其他编辑器中添加 Attribute Value.VB_UserMemId = 0,因为该编辑器由于某种原因隐藏了 Attribute 指令。您可以轻松导出模块,在其中打开它记事本,添加指令,然后将其导入 VBA 编辑器。只要您不对默认成员进行太多更改,就不应删除该指令(只需确保不时在外部编辑器中检查即可)。