gpt4 book ai didi

excel - 有没有办法计算 VBA 枚举中的元素数量?

转载 作者:行者123 更新时间:2023-12-02 05:23:38 29 4
gpt4 key购买 nike

是否有正确的方法来计算 VBA 中枚举的元素?目前,我在下面的示例中保留了一个枚举值,例如 KeepThisOneHere

Enum TestEnum
ValueA
ValueB
ValueC
KeepThisOneHere
End Enum

我使用最后一个值来了解大小...我不喜欢这个解决方案,因为我不确定我是否能保证这些值始终以相同的方式索引,并且代码可能会被更改第三方可能会在最后一个特殊值之后添加值,从而默默地破坏代码的其余部分。

最佳答案

不确定这里的礼仪,所以我会发布它,如果有建议,我会回来删除它。 Chip Pearson 在 Code Cage 论坛 ( http://www.thecodecage.com/forumz/microsoft-excel-forum/170961-loop-enumeration-constants.html ) 上发布了此代码。我的机器上没有 TypeLinInfo DLL,所以我无法测试它(我确信 google 会找到下载 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

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

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

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

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

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

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

如果为 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

诚挚地,奇普· PIL 森微软 MVP 1998 - 2010 PIL 逊软件咨询有限责任公司www.cpearson.com[网站上的电子邮件]

关于excel - 有没有办法计算 VBA 枚举中的元素数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16193458/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com