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 = FA

Dans 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 = FA

J'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 = FA

Dans 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

115classeur1.xlsm (22.11 Ko)

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 With

Et 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 With

2- 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

Reste plus qu'a trouver la méthode pour activer les boutons!

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).

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 Collection

En 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 Sub

5- 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 Classe1

Puis ajouter cette ligne en début de code :

Set maColl = New Collection

Puis, à chaque OptionButton, ajouter :

Set Cl = New Classe1
Set Cl.OB = Ctrl
maColl.Add Cl

Ce 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 Sub

Tout à 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.75

Magnifique 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 Collection

En 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 Sub

Parfait 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. si je veux effectuer une action différente en fonction de l'optionbutton coché est ca qu'il faut que je crée deux collection: une pour les boutons "EnSérie & i" et une pour les boutons "EnParallèle & i"? Ou est ce que je peux écrire quelque chose comme

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
Next

et 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 With

Ainsi tout fonctionne comme je voulais

Merci beaucoup pour ton aide! J'aurais vraiment galéré sans toi!

Rechercher des sujets similaires à "ajout optionbutton frame dynamique"