Вложенное перечисление VB (VBA)

Хорошо, ребята, я хотел бы добиться эффекта вложенного перечисления для удобной группировки некоторых строк-констант. Что-то вроде псевдокода ниже:

Enum gKS
    Colby = "Hello"
    Hays = "World"
end Enum

Enum gMA
    Dodge = "Seven"
    Muscatine = "Ports"
end Enum

Enum gCountry
    north as gMA
    south as gKS
end Enum

Public USA as gCountry

Таким образом, приведенный ниже код должен вывести сообщение «Seven»:

sub dol()
    msgbox USA.north.Dodge
end sub

Я не хочу использовать типы или классы, потому что инициализация не требуется, поскольку все значения известны (константы, как я уже сказал).

Какие-либо предложения?

спасибо.


person Paulo Bueno    schedule 12.05.2011    source источник
comment
В чем вы используете свой VBA (например, Excel, Access)? Вы можете создавать модули классов, не требуя установки   -  person Thomas    schedule 13.05.2011
comment
Нет не могу. На самом деле все ваши примеры объявлений Enum недопустимы в VBA. Элементы Enum могут принимать только значения Long (Integer). См. ответ YYY для полезного предложения.   -  person RolandTumble    schedule 13.05.2011
comment
Томас: я использую для этого Excel VBA. И Роланд, код выше - это "псевдокод"...   -  person Paulo Bueno    schedule 13.05.2011


Ответы (3)


Классы способ пойти на это. Перечисления — это просто длинные значения, где требуется ограниченный выбор. Это обеспечит наибольшую гибкость с вашими объектами, если вам нужно, чтобы эти объекты имели другие функции/подпрограммы.

Вот простой макет:

Класс gCountry:

Public North As gMA
Public South As gKS

Private Sub Class_Initialize()
    Set North = New gMA
    Set South = New gKS
End Sub

Класс ГКС:

Public Property Get Colby() As String
    Colby = "Hello"
End Property

Public Property Get Hays() As String
    Hays = "World"
End Property

Класс GMA:

Public Property Get Dodge() As String
    Dodge = "Seven"
End Property

Public Property Get Muscatine() As String
    Muscatine = "Ports"
End Property

Тестирование:

Public Sub TestIt()

    Dim USA As New gCountry

    MsgBox USA.North.Dodge
End Sub
person Fink    schedule 13.05.2011
comment
Да... Классы можно использовать, но будут десятки разных классов, а обслуживание кода с помощью vba ide нецелесообразно. - person Paulo Bueno; 13.05.2011
comment
Я не понимаю вашей логики, как типы или перечисления более практичны, чем классы для четко определенных отдельных объектов? - person Fink; 13.05.2011
comment
Финк, просто потому, что я хочу избежать всех этих вызовов "общественное достояние". Ниже я нашел только то, что мне нужно, кроме того, что это не самое элегантное решение, которое пока работает нормально. - person Paulo Bueno; 05.07.2011

Я не верю, что вы сможете делать встроенные перечисления так, как вы надеетесь, потому что перечисления считаются примитивами в среде CLR (источник). Вы также можете попытаться встроить целые числа в целые числа.

Я понимаю, вы сказали, что не хотите использовать классы, но это своего рода ситуации, когда статические классы предназначены для заполнения мира .NET. Он будет легко и произвольно доступен без инициализации и быстро при компиляции. Эта страница содержит дополнительную информацию о статике если вы не знакомы с ними. Вы должны иметь возможность делать все, что вам нужно, чтобы настроить информацию в этом классе так, как вы хотите, будь то несколько статических классов, хэш-таблица, многомерный массив или что-то еще.

person tmesser    schedule 12.05.2011
comment
Не могу сделать это с помощью классов по двум причинам: во-первых, в VBA пока нет статических классов. Во-вторых, чтобы сделать это таким образом, мне пришлось бы создать совершенно новый класс для каждого объекта страны. - person Paulo Bueno; 13.05.2011

СПАСИБО,

Так. я решил решить эту проблему, используя типы:

    Public Type fCAOCC
        itRGI As String
        ...
    End Type
    Public Type fCAOBF
        itRGI As String
        ibEnviar As String
        ...
    End Type
    Public Type gTELAS
        CAOBF As fCAOBF
        CAOCC As fCAOCC
        ...
    End Type

    Public CSI As gTELAS

    Sub iniGLOBALS()
        CSI.CAOBF.itRGI = "DIVNRRGILIG"
        CSI.CAOBF.ibEnviar = "DUMMYNAME1"
        CSI.CAOCC.itRGI = "Hello"
...
    End Sub

И это готово для последующего использования в коде...

Циа

person Paulo Bueno    schedule 13.05.2011