VBA – Rechercher une Valeur dans un Tableau

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

David Gagnon

Last updated on janvier 12, 2022

Ce tutoriel montre comment rechercher (trouver) une valeur dans un tableau en VBA

Il existe plusieurs façons de rechercher une chaîne de caractères dans un tableau, selon si le tableau est unidimensionnel ou multidimensionnel.

Recherche dans un Tableau Unidimensionnel

Pour rechercher une valeur dans un tableau unidimensionnel, vous pouvez utiliser la fonction Filter.

Dim z As Variant
'Filtrez le tableau d'origine
  z = Filter(Tableau, Chaine, True, vbCompareBinary)

La syntaxe de l’option Filter est la suivante

Filter(Tableau source, Chaine à Rechercher, [Inclure (Booléen)], [Comparer (vbCompareMethod)])

Les champs Tableau Source et Chaine à Rechercher sont obligatoires, tandis que les champs Inclure (Booléen) et Comparer (vbCompareMethod) sont facultatifs. S’ils ne sont pas inclus, ils prennent respectivement la valeur True et vbCompareBinary.

Recherche des Valeurs qui Correspondent au Filtre

Sub TrouverBob()
   ' Création d 'un tableau
   Dim strNom() As Variant
   strNom() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
   
   ' Déclarez une variante pour y stocker les données de filtre
   Dim strNomsFiltrés As Variant

   ' Filtrez le tableau d'origine
   strNomsFiltrés = Filter(strNom, "Bob")

   'Si la valeur LBound est supérieure à -1, cela signifie que la valeur a été trouvée
   If LBound(strNomsFiltrés) > -1 Then MsgBox ("J'ai trouvé Bob")
End Sub

Le deuxième tableau contiendra les valeurs trouvées par le filtre. Si les valeurs LBound et UBound sont différentes de -1, alors le tableau a réussi à trouver la valeur recherchée.

Vous pouvez également voir combien de fois le texte apparaît dans le tableau d’origine.

Sub CompterNoms()
   'Créez un tableau
   Dim strNom() As Variant
   strNom() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")

   ' déclarez un tableau pour y stocker les données du filtre
   Dim strNomsFiltrés As Variant

   ' Filtrez le tableau d'origine
   strNomsFiltrés = Filter(strNom, "Bob")

   ' Si vous soustrayez le LBound des valeurs UBound et ajoutez 1, vous obtenez le nombre de fois où le texte apparaît
   MsgBox UBound(strNomsFiltrés) - LBound(strNomsFiltrés) + 1 & " noms trouvés"
End Sub

Trouver les Valeurs qui ne Correspondent PAS au Filtre

L’option [Inclure (Booléen)] vous permet de déterminer le nombre de valeurs de votre tableau qui ne correspondent PAS à votre filtre

Sub CompterNomsDifférents()
  ' Crée un tableau
  Dim strNom() As Variant
  strNom() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")

  ' Déclarez un tableau pour y stocker les données du filtre
  Dim strNomsFiltrés As Variant

  ' Filtrez le tableau d'origine
  strNomsFiltrés = Filter(strNom, "Bob", False)

  ' Si vous soustrayez le LBound des valeurs UBound et ajoutez 1, vous obtenez le nombre de fois où le texte apparaît
  MsgBox UBound(strNomsFiltrés) - LBound(strNomsFiltrés) + 1 & " noms trouvés"
End Sub

nous avons donc modifié cette ligne :

strSubNames = Filter(strNom, "Bob")

par cette ligne :

strSubNames = Filter(strNom, "Bob", False)

L’utilisation de cette ligne dans le code renverrait tous les noms qui ne correspondent PAS à « Bob ».

Filtres Sensibles à la Casse

Vous constaterez que le filtre est sensible à la casse par défaut. C’est le cas pour toutes les fonctions VBA. Si vous souhaitez rechercher un texte qui n’est pas sensible à la casse, vous devez modifier légèrement votre code.

z = Filter(strNom, "bob",,, vbTextCompare)

L’ajout de vbTextCompare à votre ligne de filtre permettra à votre code de trouver « bob » ou « Bob ». Si cette option est omise, VBA utilise par défaut vbBinaryCompare, qui recherche uniquement les données qui correspondent EXACTEMENT. Remarquez que dans l’exemple ci-dessus, nous avons omis l’argument [Inclure (Booléen)], de sorte que l’option True est supposée.

Instruction « Option Compare Text »

Vous pouvez également ajouter le texte Option Compare Text en haut de votre module, ce qui rendra toutes les fonctions que vous écrivez dans ce module particulier insensibles à la casse.

vba find array option compare text

Utilisation d’une Boucle pour Rechercher dans un Tableau

L’utilisation d’une boucle est un peu plus compliquée que l’utilisation de la fonction Filter. Nous pouvons créer une fonction qui parcourra en boucle toutes les valeurs du tableau.

Sub BoucleSurUnTableau()
    'Créez un tableau
    Dim strNom() As Variant
    strNom() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
    
    Dim strRecherche As String
    strRecherche = "Bob"
    
    Dim i As Long
    ' Boucle dans le tableau
    For i = LBound(strNom, 1) To UBound(strNom, 1)
        If InStr(strNom(i), strRecherche) > 0 Then
           MsgBox "Bob a été trouvé !"
           Exit For
        End If
     Next i
End Sub

Afin de trouver une partie de la chaîne de texte, c’est-à-dire « Bob » au lieu de « Bob Smith » ou « Bob Williams », nous avons dû utiliser la fonction Instr dans la déclaration If. Celle-ci examine la chaîne de caractères renvoyée par la boucle à partir du tableau pour voir si « Bob » s’y trouve, et si c’est le cas, elle renvoie un message et quitte la boucle.

Recherche dans un Tableau Multidimensionnel

Nous utilisons également une boucle pour effectuer une recherche dans un tableau multidimensionnel. Une fois encore, nous devons créer une fonction qui nous permette de parcourir toutes les valeurs du tableau, mais cette fois, nous devons également parcourir chaque dimension du tableau.

Sub BoucleSurUnTableauMultidimensionnel()
   Dim varTableau() As Variant
   Dim strRecherche As String
   strRecherche = "Médecin"
'Définition de la taille du tableau
   ReDim varTableau(1, 2)
'Initialise le tableau
   varTableau(0, 0) = "Mel Smith"
   varTableau(0, 1) = "Fred Buckle"
   varTableau(0, 2) = "Jane Eyre"
   varTableau(1, 0) = "Comptable"
   varTableau(1, 1) = "Secrétaire"
   varTableau(1, 2) = "Médecin"
'Déclare les variables pour la boucle
   Dim i As Long, j As Long
'Boucle pour la première dimension
   For i = LBound(varTableau, 1) To UBound(varTableau, 1)
'Boucle pour la deuxième dimension
      For j = LBound(varTableau, 2) To UBound(varTableau, 2)
'Si nous trouvons la valeur, nous envoyons un message pour indiquer que nous avons la valeur et nous quittons la fonction
         If varTableau(i, j) = strRecherche Then
            MsgBox "Le médecin a été trouvé!"
            Exit Sub
         End If
      Next j
   Next i
End Sub
vba-free-addin

Module Complémentaire d'Exemples de Code VBA

Accédez facilement à tous les exemples disponibles sur le site.

Naviguez simplement dans le menu, cliquez, et le code sera inséré directement dans votre module. Module complémentaire .xlam.

(Aucune installation requise!)

Téléchargement gratuit

Retour aux exemples de code VBA