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.