有没有办法计算VBA枚举中的元素?

BuZ*_*uZz 6 excel enums vba

是否有适当的方法来计算VBA中枚举的元素?目前,我留下了枚举值KeepThisOneHere,如下例所示

Enum TestEnum
   ValueA
   ValueB
   ValueC
   KeepThisOneHere
End Enum
Run Code Online (Sandbox Code Playgroud)

我使用最后一个值来知道大小...我不喜欢这个解决方案,因为我不确定我是否保证值将始终以相同方式编入索引,并且代码可能会被第三方更改可能会在最后一个特殊的值之后添加值,默默地打破剩下的代码.

sou*_*817 5

在这里的礼仪上不确定,所以我会发布它,如果建议,我会回来删除它.Chip Pearson在Code Cage论坛上发布了这段代码(http://www.thecodecage.com/forumz/microsoft-excel-forum/170961-loop-enumeration-constants.html).我的机器上没有TypeLinInfo DLL,所以我无法测试它(我确定谷歌会出现下载TLBINF32.dll的地方).尽管如此,这是他的全部帖子,以保存其他人注册论坛:

只有在计算机上安装了TypeLibInfo DLL时,才能执行此操作.在VBA中,转到"工具"菜单,选择"引用",然后向下滚动到"TypeLib Info".如果此项目存在,请检查它.如果它不存在,那么退出阅读因为你不能做你想做的事.您需要的DLL的文件名是TLBINF32.dll.

以下代码显示了如何获取XLYesNoGuess枚举中的名称和值:

Sub AAA()
    Dim TLIApp As TLI.TLIApplication
    Dim TLILibInfo As TLI.TypeLibInfo
    Dim MemInfo As TLI.MemberInfo
    Dim N As Long
    Dim S As String
    Dim ConstName As String

    Set TLIApp = New TLI.TLIApplication
    Set TLILibInfo = New TLI.TypeLibInfo
    Set TLILibInfo = TLIApp.TypeLibInfoFromFile( _
        ThisWorkbook.VBProject.References("EXCEL").FullPath)

    ConstName = "XLYesNoGuess"
    For Each MemInfo In _
        TLILibInfo.Constants.NamedItem(ConstName).Members
        S = MemInfo.Name
        N = MemInfo.Value
        Debug.Print S, CStr(N)
    Next MemInfo
End Sub
Run Code Online (Sandbox Code Playgroud)

使用这些知识,您可以创建两个有用的功能.EnumNames返回一个字符串数组,其中包含枚举中值的名称:

Function EnumNames(EnumGroupName As String) As String()
    Dim TLIApp As TLI.TLIApplication
    Dim TLILibInfo As TLI.TypeLibInfo
    Dim MemInfo As TLI.MemberInfo
    Dim Arr() As String
    Dim Ndx As Long
    Set TLIApp = New TLI.TLIApplication
    Set TLILibInfo = New TLI.TypeLibInfo
    Set TLILibInfo = TLIApp.TypeLibInfoFromFile( _
        ThisWorkbook.VBProject.References("EXCEL").FullPath)
    On Error Resume Next
    With TLILibInfo.Constants.NamedItem(EnumGroupName)
        ReDim Arr(1 To .Members.Count)
        For Each MemInfo In .Members
            Ndx = Ndx + 1
            Arr(Ndx) = MemInfo.Name
        Next MemInfo
    End With

    EnumNames = Arr
End Function
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码调用此函数:

Sub ZZZ()
    Dim Arr() As String
    Dim N As Long
    Arr = EnumNames("XLYesNoGuess")
    For N = LBound(Arr) To UBound(Arr)
        Debug.Print Arr(N)
    Next N
End Sub
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个函数来测试是否为枚举定义了一个值:

Function IsValidValue(EnumGroupName As String, Value As Long) As
    Boolean
    Dim TLIApp As TLI.TLIApplication
    Dim TLILibInfo As TLI.TypeLibInfo
    Dim MemInfo As TLI.MemberInfo
    Dim Ndx As Long
    Set TLIApp = New TLI.TLIApplication
    Set TLILibInfo = New TLI.TypeLibInfo
    Set TLILibInfo = TLIApp.TypeLibInfoFromFile( _
        ThisWorkbook.VBProject.References("EXCEL").FullPath)
    On Error Resume Next
    With TLILibInfo.Constants.NamedItem(EnumGroupName)
        For Ndx = 1 To .Members.Count
            If .Members(Ndx).Value = Value Then
                IsValidValue = True
                Exit Function
            End If
        Next Ndx
    End With
    IsValidValue = False
End Function
Run Code Online (Sandbox Code Playgroud)

如果为EnumGroupName定义了Value,则此函数返回True;如果未定义,则返回False.您可以使用以下代码调用此函数:

Sub ABC()
    Dim B As Boolean
    B = IsValidValue("XLYesNoGuess", xlYes)
    Debug.Print B ' True for xlYes
    B = IsValidValue("XLYesNoGuess", 12345)
    Debug.Print B ' False for 12345
End Sub
Run Code Online (Sandbox Code Playgroud)

亲切地,Chip Pearson Microsoft MVP 1998 - 2010 Pearson Software Consulting,LLC www.cpearson.com [网站上的电子邮件]

  • 在我看来,这旨在从 Excel 类型信息中提取数据,这适用于 Excel 类型,但不适用于用户定义的类型。 (2认同)