Search code examples
ms-accessvba

Tuple style object in VBA


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?


Solution

  • 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"