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?
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
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
as-tu essayé
eval("3 in(1,2,3,4,5)")
À 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.
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
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
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 freeVBcode0.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
".