excel vba excel-vba

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 solo String )
  • 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