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
使函数复杂化?