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.Add
pour 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).Row
permet 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
TextBox
et unCommandButton
pour chaque ligne. - Création Dynamique des Contrôles :
Me.Controls.Add
est 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
:.Top
et.Left
définissent la position,.Width
et.Height
définissent la taille, et.Text
définit le texte initial (basé sur les données de la feuille). - Pour le
CommandButton
:.Caption
définit le libellé du bouton, et.OnClick
est lié à une sous-routine pour gérer l’événement de clic du bouton. - Ajustement de la disposition :
- La variable
topPosition
permet 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 :
Top
etLeft
dé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
ComboBox
pour 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.