formateur informatique

Filtrer un formulaire Access au fil des lettres tapées

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Filtrer un formulaire Access au fil des lettres tapées
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 un formulaire sur la saisie

Nous avons déjà apporté des solutions pour filtrer les enregistrements d'une base de données au cours de la frappe. Ici, nous apportons une technique originale et efficace qui s'adapte au champ choisi. Tous les caractères sont interprétés, y compris les espaces pour les mots composés.

Filtrer un formulaire Access au cours de la saisie en VBA

Sur l'exemple illustré par la capture, nous travaillons à partir d'un formulaire tabulaire recensant des clients par leur nom, prénom et profession. Dans la partie inférieure de ce formulaire, l'utilisateur choisit le champ à partir duquel il est question d'exercer le filtre. Dès lors, à chaque lettre tapée dans la zone de saisie du dessous, la vue du formulaire se restreint aux enregistrements pour lesquels les données commencent exactement par cette succession de caractères, sur le champ demandé.

Base de données Access à télécharger
Pour développer cette solution particulièrement intéressante, nous suggérons d'appuyer les travaux sur une base de données accueillant ce formulaire tabulaire des clients.
  • Télécharger le fichier compressé filtrer-formulaire-saisie.rar en cliquant sur ce lien,
  • Le décompresser dans le dossier de votre choix,
  • Double cliquer sur le fichier résultant pour l'ouvrir dans Access,
  • Cliquer alors sur le bouton Activer le contenu du bandeau de sécurité,
  • Dans le volet de navigation sur la gauche, double cliquer sur le formulaire FClients,
Nous trouvons les clients avec leur nom, prénom et profession. En dessous, une liste permet de choisir le champ à filtrer. Mais la saisie de lettres dans la zone du dessous, ne filtre pas encore le formulaire.

La trace de la saisie
Les caractères saisis doivent être mémorisés dans une variable publique. De cette manière, la procédure événementielle à appeler à chaque lettre tapée, se souviendra du texte à consolider et à utiliser pour le filtre.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
Ainsi, nous basculons sur la vue en conception du formulaire.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Access,
  • Sous la déclarative déjà présente, réaliser la déclaration suivante :
Option Compare Database
Dim lettres As String


C'est donc dans la variable lettres, déclarée comme un texte (As String), que nous stockerons les caractères successivement tapés par l'utilisateur dans la zone de filtre.

Champ à filtrer par défaut
Ensuite et pour des raisons d'ergonomie, nous souhaitons que l'utilisateur n'ait pas forcément besoin de définir le champ à filtrer, avant d'inscrire les premières lettres. Pour cela, au chargement du formulaire, nous suggérons de caler la liste de choix sur l'un des champs de la table.
  • En haut de la feuille de code, déployer la liste déroulante de gauche,
  • Dans les propositions, choisir l'objet Form,
Il s'agit du formulaire parent. Et cette action a pour effet de créer la procédure événementielle Form_Load. Son code se déclenchera à chaque chargement (Ouverture) du formulaire.
  • Dans les bornes de la procédure événementielle, ajouter les deux instructions suivantes :
...
Me.champFiltre.Value = "Client_prenom"
Me.texteFiltre.SetFocus
...


Me désigne l'objet parent, soit le formulaire hébergeant tous les autres contrôles. Par voie hiérarchique, nous descendons dans un premier temps jusqu'à liste déroulante pour la caler sur le champ Client_prenom. Dans un second temps, grâce à sa méthode SetFocus, nous activons la zone de saisie (texteFiltre) pour que l'utilisateur n'ait pas à cliquer dedans avant de taper les premières lettres.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Fermer ce dernier en cliquant sur la croix de son onglet,
  • Puis, le rouvrir en double cliquant sur son nom depuis le volet de navigation,
Activer une zone de saisie sur ouverture du formulaire Access en VBA

Comme vous pouvez l'apprécier, la liste déroulante propose en effet le champ demandé et la zone de texte est prête à la saisie, donc prête à filtrer. Mais pour cela, faut-il encore que nous ayons bâti le code VBA qui doit réagir à chaque lettre tapée.

