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à3pour 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é
Captionest 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
CodeModuleest utilisé pour insérer du code VBA dans le UserForm créé dynamiquement. - Un événement
btnSubmit_Clickest 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.