Recherche intuitive combobox userform

Bonjour,

Suite à de nombreuses recherches et ne trouvant pas le code adapté à ma situation, je voudrai obtenir votre aide.

J'ai un combobox dans un userform qui liste une série de commande. je voudrais pouvoir faire apparaitre celle qui contient que quelques caractères tapés (comme lors de la recherche dans un filtre excel), m'évitant ainsi de taper le chiffre complet.

- est-ce en plus faisable que les caractères apparraissent en bleu lors de la recherche

-est ce possible que le résultat obtenu s'affiche dans la combobox pour éviter de descendre avec les fleches ou la souris pour sélectionner le résultat restant

Merci pour votre aide et retour

bav

Xavier

15loca.xlsm (22.32 Ko)

Bonjour xavierdep,

Voir proposition ci-jointe, la liste s'amenuise au fur et à mesure des caractères saisis.

24loca-2.xlsm (31.51 Ko)

Cdlt,

Cylfo

Super merci, ca ressemble à ce que je souhaite.

J'ai essayé de remettre le code dans mon fichier définitif et j'ai ceci qui apparait dès que j'ouvre le userform

image

Je n'arrive pas à comprendre d'ou ca peut venir

Est-il possible:

- de laisser le combobox ouvert lors de la recherche pour voir les résultats s'affiner, ce qui permettrait de sélectionner une des valeurs si j'obtiens plusieurs résultats avec mes données entrées manuellement (le but étant de taper les 4 derniers chiffres de la commande dans la combobox et n'avoir qu'un seul résultat affiché mais au cas ou deux commandes ont les 4 derniers chiffres identiques je peux ainsi sélectionner la bonne sans devoir tout retaper)

- de pouvoir avoir le résultat (si unique) directement affiché dans la combobox sans devoir aller avec la souris ou la fleche dans la liste pour le sélectionner?.

