tags:

views:

268

answers:

3

I'm using VBA in an Access application and I would like to have a n-tuple object that contains values of different data types. Then I would like a collection of those objects.

If I was doing this in javascript it would look like:

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

And then I would need a collection of myStructure. How can I best accomplish this in VBA?

+1  A: 

You can use Variant multidimensional arrays to store your collections. Variants can store any data type making it very versatile.

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"

Note: You can only expand the last dimension of a multidimensional array in VBA and preserve the values, so make sure that it is for the dimension you want to scale.

That is the basic data structure and you can develop a class or functions to wrap everything up to suit your needs.

BrianZ
+3  A: 

You can define your own variable type with code such as:

Public T_Person as Type
    name as string
    dateOfBirth as date
    ....
    email() as string (*)
    ....
End type

You can then declare a T_person type in your code with:

Dim currentPerson as T_Person

currentPerson.name = myName
currentPerson.dateOfBirth = myDate
currentPerson.email(1) = myFirstEmail
....

(*) I do not remember the details for declaring arrays in such circumstances. You might have to determine array's length when defining the variable. Please check help.

The same result can also be reached by declaring a class module named, for example, "Person". In this class module, you'll be not only able to follow the objet properties (such as name, dateOfBirth, etc), but also object events (initialisation and deletion). You'll be also able to create methods on this object. You code would then look like:

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

(*) Here, age is a calculated proerty of your object, available when dateOfBirth is not null. Please google "VBA class module" to find different examples for the implementation of a class module in VBA.

Now, if you want to manage a collection of similar "objects" (here, Persons), you will have to go through the creation of a class module for your objects collection (a "Persons" class module for example) and make use of the "Collection" objet available in VBA. You will then end with 2 different class modules: Person (will hold each person's detail), and Persons (will hold the collection of Persons). You'll then be able to have code like this:

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'

Please google on "VBA collection object" for examples on Collection management in VBA. Check my code proposal, as this was written on the fly, and without VBA help file.

The "Class" solution is clearly more powerfull, but more complex than the "Type". Go for it if you need it. It is definitely worth the pain!

PS: I am not very happy with my namings here, as this can lead to very confusing code when dealing with the myPersons collection and myPerson instance of o Person object. I'd advise you to find a more obvious one, like "PersonCollection" and "Person", or even "Individual"

Philippe Grondier
A: 

The Collection class is an option.

Dim col As New Collection
col.Add("blah", "name")
col.Add(33, "age")
col.Add("test", "moreStuff")

This gives you the most flexibility. However it isn't very efficient and the Collection class has no way to get a list of keys.

Foole
Collections are actually extremely fast, but in this case, the entity has more than two attributes, so it's not possible to use a collection for it.
David-W-Fenton