Vous êtes sur la page 1sur 12

VBA-01: Programmation VBA

LES OBJETS USERFORM


Les objets UserForm sont des boîtes de dialogue définies par l’utilisateur.

Ce tutoriel explique comment créer une boîte de dialogue permettant de saisir


les clients d’une entreprise, comme le montre la capture d’écran suivante :

1. Créer un fichier Excel sous le nom etudiants.xls


2. Renommer la feuille 1 à étudiants
3. Saisir quelques valeurs
4. Créer une feuille DIVERS qui contient les cycles

On peut distinguer deux phases dans la création d’un objet UserForm :

1. le dessin de l’objet UserForm : consiste à placer les contrôles sur les


objets
2. l’association de code à l’objet UserForm et à ses différents contrôles :
déterminer le comportement de l’objet userform et de ses différents
contrôles.

I. CREER UN OBJET USERFORM


Pour créer un objet « UserForm », utiliser le VBE avec insertion/userform.
- La boite de dialogue,
- La boite à outils avec les contrôles,
- Fenêtre propriété.

1
VBA-01: Programmation VBA

L’explorateur de projets permet d’afficher le code d’un objet USERFORM à l’aide


du clic droit de la souris et de l’option CODE ; ou d’afficher l’objet lui-même à
l’aide du clic droit de la souris et de l’option AFFICHER L’OBJET.
Pour ajouter d’autres contrôles dans la boite à outils, click droit/contrôles
supplémentaires

Propriété de l’objet :
- Name : Nom de l’objet. Sera utilisé pour la manipulation de la variable
objet
- Caption : Titre de la fenêtre
- Color : background, border, etc.

Exercice : (se référer au tutoriel programmation VBA pour les propriétés des
contrôles)
1. Modifier le nom de l’objet en « AddEtudiant»
2. Modifier le titre de la fenêtre en « Formulaire de saisie d’un étudiant »
3. Modifier les couleurs de la fenêtre à votre convenance.
4. Placer les contrôles suivants et modifier leur priorité (Name, caption)

2
VBA-01: Programmation VBA

Cet objet est composé des contrôles suivants : Intitulé, Zone de texte, Zone de
liste modifiable, bouton de commande, objet date, Bouton d’option.
Pour placer un contrôle dans l’objet UserForm, cliquer sur l’objet voulu de la
BOITE A OUTILS et le faire glisser vers l’objet UserForm.

II. AFFICHER ET FERMER UN OBJET USERFORM

L’instruction Load permet de charger un objet UserForm en mémoire sans


l’afficher.
La méthode Show de l’objet UserForm permet d’afficher un objet UserForm et
de le charger en mémoire, si cela n’a pas déjà été fait.
Exercice :
Ecrire la procédure qui permet d’afficher la boîte de dialogue de saisie d’un
étudiant.
- Dans l’éditeur de Visual Basic, activer la commande INSERTION MODULE.
Un module de code MODULE1 s’ouvre. Renommer le module
SaisieEtudiants à l’aide de la propriété NAME.
- Ajouter la procédure d’ouverture de la fenêtre.
Sub AjoutEtudiant()
AddEtudiant.Show
End Sub
- Et affecter cette procédure à un bouton dans la feuille des étudiants

3
VBA-01: Programmation VBA

Fermer ou masquer un objet UserForm


L’instruction Unload permet de fermer un objet UserForm et de l’effacer de la
mémoire, les valeurs de ses contrôles sont alors perdues.
La méthode Hide de l’objet UserForm permet de faire disparaître un objet
UserForm de l’écran sans le supprimer de la mémoire.

III. ASSOCIER DU CODE A UN OBJET USERFORM

Les contrôles placés sur un objet UserForm et l’objet UserForm lui-même sont
réceptifs aux événements utilisateurs qui les affectent.
On peut ainsi créer des procédures dites procédures événementielles, qui se
déclencheront lorsque l’événement correspondant sera repéré.
La syntaxe d’une procédure événementielle attachée à un contrôle de nom
NomContrôle (propriété NAME) et déclenchée par un événement
NomEvénement est la suivante :
Private Sub NomContrôle_NomEvénement()
...
End Sub
Dans le cas d’une procédure événementielle attachée à un objet UserForm, le
nom de l’objet UserForm (propriété NAME) n’apparaît pas dans les instructions
de déclaration de la procédure. Il est remplacé par le mot clé UserForm comme
suit :
Private Sub UserForm_Click()
…….
End Sub

Les événements sont nombreux et varient d’un contrôle à l’autre. Les


événements sont accessibles dans la fenêtre du code de l’userForm en
choisissant le contrôle et l’évènement liés :

4
VBA-01: Programmation VBA

Exemple :

Evènement Description
Change détecté lors de la modification de la valeur (propriété
VALUE) d’un contrôle (par exemple une zone de
texte).
Click détecté lorsque l’utilisateur clique sur un contrôle
(par
exemple un bouton de commande).
dblClick détecté lorsque l’utilisateur double-clique sur un
contrôle.
Exit Détecté quand on sort du contrôle

