Icône de la ressource

VBA - Saisie filtrée (alias saisie intelligente) en ComboBox V7

Dudu2

XLDnaute Barbatruc
Dudu2 a soumis une nouvelle ressource:

VBA - Saisie Assistée (alias saisie intelligente) en ComboBox - Ajuster la liste des termes d'une ComboBox en fonction des caractères saisis

La "Saisie Assistée" sur ComboBox parfois dénommée "saisie intelligente" consiste à actualiser dynamiquement les valeurs d'une ComboBox au fur et à mesure de la saisie des caractères tout en permettant la sélection d'une valeur dans la liste affichée.

La ComboBox peut appartenir à un UserForm ou être une ComboBox Active X sur une...

En savoir plus sur cette ressource...
 

roby

XLDnaute Occasionnel
bonjour DuDu2

Ton code est intéressant mais assez compliqué à comprendre, j'aimerai malgré tout laisser (ou forcer) le click de la souris pour valider la combobox et surtout d'en sortir pour passer à un textbox par exemple.

J'ai remarqué également que les noms de la base se finissent par un espace, est-ce voulu ?

Est-ce possible ?

Merci pour ton retour
Roby
 

Dudu2

XLDnaute Barbatruc
Bonjour @roby
Ton code est intéressant mais assez compliqué à comprendre
Ce code est fait pour être utilisé sans vraiment chercher à comprendre sauf si tu veux modifier des choses mais alors je te recommanderais plutôt de partir d'une feuille blanche car ce code est vraiment dédié à la fonctionnalité annoncée et très lié aux évènements ComboBox_Enter() et ComboBox_Change().

j'aimerai malgré tout laisser (ou forcer) le click de la souris pour valider la combobox et surtout d'en sortir pour passer à un textbox par exemple.
Mis à part le fait que la liste de la ComboBox évolue au gré de la saisie des caractères, c'est une ComboBox tout à fait classique et les sélections et clics sont ceux du standard ComboBox.

Dans les commentaires, il est précisé:
Ces 2 fonctions retournent accessoirement l'index dans le tableau ou le Range original de la valeur affichée de la ComboBox ou -1 si cette valeur ne fait pas partie de la liste.
Cela veut dire que tu peux donc intercepter le fait qu'une valeur a été choisie (cliquée dans la DropDown list) et passer au Control TextBox suivant.

Donc au lieu de faire comme dans l'exemple basique du code:
Code:
'---------------
'ComboBox Change
'---------------
Private Sub ComboBoxTest_Change()
    Call SaisieAssistéeComboBoxChange
End Sub

Tu vas faire quelque chose comme ça:
VB:
'---------------
'ComboBox Change
'---------------
Private Sub ComboBoxTest_Change()
    Dim IndexChoisi As Long
 
    'Index dans le tableau d'origine passé sur le ComboBoxTest_Enter()
    IndexChoisi = SaisieAssistéeComboBoxChange
 
    'IndexChoisi <> -1 => C'est l'indice de la valeur choisie dans le tableau d'origine
    If Not IndexChoisi = -1 Then
        MsgBox "Valeur choisie = <" & _
               ThisWorkbook.Worksheets("Liste Clients").ListObjects("TableauClients").DataBodyRange.Cells(IndexChoisi, 1) & _
               ">."
        Me.TextBox1.SetFocus
    End If
End Sub

Ou encore:
VB:
'---------------
'ComboBox Change
'---------------
Private Sub ComboBoxTest_Change()
    Dim IndexChoisi As Long
 
    'Index dans le tableau d'origine passé sur le ComboBoxTest_Enter()
    IndexChoisi = SaisieAssistéeComboBoxChange
 
    'IndexChoisi <> -1 => C'est l'indice de la valeur choisie dans le tableau d'origine
    If Not IndexChoisi = -1 Then
        MsgBox "Valeur choisie = <" & ComboBoxTest.Value & ">."
        Me.TextBox1.SetFocus
    End If
End Sub

J'ai remarqué également que les noms de la base se finissent par un espace, est-ce voulu ?
J'ai récupéré ces infos je ne sais plus où mais je ne vois pas d'espace qui finirait les noms du tableau.

