XL 2019 UserForm liste déroulante (cascade) avec ajout de données/modification

kinders59

XLDnaute Nouveau
Bonjour tout le monde,

Je suis en train de réaliser un fichier qui sera envoyé à des fournisseurs (qui vont remplir les onglets pour le moment masqués) mais qui sera aussi utilisé par moi et potentiellement dans le futur d'autres personnes de l'entreprise (pour ajouter des données dans les onglets visibles).

J'ai réalisé un UserForm dans mon onglet "Données" qui s'ouvre lorsque je clique sur le bouton "Ajouter des données", dans ce UserForm j'ai plusieurs liste déroulante modifiable et c'est là que je commence déjà à me perdre.

Je voudrais que mes listes déroulantes soit en cascade et donc recherche mes valeurs déjà présentes dans mes différents onglets.

- Pour la première liste déroulante N° Fournisseur je viens rechercher mes données dans la colonne A de l'onglet "Données"

- Pour la seconde liste, le fournisseur dépend du n° fournisseur comme on peut le voir dans la colonne B de l'onglet "Données"

- Pour ma troisième liste, ma matière correspond au fournisseur et se situe dans l'onglet "Matière"

- Enfin ma dernière liste, l'épaisseur dépend du fournisseur et de la matière et se situe dans l'onglet Epaisseur

J'ai réussis dans mes onglets à faire le rapprochement via des formules comme celle-ci (qui me permet de retrouver l'épaisseur en fonction de la matière et du fournisseur) :

=DECALER(Epaisseurs!$A$2;1;EQUIV(Généralités!$B$2&" "&Généralités!$A10;Epaisseurs!$2:$2;0)-1;NBVAL(DECALER(Epaisseurs!$A$2;1;EQUIV(Généralités!$B$2&" "&Généralités!$A10;Epaisseurs!$2:$2;0)-1;100;1));1)
Mais je ne sais pas comment le reproduire en VBA ...

Ensuite vient le plus gros des problèmes j'aimerais pouvoir proposer l'ajout et la modification de données par mon userform

C'est à dire que potentiellement la personne pourrait rentrer toutes les données elle même et cliquer sur le bouton "Ajouter" , dans ce cas :

- Mon numéro de four viendrait s'ajouter à la liste en colonne A dans l'onglet "Données" à la suite des autres bien-sûr