IV. Associer du code à un bouton de commande


Associer le code nécessaire au bouton de commande OK pour que la boîte de
dialogue soit fermée lorsque l’on clique dessus.
1. Aller dans l’éditeur de Visual Basic. Dans l’explorateur de projets,
sélectionner l’objet UserForm de nom AddEtudiant et ouvrir son module
de code à l’aide du clic droit de la souris et de l’option CODE (ou en
double-cliquant dessus).
2. Dans la liste de gauche au sommet du module de code, sélectionner
l’option CommandButton2. Dans la liste de droite au sommet du module
de code, sélectionner l’événement Click.

3. Compléter la procédure événementielle ButtonOK_Click qui apparaît


comme suit :
Private Sub ButtonOK_Click()
Call Unload(Me)
End Sub

5
VBA-01: Programmation VBA

La propriété Me de l’objet UserForm renvoie l’objet UserForm actif.


Exercice
Associer le code nécessaire au bouton Annuler pour que la boîte de dialogue
soit fermée lorsque l’on clique dessus.

V. Initialiser un objet UserForm

L’événement Initialize d’un objet UserForm est détecté lorsque l’objet UserForm
est chargé, à l’aide de la méthode Show ou de l’instruction Load.
La procédure événementielle associée à l’événement Initialize d’un objet
UserForm s’exécute avant l’affichage de l’objet et a la syntaxe suivante :
Private Sub UserForm_Initialize()
...
End Sub
Cette procédure permet d’effectuer des réglages dans l’objet UserForm avant
son chargement.
Exercice
Ecrire le code nécessaire pour affecter les valeurs “CPI1A ; CPI2A ; CI1A ; CI2A” à
la zone de liste modifiable ComboBox1, en utilisant les valeurs qui se trouvent
dans la plage de cellule A1:A4 de la feuille de calcul DIVERS.
Dans la procédure initialize du UserForm, ajouter le code suivant :
Private Sub UserForm_Initialize()
Dim i As Integer
i=1
Do Until IsEmpty(Worksheets("Divers").Range("A" & i))
Call Me.ComboBox1.AddItem(Worksheets("Divers"). _
Range("A" & i).Value)
i=i+1
Loop
End Sub
Tester la procédure à l’ouverture de l’UserForm.

6
VBA-01: Programmation VBA

Pour information : Il existe une autre méthode pour initialiser la zone de liste
modifiable ComboBox1 avec les valeurs “CPI1A ; CPI2A ; CI1A ; CI2A”, en la liant
à la plage de cellule A1:A4 de la feuille de calcul DIVERS.
Pour lier un contrôle à une plage de cellules, il faut renseigner la propriété
ROWSOURCE du contrôle avec la plage de cellules voulue (dans notre cas,
Divers!A1:A4) ou encore mieux avec le nom de la plage de cellules voulue, ce qui
suppose de nommer cette plage de cellules.
Remarque : La propriété CONTROLSOURCE permet de lier un contrôle à une
seule cellule.
Attention: Cette méthode, contrairement à la précédente, ne pourra pas
prendre en compte les éventuelles modifications faites sur le titre d’un client
(ajout ou suppression d’un titre). La zone de liste modifiable ComboBox1 est liée
à la plage de cellule fixe A1:A4 de la feuille de calcul DIVERS.
L'évènement Initialize se produit au chargement d'un UserForm, l'évènement
QueryClose se produit à sa fermeture.

VI. Accéder aux contrôles d’un objet UserForm

Nous avons créé un objet UserForm pour saisir de nouveaux étudiants, et,
ouvert et fermé cet objet. Cependant, si l’utilisateur saisit des données dans
l’objet UserForm, ces dernières ne sont pas recopiées dans liste de données
EXCEL correspondante.
La mise à jour de la liste de données EXCEL correspondant aux données de
l’étudiant doit être faite lorsque l’utilisateur clique sur le bouton enregistrer. Elle
consiste à insérer une nouvelle ligne dans la liste de données et à recopier les
valeurs des contrôles de l’objet UserForm dans les bonnes cellules de la nouvelle
ligne.
Pour récupérer les valeurs des contrôles ou les modifier, on utilise Text
Ex : Matricule.Text = 12321 ou Range(« A1 »).value = Matricule.Text
Exercice

7
VBA-01: Programmation VBA

Insérer une nouvelle ligne dans la feuille étudiant des données saisies dans le
formulaire.

Pour cela, nous avons besoin de connaitre la dernière ligne vide du tableau
pour insérer les valeurs. Nous pouvons utiliser la méthode end de Range :
Range("A1").End(Direction).Select
xlDown : Down
xlUp : up
xlToLeft : left
xlToRight : right
Ex : DernLigne = Range("A" & Rows.Count).End(xlUp).Row

Solution:

Private Sub valider_Click()


