如何实现:
if X in (1,2,3) then
代替:
if x=1 or x=2 or x=3 then
换句话说,如何才能最好地模仿IN
VBA for excel 中的运算符?
如何实现:
if X in (1,2,3) then
代替:
if x=1 or x=2 or x=3 then
换句话说,如何才能最好地模仿IN
VBA for excel 中的运算符?
我不认为有一个非常优雅的解决方案。
但是,您可以尝试:
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
您也可以尝试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
这是一种比任何其他答案都更快、更紧凑的方法,并且适用于数字或文本值:
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)
使用“ISIN”功能 接受的答案1.799 sec (440% slower)
用 freeVBcode 中的“IsInArray”回答0.838 sec (206% slower)
用修改后的“IsInArray”函数 回答我没有包含更长的答案,因为与“”相比,SELECT..CASE
OP 的目标可能是简化和缩短if x=1 or x=2 or x=3 then
任务。
你试过了吗
eval("3 in(1,2,3,4,5)")
没有我知道的。
我通常使用自制的 InArray() 函数,例如http://www.freevbcode.com/ShowCode.asp?ID=1675中的函数
如果这更适合您的数据类型,您还可以创建一个迭代数组而不是连接的版本。
如果不编写自己的函数,它就无法工作。请注意,@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
我现在写...
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