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

Я использую VBA в приложении Доступа, и я хотел бы иметь объект n-кортежа, который содержит значения различных типов данных. Затем я хотел бы набор тех объектов.

Если бы я делал это в JavaScript, то он был бы похож:

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

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

7
задан Joel Coehoorn 12 May 2012 в 18:48
поделиться

3 ответа

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

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". В этом модуле класса вы сможете отслеживать не только свойства объекта (такие как имя, дата рождения и т.д.), но и события объекта (инициализация и удаление). Вы также сможете создавать методы для этого объекта. Тогда ваш код будет выглядеть так:

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

(*) Здесь возраст - это вычисляемое свойство вашего объекта, доступное, когда дата рождения не равна null. Пожалуйста, погуглите "модуль класса VBA", чтобы найти различные примеры реализации модуля класса в VBA.

Теперь, если вы хотите управлять коллекцией похожих "объектов" (здесь, персоны), вам придется пройти через создание модуля класса для вашей коллекции объектов (например, модуль класса "Persons") и воспользоваться объектом "Collection", доступным в VBA. В итоге у вас будет 2 разных модуля класса: Person (будет содержать подробную информацию о каждом человеке) и Persons (будет содержать коллекцию 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 collection object" для примеров по управлению коллекциями в VBA. Проверьте мое предложение кода, так как оно было написано на ходу и без файла справки VBA.

Решение "Class" явно более мощное, но более сложное, чем "Type". Если оно вам необходимо, воспользуйтесь им. Это определенно стоит боли!

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

9
ответ дан 6 December 2019 в 14:04
поделиться

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

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

4
ответ дан 6 December 2019 в 14:04
поделиться

Класс Collection - это опция.

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

Это дает вам максимальную гибкость. Однако это не очень эффективно, и класс Collection не может получить список ключей.

1
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: