Bug - Création dynamique de CommandButton

Salut,

J'ai écrit une routine pour créer dynamiquement des CommandButton et leur affecter une macro.

Tout se passe bien, les CommandButton sont bien créés au bon endroit, les macros associées sont bien créées aussi, mais quand je clique sur le CommandButton, rien ne se passe, et je n'ai pas de message d'erreur.

Si vous pouvez me dire ce qui cloche...

Voilà mon code

Dim Ctl As Control

Ligne = 2

For i = 1 To Nb_avions

Set Ctl = Me.Frame1.Controls.Add("forms.CommandButton.1")

With Ctl

.Name = "CommandButton" & i

.Left = 6

.Top = 12 + (i - 1) * 30

.Height = 24

.Width = 114

.Caption = Sheets("Gen").Cells(Ligne, 1)

End With

With ThisWorkbook.VBProject.VBComponents("UserForm01").CodeModule

Line = .CountOfLines

.InsertLines Line + 1, "Private Sub CommandButton" & i & "_Click()"

.InsertLines Line + 2, ""

.InsertLines Line + 3, "Immat=CommandButton" & i & ".Caption"

.InsertLines Line + 4, "Call Création_BL"

.InsertLines Line + 5, ""

.InsertLines Line + 6, "End Sub"

End With

Ligne = Ligne + 1

Next i

Précision : la macro Création_BL existe et fonctionne si la variable Immat a une valeur.

Merci d'avance.

Manu

Bonjour,

Ce qui cloche, c'est qu'en créant dynamiquement votre procédure événementielle, vous ne pouvez pas lier cette procédure au contrôle que vous venez de créer. Il faut passer par un module de classe associé à cette procédure événementielle.

Etape 1: création du module de classe

1- créer un module de classe nommé par exemple : "CmdButton"

2- lui affecter le code suivant

 
Option Explicit

'# Evénements pour bouton de commande
Private WithEvents bouton As MSForms.CommandButton

Public Property Set Obj_CommandButton(ByVal button As MSForms.CommandButton)
    Set bouton = button
End Property

Private Sub bouton_Click()
    immat = bouton.Caption
    Call Création_BL
End Sub

Etape 2 : utilisation d'une collection pour stocker les éléments de la classe

La collection doit être définie au niveau du module du UserForm. Ci-dessous exemple de code :

Dim boutons As New Collection  'création de la collection contenant les élémements de la classe

Private Sub UserForm_Initialize()
    Dim ctl As Control

    Ligne = 2
    For i = 1 To Nb_avions
        Set ctl = Me.Frame1.Controls.Add("forms.CommandButton.1")
        With ctl
            .Left = 6
            .Top = 12 + (i - 1) * 30
            .Height = 24
            .Width = 114
            .Caption = Sheets("Gen").Cells(Ligne, 1)
        End With
        'création et stockage d'un nouvel élément de la classe
        boutons.Add Item:=New CmdButton
        'assignation de l'objet bouton de l'élémemnt de classe au contrôle créé
        Set boutons(boutons.Count).Obj_CommandButton = ctl
        '.....................................................................

        Ligne = Ligne + 1
    Next i

End Sub

J'ai testé j'obtiens le même résultat, les boutons sont inactifs

Je comprends pas pourquoi ma solution ne fonctionne pas : j'ai un CommandButton avec le bon nom (CommandButton1 à x) et les Private Sub associées (CommandButton1 à x_Click).

Manu

J'ai testé j'obtiens le même résultat, les boutons sont inactifs

Il doit manquer quelque chose dans la prise en compte des étapes que je vous ai décrites.

Ci-joint un exemple construit avec les éléments que vous avez communiqués. Si vous me fournissez un extrait non confidentiel de votre classeur, je vous dirai ce qui manque.

j'ai un CommandButton avec le bon nom (CommandButton1 à x) et les Private Sub associées (CommandButton1 à x_Click).

Certes, mais le problème est que par exemple, la procédure : CommandButton1_Click() n'est pas associée aux événements de CommandButton1 car cette procédure n'a pas été construite à partir de l'objet CommandButton1 mais à partir d'une chaîne de caractères. Autrement dit, avec votre procédure de construction, CommandButton1 n'est pas reconnue comme une variable objet mais comme une simple chaîne de caractères.

144exemple01.xlsm (19.57 Ko)
Rechercher des sujets similaires à "bug creation dynamique commandbutton"