web-dev-qa-db-fra.com

Vérifier si une valeur est dans un tableau ou non avec Excel VBA

J'ai du code ci-dessous, censé vérifier si une valeur est dans un tableau ou non.

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 cellule A1 contient le mot Examples pour une raison quelconque, la variable IsInArray le détecte comme existant pour les deux tableaux, alors qu'elle devrait le trouver uniquement dans le tableau vars1.

Que dois-je changer pour que ma fonction IsInArray en fasse une correspondance exacte?

8
Ryflex

Vous pouvez le forcer comme ça:

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

Utiliser comme

IsInArray("example", Array("example", "someother text", "more things", "and another"))
15
Brad

Cette question a été posée ici: Tableaux VBA - Vérifier la correspondance stricte (non approximative)

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
6
user6432984

Utilisez la fonction Match () dans Excel VBA pour vérifier si la valeur existe dans un tableau. 

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
2
Sixthsense

Bien qu'il s'agisse essentiellement d'une nouvelle réponse de @ Brad, j'ai pensé qu'il serait peut-être intéressant d'inclure une fonction légèrement modifiée qui renverrait l'index de l'élément que vous recherchez s'il existe dans le tableau. Si l'élément n'est pas dans le tableau, il retourne -1 à la place. 

La sortie de this peut être vérifiée tout comme la fonction "in string", If InStr(...) > 0 Then, alors j'ai créé une petite fonction de test en dessous, à titre d'exemple.

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

Ensuite, je suis allé un peu à la mer et en a développé un pour les tableaux à deux dimensions, car lorsque vous générez un tableau basé sur une plage , il se présente généralement sous cette forme. 

Il renvoie un tableau de variantes de dimension unique avec seulement deux valeurs, les deux indices du tableau utilisés en entrée (en supposant que la valeur est trouvée). Si la valeur n'est pas trouvée, il retourne un tableau 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

Voici une image des données que j'ai configurées pour le test, suivies du test:

test 2

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
0
Marcucciboy2