Professional Documents
Culture Documents
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
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