formateur informatique

Filtrer une liste de choix selon les lettres saisies

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Filtrer une liste de choix selon les lettres saisies
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Filtrer une liste déroulante au cours de la frappe en VBA Excel

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.

Propriété de liste déroulante VBA Excel pour poursuivre la saisie sur les caractères cherché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,
Déclencher un code VBA Excel à la saisie dans une liste déroulante ActiveX

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,
Suggestions intuitives au fil de la saisie en VBA Excel

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn