Имитация оператора IN - PullRequest
       24

Имитация оператора IN

21 голосов
/ 01 октября 2009

Как можно достичь:

if X in (1,2,3) then

вместо:

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

Другими словами, как лучше всего подражать оператору IN в VBA для Excel?

Ответы [ 6 ]

15 голосов
/ 01 октября 2009

Не думаю, что есть очень элегантное решение.

Однако вы можете попробовать:

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
13 голосов
/ 02 октября 2009

Вы также можете попробовать оператор 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 голосов
/ 27 августа 2018

Самый быстрый метод:

Вот метод гораздо быстрее и компактнее , чем любой других ответов, а работает с числовыми или текстовыми значениями:

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» из freeVBcode
  • 0.838 sec (206% slower) Ответ с измененной функцией «IsInArray»

Я не включил более длинный ответ , который использует SELECT..CASE, поскольку целью ОП было предположительно упростить и сократить задачу по сравнению с "if x=1 or x=2 or x=3 then".

1 голос
/ 01 октября 2009

Нет ни одного, о котором я бы знал.

Обычно я использую функцию InArray () домашнего приготовления, например, в http://www.freevbcode.com/ShowCode.asp?ID=1675

Вы также можете создать версию, которая перебирает массив вместо конкатенации, если это больше соответствует вашему типу данных.

1 голос
/ 01 октября 2009

ты пробовал

eval("3 in(1,2,3,4,5)")
0 голосов
/ 10 октября 2016

Я написал это сейчас ...

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
...