Un grand merci pour votre aide, j'avoue que la votre codage me dépasse et un peu de mal à l'adapter seul :(

bav

Xavier

Bonjour,

C'est un problème de référence.

Soit vous cocher la bonne référence dans Menu/Outils/Références... (Pas très bien pour la portabilité)

000102

Soit il faut travailler en LateBinding exemple :

Dim dicRestreint As Object 'Scripting.Dictionary
Set dicRestreint = CreateObject("scripting.dictionary")

A faire pour les deux dicos...

Re,

Dans la version ci-dessous (j'ai commenté le code pour en faciliter la compréhension) :

  • La liste s'ouvre dès que vous entrez dans le contrôle. J'ai ajouté un contrôle TextBox qui a le focus en 1er pour que vous puissiez tester l'ouverture.
  • S'il n'y a qu'un seul élément, il est sélectionné.
15loca-3.xlsm (34.71 Ko)

Avec mes excuses pour l'oubli du référencement et merci @Jean-Paul. Je n'ouvrirai pas le débat sur le Yearly ou Late Binding mais le fait de référencer la bibliothèque (Yearly Binding) vous permet d'avoir la complétion du code car les méthodes et les propriétés sont exposées donc en terme d'écriture du code et de maintenance, c'est quand même très pratiquemais vous avez les 2 possibilités et donc le choix vous appartient.

Cdlt,

Cylfo

Bonjour à tous,

Je n'ouvrirai pas le débat sur le Yearly ou Late Binding mais le fait de référencer la bibliothèque (Yearly Binding) vous permet d'avoir la complétion du code car les méthodes et les propriétés sont exposées donc en terme d'écriture du code et de maintenance, c'est quand même très pratique

Entièrement d'accord avec cette pensée. Donc le mieux c'est d'utiliser les deux, le Early lors de la conception et le Late Binding pour la distribution.

Voici un exemple sur la base des code de Boisgontier Jacques

16loca-3.xlsm (30.41 Ko)

Re,

Dans la version ci-dessous (j'ai commenté le code pour en faciliter la compréhension) :

La liste s'ouvre dès que vous entrez dans le contrôle. J'ai ajouté un contrôle TextBox qui a le focus en 1er pour que vous puissiez tester l'ouverture.

S'il n'y a qu'un seul élément, il est sélectionné.

5loca-3.xlsm (34.71 Ko)

Avec mes excuses pour l'oubli du référencement et merci @Jean-Paul. Je n'ouvrirai pas le débat sur le Yearly ou Late Binding mais le fait de référencer la bibliothèque (Yearly Binding) vous permet d'avoir la complétion du code car les méthodes et les propriétés sont exposées donc en terme d'écriture du code et de maintenance, c'est quand même très pratiquemais vous avez les 2 possibilités et donc le choix vous appartient.

Cdlt,

Cylfo

Un tout grand merci pour le fichier ainsi que les explications de chaque ligne. Je me rends malheureusement compte de mes lacunes en vba et beaucoup de choses ne me parlent pas. Je vais essayer d'adapter à la suite de ma programmation.

Il me reste néanmoins des problèmes/questions, que je n'arrive pas à solutionner seul:

- quand j'ouvre le userform il m'affiche maintenant la dropdown list mais ailleurs dans mon écran ;)

image

- quand je tape les 4 derniers chiffres (par exemple la commande terminée par 2900) si je tape "290" il m'affiche directement la seule possibilité trouvée mais si je tape le dernier "0" il m'affiche le numéro+ un "0". Ce qui veut dire qu'en allant trop vite le résultat disparait de la combobox (car n'existe plus)- Une fois le résultat trouvé je souhaiterai qu'il fasse apparaitre les données dans la textbox j'ai prévu mon code habituel( je sais peut etre un peu lourd mais a toujours fonctionné avec mes connaissances) mais il me met un message d'erreur et je ne sais pas comment le corriger

image

- J'ai rendu un fichier plus complet car l'idée est qu'à chaque ouverture (ou apres un refresh sur un bouton que je vais ajouter) il aille chercher les colonnes de A à F dans un autre fichier (qui sera écrasé régulièrment avec les données mise à jour). Sur base de ce que je connais j'ai ajouté une colonne M et N pour récupérer les valeurs uniques de commandes (M) et les loca pour cette commande (N). Mon combobox doit donc se baser sur la colonne M et non la K que vous avez ajoutée et que je n'arrive pas à identifier.

Merci encore.

bav

Xavier

15loca-3.xlsm (56.53 Ko)

Re,

Avez-vous testé ma proposition ?

Bonjour Jean-Paul,

J'ai testé et essayé d'adapter voici les problèmes,

-comment faire pour que la commande tapée se retrouve dans le combobox et non éviter de devoir prendre la souris pour l'activer?

- Une fois le résultat trouvé je souhaiterai qu'il fasse apparaitre les données dans la textbox (voir dans mon précédent post) j'ai prévu mon code habituel( je sais peut etre un peu lourd mais a toujours fonctionné avec mes connaissances) mais il me met un message d'erreur et je ne sais pas comment le corriger

image

-J'ai rendu un fichier plus complet dans mon précédent post car l'idée est qu'à chaque ouverture (ou apres un refresh sur un bouton que je vais ajouter) il aille chercher les colonnes de A à F dans un autre fichier (qui sera écrasé régulièrment avec les données mise à jour). Sur base de ce que je connais j'ai ajouté une colonne M et N pour récupérer les valeurs uniques de commandes (M) et les loca pour cette commande (N). Mon combobox doit donc se baser sur la colonne M et non la K que vous avez ajoutée et que je n'arrive pas à identifier.

Merci

Xavier

Bonjour xavierdep,

L'affichage de la liste en haut à gauche de la fenêtre est "corrigé" en déplaçant le code de la méthode "Userform1_Initialize" à "Userform1_Activate". L'erreur principale dans le code d'affichage des données dans la textbox était liée à la déclaration de la variable "Dim ligne() as variant" qui déclarait un tableau, la bonne délcaration est "Dim ligne as long" que j'ai déplacé dans la procédure "CB_LISTECOMMANDE_Change" et j'ai conditionné votre code pour qu'il ne s'exécute que dans le cas où il y a un élément de sélectionné sinon la textbox est effacée.

J'ai mis à True la propriété "MultiLine" pour que les codes s'affichent sur plusieurs lignes.

12loca-4.xlsm (57.07 Ko)

Cdlt,

Cylfo

Super Cylfo

merci, il reste ce point ci que je n'arrive pas à solutionner car je ne sais pas où il va chercher le rowsource du combobox. Je pense dans la colonne K que vous avez incrémenté mais je ne sais pas comment.

- J'ai rendu un fichier plus complet car l'idée est qu'à chaque ouverture (ou apres un refresh sur un bouton que je vais ajouter) il aille chercher les colonnes de A à F dans un autre fichier (qui sera écrasé régulièrment avec les données mise à jour). Sur base de ce que je connais j'ai ajouté une colonne M et N pour récupérer les valeurs uniques de commandes (M) et les loca pour cette commande (N). Mon combobox doit donc se baser sur la colonne M et non la K que vous avez ajoutée et que je n'arrive pas à identifier.

Merci encore

Xavier

Re,

Dans le 1er fichier que vous avez envoyé, la macro (procédure "Button1_Click()" dans le module "open_userform") associée au bouton d'ouverture du formulaire recherche la dernière ligne renseignée en colonne K et charge les données de la colonne A. Comme la colonne K était vode dans l'onglet "DATA", j'ai dupliqué la colonne A pour conserver les références aux colonnes K et A de votre code.
Dans le fichier que je vous ai fourni, le chargement est dans la procédure "UserForm_Activate" du formulaire et plus précisément dans les lignes :

   ' Identifier la dernière ligne renseignée
   nLigFin = Sheets("data").Range("k" & Rows.Count).End(xlUp).Row
   ' Parcourir la plage des références
   For nLig = 2 To nLigFin
      ' Si la référence n'est pas déjà présente dans le dictionnaire, l'ajouter au dico sinon l'ignorer
      If dicRef.Exists(Worksheets("data").Cells(nLig, 1).Value) = False Then dicRef.Add Worksheets("data").Cells(nLig, 1).Value, vbNullString
   Next

où :

nLigFin = Sheets("data").Range("k" & Rows.Count).End(xlUp).Row identifie la dernière ligne renseignée en colonne K

Worksheets("data").Cells(nLig, 1).Value correspond à la donnée de la ligne identifiée par nLig et de la colonne 1 (= colonne A)

Pour l'adapter, il vous suffit donc de remplacer "k" par "M", et 1 par 13

voir version 5

9loca-5.xlsm (55.09 Ko)

Par contre, il y aurait une approche plus simple qui consisterait à charger l'ensemble des 2 colonnes dans le combobox et d'alimenter le textbox avec la 2ème colonne de l'élément sélectionné dans le combobox. Initialement j'avais utilisé un dictionnaire pour ne pas charger des doublons mais si vous chargez les données à partir d'une liste où les doublons ont été supprimés ce n'est plus nécessaire. La référence à "Microsoft Scripting Runtime" peut (doit) être décochée.

voir version 6

20loca-6.xlsm (53.47 Ko)

Cdlt,

Cylfo

Cylfo,

Juste un seul mot ... respect. La solution 6 est parfaite pour moi.

Je testerai demain avec de nouvelles valeurs mais pour moi le résultat est celui que je souhaitais.

Un tout grand merci

bonjour xavierdep, salut Cylfo, Jean-Paul,

avec un dictionaire dans lequel on a les locations comme items, donc pas besoin des colonnes M:N

15loca-5.xlsm (50.50 Ko)

@BsAlv

Hello Cylfo,

Celà fonctionne merci, il reste cette question que j'avais posé plus haut, est-ce possible de le solutionner? Merci

quand je tape les 4 derniers chiffres (par exemple la commande terminée par 2900) si je tape "290" il m'affiche directement la seule possibilité trouvée mais si je tape le dernier "0" il m'affiche le numéro+ un "0".

Il devrait m'afficher la correspondance exacte et ne plus permettre d'encodage supplémentaire, si celà est possible.

Merci

Il me restera un autre soucis de génération de code barre mais je vais ouvrir un autre sujet car plus complexe que ce que je ne pensais.

Merci encore pour les recherches

Xavier

re,

avec le fichier de "Cylfo", mais un peu modifié

9loca-5.xlsm (51.00 Ko)

Hello Bart,

Merci pour votre retour, j'ai un soucis avec votre code, il m'affiche un message ici

image

Quand je tape un caractère de plus.

En fait l'idée sera qu'en pratique les opérateurs qui utiliserons l'outil taperaont probablement le plus souvent les 4 ou les 3 derniers chiffres de la commande. il faudrait donc que le résultat afffiché ne se modifie pas une fois que les chiffres sont encodés.

Exemple1:

si on tape 2900 (ces 4 caractères là) il doit afficher dans le combobox 8018662900. actuellement il affiche 80186629000 qui ne retourne aucun résultat.

Exemple 2:

si on tape 4801 (ces 4 caractères là) il doit afficher dans le combobox 8018474801. actuellement il affiche 80184748011 qui ne retourne aucun résultat.

Je veux que l'outil soit facile à utiliser et pas devoir leur dire de ne pas taper le dernier chiffre car le résultat apparait.

Merci

re,

nouvelle essai

11loca-5.xlsm (102.97 Ko)

Merci Bart,

Il reste qu'en cas d'erreur je ne sais pas effacer le résultat dans la combobox et il ne regénère pas la liste.

Désolé mais comme j'ai du mal avec ce code (qui correspond vraiment à ce que je cherche) je n'arrive pas à l'adapter moi meme

Encore merci pour votre aide

PS pour les code à barre j'ai trouver la solution avec une solution proposée par Cylfo dans un autre topic (merci )

Xavier

Rechercher des sujets similaires à "recherche intuitive combobox userform"