VBA中的元组样式对象

时间:2010-02-03 23:21:30

标签: ms-access vba

我在Access应用程序中使用VBA,我希望有一个包含不同数据类型值的n元组对象。然后我想要这些对象的集合。

如果我在javascript中这样做,它看起来像:

var myStructure = {
   name: "blah"
   age: 33
   moreStuff : "test"
};

然后我需要一个myStructure的集合。我怎样才能在VBA中做到最好?

4 个答案:

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