You are on page 1of 226

Formation Excel - VBA

INTRODUCTION.................................................................................................. 8
LENVIRONNEMENT DE DEVELOPPEMENT.................................................... 8
Prsentation de l'diteur............................................................................................................................... 9
Notions de module....................................................................................................................................... 10
L'enregistreur de macro............................................................................................................................. 12
VISUAL BASIC ...................................................................................................13
Prsentation................................................................................................................................................. 13
Les variables ................................................................................................................................................ 13
La porte................................................................................................................................................... 14
Le type ...................................................................................................................................................... 16
Conversion de type............................................................................................................................... 17
Les constantes........................................................................................................................................... 17
Intrts ...................................................................................................................................................... 18
Le type Variant ......................................................................................................................................... 19
Type utilisateur ......................................................................................................................................... 20
numration.............................................................................................................................................. 20
Masque binaire.......................................................................................................................................... 21
Oprateurs ................................................................................................................................................... 22
Oprateurs arithmtiques .......................................................................................................................... 22
Oprateurs de comparaison....................................................................................................................... 22
&, Oprateur de concatnation ................................................................................................................. 24
Oprateurs logiques .................................................................................................................................. 24
Oprateur And...................................................................................................................................... 24
Oprateur Or......................................................................................................................................... 24
Oprateur Eqv....................................................................................................................................... 24
Oprateur XOr...................................................................................................................................... 25
Oprateur Imp....................................................................................................................................... 25
Oprateur Not ....................................................................................................................................... 25
Combinaisons d'oprateur......................................................................................................................... 25
Oprateur d'affectation, = ......................................................................................................................... 26
Logique binaire......................................................................................................................................... 26
Procdures & fonctions............................................................................................................................... 29
Arguments ................................................................................................................................................ 29
ByRef & ByVal .................................................................................................................................... 29
Optional................................................................................................................................................ 30
ParamArray .......................................................................................................................................... 31
Arguments nomms ou passage par position........................................................................................ 32
Instructions et rgles d'appel..................................................................................................................... 32
Valeur retourne ....................................................................................................................................... 33
Les objets ..................................................................................................................................................... 35
Les tableaux................................................................................................................................................. 37
Instructions et fonctions spcifiques......................................................................................................... 38
Les blocs....................................................................................................................................................... 39
1
Structure dcisionnelle................................................................................................................................ 40
Les structures compactes .......................................................................................................................... 40
Immediate If IIf................................................................................................................................ 40
Choose.................................................................................................................................................. 40
Switch................................................................................................................................................... 41
If Then Else...................................................................................................................................... 42
ElseIfThen ........................................................................................................................................ 43
Select Case................................................................................................................................................ 44
Les boucles................................................................................................................................................... 46
ForNext ................................................................................................................................................. 46
DoLoop................................................................................................................................................. 48
numrations & collections........................................................................................................................ 50
FONCTIONS VBA...............................................................................................51
Fonctions de conversions ............................................................................................................................ 51
Conversion de type ................................................................................................................................... 51
Conversions spcifiques ........................................................................................................................... 52
CVErr ................................................................................................................................................... 52
Val ........................................................................................................................................................ 53
Format, Format$................................................................................................................................... 53
Conversion de valeur ................................................................................................................................ 55
Hex, Hex$............................................................................................................................................. 55
Oct, Oct$ .............................................................................................................................................. 55
Int, Fix.................................................................................................................................................. 55
Fonctions de Date & Heure ........................................................................................................................ 55
Rcupration du temps systme................................................................................................................ 56
Date, Date$........................................................................................................................................... 56
Time, Time$......................................................................................................................................... 56
Timer .................................................................................................................................................... 56
Now...................................................................................................................................................... 56
Fonctions de conversions.......................................................................................................................... 57
DateValue, TimeValue......................................................................................................................... 57
DateSerial ............................................................................................................................................. 57
TimeSerial ............................................................................................................................................ 58
Fonctions d'extraction ................................................................................................................................ 58
Fonctions spcifiques ........................................................................................................................... 58
WeekDay.............................................................................................................................................. 58
DatePart................................................................................................................................................ 59
Fonctions de calculs.................................................................................................................................. 61
DateAdd ............................................................................................................................................... 61
DateDiff................................................................................................................................................ 62
Exemples classiques d'utilisation.............................................................................................................. 63
Fonctions de fichiers ................................................................................................................................... 65
Systme de fichier..................................................................................................................................... 65
ChDir.................................................................................................................................................... 65
ChDrive ................................................................................................................................................ 65
CurDir................................................................................................................................................... 65
Dir ........................................................................................................................................................ 65
FileAttr ................................................................................................................................................. 66
FileCopy............................................................................................................................................... 66
FileDateTime........................................................................................................................................ 67
FileLen ................................................................................................................................................. 67
GetAttr & SetAttr ................................................................................................................................. 67
2
Kill........................................................................................................................................................ 68
MkDir & RmDir................................................................................................................................... 68
Manipulation de fichier............................................................................................................................. 69
L'instruction Open................................................................................................................................ 69
FreeFile................................................................................................................................................. 70
Close..................................................................................................................................................... 70
EOF ...................................................................................................................................................... 70
LOF ...................................................................................................................................................... 70
Loc........................................................................................................................................................ 70
Seek...................................................................................................................................................... 70
Instructions d'criture ........................................................................................................................... 70
Instructions de lecture .......................................................................................................................... 71
Exemples .............................................................................................................................................. 71
Fonctions d'informations............................................................................................................................ 79
Fonctions de couleur................................................................................................................................. 79
QBColor ............................................................................................................................................... 79
RGB...................................................................................................................................................... 80
Fonctions d'interactions.............................................................................................................................. 80
Environ................................................................................................................................................. 80
InputBox............................................................................................................................................... 80
MsgBox................................................................................................................................................ 80
Fonctions mathmatiques........................................................................................................................... 82
Fonctions standards .................................................................................................................................. 82
Fonctions spcifiques................................................................................................................................ 82
Round ................................................................................................................................................... 82
Tirage alatoire, Randomize et Rnd ..................................................................................................... 82
Fonctions de chanes ................................................................................................................................... 83
Comparaison de chanes ........................................................................................................................... 83
Traitement des caractres.......................................................................................................................... 84
Asc & Chr............................................................................................................................................. 84
Recherche & Extraction............................................................................................................................ 85
StrComp ............................................................................................................................................... 85
Instr ...................................................................................................................................................... 86
Left, Mid & Right................................................................................................................................. 86
Len........................................................................................................................................................ 87
InStrRev ............................................................................................................................................... 87
Split ...................................................................................................................................................... 88
Filter ..................................................................................................................................................... 88
Modification ............................................................................................................................................. 89
LTrim, RTrim & Trim.......................................................................................................................... 89
Replace................................................................................................................................................. 89
LCase & Ucase..................................................................................................................................... 89
StrConv................................................................................................................................................. 90
StrReverse ............................................................................................................................................ 90
Construction.............................................................................................................................................. 90
Join ....................................................................................................................................................... 90
Space .................................................................................................................................................... 90
String.................................................................................................................................................... 91
GESTION DES ERREURS..................................................................................92
Traitement centralis.................................................................................................................................. 93
Traitement immdiat .................................................................................................................................. 97
3
Erreurs successives...................................................................................................................................... 99
Programmation sans chec........................................................................................................................ 99
Validation et activation........................................................................................................................... 100
MODELE OBJET ..............................................................................................102
Prsentation............................................................................................................................................... 103
Fondamentaux........................................................................................................................................... 106
Glossaire ................................................................................................................................................. 106
Les aides dans l'diteur ........................................................................................................................... 106
Explorateur d'objet ............................................................................................................................. 106
IntelliSense......................................................................................................................................... 108
Manipulation d'objets.............................................................................................................................. 109
Dure de vie & Porte ........................................................................................................................ 109
Qualification & Manipulation des membres....................................................................................... 111
Grer les rfrences ............................................................................................................................ 113
Architecture Excel .................................................................................................................................. 114
Les piges ............................................................................................................................................... 116
Rfrence implicite............................................................................................................................. 116
La proprit Sheets............................................................................................................................. 116
Membre par dfaut ............................................................................................................................. 116
Application................................................................................................................................................. 117
Proprits renvoyant des collections....................................................................................................... 117
CommandBars.................................................................................................................................... 117
Dialogs ............................................................................................................................................... 117
Windows............................................................................................................................................. 117
Workbooks ......................................................................................................................................... 118
Proprits ................................................................................................................................................ 118
Calculation & CalculateBeforeSave (Boolean) .................................................................................. 118
Caller .................................................................................................................................................. 118
CutCopyMode (Boolean) ................................................................................................................... 118
DecimalSeparator (String).................................................................................................................. 119
DisplayAlerts (Boolean)..................................................................................................................... 119
EnableCancelKey (XlEnableCancelKey)........................................................................................... 119
EnableEvents (Boolean) ..................................................................................................................... 119
Interactive (Boolen) .......................................................................................................................... 120
International ....................................................................................................................................... 120
ScreenUpdating (Boolean) ................................................................................................................. 120
SheetsInNewWorkbook (Long).......................................................................................................... 120
StatusBar (String) ............................................................................................................................... 121
WorksheetFunction (WorksheetFunction).......................................................................................... 121
Mthodes ................................................................................................................................................ 124
Calculate............................................................................................................................................. 124
ConvertFormula.................................................................................................................................. 124
Evaluate.............................................................................................................................................. 125
GetOpenFilename & GetSaveAsFilename......................................................................................... 125
InputBox............................................................................................................................................. 126
Intersect & Union............................................................................................................................... 127
Quit..................................................................................................................................................... 127
Workbooks & Workbook......................................................................................................................... 128
Manipuler la collection Workbooks........................................................................................................ 128
Proprit Item (Workbook) ................................................................................................................ 128
Proprit Count (Long) ...................................................................................................................... 128
Mthode Add...................................................................................................................................... 128
Mthode Close.................................................................................................................................... 128
Mthode Open.................................................................................................................................... 129
4
Mthode OpenText............................................................................................................................. 129
Proprits de l'objet Workbook renvoyant une collection ...................................................................... 131
BuiltinDocumentProperties ................................................................................................................ 131
Charts ................................................................................................................................................. 131
Names................................................................................................................................................. 131
Sheets ................................................................................................................................................. 133
Worksheets ......................................................................................................................................... 133
Quelques proprits & mthodes de l'objet Workbook........................................................................... 133
Proprits FullName, Name & Path (String)...................................................................................... 133
Proprit ReadOnly (Boolean) ........................................................................................................... 133
Proprit Saved (Boolean).................................................................................................................. 133
Mthode Close.................................................................................................................................... 134
Mthode Protect ................................................................................................................................. 134
Mthodes Save, SaveAs & SaveCopyAs ........................................................................................... 134
Mthode Unprotect............................................................................................................................. 135
Worksheets & Worksheet......................................................................................................................... 135
Mthodes de la collection Worksheets.................................................................................................... 135
Add..................................................................................................................................................... 135
Copy ................................................................................................................................................... 136
Delete ................................................................................................................................................. 136
FillAcrossSheets................................................................................................................................. 136
Move .................................................................................................................................................. 137
PrintOut .............................................................................................................................................. 137
Proprits de l'objet Worksheet renvoyant une collection ...................................................................... 137
Cells.................................................................................................................................................... 137
Columns & Rows ............................................................................................................................... 137
Comments........................................................................................................................................... 137
Hyperlinks .......................................................................................................................................... 137
Names................................................................................................................................................. 137
Shapes................................................................................................................................................. 138
Autres proprits de l'objet Worksheet ................................................................................................... 138
FilterMode (Boolean) ......................................................................................................................... 138
Next & Previous (Worksheet) ............................................................................................................ 138
PageSetup (PageSetup)....................................................................................................................... 138
Range (Range).................................................................................................................................... 141
UsedRange (Range)............................................................................................................................ 141
Visible (XlSheetVisibility)................................................................................................................. 141
Mthodes de l'objet Worksheet............................................................................................................... 141
Calculate............................................................................................................................................. 141
ChartObjects....................................................................................................................................... 141
Copy ................................................................................................................................................... 141
Delete ................................................................................................................................................. 141
Move .................................................................................................................................................. 141
OLEObjects........................................................................................................................................ 142
Paste & PasteSpecial .......................................................................................................................... 142
PrintOut .............................................................................................................................................. 142
Protect & Unprotect............................................................................................................................ 142
Range & Cells ............................................................................................................................................ 143
Concepts ................................................................................................................................................. 143
Valeurs & Formules................................................................................................................................ 145
Proprits de lobjet Range renvoyant un objet Range........................................................................... 150
Areas (Areas)...................................................................................................................................... 150
Cells (Range)...................................................................................................................................... 152
Columns & Rows ............................................................................................................................... 153
Dependents, DirectDependents, Precedents & DirectPrecedents ....................................................... 154
End ..................................................................................................................................................... 157
EntireRow & EntireColumn............................................................................................................... 158
MergeArea.......................................................................................................................................... 159
5
Offset.................................................................................................................................................. 159
Resize ................................................................................................................................................. 159
Autres Proprits de lobjet Range ......................................................................................................... 160
Address & AddressLocal (String) ...................................................................................................... 160
Borders (Borders) ............................................................................................................................... 160
Characters (Characters) ...................................................................................................................... 162
Column & Row (long)........................................................................................................................ 162
ColumnWidth & RowHeight (Double) .............................................................................................. 162
Font (Font).......................................................................................................................................... 162
HasFormula (Boolean) ....................................................................................................................... 162
Hidden (Boolean) ............................................................................................................................... 162
HorizontalAlignment & VerticalAlignment (Variant) ....................................................................... 163
Interior (Interior) ................................................................................................................................ 163
Left & Top (Single)............................................................................................................................ 163
Locked (Boolean) ............................................................................................................................... 163
MergeCells (Boolean) ........................................................................................................................ 163
Name (String) ..................................................................................................................................... 164
NumberFormat & NumberFormatLocal (String) ............................................................................... 164
Orientation (Integer)........................................................................................................................... 164
Style (Variant) .................................................................................................................................... 164
Mthodes de l'objet Range...................................................................................................................... 164
AddComment ..................................................................................................................................... 164
AutoFilter ........................................................................................................................................... 165
AutoFill, FillDown, FillUp, FillLeft & FillRight ............................................................................... 167
AutoFit ............................................................................................................................................... 169
BorderAround..................................................................................................................................... 169
Calculate............................................................................................................................................. 169
Clear, ClearComments, ClearContents & ClearFormats .................................................................... 169
ColumnDifferences & RowDifferences ............................................................................................. 169
Cut & Copy ........................................................................................................................................ 170
DataSeries........................................................................................................................................... 170
Delete ................................................................................................................................................. 170
Find, FindNext & FindPrevious ......................................................................................................... 170
Insert................................................................................................................................................... 171
Merge & UnMerge ............................................................................................................................. 171
PasteSpecial........................................................................................................................................ 172
Replace............................................................................................................................................... 172
Sort ..................................................................................................................................................... 172
SpecialCells........................................................................................................................................ 175
Discussion technique ................................................................................................................................. 177
Comprendre Excel .................................................................................................................................. 177
Recherche de plage ................................................................................................................................. 180
Recherche de valeur................................................................................................................................ 183
Autres recherches.................................................................................................................................... 187
Fonctions de feuille de calcul ................................................................................................................. 189
Manipulation des graphiques................................................................................................................... 190
Crer un Graphique................................................................................................................................. 190
Utiliser la slection............................................................................................................................. 192
Cration par Copier Coller ................................................................................................................. 193
Dfinition d'une source de donnes.................................................................................................... 195
Par ajout de sries............................................................................................................................... 195
Par dfinitions des sries .................................................................................................................... 195
Mise en forme......................................................................................................................................... 196
Modifier l'apparence des sries .......................................................................................................... 196
Ajouter un titre ou un fond au graphique............................................................................................ 199
Manipuler la lgende.......................................................................................................................... 199
Manipuler les axes.............................................................................................................................. 199
6
DEBOGAGE......................................................................................................201
Excution en mode pas pas.................................................................................................................... 201
Les points d'arrts..................................................................................................................................... 203
Variables locales........................................................................................................................................ 205
Les espions ................................................................................................................................................. 206
MANIPULER LES EVENEMENTS....................................................................207
Evnements de feuille de calcul................................................................................................................ 209
Activation de la feuille............................................................................................................................ 209
DEFINI PAR......................................................................................................209
Gestion du clic droit................................................................................................................................ 210
Changement de slection ........................................................................................................................ 210
Changement de valeur ............................................................................................................................ 211
MANIPULER LES CONTROLES......................................................................212
Deux familles de contrles ........................................................................................................................ 212
Les contrles formulaires........................................................................................................................ 212
Avantages ........................................................................................................................................... 212
Inconvnients ..................................................................................................................................... 212
Exemples ............................................................................................................................................ 212
Les contrles MsForms........................................................................................................................... 214
Contrles incorpors................................................................................................................................. 214
UserForm................................................................................................................................................... 218
Affichage du formulaire.......................................................................................................................... 221
Gestion des vnements.......................................................................................................................... 221
CONCLUSION ..................................................................................................226


7
Introduction
L'ensemble des logiciels de la suite Microsoft

Office utilise un langage de programmation


intgr appel Visual Basic for Applications (VBA). Il s'agit d'un langage Visual Basic simplifi
coupl au modle objet de l'application office qui le contient.
Nous allons dans ce cours voir ou revoir les bases de la programmation Visual basic et la
manipulation du modle objet de Microsoft

Excel.

Pour les nouveaux dveloppeurs
Si vous n'avais jamais approch de prs ou de loin un langage informatique, vous risquez de
trouver le dbut de ce cours extrmement complexe. Certains concepts voqus au dbut de ce cours
ne seront abords que plus loin dans celui-ci. Lisez le une fois rapidement sans entrer dans le dtail,
cela devrez vous permettre de vous imprgner de la terminologie.
Lenvironnement de dveloppement
L'environnement de dveloppement de VBA est intgr l'application Office. Il existe deux
faons d'y accder volontairement et une bonne quinzaine d'y accder sans le vouloir. Les deux faons
sont un peu diffrentes puisquon narrive pas dans le mme module selon les cas.
Gnralement on accde l'diteur en choisissant le menu "Outils Macro Visual Basic Editor"
ou en utilisant le raccourci clavier (Alt +F11) ; ou par l'onglet "dveloppeurs" dans Excel 2007.

8
Cependant on peut aussi y accder en utilisant le menu contextuel des onglets de feuilles du
classeur (clic droit sur l'onglet de la feuille Visualiser le code)

Dans ce cas nous arriverons dans le module de code de la feuille slectionne.
Prsentation de l'diteur
L'diteur ressemble :

9
Notions de module
Commenons par regarder l'explorateur de projet.

L'explorateur va afficher l'ensemble des projets en cours. Chaque classeur contient un projet. Un
projet contient des modules de codes, c'est--dire des units logiques pouvant contenir du code. Par
dfaut comme vous le voyez sur la figure ci-dessus, il y a un module de code par feuilles contenues
dans le classeur et un module pour le classeur intitul "ThisWorkbook".
Il est possible d'ajouter aux projets des modules supplmentaires qui peuvent tre de trois types :
Les modules standards
Les formulaires (UserForms)
Les modules de classe
On ajoute ces modules en utilisant le menu insertion ou par le menu contextuel du projet.

10
A l'exception des modules standards, tous les autres modules sont dit modules objets c'est--dire
accept bles aux vnements; c'est--dire qui grent du code
vne
Le code gnrique, le code mettant en cause plusieurs objets du classeur, les fonctions
appel.
e classe est dans un module de classe distinct
ule ThisWorkbook ne contient que le code vnementiel du classeur et les
le code vnementiel de la feuille et les
fonctions prives ventuelles ainsi que le code vnementiel des objets sensibles aux
vnements qu'elle contient.
sieurs modules standards pour regrouper les fonctionnalits connexes
on des options et la dfinition de la premire
te de module). C'est dans cette partie que sont
rations d'API (Application Programming Interface ou
ant la dclaration de variables objets sensi
mentiel). Cette notion sera vue succinctement en fin de cours.
Le code Visual Basic est toujours contenu dans un module. Il peut tre contenu dans plusieurs
modules du mme projet en suivant les rgles suivantes :
1.
accessibles dans tout le projet doivent tre dans un module standard.
2. Les UserForms ne contiennent que le code de leur propre fonctionnement et
ventuellement la fonction d'
3. Chaqu
4. Le mod
fonctions prives ventuelles
5. Chaque module de feuille ne contient que
6. On peut utiliser plu
La partie haute du module situe entre la dclarati
procdure est appele entte de module (parfois t
dclares les variables globales, les dcla
fonctions systmes), les types utilisateurs globaux, etc

11
L'enregistreur de macro
L'enregistreur de macro est un utilitaire d'criture de code contenu dans l'application office. On
l'utilise en slectionnant "Outils Macro Nouvelle Macro", ce qui dclenche l'affichage de la bote
suivante :

Le code gnr suit strictement les actions de l'utilisateur. Ainsi, le code suivant va crire des
vale
( )
urs de 1 10 dans la plage A1:A10 :
Sub Macr o1
'
' Macr o1 Macr o
' Macr o enr egi st r e l e 20/ 06/ 2002 par XXXX
'

'
Range( " A1" ) . Sel ect
Act i veCel l . For mul aR1C1 = " 1"
Range( " A2" ) . Sel ect
Act i veCel l . For mul aR1C1 = " 2"
Range( " A1: A2" ) . Sel ect
Sel ect i on. Aut oFi l l Dest i nat i on: =Range( " A1: A10" ) , Typ
Range( " A1: A10" ) . Sel ect
e: =xl Fi l l Def aul t

End Sub
Si le ct pratique de l'enregistreur est difficilement contestable, le code gnr est de trs
d'efficacit et de lisibilit. Par exemple l'criture correcte du code ci-dessus
sera
Sub
mauvaise qualit en terme
it :
Macr o1( )

Wi t h Cel l s( 1, 1)
. Val ue = 1
. Resi ze( 10) . Dat aSer i es Rowcol : =xl Col umns, Type: =xl Li near , St ep: =1,
St op: =10
End Wi t h

End Sub
Cependant l'enregistreur de macro est utile
mt
pour retrouver une syntaxe ou pour examiner les
hodes utilises lors d'un enchanement d'action.
12
Visual Basic
Prsentation
Visual Basic est un environnement de dveloppement intgr propritaire pour le langage BASIC
us Windows, dit par Microsoft. Il en existe plusieurs groupes qui sont
our toutes les versions VBA Interprts / vnementiels procduraux
sions 5 et 6 compils (ou natifs) / vnementiels procduraux
NET) manags / objets
un 'runtime' spcifique pour s'excuter,
est interprt sous la forme
e pseudo compilation pour
l'aide d'un compilateur en
instruction directement utilisable par le processeur.
Les variables
dclaration le fait de dfinir la variable avant de lutiliser, dimensionnement : le fait de

Visua dcl
Le ionne
univer
dclar riab
structio atio
mple :
ge As
so
Jusqu' la version 4 et p
Les ver
A partir de VB 2003 (VB.
Pour faire simple, les langages interprts ont besoin d'
l'interprteur de commande. A l'identique des langages de script, le code
ble de lui faire subir un dans lequel vous l'crivez, bien qu'il soit possi
rechercher certains types d'erreurs (de liaison principalement).
Un langage natif (ou compil) transforme le code que vous crivez
une srie d'
Un langage manag utilise un hte d'excution pour scuriser son fonctionnement et le systme
d'exploitation.
Les langages procduraux utilisent des lments de codes sous forme de procdures linaires.
Les langages vnementiels utilisent des lments de code rpondant des vnements
spcifiques.
Les langages objets utilisent des lments de codes dcrits dans des classes.
En dveloppement, on entend par variable une donne dfinie dans un contexte donn ayant un
type dfini. Autrement dit, une variable est la reprsentation dune valeur au sens large du terme.
On appelle
lui donner un type.
En
pas active.
l Basic, la
dimens
aration des variables nest pas obligatoire tant que loption Explicit nest
ment nest jamais obligatoire puisque les variables ont toujours minima
le type
La
sel par dfaut.
ation des va les en Visual Basic est de la forme suivante :
In
Par exe
n de dclar

n Nom de la variable As Type de la variable
Di mA I nt eger
Dclare la va Age
clarer plusieurs variables en les
ensionne deux variables Nom et
riable comme tant un entier 16 bits.
On peut utiliser une seule instruction de dclaration pour d
ivante dclare et dim sparant par des virgules. Par exemple la ligne su
Prenom comme tant deux chanes de caractres :
Di mNomAs St r i ng, Pr enomAs St r i ng
Contrairement de nombreux autres langages, le type ne se propage pas sur une lig
claration. Ainsi la dclaration :
ne de
d
Di mNom, Pr enomAs St r i ng
Nest pas quivalente la dclaration prcdente puisquelle se lit :
omAs Di mNomAs Var i ant , Pr en St r i ng
Comme dit prcdemment, la
des suivants sont donc tous valid
dclaration et le dimensionnement sont facultatifs par dfaut. Les
es :
claration
co
Sans d
Sub Cal cul Per i met r e( )
Rayon = I nput Box( " Ent r ez l e r ayon en mm" , " RAYON" , 0)
ci r conf er ence = 2 * 3. 14159 * Rayon
MsgBox " l e pr i mt r e est de " & ci r conf er ence & " mm"

End Sub
13
Sans dimensionnement
Sub Cal cul Per i met r e( )

Di mRayon, Ci r conf er ence
Rayon = I nput B
Ci r conf er ence
ox( " Ent r ez l e r ayon en mm" , " RAYON" , 0)
= 2 * 3. 14159 * Rayon
MsgBox " l e pr i mt r e est de " & Ci r conf er ence & " mm"

End Sub
Typs
Sub Cal cul Per i met r e( )

Di mRayon As I nt eger , Ci r conf er ence As Si ngl e
Rayon = I nput Box( " Ent r ez l e r ayon en mm" , " RAYON" , 0)
Ci r conf er ence = 2 * 3. 14159 * Rayon
MsgBox " l e pr i mt r e est de " & Ci r conf er ence & " mm"

End Sub
Sils sont tous valides, ils nen sont pas quivalents pour autant. Si vous excutiez le premier et le
dernier code en saisissant 10.2 comme valeur de rayon, le premier code renverrait une valeur et le
dernier une erreur.
Les noms de variable doivent commencer par un caractre alphabtique, tre uniques au sein
d'une mme porte, ne doivent pas excder 255 caractres et ne peuvent contenir ni caractre de
dclaration de type ni point.
La porte
La notion de porte, parfois appele visibilit, dfini les limites daccessibilit dune variable. Il
existe plusieurs instructions de dclaration selon la porte dsire et la dclaration ne se fait pas au
mme endroit.
Instruction Dclaration Commentaires
Private Module Visible par tout le code du module mais inaccessible depuis un autre
module
Public Module
(standard)
Visible par tout le code du projet. Ne se dclare que dans les modules
standard.
Dim Fonction Uniquement dans la fonction ou elle est dclare. Si utilise au niveau
module, quivaut Private
Static Fonction Uniquement dans la fonction ou elle est dclare. Nest pas dtruite la
fin de la fonction
Imaginons le cas suivant. Dans un module standard je dclare :
Publ i c Var Publ i cModul eSt d As St r i ng
t d As St r i n Pr i vat e Var Pr i vat eModul eS g
Dans le module " Feuil1 ", jajoute un bouton sur la feuille et dans le module de code, jcris :
ul eFeui l l e As St r i ng Pr i vat e Var Pr i vat eMod

Pr i vat e Sub CommandBut t on1_Cl i ck( )

Var Pr i vat eModul eFeui l l e = " "
Var Publ i cModul eSt d = " "
Var Pr i vat eModul eSt d = " "

End Sub
Si nous avons bien compris les rgles de la porte, nous allons obtenir une erreur sur la troisime
ligne puisque la variable est prive dans le module standard. Pourtant le code sexcute sans erreur.
14
Comme nou
ia
s lavons vu, sauf stipulation contraire, Visual Basic ne force pas la dclaration des
var bles. Dans ce cas, comme la fonction ne voit pas de dclaration pour VarPrivateModuleStd, elle
en cre une implicite ce qui fait que le code sexcute mais quon ne travaille pas avec la variable
VarPrivateModuleStd du module standard. Par contre si jcris :
Opt i on Expl i ci t

Pr i v r i ng at e Var Pr i vat eModul eFeui l l e As St

Pr i vat e Sub CommandBut t on1_Cl i ck( )
Var Pr i vat eMod l l e = " " ul eFeui
Var Publ i cModul eSt d = " "
Var Pr i vat eModul eSt d = " "
End Sub
Jobtiendrais le message :

rimine sera surligne. Et la variable inc
ette porte indu les. Les variables de iveaux mo nt
rmanentes da excute. On les appelle aussi
s globales. L veau fonction nexistent que lorsqu tion sexcute et
quand mine. Elles ne sont donc jamais a n dehor de la
fonction o elles son es locales. Normalem sont dtruites en
n et per dclare structi tic)
Un appel ultrieur la fonction permettra de retrouver la variab at o e it
c
xem
omm
C it la notion de dure de vie des variab
lles existent tant que le code s
n dules so
dites pe
variable
ns le sens o e
es variables de ni
la fonction se ter
e la fonc
ccessibles e
e s
sont dtruites s
t dclares. On les appelle variabl
dent leur valeur, mais les variables statiques (
nt elle
s avec lin
le dans lt
fin de fonctio
la conserve.
on Sta
lle ta
la fin de lappel pr
Regardons le
dent.
ple suivant :
andBut t on2_Cl i ck( ) Pr i vat e Sub C
Di mVar Local e As I nt eger
Var Local e = Var Local e + 1
MsgBox Var Local e
End Sub

Pr i vat e Sub CommandBut t on3_Cl i ck( )
St at i c Var Local e As I nt eger
Var Local e = Var Local e + 1
MsgBox Var Local e
End Sub
Plusieurs clics sur le bouton 2 provoqueront toujours laffichage de la valeur "1" alors que
plusieurs clics sur le bouton 3 provoqueront laffichage dune valeur incrmente de 1 chaque clic.
Notez que la variable locale des deux fonctions peut avoir le mme nom puisquelles sont hors de
porte lune de lautre.
15
Le type
Le type dune variable cest la dtermination du genre de valeur que la variable peut contenir. En
VBA, toutes les variables possdent le type Variant par dfaut, appel parfois type universel. Une
variable de type Variant peut contenir nimporte quelle valeur lexception des chanes de longueur
fixe. Les variables de type Variant peuvent aussi avoir des valeurs particulires, savoir Empty, Error
et Nothing. Nous verrons les significations de ces valeurs plus loin dans ce cours.
Les types de donnes utiliss en VBA sont :
Valeurs Taille (o) Conversion Nom
Byte 0 255 1 CByte
True (<>0) False(0) 2 CBool
-32 768 32 767 2 CInt
-2 147 483 648 -2 147 483 647 4 CLng
-3,402823E38 -1,401298E-45 pour les valeurs
ngatives ;
4
Boolean
Integer
Long
Single CSng
1,401298E-45 3,402823E38 pour les valeurs
positives
-1,79769313486231E308
-4,94065645841247E-324 pour les valeurs
8
Double ngatives ;
4,94065645841247E-324
1,79769313486232E308 pour les valeurs positives
CDbl
-922 337 203 685 477,5808
922 337 203 685 477,5807
8
CCur Currency
Decimal
000000000000000000001
+/-79 228 162 514 264 337 593 543 950 335 sans
sparateur dcimal
+/-7,9228162514264337593543950335 avec 28
chiffres droite du sparateur dcimal
le plus petit nombre diffrent de zro est +/-
0.0000000
14
CDec
Date 1er janvier 100 au 31 dcembre 9999 8 CDate
Tous les objets 4
65536 caractres Nombre
caractres

Object
String (fixe)
Strin
2 147 483 648 caractres (2^31) 10 +
g (var) Nombre
caractres
Cstr
Variant (nombre) Mme plage que Double 16 Cvar
Variant
Mme plage que chane variable 22 +
Nombre CVar (chane)
caractres

16
Conversion de type
n pass la fonction excde la plage de valeurs du type de
se produit.
ssible de documenter le code en utilisant les fonctions de
donnes afin d'indiquer que le rsultat de certaines oprations
type de donnes particulier plutt qu'au type par dfaut. Utilisez
CCur pour fonctionner en arithmtique montaire et non en
prcision, en double prcision ou en arithmtique de nombres
entiers.
ng arrondissent les parties dcimales gales 0,5 au nombre
rondi 2. Les fonctions
la partie dcimale d'un
t renvoient toujours une
fournies dans un format diffrent des paramtres de date reconnus. En outre,
ment les variables.
Les constantes
La conversion de type est lopration qui consiste convertir une expression en un type de donne
dfini. En dveloppement, on entend par expression une combinaison de mots cls, d'oprateurs, de
variables et de constantes gnrant une chane, un nombre ou un objet. Une expression peut effectuer
un calcul, manipuler des caractres ou tester des donnes.
Les rgles suivantes sappliquent :
Si l'argument expressio
donnes cible, une erreur
Il est gnralement po
types de conversion de
devrait correspondre un
par exemple la fonction
arithmtique en simple
Utilisez les fonctions de conversion de types de donnes la place de la fonction Val de
manire respecter les conventions trangres. Par exemple, la fonction CCur reconnat
divers types de sparateurs dcimaux, de sparateurs des milliers et diverses options
montaires, selon les paramtres rgionaux de votre ordinateur.
Les fonctions CInt et CL
pair le plus proche. Par exemple, 0,5 est arrondi 0 et 1,5 est ar
ctions Fix et Int, qui tronquent CInt et CLng diffrent des fon
nombre sans forcment l'arrondir. En outre, les fonctions Fix et In
valeur du type pass en argument.
Utilisez la fonction IsDate pour dterminer si la valeur de l'argument date peut tre
convertie en date ou en heure. La fonction CDate reconnat les littraux date et heure
ainsi que certains nombres appartenant la plage de dates autorises. Lors de la
conversion d'un nombre en date, la partie entire du nombre est convertie en date. Si le
nombre comprend une partie dcimale, celle-ci est convertie en heures, exprimes en
partant de minuit.
La fonction CDate reconnat les formats de date dfinis dans les paramtres rgionaux de
votre systme. L'ordre des jours, mois et annes risque de ne pouvoir tre dfini si les
donnes sont
les formats de date complets prcisant le jour de la semaine ne sont pas reconnus.

Dans de nombreux cas, VBA va excuter de lui-mme des conversions de type dites implicites.
Ces conversions doivent toujours tre vites soit en explicitant la conversion, soit en typant
correcte

Tel que leur nom lindique, les constantes sont des variables qui ne varient pas. Elles se dclarent
laide de linstruction Const, peuvent utiliser une instruction de porte et un type. Par exemple dans
notre fonction prcdente, nous pourrions crire :
Publ i c Const PI As Si ngl e = 3. 14159

Sub Cal cul Per i met r e( )

Di mRayon As I nt eger , Ci r conf er ence As Si ngl e
Rayon = I nput Box( " Ent r ez l e r ayon en mm" , " RAYON" , 0)
Ci r conf er ence = 2 * PI * Rayon
MsgBox " l e pr i mt r e est de " & Ci r conf er ence & " mm"

End Sub
17
Intrts
O est donc lintrt de dimensionner et a fortiori de dclarer ?
Pour le dimensionnement, il sagit principalement dconomiser de la mmoire et du temps
dexcution. Cependant il sagit aussi dune certaine garantie contre un risque derreur de logique.
Enfin la lisibilit du code nen est que meilleure. Par ailleurs, le type Variant utilise des conversions
par dfaut qui peuvent produire un rsultat inattendu avec certains oprateurs. Imaginons le code
suivant :
Sub Conver si onAr bi t r ai r e( )

Di mVar NonTypee As Var i ant
Var NonTypee = 3
MsgBox Var NonTypee + 3
Var NonTypee = " coucou"
ypee + 3 MsgBox Var NonT

End Sub
Si s allez obtenir comme rsultat 6 puis coucou3. Notez que ces
convers versions dExcel.
Lintr s de la dclaration force est beaucoup plus facile
dmontrer.
Sub Cal cu
vous excutez ce code, vou
ions ne sont normalement plus possibles dans les dernires
t de la dclaration, tout au moin
Reprenons notre exemple :
l Per i met r e( )
Rayon = I nput Box( " Ent r ez l e r ayon en mm" , " RAYON" , 0)
Ci conf er ence = 2 * PI * Rayon
MsgBox " l e pr i mt r e est de " & Ci r conf er ence & " mm"
End Sub
Que isie, le rsultat sera toujours 0. Comme vous
lavez p
comme e contient 0.
Not i vous tes un as du
dbo souhaite travailler en dclaration force pour que
ration des variables. Pour obtenir cela, on tape Option Explicit en haut du
menu Outils Option et on coche la case " dclaration des variables
lle que soit la valeur rentre dans la bote de sa
eut tre remarqu, il y a une faute de frappe dans le nom de la variable Circonfrence, et
VBA ne force pas la dclaration, il cre une deuxime variable qui ell
ez que la dclaration des variables ne rsoudrait pas le problme, sauf s
guage. En effet, il faut prciser VBA quon
celui-ci contrle la dcla
odule, ou on va dans le m
obligatoire ".

Ds lors, notre fonction avec une faute de frappe ne fonctionnera plus puisque la variable nest
pas dclare.
Notons aussi que la dclaration obligatoire des variables augmente grandement la lisibilit du
code.
18
Le type Variant
Appel parfois improprement "type universel", le type Variant est un type union c'est--dire
pouvant avoir plusieurs reprsentations d'une mme variable ou acceptant plusieurs types de variables.
En V
ailleurs la plupart des erreurs induites par
l'uti
correctement l'apprhender en VBA puisque par dfinition,
les v pes Variant.
e ontenir tout type de valeurs, notamment :
e chane de caractres
boolen
rticulire
valeur d'erreur
place un certain nombre de fonctions spcifiques pour travailler sur les
si la variable est un tableau
oie vrai si la variable est vide
IsError renvoie vrai si la variable est une valeur d'erreur
voie un entier identifiant le sous type de la variable
envoie une chane identifiant le sous type de la variable.
isual Basic, le type variant peut contenir tous types de variable. Quoiqu'il soit parfois trs utile, il
convient de ne pas abuser de son utilisation. En effet, il demande plus de ressources que les autres
types ce qui ralentit l'excution des programmes. Par
lisation de ce type se produisent l'excution ce qui tend augmenter la quantit de code de
gestion d'erreurs et complexifier le dboguage.
Cependant, il est invitable de savoir
aleurs des cellules Excel sont de ty
L type Variant peut c
Un nombre
Un
Un
Un tableau
Un objet
Une valeur pa
Empty : la variable est vide
Nothing : Objet non initialis
NULL : Valeur vide d'une base de donnes
Error : Une
n Visual Basic met e
variants :
IsArray renvoie vrai
IsEmpty renv

VarType ren
TypeName r
On pourrait imaginer un code de test tel que :
Sub Test Var i ant ( )

Di mMaVar As Var i ant , Message As St r i ng

MaVar = Range( " B2" ) . Val ue
Message = " Le sous t ype est : " & Var Type( MaVar ) & " => " & TypeName( MaVar )
& vbNewLi ne
Message = Message & " La var i abl e est vi de : " & I sEmpt y( MaVar ) & vbNewLi ne
Message = Message & " La var i abl e est une val eur d' er r eur : " &
I sEr r or ( MaVar ) & vbNewLi ne
Message = Message & " La var i abl e est un t abl eau : " & I sAr r ay( MaVar )
MsgBox Message

End Sub
Si la cellule B2 est vide, ce code affichera la bote de message suivante :

19
Type utilisateur
Il est possible de dfinir des types composites, appels types utilisateurs l'aide de l'instruction
Type End Type.
L'intrt est videmment de manipuler plusieurs var
onsidr comme n'importe quel ty
iables connexes l'aide d'une seule variable.
pe, vous pouvez dclarez des variables de ce
nvoyer dans des fonctions, etc
type utilisateur se fait obligatoirement au niveau du module. Dans un module
ublic ou priv, dans un module objet il ne peut tre que priv.
se fait sous la forme :

s Type
pe
mposent le type (appels membres) peuvent tre de n'importe quels types
ou d'autres types utilisateurs. Il est donc possible d'obtenir des structures

z pas que cette dfinition ne suffit pas pour manipuler la structure, vous devez dclarer
r l'utiliser effectivement.
membres, c'est l'oprateur "." (Point) qui est utilis.
Ce type tant ensuite c
re type, des tableaux, le
La dfinition d'un
tre p standard, il peut
La dclaration
NomType Portee Type
Element A
Element As Ty
.
End Type
Les lments qui co
prdfinis, des tableaux
t complexes. extrmemen
N'oublie
des variables de ce type pou
Pour accder aux
Publ i c Type Fi chi er
s St r i ng NomA
Reper t oi r e As St r i ng
Dat eCr at i on As Dat e
Tai l l e As Long
nd Type E

ubl i c Sub t est ( ) P

Di mFi chi er sExcel ( ) As Fi chi er , compt eur As Long, f Temp As St r i ng

Temp = Di r ( " d: \ svg\ f j mar c\ *. xl s" , vbNor mal )
Do Unt i l f Temp = " "
ReDi mPr eser ve Fi chi er sExcel ( 0 To compt eur )
Fi chi er sExcel ( compt eur ) . Nom= f Temp
Fi chi er sExcel ( compt eur ) . Reper t oi r e = " d: \ svg\ j mar c\ *. xl s"
Fi chi er sExcel ( compt eur ) . Dat eCr at i on = Fi l eDat eTi me( " d: \ svg\ j mar c\ " &
Temp) f
Fi chi er sExcel ( compt eur ) . Tai l l e = Fi l eLen( " d: \ svg\ j mar c\ " & f Temp)
compt eur = compt eur + 1
f Temp = Di r
Loop
MsgBox Fi chi er sExcel ( 0) . Nom& vbNewLi ne & Fi chi er sExcel ( 0) . Tai l l e

End Sub
numration
Une numration est un groupement de constantes entires connexes. Elle est toujours dclare au
nive au du module. L'intrt repose surtout sur la lisibilit du code, on peut indiffremment utiliser la
valeur numrique ou le membre de l'numration. Elle se dclare comme suit :
Porte Enum Name
NomMembre = [ConstanteEntiere]
NomMembre = [ConstanteEntiere]
.
End Enum
20
Les valeurs d'une numration peuvent tre utilises soit directement, soit l'aide de variables,
passe u renvoyes par une fonction. Si les valeurs des constantes ne sont pas
prc
Publ i c
s comme argument o
es dans la dclaration, le pre is mier membre vaut zro, chaque membre suivant tant gal la
valeur du membre prcdent agrment de 1.
VBA utilise de nombreuses numrations intgres.
EnumMoi s
nvi er = 1 J a
Fvr i er = 2
r s Ma = 3
Av = 4
Ma 5
J u 6
J u t = 7
Ao 8
Se br e = 9
Oct e = 10

r i l
i =
i n =
i l l e
ut =
pt em
obr
Novembr e = 11
Dcembr e = 12
End Enum

Publ i c EnumFact eur
ki l o = 1024
mega = 1048576
gi ga = 1073741824
End Enum

Pr i vat e Funct i on Last DayOf Mont h( ByVal Annee As I nt eger , ByVal LeMoi s As
Moi s) As I nt eger

Last DayOf Mont h = Day( Dat eSer i al ( Annee, LeMoi s + 1, 0) )

End Funct i on
Publ i c Sub Test Enum( )
Di mTai l l e As Long

Tai l l e = Fi l eLen( " d: \ svg\ j mar c\ set up. exe" )
Cal l MsgBox( " Tai l l e : " & Tai l l e & " ( " & Tai l l e / Fact eur . mega & "
Mo) " )
Cal l MsgBox( " der ni er j our de f vr i er 2000 : " & Last DayOf Mont h( 2000,
Fvr i er ) )

End Sub
Masque binaire
asques binaires sont une forme particulire d'numration. Il repose sur la reprsentation
binaire des nombres entiers. En effet, on peut reprsenter un nombre entier sous la forme d'une
succession de valeur zro ou un, qu'on peut assimiler une suite de champs boolens. Il est alors
possible de stocker un grand nombre d'informations dans une structure relativement compacte.
Un n dont chaque membre aura comme valeur une
puissanc bres donne forcment une valeur unique.
Les m
masque binaire sera donc une numratio
e de deux afin que la composition des mem
Nous reviendrons plus en dtail sur leur fonctionnement un peu plus loin dans ce cours
21
Oprateurs
Aussi incroyable que cela puisse paratr
relativement peu doprateurs en V grand
e, les oprateurs servent raliser des oprations. Il existe
BA, qui ont diviss en quatre es familles.
Oprateurs arithmtiques
Oprateur Commentaire
+ Addition de deux nombres
- Soustraction de deux nombres
* Multiplication de deux nombres
/ Division bres, le dnominateur ne peut tre nul. de deux nom
\ Division entire. Renvoie la partie entire du rsultat
^ lvation la puissance du nombre de gauche par celui de droite
Mod Renvoie le reste de la division du nombre de gauche par celui de droite.
Donc en prenant le code suivant :
l i c Sub Oper at eur Ar i t hmet i que( )
Di mOper ande1 As I nt eger , Oper ande2 As I nt eger , Resul t As Doubl e

Oper ande1 = 5
Oper ande2 = 2
Resul t = Oper ande1 + Oper ande2
Debug. Pr i nt
Resul t = Oper ande1 - Oper ande2
Debug. Pr i nt Resul t
Resul t = Oper an
Debug. Pr i nt Resul t
Resul t = Oper ande1 / Oper ande2
Debug
Resul t = Oper ande1 \ Oper ande2
Debug. Pr i nt Resul t
Resul t = Oper ande1 ^ Oper ande2
Pub


Resul t

de1 * Oper ande2

. Pr i nt Resul t

Debug. Pr i nt Resul t
Resul t = Oper ande1 Mod Oper ande2
Debug. Pr i nt Resul t

End Sub
Nous obtiendrions tre dexcution : dans la fen
7
3
10
2.5
2
25
1
Oprateurs de comparaison
Les oprateurs de comparaison sont tout aussi connus que les oprateurs arithmtiques
Oprateur vrai si
< (infrieur )
faux si
ression2 expression1 >= expression2
pression2 expre
expression1 < exp
<= (infrieur ou gal ) expression1 <= ex ssion1 > expression2
essi pression2 > (suprieur ) expression1 > expr on2 expression1 <= ex
22
Oprateur vrai si faux si
>= (suprieur ou gal ) expression1 >= expression2 expression1 < expression2
expression2 expression1 = expression2
Il ce que lon compare car VBA compare
diffrem chane "10" et infrieure la chane "2" alors
que
s rgles suivantes s'appliquent :
= (gal ) expression1 = expression2 expression1 <> expression2
<> (diffrent de) expression1 <>
est toujours important de savoir cependant
ment les chanes des nombres. Par exemple la
cest linverse pour les valeurs numriques.
Le
Condition Rsultat
Les deux expressions sont des types de donnes
numriques (Byte, Boolean, Integer, Long, Single,
Double,
Effectue une comparaison numrique.
Date, Currency ou Decimal)
Les deux expressions sont de type String Effectue une comparaison de chanes.
Une expression est de type numrique et l'autre Effectue une comparaison numrique.
de type Variant, qui est ou peut-tre un nombre
Une expression est de type numrique et l'autre
est une chane de type Variant ne pouvant tre
convertie en nombre
L'erreur t ype i ncompat i bl e se produit.
Une e String et l'autre de
type
Effectue une comparaison de chanes. xpression est de type
Variant, sauf Null
Une expression est Empty d
numrique
ff comparaison numrique en
lisant la r 0 pour l'expression Empty.
et l'autre est e type E ectue une
uti valeu
'autre e
uti ne cha
Une expression est Empty et l est de typ
String
Effectue une comparaison de chanes en
lisant u ne de longueur nulle ("") pour
l'expression Empty.
Si les ion1 et expression2 sont tous deux de type Variant, la mthode de
comparais par leur type sous-jacent. Le tableau suivant dfinit la mthode de
com tenus en fonction du type sous-jacent :
Conditi Rsultat
arguments express
on est dtermine
paraison des expressions de type Variant et les rsultats ob
on
e Va nt
Varian es
Les deux expressions de typ riant so
numriques
Effectue une comparaison numrique.
Les deux expressions de type t sont d
cha
Effectue une comparaison de chanes.
nes
Une type Variant est
numrique ne
L'expression numrique est infrieure
l'expression de chane.
des expressions de
et l'autre est une cha
Une des expressions de t
valeur Empty et l'autre est numriq
ff comparaison numrique en
lisant 0 l'expression Empty.
type Varian a la E
ue
ectue une
uti pour
pe V st
uti ne cha
l'ex n Em
Une des expressions de ty ariant e
Empty et l'autre est une chane
Effectue une comparaison numrique en
lisant u ne de longueur nulle ("") pour
pressio pty.
Les deux expressions de type Variant sont
Empty
Les expressions sont gales.
23
Il exis paraison de chanes, la comparaison binaire qui tient compte de la
casse et la i n'en tient pas compte. On peut dfinir la comparaison par dfaut la
vale
Deux oprateurs de compa u s eur Is sera vu dans la partie de
ce cours traitant des objets. L'o e om de chane avec un modle de
chane acceptant des caractres gnriques (*, ?).
&, Oprateur de c tnati
te deux types de com
comparaison texte qu
ur texte l'aide d'"Option Compare Text" en tte de module.
raison spcifiq
pr Lik
e existent aus
perm e c
i. L'oprat
p n ateur et un araiso
onca on
Nous L'oprateur & permet de concatner (runir) deux ch
:
anes. en avons vu un exemple dans le
code
MsgBox " l e pr i mt r e est de " & Ci r conf er ence & " mm"
Notez que la variable concatne est une valeur numrique et qu'il y a une conversion implicite
vers le type String.
Oprateurs logiques
En Visual Basic, les mmes op a logique et la logique binaire. Ce n'est pas
forcment une bonne chose en ter lisibilit avec l' e on vite les erreurs que cela
pourrait entraner. Commenons avec la logique standard, nous verrons la logique binaire juste aprs.
Les oprateurs logiques s'utilisent toujours sous la forme :
rsultat = expression1 oprate ression2
A l'exception de l'oprateur Not. Expression1 et expression2 doivent donc renvoyer des valeurs
boolenne (vrai/faux) et le rsultat une auss
Oprateur And
rateurs servent pour l
me de mais habitud
ur exp
en sera i.

Vrifie que les deux expressions sont vraies.
Expression1 Expression2 Rsultat
Vrai Vrai Vrai
Vrai Faux Faux
Faux Vrai Faux
Faux Faux Faux
Si une expression renvoie Null, le rsultat sera Null si l'autre expression est vraie, faux sinon.
Oprateur Or
Vrifie qu'au moins une des deux expressions sont vraies.
Expression1 Expression2 Rsulta
ai Vrai
i Faux
x Vra
Faux
Si une expression renvoie Null, le ll si l'autre expression est fausse, vrai sinon.
r Eqv
rsultat sera Nu
Oprateu
Vrifie l'quivalence log -dire que les deux expressi
sion1 Expression2 Rsu
i
t
Vrai Vr
Vra Vrai
Fau i Vrai
Faux Faux

ique c'est- ons renvoient le mme rsultat.
Expres ltat
Vra Vrai Vrai
Vrai Faux Faux
Faux Vrai Faux
Faux Faux
ull.
Vrai
Si une expression renvoie Null, le rsultat sera N
24
Oprateur XOr
Vrifie l'exclusion logique c'est--dire que les deux expressions renvoient un rsultat diffrent.
Expression1 Expression2 Rsultat
Vrai Vrai Faux
Vrai Faux Vrai
Faux Vrai Vrai
Faux Faux Faux
Si une expression renvoie Null, le rsultat sera Null.
Imp Oprateur
Vrifie l'implication logique c'est--dire que si l'expression1 est vraie, l'expression2 doit l'tre
aussi.
Expression1 Expression2 Rsultat
Vrai Vrai Vrai
Vrai Faux Faux
Faux Vrai Vrai
Faux Faux Vrai
Null Vrai Vrai
Null Faux Null
Vrai Null Null
Faux Null Faux
Null Null Null
Oprateur Not
Applique la ngation logique, c'est--dire inverse le rsultat d'une expression. De la forme :
rsultat = Not expression
Combinaisons d'oprateur
Ces oprateurs peuvent tre combins dans une expression, cependant il existe des priorits dans
leur valuation. Lorsqu'il plusieurs types rateurs, ils t us ns dre :
Oprateurs arithmtiques oprateurs de comparaison s
Au sein d'une mme famille, les priorits suivent l'ordre suivant :
Arithmtique Comparaison Logique
lvation une puissance (^) galit (=) Not
Ngation () Ingalit (<>) And
Multiplication et division Infriorit (<) Or
Division d'entiers (\) Supriorit (>) Xor
Modulo arithmtique (M Infriorit ou galit (<=) Eqv
Addition et soustraction ( ) Supriorit ou galit (>=) Imp
Concatnation de chanes (&)
Lorsque deu rateurs ont la e priorit, ils sont traits dans
y a d'op son val da l'or
oprateurs logique
(*, /)
od)
+,
x op mm l'ordre d'apparition de
la gauche vers la droite.
Les parenthses permettent de modifier la priorit
Toute l'expression est toujours value
25
Oprateur d'affectation, =
es langages, VBA utilise le mme oprateur pour l'affectation et pour
et gnralement de savoir quel est son rle dans une ligne de code donne,
ir des ambiguts dans certains cas. Imaginons le code suivant :
A la diffrence d'autr
rm l'galit. Si le contexte pe
il peut quand mme il y avo
Sub Oper at eur Egal ( )

mVar 1 Di As I nt eger , Var 2 As I nt eger , Var 3 As I nt eger

Var 1 = 10
Var 3 = Var 2 = Var 1
Debug. Pr i nt Var 3

End Sub
Contrairement aux apparences, ce code ne veut pas dire "mettre var2 et var3 10 mais "mettre
2 = var1". Ds lors, on pourrait s'attendre obtenir une erreur
lenne et que var3 est de type entier. Comme nous l'avons
va convertir implicitement le type pour le faire concider
Pour que ce code soit crit correctement il faudrait typer la variable
dans var3 le rsultat de l'expression var
de type puisque le rsultat est une valeur boo
as o VBA dit prcdemment, il s'agit d'un c
e de la variable var3. avec le typ
comme valeur boolenne.
Attention, il existe aussi une Instruction Set pour affecter des objets dans des variables. Cette
instruction est obligatoire pour que l'affectation soit correcte.
Logique binaire
La logique binaire, qu'on retrouve parfois nomme sous l'lgante traduction de "masque de bits"
(bitmask), consiste utiliser la reprsentation binaire des nombres pour vhiculer plusieurs rponses
boo
Regardons les valeurs des seize premiers nombres entiers et leurs reprsentations binaires. On
peut imaginer ses quatre bits comme quatre rponses boolennes. Par exemple comme l'encadrement
d'une cellule ou 1 indiquerait que la bordure est trace et zro non, et o les bits 1 2 3 et 4
correspondrait respectivement aux bordures gauche haute droite et basse.

Valeur
dcimale
1 2 3 4
0 0 0 0 0
lennes.
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
13 1 1 0 1
14 1 1 1 0
15 1 1 1 1
Vous noterez aussi que chaque puissance de deux donne un rsultat qu'on ne peut obtenir par
addition des nombres infrieurs. Pour travailler en reprsentation binaire, VBA utilise une
numration de puissance de 2. Les numrations VBA se dclarent avec l'instruction Enum. Pour
manipuler ses valeurs, on peut utiliser indiffremment les oprateurs logiques ou les oprations
dcimales.
26
Regardons l'exemple suivant :
Pu Bor d r e bl i c Enum u
' 2
r oi t ' 2^2
' 2
Enca
j b de
r Gauche

ar de dfinit l' nu
re la .
omme est "m
mp de
1 r e
Gauche = 1 ' 2^0
Haut e = 2 ^1
d e = 4
basse = 8 ^3
End Enum

Publ i c Sub Encadr ement ( )
Di m dr e As Bor dur e
' a out e l a or dur e gauche
Encadr e = Encadr e O
' aj out e l a bor dur e haut e
Encadr e = Encadr e + Haut e
' aj out e l a bor dur e dr oi t e
Encadr e = Encadr e + 4
' aj out e l a bor dur e basse
Encadr e = Encadr e Xor basse
Debug. Pr i nt Encadr e
End Sub
La premire p tie du co mration. Dans la procdure encadrement, j'ajoute des
valeurs soit par addition soit par utilisation des oprateurs logiques. Bien qu'il faille raisonner en terme
de masque binaire, la valeur utilise est un entier. L'affichage de la variable Encadre en fin de
procdu renverra valeur 15
C l'utilisation des oprateurs arithmtiques oins souple", on utilise gnralement les
oprateurs logiques, qui fonctionnent en co araison bits. Leur fonctionnement est similaire la
logique standard, c'est dire de la forme :
rsultat = expr oprateu xpr2
27
Les rponses de ses oprateurs sont dfinies dans le tableau ci-aprs
Op

rsultat rateurs
Bit dans
expr1
Bit dans
expr2

And 0 0 0
0 1 0
1 0 0
1 1 1

E 0 1 qv 0
0 1 0
1 0 0
1 1 1

Imp 0 0 1
0 1 1
1 0 0
1 1 1

Or 0 0 0
0 1 1
1 0 1
1 1 1

Or

X 0 0 0
0 1 1
1 0 1
1 1 0
Att i eut produire des rsultats surprenant
lorsqu'on n' essayez de trouver le rsultat
qu'aura a r le code.
Publ i c u
ent on, les actions ont lieu sur tout le masque ce qui p
nons l'numration prcdente et est pas vigilant. Repre
adre sans excute la v riable Enc
S b Val eur Encadr e( )

Di mEncadr e As Bor dur e

Encadr e = Encadr e Xor basse
Enca dr oi t e dr e = Encadr e Or
dr e = haut e I mp Enca Encadr e
Encadr e = Encadr e And gauche
Encadr e = Not Encadr e

End Sub
28
Procdures & fonctions
n ensemble d'instructions s'excutant
rocdure se dfinit quand on la dclare. La dfinition est toujours constitue telle
Le nom de la procdure
nt la liste des arguments
Par exemple, la ligne suivante dfinie la procdure publique Encadrement :
Pub
On appelle procdure (mthode dans le cas des objets) u
mme une entit. Tout code excutable est obligatoirement dans une procdure. co
En VBA, une p
que :
Un mot cl dfinissant la porte
L'instruction Sub
1

ventuelleme
l i c Sub Encadr ement ( )
Lorsqu'une procdure renvoie une valeur, on l'appelle alors fonction. Une fonction se dfinit
com
Publ i c Funct i on Cal cul Per i met r e( ) As Deci mal
me une procdure sauf qu'on utilise l'instruction Function au lieu de sub, et qu'on prcise
gnralement le type renvoy. Si le type n'est pas prcis, la fonction est de type Variant.
La ligne suivante dfinit la fonction CalculPerimetre qui renvoie un rsultat de type dcimal.
Com ivie par la ou
les ligne n End Sub ou End Funct i on
me la dfinition et la dclaration ont lieu en mme temps, cette ligne doit tre su
s de code composant la procdure et finir par l'instructio
selon le
nts
cas.
Argume
Par e
reprsentatio
Pr i vat e F
Souvent appels paramtres, les arguments sont des variables (au sens large du terme) que l'on
communique la procdure. Les arguments se dclarent lors de la dfinition de la procdure. Les
paramtres suivent les rgles de dclaration suivantes :
Un mot cl spcifique la dclaration d'arguments
Le nom de l'argument
Son type
ventuellement sa valeur
ex mple la ligne suivante dclare la fonction IntToBin qui convertit un nombre entier dans sa
n binaire et prends un argument de type entier :
unct i on I nt ToBi n( ByVal I nt eger Number As Long) As St r i ng
ByRef & ByVal
Pour comprendre correctement le type de passage d'un argument, il faut concevoir les
prsentations d'une variable. Une variable est un re emplacement mmoire qui contient quelque chose.
a aussi une valeur
fait son adresse mmoire, une action
souhaitable ou
pend de ce que l'on veut obtenir.
variable. Si on souhaite que les modifications ne soient pas
rpercutes, on passe l'argument par valeur, c'est--dire en copiant la valeur dans une variable locale.
Le code suivant montre bien le principe des types de passage.
Pr i vat e Sub TypePassage( ByRef Par Ref er ence As I nt eger , ByVal Par Val eur As
Stricto sensu il s'agit donc d'une adresse mmoire. Cependant chaque instant, elle
qui elle, est l'information qu'on utilise. Comme la variable est de
en tout point du code modifie la variable. Ce comportement n'est pas forcment
indsirable, tout d
Si on dsire pouvoir modifier la valeur d'un argument au sein d'une fonction et rpercuter ces
modifications dans le code appelant, on dit qu'on passe la variable par rfrence, c'est--dire que
l'argument contient l'adresse de la
I nt eger )
Par Ref er ence = 2 * Par Ref er ence
Par Val eur = 2 * Par Val eur
End Sub

1
Si cette porte est omise, la procdure sera publique si elle est dans un module standard, prive
si non.
29

Publ i c Sub Test ( )

Di mEnt i er Ref As I nt eger , Ent i er Val As I nt eger

t i er Ref = 1 En
Ent i er Val = 1
TypePassage Ent i er Ref , Ent i er Val
MsgBox " Par r f r ence " & Ent i er Ref & vbCr Lf & " Par val eur " & Ent i er Val

End Sub
Et vous obtiendrez :

Comme vous le voyez, la variable passe par rfrence a bien t modifie par la procdure
t.
l'autre, les variables sont passes par rfrence
squ'une adresse ne prend que quatre octets. Ce n'est pas pnalisant en soit,
ez bien conscience que vous ne devez modifier la variable qu' bon escient.
rale, on suit les rgles suivantes.
Les valeurs simples (nombres, chanes, dates) sont transmises par valeur.
bjets et les tableaux sont transmis par rfrence.
odifier une valeur qu'un argument pass par
TypePassage alors que la variable passe par valeur ne l'a pas
Par dfaut, c'est--dire si vous ne prcisez ni l'un ni
au nom de l'efficaci
ay
t pui
pour peu que vous
anire gn De m

Les o
On utilise plutt des variables globales pour m
rfrence
2
.
Optional
Ce mod
peut
ificateur prcise que l'argument est optionnel, c'est--dire qu'il peut tre transmis comme il
t optionnels.
L'absence du paramtre peut tre test avec la fonction IsMissing si son type n'est pas un
type valeur.
Les arguments optionnels peuvent avoir une valeur par dfaut. Dans ce cas IsMissing
renvoie toujours False.
Les deux syntaxes qui suivent sont quivalentes :
Pr i vat e Funct i on Ar r ondi r ( ByVal Val eur As Si ngl e, Opt i onal Nombr eDeDeci mal e
ne pas l'tre. Les rgles suivantes s'appliquent :
Lorsqu'un argument est marqu comme optionnel, tout les arguments qui le suivent dans
la dclaration doivent tre marqus comme tan
Les arguments optionnels ne peuvent pas tre utiliss en mme temps que les tableaux
d'arguments (ParamArray)

As Var i ant ) As Si ngl e

I f I sMi ssi ng( Nombr eDeDeci mal e) Then Nombr eDeDeci mal e = 1
Ar r ondi r = Val eur * ( 10 ^ Nombr eDeDeci mal e)
Ar r ondi r = I nt ( Ar r ondi r + 0. 49) * ( 10 ^ - Nombr eDeDeci mal e)

End Funct i on
Notez que pour que cette fonction fonctionne correctement, l'argument NombreDeDecimale est de
type Variant et non de type Integer.

2
Encore que d'autres auteurs vous diront exactement l'inverse.
30
Pr i vat e t i onal Nombr eDeDeci mal e Funct i on Ar r ondi r ( ByVal Val eur As Si ngl e, Op
er = 1) As Si ngl e As I nt eg

Ar r ondi r = Val eur * ( 10 ^ Nombr eDeDeci mal e)
Ar r ondi r = I nt ( Ar r ondi r + 0. 49) * ( 10 ^ - Nombr eDeDeci mal e)

End Funct i on
ParamArray
Indique que l'argument est un tableau variant de paramtre. Ce mot cl ne peut tre utilis que sur
le dernier argument. Ce mot cl n'est gure utilis car il prsente quelques difficults de manipulation,
car il reprsente en fait un nombre illimit d'arguments. Prenons l'exemple suivant :
Pr i vat e Funct i on Mi ni mum( Par amAr r ay El ement s( ) As Var i ant ) As Var i ant

Di mcmpt As Long
I f UBound( El ement s) > - 1 Then ' au moi ns un ar gument
For cmpt = LBound( El ement s) To UBound( El ement s)
I f I sNumer i c( El ement s( cmpt ) ) Then

I f Not I sEmpt y( Mi ni mum) Then
I f Mi ni mum> El ement s( cmpt ) Then Mi ni mum= El ement s( cmpt )
El se
Mi ni mum= El ement s( cmpt )
End I f
End I f
Next cmpt
End I f

End Funct i on

Publ i c Sub Test ( )

MsgBox Mi ni mum( " t ot o" , - 1, Tr ue, 124, Range( " B2" ) , 25. 471)

End Sub
Comme nous le voyons, si la fonction dclare bien un argument de type tableau, l'appel utilise lui
une liste l
Notez q jours 0.
d' ments. Le tableau tant de type variant, les lments peuvent tre de n'importe quel type.
ue l'indice du premier argument est tou
Si vous donnez l'argument marqu ParamArray un nom de variable finissant par 1 dans une
fonction de feuille de calcul, l'assistant de fonctions incrmentera automatiquement chaque nouvel
lment :

31
Arguments nomms ou passage par position
mmode de passer de nombreux
ment parce que l'on souhaite passer le premier et le dernier.
A Replace dont la dfinition est de la forme simplifie :
String, find As String, replace As String, Optional start As
nnel qui
en passant les arguments par position, nous
nnels,
passer les arguments en les nommant. Ds lors, il n'y a pas besoin de respecter
ents optionnels.
est dfini par le modle de la fonction. Ainsi dans la fonction Replace, le
st affecte
urrions donc
que au prcdent sous la forme :
e, compare := VbTextCompare)
ppel
Comme nous venons de le voir, une procdure peut avoir un grand nombre d'arguments.
Normalement les arguments sont passs par position, c'est--dire dans l'ordre o ils apparaissent dans
ependant, ce n'est pas toujours co la dclaration de la procdure. C
argu ts facultatifs vides unique men
Imaginons un appel la fonction VB
lace(expression As Function Rep
Long, Optional count As Long, Optional compare As VbCompareMethod) As String
toires et le dernier argument optio Nous souhaitons passer les trois arguments obliga
comparaison. Pour raliser cet appel prcise le type de
evons crire : d
MaChane=Replace(MaChane,",",";",,,VbTextCompare)
C'est--dire que nous passons autant de virgule que d'arguments. Pour deux arguments optio
c'est encore acceptable, mais s'il y en a 10, c'est illisible.
On peut alors
l'ordre, ni de passer des emplacements vides pour les argum
Le nom de l'argument
premier argument s'appelle 'expression', le deuxime 'find' et ainsi de suite. La valeur e
ent l'aide de l'oprateur particulier := qui n'est utilis que dans ce cas. Nous po l'argum
crire un appel identi
MaChane=Replace(expression := MaChan
Instructions et rgles d'a
peler une fonction ou une procdure depuis un autre point du code, il faut d'abord et avant
arguments en
st appele, on tape son nom suivi de la liste des arguments spars par
on tape son nom suivi de la liste des arguments, entre
rocdure ou une fonction dont on ne
ur. Ds lors qu'on utilise Call, la liste des arguments doit tre
voyons un exemple ci-aprs :
I nt eger )
Pour ap
tout que sa porte le permette, c'est--dire qu'elle soit visible depuis le point d'appel. Autrement dit,
vous ne pouvez pas appeler une fonction dclare Private dans un formulaire partir d'une procdure
d'un module standard.
L'appel classique consiste crire le nom de la procdure suivi de la liste des
ivant les rgles suivantes : su
Si une procdure e
des virgules.
Si une fonction est appele
parenthses, spars par des virgules.
On utilise parfois l'instruction Call pour appeler une p
souhaite pas rcuprer la valeur de reto
mise entre parenthse. Nous
Pr i vat e Sub Exempl eSub( Ar g1 As
x Ar g1 MsgBo
End Sub

Pr i vat e Funct i on Exempl eFunct i on( Ar g1 As I nt eger ) As St r i ng
Exempl eFunct i on = CSt r ( Ar g1)
End Funct i on

Publ i c Sub Test Appel ( )

' appel cl assi que
Exempl eSub 12
' appel avec cal l
Cal l Exempl eSub( 12)
' appel de f onct i on
MsgBox Exempl eFunct i on( 12)
' val eur de r et our i gnor e
Cal l Exempl eFunct i on( 12)
End Sub
32
Valeur retourne
La diffrence entre une fonction et une procdure repose sur le fait que la fonction renvoie une
riable implicite qui est le nom de la fonction.
onction soit :
valeur type. Pour dfinir la valeur, on utilise une va
f Autrement dit, vous devrez avoir quelque part dans la
NomDeLaFonct i on = Val eur
Ou
Set NomDeLaFonct i on = Val eur
Par exemple:
i vat e Funct i on Conv2Fahr enhei t ( Pr ByVal TCel si us As Si ngl e) As Si ngl e
Conv2Fahr enhei t = 1. 8 * TCel si us + 32
End Funct i on

Pr i vat e Funct i on Numer i cRange( Feui l l e As Wor ksheet ) As Range
Set Numer i cRange = Feui l l e. Cel l s. Speci al Cel l s( xl Cel l TypeConst ant s,
xl Number s)
End Funct i on

Sub Appel Fonct i on( )

Di mPl ageNumer i que As Range, TempC As Si ngl e, TempF As Si ngl e

TempC = 25
TempF = Conv2Fahr enhei t ( TempC)
Set Pl ageNumer i que = Numer i cRange( Act i veSheet )
Pl ageNumer i que. Val ue = TempF

End Sub
Les fonctions peuvent videmment avoir plusieurs points de sorties, logiques ou forcs l'aide de
l'instruction "Exit". Les rgles de la bonne programmation veulent qu'il y ait une affectation de valeur
chaque point de sortie.
Pr i vat e Funct i on Renvoi eSi gne( ByVal Val eur As Si ngl e) As I nt eger

Sel ect Case Val eur
Case I s < 0
Renvoi eSi gne = - 1

Case 0 ' ce cas est i mpl i ci t ement vr ai
Renvoi eSi gne = 0

Case I s > 0
Renvoi eSi gne = 1

End Sel ect

End Funct i on
Cette fonction trois points de sortie. Traiter le cas 0 n'est utile qu'en terme de lisibilit et de
bonne programmation puisque de fait si valeur vaut 0, la fonction RenvoieSigne vaudra 0 si nous ne
lui affectons pas explicitement une valeur diffrente (0 tant la valeur d'initialisation de la variable
RenvoieSigne).
33
Pr i vat e Funct i on ByRef MaPl age As Range) As Bool ean Est Vi de(
aCel l ul e As Ra Di mM nge
For Each MaCel l ul e I n MaPl age. Cel l s
I f Not I sEmpt y( MaCel l ul e) Then
Est Vi de = Fal se ' i mpl i ci t ement vr ai

Exi t Funct i on
End I f
Next
Est Vi de = Tr ue

End Funct i on
Cette fonction deux points de sortie (un point forc). L encore, la ligne EstVide = False n'est
utile que pour des raisons de bonne programmation puisque EstVide vaut False sauf affectation
explicite de la valeur True.
34
Les objets
Un objet est un ensemble code / donnes se comportant comme une entit unique et cohrente. Si
VBA n'est pas un langage objet, le modle Excel en est entirement compos, il va donc falloir nous
familiariser avec leurs manipulations.
Un objet expose une interface constitue de mthodes, de proprits et d'vnements, tout cela
compose les membres de l'objet. Oublions pour l'instant les vnements.
Un objet possde donc des proprits dfinissant son tat et des fonctionnalits qui sont ses
mthodes. Il possde par ailleurs un type issu de la classe qui le dfinit. Une classe est l'ensemble du
code qui dfinit un type d'objet. Pour faire une analogie classique, la classe est la recette de cuisine et
l'objet le plat. L'objet tant l'instance d'une classe, il doit tre instanci, mais cela n'est pas forcment
d votre code. Revenons-en Excel VBA. Un certain nombre d'objet que vous allez manipuler
seront directement ou implicitement instancis (crs) par l'application Excel.
Lorsqu'on doit instancier un objet par le code, on utilise le mot cl "New" ou dans certains cas une
mthode fournit par un autre objet.
Nous reviendrons plus loin sur la conception des objets, concentrons nous pour l'instant sur leur
manipulation. Pour pouvoir utiliser un objet, vous devez accder soit l'objet directement, soit une
variable y faisant rfrence. A la diffrence des valeurs, on doit utiliser le mot cl "Set" pour affecter
une variable objet. Notez que dans certains, cas le moment de l'affectation peut avoir son importance.
Pour utiliser un membre de l'objet on utilise l'oprateur "." (Point). La nature du membre va
dfinir la syntaxe utiliser. Les proprits attendent et/ou renvoient des valeurs, les mthodes
attendent ventuellement des arguments et renvoient ventuellement une valeur. Pour faire une
analogie, les proprits se traitent comme des variables et les mthodes comme des appels de
procdures / fonctions.
Comme un petit exemple est souvent plus efficace qu'un long discours, regardons l'exemple de
code comment ci-dessous.
Sub DemoObj et ( )

Di mCl asseur As Wor kbook

Set Cl asseur = Act i veWor kbook
' val or i se l a pr opr i t Dat e1904 du cl asseur
Act i veWor kbook. Dat e1904 = Tr ue
' l i t l a mme pr opr i t l ' ai de de l a var i abl e
MsgBox Cl asseur . Dat e1904
' ut i l i se une mt hode de l a var i abl e obj et
Cl asseur . Pr ot ect Passwor d: =" Mot DePasse"
' ut i l i se une mt hode de l ' i nst ance
Act i veWor kbook. Unpr ot ect " Mot DePasse"
' une pr opr i t peut t r e un obj et
' l i t une pr opr i t d' un obj et cont enu par l ' obj et
Di mNomFeui l l e1 As St r i ng
NomFeui l l e1 = Cl asseur . Wor ksheet s( 1) . Name
' ut i l i se une mt hode d' un obj et cont enu
Act i veWor kbook. Act i veSheet . Del et e
' t end un f i l ochon bour r i cot
Wor kbooks. Add
MsgBox Act i veWor kbook. Sheet s. Count & vbNewLi ne & Cl asseur . Sheet s. Count

End Sub
Notez que les variables objet se dclarent comme n'importe quelle variable.
Reprenons quelques uns des points que nous avons vus illustr par ce code. Tout d'abord, si le
type de l'objet est "Workbook" (classeur) il n'existe pas d'instance Workbook. De fait,
ActiveWorkbook est une rfrence cre par Excel du classeur actif. Vous noterez aussi que nous
pouvons agir indiffremment sur l'instance ou sur la variable faisant rfrence celle-ci.
35
Nous voyons aussi qu'un objet peut avoir comme membres des proprits tant des objets, qui
eux-m proprits tant des objets et ainsi de suite. On appelle cela un modle
obje
eau classeur. Ce nouveau classeur devient le
el fait rfrence ce nouveau classeur dans l'objet
r actif, il
n'y a
mes peuvent avoir des
irarchique et c'est le fo t h ndement du modle objet d'Excel.
Les proprits ont toujours un type, objet ou valeur, les arguments et les valeurs renvoyes par les
mthodes galement. Autrement dit, il n'existe pas de grandeurs sans type.
J'ai ajout la fin du code deux lignes de code prsentant un petit pige. Jusque la, la variable
Classeur et l'objet ActiveWorkbook faisait rfrence la mme chose. L'appel de la mthode
Workbooks.Add demande Excel de crer un nouv
classeur actif par dfaut, ds lors, Exc
ActiveWorkbook. Par contre notre variable classeur fait toujours rfrence l'ancien classeu
donc plus quivalence entre la variable et l'objet ActiveWorkbook.
Restons en l pour l'instant, nous reviendrons beaucoup plus en dtails sur les objets dans la suite
de ce cours.
36
Les tableaux
On appelle tableau, un ensemble d'lments, indexs squentiellement, ayant le mme type de
donnes. Un tableau peut possder jusqu' 60 dimensions en Visual Basic. Les dclarations des
tableaux suivent les rgles suivantes :
tiques doivent dfinir leurs nombres d'lments dans chaque dimension lors de
leur
Les tableaux sta
dclaration :
Di mTabEnt i er ( 15) As I nt eger
Di mTabSt r i ng( 10, 10) As St r i ng
En VBA, les tableaux peuvent avoir par dfaut comme plus petit indice, 0 ou 1.
plus
petit indice des tableaux dont la limite infrieure n'est pas explicitement dfinie est 0. Autrement dit :
Opt
On dfinit cela en prcisant l'Option Base en tte de module. Option Base 0 veut dire que le
i on Expl i ci t
Opt i on Base 1

Pr i vat e TabNom( 10) As St r i ng
Signifie que TabNom va de 1 10 alors que si l'instruction Option Base valait 0 ou si elle tait
9.
mites de chaque dimension l'aide de la clause "To".
Bool ean
omise, il irait de 0
VBA permet la dclaration explicite des li
Par exemple :
Di mTabBool ( 1 To 10) As
i mTabSi ngl e( 5 To 15, 3 D To 8, 2 To 7) As Si ngl e
Tous les lments d'un tableau sont de mme type. Cependant comme un tableau peut tre de type
As Si ngl e
Variant, un tableau peut contenir tout type de donnes, y compris des objets ou d'autres tableaux.
Les tableaux dynamiques se dclarent sans prciser les dimensions mais avec les parenthses.
Di mTabDynami que( )
On utilise l'instruction ReDim pour modifier la taille d'un tableau dynamique, que ce soit le
nombre d'lments ou le nombre de dimensions.
ReDi mTabDynami que( 1 To 10)
o 5) ReDi mTabDynami que( 1 To 5, 1 T
Le redimensionnement engendre la perte des donnes contenues. Pour conserver ses donnes, on
t cl Preserve.
As Si ngl e
utilise le mo
Di mTabDynami que( )

ReDi mTabDynami que( 1 To 5, 1 To 5)
TabDynami que( 1, 1) = 2. 54
ReDi mPr eser ve TabDynami que( 1 To 5, 1 To 6)
MsgBox TabDynami que( 1, 1)
L'utilisation du mot cl Preserve fige le nombre de dimensions et la limite infrieure de chacune
d'entre elle, autrement dit, les trois dernires lignes suivantes dclencheraient une erreur :
ReDi mTabDynami que( 1 To 5, 1 To 5)
ReDi mPr eser ve TabDynami que( 1 To 5, 1 To 6)
ReDi mPr eser ve TabDynami que( 1 To 6, 1 To 5)
ReDi mPr eser ve TabDynami que( 1 To 5, 2 To 5)
ReDi mPr eser ve TabDynami que( 1 To 6)
On lit ou crit dans un lment du tableau en nommant le tableau avec le(s) indice(s) de la case
comme montr dans l'exemple prcdent. Tout appel d'un tableau avec un indice en dehors de la plage
dclenchera une erreur rcuprable.
37
Instructions et fonctions spcifiques
L' effacer un tableau. Dans le cas des tableaux fixes, les valeurs sont
rin
et d'initialiser une variable de type Variant comme un tableau en lui
ents du tableau. La limite est fixe par la valeur d'Option Base, sauf si
VBA.Array. Dans ce cas, l'indice de la limite basse sera forc 0. On obtient
nel avec cette fonction.
de dtecter les limites des tableaux, LBound et Ubound.
As Long
if de la dimension
re dimension est
instruction Erase permet d'
itialises mais le tableau garde les dimensions qui sont dfinies, dans le cas des tableaux
dynamiques, le tableau est rinitialis (perte des valeurs et des dimensions).
La notation est :
Erase Tableau
La fonction Array perm
ssant directement des lm pa
vous utilisez la syntaxe
forcment un tableau unidimension
Il existe deux fonctions permettant
De la forme :
As Long LBound(arrayname [, dimension As Integer])
(arrayname [, dimension As Integer]) UBound
O arrayname est le nom de la variable tableau et dimension le numro facultat
i dont on cherche les limites. Lorsque dimension est omis, la valeur de la prem
renvoye.
Opt i on Base 0

u( ) Publ i c Sub Test Tabl ea

s Var i Di mTabVar 1 A ant

TabVar 1 = Ar r ay( 1, 2, 3, 4, 5)
Debug. Pr i nt " l i mi t e i nf " & LBound( T
ar 1)
abVar 1) & vbNewLi ne & " l i mi t e sup "
& UBound( TabV
t e i n ' l i mi
' l i mi t
f 0
e sup 4
Er ase TabVar 1
ReDi mTabVar 1( 0 To 2, 1 To 5)
Debug. Pr i nt " l i mi t e i nf di mensi on 2 " & LBound( TabVar 1, 2)
' l i mi t e i nf di mensi on 2 1

End Sub
38
Les blocs
L'instruction WithEnd With est l'instruction de bloc Visual Basic. L'instruction de bloc permet
de faire rfrence un objet une seule fois pour tout le bloc de ligne de codes qu'il contient. Ceci
permet une augmentation de vitesse du code puisque la rfrence n'est rsolue qu'une fois et une
meilleure lisibilit. Par exemple :
Di mVal eur As Var i ant

Wi t h Range( " B2" )
. Font . Col or I ndex = 7
. I nt er i or . Col or I ndex = 5
Val eur = . Val ue
. Bor der Ar ound Col or I ndex: =3, Wei ght : =xl Thi ck
. For mul aLocal = " =Somme( A1: A10) "
nd Wi t h E
Il est possible d'imbriquer les blocs With dans le sens du modle h
t h Wor kbooks( " Cl asseur 1" ) . Wor ksheet s( " Feui l 1" ) . Cel l s( 2, 2)
irarchique :
Wi
. For mul aLocal = " =Somme( A1: A10) "
Wi t h . Font
. Name = " Ar i al "
. Bol d = Tr ue
. Si ze = 8
End Wi t h
Wi t h . I nt er i or
. Col or I ndex = 5
. Pat t e
End Wi t h
r n = xl Pat t er nCr i ssCr oss

End Wi t h
39
Structure dcisionnelle
cisionnelle la
code
ructures compactes
VBA utilise plusieurs formes de structures dcisionnelles. On appelle structure d
construction de code permettant de tester une ou plusieurs expressions afin de dterminer le
excuter.
Les st
Les structures

compactes sont des fonctions VBA retournant une valeur en fonction d'un test.
Immediate If IIf
De la forme IIf(expr, truepart, falsepart)
O truepart et falsepart sont des valeurs ou des expressions renvoyes. Par exemple :
Pr i vat e Funct i on I sNot hi ng( ByRef Obj et As Obj ect ) As Bool ean

I sNot hi ng = I I f ( Obj et I s Not hi ng, Tr ue, Fal se)

nct i on End Fu
Il est possible d'imbriquer ce type de structure, bien que la lisibilit en ptisse rapidem
imbrication peut tre hirarchique ou indpendante :
ent. Cette
i r ar chi que ' i mbr i cat i on h
Pr i vat e Funct i on Si gne( ByVal Val eur As Doubl e) As I nt eger

Si gne = I I f ( Val eur > 0, 1, I I f ( Val eur < 0, - 1, 0) )

End Funct i on

' i mbr i cat i on i ndpendant e
Pr i l eur 2 As Var i ant ) vat e Funct i on Max2( ByVal Val eur 1 As Var i ant , ByVal Va
As Var i ant

Max2 = I I f ( I I f ( I sNumer i c( Val eur 1) , Val eur 1, Empt y) <
I I f ( I sNumer i c( Val eur 2) , Val eur 2, Empt y) , Val eur 2, Val eur 1)

End Funct i on
Attention, Visual Basic value toujours toutes les expressions de la structu
est pas renvoye. Si celle-ci contient une erreur, elle se produira mme si l'expression ne devrait pas
re mme la partie qui
Nothing car
une erreur mme si cette partie de l'expression ne doit pas tre value.
n'
tre renvoye. Dans l'exemple suivant, la fonction lvera une erreur si l'argument vaut
Nothing.Value est
Pr i vat e Funct i on I I FBug( ByVal Ar g1 As Range) As I nt eger

I I FBug = I I f ( Ar g1 I s Not hi ng, 0, Ar g1. Val ue)

End Funct i on
Choose
Renvoie une valeur d'une liste de choix en fonction de l'index pass en premier argument. De la
r I ndex( ByVal I ndex As I nt eger ) As St r i ng
forme :
Choose(Index, Choix , Choix , ., Choix )
1 2 n

Pr i vat e Funct i on EqvCol o

EqvCol or I ndex = Choose( I ndex, " noi r " , " bl anc" , " r ouge" , " ver t " , " bl eu" ,
" j aune" )

End Funct i on
40
Index doit forcment tre compris entre 1 et le nombre de choix de la liste, sinon Choose renverra
ByVal I ndex As I nt eger ) As St r i ng
la valeur Null.
Pr i vat e Funct i on EqvCol or I ndex(
Di mReponse As Var i ant
Reponse = Choose( I ndex, " noi r " , " bl anc" , " r ouge" , " ver t " , " bl eu" ,
" j aune" )
EqvCol or I ndex = I I f ( I sNul l ( Reponse) , " i ndex en dehor s des l i mi t es" ,
Reponse)
End Funct i on

Pr i vat e Sub t est 2( )
MsgBox EqvCol or I ndex( 7)
End Sub
Index est un nombre dcimal, il est arrondi avant l'v Si aluation, dans notre exemple prcdent,
vColorIndex(2.8) renverra "rouge". MsgBox Eq
Attention, l encore tous les choix seront valus. L'exemple suivant affichera la liste des couleurs
dans des botes de dialogue :
Pr i vat e Sub EqvCol or I ndex( ByVal I ndex As I nt eger )

Choose I ndex, MsgBox( " noi r " ) , MsgBox( " bl anc" ) , MsgBox( " r ouge" ) ,
MsgBox( " ver t " ) , MsgBox( " bl eu" ) , MsgBox( " j aune" )

End Funct i on
Switch
Cette fonction renvoie une valeur ou une expression fonction de l'expression qui lui est associe
dans une liste d'expression. On la rencontre rarement car elle est assez souvent mal comprise.
on 1 valuer, expression renvoye si expression 1 est vrai, expression 2
valuer, expression renvoye si expression 2 est vrai, etc)
ple d'valuation de signe similaire la fonction crite avec des
IIf i
Pr i vat e Funct i on Si gne2( ByVal Val eur As Doubl e) As I nt eger
Sa forme gnrique est :
Switch(expr-1, value-1[, expr-2, value-2 [, expr-n,value-n]])
dit : ou autrement
w S itch(expressi
C mmenons par un exemple sim
:
o
mbriqus

Si gne2 = Swi t ch( Val eur < 0, - 1, Val eur = 0, 0, Val eur > 0, 1)

unct i on End F
Dans ce cas, la fonction va valuer les expressions de la gauche vers la droite et renvoyer la valeur
st
a
res expressions peuvent tre vraies si
Val eur As Doubl e) As I nt eger
associe ds lors qu'une des expressions est vraie. L'ordre d'valuation a son importance puisque c'e
la premire expression vraie qui dfinira la valeur renvoye. Ainsi la fonction suivante renverrait l
mme chose que la prcdente quand bien mme les deux derni
Valeur vaut 0 :
Pr i vat e Funct i on Si gne2( ByVal
Si gne2 = Swi t ch( Val eur < 0, - 1, Val eur =
i on
0, 0, Val eur >= 0, 1)
End Funct
Switch renverra Null si aucune expression n'est vraie, par exemple :
Publ i c Funct i on SousType1( ByVal Val eur As Var i ant ) As St r i ng

i mReponse D As Var i ant
Reponse = Swi t ch( I sAr r ay( Val eur ) , " Tabl eau" , I sEmpt y( Val eur ) , " Vi de" ,
I sDat e( Val eur ) , " Dat e" , I sNumer i c( Val eur ) , " Nombr e" )
SousType1 = I I f ( I sNul l ( Reponse) , " Cha ne" , Reponse)

End Funct i on
41
Il est possible d'imbriquer les fonctions Switch :
Publ i c Funct i on SousType1( ByVal Val eur As Var i ant ) As St r i ng

Di mReponse As Var i ant
Reponse = Swi t ch( I sAr r ay( Val eur ) , " Tabl eau" , I sEmpt y( Val eur ) , " Vi de" ,
I sDat e( Val eur ) , " Dat e" , I sNumer i c( Val eur ) , Swi t ch( Val eur - I nt ( Val eur ) <>
0, " Deci mal " , Val eur - I nt ( Val eur ) Mod 1 = 0, " Ent i er " ) )
SousType1 = I I f ( I sNul l ( Reponse) , " Cha ne" , Reponse)

End Funct i on

Pr i vat e Sub t est 2( )

MsgBox SousType1( 14. 3) ' r enver r a ' Deci mal

End Sub
L encore, toutes les expressions quelles soient de test ou renvoyes seront values. Ds lors la
fonction prcdente renverra une erreur d'incompatibilit de type pour toute donnes non numriques
passes comme argument puisque Int() attend forcment un nombre.
ts majeurs, leur faible
les structures clates suivantes.
Quoique trs pratique, ces structures compactes ont donc deux inconvnien
ibilit et l'valuation de tous les cas mmes lorsqu'ils sont exclus par le test. Pour viter ces lis
inconvnients, on travaille plutt avec
If Then Else
e If Then Else admet de La structur
ns la sy
ux syntaxes, la syntaxe linaire et la syntaxe de blocs.
ntaxe linaire, toute l'instruction tient sur une ligne et il n'y a pas d'instruction de fin de
est :
If Test lse Traitement
Dans es traitements sont spars des instructions du bloc et le bloc se termine
forc
DuMoi s( ByVal Moi s As I nt eger , ByVal Annee As
Da
blocs, la forme en
Then Traitement E
la syntaxe de bloc, l
ment par l'instruction "End If". La structure est donc de la forme
If Test Then
Traitement
Else
Traitement
End If
Par exemple
Pr i vat e Funct i on Pr emi er Lundi
I nt eger ) As Dat e
s Dat Di mPr emi er DuMoi s A e, NumJ our As I nt eger

' synt axe en l i gne
Then Er r . R I f Moi s < 1 Or Moi s > 12
t i er compr i s ent r e 1
ai se 5, " Moi s" , " La val eur du moi s
est un en et 12"
Pr emi er DuMoi s = Dat eSer i al (
= Weekday( Pr emi er Du
Annee, Moi s, 1)
NumJ our Moi s, vbMonday)
' synt axe en bl oc
I f NumJ our = 1 Then
Pr emi er Lundi DuMoi s = Pr emi er DuMoi s
El se
Pr emi er Lundi DuMoi s = Dat eAdd( " d" , 8 - Weekday( Pr emi er DuMoi s,
vbMonday) , Pr emi er DuMoi s)
nd I f E

ct i on End Fun
Avec la syntaxe en bloc, les traitements peuvent contenir plusieurs lignes de code. Il est possible
ructures If. Notez que quelle que soit la syntaxe choisie, le bloc Else est toujours d'imbriquer des st
facultatif.
42
Pr i vat Par amAr r ay Li st eVal eur ( ) As Var i ant ) As Var i ant e Funct i on Max(

Di mcompt eur As Long
I f UBound( l i st val eur ) > - 1 Then
ound( Li st eVal eur ) To UBound( Li st eVal eur ) For compt eur = LB
I f I sNumer i c( Li st eVal eur ( compt eur ) ) Then
< Li st eVal eur ( compt eur ) Then I f Max
Max = Li st eVal eur ( compt eur )
End I f
End I f
pt eur Next com
f End I

End Funct i on
N.B : L'indentation du code n'est pas obligatoire, mais comme elle permet un plus grand confort
de bloc permet aussi de scinder les tests et les expressions. Ainsi la
la syntaxe "IIfBug" que nous avons vu plus haut fonctionnera sans
era valu :
As Range) As I nt eger
de lecture, elle est chaudement recommande.
L'utilisation de la syntaxe
uivalente fonction suivante q
problme, puisque seul le code du bloc concern s
I f Cor r i ge( ByVal Ar g1 Pr i vat e Funct i on

Not hi ng Then I f Ar g1 I s
I f Cor r i ge = 0
El se
I f Cor r i ge = Ar g1. Val ue
End I f

End Funct i on
ElseIfThen
Le jeu d'instr
ajou
uction ElseIfThen permet de grer des tests conscutifs dans un bloc If. On peut
ter autant de bloc ElseIf que l'on veut mais aucun ne peut apparatre aprs le bloc Else. Ds qu'une
expression ElseIf est value Vrai, le groupe de traitement du bloc est excut et le bloc If s'achve.
Publ i c Funct i on SousType2( ByVal Val eur As Var i ant ) As St r i ng

f I sAr r ay( Val eur ) Then I
SousType2 = " T
pt y( Val
abl eau"
El seI f I sEm eur ) Then
SousType2 = " Vi de"
Dat e( Val eur ) Then El seI f I s
SousType2 = " Dat e"
El seI f I sNumer i c( Val eur ) Then
I f Val eur - CI nt ( Val eur ) = 0 Then
SousType2 = " Ent i er "
El se
ousType2 = " Deci mal " S
End I f
El seI f I sEr r or ( Val eur ) Then
SousType2 = " Er r eur "
El seI f I sNul l ( Val eur ) Then
SousType2 = " Nul l "
El seI f Val eur I s Not hi ng Then
ype2 = " Not hi ng" SousT
El se
SousType2 = " Cha ne"
End I f

End Funct i on
43
Select Case
Cette syntaxe est similaire au traitement prcdent puisqu'il s'agit d'une suite d'valuation de test
dterminant le code excuter.
De la forme :
Select Case ExpressionTest
Case ExpressionList
compare une expression ou une variable une suite de valeurs :
ex2( ByVal I ndex As I nt eger ) As St r i ng
traitement
Case ExpressionList
traitement
Case Else
traitement
End Select
Dans sa forme la plus usuelle, on
unct i on EqvCol or I nd Pr i vat e F

Sel ect Case I ndex
Case 1
EqvCol or I ndex2 = " noi r "
Case 2
EqvCol or I ndex2 = " b l anc"
Case 3
EqvCol or I ndex2 = "
ase 4
r ouge"
C
EqvCol or I ndex2 = " ver t "
Case 5
EqvCol or I ndex2 = " bl eu"
Case 6
EqvCol or I ndex2 = " j
End Sel ect
aune"


End Funct i on
On peut proposer plusieurs valeurs dans l'instruction Case, soit sous forme de liste en sparant les
virgules, soit sous forme de plage l'aide du mot cl To, soit avec des oprateurs de
le mot cl Is. On peut combiner ces valeurs avec des virgules.
nt axeCase( ByVal Ar g1 As I nt eger )
valeurs par des
mparaison et co
Pr i vat e Sub Sy

Sel ect Case Ar g1
Case 0
Debug. Pr i nt " Ar g1 est nul l e"

Case 1, 2, 3
Debug. Pr i nt " Ar g1 vaut 1 ou 2 ou 3"

Case 4 To 10
Debug. Pr i nt " Ar g1 est compr i s ent r e 4 et 10 bor nes i ncl uses"

Case I s < 100
Debug. Pr i nt " Ar g1 est i nf r i eur e 100"

Case 100, 200 To 300, I s > 1000
Debug. Pr i nt " Ar g1 vaut 100, ou est compr i s dans l ' i nt er val
[ 200, 300] ou est supr i eur 1000"

Case El se
Debug. Pr i nt " t ous l es aut r es cas"
End Sel ect

End Sub
44
Vous noterez que la syntaxe 'Case Else' permet d'excuter un traitement si aucun des cas
prcdent n'a t vrai.
orsqu'on utilise des fon L ctions boolennes pour les tests ou lorsque les tests ne sont pas lis, on
utilise gnralement la syntaxe renverse Select Case True.
Pr i vat e Funct i on SousType3( ByVal Val eur As Var i ant ) As St r i ng

Sel ect Case Tr ue
ay( Val eur ) Case I sAr r
SousType2 = " Tabl eau"

Case I sEmpt y( Val eur )
SousType2 = " Vi de"

Case I sDat e( Val eur )
SousType2 = " Dat e"

Case I sNumer i c( Val eur ) And Val eur - CI nt ( Val eur ) = 0
SousType2 = " Ent i er "

Case I sNumer i c( Val eur ) ' ut i l i se l a di scr i mi nat i on du t est pr cdent
SousType2 = " Deci mal "

ase I sEr r or ( Va C l eur )
SousType2 = " Er r eur "

Case I sNul l ( Val eur )
SousType2 = " Nul l "

Not hi ng Case Val eur I s
SousType2 = " Not hi ng"
Case El se
SousType2 = " Cha ne"

End Sel ect

End Funct i on
Pour le cas ou la variable est de sous type dcimal, j'ai utilis un test dpendant de la non vracit
du test prcdent. En effet, si la variable est un entier, le cas prcdent sera vrai et le cas dcimal ne
sera pas valu, il n'y a donc bien qu'une valeur dcimale qui entrera dans le second IsNumeric.
Les blocs Select Case peuvent tre imbriqus.
ts est importante bien comprendre Cette hirarchie des tes
iscrimination peut avoir son
plus d'un niveau. D'abord car la
importance sur la qualit de fonctionnement du code, ensuite parce qu'il
isation important.
d
peut s'agir d'un lment d'optim
45
Les boucles
Les boucles ou traitements itratifs se sparent en deux familles, les traitements nombres
d'itrations finis et les boucles test. Toutes les boucles VBA tolrent la clause de sortie Exit.
ForNext
De la forme :
[Step pas]
mple classique serait :
Pr i
For compteur = dbut To fin
[traitement]
[Exit For] (clause de sortie)
[traitement]
ur] Next [compte
Un exe
vat e Funct i on Fact or i el l e( ByVal Ar g As I nt eger ) As Long

Di mcompt eur As Long
Fact or i el l e = 1
For compt eur = 1 To Ar g St ep 1
Fact or i el l e = Fact or i el l e * compt eur
Next compt eur

End Funct i on
pas vaut 1 comme Lorsque le
otation
dans cet exemple, il est gnralement omis et on trouvera la
To Ar g
n
For compt eur = 1
Fact or i el l e = Fact or i el l e * compt eur
Next compt eur
Nous pouvons parcourir une boucle en inversant le minimum et le maximum et en dclarant un

pas ngatif.
For compt eur = Ar g To 1 St ep - 1
Fact or i el l e = Fact or i el l e * compt eur
Next compt eur
Notez bien que dans ce cas, vous ne pouvez pas omettre le pas sans quoi la boucle ne sera pas
dbut, fin et pas,
lues qu'une fois lors de l'entre dans la boucle. Autrement dit, si
s peut renvoyer une valeur diffrente alors que le code est dj entr dans la boucle,
excute.
ssions en lieu et place de valeur pour les termes Vous pouvez utiliser des expre
ssions ne seront va mais ces expre
une des expression
celle-ci ne sera pas prise en compte. Regardons l'exemple suivant :
Publ i c Sub Test For ( )

i mcompt eur As Long D

compt eur = 6
For compt eur = 1 To 4 * compt eur St ep compt eur \ 3
MsgBox compt eur
Next compt eur

End Sub
icher tou Ce code va aff s les nombres impairs compris entre 1 et 24. Lors de l'entre dans la
r' vaut 6, la ligne sera interprte comme :
To 24 St ep 2
boucle, comme 'compteu
For compt eur = 1
Lors de la premire itration, 'compteur' valant alors 3, on pourrait penser que la boucle
deviendrait :
For compt eur = 1 To 12 St ep 1
46
Mais comme le
q
s expressions ne sont values que lors de l'entre dans la boucle et non lors de
cha ue itration, c'est bien la premire interprtation qui prvaudra. Notez qu'il faut viter ce type de
syntaxe, par convention, la variable de dcompte ne doit pas apparatre dans les expressions de
dfinition de la boucle.
Par contre, vous ne devez en aucun cas affecter une valeur la variable de dcompte au sein de la
boucle, sous peine de risquer la cration d'une boucle infinie comme dans l'exemple suivant :
Publ i c Sub Test For ( )

Di mcompt eur As Long

For compt eur = 1 To 4
compt eur = I I f ( compt eur > 3, 1, compt eur )
Next compt eur

End Sub
On utilise parfois ortie 'Exit F r prmatu boucle. Avant
il convient de vrifier qu'un au ne s roprie. Si
as, vou e tant la
ceConsecut i f ( )
la clause de s or' pour sorti rment de la
d'utiliser celle-ci,
est pas le c
tre type de boucle
rtie en tes
erait pas plus app
telle n' s pouvez vrifier la caus de la so variable de dcompte.
N.B : La clause de sortie positionne le curseur d'excution sur la ligne qui suit l'instruction Next
de la boucle For.
Publ i c Sub Espa

Test Sor t i e( " Ai - j e deux espaces conscut i f s dans l a cha ne" ) I f

Then
Debug. Pr i nt " oui "
End I f

End Sub

Pr i vat e Funct i on Test Sor t i e( ByVal Phr ase As St r i ng) As Bool ean

i mcompt eur As Long, TabSpl i t ( ) As St r i ng D

TabSpl i t = Spl i t ( Phr ase, " " )
For compt eur = 0 To UBound( TabSpl i t )
I f Len( TabSpl i t ( compt eur ) ) = 0 Then Exi t For
Next compt eur
= UBound( TabSpl i t ) Then I f compt eur < ' sor t i avec Exi t For
Test Sor t i e = Tr ue
End I f
End Funct i on
Ce genre de test demeure cependant assez rare puisqu'il est souvent plus pratique de grer le cas
tie, ce qui dans l'exemple prcdent s'crirait : dans le test contenant la clause de sor
Pr i vat e Funct i on Test Sor t i e( ByVal Phr ase As St r i ng) As Bool ean

Di mcompt eur As Long, TabSpl i t ( ) As St r i ng

TabSpl i t = Spl i t ( Phr ase, " " )
= 0 To UBound( TabSpl i t For compt eur )
I f Len( TabSpl i t ( compt eur ) ) = 0 Then
Test Sor t i e = Tr ue
Exi t For
End I f
Next compt eur

End Funct i on
47
DoLoop
Les boucles DoLoop, parfois appeles boucles conditionnelles utilisent un test pour vrifier s'il
ui poursuit les
s jusqu' que
sur le nombre d'itrations. Si le test est positionn en dbut de
du traitement
la fin, c'est--dire sur la mme ligne que Loop,
excut au moins une fois.
de sortie 'Exit
nditionnelles qui sont :
Traitements]
Do Until Expression
[Exit Do]
[Traitements]
Do
s
[Exit Do]
[Traitements]
pression
convient de continuer les itrations. VBA utilise deux tests diffrents While (Tant que) q
ntil (Jusqu') qui poursuit les itration itrations tant que l'expression du test est vrai ou U
vraie. l'expression du test soit
La position du test va influer
boucle, c'est--dire sur la mme ligne que le Do, il n'y aura par forcment excution
contenu dans la boucle, par contre s'il est positionn
le traitement sera toujours
Quelle que soit la construction choisie, il est toujours possible d'utiliser la clause
Do'.
uatre formes de boucles co Nous avons donc q
Do While Expression Do
Traitements Traitements Traitements Traitement
[Exit Do] [Exit Do]
[Traitements]
Loop Loop While Expression Loop Loop Until Ex
taxe quivalente la premire form
[
Vous trouverez parfois une ancienne syn
e est :
e, la boucle
onctionnellement la boucle Do WhileLoop, on n'utilise plus tellement
elle ne permet pas l'utilisation d'une clause de sortie ni le positionnement du test en
St r i ng
WhileWend. Sa form
While Expression
Traitements
Wend
Bien qu'quivalente f
cette syntaxe car
fin de boucle.
Le choix de la boucle dpend gnralement du contexte du code comme nous allons le voir dans
quelques exemples simples.
Pr i vat e Funct i on ConvAr a

beVer sRomai n( ByVal Val eur As I nt eger ) As
Do Whi l e Val eur > 0
Sel ect Case Val eur
Case I s >= 1000
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " M"
Val eur = Val eur - 1000

Case I s >= 900
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " CM"
Val eur = Val eur - 900

Case I s >= 500
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " D"
Val eur = Val eur - 500

Case I s >= 400
omai n & " CD" ConvAr abeVer sRomai n = ConvAr abeVer sR
Val eur = Val eur - 400

Case I s >= 100
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " C"
Val eur = Val eur - 100

Case I s >= 90
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " XC"
Val eur = Val eur - 90

Case I s >= 50
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " L"
48
Val eur = Val eur - 50

Case I s >= 40
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " XL"
Val eur = Val eur - 40

Case I s >= 10

ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " X"
Val eur = Val eur - 10

Case 9
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " I X"
Val eur = Val eur - 9

Case I s >= 5
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " V"
Val eur = Val eur - 5

4 Case
ConvAr abeVer s
Val eur = Val e
Romai n = ConvAr abeVer sRomai n & " I V"
ur - 4

Case El se
ConvAr abeVer sRomai n = ConvAr abeVer sRomai n & " I "
Val eur = Val eur - 1
End Sel ect
Loop
End Funct i on
but de bouc Dans ce cas, le test se met en d le puisque l'excution d'une itration ne doit avoir lieu
t, nous pourrions crire :
que si la valeur teste est suprieure 0.
ir est souvent plus subtile. De fai La nature du test chois
Unt i l Val eur = 0 Do
Et obtenir un comportement tout fait similaire. Cependant, la syntaxe While nous permet
d'li
suivant montre l'utilisation d'un test Until en fin de boucle.
Pr i vat e Funct i on Cher cher Cel l ul es( Pl ageCi bl e As Range, Val eur Cher chee As
miner aussi les valeurs ngatives alors que l'utilisation de Until ne le permet pas.
L'exemple
Var i ant ) As Range

Di mCel l ul eTr ouvee As Range, Adr esse As St r i ng
Set Cel l ul eTr ouvee = Pl ageCi bl e. Fi nd( Val eur Cher chee)
I f Not Cel l ul eTr ouvee I s Not hi ng Then
Adr esse = Cel l ul eTr ouvee. Addr ess
Do
I f Cher cher Cel l ul es I s Not hi ng Then Set Cher cher Cel l ul es =
Cel l ul eTr ouvee El se Set Cher cher Cel l ul es =
Appl i cat i on. Uni on( Cher cher Cel l ul es, Cel l ul eTr ouvee)
Set Cel l ul eTr ouvee = Pl ageCi bl e. Fi ndNext ( Cel l ul eTr ouvee)
Loop Unt i l Cel l ul eTr ouvee. Addr ess = Adr esse
End I f

End Funct i on
49
numrations & collections
Next [Elment]
Publ i
Un objet Collection est un jeu d'lments indexs auxquels il peut tre fait rfrence comme s'ils
constituaient un ensemble unique. Chaque lment d'une collection (appels membre) peut tre
retrouv l'aide de son index. Les membres n'ont pas obligatoirement le mme type de donnes, bien
que ce soit presque toujours le cas dans les collections du modle objet Excel.
Une collection prsente toujours une proprit Count qui renvoie le nombre d'lments, deux
mthodes Add et Remove qui permettent d'ajouter ou de supprimer un lment, et une mthode Item
qui permet de renvoyer un lment en fonction de son Index. L'index peut parfois tre indiffremment
un numro d'ordre et/ou un nom.
Il existe une boucle particulire qui permet de parcourir tous les lments d'une collection, la
boucle For EachNext, appele aussi numration. De la forme
For Each Elment In Collection
Traitement
[Exit For]
[Traitement]
c Sub DemoCol l ect i on( )

Di mMaCol l As New Col l ect i on, Enumer at eur As Var i ant

MaCol l . Add 1
MaCol l . Add " Dmo"
For Each Enu r I n MaCol l mer at eu
MsgBox Enumer at eur
I f I sDat u ) Then Exi t For e( Enumer at e r
Next Enumer at eur

End Sub
n grand nombre de collection, nous les reverrons donc bient
MaCol l . Add #10/ 28/ 2005#
MaCol l . Add Tr ue
Le modle objet Excel expose u t
plus en dtail.
50
Fonctions VBA
Pour f du langage proprement parler et avant de se lancer dans l'tude du modle
objet Excel, nous allons parcourir les fonctions dites intrinsques du langage. Ces fonctions
appa
ns l'architecture de l'objet VBA car cela n'a gure d'intrt
pou
us crivez vous-mme. La prsentation des fonctions qui va suivre ne sera pas
ni pour les arguments qu'elles acceptent. En effet, certaines fonctions
)
montrer les
siques'. Dans le cas o les dtails complets sur la
positionner
gnifie
inir l'tude
rtiennent l'objet VBA et font souvent partie du scope, elles n'ont donc gnralement pas besoin
d'tre qualifies
3
. Je ne rentrerais pas ici da
r la programmation d'Excel, mais sachez juste que ces fonctions s'utilisent comme les fonctions ou
procdures que vo
exhaustive ni pour les fonctions,
utilisent de nombreux paramtres optionnels (que vous pouvez passer par position ou en les nommant
et la liste qui va suivre n'a pas pour but de doublonner l'aide en ligne, mais de vous
fonctions les plus utilises avec des exemples 'clas
fonction sont ncessaires, il suffit de taper le nom de la fonction dans l'diteur de code, de
rrespondante. le curseur sur ce nom et d'appuyer sur F1 pour afficher l'aide co
Dans les modles donns, les arguments entre crochets [] sont optionnels ; la notation [] si
nt pas utiliss dans ce cours. qu'il existe d'autres arguments optionnels qui ne so
Fonctions de conversions
Conversion de type
CBool(expression) Boolean Les valeurs numriques sont convertit selon la rgle toutes
valeurs diffrentes de zro est vrai.
CByte(expression) Byte
CCur(expression) Currency
CDate(expression) Date Convertit les littraux en date, et les nombres en suivant la
rgle "Partie entire gale au nombre de jours depuis le
1/1/1900 ; partie dcimale gale au nombre de seconde depuis
minuit.
CDbl(expression) Double
CDec(expression) Decimal
CInt(expression) Integer Arrondit les dcimaux au 0.5 prs
CLng(expression) Long Arrondit les dcimaux au 0.5 prs
CSng(expression) Single
CStr(expression) String N'choue que pour les valeurs particulires Nothing,
Error
Empty,
CVar(expression) Variant N'choue jamais
Nous avons vu rapidement les fonctions de conversion de type
onctions attendent une variable ou une expression d
lors de l'tude des types de
'un type et le transforme dans un
conversion choue une erreur rcuprable est leve.

donnes. Ces f
tre type. Si la au

3
Il existe un cas dans Excel 2000 ou le compilateur dtecte une ambigut entre la fonction Left
et la proprit Left des UserForms. Il suffit d'crire VBA.Left pour dsigner la fonction et lever
l'ambigut.
51
Conversions spcifiques
CVErr
CVErr(NumErreur As integer) As Variant
Permet de renvoyer un Variant contenant l'erreur spcifie comme argument. On utilise
ns deux cas. gnralement cette fonction da
Pour diffrer le traitement

d'une erreur ou pour permettre le traitement par l'appelant, comme dans
l'exemple suivant
Publ i c Sub Tr ai t ement ( )

, MaCel l Di mFi chi er Log As St r i ng As Range, Reponse As Var i ant

e1. t xt " Fi chi er Log = " d: \ user \ l i st
For Each MaCel l I n Thi sWor kbook. Wor
ment I s Not hi n
ksheet s( 1) . UsedRange. Cel l s
I f Not MaCel l . Com g Then
Reponse = Aj out eAuFi chi
I f I sEr r or ( Reponse) Then
er ( Fi chi er Log, MaCel l . Comment . Text )

Sel ect Case CI nt ( Reponse)
Case 53
MsgBox " Fi chi er i nt r ouvabl e"

Case 55
MsgBox " Fi chi er dj ouver t "

End Sel ect
End I f
End I f
Next MaCel l

End Sub
Pr i vat e Funct i on Aj out eAuFi chi er ( ByVal Chemi n As St r i ng, ByVal Aj out As
t
Er r eur
or Append As #1
ut
Cl ose #1
Aj out eAuFi chi er = Tr ue
Exi t Funct i on
Er r eur :
Er r . Cl ear
End Funct i on
On l'utilise aussi p ction
personnalise de feuille
Publ i c Funct i on ConvPSI 2Pascal ( ByVal Cel l ul e As Range) As Var i ant
our renvoyer des erreurs dans la cellule de calcul lorsqu'on crit une fon
de calcul.

El se
ConvPSI 2Pascal = 6894. 757 * Cel l ul e. Val ue
End I f

End Funct i on

St r i ng) As Var i an

On Er r or GoTo
Open Chemi n F
Pr i nt #1, Aj o
Aj out eAuFi chi er = CVEr r ( Er r . Number )
I f Not I sNumer i c( Cel l ul e. Val ue) Or I sEmpt y( Cel l ul e. Val ue) Then
ConvPSI 2Pascal = CVEr r ( xl Er r Num)
52
Val
l(string As Strin
La fonction Val une chane comme une valeur numrique. Elle lit les
ers la droite et arrte l'interprtation ds qu'un caractre ne peut plus tre
omme une p
Publ i c Sub Test V
Va g) As type numrique
cherche interprter
caractres de la gauche v
interprt c artie d'un nombre.
al ( )

Di mNombr e As Doubl e
" 121" )
Debug. Pr i nt Nombr e ' r envoi e 121
Nombr e = Val ( " 121. 10" )
Debug. Pr i nt Nombr e ' r envoi e 121. 1
Nombr e = Val ( " 121. 10er p" )
Debug. Pr i nt Nombr e ' r envoi e 121. 1
Nombr e = Val ( " a121" )
Debug. Pr i nt Nombr e ' r envoi e 0

Nombr e = Val (
End Sub
m Format, For at$
nt [, format] as String, [] ) As Variant
en chane formate selon
argument format soit des lments prdfinis, soit la construction
Format(expression As Varia
Format$(expression As Variant [, format] as String, [] ) As String
La fonction format cherche transformer une valeur ou une expression
l'argument de mise en forme.
e Cette fonction accepte comm
de spcification de formatage personnalise.
Les chanes prdfinies utilisables sont
Argument format Description
des nombres rels, affichage de la
S'il n'y a pas de partie
ple 4/3/93. S'il n'y a pas de
emple, 05:34 PM. Le
mtres de votre systme.
e.
rme la langue de
at dfini dans votre systme.
Affichage de l'heure complte selon le format dfini dans votre systme,
comprenant les heures, les minutes et les secondes.
Medium Time Affichage de l'heure dans un format de 12 heures en utilisant les heures et les
minutes ainsi que les indicateurs AM/PM.
Short Time Affichage de l'heure au format de 24 heures, par exemple 17:45.
General Number Affichage du nombre sans sparateur de milliers.
Currency Affichage du nombre avec un sparateur de milliers, le cas chant ; affichage
de deux chiffres droite du sparateur dcimal. Le rsultat est fonction des
paramtres rgionaux de votre systme.
Standard Affichage de la date et/ou de l'heure. Pour
date et de l'heure, par exemple 4/3/93 05:34 PM.
dcimale, affichage de la date seulement, par exem
partie entire, affichage de l'heure seulement, par ex
format de la date est dtermin par les para
Long Date Affichage de la date complte selon le format dfini dans votre systm
Medium Date Affichage de la date selon le format intermdiaire confo
l'application hte.
Short Date Affichage de la date abrge selon le form
Long Time
53
Argument format Description
Fixed fichage d'au moins un chiffre gauche et de deux chiffres droite du
Stan
Per Affichage d'un nombre multipli par 100 suivi du signe pourcentage (%) ;
affichage automatique de deux chiffres droite du sparateur dcimal.
Yes/No ffichage de Non si le nombre est 0 ; sinon affichage de Oui.
Tru si le nombre est 0 ; sinon affichage de Vrai.
On/
reprendrais pas la liste ici. Vous trouverez
ceux igne.
es :
Pub
Af
sparateur dcimal.
dard Affichage d'un nombre avec sparateur de milliers et d'au moins un chiffre
gauche et de deux chiffres droite du sparateur dcimal.
cent
Scientific Utilisation de la notation scientifique standard.
A
e/False Affichage de Faux
Off Affichage de Inactif si le nombre est 0 ; sinon affichage de Actif.
Les codes personnaliss tant assez nombreux, je n'en
-ci dans l'aide en l
Quelques exempl
l i c Sub Test For mat ( )

Di mCha i ng, Nombr e As Doubl e, UneDat e As Dat e ne As St r

Cha ne = " Avec Casse"
Nombr e = " 1253. 124"
UneDat e = #1/ 16/ 1967 8: 15: 00 PM#

Debug. Pr i nt For mat ( Cha ne, " <" ) ' avec casse
Debug. Pr i nt For mat ( Cha ne, " >" ) ' AVEC CASSE
Debug. Pr i nt For mat ( Cha ne, " @@@@@! " ) ' Casse

D " ) ' 1 253. 12 ebug. Pr i nt For mat ( Nombr e, " St andar d
ebug. Pr i nt For mat ( Nombr e, " Per cent " D ) ' 125312. 40%
Debug. Pr i nt For mat ( Nombr e, " Sci ent i f i c" ) ' 1. 25E+03
Debug. Pr i nt For mat ( Nombr e, " 0. 00" ) ' 1253. 12

Debug. Pr i nt For mat ( UneDat e, " Long Dat e" ) ' l undi 16 j anvi er 1967
Debug. Pr i nt For mat ( UneDat e, " Shor t Dat e" ) ' 16/ 01/ 1967
Debug. Pr i nt For mat ( UneDat e, " Long Ti me" ) ' 20: 15: 00
Debug. Pr i nt For mat ( UneDat e, " ddd dd/ mm/ yyyy" ) ' l un. 16/ 01/ 1967
Debug. Pr i nt For mat ( UneDat e, " ww" ) ' 3
Debug. Pr i nt For mat ( UneDat e, " h: mm" ) ' 20: 15



End Sub
54
Conversion de valeur
Hex, Hex$
Hex(number As Variant) As Variant
Hex$ number As Variant As String ( )
Convertit un nombre dcimal en Hexadcimal. L'argument 'number' doit renvoyer un nombre
le plus proche. Notez que :
s le code, prfixs par &H. Par exemple
entier sinon le rsultat sera arrondi l'entier
Hex(Null) = Null
Hex(Empty)=0
Les nombres hexadcimaux sont parfois utiliss dan
&H10 vaut 16.
Oct, Oct$
Oct(number As Variant) As Variant
Oct$(number As Variant) As String
Convertit un nombre dcimal en Octal. L'argument 'number' doit ren
ondi l'entier le plus proche. Notez que :
voyer un nombre entier sinon
ull
pty)=0
le rsultat sera arr
Oct(Null) = N
Oct(Em
Les nombres octaux sont parfois utiliss dans le code, prfixs par &O. Par exemple &O10 vaut
8.
Int, Fix
number As Variant) As Variant Int(
Fix(number As Variant) As Variant
. Autrement dit, Int(-7.3)
vaut -8 alo ut -7.
La manipulation des dates et des heures est souvent problmatique du fait de la mthode de
stockage des dates et des diffrences de format de dates entre le systme anglo-saxon et le notre.
dci
900 celui-ci tant
compt.
tte reprsentation numrique est souvent appele "numro de
srie" ou la partie entire est le numro de srie de la date et la partie dcimale celui de l'heure.
Toutes les reprsentations du temps tant sous forme de date, il n'existe pas de reprsentation de
dure sous forme de temps suprieure 23:59:59, hors artifice de formatage. Ainsi vous pouvez
afficher la valeur 24:00:00 dans une cellule Excel en appliquant le format [h]:mm:ss, mais vous verrez
que la valeur relle de la cellule sera 02/01/1900 00:00:00.
Une fois que vous avez l'esprit ce mode de stockage, la manipulation des dates ne pose pas plus
de difficult qu'autre chose.
Renvoie la partie entire de l'argument. Pour les valeurs positives, Int et Fix renvoient la mme
valeur, pour les valeurs ngatives, Int renvoie le premier entier ngatif infrieur ou gal number,
alors que Fix renvoie le premier entier ngatif suprieur ou gal number
rs que Fix(-7.3) va
Fonctions de Date & Heure
Pour s'affranchir de cet aspect international, Excel stocke les dates sous formes d'un nombre
mal composite dfinit comme :
Une partie entire reprsentant le nombre de jours couls depuis le 01/01/1
Une partie dcimale reprsentant le nombre de secondes depuis 00 h 00 min 00 s, ramene 1
jour (c'est dire le temps en seconde / 86400 s de la journe)
Cette mthode de stockage permet de limiter la taille de stockage des dates et de pouvoir utiliser
l'arithmtique dcimale sur les dates. Ce
55
Prenons l'exemple suivant :
Test ( ) Sub

Di mDat e1 , ETemps As Dat e, TempSec As Doubl e As Dat e, EDat e As Dat e
Di mHeur e As Long, Mi nut e As Long, Seconde As Long

Dat e1 = #10/ 22/ 2002 2: 02: 21 PM#
EDat e = CLng( Dat e1
Dat e1 - I
)
ETemps =
Debug. Pr
nt ( Dat e1)
i nt " Dat e : " & EDat e & " - > N sr i e : " & CLng( EDat e) &
vbNewLi ne
' Dat e : 23/ 10/ 2002 - > N sr i e : 37552
ETemps & " - > Debug. Pr i nt " Heur e : " &
N s
N sr i e : " & CDbl ( ETemps)
' Heur e : 14: 02: 21 - > r i e : 0. 5849653
TempSec = Round( CDbl ( ETemps) *
Sec \ 3600
86400)
Heur e = Temp
Mi nut e = ( TempSec - Heur e * 36
TempSec - ( Heur e * 3
00) \ 60
Seconde =
Debug. Pr i nt
600) - Mi nut e * 60
Heur e & " : " & Mi nut e & " : " & Seconde
' 14: 2: 21

End Sub
Noton ce code fonctionne parce qu'on utilise un arrondi pour retrouver le temps en s toutefois que
seconde et non une troncature.
Rcupration du temps systme
Date, Date$
Renvoie la date systme, Date renvoie un variant alors que Date$ renvoie une chane de
caractres. La chane renvoye par Date$ est au format international.
Time, Time$
Renvoie l'heure systme, Time renvoie un Variant alors que Time$ renvoie une chane de
caractres.
Timer
Renvoie une valeur de type Single reprsentant le nombre de secondes coules depuis minuit.
e Int(Timer). Notez que Round(Time) renvoie la mme valeur qu
Now
Renvoie la date et l'heure systme (Variant). Beau
r rcuprer le temps systme pou
coup de dveloppeurs utilisent cette fonction
r viter la confusion entre les fonctions Date, dans tous les cas pou
Time, et les instructions du mme nom.
56
Fonctions de conversions
DateValue, TimeValue
On utilise gnralement la fonction de conversion CDate pour convertir une chane ou une
expression en date. Cependant lorsque la valeur contient une information de date et de temps et qu'on
ne souhaite rc
ateValue et/ou
uprer qu'une des deux informations, il peut tre plus efficace d'utiliser les fonctions
TimeValue. D
Sub Test ( )

Di msDat e As St r i ng
0 dcembr e 2002 2: 14: 17 PM" sDat e = " 1
Debug. Pr i nt CDat e( sDat e)
2 14: 14: 17 ' 10/ 12/ 200
Debug. Pr i nt Dat eVal ue( sDat e)
' 10/ 12/ 2002
Debug. Pr i nt Ti meVal ue( sDat e)
' 14: 14: 17

End Sub
DateSerial
DateSeria Integer, day As Integer) As Variant
Debug. Pr i nt
l(year As Integer, month As
Renvoie le numro de srie de la date correspondant aux arguments passs.
Par exemple :
Dat eSer i al ( 2002, 10, 22)
' 22/ 10/ 2002
Attention, il n'y a pas de contr sur le passs, seul l'appartenance la plage
des valeurs autorises pour les dates e le.
Autrement dit, on peut saisir des sup les jours et suprieures 12 pour
les mois, voire des valeurs ngatives.
Sub Test ( )
les els parti s arguments
st contr
s valeur rieures 31 pour
2002, 10 Debug. Pr i nt Dat eSer i al ( , 22)
' 22/ 10/ 2002
g. Pr i nt Dat Debu eSer i al ( 2002, 10, 33)
' 02/ 11/ 2002
Debug. Pr i nt Dat eSer i al ( 2002, 11, 33)
' 03/ 12/ 2002
Debug. Pr i nt Dat eSer i al ( 2002, 14, 33)
' 05/ 03/ 2003
Debug. Pr i nt Dat eSer i al ( 2002, 15, 33)
' 02/ 04/ 2003
Debug. Pr i nt Dat eSer i al ( 2002, 36, 33)
' 02/ 01/ 2005
Debug. Pr i nt Dat eSer i al ( 2002, - 36, 33)
' 02/ 01/ 1999

End Sub
Nous reviendrons sur le fonctionnement de
ic
cette fonction lors de l'tude de la fonction DateAdd
N.B : Vous noterez que la demande d'aff hage de la fonction DateSerial par Debug.Print renvoie
une date et non un numro de srie. Ceci provient du fait que la valeur renvoy est un variant d'abord
interprt comme une date. Vous devez le rcuprer dans une variable de type Long pour rcuprer le
numro de srie.
57
TimeSerial
Tim
y a pas
de c
Sub Te
eSerial(Hour As Integer, minute As Integer, second As Integer) As Variant
Renvoie le numro de srie de l'heure correspondant aux arguments passs. La encore, il n'
ontrles partiels des arguments mais juste l'obligation que le rsultat soit dans la plage des dates
valides.
st ( )
Ti meSer i al ( 12, - 10, 52)
arque que pour la fo
n
F s spc
e sous form
tat

Debug. Pr i nt Ti meSer i al ( 12, 10, 52)
' 12: 10: 52
Debug. Pr i nt
' 11: 50: 52
Debug. Pr i nt Ti meSer i al ( 18, 90, 81)
' 19: 31: 21
Debug. Pr i nt Ti meSer i al ( 22, 120, 52)
' 31/ 12/ 1899 00: 00: 52

End Sub
N.B : Mme rem nction DateSerial
Fonctions d'extractio
onction ifiques
Les fonctions spcifiques renvoient un lment de la dat e d'un Integer.
NomFonction(date As Date) As Integer
Nom de la
fonction
Rsul
Day 1 < R < 31
Month 1 < R < 12
Year 100 < R < 9999
Hour 0 < R < 23
Minute 0 < R < 59
Seconde 0 < R < 59
kDay
La fonction WeekDay umro d' ur dans la
semaine par rapport la base donne en argument.
Weekday(date As Date, [firstdayofweek]) As Integer
La constante eek' nne la base pour le d . Si c'est un jour spcifique, cela
veut dire que ce numro de srie 1, si c'est la ba me, cela dpendra des paramtres
internationaux (norm France), si le param omis la base sera le dimanche
Vous trouv des constantes dans l'tude de la fonction suivante.
Sub Test ( )
renvoie un n ordre correspondant la position du jo
'firstdayofw do compte
jour aura le
alement le lundi en
se syst
tre est
erez le tableau
t e As Dat e
nt Day( M )
nt Year ( M e)
Wee
Di mMaDa
MaDat e = #10/ 22/ 2002 5: 14: 26 PM#
Debug. Pr i aDat e ' 22
Debug. Pr i nt Mont h( MaDat e) ' 10
Debug. Pr i aDat ' 2002
Debug. Pr i nt Hour ( MaDat e) ' 17
Mi nut e( MaDat e) ' 14 Debug. Pr i nt
Debug. Pr i nt Second( MaDat e) ' 26
Debug. Pr i nt Weekday( MaDat e, vbSunday) ' 3
Debug. Pr i nt Weekday( MaDat e, vbMonday) ' 2
Debug. Pr i nt Weekday( MaDat e, vbUseSyst emDayOf Week) ' 2
End Sub
58
DatePart
Cette fonction renvoie des informations sur la date en fonction des arguments passs.
DatePart(interval As Stringl, date As Date[,firstdayofweek, firstweekofyear]]) As Integer
L'argument interval est une chane prdfinie dfinissant le type d'information que l'on souhaite
rcup ut pr s valeurs : rer. Elle pe endre le
Valeur Valeur retourne
yyyy An e n 100 x 9999
q Trimestre 1 x 4
m Mois 12 1 x
Information
y Jour de l'anne 1 x 366
d Jour 1 x 31
w Jour de la semaine 1 x 7 : Sensible l'argument firstdayofweek
ww Semaine 1 x 53 : Sensible l'argument firstweekofyear
h Heure 0 x 23
n Minute 0 x 59
s Seconde 0 x 59
L'argument firstdayofweek dfinit quel jour de la semaine aura le numro de srie 1. Il n'
tions, sauf dans certaines combinaison
est pas
s avec
de semaine. Lorsqu'il est omis, c'est le
semaine. Il peut prendre comme valeurs une
ncessaire de le prciser pour rcuprer d'autres informa
l'argument firstweekofyear pour dterminer le numro
dimanche qui sera considr comme le premier jour de la
stantes suivantes : des con
Constante Valeur Description
vbUseSystem 0 Dfinit par les paramtres internationaux systme
vbSunday 1 Dimanche (valeur par dfaut)
vbMonday 2 Lundi
vbTuesday 3 Mardi
vbWednesday 4 Mercredi
vbThursday 5 Jeudi
vbFriday 6 Vendredi
vbSaturday 7 Samedi

59
L'argument firstweekofyear pr
ro de srie 1. Il n'est utile de
cise le mode de dfinition de la semaine de l'anne ayant le
num le prciser que lorsqu'on veut extraire le numro de srie de la
semaine. L mis, ce paramtre prend la semaine du 1
er
Janvier comme semaine numro 1.
En France c mme
vale
orsqu'il est o
'est la premire semaine de 4 jours qui a le numro de semaine. Il peut prendre co
ur une des constantes suivantes :
Constante Valeur Description
vbUseSystem 0 Dfinit par les paramtres internationaux systme
vbFirstJan1 1 Semaine du 1
er
janvier (valeur par dfaut).
vbFirstFourDays 2 Premire semaine comportant au moins quatre jours dans l'anne nouvelle.
vbFirstFullWeek 3 Premire semaine complte de l'anne.
Quelques exemples d'utilisation :
Sub Test ( )

Di mMaDat e As Dat e
5: 14: 26 PM# MaDat e = #10/ 22/ 2002

" yyyy" , MaDat e) ' 200 Debug. Pr i nt Dat ePar t ( 2
Debug. Pr i nt Dat ePar t ( " q" , MaDat e) ' 4
" m" , MaDat e) ' 10 Debug. Pr i nt Dat ePar t (
Debug. Pr i nt Dat ePar t ( " y" , MaDat e) ' 295
" d" , MaDat e) ' 22

Debug. Pr i nt Dat ePar t (
Debug. Pr i nt Dat ePar t ( " w" , MaDat e) ' 3
bMonday) Debug. Pr i nt Dat ePar t ( " w" , MaDat e, v
g. Pr i nt Dat ePar t ( " ww" , MaDat e) '
' 2
Debu

43
Debug. Pr i nt Dat ePar t ( " ww" , MaDat e, vbMonday, vbFi r st Ful l Week) ' 42
Debug. Pr i nt Dat ePar t ( " h" , MaDat e) ' 17
Debug. Pr i nt Dat ePar t ( " n" , MaDat e) ' 14
. Pr i nt Dat ePar t ( " s" , MaDat e) ' 26 Debug

End Sub

60
Fonctions de calculs
DateAdd
Pe
Dat ring, number As Long, date As Date)
r, cette
tion DatePart.
e nombre d'intervalles. Une valeur dcimale sera arrondie l'entier
ngendrera une soustraction.

rmet d'ajouter ou de soustraire un intervalle de temps sur une date. De la forme :
eAdd(interval As St
L'argument interval est une chane prdfinie dterminant l'intervalle de temps ajoute
ane peut prendre les mmes valeurs que celles de la fonc ch
La valeur number dtermine l
le plus proche. Une valeur ngative e
sation : Quelques exemples d'utili
Sub Test ( )
Di mMaDat e As Dat e
MaDat e = #1/ 31/ 2002 5: 14: 26 PM#
bug. Pr i nt Dat eAdd( " s" , 40, MaDat e) De
' 31/ 01/ 2002 17: 15: 06
Debug. Pr i nt Dat eAdd( " n" , - 15, MaDat e)
2 16: 59: 26 ' 31/ 01/ 200
Debug. Pr i nt Dat eAdd( " w" , 5, MaDat e)
' 05/ 02/ 2002 17: 14: 26
t Dat eAdd( " y" , - 1992, MaDat e) Debug. Pr i n
' 18/ 08/ 1996 17: 14: 26
Debug. Pr i nt Dat eAdd( " m" , 25, MaDat e)
' 29/ 02/ 2004 17: 14: 26
Debug. Pr i nt Dat eAdd( " h" , 40, MaDat e)
' 02/ 02/ 2002 09: 14: 26
" yyyy" , - 1992, MaDat e) Debug. Pr i nt Dat eAdd(
' Er r eur hor s de l a pl age des dat es
End Sub
mme vous le voyez, la fonction est assez Co simple d'emploi. Quelques remarques sont toutefois
nsquence
uit un
a que 30 jours (ou 28) c'est le dernier jour du mois qui sera renvoy. Il en sera
our les annes bissextiles avec le littral "yyyy".
Sub
ncessaires :
Il n'est pas possible de travailler sur un nombre dcimal d'intervalles. Pour obtenir une
modification quivalente vous pouvez soit imbriquer les fonctions DateAdd, soit les
utiliser en succession.
L'emploi des littraux "d", "w", "y" est quivalent pour l'ajout ou la soustraction de jour.
Lorsque l'intervalle est dfini par "m", "yyyy", "q", il ne peut pas avoir pour co
d'engendrer la modification d'une autre partie de la date. Autrement dit, si vous ajoutez
des mois ou des trimestres une date dont le jour est 31 et que le rsultat cond
mois qui n'
de mme p
Test ( )

Di mMaDat e As Dat e
MaDat e = #1/ 31/ 2000 5: 14: 26 PM#
Debug. Pr i nt Dat eAdd( " n" , 30, Dat eAdd( " h" , 2, MaDat e) )
' 29/ 02/ 2000 19: 44: 26
MaDat e = Dat eAdd( " h" , 2, MaDat e)
Debug. Pr i nt Dat eAdd( " n" , 30, MaDat e)
' 29/ 02/ 2000 19: 44: 26
Debug. Pr i nt Dat eAdd( " yyyy" , 1, MaDat e)
' 28/ 02/ 2001 19: 14: 26
Debug. Pr i nt Dat eAdd( " m" , 12, MaDat e)
' 28/ 02/ 2001 19: 14: 26
Debug. Pr i nt Dat eAdd( " q" , 1, MaDat e)

End Sub
61
Une bonne pratique de cette fonction permet de mieux comprendre le fonctionnement de la
erial que nous avons vu prcdemment. Nous allons crire notre propre fonction
r mieux le voir.
fonction DateS
rial pou DateSe
Cet exemple va nous emmener un petit peu loin, si vous dbutez le VBA vous pouvez
continuer l'tude de la fonction suivante.
Notre fonction sera :
Publ i c Funct i on Not r eDat eSer i al ( ByVal Annee As I nt eger , ByVal Moi s As
I nt eger , ByVal J our As I nt eger ) As Var i ant

Di mBaseDat e As Dat e
seDat e = #1/ 31/ 1999# Ba
' Test sur l ' anne
Sel ect Case Annee
Case I s > 100 ' af f ect at i on de l ' anne
BaseDat e = Dat eAdd( " yyyy" , - 1 * ( 1999 - Annee) , BaseDat e)

Case I s <= 0 ' soust r ai r e l a base
BaseDat e = Dat eAdd( " yyyy" , Annee, BaseDat e)

Case El se ' l i r e comme Base + Annee - 100
BaseDat e = Dat eAdd( " yyyy" , Annee - 100, BaseDat e)

End Sel ect
' al l er au der ni er j our de novembr e et aj out er Moi s
BaseDat e = Dat eAdd( " m" , 10 + Moi s, BaseDat e)
' si l ' anne est une af f ect at i on, enl ever un an
I f Annee > 100 Then BaseDat e = Dat eAdd( " yyyy" , - 1, BaseDat e)
' aj out er l es j our s
BaseDat e = Dat eAdd( " d" , J our , BaseDat e)
Not r eDat eSer i al = BaseDat e

End Funct i on
Pourquoi un code aussi complexe. Comme nous l'avons dit au cours de l'tude de la fonction
DateSerial, il n'y a pas de contrle unitaire des arguments passs. Co
lenche pas d'erreur si on lui passe une valeur d'ann
ntrairement une ide reue,
e infrieure 100. En fait,
ne date en interne, dfini au dernier jour de novembre 1999. Je ne dis pas au 30
la date interne.
base ayant 31 jours ce qui
tel que nous l'avons vu prcdemment.
DateSerial ne dc
ateSerial gre u D
Novembre car DateSerial renverra le 31 dcembre si vous ajoutez un mois
onc par une date de Pour pouvoir grer cette condition, je passe d
its de l'ajout avec l'argument "m", utilisera les propr
DateDiff
Renvoie la di
ateDiff(interval As Strin
ffrence entre deux dates dans l'intervalle spcifi. De la forme :
g, date1 As Date, date2 As Date[, firstdayofweek[, firstweekofyear]]) As
e.
quoique trs pratique est un peu pigeuse car la notion d'intervalle de temps va
D
Long
O l'argument interval est une chane prdfinie prcisant l'unit de temps de la valeur retourn
Elle peut prendre les mmes valeurs que pour la fonction DatePart.
Cette fonction
dpendre de paramtres plus numriques que logiques.
62
Regardons le code suivant :
Sub Test ( )

Debug. Pr i nt Dat eDi f f ( " d" , Dat eVal ue( " 27/ 02/ 2002" ) ,
Dat eVal ue( " 31/ 12/ 2002" ) ) ' 307
Debug. Pr i nt Dat eDi f f ( " yyyy" , Dat eVal ue( " 27/ 02/ 2002" ) ,
Dat eVal ue( " 31/ 12/ 2002" ) ) ' 0
Debug. Pr i nt Dat eDi f f ( " d" , Dat eVal ue( " 31/ 12/ 2002" ) ,
Dat eVal ue( " 15/ 01/ 2003" ) ) ' 15
Debug. Pr i nt Dat eDi f f ( " yyyy" , Dat eVal ue( " 31/ 12/ 2002" ) ,
Dat eVal ue( " 15/ 01/ 2003" ) ) ' 1

Debug. Pr i nt Dat eDi f f ( " d" , Dat eVal ue( " 02/ 02/ 2002" ) ,
Dat eVal ue( " 28/ 02/ 2002" ) ) ' 26
Debug. Pr i nt Dat eDi f f ( " m" , Dat eVal ue( " 02/ 02/ 2002" ) ,
Dat eVal ue( " 28/ 02/ 2002" ) ) ' 0
Debug. Pr i nt Dat eDi f f ( " d" , Dat eVal ue( " 28/ 02/ 2002" ) ,
Dat eVal ue( " 01/ 03/ 2002" ) ) ' 1
Debug. Pr i nt Dat eDi f f ( " m" , Dat eVal ue( " 28/ 02/ 2002" ) ,
Dat eVal ue( " 01/ 03/ 2002" ) ) ' 1

End Sub
Comme vous le voyez, une diffrence de 300 jours renverra une diffrence de 0 annes alors
ois.
devez
fonction DateDiff en ayant bien l'esprit le mode de calcul utilis. Pour viter les
gnralement un retour dans la plus petite unit de l'lment (jours pour la date,
mps) afin d'avoir la dure la plus juste possible.
qu'une diffrence de 15 jours peut renvoyer un intervalle de 1 anne. Il en est de mme avec les m
est se fait sur la valeur des lments composant la date compars un un. Vous De fait le t
onc utiliser la d
erreurs, on utilise
conde pour le te se
Si Date1 est postrieure Date2, la fonction DateDiff renvoie un nombre ngatif.
Exemples classiques d'utilisation

Publ i c Funct i on Fi nDuMoi s( ByVal D As Dat e) As Dat e
Fi nDuMoi s = Dat eSer i al ( Year ( D) , Mont h( D) + 1, 0)
End Funct i on

Publ i c Funct i on Debut Semai ne( ByVal D As Dat e) As Dat e
Debut Semai ne = D - Weekday( D) + 7
End Funct i on

Publ i c Funct i on Fi nSemai ne( ByVal D As Dat e) As Dat e
Fi nSemai ne = D - Weekday( D) + 7
End Funct i on

Publ i c Funct i on Est Bi ssext i l e( ByVal Annee As Long) As Bool ean
Est Bi ssext i l e = Annee Mod 4 = 0 And ( Annee Mod 100 <> 0 Or Annee Mod
400 = 0)
End Funct i on

Publ i c Funct i on Nombr eMemeJ our ( ByVal Dat e1 As Dat e, ByVal Dat e2 As Dat e,
J our As VbDayOf Week) As I nt eger
Nombr eMemeJ our = Dat eDi f f ( " ww" , Dat e1, Dat e2, J our )
End Funct i on

Publ i c Funct i on Dur ee( ByVal Dat e1 As Dat e, ByVal Dat e2 As Dat e) As Dat e
Dur ee = Dat eDi f f ( " s" , Dat e1, Dat e2) / 86400
End Funct i on

63
Publ i c Funct i on Annee As I nt eger ) As Dat e Di manchePaques( ByVal
al gor i t hme de Oudi n
i mG As I nt eger , C As I nt ege
'
D r , C_4 As I nt eger , E As I nt eger
Di mH As I nt eger , K As I nt eger , P As I nt eger , Q As I nt eger
Di mI As I nt eger , B As I nt eger , J 1 As I nt eger , J 2 As I nt eger
Di mR As I nt eger

G = Annee Mod 19


C = Annee \ 100
C_4 = C \ 4
E = ( 8 * C + 13) \ 25
H = ( 19 * G + C - C_4 - E + 15) Mod 30
K = H \ 28
P = 29 \ ( H + 1)
Q = ( 21 - G) \ 11
I = ( K * P * Q - 1) * K + H
B = Annee \ 4 + Annee
J 1 = B + I + 2 + C_4 - C
J 2 = J 1 Mod 7
R = 28 + I - J 2

I f R <= 31 Then

Di manchePaques = Dat eVal ue( CSt r ( R) & " / 3/ " & CSt r ( Annee) )
El se
Di manchePaques = Dat eVal ue( CSt r ( R - 31) & " / 4/ " & CSt r ( Annee) )
End I f

End Funct i on

Pub i es( ByVal Annee As I nt eger ) As Var i ant l i c Funct i on J our sFer

ReDi mJ our sFer i es( 1 To 11)
J our sFer i es( 1) = Dat eSer i al ( Annee, 1, 1) ' 1er j anvi er
J our sFer i es( 2) = Dat eAdd( " d" , 1, Di manchePaques) ' l undi de paques
J our sFer i es( 3) = Dat eSer i al ( Annee, 5, 1) ' 1er Mai
J our sFer i es( 4) = Dat eSer i al ( Annee, 5, 8) ' vi ct oi r e 1945
J our sFer i es( 5) = Dat eAdd( " d" , 39, Di manchePaques) ' j eudi ascensi on
J our sFer i es( 6) = Dat eAdd( " d" , 50, Di manchePaques) ' l undi pent ecot e
J our sFer i es( 7) = Dat eSer i al ( Annee, 7, 14) ' f t e nat i onal e
J our sFer i es( 8) = Dat eSer i al ( Annee, 8, 15) ' assompt i on
J our sFer i es( 9) = Dat eSer i al ( Annee, 11, 1) ' t oussai nt
i ce 14- 18 J our sFer i es( 10) = Dat eSer i al ( Annee, 11, 11) ' ar mi st
Noel J our sFer i es( 11) = Dat eSer i al ( Annee, 12, 25) '

End Funct i on
64
Fonctions de fichiers
Les fonctions de manipulation de fichiers que nous allons voir sont incluses dans le VBA. Il ne
s'agit pas ici des mthodes de manipulation de la bibliothque d'objet Excel, ni de celle de la librairie
Office. Je ne parlerais pas non plus dans ce cours de la manipulation de la librairie FileSystemObject.
Le terme fonctions est d'ailleurs un peu usurp puisqu'en l'occurrence on utilisera aussi des
rs et celles sur les
e de fichier
instructions.
Les oprations sur les fichiers se divisent en deux, celles sur le systme de fichie
fichiers.
Systm
ChDir
Change le rpertoire courant.
ChDir path As String
Le rpertoire dsign par Path doit forcment exister. L'instruction ChDir change le rpertoire
as le lecteur par dfaut. Si le lecteur n'est pas spcifi dans Path, la commande par dfaut mais p
s'applique au lecteur par dfaut.
ChDrive
Change le lecteur courant
ChDrive Drive As String
CurDir
Renvoie le chemin courant
CurDir[(drive)]
Si l'argument drive est omis, c'est le chemin par dfaut du lecteur par dfaut qui est renvoy sinon
c'est celui du lecteur spcifi.
Dir
Pour les vieux qui ont connu le doux temps de MS-DOS, cette fonction ne prsentera pas de
ipulation.
gnriques. Selon sa nature, il permettra d'utiliser la fonction Dir diffremment.
Attrib asque binaire acceptant les composants suivants :
difficults de man
Dir[(pathname[, attributes])]
Pathname est un argument facultatif qui doit dsigner un chemin existant, acceptant des
caractres
utes est un m
Valeur Constante Description
vbNormal 0 (Par dfaut) Spcifie les fichiers sans attributs.
vbReadOnl cifie les fichiers accessibles en lecture seule ainsi que les fichiers sans attributs. y 1 Sp
vbHidden 2 Spcifie les fichiers cachs ainsi que les fichiers sans attributs.
vb e les fichi System 4 Spcifie les fichiers systme ainsi qu
intosh.
ers sans attributs. Non disponible sur le
Mac
vbVolume 8 Spcifie un nom de volume ; si un autre attribut est spcifi, la constante vbVolume
est ignore. Non disponible sur Macintosh.
vbDirectory 16 Spcifie les dossiers ainsi que les fichiers sans attributs.
vbArchive 32 Spcifie les fichiers modifis ainsi que les fichiers sans attributs.
65
Dans oie un nom de fichier ou de rpertoire lorsqu'elle trouve une
correspondance avec les arguments passs ou une chane vide dans le cas contraire. Lorsque plusieurs
fich Un nouvel
appe ent suivant, et ainsi de suite jusqu' l'obtention
d'un nombreuses, aussi allons nous voir deux exemples
ment.
iste sans utiliser le contrle d'erreur.
ByVal Chemi n As St r i ng) As Bool ean
l'absolu, Dir renv
iers ou dossiers rpondent aux arguments, Dir renvoie le premier lment de la liste.
l la fonction Dir sans argument renverra l'lm
Les possibilits d'emplois sont e chane vide.
classiques d'utilisation pour mieux comprendre son fonctionne
permet de vrifier si un fichier ex La premire application
Pr i vat e Funct i on Fi l eExi st (

ue I f Len( Di r ( Chemi n) ) > 0 Then Fi l eExi st = Tr

End
La fonction se base sur le principe de la fonction D
Funct i on
ir qui renvoie le nom de fichier pass en
rsque celui-ci existe. La mme fonction peut se faire avec les rpertoires.
Pr i vat e st ( ByVal Reper t oi r e As St r i ng) As Bool ean
argument lo
Funct i on Fol der Exi

I f Len( Di r ( Reper t oi r e, vbDi r ect or y) ) > 0 Then Fol der Exi st = Tr ue

End Funct i on
Le rpertoire peut ventuellement se terminer par "\" ou non.
te des fichiers d'un rpertoire en prcisant
ven bre de fichiers.
Pr i
La deuxime fonction consiste rcuprer la lis
tuellement un masque de recherche. La fonction renvoie aussi le nom
vat e Funct i on Li st eFi chi er ( ByVal Reper t oi r e As St r i ng, ByRef Col l As
Col l ect i on, Opt i onal ByVal Pat t er n As St r i ng = " *. *" ) As I nt eger

I f Ri ght ( Reper t oi r e, 1) <> " \ " Then Reper t oi r e = Reper t oi r e & " \ "
I f Di r ( Reper t oi r e & " \ " ) = " " Then Exi t Funct i on
Di mMonFi chi er As St r i ng
MonFi chi er = Di r ( Reper t oi r e & Pat t er n, vbAr chi ve Or vbNor mal Or
vbReadOnl y)
Do Whi l e Len( MonFi chi er ) > 0
Col l . Add ( Reper t oi r e & MonFi chi er )
= Li st eFi chi er + 1 Li st eFi chi er
MonFi chi er = Di r
Loop
End Funct i on
Vous noterez que la liste des fichiers sera place dans un argument collection pass p
Vous noterez galement que le code teste l'absence d'un caractre antislash final et l'ajoute le c
ar rfrence.
as
chant.
FileAttr
onction GetAttr. La fonction FileAttr renvoie le
mod s souvent.
Cette fonction est souvent confondue avec la f
e d'ouverture d'un fichier ce qui n'est pas utile tr
FileCopy
Copie le fichier pass comme argument source dans destination. Les deux arguments doivent
comprendre le nom du fichier, mais pas ncessairement le mme.
FileCopy source As String, destination As String
Pr i vat e Sub Test 1( )

Fi l eCopy " d: \ svg\ essai . t xt " , " d: \ svg\ j mar c\ essai . t xt " ' val i de
Fi l eCopy " d: \ svg\ essai . t xt " , " d: \ svg\ j mar c\ nouveau. t xt " ' val i de
Fi l eCopy " d: \ svg\ essai . t xt " , " d: \ svg\ j mar c\ " ' er r on

End Sub
66
FileDateTime
comme argument.
s String) As Date
Renvoie la date et l'heure de dernire modification du fichier pass
FileDateTime(pathname A
Par exemple
Debug. Pr i nt Fi l eDat eTi me( " d: \ svg\ essai . t xt " )
' 20/ 10/ 2002 21: 35: 13
FileLen
Renvoie la taille du fichier, en octets, pass en argument.
FileLen(pathname As String) As Long
Debug. Pr i nt Fi l eLen( " d: \ svg\ wi n32api . t xt " )
' 667988
GetAttr & SetAttr
La fonction SetAttr dfinie les attributs du fichier pass comme premier argument l'aide du
second argument. La fonction GetAttr renvoie un masque binaire des
ul un fichier puis va relire ces
Sub Test At t r i but ( )
masque binaire pass comme
attributs du fichier pass en argument.
SetAttr PathName As String, Attributes As VbFileAttribute
leAttribute GetAttr(pathname As String) As VbFi
Les attributs sont les mmes que ceux donns pour la fonction Dir.
t va donner les attributs fichier cach et lecture se L'exemple suivan
attributs.
Pr i vat e

i mMesAt D t r i but s As VbFi l eAt t r i but e, msg As St r i ng, ReadI nt As I nt eger

MesAt t r i but s = MesAt t r i but s Or vbHi dden
MesAt t r i but s = MesAt t r i but s Or vbReadOnl y
MesAt t r i but s = MesAt t r i but s Or Get At t r ( " d: \ svg\ essai . t xt " )
Set At t r " d: \ svg\ essai . t xt " , MesAt t r i but s
MesAt t r i but s = 0
MesAt t r i but s = Get At t r ( " d: \ svg\ essai . t xt " )
Do Whi l e MesAt t r i but s > 0
I nt ( Log( MesAt t r ReadI nt =
sg
i but s) / Log( 2) )
msg = m & Choose( ReadI nt + 1, " vbReadOnl y" , " vbHi dden" ,
" vbSyst em" , " " , " " , " vbAr chi ve" , " vbAl i as" ) & vbNewLi ne
MesAt t r i but s = MesAt t r i but s - 2 ^ ReadI nt
Loop
ox m MsgB
End Sub
sg
Dans cet exemple, on obtient comme rponse :

Cela vient du fait que la troisime ligne de code a associ les attributs dj existants aux attributs
ajouts par le code. Sans cette ligne, l'attribut archive aurait t effac.
67
Kill
Supprime le ou les fichiers en fonction de l'argument.
Kill
Si p aractres
gn
pathname As String
rim. Si, pathname contient des c athname dsigne un fichier, celui ci sera supp
riques, tous les fichiers correspondant seront supprims.
MkDir & RmDir
La fon toire dans le rpertoire pass comme argument, ou dans le lecteur
par
Le r
Pub
ction MkDir cre un rper
dfaut si l'argument est omis.
rtoire pass en argument. Celui-ci peut tre un chemin relatif. La fonction RmDir supprime le rpe
pertoire cible ne doit pas contenir de fichier ni tre le chemin courant.
ir pathname As String MkD
RmDir pathname As String
Les deux procdures suivantes illustrent les manipulations du systme de fichier.
l i c Sub Cr eat i on( )

Di mFi i ch er As St r i ng
Fi chi e = r " d: \ user \ t ut os\ codemot eur . t xt "
i s I f Not o F l der Ex t ( " d: \ user \ t ut os\ demo\ " ) Then
Di " d: \ user \ t ut os\ demo\ " Mk r
Fi l eCopy Fi chi er , " d: \ user \ t ut os\ demo\ code. t xt "
ChDr i ve " D"
ChDi r " d: \ user \ t ut os\ demo\ "
End I f

End Sub

Publ i c u S b Suppr essi on( )
Di I f t \ demo" , vbText Compar e) = 0 Then S r Comp( Cur r , " d: \ user \ t ut os
i mCol l Fi chi er As New Col l ec D t i on, NbFi chi er As I nt eger , st r Fi chi er
As Var n i a t
NbFi chi er = Li st eFi chi er ( Cur Di r , Col l Fi chi er , " *. *" )
I f NbFi chi er > 0 Then
For Each st r Fi chi er I n Col l Fi chi er
Next
End I f
ChDi r " d: \ user \ t ut os"
RmDi r " d: \ user \ t ut os\ demo"
End I f
End Sub
Le code de suppression pourrait tre plus simple puisqu'il suffirait de faire :
Ki l l st r Fi chi er


Kill CurDir & "\*.*"
N.B : Bien que a n'ait rien voir avec le sujet qui nous intresse, vous noterez que l'numrateur
strFichi que nous sachions pertinemment que la collection ne er est dclar comme Variant bien
contient que des chanes. En VBA, l'numrateur ne peut tre que de type Variant ou Object.
68
Manipulation de fichier
Les fonctions standard de manipulation de fichiers permettent l'accs trois
L'accs binaire Utilis surtout pour rduire la taille des fichiers.
types de fichiers :
toire Utilis pour une manipulation proche des SGBD.
ntiel Gre les fichiers texte.
s.
L'accs ala
L'accs sque
Nous allons voir succinctement les diffrentes instructions et fonctions de manipulation de
fichiers, puis un exemple de lecture criture pour les trois types d'acc
L'instruction Open
Pour pouvoir manipuler un fichier, il va forcment falloir commencer par l'ouvrir ou le crer.
L'instruction Open est de la forme :
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
O
Pa signe le fichier ouvrir ou crer si l'argument reprsente un fichier qui n'existe
d Ouvre un fichier texte (squentiel) en mode ajout
Ouvre un fichier en accs binaire
n fichier en accs alatoire
Ac igne le type d'accs pour le mode binaire, tel que :

s les accs autoriss
Verrouill en lecture
Write verrouill en criture
ns
Le longueur des enregistrements en mode alatoire ou ventuellement la taille du
fichiers en mode alatoire avec la taille de
l'enr
1. iture
Open
thname d
pas lors d'une opration d'criture.
Mode dsigne le mode d'accs tel que :
Appen
Binary
Input Ouvre un fichier texte (squentiel) en mode lecture
Output Ouvre un fichier texte (squentiel) en mode criture
Random Ouvre u
cess ds
Read
Write
Read Write
Lock dsigne les restrictions d'accs pour les autres processus
Shared tou
Lock Read
Lock
Lock Read Write Verrouill
Filenumber est le numro de fichier compris entre 1 et 255 pour les fichiers restreints et entre
256 511 pour les fichiers accessibles aux autres applicatio
n est la
tampon en mode squentiel
Prsent com la, a a l'air un peu tordu, cependant vous allez voir que c'est ass mple. me ce ez si
Gnralement on utilise des fichiers restreints l'application ce qui fait qu'on ne prcise pas la
clause Lock.
Le paramtre Len n'est utilis que pour les
egistrement.
Ce qui va nous ramener quelques syntaxes, que nous pourrions lister comme suit :
Ouvrir un fichier texte en cr
" d: \ user \ t ut os\ t ext e. t xt " For Out put As #1
2. Ouvrir un fichier texte en Ajout
Open " d: \ user \ t ut os\ t ext e. t xt " For Append As #1
n lecture 3. Ouvrir un fichier texte e
Open " d: \ user \ t ut os\ t ext e. t xt " For I nput As #1
4. Ouvrir un fichier en mode alatoire
Open " d: \ user \ t ut os\ r andom. dat " For RandomAs #1 Len=Len( TypeEnr eg)
5. Ouvrir un fichier binaire en criture
Open " d: \ user \ t ut os\ bi nai r e. dat " For Bi nar y Access Wr i t e As #1
6. Ouvrir un fichier binaire en lecture
Open " d: \ user \ t ut os\ bi nai r e. dat For Bi nar y Access Read As #1
69
videmment dans certains cas, il est intressant de grer le paramtre Lock, ce qui pourrait donner
par
Ope
exemple :
n " d: \ user \ t ut os\ t ext e. t xt " For Append Lock Wr i t e As #1
FreeFile
Renvoie le prochain numro de fichier libre. L'argument pass ventuellement permet de forcer
l'attributio nte ou de la zone ouverte.
Fre
y sans tenir compte de la zone, s'il vaut
1 un
udent d'appeler la fonction FreeFile que d'utiliser un numro en dur.
n d'un numro de la zone restrei
eFile[(rangenumber)] As Integer
Si rangenumber est omis, le prochain numro sera renvo
numro de la zone restreinte sera renvoye (1 255), s'il vaut 2 ce sera un numro de la zone
ouverte (256 511).
Il est toujours plus pr
Close
Ferme le fichier dsign par le numro pass comme argument.
EOF
Renvoie vrai quand la fin d'un fichier ouvert en mode squentiel ou alatoire est atteinte.
Attention, l'argument qui dsigne le numro de fichier n'attend pas le caractre #, on devra donc
crire EOF(1) et non EOF(#1).
LOF
Renvoie la taille en octets d'un fichier ouvert.
LOF(filenumber As integer) As Long
Rcuprer la taille du fichier permet de calculer le nombre d'enregistrements ou de dimensionner
un tampon de rception.
Loc
Renvoie une valeur de type Long indiquant la position du dernier octet lu ou crit en mode
binaire, ou du dernier enregistrement lu ou crit en mode alatoire
Seek
Comme tout cela pouvait paratre trop simple, il existe une instruction Seek et une fonction Seek.
La fonction Seek fonctionne exactement de la mme manire que la fonction Loc que nous
venons de voir, l'instruction Seek permet de dplacer la position de lecture dans un fichier ouvert. De
la forme :
Seek [#]filenumber As integer, position As long
O filenumber est le numro de fichier et position la position de lecture criture du fichier ouvert.
Instructions d'criture
Dans les fichiers texte, on utilise soit l'instruction Print #, soit l'instruction Write #.
Nous n'allons pas aborder ici l'utilisation de Print # car elle est plutt utilise pour les sorties
formates ce qui nous entranerait un peu loin. La fonction Write # suit la forme :
Write #filenumber, [outputlist]
O filenumber est le numro de fichier et outputlist la liste des expressions crire dans le fichier
spar
il dans l'aide
en l
Si outputlist est omis, l'instruction crit une ligne vide dans le fichier, les valeurs numriques
n'autorise que le point comme sparateur dcimal, les chanes sont entoures de guillemets et enfin que
la fonction insre un saut de ligne la fin du dernier lment de outputlist.
es par une virgule.
Il y a des rgles d'utilisation de la fonction Write # que vous pouvez obtenir en dta
igne, mais ayez l'esprit que :
70
L'instruction Put est utilise pour l'criture des fichiers binaires et alatoires. De la forme :
quant la position de
crire.
tude de cas
Put [#]filenumber, [recnumber], varname
O filenumber est le numro de fichier, recnumber un argument facultatif indi
l'opration d'criture et varname la valeur
Nous verrons des exemples d'utilisation de ces instructions dans les codes de l'
ant ce chapitre. conclu
Instructions de lecture
La fonction Input # est un peu la fonction inverse de Write #.
Input #filenumber, varlist
La fonction rcupre dans le fichier des valeurs spares par des virgules pour les af
variables de l'argument varlist. Les variables doivent tre correctement types et les entres
correctement dlimites.
ut # lit le f
fecter aux
du fichier
ichier par ligne pour affecter la ligne lue dans une variable de type
, varname
ction Get lit la ou les donnes du fichier ouvert partir de la position ventuellement
pe alatoire.
La fonction Line Inp
String.
Line Input #filenumber
La fon
prcise pour l'affecter la variable passe en argument.
Get [#]filenumber, [recnumber], varname
En mode alatoire, recnumber correspond au numro d'enregistrement alors qu'en mode binaire il
s'agit de l'octet.
Je vous invite vivement lire l'aide si vous voulez manipuler des fichiers de ty
Exemples
Nous allons ici nous livrer quelques exemples de manipulations de fichiers dans divers mode
afin de mieux comprendre le fonctionnement des accs aux fichiers. Notre fichier Excel est de la
forme suivante :

Nous allons stocker et/ou relire ses donnes en utilisant ce que nous venons de voir.
Commenons par convertir ce fichier Excel en fichier texte.
71
Le code le plus simple serait :
Pr i vat e Const Chemi n As St r i ng = " D: \ user \ t ut os\ excel \ "

Publ i c Sub Ecr i r eFi chi er Text e( )

Di mNumFi chi er As I nt eger , compt eur As Long

NumFi chi er = Fr eeFi l e
Open Chemi n & " t ext e. t xt " For Out put As #NumFi chi er
For compt eur = 3 To Range( " dat a" ) . Rows. Count + 2
Wr i t e #NumFi chi er , Cel l s( compt eur , 1) . Val ue, Cel l s( compt eur ,
2) . Val ue, Cel l s( compt eur , 3) . Val ue, Cel l s( compt eur , 4) . Val ue,
Cel l s( compt eur , 5) . Val ue, Cel l s( compt eur , 6) . Val ue, Cel l s( compt eur ,
7) . Val ue, Cel l s( compt eur , 8) . Val ue, Cel l s( compt eur , 9) . Val ue,
Cel l s( compt eur , 10) . Val ue
Next compt eur
Cl ose #1

End Sub
Le code est simple crire, pas trop lisible et le fichier rsultant encore moins, ce qui n'est pas
si c'est pour l'utiliser avec Excel puisque comme nous le verrons dans l'tude du modle bien grave
objet Excel, il existe des mthodes intgres pour lire directement ce type de fichier. Par contre
l'criture d'une fonction serait un peu plus complexe puisque s'il est possible d'affecter directement des
valeurs de cellules dans l'instruction Write #, cela n'est pas autoris avec Input #.
Il existe plusieurs faons de contourner ce problme. Globalement, il existe trois solutions de
lecture du fichier, donne par donne, ligne par ligne ou lecture unique.
Regardons d'abord la premire solution. Celle-ci repose sur le fait que nous connaissions
globalement le format de fichier, notamment le fait qu'il y ait dix colonnes de valeurs. Nous pourrions
alors crire :
Publ i c Sub Li r eFi chi er Text e( )

Di mNumFi chi er As I nt eger , cmpt Li gne As Long, cmpt Col As Long, Recup As
Var i ant

NumFi chi er = Fr eeFi l e
Open Chemi n & " t ext e. t xt " For I nput As #NumFi chi er
Wi t h Wor ksheet s( " Feui l 1" ) . Range( " A1" )
Do Unt i l EOF( 1)
I nput #Nu
et ( cm
mFi chi er , Recup
. Of f s
cmpt Co
pt Li gne, cmpt Col ) . Val ue = Recup
l = cmpt Col + 1
I f cmpt Col > 9 Then
cmpt Col = 0
cmpt Li gne = cmpt Li gne + 1
End I f

Loop
End Wi t h
Cl ose #1

End Sub
Bien que fonctionnel, ce code prsuppose un format ce qui est toujours un peu dangereux. Nous
allons donc prfrer une lecture globale, plus rapide qu'une approche par ligne et qui elle ne
prsuppose pas de format. Nous allons pour cela utiliser la fonction Split qui dcoupe des chanes
selon un sparateur. Cette fonction sera tudie un peu plus loin lors de l'tude des fonctions de
chanes.
72
Publ i c Sub Li r eFi chi er Text e( )

Di mNumFi chi er As I nt eger , TabLi gne( ) As St r i ng, t abCol ( ) As St r i ng,
Recup As St r i ng
mcmpt 1 As Long, cmpt 2 As Long Di

NumFi chi er = Fr eeFi l e
Open Chemi n & " t ext e. t xt " For Bi nar y Access Read As #NumFi chi er
Recup = St r i ng( LOF( NumFi chi er ) , " " )
, Recup Get #NumFi chi er ,
Cl ose #NumFi chi er
Wi t h Wor ksheet s( " Feui l 1" ) . Range( " A1" )
TabLi gne = Spl i t ( Recup, vbCr Lf )
For cmpt 1 = 0 To UBound( TabLi gne)
t abCol = Spl i t ( TabLi gne( cmpt 1) , " , " )
For cmpt 2 = 0 To UBound( t abCol )
. Of f set ( cmpt 1, cmpt 2) . Val ue = t abCol ( cmpt 2)
Next cmpt 2
Next cmpt 1
End Wi t h

End Sub
Si vous regardez les lignes de lecture du fichier, vous allez vous dire que je vous prends pour des
mon mode texte alors que j'effectue une lecture binaire du fichier. Pour pouvoir
e fichier en une seule rcupration, c'est pourtant la mthode la plus simple. On
dim charge tout le fichier dans ce tampon.
du fichier texte pour augmenter la lisibilit de
nir
nnes sauvegarder. videmment, c'est le cas dans notre exemple
te dans un type utilisateur.
jambons avec
rcuprer l
ensionne un tampon de la taille du fichier et on
Il y a videmment d'autres techniques d'criture
celui-ci ou pour contourner les problmes de sparateur mais ceci sort du cadre de notre cours.
ail en mode alatoire. Celui-ci n'a de sens que si vous pouvez obte Regardons maintenant le trav
ucture rptable dans les do une str
puisque chaque ligne peut tre dcri
Publ i c Type Enr egi st r ement
LaDat e As Dat e
Temp1 As Si ngl e
Temp2 As Si ngl e
Temp3 As Si ngl e
Temp4 As Si ngl e
Vi t esse As I nt eger
St at us As Bool ean
Pol l uant As Byt e
RPAM As Long
End Type
Vous noterez que notre type n'a que neuf champs alors que le fichier 10 colonnes. Pour des
premiers champs en un seul raisons de taille et de simplicit, nous avons tout intrt runir les deux
puisque les deux informations peuvent tre contenues dans le mme champ.
73
Une fois le type cr, le code d'criture est extrmement simple.
Publ i c Sub Ecr i r eFi chi er Al eat oi r e( )

Di mNumFi chi er As I nt eger , compt eur As Long, MyEnr As Enr egi st r ement

NumFi chi er = Fr eeFi l e
Open Chemi n & " al eat oi r e. dat " For RandomAs #NumFi chi er Len =
Len( MyEnr )
For compt eur = 3 To Range( " dat a" ) . Rows. Count + 2
Wi t h MyEnr
. LaDat e = Cel l s( compt eur , 1) . Val ue + Cel l s( compt eur , 2) . Val ue
. Temp1 = Cel l s( compt eur , 3) . Val ue
. Temp2 = Cel l s( compt eur , 4) . Val ue
. Temp3 = Cel l s( compt eur , 5) . Val ue
. Temp4 = Cel l s( compt eur , 6) . Val ue
. Vi t esse = Cel l s( compt eur , 7) . Val ue
. St at us = Cel l s( compt eur , 8) . Val ue
. Pol l uant = Cel l s( compt eur , 9) . Val ue
. RPAM = Cel l s( compt eur , 10) . Val ue
End Wi t h
Put #NumFi chi er , , MyEnr
Next compt eur
Cl ose #NumFi chi er

End Sub
imple. Le e
Publ i c u
cod de relecture serait tout aussi s
S b Li r eFi chi er Al eat oi r e( )

Di N As Long, MyEnr As Enr egi st r ement m umFi chi er As I nt eger , compt eur
Di N m bEnr As I nt eger

Nu i mF chi er = Fr eeFi l e
Open Chemi n & " al eat oi r e. dat " For RandomAs #NumFi chi er Len =
Len( My r En )
NbEnr = LOF( 1) \ Len( MyEnr )
Fo c
Get #NumFi chi er , , MyEnr
Wi t h Wor ksheet s( " Feui l 1" )
. Cel l s( compt eur , 1) . Val ue = Dat eVal ue( MyEnr . LaDat e)
. Cel l s( compt eur , 2) . Val ue = Ti meVal ue( MyEnr . LaDat e)
. Cel l s( compt eur , 3) . Val ue = MyEnr . Temp1
r ompt eur = 1 To NbEnr

. Cel l s( compt eur , 4) . Val ue = MyEnr . Temp2
. Cel l s( compt eur , 5) . Val ue = MyEnr . Temp3
. Cel l s( compt eur , 6) . Val ue = MyEnr . Temp4
. Cel l s( compt eur , 7) . Val ue = MyEnr . Vi t esse
. Cel l s( compt eur , 8) . Val ue = MyEnr . St at us
. Cel l s( compt eur , 9) . Val ue = MyEnr . Pol l uant
. Cel l s( compt eur , 10) . Val ue = MyEnr . RPAM
End Wi t h
Next compt eur
Cl ose #NumFi chi er

End Sub
Notons toutefois que structurer les donnes pour le mode alatoire n'a pas tellement de sens pour
effectuer uniquement un travail de lecture / criture dans Excel. Le mode alatoire prsente surtout un
intrt parce qu'il est possible de lire ou crire facilement un enregistrement sans devoir agir sur tout le
fichier.
L'exemple suivant va nous carter du sujet de base, si vous dbutez le VBA vous pouvez
continuer l'tude des fonctions d'information.
74
On utilise de moins en moins les fichiers sous forme binaire, pourtant cela peut prsenter un
nralement pour diminuer la taille du fichier afin d'allger la charge de sa
en l'absence du code de codage/dcodage, les donnes qu'il contient sont
allons nous livrer ici un petit exercice de style qui va nous permettre de
code appliqu.
ce comme souvent dans le dveloppement va consister observer et rflchir.
r efficacement dans le sens qui nous convient, en l'occurrence pour rduire la
ut bien avoir l'esprit la taille des types de donnes.
cifications pour l'criture d'un fichier binaire. Vous pouvez utiliser n'importe
e pour peu que vous soyez capable de dcoder sans perte d'information. Les
sens' dans un fichier binaire puisqu'on ne raisonne in fine que sur des octets.
premire constatation qui s'impose est que la date ne
e ligne on
atures suivantes prsentent les mmes caractristiques. Il s'agit de
ns la
sion n'est jamais infrieure la
s d'encodage.
prature "T" (Byte)
nteger)
corriges (Integer)
s boolennes, qui normalement
nous l'avons vu avec les masques binaires, il est
ichier sera donc
intrt certain. On l'utilise g
arce qu' communication, et p
inexploitables. Nous
manipuler un peu de
Le premier exerci
Pour pouvoir travaille
taille de stockage, il fa
Il n'existe pas de sp
e de codag quel princip
nnes n'ont pas de ' do
Si nous observons le fichier exemple, la
change pas et que chaque ligne est spare d'une seconde de la prcdente. Autrement dit, en
connaissant la date et le temps de dpart, l'cart de temps entre deux lignes et le nombre d
j rcrire entirement les deux premires colonnes. peut d
Les quatre colonnes de tempr
chiffres dcimaux un chiffre aprs la virgule, relativement petits (<100). Si nous observo
nt peu ( < 15). Enfin dans la colonne vitesse, nous constatons qu'il s'agit de nombres entiers varia
ier relativement grand mais dont la prci dernire colonne, il s'agit d'ent
centaine. Avec tout cela, nous allons pouvoir dfinir nos rgle
Notre fichier va donc commencer par une ligne d'entte contenant :
Le nombre de ligne (Integer)
& l'heure du premier pas (Double) La date
La frquence des pas (Byte).
s de tem Le diviseur des colonne
La valeur minimum du rgime (I
Le multiplicateur RPAM (Byte).
L'criture se fera ensuite par ligne, comme suit :
Temp1, Temp2, Temp3, Temp4
vitesse (Byte)
Polluants (Byte)
RPAM corrige (Integer)
Reste traiter le cas de la voie Status. Celle-ci contient des valeur
se stockent sur deux octets. Cependant, comme
parfaitement possible de stocker huit valeurs boolennes dans un octet. La fin du f
compose des valeurs de la colonne Status regroupes par 8.
75
Le code d'criture du fichier va tre :
Pr i vat e EnumMasque
Li gne1 = 1
Li gne2 = 2
Li gne3 = 4
Li gne4 = 8
Li gne5 = 16
Li gne6 = 32
Li gne7 = 64
Li gne8 = 128
End Enum

Publ i c Sub Ecr i r eFi chi er Bi nai r e( )

Di mNumFi chi er As I nt eger , compt eur As Long
Di mMi nRegi me As I nt eger , St at us As Masque, NbLi gne As I nt eger

NumFi chi er = Fr eeFi l e
Open Chemi n & " bi
****c
nai r e. dat " For Bi nar y Access Wr i t e As #NumFi chi er
' ********** r i t ur e de l ' ent t e************
' nombr e de l i gnes
NbLi gne = CI nt ( Range( " dat a" ) . Rows. Count )
Put #NumFi chi er , , CI nt ( Range( " dat a" ) . Rows. Count )
' dat e de dpar t
Put #NumFi chi er , , CDbl ( Cel l s( 3, 1) . Val ue + Cel l s( 3, 2) . Val ue)
' Fr quence
Put #NumFi chi e
seur Temp
r , , CByt e( 1)
' Di vi
Put #N
r at ur e
umFi chi er , , CByt e( 10)
' Regi me mi ni mum
Mi nRegi me = Appl i cat i on. Wor ksheet Funct i on. Mi n( Range( " Dat a" ) . Of f set ( ,
6) . Resi ze( , 1) )
Put #NumFi chi er , , Mi nRegi me
' Mul t i pl i cat eur RPAM
Put #NumFi chi er , , CByt e( 100)
' **************f i n cr i t ur e de l ' ent t e************
' **************cr i t ur e des donnes************
For compt eur = 3 To NbLi gne + 2
' t empr at ur es *10
Val ue * 10) Put #NumFi chi er , , CI nt ( Cel l s( compt eur , 3) .
r , , CI nt ( Cel l s( compt eur , 4) . V Put #NumFi chi e al ue * 10)
Put #NumFi chi er , , CI nt (
i er , , CI nt (
Cel l s( compt eur , 5) . Val ue * 10)
Put #NumFi ch Cel l s( compt eur , 6) . Val ue * 10)
' Del t a r egi me
mFi chi er , , CByt e Put #Nu ( Cel l s( compt eur , 7) . Val ue - Mi nRegi me)
' l e st at us ser a t r ai t apr s
' pol l uant s
Put #NumFi chi er , , CByt e( Cel l s( compt eur , 9) . Val ue)
' RPAM / 100
Put #NumFi chi er , , CI nt ( Cel l s( compt eur , 10) . Val ue \ 100)
Next compt eur
' dbut du t r ai t ement de l a voi e st at us, r egr oupement par 8 val eur s

76
For compt eur = 3 To NbLi gne + 2 St ep 8
Wi t h Cel l s( compt eur , 8)
s I f . Val ue Then St at us = St at u Or Li gne1
I f . Of f set ( 1) . Val ue Then St at us = St at us Or Li gne2
I f . Of f set ( 2) . Val ue Then St at us = St at us Or Li gne3
I f . Of f set ( 3) . Val ue Then St at us = St at us Or Li gne4
I f . Of f set ( 4) . Val ue Then St at us = St at us Or Li gne5
I f . Of f set ( 5) . Val ue Then St at us
us
= St at us Or Li gne6
I f . Of f set ( 6) . Val ue Then St at = St at us Or Li gne7
I f . Of f set ( 7) . Val ue Then St at us = St at us Or Li gne8
End Wi t h
Put #NumFi chi er , , CByt e( St at us)
St at us = 0
Next compt eur
Cl ose #NumFi chi er

End Sub
Et le code de lecture :
Pr i vat e EnumMasque
Li gne1 = 1
Li gne2 = 2
Li gne3 = 4
Li gne4 = 8
Li gne5 = 16
Li gne6 = 32
Li gne7 = 64
Li gne8 = 128
End Enum

Publ i c Sub Li r eFi chi er Bi nai r e( )

Di mNumFi chi er As I nt eger , compt eur As Long, RecupI nt As I nt eger ,
RecupByt e As Byt e
Di mMi nRegi me As I nt eger , St at us As Masque, NbLi gne As I nt eger
Di mFr equence As Byt e, Di vTemp As Byt e, Mul t RPAM As Byt e, Dat eDep As
Dat e

NumFi chi er = Fr eeFi l e
Open Chemi n & " bi nai r e. dat " For Bi nar y Access Read As #NumFi chi er
' **************l ect ur e de l ' ent t e************
' nombr e de l i gnes
Get #NumFi chi er , , NbLi gne
' dat e de dpar t
Get #NumFi chi er , , Dat eDep
' Fr quence
Fr equence Get #NumFi chi er , ,
Tempr at u ' Di vi seur r e
Get #NumFi chi er , ,
' Regi me mi ni mum
Di vTemp

Get #NumFi chi er , , Mi nRegi me
' Mul t i pl i cat eur RPAM
Get #NumFi chi er , , Mul t RPAM
' **************f i n l ect ur e de l ' ent t e************

77
' **************l ect ur e des donnes**************
W 1) i t h Wor ksheet s( " Feui l 1" ) . Cel l s( 1,
For compt eur = 0 To NbLi gne - 1
' r econst r uct i on du t emps
. Of f set ( compt eur , 0) . Val ue = Dat eVal ue( Dat eDep)
. Of f set ( compt eur , 1) . Val ue = Dat eAdd( " s" , compt eur * Fr equence,
Ti ( Dat e meVal ue Dep) )
' r cup des t emp es
. Of f set ( c ur , 2) . V RecupI nt / Di vTemp
. Of f set ( c ur , 3) . V RecupI nt / Di vTemp
. Of f set ( c ur , 4) . V RecupI nt / Di vTemp
. Of f set ( c ur , 5) . V RecupI nt / Di vTemp
' r cupr a de l a vi
Get #NumF r , , Rec
' on i gnor t us pour t ant
' pol l ua
Get #Nu r , , RecupByt
r at i on r at ur
Get #NumFi chi er , , RecupI nt
ompt e al ue =
Get #NumFi chi er , , RecupI nt
ompt e al ue =
Get #NumFi chi er , , RecupI nt
ompt e al ue =
Get #NumFi chi er , , RecupI nt
ompt e al ue =
t i on t esse
i chi e upByt e
. Of f set ( compt eur , 6) . Val ue = Mi nRegi me + RecupByt e
e st a l ' i ns
nt s
mFi chi e e
. Of f set ( compt eur , 8) . Val ue = RecupByt e
' RPAM
Get #NumFi chi er , , RecupI nt
. Of f set ( compt eur , 9) . Val ue = CLng( RecupI nt ) * Mul t RPAM
Next compt eur
For compt eur = 0 To NbLi gne - 1 St ep 8
Get #NumFi chi er , , RecupByt e
St at us = RecupByt e



. Of f set ( compt eur , 7) . Val ue = 1 El se I f St at us And Li gne1 Then
f set ( compt eur , 7) . Val ue = 0 . Of
I f St at us And Li gne2 Then . Of f set ( compt eur + 1, 7) . Val ue = 1
e . Of f set ( compt eur + 1, 7) . Val ue = 0 El s
t us And Li gne3 Then . Of f set ( compt eur + 2, 7) . Val ue = 1 I f St a
El se . Of f set ( compt eur + 2, 7) . Val ue = 0
ur + 3, 7) . Val ue = 1 I f St at us And Li gne4 Then . Of f set ( compt e
l ue = 0 El se . Of f set ( compt eur + 3, 7) . Va
at us And Li gne5 I f St Then . Of f set ( compt eur + 4, 7) . Val ue = 1
e . Of f set ( compt eur + 4, 7) . Val ue = 0 El s
I f St at us And Li gne6 Then . Of f set ( compt eur + 5, 7) . Val ue = 1
El se . Of f set ( compt eur + 5, 7) . Val ue = 0
I f St at us And Li gne7 Then . Of f set ( compt eur + 6, 7) . Val ue = 1
El se . Of f set ( compt eur + 6, 7) . Val ue = 0
I f St at us And Li gne8 Then . Of f set ( compt eur + 7, 7) . Val ue = 1
El se . Of f set ( compt eur + 7, 7) . Val ue = 0
Next compt eur
End Wi t h
Cl ose #NumFi chi er

End Sub
La taille du fichier binaire ainsi obtenu et cinq fois plus petite que celle du fichier texte
prcdemment vu, pour un traitement minimum.
78
Fonctions d'informations
s variants Ces fonctions regroupent principalement les fonctions d'identification de sous type de
ou de type d'une expression, dcrites dans le tableau ci-dessous.
m de la No
fonction
rray Variable Boolen
Argument Type renvoy Commentaire
IsA Vrai si la variable est un tableau.
IsDate Expression Boolen Vrai si l'expression peut tre interprte comme
une date
IsEmpty Expression Boolen Vrai si l'expression renvoie Empty ou si la
variable n'a pas t initialise
IsError ion Boolen Vrai si l'exression est une valeur d'erreur Express
IsM fcultatif est manquant issing Argument Boolen Vrai si l'argument
I olen Vrai si l'expression vaut Null sNull Expression Bo
IsNumeric Expression Boolen Vrai si l'expression peut tre interprt comme
un nombre
IsObject Expression Boolen Vrai si l'expression est un objet
Typ Renvoie le nom du sous type de la variable eName Variable String
VarType Variable e(int) Renvoie une co le sous type
de la variable
VbVarTyp nstante entire selon
Fonctions de couleur
Les co le mode RGB (Red Green Blu 'est--dire o chaque cou
identifie par un re dfinie par l'intensit ses compo
et bleues. C peut prendr t 255. On c
une
Valeur = 65536 * Bleu

uleurs sont gres selon e), c leur est
e valeur enti relative de santes rouges, vertes
haque composante e une valeur entre 0 e alcule partir de cela
valeur entire (de type Long) telle que :
Rouge + 256 * Vert +
On reprsente souvent cette valeur en hexadcimal puisque du fait des dcalages de 256, on peut
voir les valeurs des composantes juste en lisant la valeur hexa.
QBColor
Renvoie une couleur prdfinie en fonction de l'argument pass.
QBColor(color As Integer) As Long
L'argument color doit tre compris entre 0 et 15.
QB Long Hex
0 0 0
1 8388608 800000
2 32768 8000
1376 808000
32896 8080
6 C0C0C0
4 808080
0
2
3
5
3 842
4 128 80
5 8388736 800080
6
7
8
1263225
842150
9 16711680 FF0000
1
11
65280 FF00
16776960 FFFF00
1 255 FF
1
14
16711935 FF00FF
65535 FFFF
1 16777215 FFFFFF

79
RGB
Renvoie une v ouleur on asses en argument.
RGB(red As en As ge
Si un argum valeur 255
Fonct ter ti
Ces foncti s fo tio utres programmes ou le
systme. La p lles te
ventuellement nous les dtaillerons par la suite si nous en avons besoin.
Environ
aleur de c en f ction des trois composantes p
Integer, gre Inte r, blue As Integer) As Long
ent dpasse la il est ramen cette valeur.
ions d'in ac ons
ons regroupent le nc ns d'interaction avec l'utilisateur, d'a
lupart d'entre e sor nt du cadre de ce cours et ne seront pas tudies ici.

Renvoie la valeur d'une des variables d'environnement du systme.
Environ(envstring) As Variant
L'argument envstring est le nom bre qui
reprsente la position de la variable dans la table d'environnement. Les variables peuvent diffres
d'un poste l'autre, si une variable n' n nulle sera renvoye.
Quelques exemples d'argument
ALLUSERSPROFILE
A CommonProgramFiles
COMPUTERNAME
ComSpec FP_NO_HOST_CHECK
HOMEDRIVE
HOMEPATH LOGONSERVER
NUMBER_OF_PROCESSORS
OS Path
PATHEXT
P SOR_ARCHITECTURE PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_
SESSIONNAME
S ystemRoot
TEM
USERPROFILE windir
de la variable dsire. Il peut tre ventuellement un nom
est pas trouve, u
accepts :
e chane de longueur
PPDATA
ROCES
REVISION ProgramFiles
ystemDrive S
P
TMP USERDOMAIN
USERNAME
InputBox
Affiche une bote de saisie l'utilisateur et renvoie la saisie ventuelle.
vide. Nous
une autre
InputBox(prompt[, title] [, default] [, xpos] [, ypos]) As Variant
O prompt est le message affich dans la bote, Title son titre, default la valeur par dfaut de la
zone de saisie, xpos la position en abscisse d'affichage de la bote et ypos la position en ordonne.
Notez que si l'utilisateur clique sur le bouton annuler, la fonction renverra une chane
n'irons pas plus loin de l'tude de cette fonction car nous verrons que le modle Excel fournit
fonction InputBox plus intressante.
MsgBox
Affiche une bote de message l'utilisateur.
x(prompt[, buttons] [, title] ) As VbMsgBoxResult
est le message affich dans la bote, Title son titre. L'argument buttons est un masque
binaire acceptant les lments suivants :
MsgBo
O prompt
Constante Valeur Description
vbOKOnly 0 Affiche le bouton OK uniquement.
vbOK n 1 Affiche les boutons OK et Annuler. Ca cel
vbAbortRetryIgnore 2 Affiche le bouton Abandonner, Ressayer et Ignorer.
vbYesNoCancel 3 Affiche les boutons Oui, Non et Annuler.
vbYesNo 4 Affiche les boutons Oui et Non.
vbRetryCancel 5 Affiche les boutons Ressayer et Annuler.
80
Constante Valeur Description
vbCritical 16 Affiche l'icne Message critique.
vbQuestion 32 Affiche l'icne Requte d'avertissement.
vbExclamation 48 Affiche l'icne Message d'avertissement.
vbInformation 64 Affiche l'icne Message d'information.
vbDefaultButton1 0 Le premier bouton est le bouton par dfaut.
vbDefaultButton2 256 Le deuxime bouton est le bouton par dfaut.
vbDe 5 bouton est le bouton p faultButton3 12 Le troisime ar dfaut.
vbDefaultButton4 768 Le quatrime bouton est le bouton par dfaut.
La rponse e entire de l'numr sera une constant ation VbMsgBoxResult telle que :
Constant Description
vbOK 1 OK
vbCancel 2 Annuler
vbAbort 3 Abandonner
vbRetry 4 Ressayer
vbIgnore 5 Ignorer
e Valeur
vbYes 6 Oui
vbNo 7 Non
Cette fonction permet donc d'afficher tous types de messages et d'orienter le code en fonction du
bouton cliqu le cas chant.
Publ i c Sub Test Msg( )

Di mReponse As VbMsgBoxResul t

MsgBox " I l f ai t beau" , vbI nf or mat i on + vbOKOnl y, " Bo t e 1"
I f MsgBox( " voul ez vous cont i nuer ?" , vbQuest i on + vbYesNo, " Bo t e 2" ) =
vbYes Then
Reponse = MsgBox( " Le l ect eur n' est pas pr t " , vbCr i t i cal +
vbAbor t Ret r yI gnor e, " Bo t e 3" )
I f Reponse = vbRet r y Then
MsgBox " c' est f i ni " , vbOKCancel + vbDef aul t But t on2, " Bo t e 4"
End I f
End I f

End Sub



81
Fonctions mathmatiques
Fonctions standards
Toutes les fonctions que nous allons voir,
dent comme argument une expression ren
sont des fonctions mathmatiques standard qui
voyant une valeur numrique et qui renvoient une
peNumerique
atten
valeur numrique. De la forme
NomFonction(number) As Ty

Nom de la
fonction
number Type renvoy Commentaire
Abs tous type Num. Id type numbe
uble
r Renvoie la valeur absolue de l'argument.
Atn type Numrique Do Renvoie l'arctangente de l'argument (Radian)
Cos Angle en radian Double Renvoie le cosinus de l'argument
Exp >709,782712893 Double Renvoie l'exponantielle de l'argument
Log Double >0 Double Renvoie le logarithme nprien de l'argument
Sgn Double Variant (Int)
Renvoie le signe de l'expression, -1 si ngatif, 0
si nul et 1 si positif
S Renvoie le Sinus de l'argument in Angle en radian Double
qr Double >=0 Double S Renvoie la racine carre de l'argument
Tan Angle en Radian Double Renvoie la tangente de l'argument
Fonctions spcifiques
Round
Round(expression [,numdecimalplaces]) As Variant
Renvoie la valeur arrondie au nombre de dcimales spcifi comme deuxime paramtre. Si celui-
ci est omis ou vaut 0, le nombre sera arrondi l'entier le plus proche. Par exemple :
Publ i c Sub Test Round( )

Debug. Pr i nt Round( 7. 253, 2) ' 7. 25
Debug. Pr i nt Round( 7. 253, 1) ' 7. 3
Debug. Pr i nt Round( 7. 253, 0) ' 7
Debug. Pr i nt Round( 7. 253) ' 7
Debug. Pr i nt Round( - 7. 253, 2) ' - 7. 25
Debug. Pr i nt Round( - 7. 253) ' - 7

End Sub
Tirage alatoire, Randomize et Rnd
Rnd(number) As Single
La fonction renvoie un nombre ala
Si l'argument est positif ou omis, c'
toire compris entre zro et 1 bas sur la valeur de l'argument.
est le nombre alatoire suivant dans la liste qui est renvoye, si
e alatoire gnr qui est envoy sinon la fonction renvoie number est nul, c'est le dernier nombr
toujours le mme nombre.
Publ i c Sub Test Rnd( )

Debug. Pr i nt Rnd( 7. 253) ' 0. 7055475
Debug. Pr i nt Rnd( 7. 253) ' 0. 533424
Debug. Pr i nt Rnd( 0) ' 0. 5
Debug. Pr i nt Rnd( - 7. 253)
33424
' 0. 7983214
Debug. Pr i nt Rnd( - 7. 253) ' 0. 7983214

End Sub
82
L'appel pralable de l'instruction Randomize sans argument invoque le gnrateur de nombre
pseudo alatoire.
Pour gnrer une valeur entire alatoire dans une plage donne, on utilise la formule :
I nt ( ( Val eur Max - Val eur Mi n + 1) * Rnd + Val eur Mi n)
Dan verez parfois la notation :
I nt ( ( Val eur Max) * Rnd + 1)
Quand vaut 1, et la notation
I nt
s les deux cas les plus frquent, vous trou
le limite basse
( ( Val eur Max + 1) * Rnd)
Quand la limite basse vaut 0.
Publ i c Sub Test Rnd( )

Randomi ze
' t i r age de r oul et t e ( 0 36)
* Rnd) Debug. Pr i nt I nt ( ( 36 + 1)
' t i r age de d 6 f aces
1) Debug. Pr i nt I nt ( ( 6) * Rnd +
' t i r age d' un j our ent r e Nol et l e j our de l ' an
Debug. Pr i nt I nt ( ( 31 - 25 + 1) * Rnd + 25)

End Sub
Fonctions de chanes
e traitement des chanes et les fonctions de conversion de
cara ne et six formes selon les cas qui suivent la nomenclature
forme, note
s l'excution que
ne forme Unicode note NomFonctionW. Je
dans la dfinition des fonctions.
Ces fonctions regroupent les fonctions d
ctre. Chaque fonction peut avoir entre u
suivante :
Lorsque la fonction renvoie un variant, il existe gnralement une seconde
NomFonction$ qui renvoie une chane. Ces formes sont gnralement plus rapide
fonction de caractres, il existe gnralement une leurs homologues non types. Lorsqu'il s'agit de
forme dite binaire sous la forme NomFonctionB et u
noterai normalement toutes les formes
Comparaison de chanes
La comparaison de chane de caractres est normalement base sur une comparaison dite 'binaire'
es. Ceci fait que la comparaison est sensible
autre type de comparaison, dite 'texte'
cessitant une opration de comparaison
araison dsire. Ce paramtre n'est jamais
module, Option Compare, qui prcise pour
rsque l'argument est omis.
s fonctions de chanes mais aussi les oprateurs
ption Compare.
par e Bi nar y
dpendante de la reprsentation numrique des caractr
la casse (Majuscule/Minuscule). Il existe cependant un
e n insensibilise la casse. Toute les fonctions de chan
mp attendent donc un paramtre prcisant le type de co
obligatoire puisqu'il existe aussi une dclaration de niveau
l'ensemble de ces fonctions le mode de comparaison lo
a pas affecter simplement le Cette instruction ne v
de comparaison. Le code ci-dessous illustre l'influence de l'instruction O
Opt i o

n Com
Publ i c Sub I nf l uenceOpt i on( )

I f " t est " <> " Test " Then
MsgBox " Mode Opt i on Compar e Bi nar y"
El se
MsgBox " Mode Opt i on Compar e Text "
End I f

End Sub
Si je change l'instruction pour
Opt i on Compar e Text
J'obtiendrais l'affichage du message correspondant.
83
De faire se peut les comparaisons l'aide d'oprateur pour
privilg .
manire gnrale, on vite autant que
ier l'utilisation de la fonction StrComp des fins de lisibilit
Traitement des caractres
Asc & Chr
Les caractres ont une reprsentation numrique, appele code de caractre. Pendant assez
longtemps, ce code a t cod sur un octet, donc compris entre 0 et 255, c'est le code ANSI. Comme il
existe travers le monde bien plus de 255 caractres, on a cr un nouveau code sur deux octets
appel Unicode.
La fonction Asc renvoie le code de caractre du caractre pass en argument,
renvoie le caractre correspondant au nombre pass en argument.
la fonction Chr
Asc(string As String) As Integer
tre une chane de plusieurs caractres, seul le code de la premire lettre
Cha ne As St r i ng) As St r i ng
AscB(string As String) As Byte
AscW(string As String) As Integer
L'argument string peut
sera renvoy.
Chr(charcode As Long) As Variant
Chr$(charcode As Long) As String
ChrB(charcode As Byte) As Variant
ChrB$(charcode As Byte) As String
ChrW(charcode As Long) As Variant
ChrW$(charcode As Long) As String
Pr i vat e Funct i on Enl eveAccent s( ByVal

Di mcompt eur As Long, Car Lu As St r i ng
To Len( Cha n
, Val Ret As I nt eger
For compt eur = 1
Mi d( C
e)
Car Lu = ha ne, compt eur , 1)
Val Ret = Asc( Car L
el ect Case Val Re
u)
S

t
Case 192 To 197: Val Ret = 65
Case 200 To 203: Val Ret = 69


Case 204 To 207: Val Ret = 73
Case 210 To 214: Val Ret = 79
Case 218 To 22
Case 224, 226,
0: Val Ret = 85
228: Val Ret = 97
Case 232 To 235: Val Ret = 101
Case 238, 239: Val Ret = 105
Case 244, 246: Val Ret = 111
Case 251, 252: Val Ret = 117
End Sel ect
Enl eveAccent s = Enl eveAccent s & Chr ( Val Ret )
Next

End Funct i on
Cette fonction enlve les caractres accentus de la chane passe en paramtre.
N.B : Normalement, on ne met qu'une instruction de code par ligne, le caractre de fin de ligne
tant le retour chariot. Cependant, VBA interprte le caractre ":" (deux points) comme tant un
sparateur d'instruction lorsqu'il est plac dans une ligne sans en tre le dernier caractre. Cette
notation quoique valide est gnralement viter pour des raisons de lisibilit sauf quand le code est
suffisamment trivial pour ne pas prter confusion.
Dans l'exemple ci-dessus, la notation :
Case 192 To 197: Val Ret = 65
quivaut la notation
Case 192 To 197
Val Ret = 65
84
Recherche & Extraction
StrComp
La fonction StrComp compare les deux chanes passes en argument selon le mode spcifi et
renvoie un entier reprsentant le rsultat de la comparaison.
StrComp(string1 As String, string2 As String[, compare As VbCompareMethod]) As Integer
L'argument compare peut prendre les valeurs vbBinaryCompare (0) ou vbTextCompare (1). S'il
est omis c'est l'instruction Option Compare qui fixe le mode, si celle-ci n'est pas dclare, c'est une
comparaison binaire qui sera faite. Le rsultat renvoy vaudra 0 si les deux chanes sont identiques
dans le mode de comparaison choisi, -1 si string1<string2, 1 dans le cas contraire.
Publ i c Sub Tr i Bul l e( ByRef st r Ar r ay( ) As St r i ng, Compar ai son As
VbCompar eMet hod)


Di mTer mi ne As Bool ean, Encour s As Bool ean
Ter mi ne = Fal
Di mst r Temp As St r i ng, cmpt As Long
se

Do Whi l e Ter mi ne = Fal se
For cmpt = LBound( st r Ar r ay) To UBound( st r Ar r ay) - 1
I f St r Comp( st r Ar r ay( cmpt ) , st r Ar r ay( cmpt + 1) , Compar ai son) > 0
Then
st r Temp = st r Ar r ay( cmpt )
st r Ar r ay( cmpt ) = st r Ar r ay( cmpt + 1)
st r Ar r ay( cmpt + 1) = st r Temp
Encour s = Tr ue
End I f
Next cmpt
I f Encour s = Fal se Then
Exi t Do
End I f
Encour s = Fal se
Loop


End Sub

Publ i c Sub Test Compar e( )

Di mTabTest ( ) As St r i ng
TabTest = Spl i t ( " Sel on l ' ar gument compar ai son, l e t r i ser a Sensi bl e
l a casse" , " " )
Cal l Tr i Bul l e( TabTest , vbText Compar e)
MsgBox J oi n( TabTest , " " )
) Cal l Tr i Bul l e( TabTest , vbBi nar yCompar e
MsgBox J oi n( TabTest , " " )

End Sub
85
Instr
La fonction Instr cherche la prsence d'une chane dans une autre chane et renvoie sa position le
cas chant.

1 As String, string2 As String[, compare As VbCompareMethod]) As
ans laquelle on effectue la
.
non
cherche. Lorsque la
uf dans les cas suivants :
ll, la fonction renvoie Null.
une chane vide, la fonction renvoie la valeur de start.
n NbOccur ence( ByVal Cha neCi bl e As St r i ng, Recher chee As
InStr([start As Long, ]string
Long
O start est la position o la recherche commence, string1 la chane d
che et compare le mode de comparaison recherche, string2 la chane recher
L'argument Compare dfinit le mode de comparaison et donc si la recherche est sensible ou
la casse. Lorsque le paramtre start est omis, il est gal 1 (dbut de la chane).
La position renvoye est la position du premier caractre de la chane re
recherche choue la fonction renvoie 0 sa
Si string1 ou string2 est Nu
Si string2 est
Publ i c Funct i o
St r i ng) ng As Lo

Di mPosRech As Long

PosRech = I nSt r ( 1, Cha neCi bl e, Recher chee, vbText Compar e)
Do Unt i l PosRech = 0
NbOccur ence = NbOccur ence + 1
PosRech = I nSt r ( PosRech + Len( Recher chee) + 1, Cha neCi bl e,
Recher chee, vbText Compar e)
Loop

End Fonct i on
Il existe une fonction InStrB qui renvoie la position de l'octet plutt que la position du caractre.
Left, Mid & Right
Renvoie une partie de chane en fonction de critres de position. La fonction Left renvoie la partie
tion Mid une partie dfinie par les
g) As Variant
caractres de droite seront renvoys, length le nombre de
ariant
g]) As Variant
h As Long]) As String
MidB$(string As String, start As Long[, length As Long]) As String
la chane dont les caractres seront renvoys, start la position du premier caractre
(octet pour MidB) renvoyer, length le nombre facultatif de caractres ou d'octets (pour MidB)
devant tre renvoys.
gauche d'une chane, la fonction Right la partie droite et la fonc
arguments qui lui sont passs. De la forme :
Left(string As String, length As Long) As Variant
As Long) As Variant LeftB(string As String, length
Left$(string As String, length As Long) As String
LeftB$(string As String, length As Long) As String
O string est la chane dont les caractres de gauche seront renvoys, length le nombre de
caractres ou le nombre d'octets pour les variantes LeftB.
Right(string As String, length As Lon
RightB(string As String, length As Long) As Variant
Right$(string As String, length As Long) As String
$(string As String, length As Long) As String RightB
O string est la chane dont les
caractres ou le nombre d'octets pour les variantes RightB.
As Long]) As V Mid(string As String, start As Long[, length
g As String, start As Long[, length As Lon MidB(strin
Mid$(string As String, start As Long[, lengt
O string est
86
Nous avons vu un exemple classique d'utilisation de la fonction Mid lors de l'tude de Asc pour le
parcours d'une chane caractre par caractre.
Publ i c Funct i on MyRepl ace( ByVal Cha ne As St r i ng, ByVal Cher che As St r i ng,
ByVal Rempl ace As St r i ng) As St r i ng

Di mPosRech As Long

PosRech = I nSt r ( 1, Cha ne, Cher che, vbText Compar e)
Do Unt i l PosRech = 0
Cha ne = Lef t ( Cha ne, PosRech - 1) & Rempl ace & Ri ght ( Cha ne,
Len( Cha ne) - PosRech - Len( Cher che) + 1)
P

osRech = I nSt r ( 1, Cha ne, Cher che, vbText Compar e)
Loop
MyRepl ace = Cha ne

End Funct i on
Len
Renvoie la longueur de la chane de caractres passe en argument, ou la taille de la variable si
. Existe sous forme LenB pour une rponse en octets.
ce
ng
n'est pas une chane
Len(expression) As Lo
LenB(expression) As Long
InStrRev
Fonctionne comme la fonction InStr mais en partant de la fin de la chane.
gcheck As String, stringmatch As String[, start As Long[, compar InstrRev(strin e As
ong
echerche et stringmatch la chane
e commence la fin de la chane.
t r i ng) As Var i ant
VbCompareMethod]]) As L
O stringcheck est la chane dans laquelle est effectue la r
cherche.
Si position est omis ou gal -1, la recherch
Pr i vat e Funct i on Ext r act Par ent hese( ByVal For mul e As S

Di mPosFer me As Long, PosOuver t As Long
Di mcmpt As Long, TabReponse( ) As St r i ng
PosFer me = I nSt r ( 1, For mul e, " ) " , vbText Compar e)
Do Unt i l Pos
osOuve
Fer me = 0
P r t = I nSt r Rev( For mul e, " ( " , PosFer me, vbText Compar e)
To cmpt ) ReDi mPr eser ve TabReponse( 0
TabReponse( cmpt ) = Mi d( For mul e, PosOuver t + 1, PosFer me - PosOuver t
- 1)
cmpt = cmpt + 1
For mul e = Lef t ( For mul e, PosOuver t - 1) & I I f ( PosFer me <
( For mul e) , Mi d( For mul e, PosFer me + 1) , " " )
PosFer me = I nSt r ( 1,
Len
For mul e, " ) " , vbText Compar e)
Loop
I f Len( For mul e) > 0 Then
ReDi mPr eser ve TabReponse( 0 To cmpt )
= For mul e TabReponse( cmpt )
End I f
abReponse Ext r act Par ent hese = T

End Funct i on
87
Split
La fonction Split spare une chane selon un sparateur et renvoie un tableau (de base 0) des sous
cha

renv
s la chane, il sera renvoy un
tabl est omis, c'est le caractre espace qui sera le
spa
renvoyes.
Publ i c Sub
nes correspondantes.
Split(expression As String[, delimiter As String[, limit As Long[,compare As
VbCompareMethod]]]) As String()
limit le nombre de sous chanes O expression est la chane sparer, delimiter le sparateur et
oyer.
Si le sparateur est de longueur nulle ou s'il n'est pas prsent dan
il eau d'un lment contenant toute la chane. S'
rateur.
t Si limit est omis, toutes les sous chanes seron
Test Spl i t ( )
Di m s St r i ng, msg As St r i ng, cmpt As Long, TabSpl i t ( ) As st r Test A
St r i ng
st r Test = " un, deux, t r oi s"
TabSpl i t = Spl i t ( st r Test , " , " )
For cmpt = LBound( TabSpl i t ) To UBound( TabSpl i t )
msg = msg & " [ l ment " & cmpt & " = " & TabSpl i t ( cmpt ) & " ] "
Next cmpt
Debug. Pr i nt msg
' [ l ment 0 = un] [ l ment 1 = deux] [ l ment 2 = t r oi s]
msg = " "
TabSpl i t = Spl i t ( st r Test , " , " , 2)
For cmpt = LBound( TabSpl i t ) To UBound( TabSpl i t )
msg = msg & " [ l ment " & cmpt & " = " & TabSpl i t ( cmpt ) & " ] "
Next cmpt
Debug. Pr i nt msg
' [ l ment 0 = un] [ l ment 1 = deux, t r oi s]
msg = " "
abSpl i t = Spl i t ( st r Te T st , " ; " )
For cmpt = LBound( TabSpl i t ) To UBound( TabSpl i t )
msg = msg & " [ l ment " & cmpt & " = " & TabSpl i t ( cmpt ) & " ] "
Next cmpt
Debug. Pr i nt msg
' [ l ment 0 = un, deux, t r oi s]
msg = " "
End Sub
Filter
La fon un tableau de chanes et renvoie un tableau contenant tout
les lmen uant la chane spcifie.
Method]]) As String()
dimension.
contenant la chane match seront renvoys sinon ce sera tous
les pas de correspondance, un tableau vide sera renvoy.
Pub
ction Filter compare une chane
ts comprenant ou excl
Filter(sourcearray As string(), match As String[, include As Boolean[,compare As
VbCompare
Sourcearray doit tre un tableau une
Si include est vrai, tous les lments
lments ne la contenant pas. S'il n'y a
l i c Sub Test Fi l t er ( )
Di mTabSt r i ng( ) As St r i ng, TabReponse As Var i ant
Di mCha ne As St r i ng
Cha ne = " C' est un t est et comme t ous l es t est s i l peut chouer "
TabSt r i ng = Spl i t ( Cha ne, " " )
TabReponse = Fi l t er ( TabSt r i ng, " t est " , Tr ue, vbText Compar e)
I f UBound( TabReponse) > - 1 Then
MsgBox UBound( TabReponse) + 1 ' 2
End I f
End Sub
88
Modification
LTrim, RTrim & Trim
Les fonctions Trim renvoient une chane sans les espaces situs une ou aux deux extrmits de
celle-ci.
La fonction LTrim enlve les espaces de gauches, RTrim ceux de droites et Trim des deux cots.
Tr As String) As Variant
Function LTrim$(String As String) As String
rim ing
rim trin
im(String A
im$( ing
Function L im(String
Function RT (Str As String) As Variant
Function RT
Function Tr
$(S g As String) As String
s String) As Variant
Function Tr Str As String) As String
Replace
Replace(expre ion A String, find As String, replace As String[, start As Long[, count As

Remplace une ou plusieurs occurrences d'une chane contenue dans une chane par une autre
chane.
ss s
Long[,compare As VbCompareMethod]]]) As String
O ex chane dans laquelle les remplacements sont effectus, find la chane
rech bre
max
Si s , s'il est suprieur 1, tous les caractres dont la position est infrieure
start ser ne renvoye.
Si cou mis, il vaut -1 c'est--dire que tous les remplacements possibles seront effectus.
Publ i c S t Repl ace( )
pression est la
ercher, replace la chane de remplacement, start le caractre de dpart et count le nom
imum de remplacement.
tart est omis, il vaut 1
ont enlevs de la cha
nt est o
ub Tes

Di mTabSt r i ng( ) As St r i ng, TabReponse As Var i ant
Di mCha ne As St r i ng

Cha ne = " C' est un t est et comme t ous l es t est s i l peut chouer "
Debug. Pr i nt Repl ace( Cha ne, " t est " , " essai " , 1, - 1, vbText
' C' est un essai et comme t ous l es essai s i l peut chouer
Compar e)

Debug. Pr i nt Repl ace( Cha ne, " t
' C' est un essai et comme t ous l es t est s i l peut chouer
est " , " essai " , 1, 1, vbText Compar e)

Debug. Pr i nt Repl ace( Cha ne, " t est " , " essai " , 15, - 1, vbText Compar e
essai s i l peut chouer
)
' et comme t ous l es

End Sub
LCase & Ucase
Convertit la chane dans la casse spcifie. LCase convertira la chane en minuscule, UCase en
s String) As Variant
majuscule.
LCase(string As String) As Variant
LCase$(string As String) As String
UCase(string A
UCase$(string As String) As String
89
StrConv
Convertit la chane passe en argument selon le mode spcifi.
StrConv(string As String, conversion As vbStrConv,) As String
O string est la chane convertir et conversion le masque binaire de conversion. Celui-ci accepte
la composition des valeurs suivantes :
Constante Valeur Description
vbUpperCase 1 Convertit la chane en majuscules (Eqv UCase)
vbLowerCase 2 Convertit la chane en minuscules. (Eqv LCase)
vbProperCase 3 Convertit la premire lettre de chaque mot de la chane en majuscule.
vbUnicode 64 Convertit la chane en Unicode l'aide de la page de code par dfaut du
systme.
vbFromUnicode 128 Convertit la chane Unicode dans la page de code par dfaut du systme.
StrReverse
Renvoie une chane dont les caractres sont en ordre inverse de la chane passe en argument.
Construction
Join
C'est la fonction inverse de Split, elle transforme un tableau de chanes en une chane,
ventuellement avec un sparateur.
Join(sourcearray As String()[, delimiter As String]) As String
Sourcearray doit tre un tableau une dimension. Si delimiter est omis, le caractre espace sera
utilis, si c'est une chane vide, les lments du tableau seront concatns.
Le code suivant remplace les virgules par des tabulations dans un fichier texte.
Publ i c Sub Conver t Fi chi er Text e( )

Di mNumFi chi er As I nt eger , TabLi gne( ) As St r i ng, Recup As St r i ng
Di mcmpt As Long

NumFi chi er = Fr eeFi l e
Open Chemi n & " t ext e. t xt " For Bi nar y Access Read As #NumFi chi er
Recup = St r i ng( LOF( NumFi chi er ) , " " )
Get #NumFi chi er , , Recup
Cl ose #NumFi chi er
TabLi gne = Spl i t ( Recup, vbCr Lf )
For cmpt = 0 To UBound( TabLi gne)
TabLi gne( cmpt ) = J oi n( Spl i t ( TabLi gne( cmpt ) , " , " ) , vbTab)
Next cmpt
Recup = J oi n( TabLi gne, vbCr Lf )
NumFi chi er = Fr eeFi l e
Open Chemi n & " t xt Conv. t xt " For Bi nar y Access Wr i t e As #NumFi chi er
Put #NumFi chi er , , Recup
Cl ose #NumFi chi er

End Sub
Space
La fonction Space renvoie une chane compose d'espaces. De la forme :
90
Function Space(Number As Long) As Variant
String
es composant la chane.
Function Space$(Number As Long) As
O number reprsente le nombre d'espac
On utilise gnralement cette fonction lorsqu'on procde des appels systme qui ncessite une
chane dite 'tampon' pour la rponse.
L'exemple suivant rcupre le login de l'utilisateur en cours.
Decl ar e Funct i on Get User Name Li b " advapi 32. dl l " Al i as " Get User NameA" ( ByVal
l pBuf f er As St r i ng, nSi ze As Long) As Long

Publ i c Funct i on Ut i l Connect ( ) As St r i ng

Di mTampon As St r i ng, r et our As Long Tai l l e As Long ,

Tai l l e = 255
Tampon = Space( Tai l l e)
r et our = Get User Name( Tampon, Tai l l e)
Ut i l Connect = Lef t $( Tampon, Tai l l e - 1)

End Funct i on
String
Sensible renvoie une chane compose d'un caractre
pass
fois o character sera rpt. character peut tre un code de
6. Il
ment identique la fonction prcdente,
en para t argument correspondant.
String(number As Long, character) As Variant
String$(number As Long, character) As String
m re rpt le nombre de fois dfini par l'
O number reprsente le nombre de
caractre compris entre 0 et 255, si il est suprieur, il sera utilis sous la forme character mod 25
peut tre aussi une chane dont seul le premier caractre sera utilis.
91
Gestion des erreurs
Bien que les concepts soient relativement simples, la gestion des erreurs va s'avrer comme la
partie la
bonne qualit rences.
En de l'instruction On Error. Le fait
d'utilise
correctement. Vous devrez parfois configurer votre environnement de dveloppement. Pour cela, allez
dans
plus complexe que nous verrons dans ce cours. L'criture d'un code de gestion d'erreurs de
n'est pas une tche aise contrairement aux appa
VBA, la gestion des erreurs rcuprables se fait par le biais
r cette instruction n'est pas ncessairement suffisant pour que la rcupration se fasse
le menu "Outils Options" de l'diteur de code, slectionnez l'onglet "Gnral" puis slectionnez
l'option "Arrt sur les erreurs non gres".

Il existe grosso modo deux faons de grer les erreurs mme si on peut envisager dans certains
narii plus de variantes

, le traitement en place et le traitement centralis.
manipule au travers de la
escription Chane dcrivant l'erreur
Number Numro de l'erreur
Source Chane identifiant l'metteur de l'erreur
Et deux mthodes
Clear Rinitialise l'objet ErrObject
Raise Lve une erreur rcuprable
Les proprits sont gnralement valorises par Visual Basic, cependant vous pouvez tre vous-
mme gnrateur d'une erreur grce la mthode Raise. Prenons l'exemple suivant :
Pr i vat e Const PI = 3. 14159265
sc
L'erreur rcuprable est reprsente par l'objet VBA ErrObject, qu'on
nction Err. Cet objet expose plusieurs proprits, dont : fo
D

Pr i vat e Funct i on Cal cCyl i ndr ee( ByVal Al esage As Si ngl e, ByVal Cour se As
Si ngl e, ByVal NbCyl i ndr e As Byt e) As Si ngl e

I f Sgn( Al esage) = - 1 Or Sgn( Cour se) = - 1 Then
Er r . Rai se 5, " Cal cCyl i ndr ee" , " Les val eur s d' al sage et de cour se
doi vent t r e st r i ct ement posi t i ves"
El seI f NbCyl i ndr e = 0 Then
Er r . Rai se 5, " Cal cCyl i ndr ee" , " Le Nombr e de cyl i ndr e ne peut pas
t r e nul "
End I f
Cal cCyl i ndr ee = ( PI * Cour se * Al esage / 2) / 4 / 10 * NbCyl i ndr e

End Funct i on
92
Dans cette fonction, je vais g
n peut videmment se demander quel est l'
nrer une erreur si un des arguments n'est pas strictement positif.
intrt d'un tel code, puisqu'en l'occurrence je pourrais

me il le souhaite.
ui par convention est "Appel de procdure ou argument
la source,
O
traiter le problme dans le corps de la fonction. Cependant en procdant ainsi, je laisse la possibilit
celui qui programme la procdure appelante de grer l'erreur com
Dans ce cas, je gnre l'erreur 5 q
4
incorrect" . J'utilise les arguments de la mthode Raise pour personnaliser la description et
mais je pourrais crire aussi :
Er r . Rai se 5
Comme 5 est un numro d'erreur prdfinie, la valeur de la description serait le message par
dfaut de l'erreur, et la source serait "VBAProject" qui est la valeur par dfaut de la source quand un
erreur se pro
e

ui peut
ien que centralis, il n'en est pas moins immdiat puisque la leve d'une erreur
ion du code de traitement d'erreurs. Ce traitement utilise les
alisation d'un point spcifique du code grce une tiquette.

eux-points (:)
gauche dans
On Error Goto Etiquette. Gnralement,
e procdure. On fait donc prcder la ligne de l'tiquette
de procdure (Exit Sub ou Exit Function selon le cas) pour que le code
nement normal.
duit dans un module standard. Il n'y a pas d'obligation utiliser des erreurs prdfinies.
Vous pouvez trs bien utiliser des numros d'erreur personnalis (par convention >1000) ce q
tre utile pour le code de gestion d'erreurs.
Traitement centralis
Soyons clair, b
dclenche automatiquement l'excut
loc tiquettes de lignes, c'est--dire la
Celles-ci suivent les rgles suivantes :
Elles sont composes de n'importe quelle combinaison de caractres commenant par une
lettre et se terminant par le signe d
Elles ne distinguent pas les majuscules des minuscules
Elles doivent commencer au niveau de la premire colonne (le plus
l'diteur)
L'instruction de gestion d'erreurs sera alors de la forme
n d'erreurs en fin d on place le code de gestio
de sortie d'une instruction
d'erreur ne s'excute pas en cas de fonction
Pour que les explications soient plus claires, partons de l'exemple suivant :
= 3. 14159265 Pr i vat e Const PI

l cCyl i ndr ee( ByVal Al esage Pr i vat e Funct i on Ca
bCyl i
As Si ngl e, ByVal Cour se As
Si ngl e, ByVal N ndr e As Byt e) As Si ngl e

Al esa I f Sgn(
Er r .
ge) < 1 Or Sgn( Cour se) < 1 Then
Rai se 5 ' , " Cyl i ndr ee" , " Les val eur s d' al sage et de cour se
doi vent t r e st r i ct ement posi t i ves"
El seI f NbCyl i ndr e = 0 Then
Er r . Rai se 5 ' , " Cyl i ndr ee" , " Le Nombr e de cyl i ndr e ne peut pas t r e
nul "
End I f
Cal cCyl i ndr ee = ( PI * Cour se * Al esage ^ 2) / 4 / 1000 * NbCyl i ndr e

End Funct i on

Pr i vat e Funct i on Cal cRapVol ( ByVal Cyl i ndr ee As Si ngl e, ByVal Vol Chambr e As
Si ngl e) As Si ngl e

Cal cRapVol = ( Cyl i ndr ee + Vol Chambr e) / Vol Chambr e

End Funct i on

4
Vous trouverez la liste des erreurs rcuprables dans l'aide en ligne
93
Publ i c Sub Cal cul Mot eur ( )

Di m ngl e Al es As Si ngl e, Cour se As Si ngl e, NCyl As I nt eger , Vol umeC As Si
Di mCyl i ndr ee As Si ngl e, Rappor t Vol u As Si ngl e

On Er r or GoTo Tr ai t eEr r eur
Al es = Appl i cat i on. I nput Box( " Ent r er l a val eur d' al sage en mm" ,
" Sai si e" , Type: =1)
Cour se = Appl i cat i on. I nput Box( " Ent r er l a val eur de l a cour se en mm" ,
" Sai si e" , Type: =1)
NCyl = Appl i cat i on. I nput Box( " Ent r er l e nombr e de cyl i ndr e" , " Sai si e" ,
Type: =1)
Vol umeC = Appl i cat i on. I nput Box( " Ent r er l e vol ume de l a chambr e de
combust i on en cm^3" , " Sai si e" , Type: =1)
Cyl i ndr ee = Cal cCyl i ndr ee( Al es, Cour se, NCyl )
Rappor t Vol u = Cal cRapVol ( Cyl i ndr ee, Vol umeC)
MsgBox Cyl i ndr ee & vbNewLi ne & Rappor t Vol u
Exi t Sub
Tr ai t eEr r eur :
I f Er r . Number = 5 Then
I f NCyl = 0 Then
NCyl = Appl i cat i on. I nput Box( " Le nombr e de cyl i ndr e doi t t r e
posi t i f " , " Er r eur " , 1, Type: =1)
El seI f Sgn( Al es) < 1
Al es = 0 Then
Then
I f
Al es = Appl i cat i on. I nput Box( " L' al sage doi t t r e
st r i ct ement posi t i f " , " Er r eur " , 1, Type: =1)
El se
Al es = - 1 * Al es
End I f
El se
I f Cour se = 0 Then
e = Appl i cat i on. I nput Box Cour s ( " La cour se doi t t r e
st r i ct ement posi t i ve" , " Er r eur " , 1, Type: =1)
El se
our se = C - 1 * Cour se
End I f
End I f
Resume
End I f

End Sub
re 'C Observons la procdu
Celle-ci signif
alculMoteur'. Nous activons la rcupration d'erreur avec la premire
ie donc que si une erreur se produit dans le code, le curseur d'excution
raiteErreur' et le code de traitement sera excut. Si le code se droule sans
era
erreur se produit, la proprit
t va tre diffrente de 0.
s alors tester le numro de l'erreur. Si celui-ci est gal 5, c'est que nous avons lev
l'exc
igne qui a dclenche l'erreur
Resume Next Retourne la ligne suivant celle qui a leve l'erreur
instruction.
atteindra la ligne 'T
encombre, la procdure se terminera sur l'instruction Exit Sub (et non sur End Sub) et le code ne s
pas trait.
aintenant le code de traitement des erreurs. Si une Regardons m
Number de ErrObjec
Nous allon
eption de la fonction 'CalcCylindree', c'est--dire qu'un des trois arguments n'est pas strictement
positif. Nous allons donc appliquer la stratgie suivante, si l'argument faux est ngatif, je vais le
multiplier par -1, s'il est nul, nous allons redemander la saisie d'une valeur pour cet argument. Puis
nous allons tenter de r excuter la ligne qui a lev l'erreur.
Pour atteindre cette ligne, nous utiliserons l'instruction Resume.
L'instruction Resume sert retourner dans le code qui a dclench l'erreur. On l'utilise sous la
forme :
Resume Retourne la l
94
Resume Etiquette Va la ligne de l'tiquette.
vitez d'utilisez Resume Etiquette qui peut rapidement compliquer la lecture de votre code.
N.B : L'instruction Resume rinitialise l'objet ErrObject, comme si on faisait Err.Clear.
Attention, Resume atteint la ligne qui a dclenche l'erreur dans la procdure qui contient le code
estion d'erreur. Dans notre cas,
Cyl i ndr ee = Cal cCyl i ndr ee( Al es, Cour se, NCyl )
de g
Supposons maintenant qu'au lieu d'un argument faux, il y en ait deux, que va-t-il se passer?
Le code va entrer dans le code de gestion d'erreur une premire fois et traiter la premire erreur
dans l'ordre des conditions, puis l'instruction Resume va remettre le curseur d'excution sur la ligne
d'appel de la fonction 'CalcCylindree'. Une erreur va de nouveau se produire puisque n
ement d'erreur ne corrige qu'un argument la fois. Cette nouvelle erreur va renv
otre code de
trait oyer le code dans
ond argument. Notre gestion d'erreur est donc bien crite.
e traitement de l'erreur explicitement leve par la fonction
se
de dpassement de capacit puisque
qui ne peut pas excder 255. Cette erreur est l'erreur 6. Le
pour cela
otre code
le tr
O du moins l'est-il pour l
aitement d'erreur pour traiter le sec
'CalcCylindree'. Imaginons que notre oprateur rveur entre 300 comme nombre de piston. Il ne
passera rien l'cran et rien ne sera calcul.
fait, cette erreur de saisie va dclencher une erreur En
l'argument 'NbCylindre' est de type Byte
code d'erreur va alors tre excut, mais tel qu'il est crit, il ne traite que l'erreur 5 et c'est
qu'en apparence il ne se passe rien. Pour parer cette ventualit nous allons donc modifier n
d'erreur tel que :
Tr ai t eEr r eur :
Sel ect Case Er r . Number
Case 5
I f NCyl = 0 Then
NCyl = Appl i cat i on. I nput Box( " Le nom
ur " , 1, Type: =1)
br e de cyl i ndr e doi t
t r e posi t i f " , " Er r e
El seI f Sgn( Al es) < 1 Then
I f Al es = 0 Then
Al es = Appl i cat i on. I nput Box( " L' al sage doi t t r e
st r i ct ement posi t i f " , " Er r eur " , 1, Type: =1)
El se
Al es = - 1 * Al es
End I f
El se
I f Cour se =
Cour se
0 Then
= Appl i cat i on. I nput Box( " La cour se doi t t r e
st r i ct ement posi t i ve" , " Er r eur " , 1, Type: =1)
El se
Cour se = - 1 * Cour se
End I f
End I f

Case 6
NCyl = Appl i cat i on. I nput Box( " Le nombr e de cyl i ndr e doi t t r e
compr i s ent r e 1 et 255" , " Er r eur " , 1, Type: =1)

End Sel ect
Resume
Nous voil donc avec un code de gestion d'erreur prt tout. Et bien non, pas encore. Imag
maintenant que ce diable d'utilisateur entre 0 comme valeur
inons
de volume. La fonction de calcul de la
entre dans la fonction 'CalcRapVol'. Le calcul
e division par zro. Cette fonction ne possde
ourtant l'excution ne va pas s'arrter.
concept apprhender correctement. Ds lors qu'il y a un gestionnaire
eurs vont remonter le courant, comme les saumons, sauf que dans le cas des
cylindre va bien se passer, puis le curseur d'excution
rreur puisqu'il y aura un de cette fonction va lever une e
r et p pas de gestionnaire d'erreu
le deuxime C'est la
d'erreur actif, les err
erreurs c'est la pile des appels.
95
Le mcanisme est le suivant. L'erreur va d'abord tre traite au niveau de la procdure o elle se
e gestionnaire d'erreur dans celle-ci, il va remonter l'erreur au gestionnaire de la

avez prvu cette remonte, pas de problme. Mais si il s'est produit une erreur
prvue, vous allez dclencher un traitement qui n'est probablement pas adapt en
produit. S'il n'y a pas d
procdure appelante et ainsi de suite jusqu' trouver un gestionnaire actif. Ce mcanisme n'est pas
inintressant mais il est extrmement prilleux.
En effet, si vous
z pas que vous n'avie
plus de rendre plus difficile la dtection de l'erreur.
Nous aurions trois possibilits dans notre exemple, dsactiver le gestionnaire aprs le calcul de la
cylindre, traiter la division par zro au niveau de la fonction de calcul du rapport volumique ou la
traiter au niveau du gestionnaire de la procdure.
Pour dsactiver le gestionnaire d'erreur, on utilise l'instruction On Error Goto 0.
Ce qui donnerais un code tel que
Publ i c Sub Cal cul Mot eur ( )

Di mAl es As Si ngl e, Cour se As Si ngl e, NCyl As I nt eger , Vol umeC As Si ngl e
Di mCyl i ndr ee As Si ngl e, Rappor t Vol u As Si ngl e

On Er r or GoTo Tr ai t eEr r eur
Al es = Appl i cat i on. I nput Box( " Ent r er l a val eur d' al sage en mm" ,
" Sai si e" , Type: =1)
Cour se = Appl i cat i on. I nput Box( " Ent r er l a val eur de l a cour se en mm" ,
" Sai si e" , Type: =1)
NCyl = Appl i cat i on. I nput Box( " Ent r er l e nombr e de cyl i ndr e" , " Sai si e" ,
Type: =1)
Vol umeC = Appl i cat i on. I nput Box( " Ent r er l e vol ume de l a chambr e de
combust i on en cm^3" , " Sai si e" , Type: =1)
Cyl i ndr ee = Cal cCyl i ndr ee( Al es, Cour se, NCyl )
On Er r or GoTo 0
Rappor t Vol u = Cal cRapVol ( Cyl i ndr ee, Vol umeC)
MsgBox Cyl i ndr ee & vbNewLi ne & Rappor t Vol u
Exi t Sub
Tr ai t eEr r eur :
. . . . .
Sinon la modification du gestionnaire de la procdure serait :
Tr ai t eEr r eur :
Sel ect Case Er r . Number
Case 5
I f NCyl = 0 Then
NCyl = Appl i cat i on. I nput Box( " Le nombr e de cyl i ndr e doi t
t r e posi t i f " , " Er r eur " , 1, Type: =1)
El seI f Sgn( Al es) < 1 Then
I f Al es = 0 Then
Al es = Appl i cat i on. I nput Box( " L' al sage doi t t r e
st r i ct ement posi t i f " , " Er r eur " , 1, Type: =1)
El se
Al es = - 1 * Al es
End I f
El se
I f Cour se = 0 Then
Cour se = Appl i cat i on. I nput Box( " La cour se doi t t r e
st r i ct ement posi t i ve" , " Er r eur " , 1, Type: =1)
El se
Cour se = - 1 * Cour se
End I f
End I f

Case 6
NCyl = Appl i cat i on. I nput Box( " Le nombr e de cyl i ndr e doi t t r e
compr i s ent r e 1 et 255" , " Er r eur " , 1, Type: =1)
96

Case 11
Vol umeC = Appl i cat i on. I nput Box( " Ent r er un vol ume supr i eur 0
pour l a chambr e de combust i on en cm^3" , " Sai si e" , Type: =1)

End Sel ect
Resume
Il n'est pas toujours facile de savoir quel choix
ter to
prendre. En thorie, lorsqu'on commence crire
utes les erreurs sauf lorsqu'on fait du traitement
ans un gestionnaire situ assez loin dans la pile des
avoir des effets de bord non ngligeable. L'instruction Resume ne renverra pas le curseur
d'ex
avant le dclenchement de l'erreur, et un deuxime parcours de la pile des appels
nralement pour cela que
a source de l'erreur et
ans la procdure
ple cependant, le traitement de la division par 0 dans le code de la procdure
ocdure
n programme. Tout coup,
la valeur du volume de la chambre de combustion sur son banc.
ent, il sait que tout trajet qui croise la machine caf peut s'avrer
vu pour le parcourir. Il dcide donc de cliquer sur le
de l'alsage. Et la quelle ne sera pas sa surprise de
re de cylindres. Que se passe-t-il donc ?
de l'objet Application renvoie la valeur saisie si vous cliquez sur 'OK' et
r
t
la forme :
e suivante. La ligne suivante va donc
endue est
t. Gnralement on traite donc l'erreur dans le bloc If qui suit la ligne
sactive le gestionnaire pour l'erreur en ligne.
aire gnral, on dsactive l'aide de l'instruction :
0
tive le gestionnaire en cours en reprcisant l'tiquette avec :
On Er r or Got o Etiquette
du code de gestion d'erreur, on cherche trai
mdiat. Cependant la remonte des erreurs d im
appels peut
cution au niveau de la ligne en erreur mais au niveau de l'appel ayant dclench celle-ci. Si lors
des appels de fonction vous avez utilis des variables globales ou des variables statiques, leurs valeurs
ont pu tre changes
aura un contexte diffrent et probablement un rsultat diffrent. C'est g
rsqu'on crit du code de gestion d'erreur, on essaye de l'crire assez prs de l lo
qu'on crit des petits gestionnaires dans les procdures appeles plutt qu'un grand d
principale.
Dans notre exem
appelante ne pose pas de problme, et nous avons enfin crit un code robuste o les erreurs sont gres
correctement.
Et pourtant ce n'est pas vraiment le cas, car si nous avons bien traits les erreurs, notre pr
est bogue. Imaginons que notre utilisateur distrait commence excuter so
il se rend compte qu'il a oubli
exprim Comme c'est un utilisateur
nettement plus long que le temps normalement pr
tre bouton 'Annuler' quand on lui demande le diam
oir que le programme va lui demander le nomb v
La mthode InputBox
False si vous cliquez sur 'Annuler'. En cliquant sur 'Annuler', le programme va tenter d'affecter la
valeur False la variable 'Ales'. Il y a l une incompatibilit de type, ce qui va lever une erreur de type
6, celle-ci va dclencher le code de gestion d'erreur, et le traitement de l'erreur numro 6 provoque
l'affichage d'une bote de saisie pour le nombre de cylindre.
Dans cet exemple, le bug est relativement vident, mais ce n'est pas toujours le cas et parfois il est
assez ardu de retrouver le bug lorsque le gestionnaire est activ. Vous avez toujours la possibilit de
repasser l'diteur en mode 'Arrt sur toute les erreurs' pour le retrouver plus facilement.
Traitement immdiat
Le traitement immdiat consiste tester la prsence d'une erreur juste aprs la ligne de code
sense la provoquer. Il s'applique plutt quand une erreur trs prvisible et facile traite
immdiatement se trouve dans le code, ou quand on cherche provoquer une erreur comme lmen
une rponse. L'instruction est de d'
On Er r or Resume Next
Ce qui pourrait se lire comme, en cas d'erreur excute la lign
tre un test sur la proprit Number d'ErrObject soit par une galit si le type de l'erreur att
st de valeur non nulle si plusieurs erreurs sont possibles exactement connu, soit juste sous forme de te
et que le type est indiffren
incrimine, on rinitialise l'objet ErrObject et on d
S'il n'y a pas de gestionn
On Er r or Got o
Sinon on rac
97
Commenons par un exemple hyper classique. Si vous souhaitez enregistrer un classeur avec un
nom d'un fichier dj existant, vous allez obtenir un message d'avertissement d'Excel. Vous pouvez
s
As St r i ng)
ventuellement supprimer l'affichage de ce message comme nous le verrons plus loin, mais vou
pouvez aussi traiter cela par le code.
La solution 'Excel' s'crirait :
1( ByVal NomFi chi er Publ i c Sub Ecr aser Fi chi er

Appl i cat i on. Di spl ayAl er t s = Fal se
hi sWor kbook. SaveAs NomFi chi er T

End Sub
Nous y reviendrons plus en dtails dans l'tude de l'objet Application, mais mon sens cette faon
n'est pas toujours une bonne faon de procder, encore que dans cet exemple prcis cela ne pose pas
de gros problmes.
Publ i NomFi chi er As St r i ng) c Sub Ecr aser Fi chi er 2( ByVal

I f Len( Di r ( NomFi chi er , vbNor mal ) ) > 0 Then Ki l l NomFi chi er
Thi sWor kbook. SaveAs NomFi chi er

End Sub
Cette le test sur la fonction Dir peut tre fauss
selon ce e erreur pourrait quand mme se produire.
Pub
solution est relativement lgante. Cependant
que contient l'argument 'NomFichier' et un
l i c Sub Ecr aser Fi chi er 3( ByVal NomFi chi er As St r i ng)

On Er r or Resume Next
Ki l l NomFi chi er
I f Er r . Number > 0 Then Er r . Cl ear
Thi sWor kbook. SaveAs NomFi chi er

End Sub
Cette solution utilise le traitement immdiat. Telle qu'elle est cri
ct au cas o Kill ne trouve pas le fichier corresp
te, elle excute le Kill puis
ondant. Pour ma part, j'vite
'autres erreurs que l'erreur 53 (Fichier
utilisateur n'est pas les droits d'criture
ertoire cible. L'appel de la fonction Kill va engendrer une erreur de type 70 (Permission
refu
Le traitement en ligne peut aussi tre utilis comme lment de rponse. Imaginons que nous
souhaitions savoir si un classeur contient une feuille nomme 'Data'. Sans le traitement d'erreurs, nous
devrions crire :
Pr i vat e Funct i on Feui l l eExi st e( ByVal NomFeui l l e As St r i ng, ByRef Cl asseur
rinitialise l'objet ErrObje
ce genre de traitement car nous sommes dans un cas ou d
trouvable) peut se produire. Supposons par exemple que l' in
dans le rp
se). Puisque le test de la ligne suivante sera vrai, l'objet ErrObject sera rinitialis. Comme
l'utilisateur n'aura pas les droits, la ligne demandant l'enregistrement va choue aussi, mais
l'utilisateur ne le saura pas puisque je n'ai pas ramen le gestionnaire d'erreur en mode normal.
As Wor kbook) As Bool ean

Di mEnumFeui l l e As Wor ksheet
For Each EnumFeui l l e I n Cl asseur . Wor ksheet s
I f St r Comp( EnumFeui l l e, NomFeui l l e, vbText Compar e) = 0 Then
Feui l l eExi st e = Tr ue
Exi t Sub
End I f
Next EnumFeui l l e

End Funct i on
98
Si le classeur contient 200 feuilles

, le traitement aura un cot non ngligeable en terme de temps


d'ex cution. Je peux alors utiliser le traitement d'erreurs et crire :
Pr i vat e Funct i on Feui l l eExi st e( ByVal NomFeui l l e As St r i ng, ByRef Cl asseur
ol ean As Wor kbook) As Bo

Di mEnumFeui l l e As Wor ksheet
On Er r or Resume Next
et EnumFeui l l e = Cl asseur . Wor ksheet s( S NomFeui l l e)
I f Er

r . Number = 0 Then Feui l l eExi st e = Tr ue El se Er r . Cl ear

End Fonct i on
Vous trouverez certains 'puristes' qui vous diraient que cette faon de programmer n'est pas
l, l'interception d'erreurs lorsqu'elle est bien
ure du code de gestion
ourner le
ire se peut.
mmation sans chec
propre. Il n'y a aucun argument srieux ce purisme
fait correcte. gre est une programmation tout
Erreurs successives
La gestion des erreurs successives est souvent nglige lors de l'crit
agit de mcanismes relativement complexes, on essaye souvent de cont d'erreur. Comme il s'
problme autant que fa
Progra
e programmation. La programmation dite sans chec consiste
e Next sans traiter ncessairement les erreurs ventuelles. Par
Il s'agit gnralement d'une faute d
Error Resum activer l'instruction On
exemple :
Publ i c Sub Sans Echec( )

On Er r or Resume Next
Di mcompt eur As Long
For compt eur = 1 To 10
MsgBox Thi sWor kbook. Wor ksheet s( compt eur ) . Name
Next compt eur
Thi sWor kbook. Wor ksheet s( compt eur ) . Del et e

End Sub
Ce code ne lvera jamais d'erreur, affichera autant de fois le message qu'il y a rellement de
feuilles et supprimera la onzime feuille si elle existe. Ce type de programmation ne prsente pas
d'intrt rel, par contre il masquera des ventuels bugs graves sur des codes un peu plus complexes.
99
Validation et activation
Le code qui va suivre n'a pas d'autre but que d'expliquer le principe des erreurs successives. Il est
particulirement mal crit, ne vous en inspirez pas pour crire des fonctions de recherche.
Publ i c Sub Mai n( )

Cal l Fi ndDat e( Now)
Sel ect i on. I nt er i or . BackCol or = vbRed

End Sub

Publ i c Sub Fi ndDat e( ByVal UneDat e As Dat e)

Di mMaCel l As Range, Pl age As Range
On Er r or GoTo Er r eur
For Each MaCel l I n Act i veSheet . UsedRange. Cel l s
I f I sDat e( MaCel l . Val ue) And Dat eDi f f ( " d" , UneDat e, MaCel l . Val ue) >
0 Then
Set Pl age = Appl i cat i on. Uni on( MaCel l , Pl age)
End I f
Next MaCel l
Pl age. Sel ect
Exi t Sub
Er r eur :
I f Er r . Number = 91 Then
Er r . Cl ear
Act i veSheet . UsedRange. Fi nd( UneDat e) . Sel ect
End I f

End Sub
Que va-t-il se passer s'il n'y a aucune date postrieure ou gale la date passe en argument ?
Prcisons d'abord quelques termes. Ds lors qu'on entre dans un code couvert par l'instruction On
Error Goto Etiquette, on dit que le gestionnaire d'erreurs est valid. Lorsqu'une erreur se produit et que
le curseur d'excution entre dans le code de gestion d'erreurs, on dit que le gestionnaire est actif. Enfin
si on repasse par une ligne On Error Goto 0, on dit que le gestionnaire est invalid.
Donc observons la fonction 'FindDate'. Sa premire instruction valide le gestionnaire d'erreurs.
Supposons que la feuille ne contienne pas de date postrieure la date passe en argument. L'appel de
l'instruction Plage.Select va lever une erreur 91 puisque Plage vaudra Nothing. Le gestionnaire
d'erreurs va donc s'activer. Un gestionnaire actif ne peut pas tre de nouveau activ puisqu'on
obtiendrait alors une excution infinie. Ds lors notre code va lever une erreur non intercepte.
Modifions notre procdure Main, telle que :
Publ i c Sub Mai n( )

On Er r or GoTo Er r eur
Cal l Fi ndDat e( Now)
Sel ect i on. I nt er i or . Col or I ndex = 3
Exi t Sub
Er r eur :
I f Er r . Number = 91 Then
Cal l MsgBox( " Aucune dat e gal e ou post r i eur e au : " &
Dat eVal ue( Now) )
End I f

End Sub
Pour les mmes raisons que prcdemment, notre fonction 'FindDate' va lever une erreur alors que
son gestionnaire est dj actif. Comme nous l'avons vu, toute erreur rcuprable va chercher un
gestionnaire valid mais inactif en remontant la pile des appels. Notre nouvelle procdure Main a un
gestionnaire qui rpond ces conditions. Il va donc s'activer pour traiter la deuxime erreur de la
fonction 'FindDate', ce qui dclenchera l'affichage de la bote de message.
100
Ceci implique que si vous devez avoir un code dont le gestionnaire d'erreurs est susceptible de
lever une erreur, vous devez placer ce code dans une procdure appele et crire un gestionnaire
d'erreur dans la procdure appelante.
101
Modle objet
par rapport aux bases du langage
que nous avons vu dans la premire partie.
Les quelques difficults de la manipulation de ce modle viennent de trois sources :
Une mauvaise comprhension de la manipulation des objets
Une mauvaise reprsentation de l'architecture hirarchique d'Excel
Quelques ambiguts dans le modle.
Nous allons donc bien dtailler ces aspects afin que vous puissiez manipuler le modle objet
Excel comme Geronimo son tomahawk.
Lors de l'tude des objets, la liste des proprits et mthodes que nous verrons sera limite une
programmation de base Excel. Sachez qu'il existe dans chaque objet d'autres proprits et mthodes
que nous ne verrons pas dans ce cours mais qui peuvent vous tre utiles.
Nous allons partir de maintenant travailler sur le modle objet d'Excel. Contrairement ce que
l'on croit gnralement, cette partie ne prsente que peu de difficults
102
Prsentation
Le modle objet Excel est un monstre norme lorsqu'on le considre dans son ensemble. La
documentation le reprsente sous la forme conventionnelle suivante :

Encore faut il avoir bien l'esprit qu'il ne s'agit l que d'un premier niveau de hirarchie.
103
La simple collection WorkSheets se dcompose telle que :

104
Il n'est pas question ici de dtailler l'ensemble de ce modle objet. Nous allons nous cantonner
dans l' s utiliss dans des macros classiques. Le modle objet vu dans ce
cour
tude des principaux objet
sera : s

105
Fondamentaux
Nous allons voir ou revoir dans ce chapitre les fondamentaux de la manipulation des objets en
Visual Basic, puis la construction du modle objet d'Excel et les piges viter.
Glossaire
Je vais d'abord dfinir quelques termes pour que les explications qui suivent soient plus claires.
Objet : Groupe de code et de donnes ragissant comme une entit. La plupart des objets que
nous allons voir dans le modle Excel ont une reprsentation graphique (dans le sens visuel) ce qui les
rends plus facile apprhender. Ainsi, le classeur, la feuille, la (ou les) cellule(s) ou le graphique sont
des objets en tant que tels.
Mthode : Dans la thorie objet, tous les membres d'un objet sont des mthodes. Dans le jargon
courant, les mthodes sont les fonctions ou les procdures d'un objet influant sur celui-ci. Lorsqu'elles
n'influent pas sur lui on les appelle souvent fonctions ce qui ne simplifie pas les choses.
Proprit : Mthode particulire renvoyant ou dfinissant les champs (les caractristiques) d'un
objet. Les proprits s'utilisent donc comme les variables, c'est--dire qu'on lit ou qu'on affecte leurs
valeurs. Certaines proprits, dites en 'lecture seule' n'autorisent pas l'affectation de valeurs.
vnement : Un vnement est un 'signal' mis par un objet gnralement lors d'une interaction
ou d'un changement d'tat de celui-ci. Ce signal peut tre intercept l'extrieur de l'objet par des
procdures ayant une signature dfinie par l'vnement. On appelle alors ces procdures des
gestionnaires d'vnements.
Interface : En VBA, c'est l'ensemble des membres publics d'un objet. On entend par membre, les
mthodes, proprits et vnements d'un objet.
Collections : Stricto sensu, une collection est un jeu d'lments indexs de tous types. Dans le
modle objet d'Excel, les collections renvoient uniquement des objets de mme type l'exception de la
collection Sheets.
Qualification : De son vrai nom, chane de qualification. En jargon pur sucre, la qualification est
l'identification unique de la rfrence c'est--dire le parcours hirarchique dans le modle objet pour
dsigner un objet ou un membre unique.
Les aides dans l'diteur
Explorateur d'objet
L'explorateur d'objets remplace le chien en tant que meilleur ami du dveloppeur VBA. Vu la
dens
nes suivantes :
it du modle objet, il serait presque impossible d'avoir une vision simple des interfaces de chaque
objet. L'explorateur d'objets vous permet cette manipulation. Il est accessible depuis l'diteur VBA,
soit en choisissant le menu "Affichage Explorateur d'objets", soit en appuyant sur la touche F2.
L'explorateur d'objet utilise les ic
Bibliothque
Module
Classe
numration
Type utilisateur
Mthode
Mthode par dfaut
Proprit
Proprit par dfaut
vnement
Constante

Dans la dfinition du membre, les paramtres facultatifs sont entours de crochets. Lorsque le
type est omis il s'agit d'un Variant.
106

Nous n'allons pas voir ici comment manipuler l'explorateur car c'est assez trivial, je vous invite
vivement vous exercez un peu dessus car une fois qu'on l'a bien pris en main c'est extrmement
pratique. Notez que si vous surlignez un lment dans l'explorateur de d'objet et que vous appuyez sur
FI, l'aide correspondante s'affichera.
107
IntelliSense
IntelliSense est un mcanisme d'aide au dveloppement qui se base sur le contexte de ce que vous
tes en train de coder pour vous fournir une aide. La
a qualification, plus connue so
plus connue de ces aides, parce que la plus visible
et l'aide l us le nom de saisie automatique.
Imaginons que vous vouliez changer la couleur de fond de la cellule nomme cible du classeur de
la macro. Au fur et mesure que vous allez parcourir la hirarchie des objets dans le chemin de
qualification, IntelliSense va vous afficher la liste des membres de chaque objet. Cela va donner
quelque chose comme :



Et ainsi de suite. Pour slectionner un lment dans la liste vous pouvez utiliser les touches
flches du clavier ou la souris, pour valider la slection vous pouvez appuyer sut "Tab" ou double
cliquer dessus.
Cette aide semi automatique utilise plusieurs fonctionnalits auxquelles vous pouvez accder
aussi en faisant un clic droit sur un mot, savoir :
La liste des membres quand il s'agit d'un objet
La liste des paramtres quand il s'agit d'une mthode.
IntelliSense vous permet aussi de complter un mot en tapant ses premires lettres puis en
choisissant le menu contextuel "Complter un mot".
108
Manipulation d'objets
Bien que nous en ayons dj parl prcdemment, nous allons revoir en dtail la manipulation des
objets.
Dure de vie & Porte
u fonctionnement des objets. Disons pour faire simple qu'un
i) et dtruit (l on dit finalis). Le moment entre
s ne pouvez utiliser un objet que pendant sa
st--dire d'un endroit o il est visible selon qu'il soit
BA :
soit dans la dclaration de la variable, soit dans une instruction de
eux mthodes ne sont pas tout fait quivalentes et on tend plutt instancier dans une
Je ne vais pas entrer dans les dtails d
jet doit toujours tre cr (en jargon on dit instanc ob
ses deux vnements est la dure de vie d'un objet. Vou
dure de vie et uniquement dans sa porte c'e
Public ou Priv.
ires en V On cre un objet de deux man
A l'aide du mot cl New, 1)
code. Les d
instruction spcifique. Autrement dit :
Sub Test Obj et ( )

Di mMaCol l ect i on As Col l ect i on

Set MaCol l ect i on = New Col l ect i on
MaCol l ect i on. Add " l ment 1"
MaCol l ect i on. Add " l ment 2"

End Sub
Vaut mieux que
Sub Test Obj et ( )

Di mMaCol l ect i on As New Col l ect i on

MaCol l ect i on. Add " l ment 1"
MaCol l ect i on. Add " l ment 2"

ub End S
2) A l'aide de la fonction CreateObject.
l'app
Celle-ci suit le modle suivant :
Function CreateObject(Class As String, [ServerName As String])
O l'argument Class est form par le couple appname.objecttype o appname est le nom de
lication qui cre l'objet et objecttype le type de l'objet cr. Par exemple :
Di mr s As Obj ect

Set r s = Cr eat eObj ect ( " ADODB. Recor dset " )
Dans l'absolu, Il n'y a pas de diffrence utiliser New ou Crea
ntexte de la programmation il peut y avoir un risque.
teObject. Cependant dans le
des objets que votre code cre directement. La plupart des
Excel sont crs par Excel et vous ne devez
co
En effet, vous ne devez instancier que
objets que vous allez manipuler dans le modle objet d'
pas les instancier. Pourquoi cela ?
109
Lorsq ent une instance de l'application
Excel en cours et un un quelconque moment vous
ue vous manipulez Excel par du code VBA, il existe forcm
classeur en cours, celui qui contient votre code. Si
instanciez l'objet application, vous allez crer une deuxime instance d'Excel. Pour vous en
convaincre, il suffit d'excuter le code suivant :
Sub Test Obj et ( )

Di mxl App As Excel . Appl i cat i on

' r cupr e l ' i nst ance en cour s d' Excel
Set xl App = Appl i cat i on
' l ance une deuxi me f oi s Excel
Set xl App = New Appl i cat i on
xl App. Vi si bl e = Tr ue

End Sub
Comme Excel suit un modle hirarchique, il ne va pas vous laissez instancier un des objets
enfants de l'objet application, puisque par exemple il ne peut pas exister une feuille qui ne soit pas
membre d'un classeur. Ainsi pour crer une feuille, on utilise une mthode de l'objet Workbook telle
que :
Di mFeui l l e As Wor ksheet
Set Feui l l e = Thi sWor kbook. Sheet s. Add( )
Ce code ajoute bien une nouvelle feuille au classeur, mais c'est Excel qui c'est charg d'instancier
l'objet. Si vous essayez de faire :
Set Feui l l e = New Wor ksheet
Vous allez lever une erreur, car cette feuille ne peut pas tre cre en dehors d'un classeur.
Cependant on pourrait faire :
Sub Test Obj et ( )

Di mFeui l l e As Obj ect

Set Feui l l e = Cr eat eObj ect ( " Excel . Sheet " )
Feui l l e. Appl i cat i on. Vi si bl e = Tr ue

End Sub
Et l il n'y aura pas d'erreur, mais vous allez crer un nouveau classeur contenant une feuille et
non simplement une feuille. L'explication du pourquoi est un peu technique, donc il faut surtout vous
rappeler de privilgier l'utilisation du mot cl New.
Pour dtruire un objet, il suffit de le mettre Nothing. Vous ne pouvez pas dtruire un objet
is vous pouvez rinitialiser une variable objet pointant sur un de ces objets. qu'Excel a instanci, ma
Sub Test Obj et ( )

Di mxl App As Excel . Appl i cat i on, MaCol l As Col l ect i on

i on Set MaCol l = New Col l ect
MaCol l . Add " l ment 1"
i on ' dt r ui t l ' obj et col l ect
Set MaCol l = Not hi ng
Set xl App = Appl i cat i on
' r i ni t i al i se l a var i abl e xl App
Set xl App = Not hi ng
' cr i t ur e i nt er di t e, i mpossi bl e de dt r ui r e une i nst ance cr par Excel
' Set Appl i cat i on = Not hi ng

End Sub
est un peu complexe, mais dans le mod Cet aspect des choses le objet Excel et en utilisant VBA,
il existe presque toujours une mthode
vous n'avez pas grer l'instanciation ni
on des objets Excel.
vous n'aurez quasiment jamais instancier les objets Excel,
cel prends le mcanisme en charge. Autrement dit, Add o Ex
la finalisati
110
Qualification & Manipulation des membres
La qualification, c'est donc le chemin exact d'un membre spcifique d'un objet dfini. La premire
erreur ne pas commettre est de confondre le qualificateur et le type. Par exemple si nous crivons :
Di mPol i ce As Excel . Font
Set Pol i ce = Thi sWor kbook. Wor ksheet s( 1) . Range( " A1" ) . Font
Le type de la variable 'Police' est Excel.Font (ou Font car Excel peut tre omis dans la dclaration)
alors que le qualificateur, c'est--dire la dsignation d'un objet Font dfini est
ThisWorkbook.Worksheets(1).Range("A1").
On utilise l'oprateur . (point) pour la qualification, sous la forme Objet.Membre. videmment, si
le membre renvoie un objet, on peut crire Objet.Membre.Membre et ainsi de suite. Gnralement,
l'IntelliSense vous fournit les lments de l'interface de l'objet en cours mais vous constaterez que dans
certains cas, alors que le membre en cours renvoie bien un objet, il n'y pas d'affichage de l'IntelliSense.
Par exemple si vous tapez ActiveWorkbook. IntelliSense va afficher les membres de l'objet
Workbook, par contre, si vous tapez ActiveSheet. Rien ne va s'afficher. Il ne s'agit pas d'un bug mais
d'un phnomne d la dfinition de la mthode. Pour comprendre cela, activer l'explorateur d'objets
en appuyant sur F2, slectionnez la classe Application puis le membre ActiveWorkbook. La dfinition
du membre est :
Property ActiveWorkbook As Workbook
Slectionnez maintenant le membre ActiveSheet, et vous verrez la dfinition :
Property ActiveSheet As Object
Comme le type renvoy est Object et que ce type n'a pas de membres, IntelliSense n'affiche rien.
Ce phnomne de rupture est assez frquent lorsqu'on renvoie un membre d'une collection. Si vous
connaissez le type sous-jacent renvoy, vous pouvez utiliser une variable objet type correctement
pour rtablir l'IntelliSense. Par exemple :
Sub Test Qual i f ( )
Di mPol i ce As Font , Feui l l e As Wor ksheet
Set Feui l l e = Act i veSheet
Set Pol i ce = Feui l l e. Range( " A1" ) . Font
End Sub
Attention toutefois, ce code est potentiellement source d'erreurs. Si la proprit ActiveSheet
renv
Sub
oie une rfrence de type Object, c'est parce que la feuille active n'est pas forcment une feuille de
calcul mais peut tre aussi une feuille graphique ou une feuille macro.
Tous les membres ne renvoient pas des objets, n'oubliez pas que les proprits se grent comme
des variables, c'est--dire qu'on rcupre ou affecte des valeurs, alors que les mthodes se grent
comme des fonctions. Certaines mthodes renvoient un rsultat, dans ce cas la rgle des parenthses
s'applique avec ou sans l'utilisation de Call.
Test Qual i f ( )
Di mPol i ce As Font , Coul eur As Long, Val eur As St r i ng
Di mComment ai r e As Comment , Pl age As Range

Val eur = " Test "
' af f ect e un obj et Range l a var i abl e obj et
Set Pl age = Range( " A1" )
' af f ect e un obj et Font l a var i abl e obj et
Set Pol i ce = Pl age. Font
' Li t l a val eur d' une pr opr i t
Coul eur = Pl age. I nt er i or . Col or
' Af f ect e une val eur une pr opr i t
Pl age. Val ue = Val eur
' Excut e une mt hode et r cupr e l a r f r ence r envoye
Set Comment ai r e = Pl age. AddComment ( " comment ai r e" )
' Excut e une mt hode et ne r cupr e pas l a val eur r envoye
Fal se) Cal l Comment ai r e. Text ( " c' est un " , 1,
' s' cr i t aussi
' Comment ai r e. Text " c' est un " , 1, Fal se
End Sub
111
Ce code exe a sans problme. Cependant si on regarde la deuxime instruction
Set Pl age = Range( " A1" )
mple fonctionner
On voit t Range n'est pas qualifi. Comment expliquer alors que cela fonctionne.
En
principe de fonctionnement du scope est assez complexe
apprhender ons nous pas l'tudier ici. Cependant vous pouvez le visualiser facilement dans
l'explorateur b us appuyez sur F2, et que vous regardez l'affichage par dfaut du volet des
classes, vous allez voir une entre marque "globales".
bien que l'obje
fait, les langages Visual Basic utilisent un principe, appel Scope, qui permet d'utiliser certains
objets ou fonctions sans qualification. Le
, aussi n'all
d'o jets. Si vo

Les membres de cette entre sont les membres du scope VBA, c'est--dire les membres qui n'ont
pas besoin d'tre qualifis pour tre utiliss. Si nous cherchons le membre Range, nous trouvons :
112

Comme vous le voyez, cette propr
g
it est en lecture seule, c'est--dire que vous ne pouvez pas y
e reprsente une ou plusieurs cellules comme nous le verrons
niveau de l'application, puisque une plage de
affecter un objet Range. Un objet Ran
bientt en dtail. En soit, cela n'a pas d'existence au
cellules appartient forcment une feuille de calcul. En fait, Excel utilise le concept d'objets actifs ou
slectionns. Ainsi si vous regardez les premiers membres dfinis dans 'globales', vous trouverez le
classeur actif, la feuille active, la fentre active, etc.
L'objet Range que vous pouvez atteindre sans qualification correspond donc une plage de
cellule, de la feuille active du classeur actif. Cette notion tant pour le moins dangereuse, il convient
de bien comprendre ce qu'est une rfrence.
Grer les rfrences
Dans la programmation Excel, on travaille sur des objets existants. La qualification ou l'utilisation
de variable objet n'a pas d'autre but que vous permettre de dsigner spcifiquement un objet. Peu vous
importe de savoir o et comment est grer cet objet en ralit, il suffit que vous sachiez le dsigner.
Pour pouvoir faire cela, vou uler des rfrences cet objet qui ne sont rien d'autres que
des reprsentations de s sse.
Excel maintient nomb ren porair que le classeur actif ou la
feuille active, seulem ci peu ger rs du t l'action d'Excel, de votre
code ou de l'utilisateu ur cel t g ment ne tiliser sauf si vous avez la
certitude que pendan de votr n, signero t les bons objets.
ActiveWindow
ActiveWorkbook
Selection
Les membres suivants lorsqu'ils sont utiliss sans qualificateur renvoient l'objet actif et
prsentent donc les mmes inconvnients.
Cells
Columns
Names
Range
Rows
s allez manip
on adre
un certain re de rf ces tem es, telle
ent celles- vent chan au cou emps sous
r. C'est po a qu'il fau nrale pas les u
t le temps e excutio elles d nt forcmen
Ces rfrences temporaires dans Excel s'appellent :
ActiveCell
ActiveChart
ActiveSheet
113
Vous ne devez p
v
as perdre de vue que ces lments n'existent pas obligatoirement, si la feuille
acti
ntre il existe deux rfrences fiables, Application qui pointe vers la session Excel dans
laquelle tenant votre code, et ThisWorkbook qui dsigne le classeur
contenant vot
rfrence temporaire ne modifiera pas la rfrence
e est une feuille graphique par exemple, l'appel d'un des membres de la liste ci-dessus va lever
une erreur puisqu'ils n'ont d'existence que si ActiveSheet est une feuille de calcul.
Par co
t ouvert le classeur con
re code, puisque celui-ci est forcment ouvert pour que le code puisse s'excuter.
Si vous dfinissez une variable objet sur une de ces rfrences temporaires, votre rfrence elle
deviendra fixe. Autrement dit, la modification de la
de votre objet.
Di mMaFeui l l e As Wor ksheet

I f Not Act i veSheet I s Not hi ng Then
eet Set MaFeui l l e = Act i veSh
MaFeui l l e. Next . Act i vat e
MsgBox MaFeui l l e. Name & vbNewLi ne & Act i veSheet . Name
End I f
Nous allons obtenir l'affichage de :

Au dbut du code, ActiveSheet fait rfrence la feuille 'Feuil1' du classeur actif. J'affecte cette
rfrence la variable 'MaFeuille', qui du coup, pointe elle aussi sur la mme feuille. J'active la feuille
suivante du classeur l'aide de l'instruction :
MaFeui l l e. Next . Act i vat e
ActiveSheet fait alors rfrence la nouvelle feuille active, c'est--dire 'Feuil2'
varia euille' n'es
. Cependant ma
t pas modifie par le changement de feuille active, ds lors on a un affichage
uisque les deux rfrences sont diffrentes.
ble 'MaF
des deux noms diffrents p
L'oprateur Is : Cet oprateur dfinit si deux dsignations font rfre
t1 Is Objet2 renvoie vrai si les rfrences sont identiques, fau
nce un mme objet.
L'expression Obje x si non.
Architecture Excel
Tout cela peut encore paratre un peu obscur si vous ne faites pas l'analogie entre le modle objet
Excel et l'application Excel telle qu'elle est architecture. Lorsque vous lancez Excel, vous avez la
possibilit de manipuler plusieurs classeurs, chacun pouvant contenir plusieurs feuilles de types
identiques ou diffrents (feuille de calcul, graphique), chaque feuille de calcul contenant 16777216
cellules ranges sous la forme 65536 lignes et 256 colonnes. Vous pouvez manipuler ces cellules une
par une ou tinue ou discontinue.
Le mo ne exactement de la mme faon. Vous n'avez qu'un seul objet
Pare
ok, chacun renvoyant toutes ses feuilles par sa collection Sheets.
exposent leurs cellules par le biais de proprits Cells, Rows, Columns, mais
de plage par l'objet Range. Un objet Cells expose aussi des objets Borders
ior pour le corps de la cellule, etc.
e de feuilles graphiques et leur
lorsqu'ils seront sous la forme de
un objet Worksheet.
ais dissociation de l'architecture d'Excel et du modle objet manipul, si vous avez
l'esprit qui contient quoi dans Excel, vous connaissez le modle objet Excel.
sous la forme de plage con
dle objet Excel fonction
nt, Application. Celui-ci va vous renvoyer par le biais de proprits des objets ou des collections
d'objets connexes qu'il contient. Ainsi par sa proprit Workbooks il vous donnera accs tous les
classeurs ouverts, les objets Workbo
Les feuilles de calculs
ssi le travail sous forme au
pour l'encadrement, un Objet Inter
Les graphiques seront des objets Charts lorsqu'ils sont sous form
parent sera alors un classeur (Workbook) ou des objets ChartObjects
graphiques inco
Il n'y a jam
rpors une feuille de calcul et leur parent sera alors
clairement
114
Ds lors, qualifier un objet devient d'une simplicit biblique. Si je veux encadrer la plage de
cellules A1:C100 de la feuille de calcul nomme 'Donnes' du classeur ouvert Calcul.xls, il me suffira
Appl i cat i on. Wor kbooks( " cal cul . xl s" ) . Wor ksheet s( " Donnes" ) . Range( " A1: C100" ) .
d'crire :
Bor der Ar ound xl Cont i nuous
ois ce classeur, videmment, si le code est amen manipuler plusieurs f
mple de dclarer des variables objets adquates c
ou cette feuille ou cette
plage, il est plus si ar le code sera plus facile crire.
Ainsi le code prcdant pourrait tre de la forme :
Di mM sheet aFeui l l e As Wor k

Set MaFeui l l e = Appl i cat i on. Wor kbooks( " cal cul . xl s" ) . Wor ksheet s( " Donnes" )
MaFeui l l e. Range( " A1: C100" ) . Bor der Ar ound xl Cont i nuous
Je pourrais ensuite utiliser partout la variable MaFeuille en lieu et place du qualificateur
Application.Workbooks("calcul.xls").Worksheets("Donnes").
Il est bien question ici de l'architecture Excel et non du mode de fonctionnement. Dans son mode
utilisateur, qui est aussi celui de l'enregistreur de macro par la force des choses, Excel agit en mode
slection- Action. Le mme code aurait alors une forme similaire :
Wor kbooks( " cal cul . xl s" ) . Act i vat e
Sheet s( " Donnes" ) . Sel ect
Range( " A1: C100" ) . Sel ect
Sel ect i on. Bor der Ar ound xl Cont i nuous
C'est justement cette forme qu'il faut s'appliquer ne pas reproduire car elle produit un code lent
et peu lisible.
Le deuxime aspect architectural apprhender et la manipulation des cellules et do
de r
nc le systme
odes de notation et deux types de rfrences. Les modes de
notation dpendent de la faon dont sont identifies les colonnes. La mode "A1" les identifie l'aide
de lettres, le mode "L1C1" (R1C1" en anglais) par des nombres. Les rfrences sont absolues ou
relatives. Une rfrence absolue renvoie une position de cellule en fonction de sa position dans la
feuille, une rfrence relative renvoie une position en fonction d'une autre position. Une adresse peut
tre aussi partiellement relative en ligne ou en colonne. Dans le tableau suivant, nous voyons l'criture
de l'adresse "B2" dans la cellule "A1" dans tous les modes.
Rfrences A1 L1C1
frence des feuilles de calcul.
Excel utilise indiffremment deux m
Ligne Colonne
Absolue Absolue =$B$2 =L2C2
Absolue Relative =B$2 =L2C(1)
Relative Absolue =$B2 =L(1)C2
Relative Relative =B2 =L(1)C(1)
En VBA, les notions relatives et absolues existent aussi dans la faon de programmer comme
nous le verrons dans l'tude de l'objet Range. Par contre je vous conseille vivement de choisir un type
de notation et de vous y tenir, sinon le code est rapidement assez pnible lire.
115
Les piges
Les piges du modle objet Excel ne sont pas trs nombreux, il est indispensable de bien les
connatre.
Rfrence implicite
Le premier est la possibilit cause du scope de crer des rfrences implicites pouvant lever des
erreurs. Prenons un code exemple.
Sub I mpl i ci t Ref ( )

Di mMaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
MaFeui l l e. Next . Act i vat e
MaFeui l l e. Range( Cel l s( 1, 1) , Cel l s( 10, 5) ) . Cl ear Cont ent s

End Sub
La notation Range(Cells(),Cells) renvoie une plage de cellule continue entre les deux cellules
dfinies comme argument. Autrement dit :
Range( Cel l s( 1, 1) , Cel l s( 10, 5) )
Renvoie la plage "A1:E10". Pourtant mon code exemple va lever une erreur 1004 indiquant
l'impossibilit de rsoudre la mthode Range. Pourquoi cela ?

ifies
1) , MaFeui l l e. Cel l s( 10,
Nous devons nous rappeler de l'existence du scope. Si la proprit Range utilise est correctement
qualifie, les deux proprits Cells ne le sont pas. Comme le Scope renvoie des proprits Cells, ce
sont elles qui sont prises en compte. Celles-ci sont des rfrences la feuille active, alors que Range
fait rfrence une autre feuille. Il n'est videmment pas possible de construire une rfrence sur une
feuille en utilisant des rfrences d'une autre feuille. Les proprits Cells doivent donc tre qual
l'identique ce qui se notera :
MaFeui l l e. Range( MaFeui l l e. Cel l s( 1,
5) ) . Cl ear Cont ent s
Ou alors
Wi t h MaFeui l l e
. Range( . Cel l s( 1, 1) , . Cel l s( 10, 5) ) . Cl ear Cont ent s
End Wi t h
La proprit Sheets
lisant cette collection et privilgier plutt
les collecti
Les objets Workbook (classeur) exposent une proprit Sheets qui renvoie une collection. Si la
plupart des collections d'objets du modle Excel renvoient des objets de mme type, ce n'est pas le cas
de celle-ci. Les feuilles d'un classeur peuvent tre de plusieurs types diffrents, feuilles de calcul,
graphiques, macros. Vous devez donc faire attention en uti
ons Charts ou Worksheets.
Membre par dfaut
De nombreux objets possdent un membre par dfaut, gnralement une proprit. Si votre code
est ambigu, l'interprteur peut croire que vous faites rfrence cette proprit par dfaut plutt qu'
l'objet. Regardons le code suivant :
Sub Test Def aut ( )

Di mMaCel l ul e As Var i ant

MaCel l ul e = Thi sWor kbook. Wor ksheet s( 1) . Range( " A1" )
Debug. Pr i nt MaCel l ul e & " " & TypeName( MaCel l ul e)
' 21 Doubl e

End Sub
116
La variable MaCellule contient la valeur de la cellule A1. En effet, pour l'interprteur, si j'avais
voulu rcuprer la rfrence de l'objet cellule, j'aurais cris :
Set MaCel l ul e = Thi sWor kbook. Wor ksheet s( 1) . Range( " A1" )
Comme je n'ai pas mis Set, il lit la ligne comme tant
Thi sWor kbook. Wor ksheet s( 1) . Ra

nge( " A1" ) . Val ue MaCel l ul e =
e Va Puisqu lue est la proprit par dfaut de l'objet Range.
Ap
es collections
plication
L'objet Application reprsente donc une instance d'Excel.
Proprits renvoyant d
nces implicites
ment nous habituer ne pas les utiliser.
Les proprits Cells, Charts, Columns, Rows, Sheets, Names etc., sont des rfre
au niveau de l'objet Application. Nous allons juste
CommandBars
Renvoie la collection des me
nipulation des barre
nus et des barres d'outils de l'application Excel. Nous ne traiterons
s de menus.. pas ici de la ma
Dialogs
alogs des botes de dialogues prdfinies dans Excel. Par ex Renvoie la collection Di emple
i on. Di al ogs( xl Di al ogCel l Pr ot ect i on) . Show Tr ue, Fal se
l'instruction de la ligne :
Appl i cat
Dclenchera l'affichage de la bote

L'utili gues intgres n'est pas triviale, nous ne nous l'tudierons
pas pour l'
sation correcte des botes de dialo
instant.
Windows
Renvoie la collection de toutes les fentres de l'application. On manipule rarement les fentres
dans le code VBA puisque l'on cherche souvent coder sans interaction visuelle. On utilise plus
gnralement la collection Windows renvoye par l'objet Workbook.
117
Workbooks
Renvoie la collection des classeurs ouverts dans la session Excel. Cette collection permet aussi
d'ouvrir ou d'ajouter des classeurs.
Proprits
Les proprits de l'objet Application influent sur la configuration d'Excel. Par convention, vous
devez remettre ces proprits la valeur d'origine avant la fin de la session.
Calculation & CalculateBeforeSave (Boolean)
La proprit Calculation dfinit le mode de calcul d'Excel. Elle peut prendre les valeurs :
lationAutomatic
lC nSemiautomatic
xlCa ion
rt b quer le calcul au lules dans des
classeurs contenant beaucoup de form a
ateBe Save dfinit si le our les classeurs au moment
de
xlCalcu
x alculatio
lculat Manual
tomatique lorsqu'on modifie des cel On peut avoir int lo
ule si on n' pas besoin de rsultats immdiatement dans le code.
calcul doit tre forc p La proprit Calcul fore
leur sauvegarde.
Caller
Renvoie un identi
t l'appel d'une fo
ficateur r l'a n
vien nction . Application.C bjet Range si l'appel vient d'une
cellule, une chane ou un identificateur pour des m
Publ i c Funct i on Conv2Far enhei t ( ByVal Doubl e
pou
VBA
ppelant. O utilise gnralement cette proprit pour savoir do
aller renvoie un o
acros prdfinies ou une erreur dans les autres cas.
TempCel si us As Doubl e) As
Di mReponse
ange Then
Conv2Far e = nse
El se
MsgBox & F"

End Fonct i on

As Doubl e
Reponse = 1. 8 * TempCel si us + 32
I f TypeOf Appl i cat i on. Cal l er I s R
nhei t Repo

Reponse "
End I f

Le code suivant renvoie la conversion en Fahrenheit d'une temprature comme valeur de la cellule
si une cellule est l'appelant ou sous forme de message sinon.
La locution TypeOf Object Is Type permet de comparer le type de l'objet un type existant. Elle
renvoie vra type pass. i si le type d'objet est le mme que le
CutCopyMode (Boolean)
Bien qu'en apparence elle ne serve pas grand-chose, mettre cette proprit False permet
d'annuler le mode copie en cours avant la fermeture du classeur ce qui supprime l'affichage du
message d'alerte

118
Le cod orme :
Pr i vat e Cl ose( Cancel As Bool ean)
e est gnralement de la f
Sub Wor kbook_Bef or e
I f Appl i cat i on. Cut CopyMode = xl Copy Or Appl i cat i on. Cut CopyMode = xl Cut
Then
on. Appl i cat i
End I f
Cut CopyMode = Fal se

End Sub
DecimalSeparator (String)
Permet de prciser le sparateur dcimal. Ceci vite de recevoir des erreurs de type lorsqu'on
travaille avec des fichiers utilisant le sparateur international.
On peut donc crire un code tel que :
I f Appl i cat i on. I nt er nat i onal ( xl Deci mal Separ at or ) = " , " Then
i t h Appl i W cat i on
. Deci mal Separ at or = " . "
" " . ThousandsSepar at or =
. UseSyst emSepar at or s = Fal se
End Wi t h
ChangeSep = Tr ue
End I f
ment Traite
' r t abl i ssement du spar at eur d' or i gi ne
I f ChangeSep Then
Appl i cat i on. Deci mal Separ at or = " , "
End I f
DisplayAlerts (Boolean)
Supprime les messages d'avertissement d'Excel et applique l'option par dfaut lorsque
DisplayAlerts vaut False. Vous n'avez pas besoin de rtablir la proprit en fin de code, Excel la
ramne systmatiquement la valeur Vrai en fin d'excution.
Le code suivant demande un nom de fichier l'utilisateur et sauvegarde le classeur contenant la
macro sous se nom en crasant l'ancien fichier sans avertissement le cas chant.
Di mFi chi er As St r i ng

Appl i cat i on. Di spl ayAl er t s = Fal se
Fi chi er = Appl i cat i on. Get SaveAsFi l ename
I f Fi chi er <> Fal se Then Thi sWor kbook. SaveAs Fi chi er
EnableCancelKey (XlEnableCancelKey)
Permet de dfinir le comportement des touches d'interruption de l'excution du code.
Peut prendre les valeurs
xlDisabled
xlErrorHandler
xlInterrupt
Le mode Interrupt laisse la possibilit d'interrompre le code avec ESCAPE ou CTRL+PAUSE, le
mode ErrorHandled lve l'erreur 18 (qui peut tre intercepte) en cas d'appui sur les touches, le mode
Disabled dsactive les touches. Attention, en cas de boucle infini, il n'est plus possible d'interrompre le
code en mode Disabled.
EnableEvents (Boolean)
Permet de bloquer les vnements et donc de ne pas excuter le code vnementiel des objets
Excel. Il convient de toujours remettre cette variable Vrai en fin d'excution, sinon plus aucun
vnement ne sera pris en compte dans la session Excel.
119
Interactive (Boolen)
Permet r ou d'interdire les in cel,
l'exception d de dialogue.
International
d'autorise
es es
teractions entre les priphriques de saisie et Ex
bot
orme App
ramtre aite rc st en lecture
ramtres
bles pour index, qu'
igne).
nstante

taire
Param
Pannea ows.
urrencyBefore
olean True si le sy ontaire prcde la vale
False s'

De la f lication.International(Index) o index est une valeur prdfinie permettant de
prciser le pa international que l'on souh uprer. Cette proprit e seule, elle
ne peut pas servir modifier un ou plusieurs pa de la machine.
Il existe de nombreuses valeurs possi on retrouve dans l'numration
XlApplicationInternational (et dans l'aide en l
Les plus frquemment utilises sont :
Co Valeur
Type
renvoy
Commen
XICountrySetting 2
Long tre de pays/rgion slectionn dans le
u de configuration Wind
xIC 37
Bo mbole m ur,
il suit la valeur.
xICurre 25 String bole montaire. ncyCode Sym
xIC 27
Long Nombre de dcimales utiliser dans les formats
ires.
urrencyDigits
monta
xI24HourClock 33
Boolean pour le format 24 heu se pour le
at 12 heures
True res, Fal
form
xI4Digi 43
Boolean i les annes comportent quatre chiffres, False
comportent deux chiffre
True s
tYears
si elles s.
xIDat 32
Long es lments de la date :
is-jour-anne
ur-mois-anne
ne-mois-jour
Ordre d
o

0 = m
eOrder
1 = jo
2 = an
xIDateSeparator 17 String teur de date (/ ). Spara
xIMe 35
Boolean pour le systme mtr pour le
de mesure anglais.
True ique, False
tric
systme
XIDecimalSeparator 3 String ur dcimal. arate Sp
XIThousandsSeparator 4 String ou sparateur de milliers Zro
Je ne vais pas vous montrer ici d'exem programmation interna surtout qu'il
est mon sens inutile d'utiliser une program te en anglais, Excel ant dans la
plupart des cas de localiser correctement.
dating (Boole
ple complet de
p
tional,
mation ada se charge
Sc Up reen an)
Dsactive la mise jour d'cran quand e . Vous devez la rtablir procdure.
Dsactive ode de faon trs imp te acclration est vraie i votre code
n'a pas d'action visi l'cran. On l'utilis ent systmatiqueme
longues ou si vous avez de nombreuses mis 'cran, sauf voulo isateurs
pileptique
SheetsInNewWorkbook (Long)
lle vaut False en fin de
ortante. Cet mme s
nt pour les procdures
ir re util ndre les
s.
r acclre le c
ble e gnralem
es jour d

Dfinit le nombre de feuilles de calcul contenu par dfaut dans les nouveaux classeurs. Cela
permet de cr asseurs spcifiques sans avoir manipuler les feuilles.
NbFeui l l eDef aut = Appl i cat i on. Sheet sI nNewWor kbook
er des cl
Appl i cat i on. Sheet sI nNewWor kbook = 5
Appl i cat i on. Wor kbooks. Add ' ce cl asseur cont i ent 5 f eui l l es
Appl i cat i on. Sheet sI nNewWor kbook = NbFeui l l eDef aut
120
StatusBar (String)
Renvo le texte de la barre d' ui affectez la vale end le
contrle du .
Sub Demo
ie ou dfinit
t h
l tat. Si vous ur False, Excel repr
St at us( )
As St r i ng
l se
SvgSt = A at usText n. St
Eac aCe l u . C
exte affic

Di mMaCel l Range, compt eur As Long, SvgSt at usText As

Appl i cat i on. St at usBar = Fa
ppl i cat i o at usBar
k. he For l l I n Thi sWor kboo et s( " Feui l 1" ) . Co el l s h M Wor ks mns( 1)
Then co I f er i c( MaCel l . Val ue) mpt eur = compt eur I sNum + 1
Appl i cat i on. St at usBar = " l i gne " & MaCel l . Row & " - Nombr e val eur
num" & compt eur
Next
Appl i cat i on. St at usBar = SvgSt at usText
Appl i cat i on. St at usBar = Fal se

End Sub
WorksheetFunction (WorksheetFunction)
Cette proprit renvoie l'objet WorksheetFunction qui contient un certain nombre des fonctions
intgres d'Excel.
Nous n'allons pas les passer en dtails ici puisqu'il y en a presque 200 dans Excel 2002. Les
mthodes de l'objet WorksheetFunction porte le nom anglais des fonctions intgres aussi n'est-il pas
facile de faire toujours la correspondance. Le tableau suivant donne la liste des fonctions ainsi que leur
quivalent anglais lorsqu'il est diffrent.
121
Acos Acosh Amorlin
(Sln)
Arrondi
(Round)
Arrondi.Inf
(RoundDown)
Arrondi.Sup
(RoundUp)
Asc Asin Asinh
Atan2 Atanh BahtText
BdEcartType
(DStDev)
BdEcartTypeP
(DStDevP)
BdLire
(DGet)
BdMax
(DMax)
BdMin
(DMin)
BdMoyenne
(DAverage)
BdNb
(DCount)
BdNbVal
(DCountA)
BdProduit
(DProduct)
BdSomme
(DSum)
BdVar
(DVar)
BdVarP
(DVarP)
Beta.Inverse
(BetaInv)
Centile
(Percentile)
Centre.Rduite
(Standardize)
Cherche
(Search)
ChercherB
(SearchB)
Choisir
(Choose)
Coefficient.Asymtrie
(Skew)
Coefficient.Corrlation
(Correl)
Coefficient.Dtermination
(RSq)
Combin Cosh Covariance
(Covar)
Critre.Loi.Binomiale
(CritBinom)
Croissance
(Growth)
Ctxt
(Fixed)
Db Dbcs

DDb
Degrs
(Degrees)
DterMat
(MDeterm)
DroiteReg
(LinEst)
Ecart.Moyen
(AveDev)
EcarType
(StDev)
EcarTypeP
(StDevP)
Epurage
(Clean)
Equiv
(Match)
Erreur.Type.Xy
(StEyx)
EstErr
(IsErr)
EstErreur
(IsError)
EstLogique
(IsLogical)
EstNA
(IsNA)
EstNonTexte
(IsNonText)
EstNum
(IsNumber)
EstTexte
(IsText)
Et
(And)
Fact
Fisher Fisher.Inverse
(FisherInv)
Franc
(Dollar)
Frquence
(Frequency)
Grande.Valeur
(Large)
Impair
(Odd)
Index Intervalle.Confiance
(Confidence)
Intper
(IntRate)
Inverse.Loi.F
(FInv)
InverseMat
(MInverse)
Ispmt
Jours360
(Days360)
Joursem
(Weekday)
Khideux.Inverse
(ChiInv)
Kurtosis
(Kurt)
Ln LnGamma
(GammaLn)
Log Log10 LogReg
(LogEst)
Loi.Beta
(BetaDist)
Loi.Binomiale
(BinomDist)
Loi.Binomiale.Ng
(NegBinomDist)
Loi.Exponentielle
(ExponDist)
Loi.F
(FDist)
Loi.Gamma
(GammaDist)
Loi.Gamma.Inverse
(GammaInv)
Loi.Hypergomtrique
(HypGeomDist)
Loi.Khideux
(ChiDist)
Loi.LogNormale Loi.LogNormale.Inverse Loi.Normale
122
(LogNormDist) (LogInv) (NormDist)
Loi.Normale.Inverse
(NormInv)
Loi.Normale.Standard
(NormSDist)
Loi.Normale.Standard.Inverse
(NormSInv)
Loi.Poisson
(Poisson)
Loi.Student
(TDist)
Loi.Student.Inverse
(TInv)
Loi.Weibull
(Weibull)
Max Mdiane
(Median)
Min Mode Moyenne
(Average)
Moyenne.Gomtrique
(GeoMean)
Moyenne.Harmonique
(HarMean)
Moyenne.Rduite
(TrimMean)
NB
(Count)
Nb.Si
(CountIf)
Nb.Vide
(CountBlank)
NbVal

(CountA)
NomPropre
(Proper)
NPm
(NPer)
Ordonne.Origine
(Intercept)
Ou
(Or)
Pair
(Even)
Pearson
(Pearson)
Pente
(Slope)
Permutation
(Permut)
Petite.Valeur
(Small)
Phontique
(Phonetic)
Pi

Plafond
(Ceiling)
Plancher
(Floor)
Prvision
(Forecast)
Princper
(Ppmt)
Probabilit
(Prob)
Produit
(Product)
ProduitMat
(MMult)
Puissance
(Power)
Quartile
(Quartile)
Radians Rang
(Rank)
Rang.Pourcentage
(PercentRank)
Recherche
(Lookup)
RechercheH
(HLookup)
RechercheV
(VLookup)
Remplacer
(Replace)
RemplacerB
(ReplaceB)
Rept
Romain
(Roman)
RTD Sinh
()
Somme
(Sum)
Somme.Carrs
(SumSq)
Somme.Carrs.Ecarts
(DevSq)
Somme.Si
(SumIf)
Somme.X2MY2
(SumX2MY2)
Somme.X2PY2
(SumX2PY2)
Somme.XMY2
(SumXMY2)
SommeProd
(SumProduct)
Sous.Total
(Subtotal)
Substitue
(Substitute)
SupprEspace
(Trim)
Syd
Tanh Taux
(Rate)
Tendance
(Trend)
Test.F
(FTest)
Test.Khideux
(ChiTest)
Test.Student
(TTest)
Test.Z
(ZTest)
Texte
(Text)
Transpose
Tri
(Irr)
TriM
(MIrr)
Trouve
(Find)
TrouverB
(FindB)
USDollar Va
(Pv)
Van
(Npv)
Var Var.P
(VarP)
Vc
(Fv)
Vdb Vpm
(Pmt)
123
L'utilisation des mthodes de l'objet WorksheetFunction n'est pas toujours vidente car les
arguments sont gnralement faiblement typs et on n'a pas toujours le rflexe d'aller voir les
paramtres attendus par la fonction intgre correspondante. Prenons un exemple.
Vous avez besoin d'utiliser la fonction Excel EQUIV (Match) dans votre code. Dans l'explorateur
d'objet, la mthode Match est dfinie comme :
Function Match(Arg1, Arg2, [Arg3]) As Double
Comme cela, il n'est pas vident de savoir quoi correspondent les trois arguments. Par contre, si
vous regardez l'aide sur Equiv, vous trouverez la dfinition
EQUIV(valeur_cherche;matrice_recherche;type)
Ce qui est nettement plus comprhensible. Je peux donc utiliser un code tel que :
Di mPosi t i on As Long, MaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
Wi t h MaFeui l l e
On Er r or Resume Next
Posi t i on = Appl i cat i on. Wor ksheet Funct i on. Mat ch( 20, . Range( . Cel l s( 1, 1) ,
. Cel l s( 150, 1) ) , 0)
I f Er r . Number = 1004 Then Er r . Cl ear El se Er r . Rai se Er r . Number ,
Er r . Sour ce, Er r . Descr i pt i on
On Er r or GoTo 0
End Wi t h
Notez que je dois traiter l'erreur s'il n'y a pas de correspondance car si les fonctions intgres
renvoient des valeurs d'erreur, leurs homologues WorksheetFunction lvent des erreurs rcuprables.
Mthodes
Calculate
Permet de forcer le calcul. La syntaxe Application.Calculate est peu utilise. On l'utilise
principalement sous la forme [Worksheet].Calculate. Sachez toutefois que l'on peut restreindre le
calcul une plage des fins de performance. Par exemple :
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " C1: C5" ) . Cal cul at e
Ne fait les calculs que sur la plage C1:C5.
ConvertFormula
De la forme :
Function ConvertFormula(Formula As String, FromReferenceStyle As XlReferenceStyle,
[ToReferenceStyle As XlReferenceStyle], [ToAbsolute As XlReferenceType], [RelativeTo As Range])
As String
Permet de convertir une formule d'un systme de rfrence un autre et d'un mode un autre.
Cette fonction peut s'avrer utile dans certain cas, cependant il y a souvent des faons plus simples
d'arriver au mme rsultat.
L'exemple suivant convertit l'ensemble des formules de calcul de la feuille en rfrence absolue.
Sub ConvToAbsol ut e( )

Di mMaFeui l l e As Wor ksheet , For mul eRel As St r i ng, For mul eAbs As St r i ng
Di mMaCel l As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
For Each MaCel l I n MaFeui l l e. UsedRange. Speci al Cel l s( xl Cel l TypeFor mul as)
For mul eRel = MaCel l . For mul a
MaCel l . For mul a = Appl i cat i on. Conver t For mul a( For mul eRel , xl A1, xl R1C1,
xl Absol ut e)
Next

End Sub
124
Evaluate
Permet de convertir une chane en sa valeur ou en l'objet auquel elle fait rfrence. Nous allons
regarder quelques utilisations de cette mthode.
Interprtation de formule de calcul Imaginons que ma cellule A1 contient le texte (12*3)+4,
crire
Range( " A2" ) . Val ue=Appl i cat i on. Eval uat e( Range( " A1" ) . Val ue)
Renverra 40 en A2. De mme on pourra crire :
Resul t at = Appl i cat i on. Eval uat e( " ( 12*3) +4" )
La mthode permet aussi d'valuer une formule respectant la syntaxe Excel (en anglais) ; on peut
crire
Resul t at = Appl i cat i on. Eval uat e( " Sum( A1: E5) " )
Interprtation d'une adresse Si ma cellule A1 contient B1:B2 je peux crire
Appl i cat i on. Eval uat e( Range( " A1" ) . Val ue) . Font . Bol d=Tr ue
Il est noter que le mot Application est facultatif et on trouve parfois la notation
[ A1] . Font . Bol d=Tr ue
Qui est strictement quivalente.
La mthode Evaluate est extrmement puissante puisqu'elle permet d'interprter correctement
peu prs toutes les expressions comprhensibles par Excel. Elle n'est toutefois pas vidente bien
manipuler, aussi doit on l'employer uniquement quand c'est la seule solution ou que son emploi est
sans risque.
GetOpenFilename & GetSaveAsFilename
Ces deux mthodes permettent l'affichage d'une bote de dialogue de slection de fichiers
renvoyant le ou les noms des fichiers slectionns. Ces mthodes n'ouvrent ou ne sauvent pas
physiquement le fichier, elles ne renvoient que des noms. Elles renvoient False si l'utilisateur clique
sur 'Annuler'.
Function GetOpenFilename([FileFilter As String], [FilterIndex As Integer], [Title As String],
[ButtonText], [MultiSelect As Boolean]) As String
Function GetSaveAsFilename([InitialFilename As String], [FileFilter As String], [FilterIndex
As Integer], [Title As String], [ButtonText]) As String
L'argument ButtonText n'est utilise que sous Macintosh.
En mode MultiSelect, la mthode GetOpenFilename renvoie un tableau de noms mme si un seul
nom est slectionn, Faux si annuler est cliqu.
Le code suivant affiche la bote de dialogue Enregistrer sous :
Di mNomFi chi er As St r i ng

NomFi chi er = Appl i cat i on. Get SaveAsFi l ename( Thi sWor kbook. Ful l Name)
I f CBool ( NomFi chi er ) <> Fal se Then
Thi sWor kbook. SaveAs NomFi chi er
End I f
Le code suivant propose une bote de dialogue ouvrir permettant de slectionner plusieurs
fichiers.
Publ i c Sub t est bo t e( )

Di mNomFi chi er As Var i ant , Fi l t r e As St r i ng, cmpt As Long

Fi l t r e = " Cl asseur ( *. xl s) , *. xl s, Fi chi er s t ext e ( *. t xt ) , *. t xt , Tous
l es f i chi er s( *. *) , *. *"
NomFi chi er = Appl i cat i on. Get OpenFi l ename( Fi l t r e, 2, " Ouvr i r " , , Tr ue)
I f I sAr r ay( NomFi chi er ) Then
For cmpt = LBound( NomFi chi er ) To UBound( NomFi chi er )
I f St r Comp( Ri ght ( NomFi chi er ( cmpt ) , 3) , " t xt " , vbText Compar e) =
0 Then
Appl i cat i on. Wor kbooks. OpenText NomFi chi er ( cmpt )
125
El seI f St r Comp( Ri ght ( NomFi chi er ( cmpt ) , 3) , " xl s" ,
vbText Compar e) = 0 Then
Appl i cat i on. Wor kbooks. Open NomFi chi er ( cmpt )
End I f
Next cmpt
End I f

End Sub
InputBox
Il ne s'agit pas ici de la fonction VBA mais bien d'une mthode de l'objet Application. Il convient
donc de faire attention la notation, InputBox sans qualificateur dsigne VBA.InputBox, et cette
mthode doit tre appele comme Application.InputBox.
Function InputBox(Prompt As String, [Title As String], [Default As Variant], [Left As Single],
[Top As Single], [HelpFile As String], [HelpContextID As Long], [Type As Integer]) As Variant
Mais pourquoi donc crer une mthode InputBox alors que le langage en fournit dj une ?
La fonction InputBox de l'objet VBA prsente quelques inconvnients.
Elle renvoie une chane vide si l'utilisateur clique sur 'Annuler'
Elle ne vrifie pas le type de la valeur saisie
Elle ne permet pas de dsigner une plage sur une feuille de calcul
C'est pour remdier cela que l'objet Application propose une autre mthode InputBox. Pour tous
ces premiers arguments, il s'agit de la mme structure que la fonction InputBox, c'est--dire le texte
d'invite, le titre, la valeur par dfaut, les coordonnes de position et les identificateurs d'aide. En plus,
on utilise l'argument Type prcisant le(s) type(s) accept(s). C'est un masque binaire dfinit comme :
Valeur Type
0 Une formule.
1 Un nombre.
2 Texte (une chane).
4 Une valeur logique (True ou False).
8 Une rfrence de cellule, sous la forme d'un objet Range.
16 Une valeur d'erreur, telle que #N/A.
64 Un tableau de valeurs.
Cette mthode renverra Faux si vous cliquez sur 'Annuler'.
Si 'avertissement et la
bote restera
Di mI nt Val As I nt eger
la saisie ne respecte pas l'argument type, Excel vous enverra un message d
affiche. Attention quand mme aux effets de bords.
nt Val = Appl i cat i on. I nput Box( pr ompt : =" chi f f r e" , Type: =1)
t des lettres, il aura l'affichage du message
I
Dans cet exemple, si l'utilisateur saisi

Mais s'il clique sur 'Annuler', IntVal vaudra 0 car False sera convertit en zro pas VBA.
Le type rfrence permet l'utilisateur de slectionner une zone sur la feuille.
126
Intersect & Union
Ces deux mthodes permettent de regrouper les objets Range passs en argument. Intersect
renverra l'intersection des plages, c'est--dire l'ensemble des cellules appartenants toutes les plages,
ou Nothing si aucune cellule ne correspond.
Pr i vat e Sub Wor ksheet _Change( ByVal Tar get As Range)

Di mPl ageY As Range, Pl ageCi bl e As Range

Set Pl ageY = Me. Range( " Pl ageY" )
Y, Tar get ) Set Pl ageCi bl e = Appl i cat i on. I nt er sect ( Pl age
I f Not Pl ageCi bl e I s Not hi ng Then
For Each Pl ageY I n Pl ageCi bl e. Cel l s
Pl ageY. AddComment " modi f i e l e " & Now
Next
End I f

End Sub
Ce code ajoute un commentaire aux cellules modifies de la plage nomme 'PlageY'.
Me : Qualificateur dsignant l'objet qui le contient. Dans le module de code du classeur, Me
dsigne le classeur, dans le module de code d'une feuille, Me dsigne la feuille. Me ne peut pas tre
employ dans un module standard.
Union renverra l'ensemble des plages. La fonction suivante renvoie l'ensemble des cellules
contenant la valeur passe en argument.
Pr i vat e Funct i on Fi ndVal ue( ByVal Val eur As Var i ant ) As Range

Di mAdr esse As St r i ng, t mpFi nd As Range

Wi t h Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . UsedRange
Set Fi ndVal ue = . Fi nd( What : =Val eur , LookI n: =xl Val ues,
LookAt : =xl Whol e)
I f Fi ndVal ue I s Not hi ng Then Exi t Funct i on
Adr esse = Fi ndVal ue. Addr ess
Set t mpFi nd = Fi ndVal ue
Do
Set t mpFi nd = . Fi ndNext ( t mpFi nd)
Set Fi ndVal ue = Appl i cat i on. Uni on( Fi ndVal ue, t mpFi nd)
Loop Whi l e St r Comp( t mpFi nd. Addr ess, Adr esse, vbText Compar e) = 0
End Wi t h

End Fonct i on
Quit
Ferme la session Excel.
127
Workbooks & Workbook
La collection Workbooks contient une rfrence l'ensemble des classeurs ouvert de la session en
cours, l'objet Workbook dsigne un classeur.
Manipuler la collection Workbooks
Proprit Item (Workbook)
De la forme :
Property Item(Index) As Workbook
Index tant un Variant reprsentant le numro d'ordre ou le nom du classeur. Les numros d'ordre
tant grs par Excel et pouvant varier d'une session l'autre, on ne les utilise gnralement pas. Le
nom du classeur est un nom court de la forme "NomFichier.xls" si le classeur dj t enregistr, un
nom sans extension si non. Le plus simple reste cependant de capturer la rfrence lors de l'ouverture
ou de la cration du classeur comme nous le verrons plus loin.
Proprit Count (Long)
Renvoie le nombre de classeurs ouverts dans la session Excel en cours. Les classeurs ne sont pas
forcment visibles.
Mthode Add
Ajoute un nouveau classeur. De la forme :
Function Add([Template]) As Workbook
O Template est un Variant suivant les rgles suivantes :
Si c'est une chane spcifiant un nom de fichier Excel existant, le nouveau classeur est
cr sur le modle du fichier spcifi.
Si cet argument est une constante (xlWBATChart, xlWBATExcel4IntlMacroSheet,
xlWBATExcel4MacroSheet ou xlWBATWorksheet), le nouveau classeur contient une seule
feuille du type spcifi.
Si Template est omis, Excel cre un nouveau classeur avec plusieurs feuilles de calcul
dont le nombre est tabli par la proprit SheetsInNewWorkbook de l'objet Application.
La mthode Add renvoie une rfrence l'objet Workbook ajout, c'est cette rfrence qu'il
convient de capturer pour simplifier le code.
Sub t est ( )

Di mCl asseur Gr aphe As Wor kbook, Cl asseur St andar d As Wor kbook

' aj out e un cl asseur cont enant une f eui l l e gr aphi que
Set Cl asseur Gr aphe = Appl i cat i on. Wor kbooks. Add( xl WBATChar t )
' aj out e un cl asseur cont enant des f eui l l es de cal cul
Set Cl asseur St andar d = Appl i cat i on. Wor kbooks. Add
' l es deux var i abl es sont mai nt enant des qual i f i cat eur s mani pul abl es
MsgBox Cl asseur Gr aphe. Name

End Sub
Mthode Close
Ferme tous les classeurs ouverts. Un message demandant s'il faut sauvegarder s'affichera le cas
chant.
128
Mthode Open
Ouvre un classeur dont le nom est pass comme premier argument. Le nom doit tre un chemin
long ou un chemin court s'il s'agit d'un classeur situ dans le rpertoire courant. La mthode utilise de
nombreux paramtres facultatifs comme la mise jour des liens, le mot de passe ou le format que nous
ne verrons pas ici. L encore, une rfrence au classeur ouvert est renvoy par la mthode.
Di mCl asseur Sour ce As Wor kbook, Cl asseur Ci bl e As Wor kbook

' ouvr e un cl asseur avec un chemi n absol u
Set Cl asseur Sour ce = Appl i cat i on. Wor kbooks. Open( " d: \ user \ E221. xl s" )
' ouvr e un cl asseur dans l e r per t oi r e en cour s
Set Cl asseur Ci bl e = Appl i cat i on. Wor kbooks. Open( " d: \ user \ Recap. xl s" )
Mthode OpenText
Permet d'ouvrir un fichier texte sous forme de classeur Excel, les donnes tant ventuellement
redistribues en fonction des arguments passs. De la forme :
Sub OpenText(Filename As String, [Origin As XlPlatform], [StartRow As Long], [DataType As
XlTextParsingType], [TextQualifier As XlTextQualifier = xlTextQualifierDoubleQuote],
[ConsecutiveDelimiter As Boolean], [Tab As Boolean], [Semicolon As Boolean], [Comma As
Boolean], [Space As Boolean], [Other As Boolean], [OtherChar As Char], [FieldInfo As
xlColumnDataType], [TextVisualLayout], [DecimalSeparator], [ThousandsSeparator],
[TrailingMinusNumbers], [Local])
Pour bien apprhender le fonctionnement de cette procdure vous devez comprendre le
fonctionnement de la redistribution dans Excel.
Par dfaut, Excel considre comme saut de ligne les caractres retour chariot et ou saut de ligne.
S'il n'en trouve pas, les donnes seront redistribues sur une ligne. Vous ne pouvez pas indiquer
d'autres caractres de saut de ligne directement Excel, autrement dit, vous devrez traiter par code
l'ouverture d'un fichier texte utilisant un sparateur diffrent.
Pour la rpartition des donnes dans les colonnes, Excel comprend deux modes, la redistribution
en largeur fixe et la redistribution dlimite. La redistribution en largeur fixe consiste fixer une
sparation par lot de n caractres sans tenir compte de la position d'un sparateur dans la ligne. Dans la
redistribution dlimite, on dfinit un ou plusieurs sparateurs qui dfinissent le dcoupage en
colonnes.
videmment, vous lverez une erreur si le fichier contient plus de 65536 lignes ou si la division
en colonnes implique plus de 256 colonnes.
C'est la dfinition de ce fonctionnement que grent les arguments de la mthode OpenText.
L'argument Filename est le seul argument obligatoire. Il dsigne le fichier ouvrir. Si aucun autre
argument n'est pass, le fichier sera redistribu en lignes si un sparateur correspondant existe et en
colonnes selon le caractre tabulation. Autrement dit, si le fichier texte ne contient ni caractre retour
chariot ni caractre tabulation, Excel essayera de mettre la totalit du contenu dans la cellule A1. Si le
contenu est trop grand, il sera automatiquement crt.
L'argument StartRow dfinit le numro de ligne o devra commencer la redistribution dans le cas
ou vous avez une entte que vous ne souhaitez pas redistribuer. S'il est omis, la redistribution
commencera la ligne 1.
L'argument DataType prcise le mode de redistribution souhaite, xlDelimited pour une
redistribution dlimite, xlFixedWidth sinon.
L'argument TextQualifier dfinit le qualificateur de texte, gnralement le caractre guillemet
double (").
L'argument ConsecutiveDelimiter va dfinir le comportement de redistribution lorsqu'il existe
plusieurs dlimiteurs conscutifs. Si l'argument est vrai, les dlimiteurs conscutifs seront considrs
comme un seul, sinon, il sera laiss une cellule vide pour chaque dlimiteur au del du premier.
La liste des arguments suivants va dfinir les dlimiteurs pour la redistribution en colonne. Les
dlimiteurs prdfinis possible, sont dans l'ordre, Tabulation, point virgule, virgule, espace.
129
Vous pouvez dfinir un autre sparateur en mettant l'argument Other vrai et en prcisant le
caractre dans l'argument OtherChar. Si celui-ci contient plus d'un caractre, seul le premier sera pris
en compte.
L'argument FieldInfo est le plus complexe manipuler. Il attend un tableau de tableaux de deux
lments. Les deux lments se dcomposent comme :
1) Le numro d'ordre de la colonne en mode dlimit ou la position du premier caractre de la
colonne dans la ligne en mode largeur fixe
2) Le numro de format de la colonne. Celle-ci est soit au format gnral (xlGeneralFormat) qui
laisse Excel interprter le type, soit au format texte (xlTextFormat), soit un format de date
(xlMDYFormat, xlDMYFormat, xlYMDFormat, xlMYDFormat, xlDYMFormat,
xlYDMFormat), soit un marqueur de non redistribution (xlSkipColumn).
En mode dlimit, vous n'tes pas oblig de prciser toutes les colonnes puisque par dfaut les
colonnes non prcises seront traites sur la base du format gnral. Les lments du tableau n'ont pas
besoin d'tre dans le mme ordre que les colonnes.
E ents.
Les autres a
Le code suiv sera redistribue
comm
Une premire colonne de huit caractres de format date
Une deuxime colonne de douze caractres au format texte
Une troisime colonne de cinq caractres au format texte
Une quatrime colonne de cinq caractres au format standard
Une cinquime colonne de quatre caractres au format standard
Une sixime colonne de trente six caractres au format texte
Tous les caractres au del du soixante dixime seront ignors
Wor kbooks. OpenText Fi l ename: =" D: \ User \ Tut os\ Excel \ demo1. t xt " ,
n mode largeur fixe, vous ne pouvez pas omettre d'lm
rguments ne prsentent pas de difficults particulires.
ant va ouvrir un fichier texte en mode largeur fixe, ou chaque ligne
e suit :
Or i gi n: =xl MSDOS, St ar t Row: =1, Dat aType: =xl Fi xedWi dt h, _
Fi el dI nf o: =Ar r ay( Ar r ay( 0, xl DMYFor mat ) , _
Ar r ay( 8, xl Text For mat ) , _
Ar r ay( 20, xl Text For mat ) , _
Ar r ay( 25, xl Gener al For mat ) , _
Ar r ay( 30, xl Gener al For mat ) , _
Ar r ay( 34, xl Text For mat ) , _
Ar r ay( 70, xl Ski pCol umn) ) , Tr ai l i ngMi nusNumber s: =Tr ue
Le code suivant ouvrira un fichier texte en mode dlimit ou les dlimiteurs seront soit le point
virgule, soit le point d'interrogation et o les dlimiteurs successifs seront ignors.
Les deux premires colonnes seront de type date et la quatorzime colonne sera ignore.
La premire ligne ne sera pas redistribue.
Wor kbooks. OpenText Fi l ename: =" D: \ User \ Tut os\ Excel \ demo1. t xt " ,
Or i gi n: =xl MSDOS, St ar t Row: =2, Dat aType: =xl Del i mi t ed,
Text Qual i f i er : =xl Doubl eQuot e, _
Consecut i veDel i mi t er : =Tr ue, Tab: =Fal se, Semi col on: =Tr ue,
Comma: =Fal se, Space: =Fal se, Ot her : =Tr ue, Ot her Char : =" ?" , _
Fi el dI nf o: =Ar r ay( Ar r ay( 1, xl DMYFor mat ) , _
Ar r ay( 2, xl DMYFor mat ) , _
Ar r ay( 14, xl Ski pCol umn) )
130
Proprits de l'objet Workbook renvoyant une collection
BuiltinDocumentProperties
Renvoie la collection DocumentProperties qui contient des informations gnrales sur le classeur.
Certaines de ses informations sont inhrentes au classeur, d'autres doivent avoir t saisie. S'utilise
gnralement sous la forme :
Wor kbook. Bui l t i nDocument Pr oper t i es( Pr opName) . Val ue
O PropName est le nom de la proprit recherche. Il est aussi possible de passer l'index de
l'lment recherch, mais vous prenez le risque d'avoir modifier votre code selon la version d'Excel
utilise.
Les noms admissibles sont :
Title Subject Author
Keywords Comments Template
Last author Revision number Application name
Last print date Creation date Last save time
Total editing time Number of pages Number of words
Number of characters Security Category
Format Manager Company
Number of bytes Number of lines Number of paragraphs
Number of slides Number of notes Number of hidden Slides
Number of multimedia
clips
Hyperlink base Number of characters (with
spaces)
Le code suivant renvoie chaque enregistrement une bote de messages avec l'auteur, le titre et la
date de sauvegarde.
Pr i vat e Sub Wor kbook_Bef or eSave( ByVal SaveAsUI As Bool ean, Cancel As
Bool ean)

Di mNomAs St r i ng, Ti t r e As St r i ng, Dat eSave As Dat e
Di mmsg As St r i ng

msg = " Cl asseur " &
Thi sWor kbook. Bui l t i nDocument Pr oper t i es( " Ti t l e" ) . Val ue & vbCr Lf
msg = msg & " Aut eur " &
Thi sWor kbook. Bui l t i nDocument Pr oper t i es( " Aut hor " ) . Val ue & vbCr Lf
msg = msg & " Sauv l e " & Thi sWor kbook. Bui l t i nDocument Pr oper t i es( " Last
save t i me" ) . Val ue & vbCr Lf
MsgBox msg

End Sub
Il existe une collection CustomDocumentProperties qui permet de grer des proprits de votre
choix.
Charts
Renvoie la collection des feuilles graphiques du classeur. Les graphiques incorpors aux feuilles
de calcul ne sont pas membres de cette collection.
Names
Renvoie la collection des noms du classeur. Attardons nous un peu sur cette notion de nom dans
Excel. Les noms dans Excel sont des variables locales attribues gnralement un classeur (parfois
une feuille) et sauvegardes avec lui. Un nom Excel fait donc rfrence soit une cellule ou plage de
cellule (cas le plus courant) mais peut aussi faire rfrence une formule ou une valeur.
131
La collection Names se manipule un peu diffremment des autres collections. Pour ajouter un
lment la collection, on peut utiliser la mthode Add. Celle-ci est de la forme :
Function Add([Name], [RefersTo], [Visible], [MacroType], [ShortcutKey], [Category],
[NameLocal], [RefersToLocal], [CategoryLocal], [RefersToR1C1], [RefersToR1C1Local]) As Name
Vous noterez dj que, fait rare, tous les arguments sont facultatifs. Cela ne veut pas dire qu'aucun
n'est obligatoire. Dans le concept des noms Excel, vous pouvez dcider de travailler en version dite
localise ou en version standard. A minima, un nom doit donc avoir un nom dfini dans l'argument
Name ou dans l'argument NameLocal, et une rfrence dfini dans un des arguments RefersTo.
Vous pouvez choisir de masquer le nom en mettant l'argument Visible Faux. Je ne dtaillerais
pas ici les notions de type, de macro, ni de catgorie.
Attention, pour faire rfrence une plage de cellule ne pas omettre le signe gal en dbut de
rfrence.
Di mMapl age As Range

' l e nomr f r e une pl age de cel l ul e
Thi sWor kbook. Names. Add NameLocal : =" Pl age" , Ref er sToLocal : =" =A1: B15"
' l e nomr f r e une cha ne de car act r e
Thi sWor kbook. Names. Add NameLocal : =" Cha ne" , Ref er sToLocal : =" A1: B15"
' aj out e un nompar act i on sur l a pr opr i t Name de l ' obj et Range
Set Mapl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " A1: A10" )
Mapl age. Name = " Nom1"
Ce code vous montre aussi une faon indirecte d'ajouter un nom la collection Names par le biais
d'un objet Range.
Pour extraire un nom de la collection, on utilise la mthode Item en passant comme argument soit
le nom en premier argument soit la valeur de la rfrence en troisime argument. Dans l'exemple
suivant, la bote de messages va afficher deux fois le mme index.
Thi sWor kbook. Names. Add " Exempl e" , 25
Di mMonNomAs Name
Set MonNom= Thi sWor kbook. Names( " exempl e" )
MsgBox MonNom. I ndex
Set MonNom= Thi sWor kbook. Names( , , " =25" )
MsgBox MonNom. I ndex
Notez que pour l'appel par la valeur de rfrence, je suis oblig d'utiliser la valeur stricte des
rfrences de nom Excel, c'est--dire une chane compose du signe gal suivi de la rfrence.
Pour rcuprer la valeur d'un nom, il suffit donc d'appeler une des proprits RefersTo de l'objet
Name slectionn. Notez que si la rfrence est une plage de cellule, je peux renvoyer un objet Range
avec la proprit RefersToRange ou mme directement passer le nom comme argument de l'objet
Range.
Di mMapl age As Range

' l e nomr f r e une pl age de cel l ul e
Thi sWor kbook. Names. Add NameLocal : =" Pl age" , Ref er sToLocal : =" =A1: B15"
Set Mapl age = Thi sWor kbook. Names( " Pl age" ) . Ref er sToRange
Set Mapl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " Pl age" )
Attention lorsque vous affectez des valeurs des noms, la valeur renvoye par les proprits
RefersTo seront de la forme chane commenant par gal. Vous pouvez utiliser la mthode Evaluate
de l'objet application pour reconvertir la valeur dans le bon type.
Thi sWor kbook. Names. Add " Exempl e" , 25
' Lve une er r eur de t ype
MsgBox 2 * Thi sWor kbook. Names( " Exempl e" ) . Ref er sTo
' Af f i che 50
MsgBox 2 * Appl i cat i on. Eval uat e( Thi sWor kbook. Names( " Exempl e" ) . Ref er sTo)
Pour retirer un nom de la collection on utilise la mthode Delete sur un nom dfini.
132
Sheets
Comme nous l'avons dj vu, la collection Sheets est assez pigeuse, le seul moment o il est utile
de l'utiliser est pour extraire le nombre de feuille du classeur ou pour connatre le type d'une feuille du
classeur.
Sub Test Feui l l e( )

Di mNbFeui l l e As I nt eger , compt eur As Long, TypeFeui l l e As St r i ng

NbFeui l l e = Thi sWor kbook. Sheet s. Count
For compt eur = 1 To NbFeui l l e
Sel ect Case Thi sWor kbook. Sheet s( compt eur ) . Type
Case Xl Sheet Type. xl Char t
TypeFeui l l e = " Feui l l e gr aphi que"

Case Xl Sheet Type. xl Di al ogSheet
TypeFeui l l e = " Bo t e de di al ogue Excel 5"

Case Xl Sheet Type. xl Excel 4I nt l Macr oSheet
TypeFeui l l e = " Feui l l e Macr o i nt er nat i onal e Excel 4"

Case Xl Sheet Type. xl Excel 4Macr oSheet
TypeFeui l l e = " Feui l l e macr o excel 4"

Case Xl Sheet Type. xl Wor ksheet
TypeFeui l l e = " Feui l l e de cal cul "
End Sel ect
MsgBox
Next compt eur

End Sub
Worksheets
Renvoie la collection des feuilles de calcul du classeur.
Quelques proprits & mthodes de l'objet Workbook
Bien que lobjet Workbook expose de nombreuses proprits et mthodes, elles sont assez
spcifiques et plutt utilises dans des scnarii particuliers ; nous nen verrons ici que quelques-unes.
Proprits FullName, Name & Path (String)
R
Name le nom du classeur avec son extension
Path le che
envoie l'ensemble ou les lments constitutifs du chemin du classeur.
FullName renvoie le nom complet du classeur
min (sans le dernier sparateur de fichier)
Proprit ReadOnly (Boolean)
Renvoie vrai si le classeur est ouvert en lecture seule.
Proprit Saved (Boolean)
Renvoi ou dfini si le classeur a t modifi depuis la dernire sauvegarde. Vous pouvez mettre
cette proprit False mme si le classeur a t modifi pour ne pas avoir l'affichage du message
d'alerte Excel lors de la fermeture d'un classeur modifi.
133
Mthode Close
Ferme le classeur.
Sub Close([SaveChanges As Boolean], [Filename As String],)
O SaveChanges dfinit la stratgie de sauvegarde telle que :
Les modifications sont enregistres si largument est vrai.
Les modifications ne sont pas enregistres si largument est faux.
Une bote de dialogues demande sil faut enregistrer les changements le cas chant
saffiche.
Et Filename dfinit un nom de fichier pour la sauvegarde, identique dans ce cas une utilisation
de SaveAs (Enregistrer sous).
I f Not Thi sWor kbook. Saved Then
Thi sWor kbook. Cl ose Tr ue
otge le classeur.
lean], [Windows As Boolean])

End I f
Mthode Protect
Pr
Sub Protect([Password As String], [Structure As Boo
Largument Password est le mot de passe de protection. Sil est omis, le classeur est protg sans
mot de passe et il est alors possible de le dprotger partir du menu Excel. Si largument Structure
est vrai, lordre des feuilles est fixe et il n'est pas possible d'en ajouter ou d'en supprimer, si largument
Windows est vrai, les fentres affichant le classeur sont bloques.
Notez que vous pouvez appeler Protect sans argument et dfinir les proprits quivalentes
Password, ProtectStructure et ProtectWindows.
Ne confondez pas le mot de passe de protection du classeur avec celui restreignant laccs en
criture.
Mthodes Save, SaveAs & SaveCopyAs
Ces trois mthodes grent la sauvegarde du classeur.
La mthode Save n'attend pas d'argument. Si vous l'utilisez sur un classeur que vous venez de
crer et qui n'a jamais t sauvegard, Excel tentera de l'enregistrer sous le nom donn par dfaut la
cration suivi de l'extension xls dans le rpertoire courant.
La mthode SaveCopyAs attend un nom de fichier comme argument. Le classeur ouvert ne verra
pas sa proprit Saved ramen vraie aprs l'appel de la mthode SaveCopyAs puisqu'il n'aura pas
t enregis
Sub Test
tr.
Save( )

Di mMonCl asseur As Wor kbook

Set MonCl asseur = Appl i cat i on. Wor kbooks. Add
Wi t h MonCl asseur . Wor ksheet s( 1) . Cel l s( 1, 1)
. Val ue = 1
. Resi ze( 100) . Dat aSer i es Rowcol : =xl Col umns, Type: =xl Li near , St ep: =1,
St op: =100, Tr end: =Fal se
End Wi t h
MonCl asseur . SaveCopyAs " t emp. xl s"
Debug. Pr i nt MonCl asseur . Saved
' Faux
End Sub
La mthode SaveAs est de la forme :
Sub SaveAs([Filename], [FileFormat], [Password], [WriteResPassword],
[ReadOnlyRecommended], [CreateBackup], [AccessMode As XlSaveAsAccessMode = xlNoChange],
[ConflictResolution], [AddToMru], [TextCodepage], [TextVisualLayout], [Local])
134
Sub Test Save( )

Di mMonCl asseur As Wor kbook

Set MonCl asseur = Appl i cat i on. Wor kbooks. Add
Wi t h MonCl asseur . Wor ksheet s( 1) . Cel l s( 1, 1)
. Val ue = 1
. Resi ze( 100) . Dat aSer i es Rowcol : =xl Col umns, Type: =xl Li near , St ep: =1,
St op: =100, Tr end: =Fal se
End Wi t h
MonCl asseur . SaveAs Fi l ename: =" D: \ User \ MonCl asseur . xl s" ,
Fi l eFor mat : =xl Nor mal , Passwor d: =" " , Wr i t eResPasswor d: =" passwor d" ,
ReadOnl yRecommended: =Tr ue, Cr eat eBackup: =Fal se

End Sub
Mthode Unprotect
De la forme Classeur.Unprotect("Mot de passe"), retire la protection du classeur.
Worksheets & Worksheet
La collection Worksheets reprsente l'ensemble des feuilles de calcul du classeur. Elle se
manipule comme l'ensemble des collections. Notez toutefois que la proprit Item renverra un objet et
non un objet Worksheet. Vous devrez forcer la conversion pour viter d'avoir une rupture IntelliSense.
Mthodes de la collection Worksheets
Add
Permet d'ajouter une feuille la collection en prcisant la position d'ajout.
Function Add([Before As Sheet], [After As Sheet], [Count As Integer], [Type As XlSheetType])
As Object
Je vous ai marqu Sheet comme type d'argument pour Before et After bien que ce type n'existe
pas. En effet, ces arguments attendent une feuille prcise du classeur pour savoir ou insrer la feuille
cre. Le comportement peut tre diffrent selon la nature de la prcision. Imaginons un classeur
contenant une feuille de calcul, une feuille graphique puis une autre feuille de calcul.
Sub AddWor ksheet ( )

Di mNouvel l eFeui l l e As Wor ksheet
Set Nouvel l eFeui l l e =
Thi sWor kbook. Wor ksheet s. Add( af t er : =Thi sWor kbook. Wor ksheet s( 2) )
' l a f eui l l e ser a i nsr e apr s l a deuxi me f eui l l e de cal cul ( 4me
posi t i on)
Set Nouvel l eFeui l l e =
Thi sWor kbook. Wor ksheet s. Add( af t er : =Thi sWor kbook. Sheet s( 2) )
' l a f eui l l e ser a i nsr e apr s l a deuxi me f eui l l e ( donc gr aphi que)
( 3me posi t i on)

End Sub
Vous ne devez prciser qu'un des deux arguments, soit After, soit Before, si vous n'en prcisez
aucun la feuille sera ajoute en premire position.
L'argument Count permet d'ajouter plusieurs feuilles ensemble.
L'argument Type est une aberration. Il permet de prciser le type de feuille que l'on souhaite
ajouter. En toute logique, puisque nous travaillons sur une collection de feuilles de calcul, nous ne
devrions pouvoir ajouter que des feuilles de calcul. Mais si nous crivons
Thi sWor kbook. Wor ksheet s. Add Af t er : =Thi sWor kbook. Wor ksheet s( 2) ,
Type: =xl Char t
135
Le compilateur ne verra pas d'erreurs avant que vous n'excutiez la ligne. L, une erreur sera
leve, puisque ce n'est pas cohrent, mais cela aurait t plus simple de ne pas mettre l'argument Type.
Copy
Permet de copier une feuille dans le classeur dfini la position dfini. De la forme :
Sub Copy([Before], [After])
Les arguments Before et After fonctionnent comme pour la mthode Add. Ils ne dsignent
cependant pas obligatoirement une feuille du classeur dont est issue la feuille copier. Ceci implique
qu'avec cette mthode on peut ou bien dupliquer la feuille dans un mme classeur, ou copier la feuille
dans un autre classeur.
Sub CopyWor ksheet ( )

' dupl i que l a f eui l l e en der ni r e posi t i on du cl asseur d' or i gi ne
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Copy
Af t er : =Thi sWor kbook. Sheet s( Thi sWor kbook. Sheet s. Count )
Di mMonCl asseur As Wor kbook
Set MonCl asseur = Appl i cat i on. Wor kbooks. Add
' copi e l a f eui l l e en pr emi r e posi t i on dans un nouveau cl asseur
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Copy
Bef or e: =MonCl asseur . Wor ksheet s( 1)

End Sub
Attention, si la feuille utilise des noms ou des rfrences externes, la copier dans un nouveau
classeur peut dclencher un certain nombre d'erreurs.
Notez que la feuille copie ne renvoie pas de rfrences sur la nouvelle feuille. La feuille copie
deviendra la feuille active ce qui vous donne un moyen ventuel de la retrouver, sinon vous pouvez le
faire en jouant sur la position d'insertion.
Sub CopyWor ksheet ( )

Di mMonCl asseur As Wor kbook, Feui l l eCol l ee As Wor ksheet
Set MonCl asseur = Appl i cat i on. Wor kbooks. Add
Set Feui l l eCol l ee = MonCl asseur . Wor ksheet s( 1)
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Copy Bef or e: =Feui l l eCol l ee
Set Feui l l eCol l ee = Feui l l eCol l ee. Pr evi ous

End Sub
Delete
Supprime l'ensemble des feuilles de calcul. Une exception sera leve si le classeur ne contient que
des feuilles de calcul.
FillAcrossSheets
Permet de recopier une plage de cellules dans l'ensemble des feuilles slectionnes. De la forme :
Sub FillAcrossSheets(Range As Range, [Type As XlFillWith = xlFillWithAll])
Pour dsigner une slection de feuille sans avoir les slectionner rellement, on passe un tableau
de noms de feuilles la proprit Worksheets.
Di mLi st Feui l l e As Var i ant

Li st Feui l l e = Ar r ay( " Feui l 1" , " Feui l 2" , " Feui l 4" )
Thi sWor kbook. Wor ksheet s( Li st Feui l l e) . Fi l l Acr ossSheet s _
Wor ksheet s( " Feui l 1" ) . Range( " A1: A20" ) , xl Fi l l Wi t hCont ent s
136
Move
Dplace la feuille dans le classeur
Sub Move([Before], [After])
O Before et After dsigne une feuille de rfrence.
Par exemple, le code suivant passe la premire feuille de calcul en dernire position (des feuilles
de calcul)
Sub MoveSheet 2End( )

Thi sWor kbook. Wor ksheet s( 1) . Move
af t er : =Thi sWor kbook. Wor ksheet s( Thi sWor kbook. Wor ksheet s. Count )

End Sub
PrintOut
Ordonne l'impression de la feuille, telle que
Sub PrintOut([From], [To], [Copies], [Preview], [ActivePrinter], [PrintToFile], [Collate],
[PrToFileName])
Je ne rentrerais ici dans le dtail des arguments car gnralement l'appel de la mthode sans
argument suffit.
Proprits de l'objet Worksheet renvoyant une collection
Cells
Renvoie la collection des cellules de la feuille sous forme d'un objet Range.
Columns & Rows
Renvoie la collection des colonnes ou des lignes de la feuille sous la forme d'un objet Range. Je le
mets en gras car il n'existe pas dans Excel d'objet Column ou Row. On peut rcuprer une colonne ou
une ligne soit en passant par l'identificateur de la colonne ou de la ligne, soit en utilisant l'index, soit
par des mthodes drives. Nous traiterons de tout cela plus loin dans le prsent document.
Comments
Bien que les commentaires soient attribus une cellule, ils sont accessibles par cette proprit
qui renvoie tous les commentaires des cellules de la feuille.
On utilise plus souvent la proprit Comment de lobjet Range pour atteindre un commentaire
spcifique ou par la mthode SpecialCells pour les rcuprer tous.
Hyperlinks
Renvoie la collection des liens hypertexte de la feuille. Un lien hypertexte est gnralement
affect une cellule ou un objet, il dsigne un emplacement dans le classeur ou dans un document
externe, une adresse mail, etc.
Sub Test Hyper Text e( )
Di mMaFeui l l e As Wor ksheet , MonLi en As Hyper l i nk

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 2" )
Set MonLi en = MaFeui l l e. Hyper l i nks. Add( Anchor : =MaFeui l l e. Cel l s( 2, 2) ,
Addr ess: = _
" D: \ J MARC\ Cl asseur 1. xl s" , SubAddr ess: =" Feui l 1! L1C1: L10C5" ,
Text ToDi spl ay: = _
" Li st e des donnes ext er nes" )
MonLi en. Fol l ow
End Sub
Names
137
Renvoie la collection des noms dfinis dans la feuille de calcul. Normalement les noms Excel
sont dfinis au niveau du classeur. Il est cependant possible de dfinir un nom au niveau de la feuille,
gnralement dans les deux cas suivants :
On ne souhaite pas que le nom soit visible lextrieur de la feuille
On veut redfinir un nom existant dans le classeur pour la feuille.
Shapes
Renvoie la collection des objets non OLE contenus dans la feuille, savoir formes gomtriques,
contrles de type formulaire, images, etc
Nous ne traiterons pas de ces objets dans ce cours, sauf pour les contrles incorpors.
Autres proprits de l'objet Worksheet
FilterMode (Boolean)
Renvoie vrai si la feuille est en mode filtr. Nous verrons un peu plus loin lutilisation des filtres.
Next & Previous (Worksheet)
Renvoie la feuille suivante ou prcdente dans la collection des feuilles de calcul ou Nothing si on
appelle Previous sur la premire feuille de la collection ou Next sur la dernire.
PageSetup (PageSetup)
Lobjet PageSetup renvoy reprsente la mise en page de la feuille gnralement fin
dimpression. Les proprits de lobjet PageSetup correspondent aux onglets de la bote de dialogue
mise en page du menu Fichier.
On pourrait les reprsenter ainsi :


138




139


Ce qui en code VBA scrirait
Wi t h Act i veSheet . PageSet up
. Pr i nt Ti t l eRows = " $1: $1"
. Pr i nt Ti t l eCol umns = " $A: $A"
. Lef t Header = " ET gauche"
. Cent er Header = " ET Cent r e"
. Ri ght Header = " ET dr oi t e"
. Lef t Foot er = " PP Gauche"
. Cent er Foot er = " PP Cent r e"
. Ri ght Foot er = " PP Dr oi t e"
. Lef t Mar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 590551181102362)
. Ri ght Mar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 590551181102362)
. TopMar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 905511811023622)
. Bot t omMar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 905511811023622)
. Header Mar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 393700787401575)
. Foot er Mar gi n = Appl i cat i on. I nchesToPoi nt s( 0. 47244094488189)
. Pr i nt Headi ngs = Tr ue
. Pr i nt Gr i dl i nes = Fal se
. Pr i nt Comment s = xl Pr i nt NoComment s
. Pr i nt Qual i t y = 600
. Cent er Hor i zont al l y = Tr ue
. Cent er Ver t i cal l y = Fal se
. Or i ent at i on = xl Landscape
. Dr af t = Tr ue
. Paper Si ze = xl Paper A3
. Fi r st PageNumber = 2
. Or der = xl DownThenOver
. Bl ackAndWhi t e = Tr ue
. Zoom= Fal se
. Fi t ToPagesWi de = 1
. Fi t ToPagesTal l = 2
. Pr i nt Er r or s = xl Pr i nt Er r or sBl ank
End Wi t h
140
Range (Range)
Renvoie ou dfinit un groupe de cellules de la feuille.
UsedRange (Range)
Renvoie ou dfinit la plage rectangulaire des cellules utilises. Attention il ne sagit pas de la
plage des cellules contenant quelque chose, mais une plage allant de la premire cellule la dernire
cellule ayant un contenu ou une proprit diffrant du standard.
Pr i vat e Sub t est usedr ange( )

Di mMaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s. Add
MaFeui l l e. Cel l s( 100, 10) . St yl e = " Pour cent age"
Debug. Pr i nt MaFeui l l e. UsedRange. Addr essLocal ( Tr ue, Tr ue, xl R1C1)
' L100C10
MaFeui l l e. Cel l s( 2, 3) . Val ue = " t est "
Debug. Pr i nt MaFeui l l e. UsedRange. Addr essLocal ( Tr ue, Tr ue, xl R1C1)
' L2C3: L100C10

End Sub
On utilise frquemment UsedRange lorsquon doit travailler sur les cellules de la feuille pour
restreindre la porte aux cellules rellement utilises.
Visible (XlSheetVisibility)
Dfinit laffichage ou le masquage de la feuille. Peut prendre une des valeurs suivantes :
xlSheetHidden 0 Masque la feuille
xlSheetVisible -1 Affiche la feuille
xlSheetVeryHidden
2 Masque la feuille sans quil soit possible pour
lutilisateur de la faire afficher.
Mthodes de l'objet Worksheet
Calculate
Force le calcul de la feuille. Inutile lorsque le mode de calcul est sur automatique. Noubliez pas
que bloquer le calcul automatique peut acclrer lexcution du code.
ChartObjects
Renvoie soit un graphique incorpor, soit la collection des graphiques incorpors de la feuille.
Nous verrons cela en dtail dans ltude des graphiques.
Copy
Identique la mthode de la collection Worksheets
Delete
Supprime la feuille. Sauf si vous avez dsactiv la proprit DisplayAlerts de lobjet Application,
vous aurez laffichage dun message de confirmation de suppression.
Move
Identique la mthode de la collection Worksheets
141
OLEObjects
Renvoie la collection des objets OLE contenus dans la feuille. Sans entrer trop dans le dtail, les
objets OLE sont des lments intgrs fournis par des composants externes (ou dautres applications)
pouvant tre dits dans lapplication qui les a cre. On trouve, entre autre, dans cette collection, les
contrles de bote de dialogues intgrs dans la feuille, ainsi que les objets accessible depuis le menu
Objet dans le menu Insertion dExcel.
Sub I nser t OLE( )

Di mMaf eui l l e As Wor ksheet

Set Maf eui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 3" )
' aj out e un f i chi er wor d exi st ant et l ' i nt gr e comme obj et l i
Maf eui l l e. OLEObj ect s. Add Fi l ename: =" D: \ t ut or i el \ t ut o. doc" , Li nk: =Tr ue,
Di spl ayAsI con: =Fal se
' aj out e un cont r ol e spi n comme obj et embar qu
Maf eui l l e. OLEObj ect s. Add Cl assType: =" For ms. Spi nBut t on. 1" , Li nk: =Fal se,
Di spl ayAsI con: =Fal se, Lef t : =173. 25, Top: =197. 25, Wi dt h: =12. 75, Hei ght : =25. 5

End Sub
Paste & PasteSpecial
Ces deux mthodes servent copier des lments sur une feuille de calcul et non une feuille de
calcul elle-mme. De la forme :
Sub Paste([Destination As Range], [Link As Boolean])
O destination est la plage o doit tre coll le contenu du presse-papiers. Si l'argument est omis
et qu'une plage est ncessaire, c'est la slection qui sera utilise. L'argument Link colle l'lment
comme un lien Hypertexte. Les deux arguments sont exclusifs, vous devez prciser soit l'un, soit
l'autre, soit aucun.
Sub PasteSpecial([Format], [Link], [DisplayAsIcon], [IconFileName], [IconIndex],
[IconLabel], [NoHTMLFormatting])
Ne confondez pas cette mthode avec la mthode du mme nom de l'objet Range. La mthode
PasteSpecial de l'objet Worksheet colle des lments externes Excel, gnralement des objets OLE.
De manire gnrale, on vite d'utiliser ces mthodes pour coller des cellules Excel, on utilise
plutt la mthode Copy de l'objet Range ou des affectations directes.
PrintOut
Identique la mthode de la collection Worksheets
Protect & Unprotect
Protge ou retire la protection de tout ou partie de la feuille.
Sub Protect([Password], [DrawingObjects], [Contents], [Scenarios], [UserInterfaceOnly],
[AllowFormattingCells], [AllowFormattingColumns], [AllowFormattingRows],
[AllowInsertingColumns], [AllowInsertingRows], [AllowInsertingHyperlinks],
[AllowDeletingColumns], [AllowDeletingRows], [AllowSorting], [AllowFiltering],
[AllowUsingPivotTables])
Le premier argument est le mot de passe de protection. S'il est omis, la feuille sera protge mais
la protection pourra tre enleve directement dans le menu Outils Protection d'Excel.
142
Les autres arguments sont des boolens indiquant ce qui doit tre protg. La mthode Unprotect
n'attend que le mot de passe comme argument, tous les lments sont dprotgs quand on invoque
Unprotect.
Di mMaf eui l l e As Wor ksheet

Set Maf eui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
Maf eui l l e. Pr ot ect " Passwor d" , Dr awi ngObj ect s: =Fal se, Cont ent s: =Tr ue,
Scenar i os: = _
Tr ue, Al l owI nser t i ngCol umns: =Tr ue, Al l owI nser t i ngRows: =Tr ue, _
Al l owI nser t i ngHyper l i nks: = , Al l owDel et i ngCol umns: =Tr ue, _ Tr ue
bjet Ran
mples, je n'c
e convention que toute vari
Cells. L'objet R
jet Range reprsente plusieurs cel
considres comme une unit logique. C'e
s cellules qu'il contient s
ensemb
tilises, j
s un objet Range expose
de Item de l'objet Range
Al l owDel et i ngRows: =Tr ue
Range & Cells
C'est dans la manipulation de ces objets que se trouve le corps de la programmation Excel.
Lorsque vous saurez bien manipuler l'o ge, la programmation VBA Excel ne prsentera plus
tellement de difficults.
Pour ne pas allonger inutilement les codes exe rirais pas toujours les affectations des
objets parent dans les exemples. Prenons comm able contenant le mot
'Feuille' sera un objet de type Worksheet et que toute variable contenant le mot 'Classeur' sera un objet
de type Workbook.
Concepts
Le plus dur consiste diffrencier Range et ange reprsente une ou plusieurs
cellules de la mme feuille de calcul. Lorsque l'ob lules, elles ne sont
pas forcment contigus, mais elles sont st--dire que tout
action sur l'objet Range agit sur toutes le auf si un sous ensemble particulier
est spcifi.
Il n'existe pas d'objet Cells. Cells est une proprit qui renvoie une collection de cellules d'un
objet contenant des cellules, c'est--dire d'un objet Worksheet ou d'un objet Range. La proprit Cells
renvoie un objet Range puisque par dfinition, l'objet Range est une collection de cellules.
Comme vous le voyez, il n'existe pas de diffrence entre les deux, mais les deux sont reprsents
pour des raisons de lisibilit.
Le choix d'utiliser une notation Cells ou une notation Range est gnralement dict par la logique
du code. Par exemple, pour faire rfrence l' le des cellules d'une feuille, j'aurais tendance
crire :
Feui l l e. Cel l s
Mais pour faire rfrence l'ensemble des cellules u e noterais :
Feui l l e. UsedRange
Dans les deux cas, c'est bien un objet Range qui est renvoy.
Cela peut paratre incohrent, mai toujours une collection Cells qui
renvoie un objet Range identique.
De la mme faon, les notations de la mtho sont toutes quivalentes. Il
n'y a pas de diffrences entre les rfrences :
Feui l l e. Cel l s( 2, 3)
Feui l l e. Range( " C2" )
143
Mme si dans certains cas une notation sera prfrable pour des raisons d'criture de code. Ainsi
si nous souhaitons parcourir une cellule sur deux de la plage "A1:AZ1", il sera plus simple d'crire :
Sub Par cour i r ( )

Di mcompt eur As Long, MaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
For compt eur = 1 To 52 St ep 2
MaFeui l l e. Cel l s( 1, compt eur ) . I nt er i or . Col or = vbBl ue
Next compt eur

End Sub
Que
Sub Par cour i r ( )

Di mcompt eur As Long, MaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
For compt eur = 1 To 52 St ep 2

MaFeui l l e. Range( Mi d( MaFeui l l e. Col umns( compt eur ) . Addr ess( col umnAbsol ut e: =Fal
se) , Len( MaFeui l l e. Col umns( compt eur ) . Addr ess( col umnAbsol ut e: =Fal se) ) \ 2 +
2) & " 1" ) . I nt er i or . Col or = vbBl ue
Next compt eur

End Sub
Le choix des notations vient avec l'exprience. Gnralement, il est induit aussi par votre faon de
manipuler les plages. Dans le prsent cours, je vais utiliser ma faon de noter. Elle n'est pas universelle
et en aucune faon la seule faon de procder. Nous verrons plus loin dans l'tude de cas pratiques
qu'il y a souvent plusieurs techniques envisageables pour un mme but.
S'il est entendu que l'objet Cell n'existe pas en tant que tel, regardons quand mme comment est
architecture une cellule au sens VBA du terme, c'est--dire sous la forme de proprits de l'objet
Range.

144
Et je n'ai reprsent ici que quelques proprits. Les cellules sont des objets relativement
complexes, bien quon nait plus de difficults les manipuler lorsquon connat le modle.
Le deuxime aspect important de l'objet Range est sa faon d'agir sur plusieurs cellules comme s'il
n'y en avait qu'une. Toutes les proprits de l'objet Range ne ragissent pas de la mme faon lorsque
l'objet contient plusieurs cellules. Les proprits de contenu, principalement Formula et Value, parfois
appeles proprits tableaux sont gres sous forme d'un tableau de Variant. On peut alors les affecter
directement une plage de taille identique sans se soucier du contenu de chaque cellule, l'affectation
se faisant par identification de position. Ainsi le code :
Range( " C1: C5" ) . Val ue = Range( " A9: A13" ) . Val ue
Recopiera bien les valeurs de la plage source dans la plage cible, o la valeur A9 sera recopie
dans C1, celle de A10 dans C2 et ainsi de suite.
Imaginons maintenant que nous ayons un code tel que :
Range( " C1: C3" ) . I nt er i or . Col or = Range( " A9: A11" ) . I nt er i or . Col or
Comment va-t-il tre interprt ?
Et bien a dpend. Comme la proprit Interior n'est pas une proprit tableau, Excel va la grer
comme une proprit regroupe. Les proprits regroupes fonctionnent de la manire suivante :
Si toutes les cellules de la plage ont la mme valeur pour cette proprit, l'objet Range
renverra cette valeur
Si la proprit d'une cellule au moins diffre de celles des autres, l'objet Range renverra
salon les cas, Null, Nothing, ou une valeur arbitraire.
Dans le cas de la proprit Color de l'objet Interior, la valeur renvoye pour une plage htrogne
est la valeur 16777215 (&FFFFFF) (blanc). Autrement dit, si toutes les cellules de la plage A9:A11
ont la mme couleur de fond, alors la plage C1:C3 aura aussi la mme couleur, sinon, la plage C1:C3
aura un fond blanc. Il est toujours assez complexe de savoir ce que renvoient les proprits regroupes,
on vite donc gnralement de procder comme dans mon exemple prcdent. En affectation il ne peut
y avoir de problmes, du fait que la modification de la valeur de la proprit de la plage induit la
modification de la proprit pour chaque cellule pour une valeur identique. En lecture, il est
indispensable de savoir qu'elle valeur sera renvoye pour les plages htrognes. Dans l'tude des
proprits, je vous noterais cette valeur sous la forme :
Plage htrogne Valeur
Nous allons voir maintenant les proprits et mthodes de lobjet Range qui sont donc autant
celles dune cellule que dune collection de cellules. A chaque fois que jemploierais le terme la plage
de cellules, cela sappliquera aussi une cellule unique, sauf spcification particulire.
Valeurs & Formules
Nous allons commencer par traiter des proprits assez particulires de l'objet Range qui grent le
contenu de la cellule.
Pour Excel, le contenu des cellules n'est pas typ priori. Excel interprte le contenu des cellules
et peut selon les cas, mettre la donne sous une autre forme ou appliquer un formatage ce qui fait que
l'apparence du contenu peut diffrer du contenu rel.
Notez que dans Excel, le contenu de la cellule tel qu'il est entr par l'utilisateur n'existe pas
forcment dans une des proprits de la cellule.
Comme Excel est un tableur, il gre aussi des formules. Dans ce cas, le contenu rel de la cellule
est la formule. Cependant, les mmes rgles s'appliquent. C'est--dire que le rsultat de la formule est
calcul, et que ce contenu peut tre format. Ce mcanisme qui parat assez vident lorsqu'on l'utilise
directement est assez complexe au niveau des proprits de l'objet Range.
Celui possde donc plusieurs proprits qui exposent les diffrentes reprsentations du contenu.
Celles-ci se regroupent globalement en deux familles, celles qui exposent les formules :
Formula
FormulaR1C1
FormulaLocal
Formula R1C1Local
145
Celles qui exposent les valeurs.
Value
Value2
Text
Cette division n'a de sens que lorsque la cellule contient une formule, lorsqu'elle contient une
valeur, les proprits de formule renvoient la valeur. Lorsqu'une cellule est vide, elle renvoie Empty.
Prenons un exemple simple, la cellule A1 contient la valeur 14, la cellule A2 contient la formule
=2*A1/10, la cellule A3 contient la formule =Log(A1;A2)
Si on lit l'aide d'un code les proprits prcdentes, on obtient :
Debug. Pr i nt Range( " A1" ) . For mul a ' 14
Debug. Pr i nt Range( " A1" ) . For mul aLocal ' 14
Debug. Pr i nt Range( " A1" ) . For mul aR1C1 ' 14
Debug. Pr i nt Range( " A1" ) . For mul aR1C1Local ' 14
Debug. Pr i nt Range( " A1" ) . Val ue ' 14
Debug. Pr i nt Range( " A1" ) . Val ue2 ' 14
Debug. Pr i nt Range( " A1" ) . Text ' 14
Debug. Pr i nt Range( " A2" ) . For mul a ' =2*A1/ 10
Debug. Pr i nt Range( " A2" ) . For mul aLocal ' =2*A1/ 10
Debug. Pr i nt Range( " A2" ) . For mul aR1C1 ' =2*R[ - 1] C/ 10
Debug. Pr i nt Range( " A2" ) . For mul aR1C1Local ' =2*L( - 1) C/ 10
Debug. Pr i nt Range( " A2" ) . Val ue ' 2, 8
Debug. Pr i nt Range( " A2" ) . Val ue2 ' 2, 8
Debug. Pr i nt Range( " A2" ) . Text ' 2, 8
Debug. Pr i nt Range( " A3" ) . For mul a ' =LOG( A1, A2)
Debug. Pr i nt Range( " A3" ) . For mul aLocal ' =LOG( A1; A2)
Debug. Pr i nt Range( " A3" ) . For mul aR1C1 ' =LOG( R[ - 2] C, R[ - 1] C)
Debug. Pr i nt Range( " A3" ) . For mul aR1C1Local ' =LOG( L( - 2) C; L( - 1) C)
Debug. Pr i nt Range( " A3" ) . Val ue ' 2, 56313865645652
Debug. Pr i nt Range( " A3" ) . Val ue2 ' 2, 56313865645652
Debug. Pr i nt Range( " A3" ) . Text ' 2, 56313866
Tout cela est assez cohrent. Vous noterez cependant que dans le cas de la cellule A3 renvoie une
valeur diffrente dans Value et dans Text. Cela vient du fait que la valeur renvoye par la proprit
Text est le contenu tel qu'il est affich.
Prenons maintenant un deuxime exemple. C1 contient la valeur 30/10/2002, C2 contient la
formule =TEMPS(10;27;42) et C3 la formule =$C$1+$C$2
Un code de lecture identique au prcdent donnerait :
Debug. Pr i nt Range( " C1" ) . For mul a ' 37559
Debug. Pr i nt Range( " C1" ) . For mul aLocal ' 37559
Debug. Pr i nt Range( " C1" ) . For mul aR1C1 ' 37559
Debug. Pr i nt Range( " C1" ) . For mul aR1C1Local ' 37559
Debug. Pr i nt Range( " C1" ) . Val ue ' 30- oct - 2002
Debug. Pr i nt Range( " C1" ) . Val ue2 ' 37559
Debug. Pr i nt Range( " C1" ) . Text ' 30- 10- 2002
Debug. Pr i nt Range( " C2" ) . For mul a ' =TI ME( 10, 27, 42)
Debug. Pr i nt Range( " C2" ) . For mul aLocal ' =TEMPS( 10; 27; 42)
Debug. Pr i nt Range( " C2" ) . For mul aR1C1 ' =TI ME( 10, 27, 42)
Debug. Pr i nt Range( " C2" ) . For mul aR1C1Local ' =TEMPS( 10; 27; 42)
Debug. Pr i nt Range( " C2" ) . Val ue ' 0, 435902777777778
Debug. Pr i nt Range( " C2" ) . Val ue2 ' 0, 435902777777778
Debug. Pr i nt Range( " C2" ) . Text ' 10: 27 AM
Debug. Pr i nt Range( " C3" ) . For mul a ' =$C$1+$C$2
Debug. Pr i nt Range( " C3" ) . For mul aLocal ' =$C$1+$C$2
Debug. Pr i nt Range( " C3" ) . For mul aR1C1 ' =R1C3+R2C3
Debug. Pr i nt Range( " C3" ) . For mul aR1C1Local ' =L1C3+L2C3
Debug. Pr i nt Range( " C3" ) . Val ue ' 30- oct - 2002 10: 27: 42
Debug. Pr i nt Range( " C3" ) . Val ue2 ' 37559, 4359027778
Debug. Pr i nt Range( " C3" ) . Text ' 30- 10- 2002 10: 27
146
Dtaillons ensemble ces rsultats car ils exposent assez bien le fonctionnement de ces proprits.
Nous avons entr la chane 30/10/2002. Comme nous l'avons vu prcdemment, Excel gre les dates
sous la forme d'un nombre entier. Comme il a reconnu une date dans la valeur saisie, il a opr une
conversion de valeur pour transformer la date saisie en entier. Nous l'avons vu en prambule, les
proprits renvoyant les formules renvoient une valeur lorsque la cellule ne contient pas de formule.
La valeur relle de la cellule est l'entier 37559 (nombre de jour entre le 30/10/2002 et le 01/01/1900),
toutes les proprits formules renvoient cet entier. La proprit Value renvoie toujours la valeur
formate. Excel interprte l'entier comme une date, lui applique le formatage par dfaut, dans ce cas le
format de date courte tel qu'il est dfini dans le panneau de configuration du systme et renvoie cette
valeur dans la proprit Value.
la cellule non format. Dans ce cas il s'agit
donc d de la cellule tel qu'il est affich. On pourrait
s'attendre ce qu'il renvoie alors la chane saisie, mais tel n'est pas le cas. En effet, Excel utilise
toujours les sparateurs de dates dfinit par le systme sauf si vous lui avez indiqu explicitement un
autre sparateur, soit en modifiant le format de la cellule, soit en modifiant les sparateurs dans la
configuration d'Excel. Dans ce cas, vous noterez que la valeur que nous avons saisie n'existe plus
(mme s'il est assez simple de la reformer).
Pour la cellule C2, vous remarquerez juste que les formules locales utilisent des noms de
fonctions localises (dans notre cas en Franais) et le sparateur d'argument localis (le point virgule)
et les proprits non locales utilisent les noms de fonctions et le sparateur d'argument Amricain.
Je viens de dire prcdemment que la proprit Value renvoie toujours un contenu format, et
vous voyez bien que la proprit Value de la cellule C2 renvoie un temps non format. N'allez pas
pour autant croire que je draille (encore que) mais dans ce cas, nous avons utilis la fonction
Temps qui transforme un temps en sa reprsentation numrique. Excel considrant que nous ne
sommes pas suffisamment bourrs pour lui demander de reformater une fonction qui sert justement
ne pas formater sous la forme d'un temps, il renvoie bien dans la proprit Value la valeur renvoye
par la fonction, dans ce cas 0,435902777777778. La proprit Value2 qui elle ne formate jamais
renvoie la mme valeur. Enfin comme prvu, la proprit Text renvoie la valeur affiche.
Si vous m'avez suivi jusque l, l'interprtation de la cellule C3 ne prsente rien de nouveau. Vous
noterez juste que la notation amricaine R1C1 est sous forme L1C1 dans les versions localises de la
formule.
Prenez deux aspirines, une petite pause, plus qu'un dernier petit col et ensuite c'est tranquille.
Vous tes prt ? Alors continuons.
A l'exception de la proprit Text, toutes ces proprits que nous venons de voir prsentent donc
une autre particularit, ce sont des proprits tableau. Comme nous l'avons dj dit, une proprit
tableau renvoie ou dfinit un tableau de valeur quand l'objet Range contient plusieurs cellules.
Autrement dit, ces proprits renvoient ou dfinissent un Variant contenant un tableau de Variant
reprsentant le contenu de chaque cellule sous forme de valeurs et de formules. Dans tous les cas, il
s'agit d'un tableau deux dimensions o la premire dimension reprsente les lignes et la seconde les
colonnes. La limite basse de chaque dimension vaut toujours 1.
Dans le cas simple des plages continues, le tableau va reprsenter donc la plage sous la forme :
(1 To Nombre de lignes, 1 To Nombre de colonnes)
La proprit Value2 renvoie toujours le contenu de
e l'entier 37559. Text renvoie toujours le contenu
147
Partons d'un fichier exemple qui ressemble :

Nous allons travailler sur la plage L3C3:L30C7 (ou C3:G30 si vous prfrez les notations
standards).
Fort de ce que nous venons de dire, nous pourrions crire :
Sub Val eur s( )

Di mMaPl age As Range, TabVal eur As Var i ant
Di mcmpt Li gne As Long, NbLi gne As Long, NbCol As Long

Set MaPl age = Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Range( " C3: G30" )
TabVal eur = MaPl age. Val ue
NbLi gne = UBound( TabVal eur , 1)
NbCol = UBound( TabVal eur , 2)
MsgBox NbLi gne & " l i gnes" & vbNewLi ne & NbCol & " col onnes"
For cmpt Li gne = 1 To NbLi gne
TabVal eur ( cmpt Li gne, 1) = TabVal eur ( cmpt Li gne, 2) + 1
Next
Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Cel l s( 1, 10) . Resi ze( NbLi gne,
NbCol ) . Val ue = TabVal eur

End Sub
Dans ce code, je rcupre la proprit Value de l'objet Range MaPlage dans une variable
TabValeur de type Variant. Comme MaPlage contient plusieurs cellules et que Value est une proprit
tableau, TabValeur est un tableau. Je peux donc rcuprer le nombre de lignes et de colonnes de ce
tableau pour vfifier qu'il fait la mme taille que ma plage.
Dans mon tableau, je vais parcourir l'ensemble des lignes de la premire colonne et leur affecter
comme valeur la valeur de la case situe sur la mme ligne de la colonne 2 + 1.
Je vais ensuite dfinir une plage partant de I1 faisant la mme taille que mon tableau, et affecter
sa proprit Value la variable TabValeur.
148
Vous noterez que les cellules de la nouvelle plage contiennent bien les valeurs d'origine sauf pour
celle de la premire colonne qui ont t modifies.
Notez aussi que si je n'avais pas de modification faire, je pourrais affecter directement tel que :
Sub Val eur s( )

Di mMaPl age As Range, TabVal eur As Var i ant
Di mNbLi gne As Long, NbCol As Long

Set MaPl age = Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Range( " C3: G30" )
TabVal eur = MaPl age. Val ue
NbLi gne = UBound( MaPl age. Val ue, 1)
NbCol = UBound( MaPl age. Val ue, 2)
MsgBox NbLi gne & " l i gnes" & vbNewLi ne & NbCol & " col onnes"
Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Cel l s( 1, 10) . Resi ze( NbLi gne,
NbCol ) . Val ue = MaPl age. Val ue

End Sub
Mais revenons sur l'exemple prcdent. Alors que j'ai modifi la valeur des cellules de la premire
colonne de la plage, les valeurs de moyenne n'ont pas changes. Si nous allons voir une cellule de la
nouvelle colonne moyenne, nous constatons que la formule a disparu et qu'elle ne contient plus que la
valeur ce qui n'est pas surprenant puisque nous avons fait une rcupration de la proprit Value.
Imaginons un code similaire en travaillant sur les formules. Soit le code :
Sub For mul e( )

Di mMaPl age As Range, TabFor mul e As Var i ant
Di mcmpt Li gne As Long, NbLi gne As Long, NbCol As Long

Set MaPl age = Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Range( " C3: G30" )
TabFor mul e = MaPl age. For mul aLocal
NbLi gne = UBound( TabFor mul e, 1)
NbCol = UBound( TabFor mul e, 2)
MsgBox NbLi gne & " l i gnes" & vbNewLi ne & NbCol & " col onnes"
mpt Li gne = 1 To NbLi gn
Ne
OYENNE(L onne
L(2)C(-11):L(2)C(-8)) s'es
l'affectation une nouvelle plage pour garder ses arguments de la plage d'origine.
Il convient donc de faire attention, si l'affectation d'un tableau de valeurs quivaut bien faire un
collage spcial des valeurs, la manipulation d'un tableau de formules n'quivaut pas un collage
spcial des formules.
Nous retrouverons ces concepts dans la suite de ce document.
For c e
TabFor mul e( cmpt Li gne, 1) = CSt r ( Val ( TabFor mul e( cmpt Li gne, 2) ) + 1)
xt
Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Cel l s( 1, 10) . Resi ze( NbLi gne,
NbCol ) . For mul aLocal = TabFor mul e

End Sub
Notez dj que nous devons procder des conversions de types puisque le tableau rcupr
contient des chanes et non des nombres. Cependant mme dans ce cas, la moyenne reste identique
celle de la plage source. Si nous allons voir une cellule de la colonne moyenne, nous voyons que la
formule d'origine, =M C(-4):LC(-1)) apparat dans la nouvelle col moyenne sous la
forme =MOYENNE( . C'est--dire que la formule t modifie lors de
149
Proprits de lobjet Range renvoyant un objet Range
Areas (Areas)
La proprit Areas renvoie une collection Areas qui est une collection dobjets Range lorsque
lobjet est une plage discontinue. Une plage discontinue contient des lments qui ne sont pas tous
contigus. Prenons un exemple qui sous forme de slection donnerait :

L e correspondant pourrait tre obtenu avec un code tel que :
Di mM Range
objet Rang
aPl age As

' const r uct i on de l ' obj et r ange di scont i nu
Wi t h Thi sWor kbook. Wor ksheet s( " CSF" )
Set MaPl age = . Range( . Cel l s( 2, 1) , . Cel l s( 25, 2) )
Set MaPl age = Appl i cat i on. Uni on( MaPl age, . Cel l s( 2, 4) . Resi ze( 24) )
Set MaPl age = Appl i cat i on. Uni on( MaPl age, . Cel l s( 2, 7) . Resi ze( 24) )
End Wi t h
MaPl age. Sel ect
Comme je vous lai dit au dbut de ce chapitre, un objet Range considre toutes les cellules
comme une cellule si jagis sur lui. Je pourrais donc modifier la couleur de la police avec le code
MaPl age. Font . Col or = vbRed
150
Ce qui donnerait :

Imaginons maintenant que nous souhaitions rcuprer le nombre de cellules et le nombre de
colonnes de lobjet Range.
Sub Test Ar ea( )

Di mMaPl age As Range

' const r uct i on de l ' obj et r ange di scont i nu
Wi t h Thi sWor kbook. Wor ksheet s( " CSF" )
Set MaPl age = . Range( . Cel l s( 2, 1) , . Cel l s( 25, 2) )
Set MaPl age = Appl i cat i on. Uni on( MaPl age, . Cel l s( 2, 4) . Resi ze( 24) )
Set MaPl age = Appl i cat i on. Uni on( MaPl age, . Cel l s( 2, 7) . Resi ze( 24) )
End Wi t h
MsgBox MaPl age. Cel l s. Count ' 96
MsgBox MaPl age. Col umns. Count ' 2 ????

End Sub
Si le compte de cellules est juste, le compte de colonnes, lui, ne lest pas. De fait, la proprit
Columns ne sait pas rpondre sur une plage discontinue et renvoie dans cet exemple le nombre de
colonnes de la premire plage continu contenue dans la plage discontinue. La notion de premire
plage sentend dans le sens des rfrences Excel, c'est--dire la plus gauche et/ou la plus haute.
Pour avoir le bon compte de colonnes, il faudrait crire un code comme :
Di mcmpt Col As I nt eger , t mpPl age As Range
I f MaPl age. Ar eas. Count > 1 Then
For Each t mpPl age I n MaPl age. Ar eas
cmpt Col = cmpt Col + t mpPl age. Col umns. Count
Next
El se
cmpt Col = MaPl age. Col umns. Count
End I f
MsgBox cmpt Col
151
Notez que cette proprit est intressante sur le fait quune simple valuation de sa proprit
Count permet de savoir si la plage reprsente par lobjet Range est continue ou non.
Cells (Range)
Eh oui, cest le cercle maudit. Un objet Range expose une proprit Cells qui renvoie la collection
des cellules sous la forme dun objet Range qui renvoie une collection Cells (et ainsi de suite).
A part vous embrouiller on utilise cette proprit explicitement soit pour dsigner une cellule de la
plage, soit pour numrer les cellules de la plage.
Pour lnumration pas de problme.
Sub EnumCel l ( )

Di mMaCel l As Range, Somme As Doubl e

For Each MaCel l I n Thi sWor kbook. Wor ksheet s( " CSF" ) . Range( " C3: C30" ) . Cel l s
I f I sNumer i c( MaCel l . Val ue) Then Somme = Somme + MaCel l . Val ue
Next MaCel l
MsgBox Somme

End Sub
Pour la dsignation, cest dj autrement prilleux. Raisonnons sur la plage "A1 : E5".
Les cellules de cette plage peuvent tre dsignes soit par leur position absolue dans la plage, soit
par leur position "linaire", c'est--dire comme si la plage tait sur une colonne ou sur une ligne en
lisant les cellules de la gauche vers la droite puis de bas en haut.

Jusque l rien de bien sorcier, on peut crire :
Sub Desi gnat i on( )

Di mMapl age As Range
Set Mapl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " A1: E5" )
' dsi gnat i on absol u
Debug. Pr i nt Mapl age. Cel l s( 3, 2) . Addr ess( Fal se, Fal se) ' B3
' dsi gnat i on l i nai r e
Debug. Pr i nt Mapl age. Cel l s( 13) . Addr ess( Fal se, Fal se) ' C3

End Sub
Malheureusement on peut aussi crire
Sub Desi gnat i on( )

Di mMapl age As Range
Set Mapl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " A1: E5" )
' dsi gnat i on absol u
Debug. Pr i nt Mapl age. Cel l s( 6, 2) . Addr ess( Fal se, Fal se) ' B6
' dsi gnat i on l i nai r e
Debug. Pr i nt Mapl age. Cel l s( 29) . Addr ess( Fal se, Fal se) ' D6

End Sub
152
Et atteindre ainsi des cellules qui ne sont pas dans la plage.
De plus il faut faire attention car la dsignation dite absolue est en fait relative la plage, donc on
aurait :
Sub Desi gnat i on( )

Di mMapl age As Range

Set Mapl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " B2: F6" )
Debug. Pr i nt Mapl age. Cel l s( 6, 2) . Addr ess( Fal se, Fal se) ' C7
Debug. Pr i nt Mapl age. Cel l s( 0, 0) . Addr ess( Fal se, Fal se) ' A1

End Sub
Donc mfiez vous de la dsignation en partant d'une plage et essayez plutt de travailler sur des
rfrences fixes.
Columns & Rows
Si la manipulation de ces proprits en partant de la feuille est assez triviale, elle peut tre un peu
plus pigeuse lorsqu'on travaille sur des objets Range.
Pour les plages continues, ces proprits renvoient un objet Range contenant toutes les cellules
appartenant la colonne ou la ligne de l'objet Range d'o elles sont appeles. Un petit exemple est
plus simple comprendre.
Sub Test Col Row( )

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " t abl eau" ) . Range( " C3: G30" )
Debug. Pr i nt MaPl age. Col umns( 2) . Addr ess( Fal se, Fal se, xl A1)
' D3: D30
Debug. Pr i nt MaPl age. Rows( 2) . Addr ess( Fal se, Fal se, xl A1)
' C4: G4

End Sub
Autrement dit, c'est un objet Range reprsentant l'intersection entre la ligne ou la colonne et l'objet
Range. Attention, si la colonne ou la ligne n'appartiennent pas l'objet Range, c'est une plage dcale
qui va tre renvoye. Celle-ci sera alors l'intersection entre par exemple la ligne spcifie et les
colonnes de l'objet Range appelant. Par exemple :
Debug. Pr i nt MaPl age. Rows( 31) . Addr ess( Fal se, Fal se, xl A1)
' C33: G33
Lorsqu'on souhaite obtenir une plage de colonnes ou de lignes continues, on passe un argument
sous forme de texte prcisant les colonnes (en lettres) ou les lignes (en chiffres). Attention, il s'agit
d'une rfrence relative, c'est--dire que pour un objet Range "C3:G30", l'appel de la proprit
Columns("B") renvoie "D3:D30".
Comme ces proprits renvoient un objet Range, il est possible de les enchaner :
Debug. Pr i nt MaPl age. Col umns( " A: C" ) . Rows( " 2: 8" ) . Addr ess( Fal se, Fal se,
xl A1)
' C4: E10
153
Dependents, DirectDependents, Precedents & DirectPrecedents
Ces proprits sont assez complexes manipuler. Elles sont issues de la notion de plages lies,
c'est--dire de cellules tant des arguments de formule d'autres cellules. Par dfinition, une cellule
dpendante est une cellule contenant une formule utilisant une autre cellule, une cellule prcdente est
une cellule dont la valeur est utilise par la formule d'une autre cellule.
Les cellules sont directement prcdentes ou dpendantes si leur relation est directe.
Pour bien comprendre ces principes, nous allons prendre comme exemple une feuille de
dpouillement d'un talonnage de voie d'acquisition.

154
On peut reprsenter cette feuille avec ses formules.

Les flches reprsentent les dpendances telles qu'elles sont affiches par la barre d'audit. Nous
allons visualiser ces dpendances par le code en modifiant le fond des cellules avec un code VBA, en
prenant la cellule L32C3 (C32) comme cellule de rfrence.
N lons donc mettre en jaune les cellules prcdentes, en rouge les cellules directement
prcdentes et en bleu clair les cellules dpendantes.
Sub Ant ecedent Dependent ( )
ous al

Di mMaPl age As Range

On Er r or Resume Next
Set MaPl age = Thi sWor kbook. Wor ksheet s( " Depend" ) . Cel l s( 32, 4)
MaPl age. Pr ecedent s. I nt er i or . Col or = vbYel l ow
MaPl age. Di r ect Pr ecedent s. I nt er i or . Col or = vbRed
MaPl age. Dependent s. I nt er i or . Col or = vbCyan
On Er r or Got o 0

End Sub
Notez que je suis en mode "No Kill", c'est--dire que je me suis mis en mode de traitement
d'erreurs immdiat sans pour autant traiter les erreurs. En effet, VBA va lever une erreur 1004 s'il n'y a
pas de cellules antcdentes ou prcdentes. En l'occurrence, il n'y a pas d'incidence ne pas traiter
l'erreur puisque nous cherchons juste colorier des cellules le cas chant.
155
Ce code nous donnera un rsultat tel que :

Vous remarquerez qu'il faut videmment colorier les cellules prcdentes avant les cellules
directement prcdentes si vous voulez faire la diffrence entre les deux puisque par dfinition, l'objet
renvoy par la collection des cellules prcdentes contient les cellules directement prcdentes. Il en
serait de mme pour les cellules dpendantes.
Les cellules prcdentes et dpendantes ne sont pas souvent manipules. De fait, seul certains
scnarii particuliers requirent ce genre de programmation, le cas le plus connu tant la gestion
contrle des calculs dans les feuilles denses.
Par exemple, le code suivant recalcule uniquement les cellules dpendantes d'une cellule
modifie.
Pr i vat e Sub Wor ksheet _Change( ByVal Tar get As Range)

St at i c EnCour s As Bool ean

I f EnCour s Then Exi t Sub
EnCour s = Tr ue
On Er r or Resume Next
Tar get . Di r ect Dependent s. Cal cul at e
Do Whi l e Er r . Number = 0
Set Tar get = Tar get . Di r ect Dependent s
Tar get . Di r ect Dependent s. Cal cul at e
Loop
Er r . Cl ear
On Er r or GoTo 0
E se nCour s = Fal

End Sub
156
End
La proprit End renvoie la cellule de fin de zone d'une plage donne. La notion de zone est assez
simple comprendre et assez complexe employer. Une zone pour Excel, c'est une plage linaire de
cellules contenant des valeurs ou n'en contenant pas. Prenons la feuille exemple suivante :

Commenons par des cas simples
Sub Test End( )

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " End" ) . Range( " A1" )
Debug. Pr i nt MaPl age. End( xl ToRi ght ) . Addr ess( Fal se, Fal se, xl A1)
' G1
Debug. Pr i nt MaPl age. End( xl Down) . Addr ess( Fal se, Fal se, xl A1)
' A29
Set MaPl age = Thi sWor kbook. Wor ksheet s( " End" ) . Range( " C2" )
Debug. Pr i nt MaPl age. End( xl ToRi ght ) . Addr ess( Fal se, Fal se, xl A1)
' F2
Debug. Pr i nt MaPl age. End( xl Down) . Addr ess( Fal se, Fal se, xl A1)
' C23
Set MaPl age = Thi sWor kbook. Wor ksheet s( " End" ) . Range( " E1" )
Debug. Pr i nt MaPl age. End( xl ToRi ght ) . Addr ess( Fal se, Fal se, xl A1)
' G1
Debug. Pr i nt MaPl age. End( xl Down) . Addr ess( Fal se, Fal se, xl A1)
' E2
Set MaPl age = Thi sWor kbook. Wor ksheet s( " End" ) . Range( " G1" )
Debug. Pr i nt MaPl age. End( xl ToRi ght ) . Addr ess( Fal se, Fal se, xl A1)
' I V1
Debug. Pr i nt MaPl age. End( xl Down) . Addr ess( Fal se, Fal se, xl A1)
' G65536

End Sub
157
Ces exemples renvoient la cellule de fin de zone. Dans ce cas je fais la recherche en bas ou
droite, mais c'est quivalent en haut ou gauche. Regardons les deux derniers exemples, lorsque G1
est la cellule de base. Dans les deux cas, c'est la dernire cellule de la feuille dans la direction de
recherche qui est renvoye. En effet, End ne renvoie jamais la cellule appelante comme cellule de fin
de zone, dans ce cas, End cherche la fin de la zone suivante, la fin de la feuille en l'occurrence
puisqu'il n'y a plus que des cellules vides. Pour bien comprendre ce fonctionnement, imaginons le code
suivant :
Sub Test End1( )

Di mMaPl age As Range, Message As St r i ng

Set MaPl age = Thi sWor kbook. Wor ksheet s( " End" ) . Range( " E1" )
Do
Set MaPl age = MaPl age. End( xl Down)
Message = Message & vbCr Lf & MaPl age. Addr ess( Fal se, Fal se, xl A1)
Loop Unt i l MaPl age. Row = 65536
MsgBox Message

End Sub
Ce qui nous donnera :

Comme vous le voyez, les cellules renvoyes contiennent toujours une valeur l'exception de la
dernire, la recherche de fin de zone est donc bien base sur les cellules ayant une valeur. Cette
mthode End est souvent utilise pour renvoyer des plages de valeurs continues sans avoir connatre
au pralable le nombre de cellule de la plage. Par exemple le code suivant renvoie la premire colonne
de valeur de la feuille :
Wi t h Thi sWor kbook. Wor ksheet s( " End" )
Set MaPl age = . Range( . Cel l s( 1, 1) , . Cel l s( 1, 1) . End( xl Down) )
' on t r ouve par f oi s l a not at i on
' Set MaPl age = . Range( " A1" , . Range( " A1" ) . End( xl Down) )
End Wi t h
La recherche de la dernire cellule pour les dveloppeurs VBA c'est un peu comme le Saint Graal
pour les chevaliers de la table ronde. Je vous exposerai le problme et les solutions dans l'tude des
techniques classiques.
EntireRow & EntireColumn
Renvoie la ou les colonnes (lignes) entires de la plage appelante.
Sub Test Ent i r e( )

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Range( " J 1: N28" )
Debug. Pr i nt MaPl age. Ent i r eCol umn. Addr ess( Fal se, Fal se, xl A1)
' J : N
Debug. Pr i nt MaPl age. Ent i r eRow. Addr ess( Fal se, Fal se, xl A1)
' 1: 28

End Sub
158
MergeArea
S'applique gnralement sur une cellule. Renvoie la plage fusionne si la cellule appartient une
plage fusionne ou la cellule si tel n'est pas le cas. Ne confondez pas cette proprit qui renvoie une
plage avec la proprit MergedCells qui renvoie vraie si la cellule fait partie d'une plage fusionne.
Offset
Renvoie une plage dcale par rapport la plage appelante. De la forme :
Property Offset([RowOffset As Long], [ColumnOffset As Integer]) As Range
O RowOffset est un entier long dfinissant le dcalage de ligne et ColumnOffset est un entier
dfinissant le dcalage de colonne. Ces arguments suivent les rgles :
Si la valeur de l'argument est ngative, le dcalage aura lieu vers le haut pour les lignes et
vers la gauche pour les colonnes.
Si l'argument est positif, le dcalage aura lieu vers le bas pour les lignes et vers la droite
pour les colonnes.
Si l'argument est nul ou omis il n'y aura pas de dcalage
Si le dcalage demand renvoie une ligne ou une colonne en dehors de l'intervalle de la
feuille (1 65536 pour les lignes ; 1 256 pour les colonnes), une erreur sera leve.
La plage renvoye a le mme nombre de lignes / colonnes que la plage appelante.
Le code suivant efface les cellules contenant la valeur 0 dans la plage "A2:G2000" de la feuille
tableau.
Sub Test Of f set ( )
Di mMaPl age As Range, cmpt Col As Long, cmpt Li g As Long

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Cel l s( 2, 1)
For cmpt Li g = 0 To MaPl age. End( xl Down) . Row - MaPl age. Row
For cmpt Col = 0 To MaPl age. End( xl ToRi ght ) . Col umn - MaPl age. Col umn
I f MaPl age. Of f set ( cmpt Li g, cmpt Col ) . Val ue = 0 Then
MaPl age. Cl ear Cont ent s
Next cmpt Col
Next cmpt Li g
End Sub
Resize
Redimensionne un objet Range du nombre de colonnes / lignes pass en argument. De la forme:
Property Resize([RowSize As Long], [ColumnSize As Integer]) As Range
O RowSize est un entier long dfinissant le nombre de lignes et ColumnSize est un entier
dfinissant le nombre de colonnes. Ces arguments sont forcment des valeurs positives ou sont omis,
dans ce cas la plage n'est pas redimensionne. Si la plage renvoye n'est pas dans les limites
admissibles de la feuille, une erreur sera leve.
En combinant cette proprit et la proprit Offset vue prcdemment, il est possible de redfinir
n'importe quelle plage sur la feuille en partant d'une autre plage. Cette faon de travailler peut alors
remplacer l'utilisation de plage fixe comme nous le verrons dans la discussion technique plus loin.
L'exemple suivant rempli la colonne moyenne de la feuille tableau.
Sub Test Resi ze( )
Di mMaPl age As Range, cmpt Li g As Long

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Cel l s( 2, 1)
MaPl age. Of f set ( , 6) . Val ue = " Moyenne T1- T4"
' par cour s l a pl age en l i gne
For cmpt Li g = 1 To MaPl age. End( xl Down) . Row - MaPl age. Row
MaPl age. Of f set ( cmpt Li g, 6) . For mul aLocal = " =Moyenne( " &
MaPl age. Of f set ( cmpt Li g, 2) . Resi ze( , 4) . Addr essLocal ( Tr ue, Tr ue, xl R1C1) &
" ) "
Next cmpt Li g
End Sub
159
Autres Proprits de lobjet Range
Address & AddressLocal (String)
Renvoie ladresse de la plage.
Property Address([RowAbsolute As Boolean], [ColumnAbsolute As Boolean], [ReferenceStyle
As XlReferenceStyle = xlA1], [External As Boolean], [RelativeTo As Range]) As String
Les arguments RowAbsolute et ColumnAbsolute dtermine si ladresse renvoye est absolue ou
relative, ReferenceStyle vaut xlA1 ou xlR1C1. Si External est vrai ladresse contiendra le nom du
classeur et de la feuille, RelativeTo prcise la plage ou la cellule de rfrence pour les rfrences
relatives. La proprit AddressLocal fonctionne lidentique mais les rfrences de type R1C1 sont
converties en L1C1.
Sub Test Adr esse( )

Di mMaPl age As Range
Set MaPl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " A1: A10" )
Debug. Pr i nt MaPl age. Addr essLocal ( Tr ue, Tr ue, xl R1C1)
' L1C1: L10C1
Set MaPl age = Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Cel l s( 5, 6)
Debug. Pr i nt MaPl age. Addr ess( Fal se, Fal se, xl R1C1, Fal se,
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " B2" ) )
' R[ 3] C[ 4]
Set MaPl age = Appl i cat i on. Uni on( MaPl age,
Thi sWor kbook. Wor ksheet s( " Feui l 1" ) . Range( " A1: A10" ) )
Debug. Pr i nt MaPl age. Addr ess
' $F$5, $A$1: $A$10

End Sub
Borders (Borders)
Renvoie la collection des bordures de la plage. Les bordures sont diffrentes selon que la plage
contienne une ou plusieurs cellules. Une bordure spcifique est donc dsigne avec la notation :
Range. Bor der s( Const ant e)
O la constante dsigne la bordure selon la terminologie montre ci-dessous :

160
Une bordure est dfinie selon trois proprits :
Color (ou ColoIindex) qui dfinit la couleur du trait
LineStyle qui dfinit le style du trait
Weight qui dfinit son paisseur.
Si vous appelez la proprit Borders sans prciser de constante, ce sont les quatre bordures du tour
extrieur qui seront affects.
Les encadrements complexes engendrent des codes assez lourds.
Sub Encadr ement ( )

Di mMaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 1" )
MaFeui l l e. Cel l s( 3, 3) . Bor der s. Li neSt yl e = xl Cont i nuous
Wi t h . Bor der s( xl EdgeLef t )
Wi t h MaFeui l l e. Range( " B12: C15" )

. Li neSt yl e = xl Doubl e
. Wei ght = xl Thi ck
. Col or I ndex = 50
End Wi t h
Wi t h . Bor der s( xl EdgeTop)
. Li neSt yl e = xl Cont i nuous
. Wei ght = xl Medi um
. Col or I ndex = 5
End Wi t h
Wi t h . Bor der s( xl EdgeBot t om)
. Li neSt yl e = xl Cont i nuous
. Wei ght = xl Medi um
. Col or I ndex = 5
End Wi t h
Wi t h . Bor der s( xl EdgeRi ght )
. Li neSt yl e = xl Doubl e
. Wei ght = xl Thi ck
. Col or I ndex = 50
End Wi t h
Wi t h . Bor der s( xl I nsi deHor i zont al )
. Li neSt yl e = xl DashDot Dot
. Wei ght = xl Thi n
End Wi t h
End Wi t h
End Sub
Ce code donnera :


161
Characters (Characters)
Bien qu'on l'utilise assez peu, cette proprit renvoie le contenu de la cellule sous forme d'une
collection de caractres, ce qui permet de manipuler ceux-ci sparment, d'insrer une chane ou de
supprimer certains caractres. Gnralement, on utilise plutt des fonctions VBA de traitement de
chanes, mais dans certains cas, la collection Characters est la seule solution, par exemple pour utiliser
des polices diffrentes dans une mme cellule ou pour mettre en couleur certains caractres.
Column & Row (long)
Renvoie le numro de la premire ligne / colonne de la plage.
ColumnWidth & RowHeight (Double)
Renvoie la hauteur de ligne ou la largeur de la colonne.
Plage htrogne Null
Attention, la hauteur de ligne renvoie des points alors que la largeur de colonne renvoie un
quivalent nombre de caractres. Si vous voulez connatre la largeur en nombre de points, vous devez
utiliser la proprit Width
Font (Font)
Renvoie un objet Font qui est la police utilise pour la plage.
Plage htrogne Font gnrique
Si toutes les cellules contiennent la mme police, la proprit renvoie cette police, sinon elle
renvoie un objet Font gnrique dont le nom est Null.
Le code suivant vrifie que toutes les cellules de la plage ont la mme police, si tel n'est pas le
cas, il appliquera une police Arial 11 Gras + Bleu toute la plage.
Sub Test Font ( )

Di mMaPl age As Range, Pol i ce As Font
. Pr i nt MaPl age. Font . Name
i t h Pol i ce

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Range( " P1: P10" )
Debug
Set Pol i ce = MaPl age. Font
I f I sNul l ( Pol i ce. Name) Then
W
. Name = " Ar i al "
. Col or = vbBl ue
. Bol d = Tr ue
. Si ze = 11
End Wi t h
End I f

End Sub
HasFormula (Boolean)
Renvoie vrai si toutes les cellules de la plage contiennent une valeur, Faux si aucune cellule n'en
contient, Null si certaines cellules en contiennent.
Hidden (Boolean)
Cette proprit s'applique uniquement pour des plages contenant des lignes ou des colonnes
entires. Renvoie vrai si toutes les lignes ou toutes les colonnes de la plage sont masques, Faux sinon.
Pour savoir si une cellule est masque on utilise donc :
Cellule.EntireRow.Hidden ou Cellule.EntireColumn.Hidden
162
HorizontalAlignment & VerticalAlignment (Variant)
Renvoie ou dfinit l'alignement dans les cellules.
Plage htrogne Null
Les valeurs de centrage sont les suivantes :
HorizontalAlignment
Constante Valeur Commentaire
XILeft -4131 Gauche
xICenter -4108 Centr
xIRight -4152 Droite
xIFill 5 Recopi
xIJustify -4130 Justifi
xlCenterAcrossSelection 7 Centr sur plusieurs colonnes
VerticalAlignment
xITop -4160 Haut
xICenter -4108 Centr
xIBottom -4107 Bas
XIJustify -4130 Justifi
XIDistributed -4117 Distribu
Interior (Interior)
Renvoie un objet Interior qui est le format du corps de la cellule.
Plage htrogne Interior gnrique
L'objet Interior gre la couleur et le motif du fond de la cellule.
Left & Top (Single)
Renvoie la position en point du bord gauche ou du sommet de la plage. Ces proprits sont
videmment en lecture seule. On ne les utilise gnralement que lorsqu'on souhaite insrer un objet
dans une feuille une position de cellule particulire.
Wi t h Thi sWor kbook. Wor ksheet s( " Tabl eau" )
. Char t Obj ect s. Add . Range( " P4" ) . Lef t , . Range( " P4" ) . Top, 500, 200
End Wi t h
Locked (Boolean)
Renvoie vrai si toutes les cellules de la plage sont verrouilles, Faux si aucune ne l'est. Attention
le verrouillage ne prend effet que lorsque la feuille est protge. Ceci veut dire que la cellule peut tre
verrouille au sens de la proprit Locked sans l'tre physiquement si la feuille n'est pas protge.
Plage htrogne Null
MergeCells (Boolean)
Renvoie vrai si toutes les cellules de la plage sont fusionnes, Faux si aucune ne l'est. Les cellules
peuvent tre toutes fusionnes dans la mme plage ou dans des plages diffrentes.
Plage htrogne Null
163
Name (String)
R u dfinit le nom de la plage. Par dfaut le nom sera ajout la collection Names du
classeur. Si l om existait dj dans le classeur, son ancienne rfrence sera crase.
Pour attribuer le nom la collection Names de la feuille, vous devez dfinir un nom (chane de
caractres) de la forme "NomFeuille!Nom"
Sub Test Name( )
envoie o
e n
Aj out e

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Range( " J 1: N28" )
' Aj out e Nom1 l a col l ect i on du cl asseur en cr asant l ' anci enne
r f r ence
MaPl age. Name = " Nom1"
' Nom2 l a col l ect i on Names de l a f eui l l e nomme Tabl eau
MaPl age. Name = " Tabl eau! Nom2"

End Sub
NumberFormat & NumberFormatLocal (String)
Renvoie la chane de format des cellules de la plage.
Plage htrogne Null
La valeur renvoye peut tre une chane prdfinie ou une chane personnalise. Elle n'est
renvoye que si toutes les cellules de la plage ont la mme chane de formatage.
Orientation (Integer)
Renvoie ou dfinti l'orientation du texte dans la cellule. Valeur entire comprise entre -90 et 90
degrs.
Plage htrogne Null
Les textes normaux (sans orientation dfinie) renvoient -4128 (xlHorizontal)
Style (Variant)
Renvoie ou dfinit le nom du style pour la plage de cellules.
Plage htrogne Nothing
Mthodes de l'objet Range
AddComment
Ajoute un commentaire la cellule. Cette mthode lve une exception si la plage contient
plusieurs cellules ou si la cellule contient dj un commentaire. De la forme :
Function AddComment([Text As String]) As Comment
O Text est le texte du commentaire ajouter.
Sub Test Met hod( )

Di mMaPl age As Range, Comment ai r e As Comment

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Met hode" ) . Range( " A1" )
Set Comment ai r e = MaPl age. AddComment ( " Comment ai r e" )
Comment ai r e. Shape. Aut oShapeType = msoShapeCr oss

End Sub
164
AutoFilter
Cette mthode est extrmement puissante dans les scnarii de recherche de valeur. Pour illustrer
ces mthodes, nous repartirons d'un exemple de fichier d'acquisition tel que :

La proprit AutoFilter permet d'tablir un filtre simple, portant sur une ou plusieurs colonnes
d'une table de valeurs et pouvant contenir jusqu' deux conditions par colonne. De la forme :
Function AutoFilter([Field As Integer], [Criteria1 As String], [Operator As
XlAutoFilterOperator = xlAnd], [Criteria2 As String], [VisibleDropDown As Boolean]) As
AutoFilter
O Field est le numro de la colonne o doit s'appliquer le filtre. Il ne s'agit pas d'une rfrence
absolue mais du numro d'ordre de la colonne dans la plage de valeur.
Criteria1 et Criteria2 sont des chanes de caractres explicitant le(s) critre(s). Operator prcise
si les rgles sont composes en ET (xlAnd) ou en OU (xlOr) s'il y a deux critres ; ou prend une valeur
particulire de xlBottom10Items, xlBottom10Percent, xlTop10Items, xlTop10Percent.
Si VisibleDropDown est vrai, les flches de filtre sont affiches.
Pour enlever les filtres d'une colonne, on utilise la mthode Autofilter en prcisant uniquement
l'argument Field, pour enlever tous les filtres, on utilise AutoFilter sans argument.
Imaginons dans notre exemple que nous voulions rechercher les zones de la plage o :
30 < T1 < 40 et Moyenne > 67
Sub Appl i queFi l t r e( )
Di mPl ageFi l t r ee As Range, Pl ageBase As Range, cmpt Li gne As Long
Di mZone As Range, Message As St r i ng

Wi t h Thi sWor kbook. Wor ksheet s( " Tabl eau" )
165
Set Pl ageBase = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 7)
End Wi t h
Wi t h Pl ageBase
' enl ve l es vent uel s anci ens f i l t r e
. Aut oFi l t er
' f i l t r e l a col onne T1 ( t r oi si me col onne)
. Aut oFi l t er Fi el d: =3, Cr i t er i a1: =" >30" , Oper at or : =xl And,
Cr i t er i a2: =" <40" , Vi si bl eDr opDown: =Fal se
' f i l t r e l a col onne moyenne ( sept i me col onne)
. Aut oFi l t er Fi el d: =7, Cr i t er i a1: =" >67"
End Wi t h
Set Pl ageFi l t r ee = Pl ageBase. Speci al Cel l s( xl Cel l TypeVi si bl e)
For Each Zone I n Pl ageFi l t r ee. Ar eas
cmpt Li gne = cmpt Li gne + Zone. Rows. Count
Next
Message = " Nombr e de l i gnes du t abl eau " & Pl ageBase. Rows. Count &
vbCr Lf
Message = Message & " Nombr e de l i gnes r pondant au f i l t r e" & cmpt Li gne
MsgBox Message

End Sub

Ce qui donnera un rsultat tel que :



166
Il existe aussi une mthode AdvancedFilter encore plus sophistique mais qui demande de grer
les plages de critres, ce qui nous emmnerait un peu loin.
AutoFill, FillDown, FillUp, FillLeft & FillRight
Les proprits Fill[Direction] recopient le contenu et le format de la cellule de base dans la
direction spcifie. La cellule de base se dfinit comme :
La cellule la plus haute pour FillDown
La cellule la plus basse pour FillUp
La cellule la plus gauche pour FillRight
La cellule la plus droite pour FillLeft
La proprit Autofill effectue une recopie incrmente si c'est possible, une recopie standard si
non. De la forme :
Function AutoFill(Destination As Range, [Type As XlAutoFillType = xlFillDefault]) As Variant
Destination est la plage o doit tre effectue la recopie, elle doit obligatoirement contenir la ou
les cellules sources (celles qui contiennent les valeurs initiales). Type indique le type de recopie, il
peut prendre les valeurs :
xlFillDays
Incrmente les jours si la cellule source est une date. Sinon excute une recopie
standard
xlFillFormats
Recopie les formats mais pas le contenu
xlFillSeries
Cre une srie avec l'incrment standard ou l'incrment dduit
xlFillWeekdays
Incrmente sur les jours ouvrables
xlGrowthTrend
Incrment sur un incrment dduit multiplicatif
xlFillCopy
Recopie standard. Utilisez plutt une mthode Fill
xlFillDefault
Laisse Excel dterminer le type de recopie
xlFillMonths
Incrmente les mois si la cellule source est une date. Sinon excute une recopie
standard
xlFillValues
Incrmente selon l'incrment dduit sans recopier les formules
xlFillYears
Incrmente les annes si la cellule source est une date. Sinon excute une recopie
standard
xlLinearTrend
Incrmente selon l'incrment dduit ou l'incrment standard
Pour bien comprendre comment utiliser cette mthode, exposons d'abord ces rgles de
fonctionnement. Pour faire une recopie 'incrmente' il faut minima dfinir, une valeur de dpart,
une rgle d'incrmentation et un incrment. La valeur de dpart va donc tre l'objet Range appelant la
mthode. La rgle d'incrmentation sera dfinie par l'argument Type, il reste dfinir l'incrment.
Excel peut utiliser dans la plupart des cas l'incrment par dfaut qui vaut 1, pour peu qu'il n'y ait pas
d'ambigut. Ds lors que celui-ci ne convient pas, il va falloir lui donner un autre incrment. On
utilise pour cela ce qu'on appelle un incrment dduit en passant Excel deux valeurs dans la plage
source, la valeur de dpart, et la premire valeur incrmente. Regardons le code suivant :
Sub Test Aut of i l l ( )

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Met hode" ) . Cel l s( 1, 1)
' cas 1
MaPl age. Val ue = CDat e( " 28/ 01/ 2002" )
MaPl age. Of f set ( 1) . Val ue = CDat e( " 28/ 02/ 2002" )
MaPl age. Resi ze( 2) . Aut oFi l l MaPl age. Resi ze( 30) , xl Fi l l Def aul t
' cas 2
MaPl age. Of f set ( , 1) . Val ue = CDat e( " 28/ 01/ 2002" )
MaPl age. Of f set ( , 1) . Aut oFi l l MaPl age. Of f set ( , 1) . Resi ze( 30) ,
xl Fi l l Mont hs
' cas 3
Wi t h Thi sWor kbook. Wor ksheet s( " Met hode" )
167
. Range( " C1" ) . Val ue = 1
. Range( " C1" ) . Aut oFi l l . Range( " C1: C30" ) , xl Fi l l Ser i es
End Wi t h
' cas 4
Wi t h Thi sWor kbook. Wor ksheet s( " Met hode" )
. Range( " D1" ) . Val ue = 1
. Range( " D2" ) . Val ue = 3
. Range( " D1: D2" ) . Aut oFi l l . Range( " D1: D30" ) , xl Fi l l Ser i es
End Wi t h
' cas 5
Wi t h Thi sWor kbook. Wor ksheet s( " Met hode" )
. Range( " E1" ) . Val ue = 1
. Range( " E2" ) . Val ue = 3
. Range( " E1: E2" ) . Aut oFi l l . Range( " E1: E30" ) , xl Li near Tr end
End Wi t h
' cas 6
Wi t h Thi sWor kbook. Wor ksheet s( " Met hode" )
. Range( " F1" ) . Val ue = 1
. Range( " F2" ) . Val ue = 3
. Range( " F1: F2" ) . Aut oFi l l . Range( " F1: F30" ) , xl Gr owt hTr end
End Wi t h

End Sub
Ce Code donnera le rsultat suivant :

Dans le cas 1, nous laissons Excel dterminer le type d'incrmentation. Ds lors, il y a obligation
de fournir deux valeurs pour que celle-ci russisse. Comme il y a un mois d'cart entre les deux dates,
Excel incrmente par pas d'un mois. Nous obtenons le mme rsultat avec le cas deux, mais comme
l'incrment par dfaut est de un et que nous prcisons une incrmentation en mois, une seule valeur
suffit.
168
Dans le cas 3, nous demandons une incrmentation de type srie avec un incrment standard. Une
seule valeur suffit donc. Dans le cas 4, nous voulons le mme type d'incrmentation mais avec un
incrment gal 2. Nous sommes donc obligs de passer deux valeurs pour dfinir l'incrment.
L'incrmentation de type srie tant linaire, nous avons le mme rsultat dans le cas 5. Par contre
l'incrmentation en croissance interprte l'incrment diffremment. Dans une incrmentation de ce
type, Excel cherche un pas multiplicatif. Comme il faut multiplier par 3 la premire valeur pour
obtenir la seconde, Excel multipliera par trois chaque valeur pour obtenir la valeur suivante.
AutoFit
Mets la ou les lignes / colonnes en mode d'ajustement automatique. La plage appelante doit
forcment contenir des lignes ou des colonnes entires. Pour que l'ajustement se droule correctement,
il faut que les cellules contiennent les valeurs avant l'appel de la mthode
BorderAround
Gre l'encadrement extrieur de la plage. De la forme :
Function BorderAround([LineStyle], [Weight As XlBorderWeight = xlThin], [ColorIndex As
XlColorIndex = xlColorIndexAutomatic], [Color As Long])
Par exemple, pour encadrer d'un trait pointill pais en rouge la plage "B2:E6", nous pouvons
crire :
Thi sWor kbook. Wor ksheet s( " Met hode" ) . Range( " B2" ) . Resi ze( 5, 4) . Bor der Ar ound
xl Dash, xl Medi um, Col or : =vbRed
Calculate
Dclenche le calcul pour la plage appelante. Attention, les antcdents n'tant pas calculs par
dfaut, le rsultat peut tre erron.
Clear, ClearComments, ClearContents & ClearFormats
Mthodes d'effacements. La mthode Clear efface tout, les mthodes spcifiques effacent
l'lment spcifique.
ColumnDifferences & RowDifferences
Ces mthodes peuvent tre assez intressantes mme si elles sont un peu complexes
comprendre. En fait, ces mthodes servent rcuprer les cellules ayant une valeur diffrente dans la
dimension spcifie, sachant que sont exclues d'office les cellules n'ayant pas de valeur. De la forme :
Function ColumnDifferences(Comparison As Range) As Range
Function RowDifferences(Comparison As Range) As Range
L'argument Comparison est un objet Range contenant une seule cellule appartenant la plage de
recherche. Idalement la plage de recherche ne contient qu'une colonne pour ColumnDifferences ou
qu'une ligne pour RowDifferences. Si la plage contient plusieurs colonnes, Excel va grer le cas
comme si vous appeliez plusieurs fois conscutivement la mthode pour chaque colonne en dcalant
implicitement la cellule de comparaison. vitez donc de faire cela et travaillez sur des plages d'une
colonne (ou ligne).
Donc prenons l'exemple suivant en repartant de la feuille tableau que nous avons utilis pour les
exemples d'Autofilter.
Je souhaite connatre toutes les cellules de la plage "D2:D1000" qui ont une valeur diffrente de
celle de la plage "D2".
Sub Test Met hod( )
Di mMaPl age As Range
et MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau
omme vous voyez, c'est assez simple. Nous verrons d
S " ) . Range( " D2" )
Set MaPl age = MaPl age. Resi ze( 999) . Col umnDi f f er ences( MaPl age)
MaPl age. Sel ect
End Sub
C ans la discussion technique quoi cela
peut servir.
169
Cut & Copy
Gre le Copier-Coller ou le Couper-Coller d'une plage de cellule. De la forme :
Function Copy([Destination As Range])
Function Cut([Destination As Range])
O Destination indique la plage de destination. Celle-ci doit contenir ou une cellule unique qui
sera le coin suprieur gauche de la plage de collage, ou une plage de mme dimension que la plage
appelante. Si tel n'est pas le cas, la cellule suprieure gauche de la plage de destination sera utilise
sans tenir compte de la plage ventuellement passe. Si Destination est omis, la plage copie est
place dans le presse-papier. La destination peut tre dans une autre feuille ou dans un autre classeur.
Il peut y avoir un message d'alerte si les cellules de destination contiennent dj des valeurs.
Sub Test Copy( )

Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Tabl eau" ) . Range( " A1: A50" )
MaPl age. Copy Thi sWor kbook. Wor ksheet s( " Depend" ) . Range( " P10" )

End Sub
DataSeries
Cette mthode est quivalente la mthode Autofill si ce n'est que vous pouvez prcisez la valeur
du pas et la dernire valeur et donc vous affranchir de la saisie de plusieurs valeurs. De la forme :
Function DataSeries([Rowcol], [Type As XlDataSeriesType = xlDataSeriesLinear], [Date As
XlDataSeriesDate = xlDay], [Step], [Stop], [Trend])
L'argument RowCol peut prendre les valeurs xlRows ou xlColumns selon la direction que vous
souhaitez pour la plage. Si cet argument est omis, Excel interprtera la plage appelante pour utiliser la
dimension la plus grande.
Le code suivant crera une srie incrmente par pas de 2 sur la plage D1:D50.
Di mMaPl age As Range

Set MaPl age = Thi sWor kbook. Wor ksheet s( " Met hode" ) . Range( " D1: F50" )
MaPl age. Cel l s( 1) . Val ue = 1
MaPl age. Dat aSer i es , xl Dat aSer i esLi near , , 2
Delete
Supprime les cellules de la plage. La mthode attends un argument Shift pouvant prendre les
valeurs xlShiftToLeft ou xlShiftUp selon la direction du dcalage souhait (dans une suppression les
cellules supprimes sont toujours remplaces soit par les cellules situes au dessous, soit par les
cellules situes droite). Pour supprimer des lignes entires ou des colonnes entires, utilisez
EntireRow ou EntireColumn.
Find, FindNext & FindPrevious
Mthode de recherche portant sur des cellules contenues dans la plage appelante. De la forme :
Function Find(What As Variant, [After As Range], [LookIn As XlFindLookIn], [LookAt As
XlLookAt], [SearchOrder As XlSearchOrder], [SearchDirection As XlSearchDirection = xlNext],
[MatchCase As Boolean], [MatchByte], [SearchFormat As Boolean]) As Range
O What est la valeur cherche. L'argument After prcise la cellule de dbut de recherche.
Attention, la recherche commence aprs cette cellule et non par elle.
L'argument LookIn prcise si la recherche lieu dans les valeurs de la plage (xlValues), dans les
formules (xlFormulas) ou dans les commentaires (xlComments).
L'argument LookAt prcise si la recherche compare l'lment la totalit du contenu (xlWhole) ou
une partie du contenu (xlPart).
L'argument SearchOrder prcise la direction de recherche choisie, par colonne (xlByColumns) ou
par ligne (xlByRows).
170
L'argument SearchDirection prcise le sens de la recherche, vers l'avant (xlNext) c'est--dire vers
le bas ou vers la droite selon la direction choisie, vers l'arrire (xlPrevious) c'est--dire vers le haut ou
vers la gauche.
MatchCase prcise si la recherche tient compte de la casse (majuscule / minuscule) ou non.
Les deux autres arguments ne seront pas utiliss dans ce cours.
Les mthodes FindNext et FindPrevious n'attendent que l'argument After puisqu'elles utilisent
implicitement l'ensemble des arguments prciss dans l'appel de la mthode Find.
Le principe de la recherche est assez simple. La plage appelante sera la plage de recherche. Si la
valeur existe au moins une fois, la fonction Find renverra un objet Range correspondant la premire
cellule trouve, sinon elle renverra Nothing. FindNext et FindPrevious pourront alors tre appels pour
rechercher si d'autres cellules contiennent la valeur. La recherche est circulaire dans la plage. Vous
devez donc stocker l'adresse de la premire cellule correspondante le cas chant pour bloquer le
processus. Par exemple, le code suivant va rechercher l'ensemble des cellules contenant la valeur 82
dans la plage appelante et mettre le fond de la cellule en bleu.
Sub Fi nd82( )

Di mMaPl age As Range, Tr ouve As Range, Adr esse1 As St r i ng

Wi t h Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Set MaPl age = . Range( . Cel l s( 1, 3) , . Cel l s( . Rows. Count ,
6) . End( xl Up) )
End Wi t h
Set Tr ouve = MaPl age. Fi nd( 82, MaPl age. Cel l s( 1) , xl Val ues, xl Whol e,
xl ByRows, xl Next )
I f Not Tr ouve I s Not hi ng Then
Adr esse1 = Tr ouve. Addr ess
Do
Tr ouve. I nt er i or . Col or = vbBl ue
Set Tr ouve = MaPl age. Fi ndNext ( Tr ouve)
Loop Whi l e St r Comp( Adr esse1, Tr ouve. Addr ess) <> 0
End I f

End Sub
Insert
C'est la mthode inverse de Delete. Elle attend le mme argument Shift pour prciser le sens du
dcalage, vers le bas ou droite, la remarque pour les lignes ou colonnes entires restant valable.
Merge & UnMerge
Gre la fusion des cellules de la plage. La mthode accepte un argument boolen Across que l'on
peut utiliser lorsque la plage contient plusieurs lignes et plusieurs colonnes. Si Across est vrai, les
cellules sont fusionnes par ligne, sinon toute la plage est fusionne en une seule cellule. Si les cellules
contiennent des valeurs, vous aurez l'apparition d'un message d'alerte prvenant que seule la valeur la
plus gauche sera conserve. Vous pouvez le dsactiver, comme dans :
Set MaPl age = Thi sWor kbook. Wor ksheet s( " met hode" ) . Range( " G2: J 10" )
Appl i cat i on. Di spl ayAl er t s = Fal se
MaPl age. Mer ge Tr ue
Appl i cat i on. Di spl ayAl er t s = Tr ue
La mthode UnMerge spare les cellules fusionnes, elle n'accepte pas d'argument.
171
PasteSpecial
La mthode collage spcial reste trs intressante pour un certain nombre d'oprations. Elle
fonctionne forcment en conjonction avec la mthode Copy. Si vous avez bien suivi ce que nous avons
vu prcdemment, elle n'est pas trs utile pour le collage spcial de type valeur ou de type formule
puisqu'il est plus simple de passer par les proprits tableau telles que Value ou Formula.
De la forme :
Function PasteSpecial([Paste As XlPasteType = xlPasteAll], [Operation As
XlPasteSpecialOperation = xlPasteSpecialOperationNone], [SkipBlanks As Boolean], [Transpose As
Boolea
Le paramtre Paste dfinit le type de collage, il peut prendre les valeurs :
xlPasteAll
xlPasteAllExceptBorders
xlPasteColumnWidths
xlPasteComments
xlPasteFormats
xlPasteFormulas
xlPasteFormulasAndNumberFormats
xlPasteValidation
xlPasteValues
xlPasteValuesAndNumberFormats
L'argument Operation dfinit les oprations spcifiques. Il peut prendre les valeurs :
xlPasteSpecialOperationAdd
xlPasteSpecialOperationDivide
xlPasteSpecialOperationMultiply
xlPasteSpecialOperationNone
xlPasteSpecialOperationSubtract
Ces oprations de collage n'ont de sens que pour les collages de valeur, lorsque la plage de
destination contient aussi des valeurs. Si l'argument vaut xlPasteSpecialOperationNone, les valeurs
existantes sont crases par les valeurs colles, sinon Excel excute l'opration prcise entre la valeur
existante et la valeur colle.
L'argument SkipBlank est un boolen qui prcise si les cellules vides doivent tre ignores lors du
collage.
L'argument Transpose est un boolen qui dfinit si la plage doit tre transpose, autrement dit si
les deux dimensions ligne / colonne doivent tre inverse.
On utilise donc cette mthode, soit pour coller des formats, soit pour coller des valeurs et des
formats, soit enfin pour transposer les plages.
On n'utilise finalement qu'assez peu cette mthode pour raliser des oprations car les scnatii
mettant en uvre cette fonctionnalit sont rares.
Replace
n])

La mthode Replace fonctionne peu prs comme la mthode Find, si ce n'est qu'on prcise un
argument Replacement qui contient la valeur de remplacement.
Sort
Cette mthode gre le tri dans les plages. Elle est assez souvent mal comprise et donc mal utilise,
aussi allons nous la dtailler un peu avant de voir son criture.
Le tri dans une plage rectangulaire a une orientation, soit on tri par colonne c'est--dire que les
cellules restent dans une colonne fixe mais peuvent changer de ligne, soit on tri en ligne et les lignes
restent fixes alors que l'ordre dans les colonnes peut tre modifi.
172
Le tri Excel accepte jusqu' trois cls de tri. Une cl de tri, dfinit une ligne ou une colonne qui va
subir le tri, entranant de ce fait le tri des autres lments de la mme dimension. Prenons notre
exemple de tableau dsormais classique pour mieux visualiser le principe.

Les donnes du tableau tant ordonnes en colonne, nous allons forcment trier dans ce sens. Si
nous dcidons de trier uniquement T1, l'ordre des cellules de la colonne C va changer, mais l'ordre
des autres colonnes ne va pas bouger. Ceci ne serait pas tellement logique puisque chaque ligne une
cohrence propre. Nous devons donc trier tout le tableau. Lorsque nous allons trier T1 (la colonne C)
l'ordre de toutes les lignes va donc se modifier pour suivre le nouvel ordre des valeurs de T1. Cette
colonne sera donc la cl de tri d'un objet Range reprsentant tout le tableau.
Je vous ai dit qu'il pouvait y avoir jusqu' trois cls, que se passe-t-il donc lorsqu'on prcise une
seconde cl, par exemple T2 ?
Les lignes vont d'abord se rordonner selon le tri de la premire cl, par exemple par valeurs de
T1 croissante. Comme il n'est pas possible de trier parfaitement la deuxime cl sans perdre l'ordre
dfini par la premire, Excel va procder un tri secondaire, c'est--dire que les lignes ne seront
rordonnes selon la valeur de T2 qu' valeur de T1 quivalente. Si nous ajoutons une troisime cl,
le tri ne portera que sur les lignes ayant des valeurs de T1 et de T2 quivalente.
Lorsque vous allez demander un tri Excel, vous allez aussi devoir lui signaler si la plage une
colonne / ligne de titre ou non, puisque celle-ci ne doit videmment pas tre trie. Regardons
maintenant la syntaxe de la mthode. En criture exhaustive, celle-ci est de la forme :
173
Function Sort([Key1], [Order1 As XlSortOrder = xlAscending], [Key2], [Type], [Order2 As
XlSortOrder = xlAscending], [Key3], [Order3 As XlSortOrder = xlAscending], [Header As
XlYesNoGuess = xlNo], [OrderCustom], [MatchCase], [Orientation As XlSortOrientation =
xlSortRows], [SortMethod As XlSortMethod = xlPinYin], [DataOption1 As XlSortDataOption =
xlSortNormal], [DataOption2 As XlSortDataOption = xlSortNormal], [DataOption3 As
XlSortDataOption = xlSortNormal])
Un certain nombre de ces arguments ne servent que pour le tri des tableaux croiss o pour des
tris spciaux que nous ne verrons pas dans ce cours, je vais donc crire la dfinition de la mthode
sous la forme :
Function Sort([Key1], [Order1 As XlSortOrder = xlAscending], [Key2], [Order2 As
XlSortOrder = xlAscending], [Key3], [Order3 As XlSortOrder = xlAscending], [Header As
XlYesNoGuess = xlNo], [MatchCase], [Orientation As XlSortOrientation = xlSortRows])
Ecrite ainsi, nous allons retrouver tout ce que nous avons vu prcdemment.
Les arguments contiennent d'abord un jeu de trois cls, sous la forme d'un argument Key qui
contient la premire cellule de la cl contenant une valeur trier (pas un titre) puis un argument Order
qui dfinit le sens du tri (croissant ou dcroissant).
Nous trouvons ensuite un argument Header qui prcise s'il y a une zone de titre ou non. Croyez en
ma vieille exprience, prenez l'habitude de slectionner des zones trier sans ligne de titre, vous vous
simplifierez l'existence.
L'argument MatchCase est un boolen qui prcise si le tri doit respecter ou non la casse lorsqu'on
tri des chanes de caractres.
Enfin l'argument Orientation dtermine le sens du tri. Normalement il accepte deux valeurs
(XlColumns ou XlRows) mais pour des raisons de comprhension, on utilise parfois les constantes
quivalentes xlTopToBottom ou xlLeftToRight.
Si vous n'tes pas parti vous lobotomiser coup de tisonnier, vous allez voir qu' utiliser
maintenant c'est simple comme chou. Nous voulons trier notre tableau selon la valeur de la moyenne,
puis selon l'ordre de T1.
Sub Test Tr i ( )
Di mmapl age As Range
' df i ni t une pl age cont enant t out l e t abl eau
Wi t h Thi sWor kbook. Wor ksheet s( " Tr i " )
Set mapl age = . Range( . Cel l s( 1, 1) , . Cel l s( . Rows. Count ,
7) . End( xl Up) )
End Wi t h
' r edf i ni t une pl age sans l i gne de t i t r e
Set mapl age = mapl age. Of f set ( 1) . Resi ze( mapl age. Rows. Count - 1)
' voi r expl i cat i on sui vant l ' exempl e
mapl age. Sor t key1: =mapl age. Cel l s( 6) , or der 1: =xl Ascendi ng,
key2: =mapl age. Cel l s( 3) , or der 2: =xl Ascendi ng, header : =xl No,
Or i ent at i on: =xl TopToBot t om
End Sub
La premire chose est donc se gnrer un objet Range contenant lensemble du tableau dune
manire tout fait classique. Pour simplifier le tri, je vais dcaler lobjet Range pour enlever la ligne
de titre. Pour cela il suffit de dcaler dune ligne vers le bas la plage est de diminuer sa taille dune
ligne. Ensuite de quoi nous allons trier. Nous avons donc besoin de dfinir deux cls de tri, la premire
sur la moyenne et la seconde sur la colonne T1. Comme je vous lai dit plus haut, la dfinition dune
cl de tri consiste passer une paire dargument dont le premier est la premire cellule contenant une
valeur ntant pas un titre de la colonne et le second tant le sens du tri. Comme nous avons enlev
physiquement la ligne de titre, la premire ligne de la plage contient des valeurs. Comme nous lavons
vu aussi prcdemment, je peux utiliser la proprit Cells de lobjet Range pour renvoyer une cellule
particulire en utilisant une coordonne linaire. Les cellules de la premire ligne vont avoir une
coordonne comprise entre 1 et Columns.Count. Dans notre cas, les deux colonnes qui nous
intressent sont la sixime de la plage, et la troisime. Donc les deux cls de tri sont la sixime et la
troisime de la plage. Largument Header sera xlNo puisque nous avons enlev les titres, et
Orientation vaudra xlColumns ou son quivalent xlTopToBottom. Ce nest pas plus compliqu que
cela.
174
SpecialCells
Attention, ce passage de laide en ligne est un sommet de la traduction rat. Les explications sont
ou fausses ou sans aucun sens. Nous allons voir ici le fonctionnement rel de cette mthode, ne tenez
pas compte de laide en ligne.
Cette mthode permet de renvoyer une sous plage de cellules particulires selon les arguments
passs. De la forme :
Function SpecialCells(Type As XlCellType, [Value As XlSpecialCellsValue]) As Range
Largument Type peut prendre une des valeurs suivantes :
Constantes Explication
xlCellTypeAllFormatConditions
Renvoie toutes les cellules de la feuille ayant les mmes rgles de format
conditionnel que la cellule suprieure gauche de la plage appelante. Celle-ci
doit avoir un format conditionnel.
xlCellTypeAllValidation. Renvoie toute les cellules de la plage appelante ayant une validation dfinie.
xlCellTypeBlanks Renvoie toutes les cellules vides de la plage appelante.
xlCellTypeComments
Renvoie toutes les cellules de la plage appelante contenant des
commentaires.
xlCellTypeConstants
Renvoie toutes les cellules de la plage appelante contenant des valeurs mais
pas de formules
xlCellTypeFormulas Renvoie toutes les cellules de la plage appelante contenant des formules
xlCellTypeLastCell
Renvoie la dernire cellule de la feuille quelle que soit la plage appelante. La
dernire cellule ne contient pas forcment une valeur, elle est dfinie comme
tant lintersection de la dernire ligne utilise et de la dernire colonne
utilise
xlCellTypeSameFormatConditions
Renvoie toutes les cellules de la plage appelante ayant un format
conditionnel.
xlCellTypeSameValidation
Si la plage appelante ne contient quune cellule ayant une validation dfinie,
renvoie toutes les cellules de la feuille ayant les mmes critres de validation.
Sinon renvoie toutes les cellules de la plage appelante ayant les mmes
critres de validation que la cellule suprieure gauche de la plage appelante.
xlCellTypeVisible
Renvoie toutes les cellules visibles de la plage appelante. Les cellules
visibles sont dfinies comme toutes cellules dont la ligne ou la colonne nest
pas masque.
Lorsque le type pour valeur xlCellTypeConstants ou xlCellTypeFormulas, vous pouvez
passer un argument optionnel Value qui peut prendre une composition (masque binaire) des valeurs
suivantes :
xlErrors Renvoie uniquement les cellules de la sous plage affichant une valeur derreur.
xlLogical Renvoie les cellules de la sous plage contenant une valeur logique (Vrai ou Faux)
xlNumbers Renvoie les cellules de la sous plage affichant une valeur numrique
xlTextValues Renvoie les cellules de la sous plage affichant une chane de caractre
Chaque fois quil nexiste pas de cellules correspondantes aux critres spcifis, Excel lvera une
erreur rcuprable 1004 ayant pour message Pas de cellules correspondantes .
175
Le code suivant illustre le fonctionnement de ces combinaisons, puis efface les donnes
numriques du tableau sans effacer les formules.
Sub Cl eanSpeci al ( )

Di mmapl age As Range, Feui l l e As Wor ksheet

Set Feui l l e = Thi sWor kbook. Wor ksheet s( " Speci al " )
Set mapl age = Feui l l e. Range( " A1: G100" )
Debug. Pr i nt mapl age. Speci al Cel l s( xl Cel l TypeFor mul as,
xl Number s) . Addr ess( Fal se, Fal se)
' G2: G100
On Er r or Resume Next
Debug. Pr i nt mapl age. Speci al Cel l s( xl Cel l TypeFor mul as,
xl Text Val ues) . Addr ess( Fal se, Fal se)
' l ve une er r eur
I f Er r . Number = 1004 And I nSt r ( 1, Er r . Descr i pt i on, " cor r espondant e" ,
vbText Compar e) > 0 Then Er r . Cl ear
Debug. Pr i nt mapl age. Speci al Cel l s( xl Cel l TypeConst ant s,
xl Number s) . Addr ess( Fal se, Fal se)
' A2: F100
Debug. Pr i nt mapl age. Speci al Cel l s( xl Cel l TypeConst ant s,
xl Text Val ues) . Addr ess( Fal se, Fal se)
' A1: G1
mapl age. Speci al Cel l s( xl Cel l TypeConst ant s, xl Number s) . Cl ear Cont ent s

End Sub
176
Discussion technique
Maintenant que nous avons vu une bonne partie du modle objet de manipulation des feuilles de
calcul, nous allons voir ensemble quelques problmatiques courantes de la programmation Excel pour
se familiariser avec cette programmation et pour voir les diverses solutions qu'on peut envisager face
un problme pos.
Comprendre Excel
In fine, la plus grande difficult de la programmation Excel reste une connaissance correcte du
fonctionnement d'Excel. Cela peut sembler stupide et c'est pourtant la principale cause des difficults
de conception que l'on rencontre. Pour illustrer ce propos, nous allons commencer par un classique de
la programmation Excel, la rcupration d'un fichier avec suppression de ligne.
Nous allons donc crire un code qui ouvre un fichier texte dfinit l'excution, qui va supprimer 4
lignes sur cinq puis qui va intgrer les lignes restantes dans la feuille 'donnes' de notre classeur
macro.
Commenons par une approche classique.
Publ i c Sub Tr ai t eFi chi er ( )

Di mNomFi chi er As St r i ng, Cl asseur Sour ce As Wor kbook, Li gne As Range,
compt eur As Long

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Cl asseur Sour ce = Appl i cat i on. Act i veWor kbook
For Each Li gne I n Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Rows
compt eur = compt eur + 1
I f compt eur > 1 Then
Li gne. Del et e
End I f
I f compt eur = 5 Then compt eur = 0
Next Li gne

End Sub
Dans ce code, nous avons donc propos l'utilisateur une bote de slection de fichiers, mis le
classeur ouvert dans une variable objet de type Workbook, puis crit un traitement de suppression de
lignes. La premire partie du code ne pose pas de problme, par contre le code de suppression de ligne
va en poser.
Il est pourtant juste dans son concept, puisqu'il va parcourir la collection des lignes et en
supprimer quatre sur cinq. Pourtant il est fonctionnellement faux puisqu'il contient une faute de
programmation et une approche errone du fonctionnement d'Excel.
La faute de programmation n'est pas vidente. On ne doit pas utiliser la mthode Delete sur le
membre d'une collection qu'on est en train d'numrer. L'numration est un parcours des membres
d'une collection. Si on supprime certains de ces membres pendant le parcours, il n'existe pas de
garantie que le parcours se droulera correctement. En l'occurrence, s'il n'y avait que cette erreur, le
code pourrait fonctionner. Mais la deuxime est beaucoup plus grave puisqu'elle ne prend pas en
compte le fonctionnement d'Excel.
Que se passe-t-il lorsqu'on supprime une ou plusieurs lignes dans Excel ? Au nom de la continuit
de numrotation, les lignes sont remplaces par les lignes situes au dessous, et Excel recre des lignes
en fin de feuille pour que le nombre de lignes de la feuille reste constant.
177
Or dans notre code, lors de l'numration, nous allons parcourir les lignes par numro d'index,
c'est--dire par numro de ligne. Lorsque nous allons par exemple supprimer la ligne 2, la ligne 3 va se
retrouver en position 2 et la ligne 4 en position 2. Lors de la boucle suivante de l'numration, la ligne
3 va tre supprime, mais la ligne 2 va tre conserve alors qu'elle aurait du tre supprime aussi. Ce
code va donc supprimer une ligne sur 2 quatre fois de suite, puis garder deux lignes et ainsi de suite.
Tout ceci pour dire que l'approche choisie est particulirement mauvaise. Reprenons donc notre
conception, pour gnrer une mthode applicable tous les cas de suppression, c'est--dire x lignes sur
n.
Dj nous ne devons pas numrer. Nous utiliserons donc une boucle ForNext classique. Si
nous ne voulons pas avoir prendre en compte le glissement des lignes engendr par la suppression,
nous devons parcourir la collection dans l'autre sens. Nous aurons donc un pas ngatif. Mais dans ce
cas, nous devons envisager le cas probable o le nombre de ligne du fichier n'est pas un multiple de n.
Je vais crire ce code et nous le discuterons par la suite.
Publ i c Sub Tr ai t eFi chi er ( )

Di mNomFi chi er As St r i ng, Cl asseur Sour ce As Wor kbook, Li gnes As Range,
compt eur As Long

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Cl asseur Sour ce = Appl i cat i on. Act i veWor kbook
Wi t h Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange
Set Li gnes = . Of f set ( 1) . Resi ze( . Rows. Count - 1)
End Wi t h
Cal l Del et eXSur N( 4, 5, Li gnes)
Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Copy
Dest i nat i on: =Thi sWor kbook. Wor ksheet s( " Donnee" ) . Cel l s( 1, 1)
Cl asseur Sour ce. Cl ose Fal se

End Sub

Pr i vat e Sub Del et eXSur N( ByVal X As I nt eger , ByVal N As I nt eger , ByRef Pl age
As Range)

Di mNbLi gne As Long, Li mSup As Long, compt eur As Long

Appl i cat i on. Scr eenUpdat i ng = Fal se
NbLi gne = Pl age. Rows. Count
Li mSup = NbLi gne \ N
I f NbLi gne = Li mSup * N Then Li mSup = Li mSup - 1
For compt eur = Li mSup * N + 1 To 1 St ep - 1 * N
Pl age. Rows( compt eur ) . Of f set ( N - X) . Resi ze( X) . Del et e
Appl i cat i on. St at usBar = " l i gnes " & compt eur
Next compt eur
Appl i cat i on. St at usBar = Fal se
Appl i cat i on. Scr eenUpdat i ng = Tr ue

End Sub
Pour simplifier la discussion, j'ai cr une procdure DeleteXSurN qui supprime les X dernires
lignes d'un groupe de N ligne sur la plage passe en argument.
Celle-ci va parcourir en sens inverse la plage par pas de N en supprimant les X dernire lignes, ce
qui s'crit :
Pl age. Rows( compt eur ) . Of f set ( N - X) . Resi ze( X) . Del et e
Ensuite de quoi je vais copier les donnes vers le classeur macro.
178
Ce code va fonctionner parfaitement, mais il est extrmement lent. Pour une suppression de 4
lignes sur 5 pour un fichier de 50 000 lignes, il mettra plus de deux minutes. Cela vient du fait que le
processus de suppression d'Excel est lui-mme un mcanisme lent. Parfois ce type de traitement est
invitable, mais souvent on peut contourner le problme.
Dans l'exercice qui nous proccupe, il y a plusieurs faons d'acclrer le traitement, lgrement
diffrent selon le rsultat final que nous souhaitons obtenir. En effet, si comme dans mon exemple je
souhaite tre non destructif, c'est--dire que je n'enregistre pas les changements dans mon classeur
source, alors le problme a t pris l'envers. En effet, le but n'est dans ce cas pas de supprimer X
lignes sur N, mais de rcuprer N-X lignes sur N. En posant le problme ainsi, je peux utiliser
plusieurs codes diffrents. Le plus simple serait alors d'crire :
Publ i c Sub Tr ai t eFi chi er 1( )

Di mNomFi chi er As St r i ng, Cl asseur Sour ce As Wor kbook, Li gnes As Range,
compt eur As Long
Di ml gTi me As Long

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Cl asseur Sour ce = Appl i cat i on. Act i veWor kbook
For compt eur = 2 To Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Rows. Count
St ep 5
Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Rows( compt eur ) . Copy
Dest i nat i on: =Thi sWor kbook. Wor ksheet s( " Donnee" ) . Cel l s( ( compt eur - 2) / 5 +
1, 1)
Next
Cl asseur Sour ce. Cl ose Fal se

End Sub
Dans ce code, nous ne lisons qu'une ligne sur 5 que nous intgrons directement dans la feuille
donne du classeur macro. Ce code va environ deux fois plus vite que le prcdent, ce qui est bien
mais nous pouvons encore largement amliorer. En effet, le code prcdent est encore assez lent car
nous utilisons un autre processus assez lourd, le copier coller. Or dans notre cas, nous voulons affecter
les valeurs du fichier source dans le classeur macro, et pour cela, nous pouvons utiliser l'affectation
directe des proprits Value comme nous l'avons vu prcdemment. Nous pourrions crire :
Publ i c Sub Tr ai t eFi chi er 2( )

Di mNomFi chi er As St r i ng, Cl asseur Sour ce As Wor kbook, Cel l Sour ce As Range,
Cel l Ci bl e As Range, compt eur As Long, NbCol As I nt eger

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Cl asseur Sour ce = Appl i cat i on. Act i veWor kbook
Set Cel l Sour ce = Cl asseur Sour ce. Wor ksheet s( 1) . Cel l s( 2, 1)
Set Cel l Ci bl e = Thi sWor kbook. Wor ksheet s( " Donnee" ) . Cel l s( 1, 1)
NbCol = Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Col umns. Count
For compt eur = 0 To Cl asseur Sour ce. Wor ksheet s( 1) . UsedRange. Rows. Count \
5
Cel l Ci bl e. Of f set ( compt eur ) . Resi ze( , NbCol ) . Val ue =
Cel l Sour ce. Of f set ( compt eur * 5) . Resi ze( , NbCol ) . Val ue
Next
Cl asseur Sour ce. Cl ose Fal se

End Sub
179
Pour traiter le mme fichier de 50 000 lignes, ce code mettra moins de 5 secondes, soit une
excution 25 fois plus rapide que la premire solution envisage.
Cependant cette approche ne rsout pas forcment tous les problmes. On pourrait parfaitement
imaginer que certains fichiers possdent plus de 65536 lignes, ou vouloir craser le fichier source avec
un fichier ne contenant plus qu'une ligne sur 5. Le code suivant va pouvoir lire un fichier ayant plus de
ligne que le maximum de lignes Excel et va crer un fichier source rduit.
Publ i c Sub Tr ai t eFi chi er 3( )

Di mNomFi chi er As St r i ng, Fi chi er Redui t As St r i ng, Cel l Ci bl e As Range,
compt eur As Long, Recup As St r i ng

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Fi chi er Redui t = Lef t ( NomFi chi er , I nSt r Rev( NomFi chi er , " . " ) - 1) &
" . r ed"
Open NomFi chi er For I nput As #1
Open Fi chi er Redui t For Out put As #2
Li ne I nput #1, Recup
Li ne I nput #1, Recup
Set Cel l Ci bl e = Thi sWor kbook. Wor ksheet s( " Donnee" ) . Cel l s( 1, 1)
Do Unt i l EOF( 1)
Li ne I nput #1, Recup
Cel l Ci bl e. Of f set ( compt eur ) . Val ue = Recup
Pr i nt #2, Recup
compt eur = compt eur + 1
Li ne I nput #1, Recup
Li ne I nput #1, Recup
Li ne I nput #1, Recup
Li ne I nput #1, Recup
Loop
Cl ose #1
Cl ose #2

Cel l Ci bl e. Resi ze( Thi sWor kbook. Wor ksheet s( " Donnee" ) . Rows. Count ) . Text ToCol umn
s Dest i nat i on: =Range( " A1" ) , Dat aType: =xl Del i mi t ed, Tab: =Tr ue

End Sub
Bien que ce code soit plus "universel" que le prcdent, il n'en est pas moins plus rapide.
Comme nous venons de le voir, il n'est pas toujours vident de savoir quelle mthode choisir.
Recherche de plage
Il s'agit l d'un grand classique de la programmation Excel, la recherche des plages de donnes.
Lorsqu'on travaille sur des fichiers externes, il est assez frquent qu'on ne connaisse pas le nombre de
lignes et ou de colonnes du fichier. Avant mme de savoir quelle mthode choisir, nous devons dj
dfinir ce qu'est une plage de donnes. Nous allons continuer travailler sur notre fichier d'acquisition,
mais c'est fondamentalement la mme chose pour tous les fichiers externes contenant des blocs de
donnes.
Dans le cas d'un fichier d'acquisition, la plage de donnes c'est une matrice rectangulaire
contenant tous les points d'acquisition. Gnralement nous ne connaissons ni le nombre de ligne, ni le
nombre de colonnes, mais uniquement les sparateurs permettant la redistribution.
La premire question c'est comme pour le gruyre, avec ou sans trous. Soit on considre qu'il ne
peut pas y avoir de cellules vides dans la plage, soit il peut y en avoir.
Excel propose des mthodes pour chercher la dernire cellule d'une plage dans les deux cas.
Commenons par le plus simple, le cas sans trou.
180
Pour pouvoir dfinir une plage de donnes, il faut videmment pouvoir atteindre facilement une
des cellules de la plage. Dans nos fichiers d'acquisition, chaque colonne de donnes un titre, il est
donc assez simple d'aller rechercher le titre. Ensuite de quoi il va falloir aller chercher la dernire
cellule de la colonne, c'est--dire la dernire cellule non vide.
Publ i c Sub Cher chePl age1( )

Di mNomFi chi er As St r i ng, Feui l l eSour ce As Wor ksheet , Pl age As Range

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Feui l l eSour ce = Appl i cat i on. Act i veWor kbook. Wor ksheet s( 1)
Wi t h Feui l l eSour ce
Set Pl age = . Cel l s. Fi nd( " N_I NS" )
I f Not Pl age I s Not hi ng Then
Set Pl age = . Range( Pl age, Pl age. End( xl Down) )
El se
Set Pl age = Appl i cat i on. I nput Box( " Sl ect i onnez l a pl age du
r gi me" , Type: =8)
End I f
End Wi t h
MsgBox Pl age. Addr ess

End Sub
Jusque l aucune difficult apparente, sauf s'il existe une cellule contenant le texte N_INS mais
que les cellules de la mme colonne sont vides. Il suffit de tester la cellule immdiatement au dessous
pour avoir une approche 'universelle'. Si la plage est sense ne pas contenir de formules, comme dans
le cas d'un fichier d'acquisition, on peut aussi restreindre la plage l'aide de SpecialCells comme dans
l'exemple ci-dessous :
Publ i c Sub Cher chePl age1( )

Di mNomFi chi er As St r i ng, Feui l l eSour ce As Wor ksheet , Pl age As Range

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Feui l l eSour ce = Appl i cat i on. Act i veWor kbook. Wor ksheet s( 1)
Wi t h Feui l l eSour ce
Set Pl age = . Cel l s. Fi nd( " N_I NS" )
I f Not Pl age I s Not hi ng Then
Set Pl age = . Range( Pl age,
Pl age. End( xl Down) ) . Speci al Cel l s( xl Cel l TypeConst ant s)
El se
Set Pl age = Appl i cat i on. I nput Box( " Sl ect i onnez l a pl age du
r gi me" , Type: =8)
End I f
End Wi t h
MsgBox Pl age. Addr ess

End Sub
On peut videmment rcuprer sur un principe assez similaire des plages de plusieurs colonnes.
Cela fonctionne aussi pour les plages en lignes, il suffit de changer l'argument de la proprit End.
181
De la mme faon, on peut aussi construire des plages discontinues l'aide de la mthode Union,
soit en connaissant la valeur du dcalage d'une plage par rapport une plage dtermine, soit par
recherche successive. Par exemple, je peux construire une plage qui renverra les colonnes heure,
N_INS, COUPLE_INS et PAP_INS quelle que soit leur position dans la feuille.
Publ i c Sub Pl ageDi scont i nue( )

Di mNomFi chi er As St r i ng, NomCol onne As St r i ng, compt eur As Long
Di mFeui l l eSour ce As Wor ksheet , t mpPl age As Range, Di scPl age As Range

NomFi chi er = Appl i cat i on. Get OpenFi l ename( " Fi chi er Mor phee ( *. 0*) ,
*. 0*" , , " Fi chi er d' acqui si t i on" )
I f St r Comp( NomFi chi er , " Faux" , vbText Compar e) = 0 Then Exi t Sub
Appl i cat i on. Wor kbooks. OpenText Fi l ename: =NomFi chi er , St ar t Row: =2,
Dat aType: =xl Del i mi t ed, Tab: =Tr ue, Deci mal Separ at or : =" . "
Set Feui l l eSour ce = Appl i cat i on. Act i veWor kbook. Wor ksheet s( 1)
Wi t h Feui l l eSour ce
For compt eur = 1 To 4
NomCol onne = Choose( compt eur , " heur e" , " n_i ns" , " coupl e_i ns" ,
" pap_i ns" )
Set t mpPl age = . Cel l s. Fi nd( What : =NomCol onne, Mat chCase: =Fal se)
I f Not t mpPl age I s Not hi ng Then
Set t mpPl age = . Range( t mpPl age,
t mpPl age. End( xl Down) ) . Speci al Cel l s( xl Cel l TypeConst ant s)
I f Not Di scPl age I s Not hi ng Then
Set Di scPl age = Appl i cat i on. Uni on( Di scPl age, t mpPl age)
El se
Set Di scPl age = t mpPl age
End I f
El se
MsgBox " Col onne " & UCase( NomCol onne) & " non t r ouve"
End I f
Next compt eur
End Wi t h
MsgBox Di scPl age. Addr ess

End Sub
Vous noterez que je n'ai pas abord la pratique pourtant vidente qui consisterai tester les
cellules successivement dans une numration jusqu' atteindre une cellule vide. Une recherche qui
serait similaire :
Wi t h Feui l l eSour ce
Set Pl age = . Cel l s. Fi nd( " N_I NS" )
For Each MaCel l I n Pl age. Ent i r eCol umn. Cel l s
I f I sEmpt y( MaCel l . Val ue) Then
Set Pl age = . Range( Pl age, MaCel l . Of f set ( - 1) )
Exi t For
End I f
Next
End Wi t h
Dj parce que ce code contient un Bug, dans le sens o le code va planter si la cellule contenant
N_INS n'est pas dans la premire ligne, mais plus gnralement parce que les codes d'numrations
sont extrmement lents. Je n'utiliserai pas non plus de boucles ForNext classique pour les mmes
problmes de lenteur.
Attaquons maintenant le cas un peu plus complexe des plages trous ventuels, c'est--dire
pouvant contenir des cellules vides. Dans ce cas il n'est plus possible d'utiliser la mthode End en
dfilant vers le bas (ou vers la droite pour les lignes), car End va s'arrter la cellule prcdant la
premire cellule vide et la plage ne contiendra pas les valeurs suivantes.
182
Par contre il est assez simple de partir vers le bas pour aller chercher la premire cellule non vide
en remontant. Pour que cette approche fonctionne tout coup, il faut atteindre la dernire cellule de la
colonne (ou de la ligne) tester si elle est vide et appeler End vers le haut (ou vers la gauche) le cas
chant. Par exemple :
Publ i c Sub Cher chePl age2( )

Di mNomFi chi er As St r i ng, Feui l l eSour ce As Wor ksheet
Di mFi r st Cel l As Range, Last Cel l As Range, Pl age As Range

Set Feui l l eSour ce = Thi sWor kbook. Wor ksheet s( 1)
Wi t h Feui l l eSour ce
Set Fi r st Cel l = . Cel l s( 1, 5)
Set Last Cel l = . Cel l s( . Rows. Count , 5)
I f I sEmpt y( Last Cel l . Val ue) Then
Set Last Cel l = Last Cel l . End( xl Up)
End I f
Set Pl age = . Range( Fi r st Cel l , Last Cel l )
End Wi t h
MsgBox Pl age. Addr ess

End Sub
L'avantage de cette technique est qu'elle fonctionne dans tous les cas, sauf si la plage n'est pas
dlimite par des cellules vides.
Recherche de valeur
La recherche de valeur peut sembler assez triviale dans l'absolu, pourtant elle peut vite se rvler
problmatique selon les cas. En effet, en premire analyse, on a toujours tendance penser que la
mthode Find correctement utilise rpond tous les problmes, or tel n'est pas le cas. La mthode
Find prsente plusieurs inconvnients.
Elle peut tre sensible au type de donnes, ainsi un code de recherche de date peut
chouer si la date est sous forme de chane ou sous forme de date
Elle peut tre limite si la valeur cherche apparat de nombreuses fois, selon la forme du
rsultat qu'on souhaite renvoyer.
Elle est souvent assez lente.
Il ne faut pas pour autant la mpriser, elle rpond correctement la plupart des cas, encore faut il
la manipuler correctement.
183
Pour voir les diverses solutions envisageables, repartons d'un exemple classique.

Il n'y a pas de sens aux exemples que je vais prendre, ceux-ci sont justes des exercices de
manipulations.
Nous voulons rcuprer l'ensemble des cellules de la plage de donnes qui contiennent la valeur
20.
La premire chose faire gnralement est de savoir si celle-ci existe au moins une fois dans la
plage de recherche. Ensuite de quoi nous allons chercher regrouper toutes les cellules qui
contiennent cette valeur dans un objet Range. Nous utiliserons pour cela une fonction la plus
universelle possible.
Publ i c Sub Test Recher che( )
Di mMaPl age As Range, Pl ageReponse As Range, Zone As Range, Val eur As
Var i ant
Di mMessage As St r i ng

Val eur = 20
Set MaPl age = Thi sWor kbook. Wor ksheet s( 1) . UsedRange
Set Pl ageReponse = Pl ageVal eur ( 20, MaPl age)
I f Not Pl ageReponse I s Not hi ng Then
For Each Zone I n Pl ageReponse. Ar eas
Message = Message & Zone. Addr ess( Fal se, Fal se) & vbNewLi ne
Next
El se
Message = " La val eur " & Val eur & " n' exi st e pas dans l a pl age " &
MaPl age. Addr ess( Fal se, Fal se)
End I f
MsgBox Message

End Sub

184
Publ i c Funct i on Pl ageVal eur ( ByVal Val eur Cher chee As Var i ant , ByVal
Pl ageRecher che As Range) As Range

Di mTr ouveCel l As Range, Pr emAdr esse As St r i ng

I f Appl i cat i on. Wor ksheet Funct i on. Count I f ( Pl ageRecher che,
Val eur Cher chee) = 0 Then Exi t Funct i on
Set Tr ouveCel l = Pl ageRecher che. Fi nd( What : =Val eur Cher chee,
LookAt : =xl Whol e, Mat chCase: =Fal se)
Pr emAdr esse = Tr ouveCel l . Addr ess
Set Pl ageVal eur = Tr ouveCel l
Do
Set Tr ouveCel l = Pl ageRecher che. Fi ndNext ( Tr ouveCel l )
Set Pl ageVal eur = Appl i cat i on. Uni on( Pl ageVal eur , Tr ouveCel l )
Loop Unt i l Tr ouveCel l . Addr ess = Pr emAdr esse

End Funct i on
Ce qui dans notre exemple renverra :

Ce code est relativement efficace sauf si la valeur apparat dans plusieurs milliers de cellules.
Nous pourrions cependant concevoir une autre approche assez diffrente, mais nettement plus
rapide travaillant elle par l'limination de cellules. En effet, la mthode ColumnDifferences par
exemple permet de trouver toutes les cellules d'une colonne ne contenant pas la valeur de la cellule
dsigne. Or par exclusion, cela revient au mme que la recherche de valeur. Nous pourrions donc
crire une fonction telle que :
Publ i c Funct i on Pl ageVal eur 1( ByVal Val eur Cher chee As Var i ant , ByVal
Pl ageRecher che As Range) As Range
185

Di mCol onne As Range, Tr ouveCel l As Range, Not Equal As Range

I f Appl i cat i on. Wor ksheet Funct i on. Count I f ( Pl ageRecher che,
Val eur Cher chee) = 0 Then Exi t Funct i on
For Each Col onne I n Pl ageRecher che. Col umns
I f Appl i cat i on. Wor ksheet Funct i on. Count I f ( Col onne, Val eur Cher chee) >
0 Then
Set Tr ouveCel l = Col onne. Fi nd( What : =Val eur Cher chee,
LookAt : =xl Whol e, Mat chCase: =Fal se)
Set Not Equal = Col onne. Col umnDi f f er ences( Tr ouveCel l )
Not Equal . Ent i r eRow. Hi dden = Tr ue
I f Pl ageVal eur 1 I s Not hi ng Then
Set Pl ageVal eur 1 = Col onne. Speci al Cel l s( xl Cel l TypeVi si bl e)
El se
Set Pl ageVal eur 1 = Appl i cat i on. Uni on( Pl ageVal eur 1,
Col onne. Speci al Cel l s( xl Cel l TypeVi si bl e) )
End I f
Not Equal . Ent i r eRow. Hi dden = Fal se
End I f
Next Col onne

End Funct i on
Evidemment ce code est un peu trange. Comment fonctionne-t-il ?
Je vais travailler en colonne, mais dans l'absolu il faudrait dtecter la dimension la moins grande
pour travailler dans ce sens. Le code parcours les colonnes de la plage de recherche, chaque colonne
il vrifie s'il existe au moins une fois la valeur cherche dans la colonne. Si tel est le cas, il appelle la
mthode ColumnDifferences qui renvoie la plage de toutes les cellules ne contenant pas la valeur
cherche. Il masque alors cette plage et rcupre la plage de cellules visible qui par la force des choses
contiennent la valeur cherche. Il restaure ensuite la visibilit des cellules. Bien que curieuse, cette
mthode de recherche est extrmement rapide.
Ces deux mthodes n'en ont pas moins un inconvnient, elles ne fonctionnent que pour la
recherche d'une valeur. Si on recherche plusieurs valeurs, une plage de valeur, une ingalit et ainsi de
suite, a ne marche plus.
Nous allons donc travailler avec une mthode beaucoup plus puissante qui permet de grer de
nombreux cas de recherche, le filtrage. Vous allez voir que dans le principe, c'est la mme chose que
le code prcdent.
Il existe une mthode de filtrage avance beaucoup plus puissante que nous n'utiliserons pas ici
car elle est un peu complexe, nous nous contenterons d'utiliser la mthode AutoFilter qui dj devrait
rpondre bien des attentes.
186
Commenons par le cas identique de la recherche de valeur.
Publ i c Funct i on Pl ageVal eur 2( ByVal Val eur Cher chee As Var i ant , ByVal
Pl ageRecher che As Range) As Range

Di mCol onne As Range, Tr ouveCel l As Range, Not Equal As Range

I f Appl i cat i on. Wor ksheet Funct i on. Count I f ( Pl ageRecher che,
Val eur Cher chee) = 0 Then Exi t Funct i on
For Each Col onne I n Pl ageRecher che. Col umns
I f Appl i cat i on. Wor ksheet Funct i on. Count I f ( Col onne, Val eur Cher chee) >
0 Then
Col onne. Aut oFi l t er 1, Val eur Cher chee
' si l i gne de t i t r e
Pl ageRecher che. Cel l s( 1) . Ent i r eRow. Hi dden = Tr ue
I f Pl ageVal eur 2 I s Not hi ng Then
Set Pl ageVal eur 2 = Col onne. Speci al Cel l s( xl Cel l TypeVi si bl e)
El se
Set Pl ageVal eur 2 = Appl i cat i on. Uni on( Pl ageVal eur 2,
Col onne. Speci al Cel l s( xl Cel l TypeVi si bl e) )
End I f
Col onne. Aut oFi l t er
' si l i gne de t i t r e
Pl ageRecher che. Cel l s( 1) . Ent i r eRow. Hi dden = Fal se
End I f
Next Col onne

End Funct i on
A part le fait de masquer la ligne de titre pour ne pas comptabiliser de mauvaises cellules, ce code
est tout fait similaire au prcdent. L'avantage de cette technique est que sans modification, elle
permet des recherches beaucoup plus volues. En effet, pour rechercher les valeurs suprieures 20,
il suffit de passer comme argument ">20" la fonction. On peut d'ailleurs aller plus loin puisqu'on
peut aussi passer un critre de recherche de chane du type "*Ins" pour toutes les chanes finissant par
'ins'.
Autres recherches
Pour finir avec les recherches, nous allons nous livrer un petit exercice de style amusant, pour
voir en quoi la conception d'un programme dpend de la faon de conceptualiser les problmes mais
aussi de la bonne connaissance du modle objet.
Commenons par crire le code suivant :
Publ i c Sub Di sper seSt yl e( )

Di mMi nRowCol As Long, MaxCol As Long, MaxRow As Long
Di mNumCol As Long, NumRow As Long, compt eur As Long

Mi nRowCol = 1
MaxCol = 256
MaxRow = 65536
Randomi ze
For compt eur = 1 To 100
NumCol = I nt ( ( MaxCol - Mi nRowCol + 1) * Rnd) + Mi nRowCol
NumRow = I nt ( ( MaxRow - Mi nRowCol + 1) * Rnd) + Mi nRowCol
Thi sWor kbook. Wor ksheet s( 1) . Cel l s( NumRow, NumCol ) . Font . Bol d = Tr ue
Next compt eur

End Sub
La fonction Randomize active le gnrateur de nombre alatoire.
Ce code va mettre en gras la police de 100 cellules alatoirement dans la feuille.
187
Maintenant nous allons devoir crire une procdure qui retrouve ses cellules. L'approche formelle
est assez simple, il suffit de parcourir l'ensemble des cellules et de tester la police de caractre. Par
exemple :
Publ i c Sub Recher cheSt yl e1( )

Di mMaCel l As Range, Pl age As Range, MaFeui l l e As Wor ksheet

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( 1)
For Each MaCel l I n MaFeui l l e. Cel l s
I f MaCel l . Font . Bol d = Tr ue Then
I f Pl age I s Not hi ng Then
Set Pl age = MaCel l
El se
Set Pl age = Appl i cat i on. Uni on( Pl age, MaCel l )
End I f
End I f
Next MaCel l
Pl age. Sel ect

End Sub
Ce code est indiscutable dans son fonctionnement si ce n'est sur un point, il est abominablement
lent. Sur un poste assez rcent, il lui faudra plus de trois minutes pour renvoyer la plage des 100
cellules.
Est-il possible d'acclrer ce code, et si oui comment ?
Si vous vous rappelez ce que nous avons dit pour les proprits de l'objet Range, vous avez peut
tre la solution. En effet, une plage renvoie la valeur de la proprit si elle est commune toutes les
cellules de l'objet Range et une valeur particulire si non. Ce qui veut dire que si je parcours
l'ensemble des lignes de la feuille, la ligne renverra False si aucune des cellules n'a sa police en gras et
Null si elle contient au moins une cellule en Gras. En appliquant le mme raisonnement sur les
colonnes, je vais pouvoir rduire normment le nombre de tests effectuer. Examinons le code
suivant :
Publ i c Sub Recher cheSt yl e2( )

Di mPl ageRedui t e As Range, MaFeui l l e As Wor ksheet , Pl age As Range
Di mEnumPl age As Range, MaCel l As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( 1)
For Each EnumPl age I n MaFeui l l e. Col umns
I f I sNul l ( EnumPl age. Font . Bol d) Then
I f Pl ageRedui t e I s Not hi ng Then
Set Pl ageRedui t e = EnumPl age
El se
Set Pl ageRedui t e = Appl i cat i on. Uni on( Pl ageRedui t e,
EnumPl age)
End I f
End I f
Next
For Each EnumPl age I n MaFeui l l e. Rows
I f I sNul l ( EnumPl age. Font . Bol d) Then
For Each MaCel l I n Appl i cat i on. I nt er sect ( EnumPl age,
Pl ageRedui t e)
I f MaCel l . Font . Bol d Then
I f Pl age I s Not hi ng Then
Set Pl age = MaCel l
El se
Set Pl age = Appl i cat i on. Uni on( Pl age, MaCel l )
End I f
End I f
Next MaCel l
188
End I f
Next EnumPl age
Pl age. Sel ect

End Sub
Nous allons donc parcourir les colonnes de la feuille et mettre toutes celles qui renvoient Null
dans un objet Range. Nous allons ensuite parcourir la collection des lignes de la feuille. Chaque fois
qu'une ligne va renvoyer Null, elle contiendra au moins une cellule dont la police est en gras. Cette ou
ces cellules seront forcment l'intersection de la ligne et de la plage rduite des colonnes. Il suffit
donc de parcourir une une les cellules de cette intersection et de rcuprer celles qui rpondent au
critre.
Ce code est nettement plus complexe, mais il est 200 fois plus rapide que le prcdent. Sur le
mme poste, il met moins de 2 secondes pour renvoyer la plage.
Fonctions de feuille de calcul
Dans certain cas, il est intressant de pouvoir crire des fonctions utilisables dans des cellules de
feuille de calcul, comme pour les fonctions intgres d'Excel.
Par convention, on dfinit toujours une fonction de type Variant pour ce type de fonctions. Sauf
dans certains cas particulier, on marque la fonction comme tant volatile, c'est--dire devant tre
recalcule chaque fois qu'Excel calcul les formules du classeur. On utilise pour cela la mthode
Volatile de l'objet Application.
Il revient au dveloppeur de grer les erreurs propres la fonction et de renvoyer une valeur
d'erreur dans la cellule appelante. Prenons l'exemple suivant qui compte le nombre de cellules
contenant une valeur numrique dans la plage passe en argument.
Publ i c Funct i on Compt eNombr e( ByVal Pl age As Range) As Var i ant

Appl i cat i on. Vol at i l e
I f Not TypeOf Pl age I s Range Then
Compt eNombr e = CVEr r ( xl Er r Val ue)
El se
Di mCel l ul e As Range
For Each Cel l ul e I n Pl ageAr . Cel l s
I f I sNumer i c( Cel l ul e. Val ue) Then Compt eNombr e = Compt eNombr e +
1
Next Cel l ul e
End I f

End Fonct i on
Notez que le test TypeOf n'est l que pour vous donnez un exemple du renvoi d'erreur, dans la
ralit Excel n'appellera pas la fonction si l'argument n'est pas du bon type.
189
Manipulation des graphiques
Les graphiques d'Excel sont aussi prsents dans le modle objet. Il n'existe qu'un objet graphique,
nomm Chart, bien qu'il y en ait deux formes :
La feuille graphique qui renvoie un Objet Chart au travers de la collection Charts du
classeur
Le graphique incorpor ( une feuille de calcul) qui renvoie un objet Chart contenu dans
un objet ChartObject renvoy par la collection ChartObjects de la feuille de calcul.
Globalement, la partie que nous allons se reprsentera telle que :

Le modle objet dpendant des graphiques est assez dense mais sa programmation reste assez
simple. En fait elle se dcompose en deux parties gnrales, la manipulation des donnes permettant
de crer le graphique, et la mise en forme.
Crer un Graphique
Dans la cration du graphique, on entend minima, la cration de l'objet graphe et la cration d'au
moins une srie.
Pour crer une feuille graphique, nous aurons donc un code de la forme :
Cl asseur . Char t s. Add
Pour crer un graphique incorpor, nous aurons un code de la forme :
Cl asseur . Feui l l e. Char t Obj ect s. Add
Pour pouvoir manipuler facilement notre graphique, nous allons l'affecter une variable objet de
type Chart.
Pour crer une feuille graphique nous allons avoir :
Sub Feui l l eGr aphi que( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MonGr aphe = Thi sWor kbook. Char t s. Add

End Sub
Dans le cas du graphique incorpor c'est un peu diffrent. Lors de sa cration dans la mthode
Add, celle-ci attend quatre arguments dfinit tels que :
190
Function Add(Left As Double, Top As Double, Width As Double, Height As Double) As ChartObject
Vous devez donc dfinir des coordonnes Gauche et Haute ainsi qu'une largeur et une hauteur.
On peut soit passer des valeurs directement telles que :
Sub Gr aphi queI ncor por e( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
Pl ageDonnees. Sel ect
Set MonGr aphe = . Char t Obj ect s. Add( 100, 100, 300, 200) . Char t
End Wi t h

End Sub
Soit aligner l'objet sur une plage de cellules :
Sub Gr aphi queI ncor por e( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageGr aphi que As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageGr aphi que = . Range( " H1: N20" )
Set MonGr aphe = . Char t Obj ect s. Add( Pl ageGr aphi que. Lef t ,
Pl ageGr aphi que. Top, Pl ageGr aphi que. Wi dt h, Pl ageGr aphi que. Hei ght ) . Char t
End Wi t h

End Sub
Dans les deux cas, vous voyez que ce n'est pas l'objet que je viens de crer que j'affecte ma
variable MonGraphe mais la valeur renvoye par sa proprit Chart. En effet, la mthode Add de la
collection ChartObjects renvoie un objet ChartObject qui lui-mme contient l'objet Chart.
Une fois la variable MonGraphe correctement affecte, il n'y aura plus de diffrences de
manipulation entre la feuille graphique ou le graphique incorpor, du moins au niveau de la
programmation du graphe.
Nous allons donc crer des sries en partant de notre dsormais classique tableau.
191

Utiliser la slection
La premire mthode est un peu spcieuse, dans le sens ou elle engendre plus souvent des erreurs
que de bons rsultats. En effet, lorsque vous crez une feuille graphique alors qu'une plage de donnes
est slectionne, Excel va utiliser cette slection pour crer des sries. Imaginons le code suivant :
Sub Cr eeGr apheSel ect i on( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
Pl ageDonnees. Sel ect
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Type = xl XYScat t er

End Sub
192
Je slectionne une plage contenant des donnes et je cre une feuille graphique. Celle-ci aura alors
cette apparence :

La proprit ChartType permet de dfinir le type de graphique. Nous la verrons lors de la mise en
forme des graphes. xlXYScatter dfini un graphique X,Y appel nuage de points.

Cette mthode fonctionne bien, mais si vous regardez la lgende, vous verrez que le temps est
considr comme une srie de donnes et non comme l'abscisse des autres sries. On vite
gnralement l'emploi de cette technique. Cependant cela doit vous donner un second rflexe. Comme
Excel va toujours tenter de crer un graphe avec sa slection, vous n'avez pas la certitude que l'objet
graphique que vous venez de crer ne contiendra pas une srie ajoute par Excel.
Pour cela, on appelle la mthode Clear de l'objet Chart juste aprs sa cration.
Cration par Copier Coller
La deuxime mthode consiste utiliser le copier coller, c'est--dire copier les cellules de la plage
de donnes et les coller dans le graphique.
Donc nous aurons :
Sub Cr eeGr apheCopy( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
Pl ageDonnees. Copy
MonGr aphe. Past e

End Sub
Qui nous crera le graphe :
193

L encore, la colonne des abscisses n'est pas correctement interprte. Cependant nous pourrions
modifier ce comportement en faisant un collage non plus sur l'objet Chart mais sur la collection
SeriesCollection, tel que :
Sub Cr eeGr apheCopy( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
Pl ageDonnees. Copy
MonGr aphe. Ser i esCol l ect i on. Past e Rowcol : =xl Col umns, Ser i esLabel s: =Tr ue,
Cat egor yLabel s: =Tr ue, Repl ace: =Fal se, NewSer i es: =Tr ue

End Sub
Dans ce cas, le graphique utilisera bien la colonne de gauche de la plage de donnes comme
colonne des abscisses.
194
Dfinition d'une source de donnes
Nous pouvons aussi affecter la plage de donnes au graphique par le biais de la mthode
SetSourceData. Celle-ci attend un objet Range dfinissant la plage de donnes et ventuellement un
argument PlotBy dfinissant le sens des sries (en ligne ou en colonne)
Sub Cr eeGr apheDonneeSour ce( )
i t h

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
End W
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
MonGr aphe. Set Sour ceDat a Pl ageDonnees

End Sub
Par ajout de sries
D'une manire assez similaire, nous pouvons aussi passer la plage de donnes comme argument
de la mthode Add de l'objet SeriesCollection.
Sub Cr eeGr apheAddSer i e( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
MonGr aphe. Ser i esCol l ect i on. Add Pl ageDonnees

End Sub
Vous noterez galement que sans autres arguments, cette technique prends en compte la premire
colonne comme une srie indpendante et non comme des abscisses.
Vous pouvez changer cela en utilisant :
MonGr aphe. Ser i esCol l ect i on. Add Pl ageDonnees, xl Col umns, , Tr ue
Par dfinitions des sries
Toutes ces mthodes sont pratiques, mais elles ne sont pas trs souples. En effet, si vous voulez
des abscisses qui ne soient pas dans la premire colonne de la plage, vous ne pouvez pas les utiliser.
La faon la plus robuste consiste utiliser une vraie programmation des objets sries, un un.
Reprenons la base de ce modle objet. L'objet Chart expose une proprit SeriesCollection, qui
renvoie la collection des sries du graphique.
Les membres de cette collection sont des objets Series. Un objet Series contient plusieurs
proprits et mthodes qui dfinissent l'ensemble de la srie c'est--dire ses donnes et son apparence.
Pour les donnes, l'objet Series expose une proprit Values qui dfinie ces ordonnes, et une
proprit XValues qui dfinit ces abscisses.
De fait, nous n'allons donc plus travailler avec toute la plage de colonnes, mais avec des colonnes
spares.
Recrons notre graphique prcdent avec cette technique.
195
Sub Cr eeGr apheNewSer i e( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range
Di mPl ageX As Range, Pl ageY As Range, MaSer i e As Ser i es, compt eur As Long

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( , 6)
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
Set Pl ageX = Pl ageDonnees. Col umns( 1)
For compt eur = 1 To Pl ageDonnees. Col umns. Count - 1
Set Pl ageY = Pl ageX. Of f set ( , compt eur )
Set MaSer i e = MonGr aphe. Ser i esCol l ect i on. NewSer i es
Wi t h MaSer i e
. Val ues = Pl ageY
. XVal ues = Pl ageX
. Name = Pl ageDonnees. Cel l s( 1, 1) . Of f set ( , compt eur )
End Wi t h
Next compt eur

End Sub
La proprit Name dfinit le nom qui apparatra par dfaut dans la lgende.
L'ajout de srie un graphique dj existant fonctionne l'identique, si ce n'est que vous n'avez
pas besoin de crer l'objet graphique.
Mise en forme
Le code de mise en forme est trs simple. Je ne vais pas entrer dans le dtail du modle objet mais
juste vous donnez des exemples de codes classiques.
Modifier l'apparence des sries
Le code suivant va changer le marqueur de srie et la couleur du trac pour chaque srie lors de sa
cration.
Sub Cr eeGr apheNewSer i e( )

Di mMonGr aphe As Char t , MaFeui l l e As Wor ksheet , Pl ageDonnees As Range
Di mPl ageX As Range, Pl ageY As Range, MaSer i e As Ser i es, compt eur As Long

Set MaFeui l l e = Thi sWor kbook. Wor ksheet s( " Tabl eau" )
Wi t h MaFeui l l e
Set Pl ageDonnees = . Range( . Cel l s( 1, 1) , . Cel l s( 1,
1) . End( xl Down) ) . Resi ze( 30, 6)
End Wi t h
Set MonGr aphe = Thi sWor kbook. Char t s. Add
MonGr aphe. Char t Ar ea. Cl ear
MonGr aphe. Char t Type = xl XYScat t er
Set Pl ageX = Pl ageDonnees. Col umns( 1)
For compt eur = 1 To Pl ageDonnees. Col umns. Count - 1
Set Pl ageY = Pl ageX. Of f set ( , compt eur )
Set MaSer i e = MonGr aphe. Ser i esCol l ect i on. NewSer i es
Wi t h MaSer i e
. Val ues = Pl ageY
. XVal ues = Pl ageX
. Name = Pl ageDonnees. Cel l s( 1, 1) . Of f set ( , compt eur )
. Bor der . Col or I ndex = compt eur
196
. Mar ker St yl e = Choose( compt eur , xl Mar ker St yl ePl us,
xl Mar ker St yl eTr i angl e, xl Mar ker St yl eCi r cl e, xl Mar ker St yl eDi amond,
xl Mar ker St yl eSquar e)
. Mar ker Si ze = 3
. Mar ker Backgr oundCol or I ndex = compt eur
. Mar ker For egr oundCol or I ndex = compt eur
End Wi t h
Next compt eur

End Sub
Le code suivant affecte la srie 'Vitesse' un deuxime axe Y.
Publ i c Sub Modi f i er Ser i e( )

Di mMonGr aphe As Char t , MaSer i e As Ser i es

Set MonGr aphe = Thi sWor kbook. Char t s( 1)
For Each MaSer i e I n MonGr aphe. Ser i esCol l ect i on
I f I nSt r ( 1, MaSer i e. Name, " vi t esse" , vbText Compar e) > 0 Then
MaSer i e. Axi sGr oup = xl Secondar y
End I f
Next MaSer i e

End Sub
Ce code ajouter au prcdent donnerait un graphe similaire :

Comme vous le voyez, les sries partent d'un point '0' qui n'existe pas dans le tableau de donnes.
Comment cela se fait-il ?
En fait, j'ai slectionn comme plage de donnes des colonnes contenant un titre pour la srie. Ce
titre ne pouvant pas tre converti en donnes, Excel trace un point 0 qui n'existe pas. Je pourrais
corriger cela, soit en modifiant la plage de donnes, soit en modifiant la premire valeur de la srie.
Dans les deux cas, cette approche n'est pas facile car on ne peut pas trop modifier la collection
Points de l'objet Serie. Par ailleurs, les proprits Values et XValues de la srie ne contiennent pas une
rfrence vers l'objet Range qui les a cres mais un variant contenant un tableau des valeurs.
Pour retrouver les objets Range d'origine, je vais devoir manipuler une autre proprit de l'objet
Serie, FormulaR1C1Local. Celle-ci va renvoyer une chane de type :
197
=SERIE("T 1";Tableau!L1C1:L30C1;Tableau!L1C2:L30C2;1)
C'est--dire une fonction comprenant comme argument :
Le Nom de la srie
La plage des abscisses
La plage des ordonnes
L'ordre de traage
Il s'agit d'une chane de caractre, je peux donc la manipuler comme telle. Pour supprimer le
premier point de chaque srie, il suffirait par exemple d'crire :
Publ i c Sub Modi f i er Ser i e( )

Di mMonGr aphe As Char t , MaSer i e As Ser i es

Set MonGr aphe = Thi sWor kbook. Char t s( 1)
For Each MaSer i e I n MonGr aphe. Ser i esCol l ect i on
MaSer i e. For mul aR1C1Local = Repl ace( MaSer i e. For mul aR1C1Local , " L1C" ,
" L2C" )
I f I nSt r ( 1, MaSer i e. Name, " vi t esse" , vbText Compar e) > 0 Then
MaSer i e. Axi sGr oup = xl Secondar y
End I f
Next MaSer i e

End Sub
Ce qui nous donnerait un graphe tel que :

198
Ajouter un titre ou un fond au graphique
Ce code va ajouter un fond la zone extrieure du graphe, un autre la zone intrieure, puis
ajouter un titre encadr et ombr.
Publ i c Sub Ti t r eEt Fond( )

Di mMonGr aphe As Char t

Set MonGr aphe = Thi sWor kbook. Char t s( 1)
Wi t h MonGr aphe
Wi t h . Char t Ar ea. I nt er i or
. Col or I ndex = 34
. Pat t er nCol or I ndex = 2
. Pat t er n = xl Sol i d
End Wi t h
Wi t h . Pl ot Ar ea. I nt er i or
. Col or I ndex = 15
. Pat t er nCol or I ndex = 1
. Pat t er n = xl Sol i d
End Wi t h
. HasTi t l e = Tr ue
Wi t h . Char t Ti t l e
. Text = " Ti t r e"
. Bor der . Li neSt yl e = xl Thi n
. Shadow = Tr ue
End Wi t h
End Wi t h

End Sub
Notez que je pourrais mettre une cellule comme Titre en crivant :
. Text = " =Tabl eau! R13C11"
Manipuler la lgende
Le code suivant ajoute une lgende au graphique et met les lments de la lgende en gras.
Publ i c Sub Aj out Legende( )

Di mMonGr aphe As Char t , El ement As LegendEnt r y

Set MonGr aphe = Thi sWor kbook. Char t s( 1)
Wi t h MonGr aphe
. HasLegend = Tr ue
Wi t h . Legend
. Posi t i on = xl LegendPosi t i onRi ght
For Each El ement I n . LegendEnt r i es
El ement . Font . Bol d = Tr ue
Next El ement
End Wi t h
End Wi t h

End Sub
Manipuler les axes
Le code suivant va modifier les axes en :
Ajoutant une lgende aux trois axes
Modifiant la police de l'axe des abscisses
Modifiant les marqueurs de l'axe des ordonnes de gauche
Dfinissant un quadrillage interne
Modifiant l'chelle de l'axe des ordonnes de droite
199
Publ i c Sub Mi seEnFor meAxes( )

Di mMonGr aphe As Char t , Axe As Axi s

Set MonGr aphe = Thi sWor kbook. Char t s( 1)
Wi t h MonGr aphe
' act i ons sur l ' axe des X
Set Axe = . Axes( xl Cat egor y, xl Pr i mar y)
Wi t h Axe
. HasTi t l e = Tr ue
. Axi sTi t l e. Text = " Temps ( s) "
. Ti ckLabel s. Font . Col or I ndex = 7
. Ti ckLabel s. Font . Bol d = Tr ue
End Wi t h
' act i ons sur l es or donnes de gauche
Set Axe = . Axes( xl Val ue, xl Pr i mar y)
Wi t h Axe
. HasTi t l e = Tr ue
. Axi sTi t l e. Text = " Tempr at ur e ( C) "
. Maj or Ti ckMar k = xl Ti ckMar kOut si de
. Mi nor Ti ckMar k = xl Ti ckMar kI nsi de
. HasMaj or Gr i dl i nes = Tr ue
End Wi t h
' act i ons sur l es or donnes de dr oi t e
Set Axe = . Axes( xl Val ue, xl Secondar y)
Wi t h Axe
. HasTi t l e = Tr ue
. Axi sTi t l e. Text = " Vi t esse ( r pm) "
. Mi ni mumScal e = 2400
. Maxi mumScal e = 2600
End Wi t h
End Wi t h

End Sub
Tous ces codes enchans de mise en forme donneraient :

200
Dbogage
Avant de nous replonger dans du code pour la fin de ce charmant petit cours, retournons quelques
instants dans l'environnement de dveloppement la dcouverte des outils de dbogage. Pour
comprendre plus facilement les erreurs d'excution, l'environnement VBA va vous fournir quelques
outils bien pratiques. Pour cela, nous continuerons avec les codes que nous avons vu prcdemment,
qui seront appels d'une procdure :
Publ i c Sub Cr eer Gr aphe( )

Cal l Cr eeGr apheNewSer i e
Cal l Modi f i er Ser i e
Cal l Ti t r eEt Fond
Cal l Aj out Legende
Cal l Mi seEnFor meAxes

End Sub
Excution en mode pas pas
Si vous voulez voir ce que fait votre code vous pouvez le faire excuter en mode pas pas c'est--
dire en avanant le curseur d'excution ligne aprs ligne. Pour cela vous devez slectionner le menu
"Dbogage Pas pas dtaill" ou appuyer sur F8.
Vous verrez alors le curseur d'excution qui va surligner en jaune la ligne en attente d'excution.

A chaque pression successive sur la touche F8, le curseur va avancer d'une ligne. Si vous regardez
dans le menu dbogage, vous voyez :
201

Le pas pas dtaill suit exactement le curseur d'excution, c'est--dire que lorsque le code
appelle une fonction, le curseur va dans cette fonction. Ainsi dans la capture d'cran prcdente, si
j'appuie une fois sur F8, j'obtiendrais :

Le pas pas principal, lui reste dans le corps de la fonction ou le curseur se trouve. Lorsqu'il passe
sur une fonction, celle-ci est excute et le curseur va sur la ligne suivante de la mme procdure. Si
j'avais appuy sur Maj+F8, j'aurais obtenu :
202

La petite flche jaune que vous voyez sur la gauche de la fentre vous permet de dplacer le
curseur avec la souris. Si le contexte le permet, vous pouvez donc vous placer sur une ligne
particulire et appuyer sur F8 pour l'excuter. La barre grise dans laquelle se trouve la flche jaune
s'appelle barre de dboguage. Dans certains cas, vous pouvez modifier les lignes de codes sans arrter
l'excution.
Les points d'arrts
Si votre code est un peu long ou s'il contient des boucles, cela peut tre vite fastidieux d'appuyer
sur F8 jusqu' atteindre le point du code qui vous intresse. Pour lancer l'excution jusqu' un point
donne vous pouvez ou placer le curseur sur la ligne et utiliser "Dboguage Excuter jusqu'au
curseur" ou utiliser des points d'arrts.
Pour placer un point d'arrt, il suffit de cliquer dans la barre de dboguage au niveau de la ligne
o vous souhaitez bloquer l'excution;
203

Choisissez ensuite excuter dans le menu Excution (F5), le code s'excutera jusqu'au point
d'arrt.

Vous pouvez placer plusieurs points d'arrts dans votre code et les effacer tous en appuyant sur
Ctrl+Maj+F9.
204
Variables locales
Vous pouvez voir au fur et mesure du pas pas la valeur de vos variables, soit en plaant le
curseur au dessus de celle qui vous intresse

Soit en appellant la fentre des variables locales (dans le menu affichage)

Lorsqu'il s'agit de variables objets, elles ont un signe + cot d'elles lorsque l'objet est instanci.
En cliquant dessus, vous verrez apparatre la liste des proprits de l'objet et leurs valeurs cet instant
de l'excution :

205
Les espions
Vous pouvez aussi choisir un lment en le surlignant, faire un clic droit et slectionner Ajouter
un espion.

Celui-ci apparatra alors dans la fentre des espions jusqu' ce que vous le supprimiez.

206
Manipuler les vnements
Nous allons maintenant aller un peu plus loin en manipulant quelques vnements des objets
Excel que nous avons vu.
Un vnement, c'est une procdure qui s'excute chaque fois qu'un vnement particulier se
produit. Seuls les modules objets peuvent contenir des procdures vnementielles. Dans la partie du
modle objet que nous avons vu, seul les objets WorkBook, WorkSheet et Chart grent des
vnements. L'objet Application en gre aussi mais nous ne les verrons pas dans ce cours.
Pour grer un vnement du classeur, double cliquons dans l'explorateur de projets ce qui va
afficher le module de code objet de l'lment ThisWorkbook

Si vous cliquez sur la liste droulante des objets, vous verrez apparatre un objet Workbook.

Slectionner le, vous allez alors voir apparatre le code :
207

Notez que la valeur Open apparat dans la liste des membres. Si vous cliquez sur celle-ci vous
voyez apparatre la liste des vnements disponible pour le classeur. Slectionnez un membre et le
gnrateur vous crira le squelette de l'vnement :



C des arguments prdfinis, d'autres non. La
dfinition de l'vnement ne peut tre change.
Prenons donc quelques exemples pour l'objet Workbook.
Le code suivant masque la feuille tableau si le classeur est ouvert en lecture seule
Pr i vat e Sub Wor kbook_Open( )
omme vous le voyez, certains vnements ont
I f Me. ReadOnl y Then
Me. Wor ksheet s( " Tabl eau" ) . Vi si bl e = xl Sheet Ver yHi dden
End I f
End Sub
208
L er comme dans n'importe quelle procdure, la
condition de savoir quoi ils servent. Par exemple, l'argument Cancel de l'vnement BeforeClose
annule la fermeture du classeur. Le code suivant permet de forcer la saisie d'un identifiant avant sa
fermeture.
Pr i vat e Sub Wor kbook_Bef or eCl ose( Cancel As Bool ean)
orsqu'il y a des arguments, vous pouvez les utilis
or Each NomI n Me. Names
Di mReponse As St r i ng, NomAs Name

Reponse = Appl i cat i on. I nput Box( " Ent r ez vot r e i dent i f i ant " , " Cont r l e" ,
, , , , , 2)
Cancel = Tr ue
F
I f St r Comp( Mi d( Nom. Ref er sTo, 2) , Reponse, vbText Compar e) = 0 Then
Cancel = Fal se
Exi t For
End I f
Next Nom
End Sub
Ce code est un gadget, on utilise plus gnralement cet vnement pour restaurer l'objet
application lorsqu'on l'a modifi.
Evnements de feuille de calcul
Nous allons voir ici quelques vnements grs par la feuille de calcul. Sachez qu'il en existe
d'autres, et que tous ces vnements remontent aussi vers des vnements grs au niveau du classeur
prfix par le mot 'Sheet' et acceptant un argument 'sh' identifiant la feuille dans lequel l'vnement se
produit. Autrement dit l'vnement Activate de la feuille 1 lvera aussi l'vnement SheetActivate du
classeur en passant un argument sh qui sera une rfrence la feuille 1.
Activation de la feuille
Dfini par
Pr i vat e Sub Wor ksheet _Act i vat e( )
Se produit lorsque la feuille est active, c'est--dire que la feuille est slectionne par le code ou
par l'utilisateur. On l'utilise gnralement lorsqu'on souhaite excuter des actions (calculs, mise en
forme, connexion une source de donnes, etc.) sur la feuille uniquement lorsque celle-ci peut tre
accessible l'utilisateur c'est--dire lorsqu'elle devient la feuille active.
Imaginons par exemple que nous avons une feuille appele "Rcapitulatif", qui contient un grand
nombre de calculs issus de donnes situes dans d'autres feuilles du classeur. Nous avons bloqu le
mode de calcul du classeur pour que le changement des donnes n'engendre pas chaque fois un
recalcul assez long. Lorsque l'utilisateur va aller voir son rcapitulatif, il va bien falloir forcer le calcul
pour que les lments visualiss refltent bien les valeurs actualises. Nous crirons donc dans le
module objet de la feuille.
Pr i vat e Sub Wor ksheet _Act i vat e( )
Me. Cal cul at e
End Sub
Cependant se code peut poser un problme de comportement, car la feuille active par dfaut, c'est-
-dire celle qui s'affiche lors de l'ouverture du classeur ne lve pas l'vnement Activate. Bien qu'en
toute rigueur, cela ne pose pas de problme sauf en cas de liaison externe, il convient gnralement de
s'assurer que la feuille contenant cet vnement ne soit pas la feuille active l'ouverture, et donc
qu'elle ne soit pas la feuille active lors de l'enregistrement du classeur. Pour cela on utilise l'vnement
BeforeSave du classeur tel que :
Pr i vat e Sub Wor kbook_Bef or eSave( ByVal SaveAsUI As Bool ean, Cancel As
Bool ean)
I f Me. Act i veSheet I s Me. Wor ksheet s( " Recapi t ul at i f " ) Then
Me. Wor ksheet s( " Donnees" ) . Act i vat e
End I f
End Sub
209
Gestion du clic droit
L'vnement BeforeRightClick se dclenche lorsque l'utilisateur fait un clic droit sur une cellule
ou sur une slection de cellule avant que le menu contextuel ne s'affiche. La dfinition est :
Pr i vat e Sub Wor ksheet _Bef or eRi ght Cl i ck( ByVal Tar get As Range, Cancel As
Bool ean)
O Target est un objet Range qui dsigne la cellule ou la slection recevant l'vnement, et Cancel
un boolen permettant d'annuler l'affichage du menu contextuel.
Gnralement, on utilise cet vnement pour restreindre ou pour ajouter des lments au menu
contextuel. Prenons l'exemple suivant qui supprime l'accs la fonction 'couper' du menu contextuel
lorsqu'on clique sur une cellule de la plage "A1:E5".
Pr i vat e Sub Wor ksheet _Bef or eRi ght Cl i ck( ByVal Tar get As Range, Cancel As
Bool ean)

I f Not Appl i cat i on. I nt er sect ( Tar get , Me. Range( " A1: E5" ) ) I s Not hi ng Then
Appl i cat i on. CommandBar s( " Cel l " ) . Cont r ol s( 1) . Vi si bl e = Fal se
El se
Appl i cat i on. CommandBar s( " Cel l " ) . Cont r ol s( 1) . Vi si bl e = Tr ue
End I f

End Sub
Outre l'exemple direct, nous trouvons un exemple classique de l'utilisation de l'argument Target
dans les vnements de feuille. Dtaillons-en un peu le principe. Gnralement l'vnement ne doit
concerner que quelques cellules et non toutes les cellules de la feuille. Pour grer cela, on cre une
plage nomme pour les cellules qui doivent grer l'vnement o on appelle directement l'objet Range
comme dans l'exemple s'il s'agit d'une plage rectangulaire. On rcupre l'intersection entre l'argument
Target et la plage cible, si cette intersection vaut Nothing, c'est qu'aucune cellule de la plage devant
lever l'vnement ne l'a reu, sinon au moins une des cellules l'a reu.
Notez aussi que l'objet Range est qualifi par le mot cl Me. En effet, le code de l'vnement est
forcment contenu dans le module objet de la feuille. Le mot cl Me fait donc rfrence la feuille ce
qui permet de l'utiliser en qualificateur de la proprit Range.
Changement de slection
L'vnement SelectionChange se produit lorsqu'au moins une nouvelle cellule est slectionne.
Cet vnement suit la dfinition :
Pr i vat e Sub Wor ksheet _Sel ect i onChange( ByVal Tar get As Range)
Cet vnement bien que trs pratique peut avoir des effets de bords nfastes dans certains cas, si
on dclenche une cascade d'vnements. Prenons l'exemple suivant :
Pr i vat e Sub Wor ksheet _Sel ect i onChange( ByVal Tar get As Range)
I f Not Appl i cat i on. I nt er sect ( Tar get , Me. Col umns( " A: J " ) ) I s Not hi ng Then
Tar get . Of f set ( 1) . Sel ect
End I f
End Sub
Ce code va entraner un dplacement rapide de la slection vers le bas de la feuille. En effet,
l'appel de la mthode Select va lever nouveau un vnement SelectionChange qui va lui-mme lever
aussi un vnement SelectionChange et ainsi de suite, c'est la cascade d'vnement. Gnralement on
peut contourner le problme en travaillant sur la gestion de l'argument Target, mais parfois on ne peut
pas. Dans ce cas on dsactive temporairement la gestion des vnements d'Excel en jouant sur la
proprit EnableEvents de l'objet Application, tel que :
Pr i vat e Sub Wor ksheet _Sel ect i onChange( ByVal Tar get As Range)
Appl i cat i on. Enabl eEvent s = Fal se
I f Not Appl i cat i on. I nt er sect ( Tar get , Me. Col umns( " A: J " ) ) I s Not hi ng Then
Tar get . Of f set ( 1) . Sel ect
End I f
Appl i cat i on. Enabl eEvent s = Tr ue
End Sub
210
Changement de valeur
L'vnement Change, souvent confondu avec l'vnement prcdent, se produit lorsque la valeur
d'une cellule change. Suit la dfinition :
Pr i vat e Sub Wor ksheet _Change( ByVal Tar get As Range)
L'vnement est lev aprs le changement de la valeur, il n'est pas possible de restaurer
simplement la valeur prcdente de la cellule. Tout comme le prcdent, cet vnement est susceptible
de dclencher assez aisment des vnements en cascade, on vite donc gnralement d'affecter une
valeur aux cellules de l'argument Target au sein de cet vnement.
211
Manipuler les contrles
Pour finir ce cours dj assez long, nous allons traiter assez succinctement de la manipulation des
contrles et des formulaires. On appelle contrle des lments graphiques ayant leur propre code de
fonctionnement qui s'intgre aux lments Excel. Il existe plusieurs milliers de contrles intgrables
dans Excel, puisque tous les contrles ActiveX le sont, mais nous ne traiterons que des contrles
proposs par dfaut par Excel.
Deux familles de contrles
Historiquement, Excel possdait un jeu de contrles spcifiques permettant de faire des
formulaires simplifis. Pour des raisons de compatibilit ascendante, ces contrles sont toujours
disponibles, mme si une partie de leur documentation n'est plus accessible. Microsoft recommande de
privilgier l'utilisation des contrles ActiveX, cependant les contrles formulaires restent bien adapts
et assez simple d'utilisation dans quelques cas.
Les contrles formulaires
Si vous n'avez jamais utilis les contrles formulaires, vous pouvez sauter cette partie.


Les contrles formulaires sont accessibles au travers de la collection Shapes. Certains comme les
zones d'dition ou les zones combines ont t rendus inaccessibles pour les nouveaux classeurs.
Cependant il reste quatre contrles encore utiliss de temps en temps.
Le contrle bouton.
La case cocher
La case d'option
La zone combine droulante
Avantages
Il faut bien reconnatre qu'ils n'en ont pas beaucoup. Il n'y a rien qu'on puisse faire avec ces
contrles qu'on ne puisse pas obtenir avec leurs homologues Ms-Forms si ce n'est une certaine
simplicit de liaison avec les donnes de la feuille.
En effet, leur logique d'utilisation est un peu diffrente de celle des contrles ActiveX. Comme il
s'agit de contrles 'purement' Excel, ils trouvent leurs donnes de fonctionnement dans Excel
obligatoirement et gnralement dans le classeur qui les contient.
Le contrle bouton lui garde un avantage certain, il est possible de lui affecter n'importe quelle
procdure publique comme vnement Clic. De fait, il n'est pas obligatoire de grer un code
vnementiel spcifique, lui attribuer une procdure comme proprit OnAction suffit.
Ces contrles sont encore utiliss parce que quand on les connat bien, ils sont assez simples
manipuler.
Inconvnients
Ils sont nettement moins faciles (encore que) manipuler par le code et assez peu configurables.
A part cela il n'y a pas grand-chose leur reprocher.
Exemples
Je vous disais plus haut qu'ils sont assez difficiles manipuler. Comme toujours, tout dpend de
comment on s'y prend. Sur bien des aspects, ils sont aussi simples grer que les contrles ActiveX.
La difficult apparente vient de la mthode employer pour obtenir une rfrence sur le contrle
manipuler et de trouver ses proprits spcifiques.
212
L'erreur vient souvent du fait qu'on tente d'accder l'objet au travers de la collection Shapes. En
effet, ils sont de type gnrique Shape.
On y accde donc en crivant
Feui l l e. Shapes( Nomcont r l e" )
Seulement cela renvoie un objet Shape qui ne prsente pas aisment les proprits intressantes de
nos contrles. En fait, les contrles formulaires incorpors sont exposs travers plusieurs collections
spcifiques de l'objet Worksheet. Dans le cas qui nous intresse, il s'agit des collections, Buttons,
CheckBoxes, OptionButtons et DropDowns.
Elles se manipulent comme toutes les collections ce qui simplifie normment la programmation.
Le code suivant va mettre en place un formulaire.
Publ i c Sub Cal cul er ( )
Thi sWor kbook. Wor ksheet s( " Recapi t ul at i f " ) . Cal cul at e
End Sub

Publ i c Sub Const r uct For m( )
ul at i f " )
' aj out e un bout on de cal cul
Di mFeui l l e As Wor ksheet , r ngPos As Range, r ngVal As Range
Di mzl i st As Dr opDown, compt eur As Long, Opt As Opt i onBut t on

Set Feui l l e = Thi sWor kbook. Wor ksheet s( " Recapi t
Set r ngPos = Feui l l e. Cel l s( 1, 1)
' aj out du bout on
Wi t h Feui l l e. But t ons. Add( r ngPos. Lef t , r ngPos. Top, r ngPos. Resi ze( ,
2) . Wi dt h, r ngPos. Hei ght )
. Capt i on = " Cal cul er mai nt enant "
. OnAct i on = " Cal cul er "
End Wi t h
' aj out d' une case cocher
Set r ngPos = r ngPos. Of f set ( 2)
Set r ngVal = Feui l l e. Range( " F1" )
Feui l l e. CheckBoxes. Add r ngPos. Lef t , r ngPos. Top, r ngPos. Wi dt h,
r ngPos. Hei ght
Wi t h Feui l l e. CheckBoxes( 1)
. Capt i on = " J our s f er i s i ncl us"
. Di spl ay3DShadi ng = Tr ue
. Li nkedCel l = r ngVal . Addr ess( Tr ue, Tr ue, xl A1)
. Val ue = Fal se
End Wi t h
' aj out de sept bout on d' opt i on
Set r ngPos = r ngPos. Of f set ( - 2, 3)
Set r ngVal = r ngVal . Of f set ( 2)
For compt eur = 1 To 7
Set Opt = Feui l l e. Opt i onBut t ons. Add( r ngPos. Lef t , r ngPos. Top,
r ngPos. Wi dt h, r ngPos. Hei ght )
Opt . Capt i on = WeekdayName( compt eur , Fal se, vbMonday)
Opt . Li nkedCel l = r ngVal . Of f set ( compt eur - 1) . Addr ess( Tr ue, Tr ue,
xl A1)
Opt . Val ue = Fal se
Set r ngPos = r ngPos. Of f set ( 1)
Next compt eur
' aj out d' une zone de l i st e
Set r ngPos = Feui l l e. Range( " A5" )
Feui l l e. Range( " G1" ) . Val ue = " J anvi er "
Feui l l e. Range( " G2" ) . Val ue = " Fvr i er "
Feui l l e. Range( " G1: G2" ) . Aut oFi l l Dest i nat i on: =Feui l l e. Range( " G1: G12" ) ,
Type: =xl Fi l l Def aul t
Set zl i st = Feui l l e. Dr opDowns. Add( r ngPos. Lef t , r ngPos. Top,
r ngPos. Resi ze( , 2) . Wi dt h, r ngPos. Hei ght )
Wi t h zl i st
. Dr opDownLi nes = 6
213
. Li nkedCel l = r ngVal . Of f set ( 10)
. Li st Fi l l Range = " G1: G12"
End Wi t h

End Sub
Les contrles MsForms
Ce sont les contrles que l'on utilise pour les formulaires VBA. Ces contrles sont de la famille
des contrles ActiveX, c'est--dire des contrles fournis par un composant. Le composant s'appelle
MsForms, il est accessible indiffremment pour les feuilles ou pour les formulaires.
Quel que soit leur conteneur (Feuille de calcul ou UserForm), ils peuvent tre ajouts la cration
(Design Time) parfois appel ajout statique, ou l'excution (Run Time) qui est l'ajout dynamique.
Pour crer dynamiquement un contrle, il faut de toute faon connatre le nom de sa classe.
Nous ne trouverons dans ce tableau que les contrles fournis par le composant MsForms.
Contrle Classe
Bouton Forms.CommandButton.1
Zone de texte Forms.TextBox.1
Case cocher Forms.CheckBox.1
Case d'option Forms.OptionButton.1
Liste Forms.ListBox.1
Liste droulante Forms.ComboBox.1
Bouton bascule Forms.ToggleButton.1
UpDown Forms.SpinButton.1
Barre de dfilement Forms.ScrollBar.1
La manipulation des contrles est ensuite sensiblement identique, puisque ce sont de objets, on
agit donc sur les proprits et mthodes des contrles et on gre leurs vnements.
Les contrles incorpors sont des con
collection OLEObjects de l'objet Worksheet. Il n'existe pas de collection spcifique par type de
contrle similaire ce que nous avons vu prcdemment, vous devez donc passer par la collection
OLEObjects un contrle existant.
Commenon me formulaire que dans l'exemple prcdent.
Publ i c Sub Const r uct For mAct i veX( )
Contrles incorpors
trles placs sur une feuille de calcul. Ils appartiennent la
pour crer ou pour atteindre
s par recrer le m
Di mzl i st As MSFor ms. C
' aj out e un bout on de cal cul
Di mFeui l l e As Wor ksheet , r ngPos As Range, r ngVal As Range
omboBox, compt eur As Long, Opt As
MSFor ms. Opt i onBut t on

Set Feui l l e = Thi sWor kbook. Wor ksheet s( " Recapi t ul at i f " )
Set r ngPos = Feui l l e. Cel l s( 1, 1)
' aj out du bout on
Wi t h Feui l l e. OLEObj ect s. Add( Cl assType: =" For ms. CommandBut t on. 1" ,
Li nk: =Fal se _
, Di spl ayAsI con: =Fal se, Lef t : =r ngPos. Lef t , Top: =r ngPos. Top,
Wi dt h: =r ngPos. Resi ze( , 2) . Wi dt h _
, Hei ght : =r ngPos. Hei ght ) . Obj ect
. Aut oSi ze = Tr ue
. Capt i on = " Cal cul er mai nt enant "
End Wi t h
' aj out d' une case cocher
Set r ngPos = r ngPos. Of f set ( 2)
Set r ngVal = Feui l l e. Range( " F1" )
Feui l l e. OLEObj ect s. Add " For ms. CheckBox. 1" , , , , , , , r ngPos. Lef t ,
r ngPos. Top, r ngPos. Wi dt h, r ngPos. Hei ght
Wi t h Feui l l e. OLEObj ect s( Feui l l e. OLEObj ect s. Count ) . Obj ect
214
. Aut oSi ze = Tr ue
. Capt i on = " J our s f er i s i ncl us"
. Val ue = Fal se
End Wi t h
' aj out de sept bout on d' opt i on
Set r ngPos = r ngPos. Of f set ( - 2, 3)
Set r ngVal = r ngVal . Of f set ( 2)
For compt eur = 1 To 7
r ngPos. Ent i r eRow. RowHei ght = 15
Set Opt = Feui l l e. OLEObj ect s. Add( " For ms. Opt i onBut t on. 1" , , , , , ,
, r ngPos. Lef t , r ngPos. Top, r ngPos. Wi dt h, r ngPos. Hei ght ) . Obj ect
Opt . Capt i on = WeekdayName( compt eur , Fal se, vbMonday)
Opt . Val ue = Fal se
Set r ngPos = r ngPos. Of f set ( 1)
Next compt eur
' aj out d' une zone de l i st e
Set r ngPos = Feui l l e. Range( " A5" )
Set zl i st = Feui l l e. OLEObj ect s. Add( " For ms. ComboBox. 1" , , , , , , ,
r ngPos. Lef t , r ngPos. Top, r ngPos. Resi ze( , 2) . Wi dt h, r ngPos. Hei ght ) . Obj ect
Wi t h zl i st
. Li st Rows = 6
For compt eur = 1 To 12
zl i st . AddI t emMont hName( compt eur )
Next compt eur
End Wi t h

End Sub
Comme vous le voyez, l'ensemble des contrles est ajout par le biais de la mthode Add de la
collection OLEObjects. Vous noterez galement que les contrles n'utilisent plus de donnes lies sur
la feuille de calcul. Non qu'ils ne sauraient pas le faire, mais parce qu'ils n'en ont pas ncessairement
besoin. En effet, les contrles ActiveX grent leurs proprits en interne, celles-ci sont sauvegardes
lorsqu'on sauvegarde le classeur, il n'y a donc plus ncessit de les stocker dans des cellules du
classeur.
Si l'approche reste assez similaire, vous noterez que pour la gestion du bouton de commande, le
cas est nettement plus complexe. En effet, pour qu'un bouton ActiveX dclenche une action lorsqu'on
clique dessus, il faut grer son vnement clic. Or sur un contrle ajout dynamiquement, il n'est pas
ais d'ajouter dynamiquement le code de l'vnement Clic. Ceci voudrait dire qu'on devrait crire dans
le module de la feuille qui va contenir le bouton la procdure vnementielle Clic avant que le bouton
n'existe. Ceci n'a pas vraiment d'intrt. On ne gnre donc que trs rarement des contrles boutons
dynamiquement.
Pour grer un vnement de contrle ActiveX incorpors dans Excel, il faut crire le code
d'vnement dans le module de la feuille qui contient le contrle, ce qui dans notre cas donnerait un
code du type :
Pr i vat e Sub CommandBut t on1_Cl i ck( )

Cal l Cal cul er

End Sub
Il est possible de raliser des oprations relativement complexes avec des codes assez simples.
Imaginons le scnario suivant. Nous avons une srie de donne pseudo linaire, que nous pourrions
reprsenter sous la forme suivante :
215

Il faudrait pouvoir crer un systme permettant de dfinir simplement une limite haute et une
limite basse d'une zone de la courbe sur laquelle nous voudrions calculer une rgression linaire. Dit
comme cela, a l'air compliqu et pourtant c'est relativement simple faire.
Pour que les limites apparaissent sur le graphique, nous devons gnrer deux pseudos sries crant
des traits verticaux en dbut et en fin de courbe. Pour ne pas gner l'utilisateur, nous crirons les
donnes de ses sries dans des cellules situes sous le graphique afin qu'elle ne soit pas visible, et nous
les masquerons aussi dans la lgende. Comme il n'existe pas de mthode simple pour faire glisser les
limites en partant du graphique, nous allons utiliser deux contrles barre de dfilement (ScrollBar) qui
simuleront ce dplacement. Enfin nous ajouterons le calcul de rgression et un affichage de celui-ci
dans le graphique.
Publ i c Sub Regr essi on( )

Di mFeui l l e As Wor ksheet , Li mBasse As Range, Li mHaut e As Range
Di mGr aphi que As Char t , MaSer i e As Ser i es, Bar r e As MSFor ms. Scr ol l Bar
Di mGr aphe As Char t Obj ect , Af f i chage As St r i ng

Set Feui l l e = Thi sWor kbook. Wor ksheet s( " Feui l 3" )
Set Gr aphe = Feui l l e. Char t Obj ect s( 1)
Set Gr aphi que = Gr aphe. Char t
' cr e deux pl ages de deux coupl es de val eur pour l es l i mi t es
Set Li mBasse = Feui l l e. Range( " E1: F2" )
Set Li mHaut e = Feui l l e. Range( " E4: F5" )
' r cupr e l es val eur s max des axes pour i ni t i al i ser l es l i mi t es
Li mBasse. Cel l s( 1) . Val ue = Gr aphi que. Axes( xl Cat egor y) . Mi ni mumScal e
Li mBasse. Cel l s( 2) . Val ue = Gr aphi que. Axes( xl Val ue) . Mi ni mumScal e
Li mBasse. Cel l s( 3) . For mul a = " =" & Li mBasse. Cel l s( 1) . Addr ess
Li mBasse. Cel l s( 4) . Val ue = Gr aphi que. Axes( xl Val ue) . Maxi mumScal e
Li mHaut e. Cel l s( 1) . Val ue = Gr aphi que. Axes( xl Cat egor y) . Maxi mumScal e
Li mHaut e. Cel l s( 2) . Val ue = Gr aphi que. Axes( xl Val ue) . Mi ni mumScal e
Li mHaut e. Cel l s( 3) . For mul a = " =" & Li mHaut e. Cel l s( 1) . Addr ess
Li mHaut e. Cel l s( 4) . Val ue = Gr aphi que. Axes( xl Val ue) . Maxi mumScal e
' aj out e l es l i mi t es au gr aphe
Set MaSer i e = Gr aphi que. Ser i esCol l ect i on. NewSer i es
Wi t h MaSer i e
216
217
. Val ues = Li mBasse. Cel l s( 2) . Resi ze( 2)
. XVal ues = Li mBasse. Cel l s( 1) . Resi ze( 2)
. Mar ker St yl e = xl Mar ker St yl eNone
Wi t h . Bor der
. Li neSt yl e = xl Cont i nuous
. Wei ght = xl Medi um
End Wi t h
End Wi t h
Set MaSer i e = Gr aphi que. Ser i esCol l ect i on. NewSer i es
Wi t h MaSer i e
. Val ues = Li mHaut e. Cel l s( 2) . Resi ze( 2)
. XVal ues = Li mHaut e. Cel l s( 1) . Resi ze( 2)
. Mar ker St yl e = xl Mar ker St yl eNone
Wi t h . Bor der
. Li neSt yl e = xl Cont i nuous
. Wei ght = xl Medi um
End Wi t h
End Wi t h
' aj out du pr emi er cont r ol e scr ol l bar
Set Bar r e = Feui l l e. OLEObj ect s. Add( Cl assType: =" For ms. Scr ol l Bar . 1" ,
Lef t : =Gr aphe. Lef t , Top: =Gr aphe. Bot t omRi ght Cel l . Of f set ( 2) . Top,
Wi dt h: =Gr aphe. Wi dt h,
Hei ght : =Gr aphe. Bot t omRi ght Cel l . Of f set ( 2) . Hei ght ) . Obj ect
Wi t h Bar r e
. BackCol or = vbBl ue
. Mi n = Li mBasse. Cel l s( 1) . Val ue
. Max = Li mHaut e. Cel l s( 1) . Val ue
. Li nkedCel l = Li mBasse. Cel l s( 1) . Addr ess( Tr ue, Tr ue, xl A1)
End Wi t h
' aj out du second cont r ol e scr ol l bar
Set Bar r e = Feui l l e. OLEObj ect s. Add( Cl assType: =" For ms. Scr ol l Bar . 1" ,
Lef t : =Gr aphe. Lef t , Top: =Gr aphe. Bot t omRi ght Cel l . Of f set ( 4) . Top,
Wi dt h: =Gr aphe. Wi dt h,
Hei ght : =Gr aphe. Bot t omRi ght Cel l . Of f set ( 4) . Hei ght ) . Obj ect
Wi t h Bar r e
. BackCol or = vbGr een
. Mi n = Li mBasse. Cel l s( 1) . Val ue
. Max = Li mHaut e. Cel l s( 1) . Val ue
. Li nkedCel l = Li mHaut e. Cel l s( 1) . Addr ess( Tr ue, Tr ue, xl A1)
End Wi t h
' gest i on de l a r egr essi on
Wi t h Feui l l e. Range( " G1" )
. For mul aR1C1Local = " =I NDEX( L2C1: L3601C2; L1C5; 1) "
. Of f set ( 1) . For mul aR1C1Local =
" =I NDEX( DROI TEREG( DECALER( L1C2; L1C5; ; L4C5- L1C5) ; DECALER( L1C1; L1C5; ; L4C5-
L1C5) ; VRAI ; VRAI ) ; 1) "
. Of f set ( 2) . For mul aR1C1Local =
" =I NDEX( DROI TEREG( DECALER( L1C2; L1C5; ; L4C5- L1C5) ; DECALER( L1C1; L1C5; ; L4C5-
L1C5) ; VRAI ; VRAI ) ; 2) "
. Of f set ( 3) . For mul aR1C1Local = " =" " y = " " & ARRONDI ( L( - 2) C; 6) &" " x +
" " & ARRONDI ( L( - 1) C; 6) "
Af f i chage = " =" & Feui l l e. Name & " ! " & . Of f set ( 3) . Addr ess( Tr ue,
Tr ue, xl A1)
Wi t h Gr aphi que. Text Boxes. Add( 10, 10, 200, 50)
. For mul a = Af f i chage
End Wi t h
End Wi t h

End Sub
218
Il s'agit d'un code assez simple pour grer une opration qui elle est complexe. La complexit de
cet exercice rside plus dans l'criture des formules permettant d'obtenir la rgression que dans le code
en lui-mme.
UserForm
Nous n'allons ici que survoler la programmation des formulaires. Il s'agit d'un sujet extrmement
vaste que nous ne traiterons pas en dtail dans ce cours.
Parfois appeles botes de dialogue, formulaire, feuillele UserForm sert gnrer une feuille
contenant des contrles permettant gnralement d'interagir avec l'utilisateur.
Commenons donc par crer un UserForm. Ouvrez un classeur contenant des sries de donnes
que l'on souhaite tracer, dans notre cas :

Allez dans l'diteur VBA (Alt+F11). Dans le menu Insertion, cliquez sur UserForm. Vous allez
obtenir :
219

Comme vous le voyez, l'objet UserForm est une bote de dialogue vide. L'environnement de
dveloppement vous propose aussi une bote outil qui contient les contrles qu'il est possible
d'ajouter la bote de dialogue. Vous devez avoir aussi comme dans l'exemple l'affichage de la fentre
des proprits de l'objet UserForm. Si tel n'est pas le cas, faites la afficher en appuyant sur F4.
Agrandissez un peu le formulaire. Vous pouvez le faire en tirant le coin infrieur droit avec la
souris, ou en modifiant les proprits Heigth et Width.
Sur le formulaire, ajoutons un bouton. Pour faire cela, vous devez slectionner le contrle bouton
de commande dans la bote outils et le tracer sur le formulaire. Ajoutons aussi, plusieurs autres
contrles pour obtenir un formulaire qui ressemble :
220

Le contrle situ sous l'intitul 'Label3' est une zone de liste.
Nous allons commencer par modifier les textes. Pour cela il faut modifier la proprit 'Caption'
des contrles dans la fentre des proprits. Celle-ci affiche les proprits du contrle actif, il suffit
donc de slectionner le contrle pour avoir accs ses proprits. Nous voulons obtenir :

Et voila ralis notre formulaire. Pour l'instant il ne fait rien. Pour qu'il puisse interagir avec
l'utilisateur, nous allons devoir grer son code de fonctionnement, son affichage et ventuellement sa
communication.
221
UAffichage du formulaire
Pour pouvoir afficher le formulaire, nous allons donc appeler celui-ci depuis une procdure. On
dclenche l'affichage d'un formulaire en appelant la mthode Show de l'objet UserForm. Ajoutons
notre projet un module standard, et crivons le code suivant.
Publ i c Sub Tr aceCour be( )
User For m1. Show
End Sub
Cette mthode Show attend un argument facultatif nomm Modal qui est un boolen grant la
modalit.
Un formulaire Modal est un formulaire qui bloque l'excution du code appelant tant que le
formulaire est visible. Je n'irais pas plus loin dans le dtail puisque nous ne verrons pas ici la gestion
des formulaires non modaux. Si l'argument est omis, le formulaire est toujours modal.
Si vous excutez ce code, vous voyez que votre formulaire s'affiche, mais quoique vous fassiez il
ne se passe rien. Pour qu'il y ait la possibilit d'interagir, il faut crire un code d'interaction.
UGestion des vnements
Les contrles sont des lments appartenant au formulaire. Les vnements qu'ils reoivent
doivent donc tre gr dans le module de code de celui-ci. Le formulaire aussi possde ses propres
vnements. Commenons par grer l'initialisation du formulaire, c'est--dire l'vnement qui sera lev
quand le formulaire sera activ. Pour cela, retourner dans votre formulaire et appuyez sur F7 pour
afficher le module de code du formulaire. Vous devriez voir apparatre :
Opt i on Expl i ci t

Pr i vat e Sub User For m_Cl i ck( )

End Sub
Par dfaut l'environnement vous donne la dfinition de l'vnement par dfaut de l'lment actif,
dans notre cas l'vnement Click de l'objet UserForm.
Vous pouvez accder la liste des objets par la liste droulante de gauche

222
Et la liste des vnements du contrle par celle de droite :

Grons donc notre vnement Initialize. Dans cet vnement nous allons crire le code
d'initialisation.
Opt i on Expl i ci t

Pr i vat e Pl age As Range

Pr i vat e Sub User For m_I ni t i al i ze( )
Di mFeui l l e As Wor ksheet , cmpt As Long

Set Feui l l e = Thi sWor kbook. Wor ksheet s( 1)
Set Pl age = Feui l l e. UsedRange
Me. ComboBox1. St yl e = f mSt yl eDr opDownLi st
Me. Li st Box1. Mul t i Sel ect = f mMul t i Sel ect Mul t i
' r empl i l es zones de l i st e avec l es noms des sr i es
For cmpt = 1 To Pl age. Col umns. Count
Me. Li st Box1. AddI t emPl age. Cel l s( cmpt ) . Val ue
Me. ComboBox1. AddI t emPl age. Cel l s( cmpt ) . Val ue
Next cmpt
' Bl oque l a zone d' opt i on t ant que CheckBox1 n' est pas coche
Me. Fr ame1. Enabl ed = Fal se

End Sub
223
Si nous excutons notre procdure, nous allons obtenir l'affichage du formulaire comme :

Mais pour l'instant il n'est toujours pas possible d'interagir avec le formulaire. Nous devons aussi
crire les vnements suivants :
' af f i che l a zone d' opt i on quand l a case l gende est coche
Pr i vat e Sub CheckBox1_Change( )
Me. Fr ame1. Enabl ed = Me. CheckBox1. Val ue
End Sub

' gr e l e bout on annul er
Pr i vat e Sub CommandBut t on2_Cl i ck( )
Unl oad Me
End Sub

' gr e l e bout on de t r ac
Pr i vat e Sub CommandBut t on1_Cl i ck( )

Di mGr aphe As Char t , compt eur As Long
Di mPl ageX As Range, Pl ageY As Range, MaSer i e As Ser i es

For compt eur = 0 To Me. Li st Box1. Li st Count - 1
I f Me. Li st Box1. Sel ect ed( compt eur ) Then
I f Gr aphe I s Not hi ng Then
Set Gr aphe = Thi sWor kbook. Char t s. Add
Gr aphe. Char t Ar ea. Cl ear
Gr aphe. Char t Type = xl XYScat t er
End I f
Set Pl ageX = Pl age. Col umns( Me. ComboBox1. Li st I ndex + 1)
Set Pl ageY = Pl age. Col umns( compt eur + 1)
Set MaSer i e = Gr aphe. Ser i esCol l ect i on. NewSer i es
Wi t h MaSer i e
. Val ues = Pl ageY
. XVal ues = Pl ageX
224
End Wi t h
End I f
Next compt eur
I f Not Gr aphe I s Not hi ng Then
I f Len( Me. Text Box1. Text ) > 0 Then
Gr aphe. HasTi t l e = Tr ue
Gr aphe. Char t Ti t l e. Char act er s. Text = Me. Text Box1. Text
End I f
Gr aphe. HasLegend = Me. CheckBox1. Val ue
I f Gr aphe. HasLegend And Me. Opt i onBut t on2 Then
Gr aphe. Legend. Posi t i on = xl LegendPosi t i onLef t
End I f
End I f
Me. Hi de

End Sub
Nous pourrons alors l'excution remplir notre formulaire comme :

Et en cliquant sur 'Tracer' nous obtiendrons :
225

Jusque l, pas de grosse difficult. Cependant si ce formulaire fonctionne, il est autonome, c'est--
dire qu'il ne communique pas avec l'application appelante. En l'occurrence ce n'est pas gnant, mais
supposons qu'il y ait besoin de savoir si l'utilisateur tracer une courbe ou s'il a cliqu sur le bouton
'Annuler'.
Vous l'avez peut tre oubli, mais le module de code d'un UserForm est un module objet. Cela
veut dire, entre autre, qu'il est possible d'ajouter des membres son interface. Nous allons donc lui
ajouter une proprit 'Annuler' en lecture seule qui renverra Vrai si le bouton Annuler a t cliqu.
Pour crire une proprit, on utilise l'instruction Property en lieu et place de l'instruction Sub. On
doit ajouter un mot cl donnant le sans de l'action, en l'occurrence Get pour lire la proprit et Let pour
l'crire (ou Set s'il s'agit d'un objet).
Nous allons donc modifier notre code de formulaire tel que :
Pr i vat e Pl age As Range, m_Cancel As Bool ean

Publ i c Pr oper t y Get Annul er ( ) As Bool ean
Annul er = m_Cancel
End Pr oper t y

' gr e l e bout on annul er
Pr i vat e Sub CommandBut t on2_Cl i ck( )
m_Cancel = Tr ue
Me. Hi de
End Sub
Et notre code appelant ainsi :
Publ i c Sub Tr aceCour be( )

User For m1. Show
I f User For m1. Annul er = Tr ue Then
MsgBox " t r ac annul er par l ' ut i l i sat eur "
End I f
Unl oad User For m1

End Sub
Nous pourrions utiliser un code similaire pour que le code appelant envoie des informations
d'initialisation au formulaire.
226
Conclusion
Nous avons vu ensemble la base de la programmation VBA. Comme nous l'avons vu elle est assez
simple puisque le langage ne contient pas normment d'instruction. Tout repose en fait sur votre
connaissance du modle objet d'Excel et donc sur votre connaissance d'Excel.

You might also like