【问题标题】:Nested VB (VBA) Enumeration嵌套 VB (VBA) 枚举
【发布时间】:2011-05-12 22:00:21
【问题描述】:

好的,伙计们,我想实现嵌套枚举的效果,以便于对一些常量字符串进行分组。类似于下面的伪代码:

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

我不想使用类型或类,因为不需要初始化,因为所有值都是已知的(如我所说的常量)。

有什么建议吗?

谢谢。

【问题讨论】:

  • 您在什么地方使用您的 VBA(即 Excel、Access)?无需安装即可创建类模块
  • 不行。事实上,您的所有示例 Enum 声明在 VBA 中都是非法的。 Enum 元素可以采用的唯一值是 Long(整数)。请参阅 YYY 的回答以获取有用的建议。
  • Thomas:我正在使用 Excel VBA。而 Roland 上面的代码是一个‘伪’代码……

标签: class vba enums enumeration


【解决方案1】:

课程是解决这个问题的方法。枚举只是长值,需要有限的选择。这将为您的对象提供最大的灵活性,以防您需要这些对象具有其他功能/子。

这是一个简单的布局:

gCountry 类:

Public North As gMA
Public South As gKS

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

gKS 类:

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

【讨论】:

  • 是的...类可以使用,但是会有几十个不同的类,使用vba ide无法维护代码。
  • 我不明白你的逻辑,对于明确定义的单独对象,类型或枚举比类更实用吗?
  • Fink,只是因为我想避免所有那些“公共财产获取”电话。我在下面找到了我需要的东西,除了它不是最优雅的解决方案,它到目前为止工作正常。
【解决方案2】:

我不相信您能够按照您希望的方式进行嵌入式枚举,因为枚举在 CLR 中被视为原语 (source)。您也可以尝试在 int 中嵌入 int。

我知道您说过您不想使用类,但这是静态类旨在填充 .NET 世界的那种情况。无需初始化即可轻松任意访问,编译时快速。 This page 有更多关于静态的信息,如果你不熟悉的话。您应该能够做任何您需要做的事情,以在该类中按照您想要的方式设置信息,无论是多个静态类、哈希表、多维数组,还是您拥有的任何东西。

【讨论】:

  • 不能使用类来做这件事有两个原因:第一,到目前为止 VBA 上没有静态类。第二次这样做,我必须为每个“国家”对象创建一个全新的类。
【解决方案3】:

谢谢,

所以。我决定使用类型来解决这个问题:

    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

这已准备好以后在代码中使用...

嘿嘿

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多