La procédure VBA
Chaque formulaire Access propose des propriétés et méthodes naturelles pour paramétrer des filtres sur les données qu'il héberge. Ici, nous devons les régler en fonction du champ choisi et selon les caractères tapés les uns à la suite des autres. Il est donc question de scruter la saisie de l'utilisateur dans la zone de texte nommée texteFiltre. Nous devons lui associer une procédure événementielle.
  • Revenir sur le formulaire en cours d'exécution,
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • En bas du formulaire, cliquer sur la zone texteFiltre pour la sélectionner,
  • Activer l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à son événement Sur touche relâchée,
  • Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
Ainsi, nous revenons dans l'éditeur VBA Access, entre les bornes de la procédure événementielle texteFiltre_KeyUp. Son code se déclenchera après chaque inscription d'une nouvelle lettre dans cette zone. Le premier argument de cette procédure est nommé KeyCode. Il représente la valeur numérique de la touche enfoncée. Nous devons l'interpréter. Pour cela, nous avons besoin d'une variable.
  • Dans les bornes de la procédure, ajouter la déclaration et l'affectation suivantes :
...
Dim i As Integer

i = KeyCode
...


KeyCode est le code numérique correspondant à la touche enfoncée. Cette constante ne gère pas les touches des accents. Par exemple le é renvoie 2. Mais nous savons déjà remplacer tous les accents par leurs homologues dans les comparaisons. Une formation avait démontré la technique.

La touche enfoncée
Grâce à cette variable, il est maintenant question de connaître la nature de la touche enfoncée. Les contextes sont nombreux. Ceux qui nous intéressent concernent les lettres de l'alphabet, qu'elles soient inscrites en minuscules ou majuscules, ainsi que la barre d'espace. Mais de nombreuses touches peuvent être enfoncées. Donc de multiples cas sont à gérer. Et pour cela, quoi de mieux qu'une instruction SelectCase.
  • A la suite du code, créer l'instruction Select Case suivante :
...
Select Case i
Case 8

Case 37, 39

Case 32, 48 To 57, 65 To 90, 97 To 122

End Select
...

Nous prévoyons donc trois branches. La première (8) intercepte la touche backspace (Supprimer avant). La deuxième considère les flèches du pavé directionnel (37, 39). La dernière (32, 48 To 57, 65 To 90, 97 To 122) considère les lettres de l'alphabet, qu'elles soient tapées en minuscules ou en majuscules ainsi que les chiffres et la barre d'espace.

La touche backspace
Si la touche backspace est enfoncée, nous devons effacer un caractère et rafraîchir le filtre. Lettres est une variable publique. S'il n'y avait qu'un caractère, il n'y en a désormais plus. S'il n'y en avait déjà plus, nous devons réaffecter la variable publique en conséquence pour que le filtre ne soit pas considéré.
  • Dans la première branche du SelectCase, ajouter l'instruction conditionnelle suivante :
Case 8
If Len(lettres) = 1 Or Len(lettres) = 0 Then
lettres = ""
Else
lettres = Left(lettres, Len(lettres) - 1)
End If
GoTo filtrer

Case 37, 39


S'il n'y a plus de caractères, nous réinitialisons la variable publique en conséquence (lettres = ""). Dans le cas contraire, nous enlevons la dernière lettre grâce aux fonctions Left et Len (Left(lettres, Len(lettres) - 1)), pour réinitialiser le filtre qu'il nous reste encore à construire. Ensuite, nous renvoyons (GoTo) le traitement à une étiquette que nous nommerons filtrer et que nous utiliserons pour réinitialiser le filtre sur le formulaire.

Le pavé directionnel
Lorsqu'une flèche du pavé directionnel est enfoncée pour déplacer le point d'insertion, l'action doit être ignorée pour ne pas solliciter inutilement le filtre.
  • Dans la deuxième branche du Select Case, ajouter l'instruction VBA suivante :
...
GoTo filtrer
Case 37, 39
SendKeys "{END}"
Case 32, 48 To 57, 65 To 90, 97 To 122
...


Grâce à la fonction SendKeys, nous envoyons le pointeur à la fin de la chaîne (End). De cette manière, nous ignorons l'action pour ne rien faire et n'entreprendre aucun filtre. Nous le verrons, c'est une étiquette intermédiaire et que nous placerons après le Select Case, qui barrera la route lorsque la suite du traitement ne sera pas renvoyée à une autre étiquette, à construire, que nous nommerons filtrer.

