Объект стиля кортежа в VBA

Я использую VBA в приложении Access, и я хотел бы иметь Объект N-tuple, который содержит значения разных типов данных. Тогда мне нужна коллекция этих предметов.

Если бы я делал это в javascript, это выглядело бы так:

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

и тогда мне понадобится коллекция myStructure. Как я могу лучше всего выполнить это в VBA?

4 ответов


вы можете определить свой собственный тип переменной в таком коде:

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-Это рассчитанный показатель вашего объекта, доступный, когда dateOfBirth не равен null. Пожалуйста, google "VBA class module", чтобы найти различные примеры для реализации модуля класса в VBA.

теперь, если вы хотите управлять коллекцией аналогичные " объекты "(здесь, Persons), вам придется пройти через создание модуля класса для вашей коллекции объектов (например, модуль класса" Persons") и использовать объект" Collection", доступный в VBA. Затем вы закончите с 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'

пожалуйста, google на "VBA collection object" для примеров по сбору управление в VBA. Проверьте мое предложение кода, так как это было написано на лету и без файла справки VBA.

решение "класса "явно более мощное, но более сложное, чем"Тип". Иди за ней, если она тебе нужна. Это определенно стоит боли!

PS: Я не очень доволен своими именами здесь, так как это может привести к очень запутанному коду при работе с коллекцией myPersons и экземпляром myperson объекта o Person. Я бы посоветовал вам найти более очевидный, как "PersonCollection "и" Person", или даже"Individual"


для хранения коллекций можно использовать многомерные массивы 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 и сохранить значения, поэтому убедитесь, что это для измерения, которое вы хотите масштабировать.

это базовая структура данных, и вы можете разработать класс или функции, чтобы обернуть все в соответствии с вашими потребностями.


класс сборник вариант.

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

Это дает вам максимальную гибкость. Однако это не очень эффективно, и класс 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