La "Saisie Assistée" sur ComboBoxparfois 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 ComboBoxpeut appartenir à un UserForm ou être une ComboBox Active X sur une...
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 ?
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 ?
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.
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.
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.
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
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.
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.
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 ?
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).
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.
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)
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.
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".