Я использую VBA в приложении Доступа, и я хотел бы иметь объект n-кортежа, который содержит значения различных типов данных. Затем я хотел бы набор тех объектов.
Если бы я делал это в JavaScript, то он был бы похож:
var myStructure = {
name: "blah"
age: 33
moreStuff : "test"
};
И затем мне был бы нужен набор myStructure. Как я могу лучше всего выполнить это в VBA?
Вы можете определить свой собственный тип переменной с помощью кода, например:
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"
Вы можете использовать многомерные массивы 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 можно развернуть только последнее измерение многомерного массива и сохранить значения, поэтому убедитесь, что оно соответствует измерению, которое вы хотите масштабировать.
Это основная структура данных, и вы можете разработать класс или функции, чтобы обернуть все в соответствии с вашими потребностями.
Класс Collection - это опция.
Dim col As New Collection
col.Add("blah", "name")
col.Add(33, "age")
col.Add("test", "moreStuff")
Это дает вам максимальную гибкость. Однако это не очень эффективно, и класс Collection не может получить список ключей.