web-dev-qa-db-fra.com

Comment rechercher une chaîne dans un tableau

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.

33
aSystemOverload

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.

55
JimmyPena

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 .

13
Brian Hinchey

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
5
Sebastian Viereck

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

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
1
ChaimG

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