如何实现:
if X in (1,2,3) then
而不是:
if x=1 or x=2 or x=3 then
换句话说,如何才能最好地模仿VBA中的IN
运算符for excel?
答案 0 :(得分:15)
我认为没有一个非常优雅的解决方案。
但是,您可以尝试:
If Not IsError(Application.Match(x, Array("Me", "You", "Dog", "Boo"), False)) Then
或者您可以编写自己的函数:
Function ISIN(x, StringSetElementsAsArray)
ISIN = InStr(1, Join(StringSetElementsAsArray, Chr(0)), _
x, vbTextCompare) > 0
End Function
Sub testIt()
Dim x As String
x = "Dog"
MsgBox ISIN(x, Array("Me", "You", "Dog", "Boo"))
End Sub
答案 1 :(得分:13)
您也可以尝试使用 CASE 语句,而不是 IF
Select Case X
Case 1 To 3
' Code to do something
Case 4, 5, 6
' Code to do something
Case 7
' Code to do something
Case Else
' More code or do nothing
End Select
答案 2 :(得分:1)
eval("3 in(1,2,3,4,5)")
答案 3 :(得分:1)
没有我知道的。
我通常使用自制的InArray()函数,例如http://www.freevbcode.com/ShowCode.asp?ID=1675
的函数如果更适合您的数据类型,您还可以创建一个迭代数组而不是连接的版本。
答案 4 :(得分:1)
与其他答案中的任何 相比,这是一种更快,更紧凑的方法,并且适用于数字或文本值:
Function IsIn(valCheck, valList As String) As Boolean
IsIn = Not InStr("," & valList & ",", "," & valCheck & ",") = 0
End Function
使用IsIn
和一个数字值:
Sub demo_Number()
Const x = 2
If IsIn(x, "1,2,3") Then
Debug.Print "Value " & x & " was Found!"
Else
Debug.Print "Value " & x & " was not Found."
End If
End Sub
使用IsIn
和字符串值:
Sub demo_Text()
Const x = "Dog"
If IsIn(x, "Me,You,Dog,Boo") Then
Debug.Print "Value " & x & " was Found!"
Else
Debug.Print "Value " & x & " was not Found."
End If
End Sub
为了比较速度,我从接受的答案进行了100,000次测试:
0.406 sec (FASTEST)
此功能(使用InStr):1.828 sec (450% slower)
已接受Answer的“ ISIN”功能1.799 sec (440% slower)
Answer和来自freeVBcode的“ IsInArray” 0.838 sec (206% slower)
Answer,带有修改后的“ IsInArray”函数我没有包括使用SELECT..CASE
的更长answer,因为与“ if x=1 or x=2 or x=3 then
相比,OP的目标是简化和缩短任务“。
答案 5 :(得分:0)
不编写自己的函数就行不通。请注意,@Kredns 接受的解决方案可能不适用于所有类型的对象,因为它们被强制转换为字符串(这也可能引发类型不匹配错误)。
此解决方案应该(希望)处理所有类型的数据(至少在 Excel 365 中,不确定早期版本):
Function IsIn(x As Variant, list As Variant) As Boolean
' Checks whether list (Array) contains the element x
IsIn = False
For Each element In list
If x = element Then IsIn = True
Next element
End Function
答案 6 :(得分:-1)
我现在写了......
Public Function IsInArray(FindValue As Variant, ParamArray arrEmailAttachment()) As Boolean
Dim element As Variant
For Each element In arrEmailAttachment
If element = FindValue Then
IsInArray = True
Exit Function
End If
Next element
IsInArray = False
End Function