Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tuple style object in VBA

Tags:

vba

ms-access

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?

like image 737
ChrisDiRulli Avatar asked Feb 03 '10 23:02

ChrisDiRulli


1 Answers

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

Public Type T_Person
    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"

like image 143
Philippe Grondier Avatar answered Sep 20 '22 19:09

Philippe Grondier