Saisie semi-automatique des combos access en vb

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 089 fois - Téléchargée 41 fois

Contenu du snippet

Bonjour à tous,

qui n'a pas déjà été frustré par les combos sous VB (au moins jusqu'à la version 6, après j'ai pas testé :)), car on ne peut pas taper quelques lettres pour sélectionner automatiquement le premier élément de la liste qui correspond. Comme sous access quoi !

Bon, ça vaut ce que ça vaut hein, mais comme ça m'a pas mal servi, je me permet de vous le fournir.
J'espère que ça va vous être utile :)

Source / Exemple :


'REMARQUE A SUPPRIMER
'Cette procédure est à appeler sur le KeyUp de la ComboBox, comme suit
    If (KeyCode >= vbKey0 And KeyCode <= vbKey9) Or _
            (KeyCode >= vbKeyA And KeyCode <= vbKeyZ) Or _
            (KeyCode >= vbKeyNumpad0 And KeyCode <= vbKeyNumpad9) Then
        AutoSelection Me.cboMaCombo.Text, Me.cboMaCombo
    End If
'FIN REMARQUE

Sub AutoSelection(rstrValeurSaisie As String, rctlCombo As ComboBox)
'======================================================
'
'   PURP.  : Simule les combos de access : on tape les
'       premières lettres, et l'appli complète avec
'       les données correspondantes dans la liste
'
'======================================================
'   Déclaration des variables
'======================================================
Dim strTemp As String
Dim i As Integer
Dim n As Integer
Dim intLongueur As Integer
'======================================================

On Error GoTo AutoSelection_Err

    n = rctlCombo.ListCount - 1
    intLongueur = Len(rstrValeurSaisie)
    
    With rctlCombo
        For i = 0 To n
            If StrComp(Left(.List(i), intLongueur), rstrValeurSaisie, vbTextCompare) = 0 Then
                'On a trouvé un élément qui commence comme la valeur saisie
                'on le sélectionne
                .ListIndex = i
                'On surligne la fin du mot
                .SelStart = intLongueur
                .SelLength = Len(.Text) - intLongueur
                Exit For
            End If
        Next i
    End With

AutoSelection_End:
    Exit Sub
    
AutoSelection_Err:
    msgbox err.Number & " : " &  err.description
    Resume AutoSelection_End
    Resume

End Sub

Conclusion :


Voilou les loulous,
le code peut être simplifié (dans l'appel, on peut ne mettre que la référence à la combo, et traiter sa valeur dans la procédure).
Merci de laisser des commentaires :)

@peluche et bon dev'
DA

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
dimanche 23 avril 2006
Statut
Membre
Dernière intervention
29 août 2007

la différence entre keyUp et Change dans cet exemple est l'entrée détectée par keyUp et pas par Change c'est tout
Merci pour vous deux pour le code
intéressant
Messages postés
1133
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
OUPS j'ai envoyé mon commentaire trop vite...

L'avantage de ta méthode, c'est que la procédure est utilisable par tout les combo de l'application sans qu'il soit nécessaire de taper tout ce que j'ai tapé dans ma procédure.

Mais pourquoi appeler la procédure sur le KeyUp du Combo plutôt que le Change ?
9/10
Messages postés
1133
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Personnellement je procède autrement:

Private Sub MonCombo_Change()
Dim t As String
Dim i As Integer

'Je recueille le texte tapé
t = UCase(MonCombo.Text)

If t = "" Then Exit Sub

'Je passe en revue chacun des items de ma liste déroulante
For i = 0 To MonCombo.ListCount - 1

'Si l'un des items commence par ma saisie...
If UCase(Left(MonCombo.List(i), Len(t))) = t Then

'...je considère cet item comme celui à afficher
MonCombo.Text = MonCombo.List(i)

'...je m'organise pour sélectionner ce que je n'ai pas encore saisie
MonCombo.SelStart = Len(t)
MonCombo.SelLength = Len(MonCombo.List(i)) - Len(t)

'...je quitte la procédure
Exit Sub
End If
Next
End Sub

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.