Evi*_*ine 11 excel vba excel-vba
我想到了两种策略:
enum
并检查输入是否属于此enum
,虽然我不确定这个的语法 - 我是否需要在enum
每次使用它时初始化它?我想知道VBA哪个在效率和可读性方面更好?
小智 7
与.NET语言不同,VBA不会将Enum公开为文本.它严格地是一个数字,并且没有.ToString()
方法可以公开枚举的名称.可以创建自己的ToString()
方法并返回枚举的String表示.枚举Enum类型也是可能的.尽管所有这些都是可以实现的,但我不建议这样做,因为对于这样的单个任务来说,过于复杂.
如何创建项的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
Run Code Online (Sandbox Code Playgroud)
注意:如果您添加对Microsoft Scripting Runtime
库的引用,那么您将能够将智能与myList
对象一起使用,因为它本来是早期绑定的替换
Dim myList As Object
Set myList = CreateObject("Scripting.Dictionary")
Run Code Online (Sandbox Code Playgroud)
同
Dim myList as Dictionary
Set myList = new Dictionary
Run Code Online (Sandbox Code Playgroud)
这取决于你想要采用哪种方式以及更方便的方式.请注意,如果您使用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
Run Code Online (Sandbox Code Playgroud)
首先,将List列为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存在作为Enum类型.
您可以在下面运行一个简单的数组测试,将单词添加到单个列表中:
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
Run Code Online (Sandbox Code Playgroud)
或者,如果您想进行更详细的搜索并返回子字符串匹配列表以供进一步工作,请使用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
Run Code Online (Sandbox Code Playgroud)
小智 6
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
Run Code Online (Sandbox Code Playgroud)