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.
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)