Les lettres et les chiffres
Dans le cas de lettres ou de chiffres tapés, l'information doit être consolidée, pour que le filtre qu'il nous reste encore à paramétrer puisse la considérer.
  • Dans la troisième branche du Select Case, ajouter les lignes VBA suivantes :
...
Case 32, 48 To 57, 65 To 90, 97 To 122
lettres = lettres & Chr(i)
Me![texteFiltre] = lettres
GoTo filtrer

End Select
...


Nous ajoutons le caractère tapé dans la variable publique (lettres = lettres & Chr(i)). Nous inscrivons le résultat de la consolidation dans la zone de filtre (Me![texteFiltre]= lettres). Puis, nous appelons l'étiquette filtrer (GoTo filtrer), qui doit se charger de réorganiser les données du formulaire en conséquence.

L'étiquette
Il est maintenant nécessaire de construire l'étiquette. L'action doit avorter le traitement lorsque la touche enfoncée ne vaut pas la peine d'être traitée. L'étiquette doit initialiser le filtre lorsque la touche vaut la peine d'être considérée.
  • Après le Select Case, ajouter les instructions VBA suivantes :
...
End Select

Exit Sub

filtrer:

...

Lorsque la branche du Select Case précédent ne renvoie par directement sur l'étiquette filtrer, le traitement est avorté par l'instruction Exit Sub. Ce cas se produit lorsque les flèches du pavé directionnel sont notamment enfoncées.

Organiser le filtre
En fonction du champ choisi avec la liste déroulante, les données du formulaire tabulaire doivent maintenant être réorganisées et restreintes selon les caractères tapés dans la zone de texte.
  • Après l'étiquette nommée filtrer, ajouter les lignes VBA suivantes :
...
filtrer:
If Len(lettres) = 0 Then
Me.FilterOn = False
Else
Me.Filter = "[" & Me![champFiltre] & "]" & + "like '" & lettres & "*'"
Me.FilterOn = True
End If
Me.OrderBy = "[" & Me!champFiltre & "] " & "ASC"
Me.OrderByOn = True
Me.texteFiltre.SetFocus
SendKeys "{END}"

...


Lorsque les lettres tapées ne sont plus suffisantes (Len(lettres) = 0), à cause de la touche BackSpace par exemple, nous désactivons la fonction de filtre sur le formulaire (Me.FilterOn = False). Dans le cas contraire, grâce à la propriété Filter du formulaire (Me), nous cherchons à isoler les enregistrements pour lesquels les lettres tapées (lettres) commencent de la même façon (like *) sur le champ choisi pour le filtre (champFiltre). Dès lors, nous activons la fonction de filtre (Me.FilterOn = True). Puis, nous organisons un tri croissant sur ce champ (OrderBy) et nous déclenchons ce dernier (Me.OrderByOn = True). Enfin, nous rendons le focus à la zone texteFiltre (texteFiltre) et envoyons le point d'insertion à la toute fin des caractères tapés, grâce à la fonction SendKeys et à son paramètre END.

Filtrer le formulaire tabulaire
La construction du code VBA est déjà terminée. Il ne nous reste plus qu'à le tester.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Exécuter ce dernier, par exemple en enfonçant la touche F5 du clavier,
  • En bas du formulaire, avec la liste déroulante choisir de filtrer sur le champ client_nom,
  • Dans la zone de saisie du dessous, taper tout d'abord la lettre D,
Comme vous pouvez le voir, la vue du formulaire est instantanément filtrée pour ne conserver que les clients dont le nom commence effectivement par la lettre D.
  • Taper maintenant la lettre O,
filtrer automatquement à la saisie sur un formulaire Acccess

Il ne reste plus que deux clients. Il s'agit de deux médecins dont les noms commencent par la lettre D suivie de la lettre O. Bien sûr, si vous changez de champ pour préférer filtrer sur la profession, vous obtenez très rapidement toutes les personnes exerçant exactement le même métier. Remarque : Cette syntaxe que nous avons utilisée avec le point d'exclamation suivi du contrôle enfant entre crochets, n'est pas coutumière. Elle respecte les standards des requêtes de correspondance que nous avons l'habitude de construire. Ici, une fois n'est pas coutume, nous voulions la mettre à l'honneur par le code VBA. C'est une autre façon de programmer avec ce langage qui est décidément plein de surprises et de potentiel.

 
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