Instanciation d'élément dans UserForm en fonction d'une variable

Résolu/Fermé
user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015 - Modifié par user1711 le 9/10/2015 à 09:17
user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015 - 9 oct. 2015 à 12:40
Bonjour,

Je viens vers vous pour un problème qui est dans la continuité de mon projet ...

Dans la suite de mes combobox en cascade, à la fin ça me génère une liste d'objectifs. (Pour rappel, je choisis un code --> génère un libelle --> choix d'un module --> génère une liste de X objectifs).

Il faudrait que je puisse récupérer ces objectifs un à un pour les afficher dans des labels différents et ensuite instaurer un système d'évaluation.
Pour le système d'évaluation pas de soucis je sais faire.

Je bloque juste pour récupérer ma liste d'objectifs car elle n'est jamais du même nombre, et donc dans mon userform suivant je ne peux pas mettre X Label alors qu'il y en aura peut être un nombre Y et donc je me retrouverai avec des labels soit inutiles soit des labels manquant !

Ma question est donc : Comment générer un nombre de label (et autre élément) en fonction de la valeur d'une variable ?
Exemple : list_objectifs.ListCounts me retourne 6, afficher 6 labels avec 6 groupbuttons et 6 zones de commentaires dans le userform suivant !

J'ai des idées en utilisant les index, faire des boucles, tout ça reste vague, et au niveau de l'instanciation de mes éléments dans mon userform ca se complique encore plus ! Sachant qu'ensuite il faut que je récupère les données saisies pour les stocker dans une fiche synthèse.

Merci d'avance pour tout aide qui me sera apporté !

1 réponse

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
9 oct. 2015 à 09:21
Bonjour,

Teste ce code dans un nouveau classeur.
Tu y dessines un UserForm et tu places ce code dans le module de l'userform :

Private Sub UserForm_Initialize()
Dim i As Integer, MonLabel As Object
For i = 1 To 6 '6 sera à remplacer par : List_objectifs.ListCounts 
   Set MonLabel = Me.Controls.Add("Forms.Label.1", "MonLabel" & i, True)
   With MonLabel
      'Move Left, Top, Width, Height
      .Move 5, 20 * i, 100, 20
      .Caption = MonLabel.Name
   End With
Next i
End Sub

0
user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015
Modifié par user1711 le 9/10/2015 à 11:21
Niquel ! J'ai arrangé à ma façon le code que tu m'as fourni, seul bémol, je n'arrive pas à changer le nom de mon label.

J'ai testé plusieurs possibilités avec list_objectifs.list(x), listindex, selected mais ca me met des erreurs a chaque fois.
Tu n'aurais pas une petite idée par hasard ?

Et si je veux rajouter 3 bouttons dans un groupbutton pour chaque objectifs, comment procéder ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015
Modifié par pijaku le 9/10/2015 à 11:30
Et si je veux rajouter 3 bouttons dans un groupbutton pour chaque objectifs, comment procéder ?

Fais toi un petit dessin avec les emplacements ou tu veux ajouter tes optionsButtons.
Le principe est le même, tu créées un OptionButton :
Dim OptB As Object
Set OptB = Me.Controls.Add("Forms.OptionButton.1", "MonButton" & i, True)

Puis tu l'incorpores dans un groupe :
With OptB
.GroupName = "Groupe1"

Puis tu le places :
With OptB
.GroupName = "Groupe1"
.Move 110, 20, 100, 20
End With


Tu n'as plus qu'à inclure ça dans une double boucle :
> celle donnée précédemment pour i de 1 à 6
> une pour y de 1 à 3 pour ajouter 3 boutons à chaque "tour" de i

Soit : (à tester)
Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer, MonLabel As Object, OptB As Object
For i = 1 To 6 '6 sera à remplacer par : List_objectifs.ListCounts 
   Set MonLabel = Me.Controls.Add("Forms.Label.1", "MonLabel" & i, True)
   With MonLabel
      'Move Left, Top, Width, Height
      .Move 5, 20 * i, 100, 20
      .Caption = MonLabel.Name
   End With
   For j = 1 To 3
      Set OptB = Me.Controls.Add("Forms.OptionButton.1", "MonButton" & i & "_" & j, True)
      With OptB
         .GroupName = "Groupe" & i
         .Move 105 * j, 20 * i, 100, 20
         .Caption = OptB.Name
      End With
   Next j
Next i
End Sub
0
user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
9 oct. 2015 à 11:49
Effectivement j'avais pensé au système de boucle pour les boutons, le groupName était tout bête !

Mais le problème de la boucle j est qu'elle décale les boutons du même groupe de 105 a chaque bouton dans ton exemple.
Hors dans mon cas les boutons sont à droite de ma userform donc si je met 690*j, j'ai qu'un seul bouton qui apparaît et les autres doivent se balader dans l'espace ...

Il n'y aurait pas un attributs à ajouter pour choisir l'intervalle entre chaque boutons plutôt que de faire un X * j ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015
9 oct. 2015 à 12:08
105 correspond à la largeur de mon optionbutton (100) + une petite marge (5)

Essaye ce code dans un classeur neuf, avec un userform neuf.

Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer, MonLabel As Object, OptB As Object
Me.Height = 200
Me.Width = 500
For i = 1 To 6 '6 sera à remplacer par : List_objectifs.ListCounts
   Set MonLabel = Me.Controls.Add("Forms.Label.1", "MonLabel" & i, True)
   With MonLabel
      'Move Left, Top, Width, Height
      .Move 5, 20 * i, 80, 20
      .Caption = MonLabel.Name
      .BorderStyle = fmBorderStyleSingle
   End With
   For j = 1 To 3
      Set OptB = Me.Controls.Add("Forms.OptionButton.1", "MonButton" & i & "_" & j, True)
      With OptB
         .GroupName = "Groupe" & i
'85 = largeur du label + 5 (marge) , 100 = largeur de l'optionbutton
         .Move 85 + (100 * (j - 1)), 20 * i, 100, 20
         .Caption = OptB.Name
      End With
   Next j
Next i
End Sub


Pour l'adapter à ton cas, fais toi un dessin...
0
user1711 Messages postés 10 Date d'inscription mercredi 7 octobre 2015 Statut Membre Dernière intervention 14 octobre 2015 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
9 oct. 2015 à 12:40
Ca y est !!! J'ai compris, j'ai donc adapter le tout et tout rentre niquel !
Encore merci pour ton aide pijaku, je vais enfin pouvoir avancer dans mon projet!
0