29

如何实现:

if X in (1,2,3) then

代替:

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

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

4

7 回答 7

16

我不认为有一个非常优雅的解决方案。

但是,您可以尝试:

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
于 2009-10-01T17:12:34.120 回答
15

您也可以尝试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
于 2009-10-02T11:56:48.900 回答
8

最快的方法:

这是一种比任何其他答案都更快、更紧凑的方法,并且适用于数字或文本值:

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..CASEOP 的目标可能是简化和缩短if x=1 or x=2 or x=3 then任务。

于 2018-08-27T15:23:24.137 回答
2

你试过了吗

eval("3 in(1,2,3,4,5)")
于 2009-10-01T17:13:37.730 回答
1

没有我知道的。

我通常使用自制的 InArray() 函数,例如http://www.freevbcode.com/ShowCode.asp?ID=1675中的函数

如果这更适合您的数据类型,您还可以创建一个迭代数组而不是连接的版本。

于 2009-10-01T17:15:35.603 回答
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
于 2021-07-30T12:10:07.183 回答
-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
于 2016-10-10T14:02:25.803 回答