
Cet article a pour but d’expliquer l’implémentation de l’auto-complétion dans une zone de texte de recherche de contacts dans Microsoft Access.
Contexte :
On souhaite rechercher des personnes par le nom, le prénom ou l’adresse mail dans une liste de contacts :

Contrôles de base :
Par défaut, Access nous propose les contrôles ListBox et ComboBox qui permettent d’afficher la liste des contacts et de faire de la recherche sur la première colonne affichée.
ListBox : la recherche se fait uniquement sur la première lettre du nom :

ComboBox : l’affichage est correct, l’auto-complétion se fait sur la colonne "Nom" mais il manque la possibilité de rechercher sur le prénom et l’adresse mail :

Solution proposée :
On crée un formulaire "Test" et on ajoute les contrôles suivants :

On va utiliser une TextBox : "txtRECH" et une ListBox : "lstRECH" pour réaliser notre recherche en auto-complétion.
La TextBox va permettre à l’utilisateur de saisir sa recherche.
La ListBox va permettre d'afficher le résultat de la recherche.
Plus l’utilisateur va saisir des caractères, plus la recherche sera affinée.
Par défaut, l’affichage du résultat de la recherche se fait dès qu'il saisît au minimum 2 caractères.
Le rectangle présent devant l’étiquette « Recherche » est un bouton transparent : btnFocus qui permet de recevoir le focus est ainsi gérer les problèmes d’initialisation des contrôles.
Code à implémenter dans le formulaire "Test" :
Option Compare Database
Option Explicit
'Variable locale pour stocker la saisie de l'utilisateur
Dim mRECH As String
Private Sub clear_RECH()
'Procédure pour vider les variables
mRECH = ""
Me.txtRECH = ""
Me.lstRECH.Visible = False
End Sub
Private Sub lstRECH_Click()
'Procédure qui ouvre la fiche contact lorsque l'on clique sur un enregistrement de la ListBox
If Me.lstRECH.ListCount > 0 And Not IsNull(Me.lstRECH.Column(0, Me.lstRECH.ItemsSelected)) Then
DoCmd.OpenForm "DétailsContact", , , "ID=" & Me.lstRECH.Column(0, Me.lstRECH.ItemsSelected)
Me.btnFocus.SetFocus
Call clear_RECH
End If
End Sub
Private Sub txtRECH_AfterUpdate()
'Procédure qui ouvre la fiche contact lorsque qu'il n'y a qu'un enregistrement de la ListBox
If Nz(Me.txtRECH, "") <> "" Then
If Me.lstRECH.ListCount = 2 Then
DoCmd.OpenForm "DétailsContact", , , "ID=" & Me.lstRECH.Column(0, 1)
Me.btnFocus.SetFocus
Call clear_RECH
End If
End If
End Sub
Private Sub txtRECH_GotFocus()
Call clear_RECH
End Sub
Private Sub txtRECH_KeyDown(KeyCode As Integer, Shift As Integer)
'Procédure qui enregistre la saisie de l'utilisateur dans la TextBox
If Me.txtRECH.SelLength > 0 Then
mRECH = ""
Me.txtRECH = ""
End If
Select Case KeyCode
Case 8 'Backspace
If Nz(mRECH, "") <> "" Then
mRECH = Mid(mRECH, 1, Len(mRECH) - 1)
End If
Case 32 'Espace
mRECH = mRECH & "*"
Case 54, 109 'Tiret
mRECH = mRECH & Chr(45)
Case 56 'Underscore
mRECH = mRECH & Chr(95)
Case 48 To 122
If KeyCode >= 96 And KeyCode <= 105 Then
'Prise en compte du pavé numérique
mRECH = mRECH & Chr(KeyCode - 48)
Else
mRECH = mRECH & Chr(KeyCode)
End If
End Select
Call load_lstRECH
End Sub
Private Sub load_lstRECH()
Dim mSQL As String
'Procédure qui alimente la ListBox en fonction de la recherche de l'utilisateur
If Nz(mRECH, "") <> "" Then
If Len(mRECH) > 1 Then
mSQL = "SELECT [Contacts].[ID], [Contacts].[Nom], [Contacts].[Prénom], [Contacts].[AdresseMessagerie] "
mSQL = mSQL & "FROM Contacts "
mSQL = mSQL & "WHERE UCASE([Contacts].[Nom]) LIKE '*" & Replace(UCase(mRECH), "'", "''") & "*' "
mSQL = mSQL & "OR UCASE([Contacts].[Prénom]) LIKE '*" & Replace(UCase(mRECH), "'", "''") & "*' "
mSQL = mSQL & "OR UCASE([Contacts].[AdresseMessagerie]) LIKE '*" & Replace(UCase(mRECH), "'", "''") & "*' "
mSQL = mSQL & "ORDER BY [Nom], [Prénom];"
Me.lstRECH.RowSource = mSQL
If Me.lstRECH.ListCount = 0 Then
Me.lstRECH.Visible = False
Else
Me.lstRECH.Visible = True
Me.lstRECH.Height = 2000
End If
End If
Else
Me.lstRECH.Visible = False
End If
End Sub
Form_Test (Code)
Lors du lancement du formulaire "Test", la TextBox est affichée et la ListBox est masquée :

Dès que l’utilisateur saisît 2 caractères, on lance la recherche et on affiche la ListBox.
L’utilisateur accède à la fiche contact en cliquant sur l’enregistrement souhaité de la ListBox ou en continuant de saisir des caractères pour n’obtenir qu’un enregistrement.
Dans ce cas-là, on accède à la fiche contact en appuyant sur la touche "Entrée".



La solution proposée n’est pas parfaite mais permet de faciliter la recherche et d’accroitre l’expérience de l’utilisateur.
Enregistrer
Enregistrer
Excellent article. Merci !