ACCESS : se positionner sur l’item d’une liste déroulante en entrant une partie du texte.

Dernièrement, un internaute me demandait s’il était possible de modifier le fonctionnement de l’auto complétion dans les listes déroulante. S’agissant d’une fonctionnalité interne d’ACCESS, il est évident que ce n’est pas possible nativement.

Par contre on peut toujours contourner le problème à l’aide du code VBA. Voici cette astuce basée sur l’utilisation de l’évènement KeyPress (touche pressée) de la liste.

On commence par créer une variable globale dans le formulaire pour stocker les touches pressées.

Option Compare Database
Option Explicit
Dim strList As String   'stocke les keycode

A chaque touche tapée par l’utilisateur, on parcourt la liste à la recherche du premier item correspondant aux caractères saisis.

Private Sub Modifiable1_KeyPress(KeyAscii As Integer)
Dim i As Long
'contrôle les touches
If KeyAscii = 27 Then strList = ""  'Sur Echap vide le contenu
If Not (KeyAscii > 64 And KeyAscii < 123) Then Exit Sub  
'ce n'est pas un caractère A-Z a-z (à affiner)

strList = strList & Chr(KeyAscii)  'ajoute la touche pressée

For i = 0 To Me.Modifiable1.ListCount - 1  'parcours les items
    If Me.Modifiable1.Column(1, i) Like "*" & strList & "*" Then  
       'l'item correspond

       'pour un liste
       'Me.Modifiable1.ListIndex = i  'on s'y positionne

       'pour une liste déroulante
       Me.Modifiable1 = Me.Modifiable1.Column(0, i)

       Exit For  'et on sort
    End If
Next
End Sub

La méthode suivante donne la valeur de la colonne 2 de la ligne i.

Column(1, i)

Likz est un opérateur logique commun à SQL et VBA.

Like "*" & strList & "*"

Par sécurité on vide les caractères saisis sur la prise et la perte du focus.

Private Sub Modifiable1_GotFocus()
strList = "" 'perte du focus on vide la liste de touche
End Sub
Private Sub Modifiable1_LostFocus()
     strList = ""   'perte du focus on vide les keycode
End Sub

Comme vous le voyez, rien de complexe, on utilise juste les nombreuses possibilités d’Access pour contourner le problème. Il va sans dire que l’auto complétion classique de la liste fonctionne toujours.

N’hésitez pas à affiner le contrôle des touches tapées, en effet, dans cet exemple seul l’alphabet classique est pris en compte, il manque les caractères accentués, les chiffres…

2 réflexions sur « ACCESS : se positionner sur l’item d’une liste déroulante en entrant une partie du texte. »

  1. Bonjour Jérémie,
    L’opérateur LIKE dans VBA utilise exclusivement les jokers valides dans JET. Ceux-ci ne sont pas standards. Le % utilisé dans les formes ISO de SQL (SQL-92 par exemple) doit être remplacé par *. Même si tu utilises une base de données non JET (sql server, oracle…).
    Remplace tes % par des * et tout rentrera dans l’ordre.
    N’oublie pas d’affiner le type de caractères autorisés car dans cet exemple seuls les caractères A-Z et a-z sont pris en compte. Une fonction réutilisable peut être envisagée.
    Bonne continuation !

  2. Bonjour, je découvre votre méthode et j’essaye de la mettre en application mais ça ne fonctionne pas. Je suis sur Access 2010.
    la liste des touches utilisées semblent bien fonctionner mais c’est la recherche dans la liste qui ne donne rien.
    Pouvez vous m’aider svp ?

Répondre à fabrice Annuler la réponse

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