与 .NET 语言不同,VBA 不会将 Enum 公开为文本。它严格来说是一个数字,并且没有 .ToString() 方法可以公开 Enum 的名称。可以创建自己的 ToString() 方法并返回枚举的字符串表示形式。也可以enumerate an Enum type。虽然一切都是可以实现的,但我不建议这样做,因为对于这样一个单一的任务来说事情过于复杂了。
您如何创建项目的 Dictionary 集合并简单地使用 Exist 方法和某种错误处理(或简单的 if/else 语句)来检查输入中是否有任何用户输入框存在于您的列表中。
例如:
Sub Main()
Dim myList As Object
Set myList = CreateObject("Scripting.Dictionary")
myList.Add "item1", 1
myList.Add "item2", 2
myList.Add "item3", 3
Dim userInput As String
userInput = InputBox("Type something:")
If myList.Exists(userInput) Then
MsgBox userInput & " exists in the list"
Else
MsgBox userInput & " does not exist in the list"
End If
End Sub
注意:如果您添加对Microsoft Scripting Runtime 库的引用,那么您将能够将智能感知与myList 对象一起使用,因为它会被早期绑定替换
Dim myList As Object
Set myList = CreateObject("Scripting.Dictionary")
与
Dim myList as Dictionary
Set myList = new Dictionary
这取决于您想采用哪种方式以及哪种方式更方便。请注意,如果您使用后期绑定,则不需要添加引用,而如果您希望使用智能感知进行早期绑定,则需要引用。
为了让读者能够使用 Enum 可视化版本,让我演示一下这种机制是如何工作的
Enum EList
item1
item2
item3
[_Min] = item1
[_Max] = item3
End Enum
Function ToString(eItem As EList) As String
Select Case eItem
Case EList.item1
ToString = "item1"
Case EList.item2
ToString = "item2"
Case EList.item3
ToString = "item3"
End Select
End Function
Function Exists(userInput As String) As Boolean
Dim i As EList
For i = EList.[_Min] To EList.[_Max]
If userInput = ToString(i) Then
Exists = True
Exit Function
End If
Next
Exists = False
End Function
Sub Main()
Dim userInput As String
userInput = InputBox("type something:")
MsgBox Exists(userInput)
End Sub
首先您将您的 List 声明为 Enum。为了使示例尽可能简单,我只添加了 3 个项目。 [_Min] 和 [_Max] 表示 enum 的最小值和最大值(可以调整它,但同样,让我们暂时保持简单)。您声明它们都能够迭代您的EList。
ToString() 方法返回 Enum 的字符串表示形式。任何 VBA 开发人员都会在某些时候意识到 VBA 缺少作为内置功能的这一点太糟糕了。无论如何,您现在已经有了自己的实现。
Exists 采用 userInput 存储的任何内容,并在迭代枚举时 EList 匹配您的枚举的字符串表示形式。这是一种矫枉过正,因为您需要调用许多方法并遍历枚举,以便能够一次性实现简单的Dictionary 的Exists 方法所做的事情。这主要是为什么我不建议针对您的特定问题使用 Enums。
最后你得到Main sub,它简单地收集来自用户的输入并调用Exists 方法。它显示一个带有 true 或 false 的消息框,指示字符串是否作为 Enum 类型存在。