Existe-t-il une solution simple (une ligne) pour rechercher une chaîne dans un tableau dans VBA? Ou devrai-je parcourir chaque élément et le comparer à la chaîne cible?
EDIT: C'est un tableau à une dimension. J'ai seulement besoin de savoirSIune chaîne est quelque part dans le tableau.
C'EST À DIRE:
names(JOHN, BOB, JAMES, PHLLIP)
Comment savoir si "JOHN" figure dans le tableau, il doit être minimal car il sera répété environ 5 000 fois et je ne veux pas que la fonction ralentisse le processus dans son ensemble.
Si vous voulez savoir si la chaîne se trouve dans le tableau, essayez cette fonction:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Comme le souligne Sean Cheshire , il doit s'agir d'un tableau 1D.
Exemple:
Sub Test()
Dim arr As Variant
arr = Split("abc,def,ghi,jkl", ",")
Debug.Print IsInArray("ghi", arr)
End Sub
(Le code ci-dessous a été mis à jour en fonction des commentaires de HansUp )
Si vous voulez l'index de l'élément correspondant dans le tableau, essayez ceci:
Function IsInArray(stringToBeFound As String, arr As Variant) As Long
Dim i As Long
' default return value if value not found in array
IsInArray = -1
For i = LBound(arr) To UBound(arr)
If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then
IsInArray = i
Exit For
End If
Next i
End Function
Cela suppose également un tableau 1-D. Gardez à l'esprit que LBound et UBound sont basés sur zéro, donc un indice de 2 signifie le troisième élément, pas le second.
Exemple:
Sub Test()
Dim arr As Variant
arr = Split("abc,def,ghi,jkl", ",")
Debug.Print (IsInArray("ghi", arr) > -1)
End Sub
Si vous avez un exemple spécifique en tête, veuillez mettre à jour votre question avec elle, sinon le code de l'exemple pourrait ne pas s'appliquer à votre situation.
Une autre option qui applique une correspondance exacte (c'est-à-dire aucune correspondance partielle) serait:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
Vous pouvez en savoir plus sur la méthode Match et ses arguments à l'adresse http://msdn.Microsoft.com/en-us/library/office/ff835873(v=office.15).aspx .
fonction plus simple qui fonctionne également sur Apple OS:
Function isInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
For Each element In arr
If element = stringToBeFound Then
isInArray = True
Exit Function
End If
Next element
End Function
Voici une autre réponse. Il fonctionne rapidement et de manière fiable (voir la réponse d’Atomicules) et dispose d’un code d’appel compact:
' Returns true if item is in the array; false otherwise.
Function IsInArray(ar, item$) As Boolean
Dim delimiter$, list$
' Chr(7) is the ASCII 'Bell' Character.
' It was chosen for being unlikely to be found in a normal array.
delimiter = Chr(7)
' Create a list string containing all the items in the array separated by the delimiter.
list = delimiter & Join(ar, delimiter) & delimiter
IsInArray = InStr(list, delimiter & item & delimiter) > 0
End Function
Utilisation de l'échantillon:
Sub test()
Debug.Print "Is 'A' in the list?", IsInArray(Split("A,B", ","), "A")
End Sub
S'il s'agit d'une liste de constantes, vous pouvez utiliser Select Case comme suit:
Dim Item$: Item = "A"
Select Case Item
Case "A", "B", "C"
' If 'Item' is in the list then do something.
Case Else
' Otherwise do something else.
End Select
Une instruction Case
pourrait mieux convenir à certaines applications:
select case var
case "a string", "another string", sVar
'do something
case else
'do something else
end select