nomsbase.gif
 
Dernière édition:

roby

XLDnaute Occasionnel
Re DuDu2

Une petite précision en effet, la base proprement dite est constituée de deux colonnes voir plus si besoin.
les pays du monde et les capitales pour l'exemple.
Donc pour moi ses colonnes ne changeront pas. Le pb à priori était de remplir la combo rapidement, ça c'est ok mais dans le textbox suivant afficher directement les info correspondants à la colonne 2 ou 3 ...

Ce qui est intéressant c'est le temps de la saisie.

merci encore à toi
Roby
 

moto747

XLDnaute Nouveau
Bonjour Dudu2,

Avant tout super travail!!!!!

Votre fichier fonctionne très très bien, mais des que je l'importe dans mon projet, j'ai une erreur.

Je pense avoir correctement suivi vos instructions mais y a que moi qui le pense 😁.
Ci dessous, une image montrant l'erreur de compilation que j'ai. J'ai eu beau chercher, tester, j'ai toujours cette erreur.

erreur.jpg


Auriez vous une idée d'où cela pourrait provenir.

En vous remerciant

Bonne journée
 

Dudu2

XLDnaute Barbatruc
Bonjour @moto747,
@lulu2013 m'a récemment signalé ce problème et en a même trouvé l'origine.
Il faut soit récupérer la dernière version (V6) publiée récemment, soit effacer le RowSource de la ComboBox.
J'espère que c'est le même problème.
 

moto747

XLDnaute Nouveau
Bonjour @Dudu2 ,

Merci de ton retour.

Comme c'est une erreur de compilation pour VBA, impossible de vider le RowSource de la ComboBox. J'ai malgré tout tenté.

