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
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
- Messages
- 4'092
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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.