VBA – Rechercher une Valeur dans un Tableau
In this Article
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.
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