2011-01-26 93 views
6

我在VBA(Access)中有一个自定义类模块,它应该处理大量的外部数据。目前我有两个功能Read(name)Write(name, value),它允许读取和设置动态属性。VBA中的动态属性名称

有没有一种方法来定义更多的句法方式来读取和写入这些数据?我知道VBA中的某些对象有一种访问数据的特殊方式,例如RecordSet,它允许使用myRS!property_name来读取和设置数据。有没有办法为自定义类模块完全相同?

回答

4

好了,感谢阿兰和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编辑器中。只要您不会对默认成员进行太多更改,则不应删除该指令(只要确保您不时在外部编辑器中进行检查)。

6

感叹号语法用于访问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 techniqueIntData你的班级的默认成员。

一旦这样做了,你可以用下面的语法:

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 
+0

好的,到目前为止感谢..但有没有任何方式使用这个没有底层字典/集合?我的数据来自XML文件,我想使用的索引键部分基于路径。 – poke 2011-01-26 18:03:00