Vous êtes sur la page 1sur 16

PROGRAMMATION EN VISUAL BASIC FOR APPLICATION (VBA)

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

I – COMPRENDRE LES NOTIONS DE LA PROGRAMMATION VBA


II – CONNAISSANCE ET MANIPULATION DES OBJETS D’EXCEL
III - CONNAISSANCE DE QUELQUES METHODES UTILES :
IV - APPRENTISSAGE PAR L’EXEMPLE
V - LA GESTION DES ERREURS

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.

I – COMPRENDRE LES NOTIONS DE LA PROGRAMMATION VBA

I.1 - La notion d’objet


- Un objet représente un élément d'une application Excel. Une feuille de calcul, une
cellule, un graphique, un bouton, une case à cocher sont des objets.
- Dans Visual Basic, les données (valeurs ou attributs) d'un objet sont appelées
propriétés, tandis que les différentes procédures qui peuvent agir sur l'objet portent le
nom de méthodes.
- Un événement est une action qui est reconnue par un objet, notamment le clic de la
souris ou l'utilisation d'une touche. Vous pouvez ainsi écrire du code qui réagit à cet
événement.
- Dans un code Visual Basic, vous devez identifier un objet (donner son chemin
d’accès) avant de pouvoir appliquer l'une des méthodes de l'objet ou modifier la
valeur de l'une de ses propriétés.

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 :

- Renommer la feuille 1 en « projet »


- affecter « Ensea junior services » à la cellule D1 et faire apparaître ce nom en gras
italique et police 16
- colorer la 2ème et 3ème ligne en rouge, la 1ère et 2ème colonne en vert
- supprimer la feuille 2 et 3

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.

Deux possibilités existent pour créer cette macro :

- 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

Commentons ce petit programme :

¾ Les instructions 1 et 13 marquent le début et la fin du programme ;


¾ L’instruction 2 modifie la propriété "name" de l'objet "feuil1" ;
¾ L’instruction 3 affecte à la cellule "D1" l'intitulé situé à gauche
¾ Les instructions de 5 à 7 modifie les paramètres de la propriété Font de l'objet range
"D1". La syntaxe With …. End With permet de spécifier en une fois les instruction
se referant à un objet.
¾ L’intruction 9 change la propriété couleur des lignes 2,3 et des colonnes B et C
¾ Les instructions 11 et 12 suppriment les deux feuilles avec la méthode "Delete"

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.

I.2 - les instructions de décision et intératives


Les instructions Visual Basic sont complètes. Elles contiennent des mots clés, des opérateurs,
des variables, des constantes et des expressions. Chaque instruction appartient à l'une des trois
catégories suivantes : déclaration, affectation, exécution.

- 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

Ici on déclare une variable « privée » de type « String » et de nom « myVar ».

- Les instructions exécutables


Ces instructions exécutent des lignes de codes (structures alternatives, structures répétitives,
débranchements, appels de modules …).
Les structures alternatives :
Ces instruction valuent si une condition à la valeur True ou False, puis spécifie une ou
plusieurs instructions à excécuter, selon le resultats.
If, Then,Else, End If Les « If multilignes »
Dim answer As String If answer = Empty Then
If answer = Empty Then MsgBox "Vous n’avez pas entré de nom"
MsgBox "Vous n’avez pas entré de nom" Else If answer = "Toto"
Else MsgBox "Votre nom est Toto"
MsgBox "Votre nom est " & answer Else
End If MsgBox "Votre nom est Toto" & answer
End If
Le « Case »
Select Case answer
Case "Toto"
Nom = "Toto"
Case "Titi"
Nom = "Titi"
Case Else
MsgBox "Nom incohérent"
End Select

Les structures répétitives :


Visual Basic utilise les mots clés For, To et Next pour les boucles « Pour », Do While et
Loop pour la boucle « Tant que » (il existe également While et Wend), Do et Loop Until
pour la boucle « Jusqu’à ce que ». Quelques exemples d’utilisation de ces boucles.
Dim T(10) As Integer I = 0 I = 0
Private I As Integer Do While I < 10 Do
For I=0 To 9 T[I] = I T[I] = I
T[I] = I I = I + 1 I = I + 1
Next Loop Loop Until I = 10

