Problème avec ComboBox et ListBox

Je me permets de reprendre sous un nouveau topic la discussion que j'avais ouverte dans un poste ce matin concernant une demande plus générale.

Pour rappel je souhaitais gérer une mini base de données contenant des noms de sociétés.

Le problème se résume désormais au fichier suivant :

https://www.excel-pratique.com/~files/doc/test_remplissage_listbox2.xls

Je souhaiterais :

- que la combo list sur la page "start sheet" n'affiche que les noms des clients correspondants au type de projet inscrit dans la cellule C2 (j'ai utilisé la fonction "validation")

- avoir un bouton "ajouter client" qui permette d'ajouter un nom au contenu de la combo list. J'ajoute une petite subtilité ; afin de ne pas perdre l'information je souhaiterais que le nom soit également ajouté de manière permanente à la liste à partir de laquelle la combolist sera formée (voir sheet 1 cellules A5, B5, C5 et suivantes)

Ma reconnaissance éternelle à la personne qui m'aidera à progresser ...

Pierre

Bonjour Pierre, le forum

Ma reconnaissance éternelle à la personne qui m'aidera à progresser ...

C'est peut-être un peu trop.

Voici une façon de faire parmi d'autres.

Je te laisse méditer sur le code.

https://www.excel-pratique.com/~files/doc/test_remplissage_listbox2.zip

A+

Alors un grand merci puisque cela excède mes espérances les plus folles.

Maintenant je suis un peu frustré car j’ai énormément de mal à comprendre la syntaxe et j’apprécierais vraiment si tu pouvais me donner quelques explications.

En vrac …

Set c = .Range("type_de_projet").Find(what:=[C2], LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows)

Je comprends que tu compares la valeur de C2 avec la zone “type_de_projet” mais je ne comprends pas ce que signifient LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows. Sans doute vais-je paraître ridicule mais comme ma zone « type_de_projet » était horizontale j’aurais cherché par colonne (à moins que xlByRows signifie par colonne)

If Not c Is Nothing Then

Syntaxe tout à fait opaque pour mon niveau ras les pâquerettes. Qu’est-ce que cela signifie ?

Derlig = .Cells(.Cells.Rows.Count, c.Column).End(xlUp).Row

Si je comprends bien ici tu comptes le nombre de cellules dans la colonne qui correspond au type de projet en C2. Mais comment sais-tu où il faut s’arrêter ?

"Sheet1!" & .Range(.Cells(c.Offset(1).Row, c.Column), .Cells(Derlig, c.Column)).Address

Pas compris la syntaxe … explication bienvenue

encore un grand merci et désolé pour mon ignorance ... j'essaye d'en sortir en posant des questions et en essayant de profiter des connaissances des autres.

Re bonjour,

Set c = .Range("type_de_projet").Find(what:=[C2], LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows)

Fais une macro de recherche après avoir sélectionner la plage "type_de_projet" et tu verras que l'enregistreur aura ecrit à peu près la même chose.

.find -> c'est la méthode de recherche employée par excel

What:= ce qu'on recherche

Lookin:= soit xlvalues (dans les valeurs) ou xlFormulas (dans les formules)

LookAt:= xlWhole (dans la totalité de la cellule) ou xlPart (dans une partie de la cellule)

SearchOrder:= recherche en ligne ou en colonne (là tu as raison et j'aurai du mettre: xlByColumns)

Seul What est obligatoire mais les valeurs des autres sont enregistrés à chaque recherche manuelle ou par macro. Donc si entre deux tu fais une recherche manuelle avec d'autres valeurs la recherche par vba serait peut-être faussée. C'est pourquoi je les précise toujours.

If Not c Is Nothing Then

La méthode Find renvoi une cellule

donc il faut vérifier si elle a étée trouvée (si la variable objet range 'c' représente quelque chose; ou en traduction littérale si c n'est pas rien)

Derlig = .Cells(.Cells.Rows.Count, c.Column).End(xlUp).Row

Numéro de dernière ligne de la plage

.cells -> les cellules de la feuille

.cells.rows.count -> le nombre de lignes de la feuille (j'aurai du mettre uniquement: .rows.count)

c.Column -> le numéro de colonne de la cellule renvoyée par la méthode Find précédente.

donc nous voici situé sur la feuille en dernièreligne (65536 si xl<2007 ou plus) de la colonne c.column

.end(xlUp) nous fais remonter jusqu'à la dernière cellule non vide le la colonne.

C'est comme lorsque, par exemple tu te plaçait en A65536 et faisait CTRL+FlècheHaute.

.row nous donne le numéro de la dernière ligne non vide dans la colonne.

Sheet1!" & .Range(.Cells(c.Offset(1).Row, c.Column), .Cells(Derlig, c.Column)).Address

Je n'ai plus le fichier mais je crois me rappeler que c'était pour retourner l'adresse de la plage dans ListFillRange du combobox1

Dans ListFillRange il faut mettre explicitement le nom de la feuille si la plage de cellule n'est pas sur la même feuille que la combobox.

.C.offset(1).row renvoie le numéro de ligne sous C (ligne du titre de la colonne)

.offset(x,y) décalage d'une référence de cellule de x lignes et ou y colonne

Mais là encore j'aurai pu faire plus simple en mettant

.Range(c.offset(1), .cells(Derlig,c.Column)

pour renvoyer la plage allant de la première cellule sous le titre de colonne à la dernière cellule remplie

.Address renvoie simplement l'adresse de la plage à la propriété ListFillRange.

Bon j'espère que ce discour t'aura pas trop saoûlé.

A+.

Merci à toi pour tes explications. Je vais méditer dessus et faire de mon mieux pour m'améliorer (pas trop dur car je pars de zéro).

Encore merci,

Pierre

Rechercher des sujets similaires à "probleme combobox listbox"