模仿“IN”运算符

时间:2009-10-01 17:02:18

标签: excel-vba operators in-operator vba excel

如何实现:

if X in (1,2,3) then

而不是:

if x=1 or x=2 or x=3 then

换句话说,如何才能最好地模仿VBA中的IN运算符for excel?

7 个答案:

答案 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