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?
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"))
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
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
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:
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