Captions et labels
Bonjour à tous
J’ai un premier userform (userform1) avec deux listes déroulantes :
• Dans la première liste (nommée Liste1) 3 possibilités (1 ; 2 ; 3)
• Dans la deuxième liste nommée Liste2) 4 possibilités (A ; B ; C ; D)
• Et un bouton de validation
J’ai un second userform avec 5 labels nommés : Dispositifs, Outils, Contact, Plus et Moins
J’aimerai que quand un utilisateur sélectionne une combinaison de possibilités dans l’userform1, la caption des labels se remplissent selon son choix.
Par exemple :
L’utilisateur sélectionne dans la première liste « 2 » et dans la seconde liste « A » puis appui sur le bouton de validation
L’userform2 s’affiche
Il s’écrit dans le label dispositifs : « CTC »
Dans Outills : « Focus group clients/vendeurs, enquête du parcours client »
Dans contact : «
»
Dans plus : « Une équipe de travail pour faire remonter au Chef de produit les informations sur son offre, en analysant les avis des clients »
Dans moins : « Difficulté de réserver une place, il faut s'y prendre à l'avance »
J’ai complété la colonne A de la Feuil1 avec les possibilités de Liste1 et la colonne B avec les possibilités de Liste2. J’ai ensuite écrit un bout de code afin d’alimenter les listes dans l’userform1 :
Private Sub UserForm_Initialize()
Liste1.RowSource = "Feuil1!A1:A10"
Liste2.RowSource = "Feuil1!B1:B10"
End Sub
Les listes sont bien alimentées, le problème survient ici, quand je sélectionne une possibilité dans la liste 1 et une dans la liste 2 et je valide l’userform2 s’affiche bien met les labels restent vides.
Auriez-vous un exemple de code qui fonctionnerait ?
Merci d'avance pour votre aide !
Salut Aurélie,
Si je t'ai bien comprise, le fichier ci-joint devrait répondre à ton attente.
Pour l'instant, ça ne fonctionne pas si tu cliques sur le bouton ''Retour'' du deuxième UserForm car ma macro n'est prévue qu'à l'initialisation du UserForm2, mais ça pourrait être complété si la première partie te convient.
Amicalement.
EDIT : Tu peux en fait remplacer Private Sub UserForm_Initialize() par Private Sub UserForm_Activate() dans le code ci-dessous et ça fonctionne aussi lors de l'utilisation du bouton ''Retour''.
''Private Sub UserForm_Initialize()
Private Sub UserForm_Activate()
Dispositifs = Range("B" & Jalon_TTM + 1)
Outils = Range("D" & Mon_Besoin + 1)
End Sub
Bonjour Aurélie266,
Dans ta Feuil1, il faut indiquer, pour chaque combinaison possible de tes deux premiers choix, comment tu veux remplir les labels de ton deuxième userForm.
J'ai rempli un tableau à compléter avec ces choix…
Un grand merci à vous 2 !
La version de Valky68 à l'air de mieux correspondre à mon besoin. Cependant, je réalise cet exercice dans le cadre d'un projet et je vais devoir expliquer le code lors de l'évaluation mais je ne l'ai pas bien compris.
Pourrais-tu me le détailler afin que j'en comprenne les subtilités ?
Merci d'avance
Bonjour @Aurelie266,
Ton premier formulaire permet de donner des valeur à des variables globales que j'ai déclarées dans Module1 :
Public choix As String, choix2 As StringCeci permet à ses variables de conserver leur valeurs, d'un appel à l'autre et surtout entre les deux formulaires (il y a d'autres moyens de le faire, mais bon…).
Comme tu l'avais fait, à l'initialisation du formulaire 1, on déclare que la source des listes déroulantes sont le contenu de deux tableaux "tab_choix1" et "tab_choix2". Ceci permet plus de souplesse dans l'exploitation du code si tes listes viennent à s'agrandir, il n'y aura pas besoin de modifier ce code.
Le bouton de validation du formulaire 1 "cache" ce formulaire (il reste donc en mémoire), et affiche le formulaire 2.
À l'initialisation du formulaire 2, on récupère les valeurs des listes du formulaire 1 toujours en mémoire, dans les variables publiques choix1 et choix2 qui déterminent ensuite à quelle ligne du tableau de correspondance on doit se référer pour obtenir les valeurs à remplir dans le formulaire 2 via la formule :
numLigneCorrespondante = WorksheetFunction.Match(Choix1, Worksheets("Feuil1").ListObjects("Tableau1").ListColumns("Choix 1").DataBodyRange, 0) _
+ WorksheetFunction.Match(choix2, Worksheets("Feuil1").ListObjects("Tableau1").ListColumns("Choix 2").DataBodyRange, 0) - 1C'est l'équivalent de la fonction EQUIV dans VBA.
Il "suffit" ensuite de remplir chacun des labels du formulaire 2 par les valeurs correspondantes de la ligne du Tableau1 :
.Dispositifs = Worksheets("Feuil1").ListObjects("Tableau1").ListColumns("Dispositifs").DataBodyRange.Cells(numLigneCorrespondante)L'ensemble n'est certainement pas optimal et pourrait être amélioré, mais il faut du temps…
Bon courage !