我在Access应用程序中使用VBA,我希望有一个包含不同数据类型值的n元组对象。然后我想要这些对象的集合。
如果我在javascript中这样做,它看起来像:
var myStructure = {
name: "blah"
age: 33
moreStuff : "test"
};
然后我需要一个myStructure的集合。我怎样才能在VBA中做到最好?
答案 0 :(得分:9)
您可以使用以下代码定义自己的变量类型:
Public T_Person as Type
name as string
dateOfBirth as date
....
email() as string (*)
....
End type
然后,您可以使用以下代码在代码中声明T_person类型:
Dim currentPerson as T_Person
currentPerson.name = myName
currentPerson.dateOfBirth = myDate
currentPerson.email(1) = myFirstEmail
....
(*)我不记得在这种情况下声明数组的细节。在定义变量时,您可能必须确定数组的长度。请检查帮助。
通过声明一个名为“Person”的类模块也可以达到相同的结果。在这个类模块中,您不仅可以跟踪objet属性(例如name,dateOfBirth等),还可以跟踪对象事件(初始化和删除)。您还可以在此对象上创建方法。您的代码将如下所示:
Dim myPerson as Person
set myPerson = New Person
myPerson.name = myName
myPerson.dateOfBirth = myDate
if myPerson.age > 18 then (*)
'the guy is an adult'
myPerson.createAccount
Else
'the guy is not ...'
Endif
(*)这里,age是您的对象的计算出的proerty,当dateOfBirth不为null时可用。请谷歌“VBA类模块”,以找到在VBA中实现类模块的不同示例。
现在,如果你想管理类似“对象”(这里是人物)的集合,你将不得不为对象集合创建一个类模块(例如“Persons”类模块)和利用VBA中提供的“Collection”对象。然后,您将以2个不同的类模块结束:Person(将保留每个人的详细信息)和Persons(将保存人员集合)。然后你就可以得到这样的代码:
Public myPersons as Persons 'at the app level, 1 main collection'
myPersons.add .... 'adding a new person to your collection'
myPersons.count ... 'counting number of persons in myPersons'
请在“VBA集合对象”上搜索有关VBA中集合管理的示例。检查我的代码提案,因为这是动态编写的,没有VBA帮助文件。
“类”解决方案显然更强大,但比“类型”更复杂。如果你需要它,去吧。这绝对值得痛苦!
PS:我对这里的命名不满意,因为在处理myPersons集合和my Person对象的myPerson实例时,这会导致代码非常混乱。我建议你找一个更明显的,比如“PersonCollection”和“Person”,甚至是“个人”
答案 1 :(得分:4)
您可以使用Variant多维数组来存储集合。变体可以存储任何数据类型,使其非常通用。
Const Name as Integer = 0
Const Age as Integer = 1
Const moreStuff as Integer = 2
Dim myStructure as Variant
Redim myStructure(0 to 2, 0 to n)
myStructure(Name, 0) = "Blah"
myStructure(Age, 0) = 33
myStructure(moreStuff, 0) = "test"
注意:您只能在VBA中展开多维数组的最后一个维度并保留这些值,因此请确保它适用于您要缩放的维度。
这是基本的数据结构,您可以开发一个或多个类来包装所有内容以满足您的需求。
答案 2 :(得分:1)
Collection类是一个选项。
Dim col As New Collection
col.Add("blah", "name")
col.Add(33, "age")
col.Add("test", "moreStuff")
这为您提供了最大的灵活性。但是它效率不高,而且Collection类无法获取键列表。
答案 3 :(得分:0)
您可能还想查看Scripting.Dictionary对象,但我已经读过它被认为是不安全的。它比使用类型定义更具动态性,与Collection不同,它使您可以访问键。
以下是一个示例:
Public Function TestDictionary()
Dim d As New Scripting.Dictionary 'need reference to Microsoft Scripting Runtime
'Dim d As Object
'Set d = CreateObject("Scripting.Dictionary")
Dim k As Variant
d.Add "Banana", "Yellow"
d.Add "Apple", "Red"
d.Add "Grape", "Green"
For Each k In d.Keys
Debug.Print k; ": "; d.Item(k)
Next k
End Function