Worksheets("Etudiants").Activate
Dim DernLigne As Integer
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
DernLigne = DernLigne + 1 'vu qu'elle me retourne la derniére ligne non vide
Sheets("Etudiants").Range("A" & DernLigne).Value = matricule.Text
If Me.ComboMme.value = true Then
Sheets("Etudiants").Range("B" & DernLigne).Value = "Mme"
ElseIf Me.ComboMr.value = true Then
Sheets("Etudiants").Range("B" & DernLigne).Value = "Mr"
End If
Sheets("Etudiants").Range("C" & DernLigne).Value = nom.Text
Sheets("Etudiants").Range("D" & DernLigne).Value = prenom.Text
Sheets("Etudiants").Range("E" & DernLigne).Value = Datenaissance.Value
Call Unload(Me)
End Sub

Attention : Si, dans les procédures événementielles ButtonOK_Click et


ButtonAnnuler_Click, on utilise la méthode Hide pour masquer l’objet UserForm
à la place de l’instruction Unload, les ressources mémoires de l’objet UserForm
ne sont pas libérées. Lors d’un nouvel affichage de l’objet UserForm avec la
méthode Show, les différents contrôles de l’objet ont alors les mêmes valeurs
que lorsqu’il a été masqué.

8
VBA-01: Programmation VBA

Exercice
Ajouter un bouton modifier étudiant qui permet d’ouvrir la même fenêtre mais
avec les contrôles pré-remplie par les données de la ligne sélectionnée.

VII. Gérer des listes dans un objet UserForm

Pour gérer les listes des étudiants dans un formulaire, il faut utiliser le contrôle
« ListView ». Assurez-vous que ce contrôle est bien actif dans ou l’activer via les
contrôles supplémentaires. Et faites glisser le contrôle dans le formulaire.

L’objectif étant de remplir cette liste avec les informations des étudiants. Le
remplissage de la liste se fait en code VBA.
Pour commencer :
Chaque ligne d'une ListView peut être définie en 2 parties:
 ListView1.ListItems(x) spécifie la ligne x et la 1ere colonne de cette ligne.

9
VBA-01: Programmation VBA

 ListView1.ListItems(x).ListSubItems(y) permet de spécifier les colonnes


adjacentes.
Par exemple ListView1.ListItems(5).ListSubItems(1) indique la 2eme
colonne dans la 5eme ligne de la ListView.
Exemple :
‘Définir les entêtes, donc les nombres de colonnes
PS : vérifier que dans les propriétes de listView, hidecolumnHeaders est à false
With .ColumnHeaders
'Supprime les anciens entêtes
.Clear
'Ajoute 3 colonnes en spécifiant le nom de l'entête
'et la largeur des colonnes
.Add , , "Nom", 80
.Add , , "Prénom", 50
End With
Par la suite, on commence à remplir la première colonne
'Remplissage de la 1ere colonne (création de 3 lignes)
With .ListItems
.Add , , "nom 1" //fait référence au numéro de ligne 1
.Add , , "nom 2" //fait référence au numéro de ligne 2
End With
'Remplissage colonnes 2 et 3
‘On crée des sub liste en utilisant l’index de la ligne à renseigner.

.ListItems(1).ListSubItems.Add , , "prenom1"
.ListItems(1).ListSubItems.Add , , "date de naissance 1"
.ListItems(2).ListSubItems.Add , , "prénom 2"
.ListItems(2).ListSubItems.Add , , "date de naissance 2"

Autres fonctions de listView


Remove : ListView1.ListItems.Remove 3

Clear : ListView1.ListItems.Clear
Count : ListView1.ListItems.Count

Tri de la liste :
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
ListView1.Sorted = False
ListView1.SortKey = ColumnHeader.Index - 1

If ListView1.SortOrder = lvwAscending Then

10
VBA-01: Programmation VBA

ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If

ListView1.Sorted = True
End Sub

Exercice :
Afficher dans un objet userForm, une liste permettant de lister tous les
étudiants de la feuille 1.
Private Sub UserForm_Initialize()
Dim i, derniligne As Integer
derniligne = Range("A" & Rows.Count).End(xlUp).Row
'----- remplissage ListView------------------------
With ListView1
'Définit le nombre de colonnes et Entêtes
'Définir les entêtes, donc les nombres de colonnes
With .ColumnHeaders
'Supprime les anciens entêtes
.Clear
'Ajoute 3 colonnes en spécifiant le nom de l'entête
'et la largeur des colonnes
.Add , , "Nom", 80
.Add , , "Prénom", 50
.Add , , "Date de naissance", 120
End With
'Remplissage 1ere colonne
For i = 3 To derniligne
ListView1.ListItems.Add, , Range("A" & i).Value
Next i

'Remplissage colonnes 2 et 3
For i = 3 To derniligne
ListView1.ListItems(i - 2).ListSubItems.Add , , Range("B" & i).Value
ListView1.ListItems(i - 2).ListSubItems.Add , , Range("C" & i).Value
Next i
End With
'Spécifie l'affichage en mode "Détails"
ListView1.View = lvwReport
End Sub

11
VBA-01: Programmation VBA

Exercice :

Ajouter dans le formulaire 2 champs de recherche pour le nom et le cycle et qui


permettant de filtrer la liste selon les critères saisis.

12

Vous aimerez peut-être aussi