我在VBA(Access)中有一个自定义类模块,它应该处理大量的外部数据。目前我有两个功能Read(name)
和Write(name, value)
,它允许读取和设置动态属性。VBA中的动态属性名称
有没有一种方法来定义更多的句法方式来读取和写入这些数据?我知道VBA中的某些对象有一种访问数据的特殊方式,例如RecordSet
,它允许使用myRS!property_name
来读取和设置数据。有没有办法为自定义类模块完全相同?
我在VBA(Access)中有一个自定义类模块,它应该处理大量的外部数据。目前我有两个功能Read(name)
和Write(name, value)
,它允许读取和设置动态属性。VBA中的动态属性名称
有没有一种方法来定义更多的句法方式来读取和写入这些数据?我知道VBA中的某些对象有一种访问数据的特殊方式,例如RecordSet
,它允许使用myRS!property_name
来读取和设置数据。有没有办法为自定义类模块完全相同?
好了,感谢阿兰和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]
请注意,您必须添加Attribute Value.VB_UserMemId = 0
在其他一些编辑器比VBA编辑器附带的Microsoft Office,作为一个因为某些原因隐藏了Attribute
指令..您可以轻松导出模块,在记事本中打开它,添加指令并将其导回到VBA编辑器中。只要您不会对默认成员进行太多更改,则不应删除该指令(只要确保您不时在外部编辑器中进行检查)。
看到这个其他问题:Bang Notation and Dot Notation in VBA and MS-Access
咣当操作者是简写的集合 访问成员或 其他枚举对象
如果你让你的类扩展集合(!)在VBA课程,那么你应该能够利用这些运营商。在下面的问题是谁扩展集合类用户的例子: Extend Collections Class VBA
感叹号语法用于访问Scripting.Dictionary
实例的成员(你需要通过工具>引用添加引用Microsoft Scripting Runtime
第一)。要使用这种合成,你需要将信息内部存储在字典中。
在一个类中使用它的最快方法是给你的类Scripting.Dictionary
类型的对象变量,并将其设置如下:使用myinstance.IntData!MyProperty = 1
Option Explicit
Dim d As Scripting.Dictionary
Private Sub Class_Initialize()
Set d = New Scripting.Dictionary
End Sub
Private Sub Class_Terminate()
Set d = Nothing
End Sub
Public Property Get IntData() As Scripting.Dictionary
Set IntData = d
End Property
现在您可以访问属性...但去你想成为你需要使用Charlie Pearson's technique为IntData
你的班级的默认成员。
一旦这样做了,你可以用下面的语法:
Dim m As MyClass
Set m = New MyClass
Debug.Print "Age = " & m!Age ' prints: Age =
m!Age = 27
Debug.Print "Age = " & m!Age ' prints: Age = 27
Set m = Nothing
好的,到目前为止感谢..但有没有任何方式使用这个没有底层字典/集合?我的数据来自XML文件,我想使用的索引键部分基于路径。 – poke 2011-01-26 18:03:00