Compruebe si un valor está en una matriz o no con Excel VBA
excel-vba (7)
Desea verificar si los Ejemplos existen en el Rango ("A1"). Valor Si falla, entonces verifique el Ejemplo ¿verdad? Creo que mycode funcionará perfecto. Por favor, compruebe.
Sub test()
Dim string1 As String, string2 As String
string1 = "Examples"
string2 = "Example"
If InStr(1, Range("A1").Value, string1) > 0 Then
x = 1
ElseIf InStr(1, Range("A1").Value, string2) > 0 Then
x = 2
End If
End Sub
Tengo un código a continuación, que se supone que debe verificar si un valor está en una matriz o no.
Sub test()
vars1 = Array("Examples")
vars2 = Array("Example")
If IsInArray(Range("A1").Value, vars1) Then
x = 1
End If
If IsInArray(Range("A1").Value, vars2) Then
x = 1
End If
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Si la celda
A1
contiene la palabra
Examples
por alguna razón, ambos
IsInArray
detecta como existente para ambas matrices cuando solo debería encontrarla existente en la matriz
vars1
¿Qué necesito cambiar para que mi función
IsInArray
funcione para que coincida exactamente?
Esta pregunta se hizo aquí: matrices de VBA: compruebe una coincidencia estricta (no aproximada)
Sub test()
vars1 = Array("Examples")
vars2 = Array("Example")
If IsInArray(Range("A1").value, vars1) Then
x = 1
End If
If IsInArray(Range("A1").value, vars2) Then
x = 1
End If
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
La siguiente función devolvería ''0'' si no hay coincidencia y un ''entero positivo'' en caso de coincidencia:
Function IsInArray(stringToBeFound As String, arr As Variant) As Integer IsInArray = InStr(Join(arr, ""), stringToBeFound) End Function
______________________________________________________________________________
Nota : la función primero concatena todo el contenido de la matriz a una cadena usando ''Unir'' (no estoy seguro si el método de unión usa bucle interno o no) y luego comprueba si hay un macth dentro de esta cadena usando InStr.
Me gustaría proporcionar otra variante que debería ser tanto eficaz como poderosa , porque
- no usa el partido a .com/questions/38267950/… )
-
admite
String
,Integer
,Boolean
, etc. ( no soloString
) - devuelve el índice del artículo buscado
- admite n-ocurrencia
...
''-1 if not found
''https://.com/a/56327647/1915920
Public Function IsInArray( _
item As Variant, _
arr As Variant, _
Optional nthOccurrence As Long = 1 _
) As Long
IsInArray = -1
Dim i As Long: For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) = item Then
If nthOccurrence > 1 Then
nthOccurrence = nthOccurrence - 1
GoTo continue
End If
IsInArray = i
Exit Function
End If
continue:
Next i
End Function
úsalo así:
Sub testInt()
Debug.Print IsInArray(2, Array(1, 2, 3)) ''=> 1
End Sub
Sub testString1()
Debug.Print IsInArray("b", Array("a", "b", "c", "a")) ''=> 1
End Sub
Sub testString2()
Debug.Print IsInArray("b", Array("a", "b", "c", "b"), 2) ''=> 3
End Sub
Sub testBool1()
Debug.Print IsInArray(False, Array(True, False, True)) ''=> 1
End Sub
Sub testBool2()
Debug.Print IsInArray(True, Array(True, False, True), 2) ''=> 2
End Sub
Puedes forzarlo así:
Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Dim i
For i = LBound(arr) To UBound(arr)
If arr(i) = stringToBeFound Then
IsInArray = True
Exit Function
End If
Next i
IsInArray = False
End Function
Usar como
IsInArray("example", Array("example", "someother text", "more things", "and another"))
Si bien esto es esencialmente solo la respuesta de @ Brad nuevamente, pensé que podría valer la pena incluir una función ligeramente modificada que devolverá el índice del elemento que está buscando si existe en la matriz.
Si el elemento no está en la matriz, devuelve
-1
lugar.
El resultado de esto se puede verificar al igual que la función "en cadena",
If InStr(...) > 0 Then
, así que hice una pequeña función de prueba debajo como ejemplo.
Option Explicit
Public Function IsInArrayIndex(stringToFind As String, arr As Variant) As Long
IsInArrayIndex = -1
Dim i As Long
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i) = stringToFind Then
IsInArrayIndex = i
Exit Function
End If
Next i
End Function
Sub test()
Dim fruitArray As Variant
fruitArray = Array("orange", "apple", "banana", "berry")
Dim result As Long
result = IsInArrayIndex("apple", fruitArray)
If result >= 0 Then
Debug.Print chr(34) & fruitArray(result) & chr(34) & " exists in array at index " & result
Else
Debug.Print "does not exist in array"
End If
End Sub
Luego me fui un poco por la borda y desarrollé una para matrices bidimensionales porque cuando generas una matriz basada en un rango , generalmente es de esta forma.
Devuelve una matriz variante de una sola dimensión con solo dos valores, los dos índices de la matriz utilizados como entrada (suponiendo que se encuentre el valor).
Si no se encuentra el valor, devuelve una matriz de
(-1, -1)
.
Option Explicit
Public Function IsInArray2DIndex(stringToFind As String, arr As Variant) As Variant
IsInArray2DIndex= Array(-1, -1)
Dim i As Long
Dim j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
If arr(i, j) = stringToFind Then
IsInArray2DIndex= Array(i, j)
Exit Function
End If
Next j
Next i
End Function
Aquí hay una imagen de los datos que configuré para la prueba, seguida de la prueba:
Sub test2()
Dim fruitArray2D As Variant
fruitArray2D = sheets("Sheet1").Range("A1:B2").value
Dim result As Variant
result = IsInArray2DIndex("apple", fruitArray2D)
If result(0) >= 0 And result(1) >= 0 Then
Debug.Print chr(34) & fruitArray2D(result(0), result(1)) & chr(34) & " exists in array at row: " & result(0) & ", col: " & result(1)
Else
Debug.Print "does not exist in array"
End If
End Sub
Use la función Match () en excel VBA para verificar si el valor existe en una matriz.
Sub test()
Dim x As Long
vars1 = Array("Abc", "Xyz", "Examples")
vars2 = Array("Def", "IJK", "MNO")
If IsNumeric(Application.Match(Range("A1").Value, vars1, 0)) Then
x = 1
ElseIf IsNumeric(Application.Match(Range("A1").Value, vars2, 0)) Then
x = 1
End If
MsgBox x
End Sub