Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Filtrer sur les lettres tapées
Nous avions déjà apporté des solutions pour créer des
suggestions intuitives au cours de la frappe avec Excel. Ici, nous allons récidiver en simplifiant le cas grâce à une classe toute particulière.
Sur l'exemple illustré par la capture, au fur et à mesure des lettres tapées par l'utilisateur, les suggestions de la liste déroulante s'amenuisent pour correspondre aux premiers caractères inscrits.
Classeur VBA Excel à télécharger
Pour développer cette solution, nous suggérons d'appuyer les travaux sur un
classeur Excel offrant une
liste déroulante ainsi qu'une
source de données à questionner.
- Télécharger le classeur filtrer-liste-deroulante.xlsm en cliquant sur ce lien,
- Cliquer droit sur le fichier réceptionné,
- En bas du menu contextuel, choisir la commande Propriétés,
- En bas de la boîte de dialogue, cocher la case Débloquer et valider par Ok,
- Puis, double cliquer sur le fichier pour l'ouvrir dans Excel,
Nous débouchons sur la première feuille de ce classeur (filtrerListe). Elle est effectivement dotée d'une liste déroulante. La seconde (Source) héberge les données qui doivent la remplir. D'ailleurs, la plage de cette source d'informations est reconnue sous l'intitulé
lesNoms. Vous pouvez le constater en déployant la
zone Nom en haut à gauche de la
feuille Excel.
Liste déroulante ActiveX
Pour pouvoir piloter la
liste déroulante par le
code VBA, c'est un
contrôle ActiveX que nous avons ajouté sur la feuille.
- Revenir sur la feuille filtrerListe,
- En haut de la fenêtre Excel, cliquer sur l'onglet Développeur pour activer son ruban,
- Dans la section Contrôles du ruban, cliquer sur le bouton Mode Création,
- Dès lors, cliquer sur la liste déroulante de la feuille pour la sélectionner,
- Puis, cliquer sur le bouton Propriétés dans la section Contrôles du ruban,
Une fenêtre des propriétés pour cette liste déroulante, apparaît. Et comme vous pouvez le voir, les attributs proposés sont plutôt nombreux. C'est tout l'intérêt de ces contrôles ActiveX. Tout d'abord, nous pouvons constater que cette liste déroulante est nommée
listeNoms. Une autre propriété nous intéresse particulièrement. Elle se nomme
MatchEntry. Elle est essentielle pour ce développement. Elle est réglée sur la
valeur 2-fmmatchEntryNone. Sans elle, le premier résultat concordant est sélectionné dans la liste et la suite de la saisie est compromise. Or, nous souhaitons la poursuivre pour amenuiser les propositions au fil des caractères tapés.
La source de données de la liste déroulante
C'est un petit
code VBA Excel déjà en place qui se charge de remplir la liste déroulante des informations contenues par la plage nommée
lesNoms. Puisque le mode Création est toujours actif, nous proposons de le constater.
- Double cliquer sur la liste déroulante,
Ainsi, nous basculons dans l'éditeur VBA Excel, entre les bornes de la
procédure événementielle listeNoms_GotFocus :
Private Sub listeNoms_GotFocus()
listeNoms.List = [lesNoms].Value
End Sub
Son code se déclenche dès que la liste déroulante est activée. En calant la
propriété list sur la plage des noms, il remplit la liste déroulante des informations présentes dans cette zone.
Code VBA Ã la saisie
Maintenant, c'est un
code VBA qui doit agir dès lors qu'une lettre est tapée dans la zone de liste déroulante. Et pour cela, ce type de
contrôle ActiveX offre un événement dédié. Il se nomme
Change.
- En haut de la feuille de code, déployer la liste déroulante de gauche,
- Dans les propositions, choisir l'objet listeNoms,
- Dans la liste de droite, choisir l'événement associé Change,
Nous créons ainsi la
procédure événementielle listeNoms_Change.
Les variables
Maintenant, nous avons besoin de déclarer quelques variables, notamment pour scruter la saisie mais aussi pour analyser toutes les cellules de la plage source. De même et nous le comprendrons, nous avons besoin d'un
objet pour instancier la
classe Dictionary.
- Dans les bornes de la nouvelle procédure, déclarer les trois variables suivantes :
Private Sub listeNoms_Change()
Dim lib: Dim saisie As String
Dim chaqueNom As Variant
End Sub
Seule la
variable lib n'est pas encore typée. Elle prendra son type au moment de l'instanciation de la
classe Dictionary.
La classe Dictionary
Un
objet Dictionary est l'équivalent d'un
tableau associatif (Clé/Valeur). Les éléments, pouvant correspondre à n'importe quelle forme de données, sont stockés dans ce tableau. Chaque élément est associé à une
clé qui lui est propre. La
clé est alors utilisée pour récupérer un élément individuel. C'est ainsi que nous allons pouvoir reconstruire en mémoire, la
liste des noms, dont les
premières lettres successives, correspondent aux
premiers caractères tapés par l'utilisateur.
- Après les variables, ajouter les lignes VBA suivantes :
...
If listeNoms.Value <> "" Then
Set lib = CreateObject("Scripting.Dictionary")
saisie = UCase(listeNoms.Value) & "*"
End If
...
Nous vérifions (If) tout d'abord qu'il y a bien des lettres à traiter dans la liste déroulante (listeNoms.Value <> ""). Grâce à la
fonction VBA CreateObject, nous instancions ensuite cette fameuse classe (Scripting.Dictionary). Dès lors, l'
objet lib hérite de toutes les propriétés et méthodes pour la piloter. C'est grâce à elle que nous allons pouvoir créer ce
tableau associatif des résultats concordants, afin d'amenuiser les suggestions au fil de la saisie. Enfin, nous stockons cette saisie en cours en majuscules (UCase), dans la
variable saisie. Nous la suffixons du
caractère générique ou WildCard de l'astérisque. Ainsi et comme vous le savez, nous allons chercher les correspondances que sur premières lettres tapées, peu importe ce qui suit (*).
Parcourir chaque nom de la source
Désormais, nous devons engager notre
objet chaqueNom dans une
boucle For Each pour
parcourir toutes les cellules de la plage, utilisée comme
source de données de la
liste déroulante.
- A la suite du code de l'instruction conditionnelle, créer la boucle For Each suivante :
...
If listeNoms.Value <> "" Then
Set lib = CreateObject("Scripting.Dictionary")
saisie = UCase(listeNoms.Value) & "*"
For Each chaqueNom In [lesNoms].Value
Next chaqueNom
End If
...
Tableau des correspondances
A chaque passage dans cette boucle, dès qu'une séquence de caractères tapées est trouvée en préfixe d'un nom de la plage parcourue, ce nom entier doit être ajouté dans le tableau associatif.
- A l'intérieur de la boucle For Each, ajouter la ligne VBA suivante :
...
If UCase(chaqueNom) Like saisie Then lib(chaqueNom) = ""
...
Nous utilisons la
fonction UCace pour neutraliser les différences de casses dans les comparaisons. Si la suite de caractères est bien présente en premières lettres du nom en cours d'analyse, nous créons une
clé dans le tableau (lib(chaqueNom)). Peu importe la valeur que nous gardons vide, seule la clé (Le nom concordant à restituer) est utile ici.
Retourner les suggestions
A l'issue du traitement, nous devons affecter ce tableau des correspondances sur la source de la liste déroulante pour actualiser ses suggestions, en fonction des lettres tapées par l'utilisateur.
- Après la boucle For Each, ajouter la ligne VBA suivante :
...
Next chaqueNom
listeNoms.List = lib.keys
End If
...
Nous recomposons simplement la source de la liste déroulante sur les résultats concordants, stockés sous forme de clés dans le tableau associatif.
- Revenir sur la feuille Excel,
- Fermer la fenêtre des propriétés en cliquant sur sa croix,
- Dans la section Contrôles du ruban Développeur, cliquer sur le bouton Mode Création,
Ainsi et cette fois, nous désactivons le mode conception.
- Déployer la liste déroulante
- Puis, taper un ou deux caractères pour commencer,
Comme vous pouvez l'apprécier, à chaque lettre inscrite, les suggestions de la liste déroulante s'affinent pour ne proposer plus que les noms commençant de la même façon. C'est ainsi que l'utilisateur n'a plus qu'à cliquer sur l'un d'entre eux pour le valider et éviter de le saisir intégralement.