excel-vba - while - not equal vba
Imitando al operador “IN” (6)
¿Cómo se puede lograr:
if X in (1,2,3) then
en lugar de:
if x=1 or x=2 or x=3 then
En otras palabras, ¿cómo puede uno imitar mejor al operador IN
en VBA para sobresalir?
Lo escribí ahora ...
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
No creo que haya una solución muy elegante.
Sin embargo, puedes intentar:
If Not IsError(Application.Match(x, Array("Me", "You", "Dog", "Boo"), False)) Then
o podrías escribir tu propia función:
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
No hay ninguno que yo sepa.
Usualmente uso una función InArray () hecha en casa como la que se encuentra en freevbcode.com/ShowCode.asp?ID=1675
También puede crear una versión que itere a través de la matriz en lugar de concatenar, si eso es más apropiado para su tipo de datos.
También puedes probar la sentencia CASE en lugar de 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
has probado
eval("3 in(1,2,3,4,5)")
Método más rápido:
Este es un método mucho más rápido y compacto que cualquiera de las otras respuestas, y funciona con valores numéricos o de texto:
Function IsIn(valCheck, valList As String) As Boolean
IsIn = Not InStr("," & valList & ",", "," & valCheck & ",") = 0
End Function
Ejemplos:
Utilice IsIn
con un valor numérico:
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
Utilice IsIn
con un valor de cadena:
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
Comparación de velocidad:
Para comparar la velocidad, realicé la prueba de la respuesta aceptada 100,000 veces:
-
0.406 sec (FASTEST)
Esta función (usando InStr ): - Answer aceptada de
1.828 sec (450% slower)
con la función "ISIN" -
1.799 sec (440% slower)
Answer con el "IsInArray" de freeVBcode -
0.838 sec (206% slower)
Answer con la función modificada "IsInArray"
No SELECT..CASE
answer mucho más larga que usa SELECT..CASE
ya que el objetivo del OP era presumiblemente simplificar y acortar la tarea en comparación con " if x=1 or x=2 or x=3 then
".