Excel 模仿;在;操作人员

Excel 模仿;在;操作人员,excel,operators,in-operator,vba,Excel,Operators,In Operator,Vba,如何实现: if X in (1,2,3) then 而不是: if x=1 or x=2 or x=3 then 换句话说,如何才能最好地模仿VBA for excel中的操作符中的?我认为没有一个非常优雅的解决方案 但是,您可以尝试: If Not IsError(Application.Match(x, Array("Me", "You", "Dog", "Boo"), False)) Then 或者您可以编写自己的函数: Function ISIN(x, StringSetElem

如何实现:

if X in (1,2,3) then
而不是:

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

换句话说,如何才能最好地模仿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
你试过了吗

eval("3 in(1,2,3,4,5)")

我一点也不知道

我通常使用自酿的InArray()函数,就像在


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

您也可以尝试使用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
我现在写的

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

最快的方法: 这里有一个方法比其他答案的更快、更紧凑,并且适用于数字或文本值:

函数IsIn(valCheck,valList作为字符串)作为布尔值
IsIn=Not InStr(“,”和valList&“,”,“,”和valCheck&“,”)=0
端函数

示例: 使用带有数值的
IsIn

Sub-demo_Number()
常数x=2
如果IsIn(x,“1,2,3”),则
调试。打印“值”&x&“已找到!”
其他的
未找到Debug.Print“Value”&x&”
如果结束
端接头
IsIn
与字符串值一起使用:

Sub-demo_Text()
Const x=“狗”
如果IsIn(x,“我,你,狗,嘘”)那么
调试。打印“值”&x&“已找到!”
其他的
未找到Debug.Print“Value”&x&”
如果结束
端接头

速度比较: 为了比较速度,我根据接受的答案进行了100000次测试:

  • 0.406秒(最快)
    此功能(使用):
  • 1.828秒(慢450%)
    通过“ISIN”功能接受
  • 1.799秒(慢440%)
    使用freeVBcode中的“IsInArray”
  • 0.838秒(慢206%)
    带有修改后的“IsInArray”功能

我没有包括使用
SELECT..CASE
的更长时间,因为OP的目标大概是简化和缩短任务,而不是“
如果x=1或x=2或x=3,那么”
”,

我得到“未定义子或函数”-不知道这是否是因为我在VBA(不是VB)?已编辑的问题…这是访问VBA功能。很抱歉,我没有看到您提到excel VBA…所以这不是这个问题的答案。为什么它还在这里?你不能直接避开这个函数并使用类似于:
InStr(1,“MeYouDogBoo”,x)
?@redOctober13如果你用一个在x中找不到的分隔符分隔列表项,这可能会起作用。否则,您将触发InStr。使用这个简单版本的IsIn()函数时要小心。如果搜索词包含在传递数组中的任何词中,则返回True。搜索“do”将返回true,因为它在“Dog”中找到。更好的方法是确保chr(0)位于搜索词之前和之后,以及连接的搜索字符串之前和之后。在这里可以找到一个例子@Ben,你能检查一下这个链接吗,它好像断了。同样,我在大约10年前写了这个回复,你是对的,这个回复可以改进。@Kredns地址是正确的,但是链接正在传递尾随的“>”,这是意外的。试一试这个:如果x=1或x=2或x=3,那么这比
短多少?我认为这仍然是一个很好的答案,也是我的首选。您只需要一个case语句,因为可以堆叠值:
选择case x case 1,2,3'您的代码。。。结束选择
,虽然此代码可能会回答问题,但提供有关此代码回答问题的原因和/或方式的附加上下文可提高其长期价值。测试时,此方法耗时0.838秒,而仅耗时0.406秒。测试时,此方法耗时1.799秒,而仅耗时0.406秒。为什么要用冗余的
而不是
=0
使函数复杂化?