Объект стиля кортежа в VBA - PullRequest
7 голосов
/ 04 февраля 2010

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

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

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

Теперь, если вы хотите управлять коллекцией похожих «объектов» (здесь, Persons), вам нужно будет создать модуль класса для вашей коллекции объектов (например, модуль класса «Persons») использовать объект "Коллекция", доступный в VBA. Затем вы закончите двумя различными классными модулями: Person (будет содержать данные о каждом человеке) и Persons (будет содержать коллекцию Person). После этого вы сможете получить такой код:

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

Решение «Класс» явно более мощное, но более сложное, чем «Тип». Сделайте это, если вам это нужно. Это определенно стоит боли!

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

4 голосов
/ 04 февраля 2010

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

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

1 голос
/ 08 февраля 2010

Класс Collection является опцией.

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

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

0 голосов
/ 27 апреля 2011

Возможно, вы захотите заглянуть в объект Scripting.Dictionary, хотя я читал, что он считается небезопасным. Он более динамичен, чем использование определений типов, и, в отличие от 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...