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

Créer une liste déroulante dont le nom sera « lmFiltre », puis réglons quelques propriétés 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 lmFiltre_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 And Not Shift=1 Then
   strlist = ""
   Me.lmFiltre.RowSource = "SELECT MSysObjects.Id, MSysObjects.Name " & _ " FROM MSysObjects;"
   Me.lmFiltre.Text = ""
Else
   strlist = strlist & Chr(KeyCode) 'ajoute la touche pressée
   Me.lmFiltre.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ée et relâchée, l’évènement « Sur souris relâchée » est invoqué. Le code (KeyCode) de la touche est analysé.
Si c’est 27, soit la touche Echap, on vide le filtre contenu dans 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.

2 réflexions sur « ACCESS : Filtrer une zone de liste déroulante à l’appuie d’une touche. »

  1. Bonjour,
    je cherche à trier une liste déroulante depuis trois mois déjà.
    Je ne suis pas initié sur VBA et n’y comprends presque rien.
    J’ai récupéré sur internet un code vba définissant une liste déroulante qui fonctionne bien.
    Mon soucis, c’est de trier par ordre alphabétique les nom et prénom. Si vous voulez bien m’aider, vous feriez , à coup sûr , un bienheureux .
    Ci-après le code en question:

    Private Sub liste_clients_Change()
    Dim ligne As Recordset: Dim base As Database

    purger_table
    Set base = Application.CurrentDb
    Set ligne = base.OpenRecordset(« SELECT * FROM Clients WHERE num_client= » & liste_clients.Value, dbOpenDynaset)

    ligne.MoveFirst

    n_client.Value = liste_clients.Value
    civilite.Value = ligne.Fields(« civilite_client »).Value
    nom_client.Value = ligne.Fields(« nom_client »).Value
    prenom_client.Value = ligne.Fields(« prenom_client »).Value

    ligne.Close
    base.Close
    Set ligne = Nothing
    Set base = Nothing
    End Sub
    Je vous remercie par avance .
    Meilleures salutations

    • Bonjour,
      Pour un tri à partir d’un recordset il faut utiliser la clause Order by de SQL, comme ceci :
      Set ligne = base.OpenRecordset(« SELECT * FROM Clients WHERE num_client= » & liste_clients.Value &  » ORDER BY nom_client, prenom_client »,, dbOpenDynaset)

Laisser un commentaire

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