NB : il est impératif d’initialiser le compteur I dans les instructions de boucles.

II – CONNAISSANCE ET MANIPULATION DES OBJETS D’EXCEL

Les objets couramment manipulés dans Excel sont :

¾ Plage et cellule (Range) : L’objet « Range » constitue la clé de la programmation


VBA. Une plage de cellules (objet Range) représente n'importe quel groupe de cellules d'une
feuille. La plage peut être constituée d'une cellule, d'une plage continue ou de plusieurs
plages. L'objet Range, lorsqu'il représente des cellules, appartient toujours à un objet
WorkSheet. Excel fonctionne avec un système d'adresse. Il existe en fait deux styles de
référence : R1C1 Les colonnes et les lignes sont représentées par des nombres A1 (Les
colonnes sont des lettres et les lignes des nombres). Le changement de style au cours d'un
programme ne pose pas de problème vis-à-vis des formules déjà existantes dans une feuille.
Sachez toutefois que le code doit être rédigé dans le même style de référence que
l'application, sous peine de voir parfois se déclencher des erreurs.

En mode A1 on utilise un range comme suit :


MaFeuille.Range("A1") : une cellule où MaFeuille est un objet feuille (Sheets)
MaFeuille.Range("A1:E10") ou Range("A1", "E10") : une plage continue

En mode R1C1 : MaFeuille.Cells(1,1) : une cellule


MaFeuille.Range(Cells(1,1),Cells(10,5)) : une plage continue
Quel que soit le style, les plages discontinues s'obtiennent à l'aide de la méthode Union.

¾ Sheets (index ou nom), worksheet, activesheet : pour la manipulation des feuilles de


calculs. Exemple : worksheets("Feuil1").Active, "Active la feuille nommée
« Feuil1 »".
¾ Workbooks(index ou nom), ThisWorkbooks, ActiveWorkbook : pour la
manipulation des fichiers Excel. Exemple : Workbooks(1).Active, "Active le premier
classeur ouvert".

¾ 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 ».

¾ Les boîtes de dialogues : Les boîtes de dialogue des applications Windows


permettent :
™ d'inviter l'utilisateur à entrer les données que l'application requiert pour poursuivre son
exécution ;
™ d'afficher des informations destinées à l'utilisateur.
Les boîtes de dialogue prédéfinies sont toujours modales (une boîte de dialogue modale doit
être fermée « masquée ou déchargée » pour que vous puissiez poursuivre votre travail). Les
plus utilisées sont :

™ 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)

Tableau 1 : commentaire sur les paramètres des fonctions MsgBox et InputBox


Paramètre nature Type Description
Prompt obligatoire string Donne le message de la boîte de dialogue
Buttons facultatif numérique Détermine le nombre les boutons à afficher dans la boite de dialogue.
Par exemple : la valeur 1 affiche les boutons OK et Annuler
Title facultatif string Donne le titre de la boîte de dialogue affiché dans la barre de titre
Default facultatif Non fixé Correspond au texte apparaissant dans la zone de texte de la boîte
Variable facultatif Integer Récupère la valeur du bouton cliqué par l’utilisateur dans le cas d’un
MsgBox et la donnée saisie dans le cas d’un InputBox

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 !

Le principe d'appel est :


Application.Dialogs(NomDeLaBoiteDeDialogue).Show "Paramètre éventuel", "Autre
paramètre", ...

Exemple simple : Le Zoom


Exemple : Admettons qu'on veuille afficher la boîte de dialogue Zoom (Affichage/Zoom) :
Code :

Sub MacroQuelconque
Application.Dialogs(xlDialogZoom).Show
End Sub

Et si maintenant on voulait que cette boîte affiche par défaut 75 %, on


l'appellerait comme ceci :
Application.Dialogs(xlDialogZoom).Show "75"

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.

III - CONNAISSANCE DE QUELQUES METHODES UTILES :

1 - L'OBJET WORKBOOK (CLASSEUR)


Close : Ferme le classeur. La syntaxe est :
MonClasseur.Close(SaveChanges, FileName, RouteWorkbook). Si SaveChanges est omis,
une boite de demande d'enregistrement apparaît. Donner une valeur FileName différentes de
celle du classeur revient à faire un SaveAs.

