Ajout d'optionbutton et de frame dynamique dans un UF
Bonjour à tous,
J'ai encore un petit soucis avec mon ficher excel. Et comme la dernière fois j'ai beau cherché je ne trouve pas ou est mon erreur.
Je suis entrain de créer un userform avec une multipage. Dans ce userform j'aimerais que, lors du click sur un bouton en page0 de mon multipage, des labels, des textboxs et un frame contenant deux optionbuttons s'ajoute en page1 du multipage. J'ai réussit à tout intégrer sauf les optionbutton dans le frame. C'est donc a ce sujet que je sollicite votre aide.
Voila le morceau de code concerné par le frame et les optionbutton:
Private Sub CommandButton1_Click()
Dim FA As Control
Dim EnSérie As Control
Dim EnParallèle As Control
Dim Click2 As Integer
'incrémentation du compteur de click
Click2 = Click2 + 1
'ajout de la frame qui fonctionne
Set FA = Données.MultiPage1.Pages(1).Frame30.Controls.Add("Forms.Frame.1", "FA", True)
FA.Left = 222
FA.Top = 60 + Click2 * 18
FA.Width = 138
FA.Height = 18
FA.Name = "FA3" & Click2 + 4
'ajout des deux optionbutton qui ne marche pas
Set EnSérie = Données.MultiPage1.Pages(1).Controls.Add("Forms.OptionButton.1", "EnSérie", True)
EnSérie.Left = 6
EnSérie.Top = 0
EnSérie.Width = 56.25
EnSérie.Height = 15.75
EnSérie.Name = "EnSérie" & Click2 + 4
EnSérie.Visible = True
Set EnSérie.Container = FA
Set EnParallèle = Données.MultiPage1.Pages(1).Frame30.Controls.Add("Forms.OptionButton.1", "EnParallèle", True)
EnParallèle.Left = 72
EnParallèle.Top = 0
EnParallèle.Width = 60
EnParallèle.Height = 15.75
EnParallèle.Name = "EnParallèle" & Click2 + 4
Set EnParallèle.Container = FADans ce cas, une "erreur d'éxécution'438' Propriété ou méthode non généé par cet objet" apparait sur la ligne
Set EnSérie.Container = FAJ'ai également essaié ca:
Dim FA As Frame
Dim EnSérie as OptionButton
Dim EnParallèle as OptionButton
' le code pour le frame est inchangé
'code pour les optionbuttons (même code pour le deuxième)
Set EnSérie = Données.MultiPage1.Pages(1).Controls.Add("VB.OptionButton", "EnSérie")
EnSérie.Left = 6
EnSérie.Top = 0
EnSérie.Width = 56.25
EnSérie.Height = 15.75
EnSérie.Name = "EnSérie" & Click2 + 4
EnSérie.Visible = True
Set EnSérie.Container = FADans ce cas la j'ai une "erreur d'éxécution Chaine de classe incorrecte" sur la ligne
EnSérie = Données.MultiPage1.Pages(1).Controls.Add("VB.OptionButton", "EnSérie")J'espère que quelqu'un pourra m'aider à trouver mon erreur. Et merci d'avance à celui (ou celle ) qui prendra le temps d'essayé de m'aider
Bonjour à tous,
A force de chercher j'ai fini par trouver le problème. Pour ceux que ça intéresse voila la ma nouvelle formulation:
Private Sub CommandButton1_Click()
Dim FA As Object
Dim EnSérie As Control
Dim EnParallèle As Control
Dim Click2 As Integer
'incrémentation du compteur de click
Click2 = Click2 + 1
'ajout de la frame qui fonctionne
Set FA = Données.MultiPage1.Pages(1).Frame30.Controls.Add("Forms.Frame.1", "FA", True)
FA.Left = 222
FA.Top = 60 + Click2 * 18
FA.Width = 138
FA.Height = 18
FA.Name = "FA3" & Click2 + 4
With FA
Set EnSérie = .Controls.Add("Forms.OptionButton.1", "EnSérie", True)
EnSérie.Left = 6
EnSérie.Top = 0
EnSérie.Width = 56.25
EnSérie.Height = 15.75
EnSérie.Name = "EnSérie" & Click2 + 4
EnSérie.Visible = True
Set EnParallèle = .Controls.Add("Forms.OptionButton.1", "EnParallèle", True)
EnParallèle.Left = 72
EnParallèle.Top = 0
EnParallèle.Width = 60
EnParallèle.Height = 15.75
EnParallèle.Name = "EnParallèle" & Click2 + 4
End WithEt la ca marche nickel. Reste plus qu'a trouver la méthode pour activer les boutons!
Bonne journée à tous
Bonjour,
1- Pour raccourcir un peu ton code, connais tu la propriété Move des contrôles?
Private Sub CommandButton1_Click()
Dim FA As Object
Dim Ctrl As Control
Dim Click2 As Integer
'incrémentation du compteur de click
Click2 = Click2 + 1
'ajout de la frame qui fonctionne
Set FA = Données.MultiPage1.Pages(1).Frame30.Controls.Add("Forms.Frame.1", "FA", True)
FA.Move = 222, 60 + Click2 * 18, 138, 18
FA.Name = "FA3" & Click2 + 4
With FA
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnSérie", True)
Ctrl.Move = 6, 0, 56.25, 15.75
Ctrl.Name = "EnSérie" & Click2 + 4
Ctrl.Visible = True
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnParallèle", True)
Ctrl.Move = 72, 0, 60, 15.75
Ctrl.Name = "EnParallèle" & Click2 + 4
End With2- Qu'entends tu par :
Reste plus qu'a trouver la méthode pour activer les boutons!
Bonjour
Non je ne connaissais cette propriété qui va effectivement me faire gagné pas mal de lignes!
j'entends par
que je voudrais pouvoir effectuer une action différente en fonction de l'optionButton qui est coché. Comme ils sont ajouter dynamiquement le code est plus compliqué que ce que je fait habituellement. J'ai cru voir lors de mes recherches qu'il faut passé par un module de classe. Or c'est une solution que je ne maitrise pas vraiment, d'où la complexité de la chose( pour moi en tout cas).Reste plus qu'a trouver la méthode pour activer les boutons!
Pas de souci, on va créer ça pas à pas...
1- insérer un module (Module standard, tout bête quoi, un Module...) : Insertion/Module
2- y insérer la déclaration publique d'une nouvelle collection :
Public maColl As CollectionEn effet, nous allons y collectionner les objets OptionButton que nous ajouterons à notre Module de Classe.
3- Ajouter un module de classe, nommé Classe1
4- Dans ce module de Classe (dans sa fenêtre d'édition), placez ce code :
Public WithEvents OB As MSForms.OptionButton
Private Sub OB_Click()
MsgBox OB.Name
End Sub5- allez dans la fenêtre d'édition du code de votre Userform, dans le code de votre bouton de commande, ajouter à la déclaration des variables :
Dim Cl As Classe1Puis ajouter cette ligne en début de code :
Set maColl = New CollectionPuis, à chaque OptionButton, ajouter :
Set Cl = New Classe1
Set Cl.OB = Ctrl
maColl.Add ClCe qui nous donne quelque chose comme :
Private Sub CommandButton1_Click()
Dim FA As Object
Dim Ctrl As Control
Dim Click2 As Integer
Dim Cl As Classe1
'incrémentation du compteur de click
Click2 = Click2 + 1
Set maColl = New Collection
'ajout de la frame qui fonctionne
Set FA = Me.Controls.Add("Forms.Frame.1", "FA", True)
FA.Move 222, 60 + Click2 * 18, 138, 18
FA.Name = "FA3" & Click2 + 4
With FA
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnSérie", True)
Ctrl.Move 6, 0, 56.25, 15.75
Ctrl.Name = "EnSérie" & Click2 + 4
Ctrl.Visible = True
Set Cl = New Classe1
Set Cl.OB = Ctrl
maColl.Add Cl
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnParallèle", True)
Ctrl.Move 72, 0, 60, 15.75
Ctrl.Name = "EnParallèle" & Click2 + 4
Set Cl = New Classe1
Set Cl.OB = Ctrl
maColl.Add Cl
End With
End SubTout à l'heure, j'ai commis une erreur. Pas de = après Move, il ne s'agit pas d'une propriété...
Pardon!
Exemple :
Ctrl.Move 6, 0, 56.25, 15.75Magnifique ca marche nickel!
Je vais regarder pour l'adapter à mes besoins. Petite questions, est-il possible de rajouter à cette collection des options buttons présent "en dur" dans mon userform? si oui pouvez vous me dire comment?
En tout cas merci de prendre du temps pour m'aider.
je viens de refaire un test et je me suis enthousiasmé un peu vite. Le code fonctionne parfaitement pour le couple de bouton nouvellement créer mais dès que je reclick sur le bouton pour ajouter un nouveau couple de controls, les optionbuttons ajouter précédemment ne fonctionnement plus... Est ce normal? Et comment faire pour qu'ils restent actifs et ainsi permettre la modification du choix?
Pas de souci.
1- enlever cette ligne du code du bouton :
Set maColl = New CollectionEn effet, on ne doit la créer qu'une fois, cette collection, pour que tous les OptionButton en fasse partie.
2- Comme on la supprimé du code du bouton, il va nous falloir un autre élément déclencheur pour créer cette collection.
Utilisons pour cela l'événement Userform_Initialize() (=>se déclenche à l'initialisation de l'userform)
Ajoute donc, dans le code de l'userform, cette procédure événementielle :
Private Sub UserForm_Initialize()
Dim Cl As Classe1, Ctrl As Control
Set maColl = New Collection '----------- ON L'AJOUTE ICI
For Each Ctrl In Me.Controls 'boucle sur tous les contrôles de l'userform
If TypeOf Ctrl Is MSForms.OptionButton Then 'si le contrôle est un OptionButton
'pour éventuellement "zapper" un OptionButton
If Ctrl.Name <> "OBcomplementNul" Then 'Et qu'il ne s'appelle pas OBcomplementNul
Set Cl = New Classe1 'on l'ajoute à la collection
Set Cl.OB = Ctrl
maColl.Add Cl.
End If
End If
Next
End SubParfait merci beaucoup!
CE nouveau code enlève aussi ton bug du aux clics successifs sur ton bouton.
En effet, avant, à chaque clic sur le bouton de commande, on "rechargeait" la collection. Du coup, son contenu était systématiquement effacé.
Maintenant, comme on la "charge" à l'ouverture de l'Userform, elle reste "active" durant toute ta session de travail et ce jusqu'à :
- soit fermeture de l'userform
- soit plantage du code
Je profite encore un peu de ta gentillesse.
if OB.name="EnSérie" & i then
...
end if
if OB.name="EnParallèle" & i then
...
end if
? Et y a-t'il une solution pour récupérer la valeur de i ainsi défini?
Dans tous les cas vraiment merci de m'avoir débloquer sur ce sujet
Ta question n'est pas très bien formulée.
Tu veux que l'action se produise :
- au clic sur les optionboutons?
- au clic sur un bouton de commande?
- autre événement?
J'ai trouvé. pour ceux que ca peut intéresser, voila ce que j'ai fait.
J'ai créée une nouvelle collection afin de séparer mes boutons pour leur affecter des valeurs différentes et pour récupérer la valeur de i j'ai écrit
i=right(OB.Name,1)Je n'avais pas vu ton dernier post. Pour clarifier: je souhaitais réaliser une une action différente en fonction de l'optionbutton coché. Comme je ne sais pas comment différencier les éléments une fois insérer dans la collection, j'ai créé une collection par optionbutton en fonction de leurs nom le code est donc devenu:
dans l'initialisation:
Dim Cl As Classe1
'ajoute tous les optionbuttons de la frame assemblage dans la collection
Set MaColl = New Collection
Set MaColl1 = New Collection
For Each Ctrl In Me.MultiPage1.Pages(2).Frame30.Controls 'boucle sur tous les contrôles de la frame assemblage
If TypeOf Ctrl Is MSForms.OptionButton Then 'si le contrôle est un OptionButton
'pour éventuellement "zapper" un OptionButton
If Ctrl.Caption <> "en parallèle" Then 'Et qu'il ne s'appelle pas OBcomplementNul
Set Cl = New Classe1 'on l'ajoute à la collection
Set Cl.OB = Ctrl
MaColl.Add Cl
Else
Set Cl = New Classe1 'on l'ajoute à la collection
Set Cl.OpBt = Ctrl
MaColl1.Add Cl
End If
End If
Nextet pour mes optionbutton
With FA
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnSérie", True)
Set Cl = New Classe1
Set Cl.OB = Ctrl
MaColl.Add Cl
Ctrl.Move 6, 0, 56.25, 15.75
Ctrl.Name = "EnSérie3" & Click2 + 4
Ctrl.Visible = True
Ctrl.Caption = "en série"
Ctrl.Font.Name = "Calibri"
Set Ctrl = .Controls.Add("Forms.OptionButton.1", "EnParallèle", True)
Set Cl = New Classe1
Set Cl.OpBt = Ctrl
MaColl1.Add Cl
Ctrl.Move 72, 0, 60, 15.75
Ctrl.Name = "EnParallèle3" & Click2 + 4
Ctrl.Caption = "en parallèle"
Ctrl.Font.Name = "Calibri"
End WithAinsi tout fonctionne comme je voulais
Merci beaucoup pour ton aide! J'aurais vraiment galéré sans toi!