Créer des contrôles dynamiques sur un UserForm, Excel VBA
Voici un exemple détaillé pour créer des contrôles dynamiques sur un UserForm en Excel VBA. Ce code vous permet de créer des contrôles comme des TextBox, ComboBox, CommandButton, etc., au moment de l’exécution en fonction des données d’une feuille de calcul.
Étapes pour créer des contrôles dynamiques sur un UserForm :
1. Créer un UserForm :
- Ouvrez l’éditeur VBA avec
Alt + F11. - Insérez un UserForm en allant dans
Insertion > UserForm. - Vous verrez un UserForm vide dans l’éditeur, sans contrôles au départ.
2. Création dynamique des contrôles :
- Utilisez la méthode
Controls.Addpour ajouter des contrôles comme desTextBox,ComboBox, etc., pendant l’exécution.
3. Ajuster les propriétés des contrôles :
- Une fois qu’un contrôle est créé, vous pouvez modifier ses propriétés (par exemple,
Top,Left,Width,Height,Name, etc.) pour adapter son apparence.
4. Positionnement dynamique :
- Vous pouvez définir l’agencement des contrôles en calculant leurs positions et en les ajustant en fonction de la taille du formulaire ou d’autres conditions.
Exemple de code pour créer des contrôles dynamiques :
Cet exemple crée un UserForm avec des contrôles dynamiques en fonction des données présentes dans une feuille de calcul. Nous allons créer des TextBox et des CommandButton dynamiquement, en fonction du nombre de lignes de données dans la feuille.
Private Sub UserForm_Initialize()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim txtBox As MSForms.TextBox
Dim cmdButton As MSForms.CommandButton
' Définir la feuille de calcul (vous pouvez choisir n'importe quelle feuille)
Set ws = ThisWorkbook.Sheets("Feuil1")
' Trouver la dernière ligne avec des données dans la colonne A
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Initialiser la position du haut pour les contrôles
Dim topPosition As Integer
topPosition = 10 ' Commencer à 10 pixels du haut
' Boucle à travers les lignes de données et créer les contrôles
For i = 1 To lastRow
' Créer un TextBox
Set txtBox = Me.Controls.Add("Forms.TextBox.1", "txtBox" & i, True)
With txtBox
.Top = topPosition
.Left = 10
.Width = 200
.Height = 20
.Text = ws.Cells(i, 1).Value ' Définir le texte du TextBox avec la donnée de la feuille
End With
' Incrémenter la position du haut pour espacer les contrôles verticalement
topPosition = topPosition + 25
' Créer un CommandButton
Set cmdButton = Me.Controls.Add("Forms.CommandButton.1", "cmdButton" & i, True)
With cmdButton
.Top = topPosition
.Left = 10
.Width = 100
.Height = 30
.Caption = "Cliquez Moi " & i ' Définir le texte du bouton en fonction du numéro de ligne
.OnClick = "CommandButtonClick" ' Lier à un gestionnaire d'événements (expliqué ci-dessous)
End With
' Incrémenter la position du haut pour le prochain contrôle
topPosition = topPosition + 40
Next i
End Sub
' Gestionnaire d'événements pour le clic sur le bouton (vous pouvez ajouter cela dans le code du formulaire)
Private Sub CommandButtonClick()
MsgBox "Vous avez cliqué sur un bouton !"
End Sub
Explication du Code :
- UserForm_Initialize :
- Cet événement est déclenché lorsque le UserForm est chargé. Il est utilisé pour créer des contrôles dynamiques en fonction des données de la feuille.
ws.Cells(ws.Rows.Count, "A").End(xlUp).Rowpermet de trouver la dernière ligne avec des données dans la colonne A, ce qui détermine le nombre de contrôles à créer.- La boucle parcourt les lignes de la feuille et crée un
TextBoxet unCommandButtonpour chaque ligne. - Création Dynamique des Contrôles :
Me.Controls.Addest utilisé pour créer les contrôles. Il prend trois paramètres : le type de contrôle, un nom unique et un booléen indiquant si le contrôle doit être ajouté au UserForm.- Pour le
TextBox:.Topet.Leftdéfinissent la position,.Widthet.Heightdéfinissent la taille, et.Textdéfinit le texte initial (basé sur les données de la feuille). - Pour le
CommandButton:.Captiondéfinit le libellé du bouton, et.OnClickest lié à une sous-routine pour gérer l’événement de clic du bouton. - Ajustement de la disposition :
- La variable
topPositionpermet de positionner les contrôles les uns en dessous des autres avec un espace entre eux.
Concepts Clés :
1. Types de Contrôles :
- Vous pouvez créer dynamiquement différents types de contrôles, comme des
TextBox,ComboBox,Label,CommandButton, etc.
2. Positionnement :
TopetLeftdéfinissent la position du contrôle sur le UserForm. Vous pouvez ajuster ces valeurs pour créer un agencement en grille ou plus complexe.
3. Gestion des Événements :
- Pour des contrôles dynamiques comme les
CommandButton, vous pouvez lier un gestionnaire d’événements (par exemple,OnClick) pour gérer les interactions utilisateur.
4. Dimensionnement Dynamique :
- Vous pouvez utiliser des logiques pour ajuster la taille et l’agencement des contrôles en fonction de la taille du formulaire ou du nombre de contrôles créés.
Améliorations Possibles :
- Vous pouvez personnaliser le type de contrôles en fonction des besoins des utilisateurs, par exemple en utilisant des
ComboBoxpour des listes déroulantes. - Implémentez une logique de validation ou des fonctionnalités spécifiques dans les gestionnaires d’événements pour chaque contrôle.
- Vous pouvez également ajouter des Labels dynamiques pour décrire chaque contrôle.
Ce code est un modèle de base. Selon vos besoins, vous pouvez l’améliorer avec des logiques plus complexes, des types de contrôles personnalisés et une gestion plus sophistiquée de la mise en page.