ACCESS : Filtrer une zone de liste déroulante à l’appuie d’une touche.

Dans ce petit billet nous allons mettre en œuvre un système de filtrage d’une zone de liste déroulante en temps réel. Pour cela nous avons besoin d’une table et d’un formulaire contenant une zone de liste déroulante.

La liste déroulante

Commençons par régler quelques propriétés de la liste pour quelle affiche les données de la table. Pour l’exemple j’utilise la table système MSysObjects.

Contenu : SELECT [MSysObjects].[Id], [MSysObjects].[Name] FROM MSysObjects;
Nbre colonnes : 2
Largeurs colonnes : 0cm;2,54cm

La colonne Name sera visualisée et le filtre agira sur celle-ci.

Le code VBA

Allez sur la propriété « Sur touche relâchée » cliquez que le bouton de création et sélectionnez Générateur de code et entrez le code suivant :

Private Sub Modifiable0_KeyUp(KeyCode As Integer, Shift As Integer)
'ce n'est pas un caractère A-Z a-z (à affiner) ni un Espace
If KeyCode < 64 Or KeyCode > 123 And Not KeyCode = 32 Then
   strlist = ""
   Me.Modifiable0.RowSource = "SELECT MSysObjects.Id, MSysObjects.Name " & _
                        " FROM MSysObjects;"
   Me.Modifiable0.Text = ""
Else
   strlist = strlist & Chr(KeyCode) 'ajoute la touche pressée
   Me.Modifiable0.RowSource = "SELECT MSysObjects.Id, MSysObjects.Name " & _
           " FROM  MSysObjects where MSysObjects.Name like """ & strlist & "*"";"
End If
End Sub

Pour le fonctionnement nous avons besoin de déclarer une variable publique au formulaire. Placez-vous juste après les premières lignes d’option du module de formulaire.

Option Compare Database
Option Explicit

Dim strlist As String

Comment ça fonctionne ?

A chaque touche appuyé, à l’évènement du relâcher, l’évènement est invoqué. Le code (KeyCode) de la touche pressée est analysé.
Si c’est 27, soit la touche Echap, on vide le filtre (strListe) et on affecte à la source la requête d’origine ; sans la condition Where.
Si le code est compris entre 64 et 123 (caractère a-z A-Z, chiffres virgule…) on ajoute le code sous forme de caractère ( Chr(KeyCode) ) à la liste et on applique le filtre.
La condition Where utilise un Like. On peut modifier le comportement du filtre en agissant sur les « jokers » du Like.

Conclusion

Voilà c’est posé, il n’y a plus qu’à compiler et tester.

Avertissement

Ce code montre une méthode mais n’est pas parfait, en effet certains caractères ne sont pas pris en compte comme les caractères accentués. A vous de jouer pour les ajouter.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *