web-dev-qa-db-fra.com

Imiter l'opérateur "IN"

Comment peut-on atteindre:

if X in (1,2,3) then

au lieu de:

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

En d'autres termes, comment imiter au mieux l'opérateur IN dans VBA?

18
Allan Bowe

Je ne pense pas qu'il existe une solution très élégante.

Cependant, vous pouvez essayer:

If Not IsError(Application.Match(x, Array("Me", "You", "Dog", "Boo"), False)) Then

ou vous pouvez écrire votre propre fonction:

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
14
Kredns

Vous pouvez également essayer l'instructionCASEà la place deSI

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
12
Robert Mearns

as-tu essayé 

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

À ma connaissance, il n'y en a pas. 

J'utilise généralement une fonction maison InArray () comme celle de http://www.freevbcode.com/ShowCode.asp?ID=1675

Vous pouvez également créer une version qui parcourt le tableau au lieu de la concaténer, si cela convient mieux à votre type de données.

1
anschauung

Méthode la plus rapide:

Voici une méthode beaucoup plus rapide et compact quetoutedes autres réponses, et fonctionne avec des valeurs numériques ou textuelles:

Function IsIn(valCheck, valList As String) As Boolean  
    IsIn = Not InStr("," & valList & ",", "," & valCheck & ",") = 0
End Function

Exemples:

Utilisez IsIn avec une valeur numérique:

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

Utilisez IsIn avec une valeur de chaîne:

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

Comparaison de vitesse:

Pour comparer la vitesse, j’ai fait le test à partir de la réponse acceptée 100 000 fois: 

  • 0.406 sec (FASTEST) This Function (en utilisant InStr ): 
  • 1.828 sec (450% slower) Accepted Réponse avec la fonction "ISIN" 
  • 1.799 sec (440% slower)Answer avec le "IsInArray" de freeVBcode
  • 0.838 sec (206% slower)Answer avec la fonction "IsInArray" modifiée 

Je n'ai pas inclus le answer qui utilise beaucoup plus longtemps SELECT..CASE puisque l'objectif du PO était vraisemblablement de simplifier et raccourcir la tâche par rapport à "if x=1 or x=2 or x=3 then".

0
ashleedawg