CheckBox générés at-runtime dans un UserForm

Bonjour,

je me permet de faire a nouveaux appel à ce forum car j'ai un nouveau problème.

je crée un UserForm dans le qu'elle je génère des CheckBox en fonction du nombre de cellule non-vide dans un plage donner.

Ce qui semble bien fonctionner grâce au code ci dessous :

Private Sub UserForm_Initialize()

Dim sel As Range
Dim top As Long

For Each sel In Feuil2.Range("A2:A20")

    If sel <> "" Then

        top = top + 30

        Set Cbx = UserForm1.Controls.Add("Forms.CheckBox.1") 'ajoute une nouvelle checkbox et l'assigne a l'objet 'Cbx'

        Cbx.Caption = sel.Value
        Cbx.Name = sel.Value

        Cbx.Left = 10
        Cbx.top = top
    End If

Next sel

End Sub

pour être honnête j'ai trouver le code qui permet de génère une CheckBox sur internet Set Cbx = UserForm1.Controls.Add("Forms.CheckBox.1") donc peux être que je comprend pas ce que j'ai sous les yeux.

Mais cela fonctionne j'ai bien mon bon nombre de CheckBox créé les une en dessous des autre comme je le souhaiter.

Cependant au moment de récupérer l'état des ces CheckBox avec par exemple ceci :

Private Sub CommandButton1_Click()

If Me.Vincent = True Then

MsgBox ("Ok")

End Sub

j'ai créé un bouton dans mon UserForm et je voulais juste voir si en cochant la CheckBox qui s'appel "Vincent" il m'ouvrait bien la MsgBox (ma Range("A2:A20") comporte une liste de Nom)

Mais là patatras car j'ai une erreur de compilation au moment ou j'appuie sur le bouton qui me dit "Membre de méthode ou de données introuvable"

comment puis-je récupérer l'état de mes CheckBox générés at-runtime.

Bonjour

Peut-être ceci -->

If Me.Controls("vincent") = True Then

si ok pensez à

Cordialement

Bonjour Xtravince, Dan,

Concernant votre problème vous pouvez utiliser la collection Controls de l'UserForm pour accéder à vos CheckBox, un exemple de comment faire :

Private Sub CommandButton1_Click()

    Dim Cbx As Control
    For Each Cbx In Me.Controls
        If TypeName(Cbx) = "CheckBox" Then
            If Cbx.Name = "Vincent" And Cbx.Value = True Then
                MsgBox "Ok"
                Exit For
            End If
        End If
    Next Cbx

End Sub

Vous pouvez adapter ce code pour travailler avec tout vos CheckBox si nécessaire. J'espère que cela vous aidera !

Super merci beaucoup a vous deux ça marche nickel !!!

Toujours un vrais plaisir de venir sur ce forum.

Bonjour,

Je continue bon an mal an à crée mon UserForm et je suis confronter a un nouveau problème qui concerne encore mes fameuse CheckBox.

J'aimerais pouvoir récupère "l'évènement" cocher ou "décocher" de mes CheckBox généré a fin de pouvoir exécuter un code

avoir quelque chose comme ceci Private Sub CheckBox1_Click() mais pour toute les CheckBox par exemple ou plus précisément les CheckBox d'une Frame particulier car toute mes CheckBox son générer dans la même Frame.

Pour avoir un ordre d'idée voici mon UserForm dans son état initiale :

capture

Et le voici une fois lancer :

image

je ne sais pas si je suis très claire ^^'

Bonjour,

Vous pouvez ajouter l'événement Click à chaque CheckBox.
vous devez créer une procédure qui sera appelée lorsque vous cliquez sur une CheckBox. Vous pouvez l'ajouter dans le même module où se trouve votre UserForm, un exemple de code :

Public Sub Cbx_Click()

    Dim Cbx As MSForms.CheckBox
    Set Cbx = UserForm1.Controls(Application.Caller)

    ' Ici, vous pouvez ajouter le code que vous voulez exécuter
    ' lorsque vous cliquez sur la CheckBox.
    ' Par exemple :
    If Cbx.Value = True Then
        MsgBox Cbx.Name & " est coché."
    Else
        MsgBox Cbx.Name & " est décoché."
    End If

End Sub

Lorsque vous créez vos CheckBox, vous pouvez attribuer cette procédure à l'événement Click de chaque CheckBox. Voici comment vous pouvez le faire

Private Sub UserForm_Initialize()

    Dim sel As Range
    Dim top As Long

    For Each sel In Feuil2.Range("A2:A20")

        If sel <> "" Then

            top = top + 30

            Set Cbx = UserForm1.Controls.Add("Forms.CheckBox.1")

            Cbx.Caption = sel.Value
            Cbx.Name = sel.Value

            Cbx.Left = 10
            Cbx.Top = top

            ' Attribuez la procédure Cbx_Click à l'événement Click de la CheckBox.
            Cbx.OnAction = "Cbx_Click"

        End If

    Next sel

