Académique Documents
Professionnel Documents
Culture Documents
Cours dispensé dans le cadre des activités de formation de la Junior Entreprise ENSEA
Par M. MOUSSANA HYLOD Armel
Ingénieur des Travaux Statistiques
Elève Ingénieur Statisticien Economiste (ISE 3)
Plan du cours :
INTRODUCTION
CONCLUSION
INTRODUCTION
Le langage Visual Basic Edition Application est une opportunité donnée aux utilisateurs des
applications de Microsoft office (Excel, Access, Word, etc.) de développer des solutions
personnalisées qui répondent à des besoins spécifiques (automatisation des taches, création
d’interface personnalisée, etc.). Dans le cas d’Excel par exemple, l’automatisation des taches
peut se faire à partir de l’enregistrement automatique de macro. Cependant, bien que cela
paraissent très pratique, cette procédure montre ces limites quant il s’agit d’automatiser des
tâches plus complexes assorties d’interfaces. Il faut souligner aussi que l’enregistrement
automatique d'Excel tend à créer un code de mauvaise qualité, ceci étant dû au fait qu'il
enregistre les actions de l'utilisateur, et donc fonctionne selon un mode Sélection / Action. Or
la sélection est rarement utile dans une Macro.
L’objet de ce cours sera donc de vous emmener à faire vos premiers pas en programmation
VBA. Cela passe nécessairement par la maîtrise des concepts clés de la programmation VB
(objet, propriété, méthode, etc.) et la pratique par l’exemple.
Exemple 1 : Assimilons l’application Excel à une maison et que nous voulons réaliser les
actions suivantes :
- cacher (méthode) le savon (objet) qui se trouve sur l’étagère des toilettes,
- Mettre le volume (propriété) de la radio (objet) qui se trouve sur le buffet du salon à 10.
En langage VB en écrira :
Maison.Toilettes.Etagère.Savon.cacher
Maison.Salon.Buffet.Radio.Volume = ‘10’
La maîtrise de cette syntaxe vous permettra de lire facilement un programme VB. On écrira :
Chemin d’accès.objet.méthode, pour appliquer une action sur un objet
Chemin d’accès.objet.propriété = ‘valeur’, pour changer la valeur de la propriété d’un objet.
Application 1 : Comparaison code automatique et code saisi
Pour mieux comprendre les notions de propriété et de méthode, nous allons créer une macro
(Ensemble d’instructions demandant à l’ordinateur d’exécuter une tache précise) qui
exécutera les actions suivantes :
L’intérêt de cette application est de comparer le code généré automatiquement et celui écrit
manuellement d’une par et de vous familiariser avec la notion de méthode et de propriétés.
- on peut le faire avec l’enregistreur de macro automatique. Dans Excel cliquer sur
Outils, macro et enfin sur nouvelle macro. Dans la boite de dialogue qui s’affiche,
donner le nom « macro_auto » à la macro. Exécuter les actions énumérées plus haut.
Enfin, arrêter l’enregistrement en appuyant Outils, macro, arrêter l’enregistrement
de la macro. Pour visualiser le code généré, cliquer sur Outils, macro, macros et
enfin sur modifier dans la boite qui s’affiche.
- l’autre possibilité consiste à écrire soit même sa macro. Pour cela, aller dans Outils,
Macro, Visual Basic Editor pour lancer l’environnement de développement de VBA.
Cet environnement de développement se présente comme sur la figure ci-dessous.
Fenêtre code
Explorateur
de projet
Fenêtre des
propriétés de
l’objet sélectionné
- La Fenêtre Code fait office d'éditeur pour la saisie du code de l'application. Une fenêtre
Code distincte est créée pour chaque feuille ou module de code de votre application.
- Fenêtre Explorateur de projets énumère les feuilles et les modules contenus dans votre
projet en cours. Un projet est un ensemble de fichiers à partir desquels vous créez une
application.
Pour écrire manuellement notre macro, insérer un module à partir du menu insertion,
module. Dans ce module saisir le code (sans les numeros marqués devant chaque ligne)
suivant :
Sub macro_manu()
1. Sheets(“Feuil1”).Name = “PROJET”
2. Range(“D1”).Value = “ENSEA SERVICE JUNIOR”
3. With Range(“D1”).Font
4. .Name = “Arial”
5. .Size = 16
6. .Bold = True
7. End With
8. Rows(“2:3”).Interior.ColorIndex = 10
9. Columns(“B:C”).Interior.ColorIndex = 3
10. Sheets(“Feuil2”).Delete
11. Sheets(“Feuil3”).Delete
12. End Sub
Une fois ce programme saisi, on peut retourner dans Excel pour exécuter la macro
« macro_manu » à partir de Outils, Macro, Macros. Que constatez vous ?
On peut à présent comparer les codes générer par Excel automatiquement et celui écrit
manuellement. Vous constaterez que le code générer automatiquement est lourd inutilement à
cause de la méthode select.
- La déclaration
Les instructions de déclaration nomment une variable, une constante ou une procédure et
peuvent également spécifier un type de données (Const, Dim, Private, Public, New, Static).
Private myVar As String
¾ Userform(index ou nom) : c’est une fenetre ou une boite de dalogue entrant dans la
composition d’un interface utilisateur. Cet objet est très utilisé dans la programmation
VBA. Exemple : userform("Compte").show, « cette instruction affiche le formulaire
nommé compte.
¾ Controls : c’est objet (Bouton, case à cocher, etc.) pouvant être placer sur un
formulaire (Userform). Exemple : CommandButton1.caption = "Annuler", affiche
« Annuler » dans le bouton « CommandButton1 ».
InputBox : Affiche une invite dans une boîte de dialogue et renvoyer les données
entrées par l'utilisateur.
MsgBox : Affiche un message dans une boîte de dialogue et renvoyer une valeur
indiquant le bouton de commande sur lequel l'utilisateur a cliqué.
Il faut retenir que les fonctions MsgBox et InputBox s’utilisent selon la syntaxe suivante :
Variable = MsgBox (prompt, butons, title)
Variable = InputBox(prompt, title, default)
La valeur renvoyée par la fonction MsgBox varie en fonction du bouton cliqué par
l’utilisateur, selon la règle :
Bouton Constante Valeur
OK VbOk 1
Annuler VbCancel 2
Abandonner VbAbort 3
Réessayer VbRetry 4
Ignorer VbIgnore 5
Oui VbYes 6
Nom VbNo 7
Remarque : Excel 2003 contient, d'après l'aide, pas moins de 258 boîtes de dialogue
personnalisées! En voici quelques exemples : Fichier/Ouvrir, Fichier/Enregistrer sous,
Format/Cellule,Outils/Personnaliser,etc.
Et le plus fort, c'est qu'il est possible de les appeler depuis du code VBA !
Sub MacroQuelconque
Application.Dialogs(xlDialogZoom).Show
End Sub
Remarque : Il faut noter que chaque objet possède certaines propriétés et méthodes qui lui
sont propres, au-delà de celles qui s’appliquent à l’ensemble des objets. Tout le problème en
programmation VBA, c’est d’apprendre les propriétés et les méthodes des objets Excel. Par
exemple : la méthode Hide (cacher) ne s’applique pas à l’objet sheets.
AutoFit
Ajuste la largeur de colonne / hauteur de ligne en fonction du contenu.
S'applique sur des colonnes ou des lignes mais pas directement sur la plage.
Range(Cells(1, 2), Cells(3, 2)).AutoFit renvoie une erreur, il faut écrire
Range(Cells(1, 2), Cells(3, 2)).Columns.AutoFit
Find & FindNext: La syntaxe de cette méthode est MaPlageFind (What, After, LookIn,
LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte).
La méthode Find ne déclenche pas une erreur lorsqu'elle ne trouve pas de cellules
correspondantes, comme on le lit souvent dans des forums. Lors d'un enregistrement
automatique on obtient :
Selection.Find(What:="27", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate, ainsi qu'un message d'alerte qui signale qu'il n'y a pas de cellules
correspondantes. Lorsqu'on prend ce bout de code et qu'on cherche à le bricoler pour faire une
recherche dans son programme, on constate qu'il se produit une erreur s'il n'y pas de cellule
contenant la recherche. Or ce qui est en cause n'est pas la méthode Find, mais l'appel de la
méthode Activate. En effet, Find renvoie un objet Range qui est la première cellule contenant
le critère ou Nothing s'il n'y en a pas. Et l'appel de Nothing.Activate fait planter l'exécution.
Ceci nous permet de dire qu'il faut se méfier de l'enregistrement automatique, de la méthode
Activate et des copier/coller de bout de code.
Pour mieux comprendre ces différentes étapes, nous allons réaliser les différents projets et
applications qui suivent.
Application 2 : Compter le nombre de cellules vides d’une plage sélectionnée et les colorées
Objectif :
¾ savoir placer des contrôles sur une feuille Excel ;
¾ maîtriser l’utilisation d’une boite de dialogue msgbox et inputbox ;
¾ savoir utiliser les structures itératives.
Démarche :
¾ créer un classeur nommé « mes petits macro »
¾ activer la boite de dialogue « boîte à outils contrôles » dans le menu Affichage, Barre
d’outils, boîte à outils contrôles
¾ sur la feuille « feuil1 », placer deux contrôles « bouton de commande » et changer leur
propriété caption respectivement en « Compte le nombre de zones sélectionnées dans
cette feuille » et «compte le nombre de cellules vide d’une plage
sélectionnée ». Modifier la propriété AutoZise de ces objets en « True », ceci pour que
tout l’intitulé du bouton s’affiche. (pour avoir accès aux propriétés de l’objet, cliquer
sur ce dernier avec le bouton droit de la souris et dans boite de dialogue qui s’affiche
cliquer sur « propriétés »)
¾ Cliquer le bouton « Compte le nombre de zones sélectionnées dans cette feuille » avec
le bouton droit et cliquer sur « visualiser le code ». Dans la fenêtre qui s’affiche saisir,
entre Private Sub CommandButton1_Click() et End Sub, le code suivant :
Dim reponse As String
Dim adresseSelection As String
'stockage de l'adresse des plages sélectionnées à partir de la méthode qui renvoie l’adresse de la plage sélectionnée
adresseSelection = ActiveWindow.RangeSelection.Address
' on utilise une structure décisionnelle IF..Then.. pour colorer les plages sélectionnées en fonction de la reponse
If reponse = vbYes Then
End If
NB : Dans VB pour assurer la lisibilité du programme, les commentaires sont précédés de
l’apostrophe et ne sont donc pas reconnus par VBA comme instructions du code.
6 Henri La Macro que je vous propose va mettre en fond jaune tous les noms qui
7 Paul apparaissent au moins deux fois sur la liste.
8 Paul
9 christian
Conception de la Macro :
Créer un nouveau classeur nommé doublons et saisir les données du tableau dans Excel.
Allez dans VBA, et créez un nouveau Module menu Insertion, Module. Dans ce module
copiez le code suivant :
1. Type TableauType
2. Contenu As String
3. Coordonnee As Integer
4. End Type
5. Sub TrouveDoublon()
6. Dim Tableau() As TableauType
7. Dim Cellule, Haut, Bas, Compteur, C2
8. Dim adresse As Range
9. Dim NombreCell As Integer
10. NombreCell = 1
12. Set adresse = Application.InputBox (prompt:="Sélectionnez une cellule non vide de la colonne à traiter.", _
13. Title:="SELECTION CELLULES", Type:=8)
27. adresse.Activate
28. 'initialisation
29. Colonne = ActiveCell.Column
30. Haut = Selection.End(xlUp).Row
31. Bas = Selection.End(xlDown).Row
43. Next C2
44. End If
45. Next Compteur
46. End Sub
Ce programme mérite d’être commenté afin d’en dégager les aspect essentiels.
Commentons ce programme :
- ligne 1 à 4, on défini un type de variable tableau à l’image d’une feuille Excel avec deux
propriétés : contenu et coordonnee. En effet, VBA donne la possibilité au programmeur de
définir un type de variable spécifique avec le mot clé :
Type nom_type_variable
Liste Elemets et leur type
End Type
- ligne 6, on déclare une variable tableau de type TableauType ;
- lignes 21 et 25, on force la fin du programme avec l’instruction Exit sub ;
- ligne 29, on affecte à la variable « colonne » le numéro de la colonne de la cellule active
adresse (cellule saisie par l’utilisateur et activée par le programme ligne 12 et 27) ;
- lignes 30 et 31 , les méthode Selection.End(xlUp).Row et Selection.End(xlDown).Row
renvoie respectivement les numéros des lignes de la première et dernière cellules non vides
de la plage contenant la cellule active. Donc si votre liste contient une cellule vide, une
partie de la liste ne sera pas traitée avec cette macro.
- ligne 32, l’instruction ReDim vous permet de définir la longueur d’une variable tableau
déclarée avant comme un tableau de dimension indéfinie
- lignes 34 et 35, on utilise ici la syntaxe Tableau(numero_cellule).propriété qui fait référence
soit au contenu ou à l’adresse. La désignation de l’adressage de la cellule est fait selon le
mode R1C1.
Astuce pratique : Lorsque vous avez crée vos macros, vous pouvez aussi créer des barres
d’outils personnalisés pour accéder directement à vos macros (Démonstration pendant le
cours).
Jusque la, nous n’avons pas abordé l’utilisation des userforms (feuilles) et des contrôles. Le
projet qui suit nous permettra de nous familiariser avec l’usage des userforms.
Projet 1 : création d’un formulaire de saisie des données
Il faut noter que les feuilles permettent de ramener des tâches complexes à la simple
information des champs d’une boîte de dialogue pour l’utilisateur final. Nous allons dans ce
projet créer la feuille ci-dessous et lui associer le code nécessaire.
Objectif : le but du projet est de concevoir une macro qui permet à l’utilisateur, après avoir
sélectionné une plage de cellules, de colorer les cellules qui contiennent une valeur supérieure
ou inférieure à une valeur spécifiée par lui. Pour cela :
- créer un nouveau classeur nommé « TestColor ».
- ouvrir l’éditeur de VBA et inserer un userform par le menu Insertion, UserForm
- modifier la propriété Caption de la feuille en « TestColor (Ensea Junior Service
2006) »
- inserer les différents objets tels que schématisés sur la feuille en utilisant la boite à
outils.
Un objet label
Caption : Valeur à tester Un objet TextBox
NombreCellule = Range(AdresseSelection).Count
If NombreCellule = 1 Then
UserForm1.Hide
MsgBox "Vous n'avez pas sélectionnez une plage de cellules. Selectionner une plage de cellules avant de lancer
la macro", _
Title:="TestColor Information"
TextBox1.Text = ""
Exit Sub
End If
ValeurTest = TextBox1.Value
If IsEmpty(choix) Then
MsgBox "Vous n'avez pas sélectionné d'opération", Title:="TestColor Information"
Exit Sub
End If
Select Case choix
Case 1
For Each Cellule In Range(AdresseSelection)
If Cellule.Value > ValeurTest Then
Cellule.Interior.ColorIndex = 6
End If
Next
Case 2
For Each Cellule In Range(AdresseSelection)
If Cellule.Value >= ValeurTest Then
Cellule.Interior.ColorIndex = 3
End If
Next
Case 3
For Each Cellule In Range(AdresseSelection)
If Cellule.Value < ValeurTest Then
Cellule.Interior.ColorIndex = 4
End If
Next
Case 4
For Each Cellule In Range(AdresseSelection)
If Cellule.Value <= ValeurTest Then
Cellule.Interior.ColorIndex = 37
End If
Next
End Select
UserForm1.Hide
TextBox1.Text = ""
End Sub
Remarque: Pour faire tourner l’application, il suffit de lancer la macro « TestColor » après
avoir sélectionné la plage à traiter. Cette macro peut aussi être associée à un menu de la barre
d’outils
Pour détecter une éventuelle erreur, placez une instruction On error devant l’instruction
susceptible d’en générer une :
On error Resume Next ignore l’instruction ayant généré une erreur et passe à l’instruction
suivante ;
On error Goto étiquette permet d’appeler un gestionnaire d’erreur repéré par l’étiquette.
Sub Ma procdure ()
…
On Error GoTo GestionnaireErreur
Instruction susceptible de générer une erreur
….
Exit sub
GestionnaireErreur :
Instructions de gestion des erreurs
Resume
End Sub
Exemple pratique : Ecrire une macro qui demande à l’utilisateur de saisir sa date de
naissance associée à un bouton « Date de naissance » qu’on placera sur une feuille Excel. Les
dates saisies doivent être placées automatiquement sur la feuille. La Date doit être saisie au
format date, sinon une erreur sera générée et mettra fin au programme
GestionErreur:
MsgBox " Action Annuler, date non remplie sur la feuille"
Exit Sub
Resume
End Sub
CONCLUSION:
Au terme de ce cours, il faut dire que beaucoup reste à apprendre de VBA Excel. Cela ne peut
se faire que par une pratique régulière motivée par la passion. L’aide en ligne de VBA sera
un compagnon indispensable qu’il faut souvent interroger et explorer.
BIBLIOGRAPHIE :