Créer dynamiquement des contrôles dans un UserForm, Excel VBA
Voici un code VBA détaillé pour créer dynamiquement des contrôles dans un UserForm sous Excel, accompagné d’une explication complète.
Code VBA pour Créer des Contrôles Dynamiques dans un UserForm
Ce code va créer un UserForm avec des étiquettes (Labels), des zones de texte (TextBox) et un bouton (Button) de manière dynamique lorsqu’il est exécuté.
Option Explicit Dim NewForm As Object Dim TxtBox As Object Dim Lbl As Object Dim Btn As Object Sub CreateDynamicUserForm() Dim i As Integer Dim CodeModule As Object ' Créer le UserForm dynamiquement Set NewForm = ThisWorkbook.VBProject.VBComponents.Add(3) ' 3 correspond à un UserForm With NewForm .Properties("Caption") = "Dynamic UserForm" .Properties("Width") = 300 .Properties("Height") = 250 End With ' Boucle pour créer plusieurs TextBoxes et Labels For i = 1 To 3 ' Créer l'étiquette (Label) Set Lbl = NewForm.Designer.Controls.Add("Forms.Label.1", "Label" & i, True) With Lbl .Caption = "Label " & i .Left = 20 .Top = 20 + (i - 1) * 30 .Width = 80 End With ' Créer la zone de texte (TextBox) Set TxtBox = NewForm.Designer.Controls.Add("Forms.TextBox.1", "TextBox" & i, True) With TxtBox .Left = 110 .Top = 20 + (i - 1) * 30 .Width = 150 End With Next i ' Créer le bouton de soumission (Submit Button) Set Btn = NewForm.Designer.Controls.Add("Forms.CommandButton.1", "btnSubmit", True) With Btn .Caption = "Submit" .Left = 100 .Top = 120 .Width = 100 End With ' Ajouter un événement de clic pour le bouton via le CodeModule Set CodeModule = NewForm.CodeModule With CodeModule Dim Code As String Code = "Private Sub btnSubmit_Click()" & vbCrLf & _ " MsgBox ""You clicked Submit!""" & vbCrLf & _ "End Sub" .InsertLines .CountOfLines + 1, Code End With ' Afficher le formulaire dynamiquement End Sub
Explication du Code
1. Création dynamique de l’objet UserForm
Set NewForm = ThisWorkbook.VBProject.VBComponents.Add(3) ' 3 correspond à un UserForm
- La fonction
VBProject.VBComponents.Add(3)
permet de créer dynamiquement un nouvel UserForm dans le projet VBA du classeur. - Le formulaire est stocké dans la variable
NewForm
.
2. Définir les propriétés du UserForm
With NewForm .Properties("Caption") = "Dynamic UserForm" .Properties("Width") = 300 .Properties("Height") = 250 End With
- Le titre (Caption) du formulaire est défini à « Dynamic UserForm ».
- La largeur et la hauteur du formulaire sont spécifiées (300 x 250).
3. Boucle pour ajouter des Labels et des TextBoxes
For i = 1 To 3 ' Créer l'étiquette (Label) Set Lbl = NewForm.Designer.Controls.Add("Forms.Label.1", "Label" & i, True) With Lbl .Caption = "Label " & i .Left = 20 .Top = 20 + (i - 1) * 30 .Width = 80 End With
-
- Une boucle s’exécute de
1
à3
pour créer plusieurs Labels et TextBoxes. - La commande
NewForm.Designer.Controls.Add("Forms.Label.1", "Label" & i, True)
ajoute dynamiquement un Label. - La propriété
Caption
est définie à"Label i"
, et le label est positionné selon les coordonnées.
- Une boucle s’exécute de
' Créer la zone de texte (TextBox) Set TxtBox = NewForm.Designer.Controls.Add("Forms.TextBox.1", "TextBox" & i, True) With TxtBox .Left = 110 .Top = 20 + (i - 1) * 30 .Width = 150 End With Next i
- De manière similaire, des TextBoxes sont ajoutées à côté des Labels.
4. Création du bouton de soumission (Submit Button)
Set Btn = NewForm.Designer.Controls.Add("Forms.CommandButton.1", "btnSubmit", True) With Btn .Caption = "Submit" .Left = 100 .Top = 120 .Width = 100 End With
- Un bouton nommé
"btnSubmit"
est créé. - Le Caption du bouton est défini à
"Submit"
, et il est positionné.
5. Ajouter le code VBA pour gérer le clic sur le bouton
Set CodeModule = NewForm.CodeModule With CodeModule Dim Code As String Code = "Private Sub btnSubmit_Click()" & vbCrLf & _ " MsgBox ""You clicked Submit!""" & vbCrLf & _ "End Sub" .InsertLines .CountOfLines + 1, Code End With
- L’objet
CodeModule
est utilisé pour insérer du code VBA dans le UserForm créé dynamiquement. - Un événement
btnSubmit_Click
est ajouté, affichant une MsgBox lorsqu’on clique sur le bouton.
6. Affichage du UserForm
- Le UserForm créé dynamiquement est affiché à l’utilisateur.
Améliorations et Personnalisations
1. Création dynamique des contrôles :
- Le nombre de TextBoxes et Labels peut être modifié en ajustant la limite de la boucle.
2. Améliorations de gestion des événements :
- Il est possible d’ajouter d’autres événements comme le changement de texte (
TextBox_Change
) ou la sortie du contrôle (TextBox_Exit
).
3. Ajout de contrôles supplémentaires :
- D’autres contrôles comme des ComboBox, CheckBox, ou des Frames peuvent être ajoutés de manière similaire.
4. Stockage des données du formulaire :
- Les valeurs saisies dans les TextBoxes peuvent être stockées dans une feuille de calcul à la soumission.