PrintOut :Lance l'impression du classeur. Sa syntaxe est :


MonClasseur.PrintOut(from, To, Copies, Preview, ActivePrinter, PrintToFile, Collate).A
noter que From et To sont des pages d'imprimante et non les feuilles du classeur, et que
ActivePrinter permet de choisir l'imprimante

Protect / UnProtect : Active ou désactive la protection du classeur. La syntaxe est :


MonClasseur.Protect(Password, Structure, Windows) pour activer la protection
MonClasseur.UnProtect(Password) pour la retirer.
A ce propos, la protection du classeur et des feuilles est une chose indépendante. La
protection du classeur sert à bloquer la structure de celui-ci, celle de la feuille à protéger les
objets qu'elle contient. On peut parfaitement protéger une feuille sans protéger le classeur et
inversement.
Save / SaveAs : Sauvegarde le classeur. La syntaxe de SaveAs est :
MonClasseur.SaveAs(Filename, FileFormat, Password, WriteResPassword,
ReadOnlyRecommended, CreateBackup, AddToMru, TextCodePage, TextVisualLayout)
2- PLAGE ET CELLULE (RANGE)
Nous allons maintenant regarder quelques-unes des méthodes les plus utiles de l'objet Range.

AutoFill : Syntaxe MaPlage.AutoFill(Destination, Type). Destination est un objet Range qui


contient forcément MaPlage. Type peut être xlFillDefault, xlFillSeries, xlFillCopy,
xlFillFormats, xlFillValues, etc…
La méthode exécute une recopie incrémentée dans les cellules de la plage destination.

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

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

Clear / ClearContents / ClearFormats : Efface tout ou la partie spécifiée de la plage.

FillDown, FillLeft, FillRight,FillUp : Recopie la plage avec le contenu de la cellule source.


La cellule source doit être à l'extrémité inverse du sens de la recopie. Ainsi
Range(Cells(1,1),Cells(10,1)).FillDown recopie la cellule A1 dans la plage
Range(Cells(1,1),Cells(10,1)).FillUp recopie la cellule A10 dans la plage

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.

La méthode Find se programme comme dans l'exemple suivant :

Dim MaFeuille As Worksheet, Reponse As Range, PremAdresse As String


Dim MonCritere As String
Set MaFeuille = ActiveSheet
MonCritere = "27"
Set Reponse = MaFeuille.Cells.Find(MonCritere, MaFeuille.Cells(1, 1),
xlValue, xlWhole)
If Not Reponse Is Nothing Then
PremAdresse = Reponse.Address
Do
Set Reponse = Selection.FindNext(After:=Reponse)
Loop While Not Reponse Is Nothing And Reponse.Address <>
PremAdresse
End If

IV - APPRENTISSAGE PAR L’EXEMPLE


La création d'une application dans VBA implique trois étapes principales :
¾ Analyse du problème
¾ Création d’interface ;
¾ Définition des propriétés ;
¾ Écrire des différents codes.

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

'affichage du nombre de plages sélectionnées, commande :(Selection.Areas.Count)


MsgBox "Vous avez sélectionné " & Selection.Areas.Count & " zones", vbOkOnly, " Information"

'Demande à l’utilisateur s’il veut colorer les plages


reponse = MsgBox("Voulez vous colorer ces plages?", vbYesNo, "COLORATION")

' on utilise une structure décisionnelle IF..Then.. pour colorer les plages sélectionnées en fonction de la reponse
If reponse = vbYes Then

'coloration des plages sélectionnées


Range(adresseSelection).Interior.ColorIndex = 6

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.

Approfondissement : améliorer ce code en permettant à l’utilisateur de sélectionner une


couleur de son choix. Astuce : utiliser la boite de dialogue prédéfinie des couleurs de
windows.

¾ Suivant la même procédure que précédemment, saisir le code suivant au bouton


«compte le nombre de cellules vide d’une plage sélectionnée ».
Dim zone As Range
Dim adresse As Range
Dim i As Double

'instruction de gestion d'erreur


On Error Resume Next

'Invite l'utilisateur à sélectionner une plage de cellules


