不知道这里的礼仪,所以我会发布它,如果建议,我会回来删除它。 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
使用这方面的知识,您可以创建两个有用的功能。 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
你会调用该函数的代码,如:
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
如果值被定义F该函数返回真或EnumGroupName或 如果未定义,则为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
亲切, 芯片皮尔逊 微软MVP 1998 - 2010 皮尔逊软件咨询,LLC www.cpearson.com [在网站上的电子邮件]
在我看来,这是为了从Excel类型信息中提取数据,这些数据适用于Excel类型,但不适用于用户定义的类型。 – Geoff 2013-04-24 14:37:41
这一行:'Set TLILibInfo = New TLI.TypeLibInfo'是多余的。每次使用它时,都会在下一行中分配一个全新的对象。 – mielk 2017-05-27 21:54:20