Le code est développé sous Microsoft Visual Basic Application 7.1. Je ne vois pas comment faire pour revenir à une version antérieur (qui ne serai plus la dernière si c'est la 7).

Ce que je trouve intriguant c'est que ton fichier fonctionne parfaitement avec la même version de VBA (7.1) et que dans mon projet je n'ai aucun soucis avec les combobox des formulaires. J'utilise combobox.list sans soucis.

Je vais continuer à creuser au cas où je trouverai le pourquoi du comment.

Bonne journée.
 

Dudu2

XLDnaute Barbatruc
Bonjour,
impossible de vider le RowSource de la ComboBox
Dans les propriétés de la ComboBox, c'est impossible que ce soit impossible.
Dans le Projet VBA, affiche le UserForm, fait F4 pour afficher les propriétés, sélectionne la ComboBox et vérifie que RowSource est bien vide.

1702283318688.png


Ou alors utilise la dernière version (V6) de la ressource publiée le 7 décembre dernier dont le code efface le RowSource.

Est-ce que tu as procédé à l'une ou l'autre de ces 2 manips déjà mentionnées plus haut ?
 
Dernière édition:

moto747

XLDnaute Nouveau
Hello, désolé, j'ai pas du tout pensé à la fenêtre propriété de la combobox. Je voulais le faire par le code. Un vrai boulet.
La propriété est bien vide malheureusement. 😪.
Je suis entrain de récupérer la V6 et je te dis tout dès que j'ai pu le tester. (je suis au travail).

Merci pour tout

Bonne journée
 

Dudu2

XLDnaute Barbatruc
Je ne pense pas que la V6 va régler le problème puisqu'elle ne fait qu'effacer le RowSource.
C'est un ComboBox de UserForm ou un Control Active X ?
 

crocrocro

XLDnaute Impliqué
Bonjour Dudu2,
superbe complément de saisie par ComboBox !👍👍👍

De mon côté, j'avais mis au point une saisie assistée par TextBox, avec une présentation "en cours de frappe" de la liste des valeurs les plus proches par rapport à une liste de référence. Le résultat en dynamique étant affichée au-dessous de la TextBox avec une présentation par niveau de ressemblance décroissant.

On aurait dit que tu l'avais fait rien que pour moi ;)

En pj ton fichier (nom suffixé) auquel j'ai ajouté "un peu au chausse-pied", mon code.
J'ai ajouté :
- une nouvelle feuille "Options Proche" qui donne des explications sur le mode d'évaluation du niveau de ressemblance avec des exemples
- un nouveau module "Module_Type_Recherche_Proche" avec mon code
J'ai dû faire quelques petites modifications de ton code :
- des variables privées passées publiques (j'ai mis en commentaire les privées passées publiques
- j'ai ajouté ce code pour mon option "proche"
VB:
            'Recherche par proche
            Case 3
                ActualiserMoteurRecherche ComboBoxText
- j'ai dû ajouter une variable TabItemsSélection2 à cause du transpose sur TabItemsSélection qui génère une anomalie sur le redim preserve (puisque seule la dernière dimension peut être modifiée)
- j'ai forcé à 3 la variable KeepTypeFiltrage pour activer systématiquement le mode "proche".
dernière minute, une erreur non corrigée dans mon fichier :
suite à la variable NbItemsSélection rendue publique, elle n'est plus réinitialsée à chaque appel de la fonction => avant le Select Case KeepTypeFiltrage
VB:
NbItemsSélection = 0

Si tu as le temps et l'envie de tester et d'intégrer plus proprement mon code à ton fichier ...
Merci encore.
 

Pièces jointes

  • Saisie Filtrée ComboBox-crocrocro.xlsm
    90 KB · Affichages: 3
Dernière édition:

crocrocro

XLDnaute Impliqué
en pj, avec :
- la correction de l'erreur sur NbItemsSélection
- la 2ème colonne du tableau client est ajoutée dans la Combo si Mode "Proche"
Le code modifié par rapport à mon fichier précédent :
dans ton module
VB:
        NbItemsSélection = 0
        Select Case KeepTypeFiltrage
dans mon module
Code:
                    ' on récupère aussi la 2ème colonne
                    TabItemsSélection(1, NbItemsSélection) = DicoRef(EltNbmotsTrouves)
                    TabItemsSélection(2, NbItemsSélection) = Application.VLookup(DicoRef(EltNbmotsTrouves), Range("TableauClients"), 2, False)
 

Pièces jointes

  • Saisie Filtrée ComboBox-crocrocro.xlsm
    90.8 KB · Affichages: 4

Dudu2

XLDnaute Barbatruc
Bonjour @crocrocro,
Intéressant. Je pense que la meilleure façon d'intégrer ton code serait d'ajouter un paramètre optionnel à la fonction SaisieFiltréeComboBoxEnter() qui permettrait de définir une fonction de recherche qui serait appelée par un Application.Run. Il faut que je voie quels paramètres lui passer. Ce serait alors une sorte de "plugin" pour la recherche.
 

Dudu2

XLDnaute Barbatruc
Ce serait intéressant que tu puisses utiliser le nouveau paramètre SearchFunction pour inclure ton code dans le mécanisme. Un exemple est donné dans le fichier pour la ComboBox UserForm.
VB:
'- FilterFunction:  Nom de la fonction personnalisée de filtrage.
'                   Si cet argument est valorisé, il représente le nom de la fonction qui sera appelée pour le filtrage
'                   des valeurs de la ComboBox par rapport aux caractères saisis. L'argument TypeFiltrage sera alors ignoré.
'                   Cette fonction reçoit en arguments:
'                   - Le texte (String) saisi dans la ComboBox
'                   - La table (Variant) à 2 dimensions (1 to n, 1 to p) des items de la ComboBox
'                   - Le TextColumn (Integer) de la ComboBox
'                   Cette fonction doit retouner:
'                   - La table (Long) à 1 dimension (1 to q) des Index [1 - n] des items sélectionnés dans la table des items de la ComboBox
'                   -------
'                   Exemple: Function MaFonctionFiltrage(ComboBoxText As String, TabItems() As Variant, TextColumn As Integer) As Long()
'                   -------

Ton code pourrait alors être proposé comme un "plugin" à la Ressource.
Essaie avec ce fichier et si cela fonctionne je publierai la nouvelle version de la Ressource et ton "plugin".
 

Pièces jointes

  • Saisie Filtrée ComboBox.xlsm
    71.5 KB · Affichages: 4
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 175
Membres
112 677
dernier inscrit
Justine11