End Sub

A chaque fois que vous cliquez sur une CheckBox, la procédure Cbx_Click sera appelée, et le nom de la CheckBox qui a déclenché l'événement sera passé à cette procédure. J'espere que cela vous aidera

Bonjour Abderrahmane BENALI,

Malheureusement cela ne fonctionne pas.

Cella me retourne une erreur d'exécution '438' : Propriété ou méthode non gérée par cet objet.

j'ai bien penser a modifier Set Cbx =UserForm1.Controls(Application.Caller) par Cbx = Nouvelle_depence.Controls(Application.Caller) car j'ai changer le nom de mon UserForm j'ai même essayer avec Frame2.Controls.... car j'ai aussi modifier mon code ce qui est peux être la cause de ce problème

Voici mon code avec le qu'elle je génère désormais mes CheckBox :

Private Sub UserForm_Initialize()

Dim sel As Range
Dim top As Long
Dim compteur As Long

top = 10

For Each sel In Feuil2.Range("A2:A20")

    If sel <> "" Then

                    'c'est ici que j'ai remplacer UserForm1 par Frame2 affin de généré les CheckBox dans la Frame2
        Set Cbx = Frame2.Controls.Add("Forms.CheckBox.1")
                

        Cbx.Caption = sel.Value
        Cbx.Name = "Cocher" & compteur

        Cbx.Left = 10
        Cbx.top = top
        Cbx.Font.Size = 10
        Cbx.OnAction = "Cbx_Click" 'j'ai bien rajouter cette ligne

            Set Obj_nbref = Frame2.Controls.Add("forms.textbox.1")
        With Obj_nbref
         .Name = "Prix" & compteur
         .Left = 100
         .top = top
         .Width = 45
         .Height = 20
         .Font.Size = 12
        End With

        Set Obj_nbref = Frame2.Controls.Add("forms.label.1")
        With Obj_nbref
         .Name = sel.Value & "€"
         .Caption = "€"
         .Left = 150
         .top = top
         .Width = 30
         .Height = 20
         .Font.Size = 16
        End With

         top = top + 30

            Frame2.ScrollHeight = top

        compteur = compteur + 1

    End If

Next sel

je vous joint également mon fichier si cella peux aider.

13mon-test.xlsm (45.63 Ko)

Mmh je vois ou est le problème, la propriété OnAction n'est pas disponible pour les CheckBox dans les UserForm dans VBA, elle est seulement disponible pour les contrôles de type bouton dans les feuilles de calcul Excel. Ce qui fait que l'attribution Cbx.OnAction = "Cbx_Click" est incorrecte dans ce contexte.

Vous pouvez créer une classe qui aura un événement Click pour chaque CheckBox. Un exemple de comment faire :
1 Créez une nouvelle classe. Insérer > Classe. Nommez cette nouvelle classe, disons CheckBoxEvents.
2 Dans cette nouvelle classe (CheckBoxEvents), ajoutez le code suivant

Public WithEvents Cbx As MSForms.CheckBox

Private Sub Cbx_Click()
    If Cbx.Value = True Then
        MsgBox Cbx.Name & " est coché."
    Else
        MsgBox Cbx.Name & " est décoché."
    End If
End Sub

3 Dans votre UserForm, ajoutez le code suivant en haut du module :

Dim CheckBoxes() As New CheckBoxEvents

4 Ensuite, modifiez votre procédure UserForm_Initialize :

Private Sub UserForm_Initialize()

    Dim sel As Range
    Dim top As Long
    Dim compteur As Long
    Dim i As Long

    top = 10
    i = 0

    For Each sel In Feuil2.Range("A2:A20")

        If sel <> "" Then

            ' Redimensionnez le tableau pour contenir un nouvel élément.
            ReDim Preserve CheckBoxes(i)

            Set Cbx = Frame2.Controls.Add("Forms.CheckBox.1")

            Cbx.Caption = sel.Value
            Cbx.Name = "Cocher" & compteur

            Cbx.Left = 10
            Cbx.Top = top
            Cbx.Font.Size = 10

            ' Associez la nouvelle CheckBox à l'objet CheckBoxEvents.
            Set CheckBoxes(i).Cbx = Cbx

            ' ... (ici, ajoutez le reste de votre code pour créer les autres contrôles et mettre à jour les variables)

            i = i + 1
        End If

    Next sel

End Sub

Maintenant, chaque fois que vous cliquez sur une CheckBox, l'événement Click de la classe CheckBoxEvents sera déclenché et le message approprié sera affiché. J'espère que cela vous aidera !

Cella fonctionne parfaitement, je vous en remercie vraiment.

j'ai appris pas mal de chose en peux de temps grâce au personnes sur ce forum.

Bonne soirée à vous Abderrahmane BENALI et encore merci ;)

Rechercher des sujets similaires à "checkbox generes runtime userform"