- Mon fournisseur s'ajouterait dans la colonne B dans l'onglet "Données" à la suite des autres (en sachant qu'il doit être à côté de son numéro de four)

- Ainsi que dans l'onglet "Matière" sur la ligne 2 à la suite des autres : S'il s'agit d'un nouveau fournisseur

- Ma matière viendrait s'ajouter dans l'onglet "Matière" elle doit s'ajouter sous le fournisseur associé

- Dans mon onglet "Epaisseur" si nous avons un nouveau fournisseur, il doit être ajouté ligne 2 avec sa matière associée (par exemple : j'ai rempli dans le formulaire Fournisseur : G et matière : Compact) alors en ligne 2 à la fin de ceux déjà présent j'ai "G Compact" qui s'ajoute, et en dessous j'ai mon épaisseur qui vient s'ajouter aussi par rapport à ce que j'ai ajouté dans mon UserForm.

Bien évidemment, j'aimerais qu'il soit possible d'ajouter une donnée que sur un paramètre, par exemple :

Je souhaite ajouter la matière Bambou sur mon fournisseur B et avec une épaisseur de 20 (car la matière n'est pas encore présente)

Du coup, je sélectionne mon numéro de four qui va s'associer au fournisseur B j'ai donc mes deux premières combobox qui sont existantes, ensuite dans matière je rentre "Bambou" et dans épaisseur "20"

Du coup, lorsque je click sur "Ajouter"

- J'ai ma matière "Bambou" qui vient s'ajouter sous la colonne du fournisseur B dans l'onglet "Matière"

- J'ai la création d'une colonne "B Bambou" et l'ajout de l'épaisseur 20 dans mon onglet "Epaisseurs"

Si maintenant je souhaite n'ajouter qu'une épaisseur avec un fournisseur et une matière déjà présente alors je sélectionne dans mon userform les bonnes données pour :

- N° Fournisseur / Fournisseur / Matière

Puis je rentre moi même une épaisseur dans le cadre : Epaisseur

Alors dans l'onglet Epaisseur vient s'ajouter sous le bon fournisseur/matière (présent en ligne 2) ma nouvelle épaisseur.

Je ne sais pas si je suis assez compréhensible dans mon besoin, je maitrise encore assez mal le UserForm et donc je ne suis même pas sûr que ce que je veux faire et possible alors voilà je jette une bouteille à la mer afin d'avoir de l'aide et savoir si quelqu'un sera m'aider

Bonne journée à tous et merci d'avance !!
 

Pièces jointes

  • Userform-Aide.xlsm
    70.1 KB · Affichages: 61

kinders59

XLDnaute Nouveau
C'est que je ne sais pas encore exactement comment j'écrirais les procédures d'inportation/exportation
Je pense que je le ferais peut être avec deux tableaux, un avec seulement les informations du fournisseur et un autre avec seulement les articles mais avec juste le numéro du fournisseur devant.
Par article tu veux dire matière et une épaisseur (tous les deux séparées) ?

Moi je suis en train de chercher pour savoir comment trouver la dernière ligne de ma dernière colonne en attendant comme je ne maîtrise pas trop ce dont tu parles, j'essaie quand même de voir si je serais résoudre le problème moi même mais bon 🙁

C'est un peu choux blanc, j'ai réussis à faire ça :
VB:
If ComboBox4.Value = "" Then
MsgBox "Veuillez rentrer/choisir un n° fournisseur"
Else
If ComboBox1.Value = "" Then
MsgBox "Veuillez rentrer/choisir un fournisseur"
Else
Dim ligne As Integer
If MsgBox("Confirmez-vous l'ajout des données ?", vbYesNo, "confirmation") = vbYes Then
Worksheets("Données").Select
ligne = Sheets("Données").Range("A" & Rows.Count).End(xlUp).Row + 1
Column = Sheets("Matière").Range("A2").End(xlToRight).Column + 1
Cells(ligne, 1) = ComboBox4.Value
Cells(ligne, 2) = ComboBox1.Value
Worksheets("Matière").Cells(2, Column) = ComboBox1.Value
Unload UserForm1
UserForm1.Show
Else
End If
End If
End If
End Sub

Mais lorsque je veux que ma combobox2.Value se retrouve dans la dernière ligne de ma dernière colonne de l'onglet Matière, bah pour moi c'est l'impasse j'ai essayé : Range("Column").End(xlUp).Row + 1 mais bon c'est clairement pas bon 😄

Du coup je reste attentif à tes retours je pense commencer à voir comment ça pourrait se passer mais bon ça reste vague dans ma tête :/
 

kinders59

XLDnaute Nouveau
Ou alors on envoie vraiment le même fichier à un seul fournisseur en s'arrangeant pour que ses infos soient figées et on attend qu'il revienne ? …
Non hein ? … Il vaudrait mieux peut être mieux un dossier avec les fichiers des fournisseurs et deux procédures, une pour éclater le fichier central dans ceux ci et l'autre pour les y regrouper.
J'avoue que j'ai peur que ce soit bien trop compliqué pour moi de faire de cette manière et surtout est-ce que ça sera facilement gérable si quelqu'un prend mon relais un jour ? :confused:

Je continue à me triturer la tête, mais j'avoue que ça commence à être compliqué de me dire que ça sera faisable "facilement" comme je pouvais l'imaginer ..
 

Dranreb

XLDnaute Barbatruc
Ben oui, ce pourrait être deux boutons de formulaires ou deux images, une pour éclater le tableau complet en autant de fichiers fournisseurs (Il serait intéressant que le N°Fournisseur comporte des lettres, soit mnémonique et forme en fait le nom de fichier du fournisseur sans ".xlsm" derrière) un autre pour les regrouper.
Pas besoin de trouver la dernière ligne ou colonne d'une plage ayant fait l'objet d'une commande "Mettre sous forme de tableau" car elle est représentée par un ListObject ayant des collections ListRows et ListColumns avec donc chacune une propriété Count.
Mon objet ComboBoxLiée détecte ce ListObject s'il existe et reprend à son compte ces collections en tant que propriétés Lignes et Colonnes. Le ControlsAssociés à seulement la Colonnes au cas où on veut pouvoir utiliser les intitulés en tant que spécifications de colonnes aux Add.
 
Dernière édition:

kinders59

XLDnaute Nouveau
Ben oui, ce pourrait être deux boutons de formulaires ou deux images, une pour éclater le tableau complet en autant de fichiers fournisseurs (Il serait intéressant que le N°Fournisseur comporte des lettres, soit mnémonique et forme en fait le nom de fichier du fournisseur sans ".xlsm" derrière) un autre pour les regrouper.
Pas besoin de trouver la dernière ligne ou colonne d'une plage ayant fait l'objet d'une commande "Mettre sous forme de tableau" car elle est représentée par un ListObject ayant des collections ListRows et ListColumns avec donc chacune une propriété Count.
Mon objet ComboBoxLiée détecte ce ListObject s'il existe et reprend à son compte ces collections en tant que propriétés Lignes et Colonnes. Le ControlsAssociés à seulement la Colonnes au cas où on veut pouvoir utiliser les intitulés en tant que spécifications de colonnes aux Add.

Hélas pour le numéro fournisseur c'est fait de manière automatique en dehors du fichier sur un logiciel, donc impossible de faire sorte que ce soit un mix nombre/lettre :(

Pour le reste effectivement ça pourrait ce faire mais à voir à quoi ça ressemble dans la pratique j'ai assez de mal à me projeter 🙁

Pour la partie connaître la dernière ligne de la dernière colonne ça concerne ce que j'ai déjà fait de mon côté avec ce que je comprends/maitrise un minimum haha du coup on est loin de la façon dont tu parles et dont je ne maitrise rien 😅
 

Dranreb

XLDnaute Barbatruc
Dans tous les cas la programmation des UserForm ressemblera toujours à ce qu'il y a dans les classeurs que j'ai joint. Alors tâchez de transformer mon CLsCAsContact.xlsm en deux fichiers, un comme classeur central et l'autre comme modèle pour chaque fournisseur. Changez tout: les intitulés de colonnes, le nom du tableau, le nom des objets Worksheet qui représentent les feuilles, de l'UserForm, des contrôles. Seuls les modules de service ne changent pas, c'est à dire le MSujetCBx et les 12 modules de classe.
Je vous écrirai les procédures d'éclatement et de regroupement quand tout ça sera fait.
Je réviserai aussi le reste de la programmation des UserForm, à part la Sub UserForm_Initialize qui reste à votre charge puisqu'elle définit l'essentiel.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Croyez moi, laissez tomber vos listes disparates, elles resteront imbitables pour tout le monde aussi bien pour vos fournisseur que pour vos programmes.
Définissez simplement un tableau unique énonçant toutes les combinaisons de caractéristiques valides, celles communes à plusieurs lignes étant répétées sur chacune. C'est le seule moyen de n'avoir aucune programmation à prévoir pour gérer ça dans un UserForm, à part une série d'instructions à vocation déclarative dans la Private Sub UserForm_Intialize disant chaque fois prend tel contrôle pour telle colonne. Le dire par un CLs.Add pour une ComboBox à liste dynamique souhaitée et par un CAs.Add pour autre chose, le plus souvent une TextBox, mais même éventuellement aussi pour une ComboBox à liste fixe, et quelques autres types de contrôles.
 

kinders59

XLDnaute Nouveau
Bonsoir.
Croyez moi, laissez tomber vos listes disparates, elles resteront imbitables pour tout le monde aussi bien pour vos fournisseur que pour vos programmes.
Définissez simplement un tableau unique énonçant toutes les combinaisons de caractéristiques valides, celles communes à plusieurs lignes étant répétées sur chacune. C'est le seule moyen de n'avoir aucune programmation à prévoir pour gérer ça dans un UserForm, à part une série d'instructions à vocation déclarative dans la Private Sub UserForm_Intialize disant chaque fois prend tel contrôle pour telle colonne. Le dire par un CLs.Add pour une ComboBox à liste dynamique souhaitée et par un CAs.Add pour autre chose, le plus souvent une TextBox, mais même éventuellement aussi pour une ComboBox à liste fixe, et quelques autres types de contrôles.
Bonjour Dranreb,

Merci pour ton aide hélas je me rends compte que je ne comprends absolument rien à la combobox ni même au UserForm ... J'ai plus l'impression de me perdre qu'autre chose et je me dis que si demain je dois partir et laisser le fichier en gestion à quelqu'un d'autre si il ne connait pas aussi il sera totalement perdu et donc le fichier sera abandonné ... Du coup, je me suis débrouillé pour faire un truc assez brouillon mais fonctionnel c'est sûr que c'est loin d'être beau mais ça sera facilement modifiable pour un nouveau venu :/

Je garde tout de même dans un coin de ma tête ta solution, lorsque j'aurais un peu plus de temps, j'étudierais le fonctionnement d'un UserForm car pour le moment c'est comme si je reprenais VBA à 0 ... Et au vue du délais qu'on m'a donnait je peux pas me permettre de pousser ça, j'en suis bien navré.

En tout cas sache que le temps n'est pas perdu tu m'as appris pas mal de chose, et je n'hésiterais pas à essayer d'appliquer tes conseils et revenir lire tout ça lorsque je plongerais les mains dans l'apprentissage du UserForm.

Encore merci à toi,
Bonne journée,
Cordialement,
Hugo
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pourtant, grâce aux modules de service qui se chargent de tout le fonctionnement des ComboBox vous n'aviez plus besoin d'y comprendre grand chose.
Voulez vous que je vous fasse une version centrale avec Code fournisseur, Désignation fournisseur, Forme, Matière, Épaisseur plus une colonne Observation à tout hasard ?
 
Dernière édition:

kinders59

XLDnaute Nouveau
Bonjour.
Pourtant, grâce aux modules de service qui se chargent de tout le fonctionnement des ComboBox vous n'aviez plus besoin d'y comprendre grand chose.
Voulez vous que je vous fasse une version centrale avec Code fournisseur, Désignation fournisseur, Forme, Matière, Épaisseur plus une colonne Observation à tout hasard ?
Bonjour Dranreb,

C'est très gentil de votre part, je ne veux pas vous faire perdre de temps aussi, vous m'avez déjà bien aiguillé et je me suis rendu compte de certaines choses.
Maintenant si cela ne te dérange pas mais que tu ne perds pas de temps, je suis preneur ça pourrait me faire une base d'apprentissage :)

Mais encore une fois je ne veux vraiment pas te faire perdre ton temps !

Tu en as déjà prit beaucoup pour moi ce qui est très sympa !

Merci à toi et bonne journée,
Cordialement,
 

Discussions similaires

Statistiques des forums

Discussions
299 847
Messages
1 979 562
Membres
206 773
dernier inscrit
becaye80