'on utilise ici plutot la méthode inputbox
Set adresse = Application.InputBox(prompt:="Sélectionnez des plages de cellules.", _
Title:="SELECTION CELLULES", Type:=8)
' met fin à au prgramme si l'utilisateur clique sur Annuler
If Err.Number = 424 Then
Exit Sub
End If
'initialisation du compteur
i=0
' l'instruction For Each permet de compter chaque cellule de l'objet range "adresse"
For Each zone In adresse

' on active la cellule contenu dans l’objet range « zone »


zone.Activate

' test si la cellule active est vide avec la fonction IsEmpty


If IsEmpty(ActiveCell.Value) Then
i=i+1
End If
Next
'affiche le nombre de cellules vides
MsgBox "Il y a " & i & " cellule(s) vide(s) dans la plage sélectionnée", _
vbOKOnly, "INFORMATION"
End Sub
Remarques :
9 il faut noter que la méthode Application.inputbox renvoie ici un objet. Dans ce cas,on
utilise l’instruction Set Nom_Variable = Expression ;
9 A la différence de la fonction inputbox, l’interêt de la méthode inputbox est qu’elle
permet de spécifier le type de donner qui sera renvoyer. Dans notre cas c’est un objet
range ;
9 La gestion des erreurs est aussi un volet très important de la programmation VBA. En
effet, la non prise en compte des actions telle que « le clique sur le bouton annuler »
d’une boite de dialogue peut générer des erreurs et nuire à l’exécution du programme.
L’instruction On Error Resume Next placée devant une instruction ayant généré une
erreur permet d’ignorer cette dernière et de passer à l’instruction suivante.
9 Lorsqu’une erreur se produit, la propriété Number de l’objet erreur Err se voit affecter
une valeur identifiant le type d’erreur survenu. Dans notre cas on a l’erreur 424.
Application 3 : Trouver des doublons dans une liste Excel (fichier VBA Excel).
La situation : Vous avez une grande liste de clients, mais il y a des clients en double, avec le
même nom. Votre liste est tellement grande que, même triée, il est très pénible de retrouver
des doublons. Ecrivons un petit module VBA pour pallier à cet inconvénient
Soit le tableau Excel suivant :
A
1 Paul Comme vous le constatez : Les noms ne sont pas triés
2 Vernat
Il y a Paul en 4 exemplaires, et Henri en 2 exemplaires
3 Henri

4 Paul • La liste ne doit pas avoir de cellules vides. Nous le verrons


5 Louis
pourquoi

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

11. On Error Resume Next

12. Set adresse = Application.InputBox (prompt:="Sélectionnez une cellule non vide de la colonne à traiter.", _
13. Title:="SELECTION CELLULES", Type:=8)

14. NombreCell = adresse.Count

15. If NombreCell <> 1 Then


16. MsgBox "Selection de plus d'une cellule", vbCritical, "Attention"
17. Exit Sub
18. End If

19. ' met fin à au prgramme si l'utilisateur clique sur Annuler


20. If Err.Number = 424 Then
21. Exit Sub
22. End If

23. If adresse.Value = "" Then


24. MsgBox "selection de cellule vide", vbCritical, "Attention"
25. Exit Sub
26. End If

27. adresse.Activate

28. 'initialisation
29. Colonne = ActiveCell.Column
30. Haut = Selection.End(xlUp).Row
31. Bas = Selection.End(xlDown).Row

32. ReDim Tableau(Bas)


33. For Compteur = Haut To Bas
34. Tableau(Compteur).Contenu = Cells(Compteur, Colonne)
35. Tableau(Compteur).Coordonnee = Cells(Compteur, Colonne).Row
36. Next
37. For Compteur = Haut To Bas

38. If Cells(Tableau(Compteur).Coordonnee, Colonne).Interior.ColorIndex <> 6 Then

39. For C2 = (Compteur + 1) To Bas

40. If Tableau(Compteur).Contenu = Tableau(C2).Contenu Then


41. Cells(Tableau(C2).Coordonnee, Colonne).Interior.ColorIndex = 6
42. End If

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

Un objet Frame Un objet label


Caption : Choix de l'opération Caption : Information

4 objets optionButton : Nommer Un objet label


