Как можно добиться:
if X in (1,2,3) then
вместо:
if x=1 or x=2 or x=3 then
Другими словами, как лучше всего имитировать оператор IN
в VBA для Excel?
Как можно добиться:
if X in (1,2,3) then
вместо:
if x=1 or x=2 or x=3 then
Другими словами, как лучше всего имитировать оператор IN
в VBA для 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
InStr(1,"MeYouDogBoo",x)
?
- person redOctober13; 09.05.2017
Вы также можете попробовать оператор 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
if x=1 or x=2 or x=3 then
, как спросил ОП?
- person ashleedawg; 27.08.2018
Select Case x Case 1,2,3 ' Your code... End Select
- person LiceRewis; 03.04.2019
Here's a method much faster and more compact than any of the other answers, and works with numeric or text values:
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)
Ответ с "IsInArray" из freeVBcode0.838 sec (206% slower)
Ответ с измененной функцией "IsInArray"Я не включил гораздо более длинный ответ, в котором используется SELECT..CASE
, поскольку целью ОП, предположительно, было упрощение и сокращение< /em> задача по сравнению с "if x=1 or x=2 or x=3 then
".
Not
и = 0
?
- person Excel Hero; 02.05.2020
ты пробовал
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