- 我必须根据项目列表检查一条用户输入;如果输入位于项目列表中,则将流程指向一个方向。如果没有,请将流量指向另一个流量。
- 这个清单是 不 工作表本身可见;它必须在代码下进行混淆。
我想到了两种策略:
- 声明为
enum
并检查输入是否属于此enum
虽然我不确定这个的语法 - 我是否需要初始化enum
每次我想用它? - 声明为数组并检查输入是否是此数组的一部分。
我想知道VBA哪个在效率和可读性方面更好?
我想到了两种策略:
enum
并检查输入是否属于此 enum
虽然我不确定这个的语法 - 我是否需要初始化 enum
每次我想用它?我想知道VBA哪个在效率和可读性方面更好?
与.NET语言不同,VBA不会将Enum公开为文本。它严格来说是一个数字,没有 .ToString()
将公开Enum名称的方法。可以创建自己的 ToString()
方法并返回枚举的String表示形式。它也有可能 枚举枚举类型。虽然所有这些都是可以实现的,但我不建议这样做,因为对于这样的单个任务而言过于复杂。
如何创建项目的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
这取决于你想要采用哪种方式以及更方便的方式。请注意,如果您使用Late Binding,则不需要添加引用,如果您希望使用智能早期绑定,则需要引用。
只是为了让读者能够使用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
首先你宣布你的 名单 作为Enum。我只为示例添加了3个项目,以尽可能简单。 [_Min]
和 [_Max]
表示枚举的最小值和最大值(有可能再调整一下,让我们现在保持简单)。你声明它们都能够迭代你的 EList
。
ToString()
method返回Enum的String表示形式。任何VBA开发人员都会在某种程度上意识到VBA太糟糕了,因为它是一个内置功能。无论如何,你现在有了自己的实现。
Exists
拿什么 userInput
存储并迭代Enum EList
匹配Enum的String表示形式。这是一种矫枉过正,因为你需要调用许多方法并循环遍历枚举才能实现简单 Dictionary
的 Exists
方法一气呵成。这主要是为什么我不建议您使用Enums来解决您的具体问题。
然后你最终得到了 Main
sub只是收集用户的输入并调用 Exists
方法。它显示了一个消息框 true
要么 false
表示String是否作为枚举类型存在。
您可以运行一个简单的数组测试,如下所示:将单词添加到单个列表中:
Sub Main1()
arrList = Array("cat", "dog", "dogfish", "mouse")
Debug.Print "dog", Test("dog") 'True
Debug.Print "horse", Test("horse") 'False
End Sub
Function Test(strIn As String) As Boolean
Test = Not (IsError(Application.Match(strIn, arrList, 0)))
End Function
或者,如果您想进行更详细的搜索并返回子字符串匹配列表以供进一步工作,请使用 Filter
。此代码将返回以下内容 vFilter
如果抬头 dog
狗,鲨鱼
在这种特殊情况下,代码然后检查完全匹配 dog
。
Sub Main2()
arrList = Array("cat", "dog", "dogfish", "mouse")
Debug.Print "dog", Test1("dog")
Debug.Print "horse", Test1("horse")
End Sub
Function Test1(strIn As String) As Boolean
Dim vFilter
Dim lngCnt As Long
vFilter = Filter(arrList, strIn, True)
For lngCnt = 0 To UBound(vFilter)
If vFilter(lngCnt) = strIn Then
Test1 = True
Exit For
End If
Next
End Function
只需使用 Select Case
列表:
Select Case entry
Case item1,item2, ite3,item4 ' add up to limit for Case, add more Case if limit exceeded
do stuff for being in the list
Case Else
do stuff for not being in list
End Select