ces objets dans l’ordre Vider le Caption
- OptionStrictementSuperieur
- OptionSuperieur
- OptionStrictementInferieur 2 objets CommandButton
- OptionInferieur Nommer OK et Annuler
Modifier les captions comme sur Caption de l’objet OK : Valider
la feuille Caption de l’objet Annuler :
Annuler

Insertion des différents codes :


Après avoir conçu la feuille, il faut maintenons associer aux différents contrôles (objets) le
code nécessaire. Afficher le code de la feuille UserForm et saisir : Public choix As Integer

¾ Dans chaque objet OptionButton double-cliquer et saisir le code suivant


Dans le bouton option inférieur à
Private Sub OptionInferieur_Click()
choix = 4
Label2.Caption = "les cellules de la plage sélectionnée dont la valeur est inférieure ou égale à la valeur spécifiée
seront colorées en bleu moyen"
End Sub
****************************************
Dans le bouton option strictement inférieur à
Private Sub OptionStrictementInferieur_Click()
choix = 3
Label2.Caption = "les cellules de la plage sélectionnée dont la valeur est strictement inférieure à la valeur
spécifiée seront colorées en vert brillant"
End Sub
****************************************
Dans le bouton option strictement supérieur à
Private Sub OptionStrictementSuperieur_Click()
choix = 1
Label2.Caption = "les cellules de la plage sélectionnée dont la valeur est strictement supérieure à la valeur
spécifiée seront colorées en jaune"
End Sub
***************************************
Dans le bouton option supérieur à
Private Sub OptionSuperieur_Click()
choix = 2
Label2.Caption = "les cellules de la plage sélectionnée dont la valeur est supérieure ou égale à la valeur spécifiée
seront colorées en rouge"
End Sub
********************************
¾ Double-cliquer sur le bouton valider et saisir le code suivant :
Dim AdresseSelection As String
Dim Cellule As Range
Dim ValeurTest As Double
Dim NombreCellule As Integer

'stockage de l'adresse des plages sélectionnées


AdresseSelection = ActiveWindow.RangeSelection.Address

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

On Error Resume Next

ValeurTest = TextBox1.Value

' met fin à au prgramme si l'utilisateur clique sur Annuler


If Err.Number = 13 Then
MsgBox "vous n'avez pas saisi le nombre à tester", Title:="TestColor Information"
Exit Sub
End If

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

¾ Double-cliquer sur le bouton Annuler et saisir le code suivant :


TextBox1.Text = ""
UserForm1.Hide

¾ Inserer un module et saisir le code suivant :


Sub TestColor()
UserForm1.Show
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

V - LA GESTION DES ERREURS


Très souvent l’exécution d’un programme VBA génère des erreurs d’exécution et affiche une
boite de dialogue qui indique le numéro de l’erreur. Ainsi pour améliorer le programme, il est
intéressant de mettre en place un gestionnaire d’erreur. En effet, un gestionnaire d’erreur est
un ensemble d’instructions qui est censé permettre la poursuite de l’exécution d’une
procédure. En général, il est appelé par un détecteur d’erreur, dont la fonction est de repérer
l’erreur lorsqu’elle survient.

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.

Une technique simple consiste à placer le gestionnaire d’erreur à la fin de la procédure et à


glisser une instruction Exit avant l’étiquette le délimitant suivant le modèle :

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

Placer un bouton sur une feuille et lui associer le code suivant :


Private Sub CommandButton1_Click()
Dim DateNaissance As Date

On Error GoTo GestionErreur


DateNaissance = InputBox("Votre date de naissance :", "Saisie Date de naissance", "jj/mm/aaaa")

‘ rempli les dates saisies sur la feuille


i=1
Do Until IsEmpty(Cells(i, 1))
i=i+1
Loop
Cells(i, 1).Value = DateNaissance
Exit Sub

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 :

¾ M. Bildault (2002) « Excel et VBA », le tout en poche, campus presse, Paris


¾ J-M RABILLOUD « Programmer efficacement Microsoft Excel » ,Site :
www.developpez.com.
¾ Site : http://ericrenaud.free.fr/
¾ Aide en ligne de Microsoft VBA

Vous aimerez peut-être aussi