Auto-complétion dans Microsoft Access

ScreenHunter_625 Aug. 29 11.09

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 :
LISTE_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 :
LISTBOX

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 :
COMBOBOX

Solution proposée :

On crée un formulaire "Test" et on ajoute les contrôles suivants :
Form_Test
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 :
RESULT1
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".
RESULT2
RESULT4
RESULT4

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

Un commentaire

Laisser un commentaire

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

Captcha *