Vous êtes sur la page 1sur 479

D.

MANIEZ

Formation

Dominique Maniez

VBA

Tlchargez tous les exemples de code


sur www.dunod.com

6637326
ISBN 978-2-10-050872-3

www.dunod.com

DOMINIQUE MANIEZ
a crit et traduit une
cinquantaine douvrages
dont la plupart traitent
des technologies
Microsoft.
Dveloppeur, journaliste
et universitaire,
il prne une conception
de linformatique proche
de lutilisateur, bannit
le jargon technique et
milite pour que la chose
informatique ne soit pas
la proprit exclusive
des informaticiens.

VBA

Ce livre vous est destin si vous voulez apprendre


programmer vos propres fonctions dans les principaux logiciels de la suite Microsoft Office. Mme si
vous navez aucune exprience de la programmation
vous russirez grce cet ouvrage crire des macros
qui pourront vous viter intelligemment des heures de
travail fastidieux.
Grce une progression pdagogique qui explique
lessentiel et laisse de ct le superflu vous pourrez
rapidement matriser VBA, le langage de programmation de Microsoft Office. Par affinements successifs
vous construirez des macros de plus en plus complexes et vous pourrez ainsi assimiler en douceur les
concepts fondamentaux de VBA.
Comme la programmation sapprend en lisant des programmes, vous trouverez dans ce livre de trs nombreux exemples de code.

Formation

FORMATION

Dominique Maniez

VBA
Visual Basic pour Applications
pour Word, Excel,
PowerPoint, Access et Outlook

maniez-prelims Page I Vendredi, 26. janvier 2007 2:16 14

FORMATION

VBA

07

maniez-prelims Page II Vendredi, 26. janvier 2007 2:16 14

Vos documents longs avec Word


Ralisez efficacement vos mmoires,
romans, thses, rapports...
Dominique Maniez
192 p.
Dunod, 2007.

Programmation et algorithmique
en VBA pour Excel
Anne Brygoo, Maryse Pelletier,
Michle Soria et Sverine Dubuisson
240 p.
Dunod, 2007.

maniez-prelims Page III Vendredi, 26. janvier 2007 2:16 14

FORMATION

VBA

Dominique Maniez
Dveloppeur, journaliste et universitaire

maniez-prelims Page IV Vendredi, 26. janvier 2007 2:16 14

Toutes les marques cites dans cet ouvrage sont


des marques dposes par leurs propritaires respectifs.

Dunod, Paris, 2007


ISBN 978-2-10-050872-3

tdm.fm Page V Vendredi, 26. janvier 2007 10:03 10

Table des matires


Avant-propos . . . . . . . . . . . . . . . . . . . . . .

XIII

Partie 1
Apprendre programmer
Chapitre 1 Quest-ce que programmer ? . . . . . . . .

Plusieurs niveaux de programmation . . . . . . . . .

Les langages de programmation . . . . . . . . . . . .

La syntaxe . . . . . . . . . . . . . . . . . . . . . . .

Les phases de conception dun


La phase dtude pralable
La phase danalyse . . . .
La phase dencodage . . .
La phase de test . . . . .
La phase de production .

programme
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

8
8
9
10
10
10

Chapitre 2 Enregistrer une macro . . . . . . . . . . .

13

Lenregistreur de macros . . . . . . . . . . . . . . . .
Quand devez-vous enregistrer une macro ? . . . .
Enregistrement de votre premire macro . . . . . .

14
14
15

Excuter une macro . . . . . . . . . . . . . . . . . .

17

O sont stockes les macros . . . . . . . . . . . . . .

18

Comment assigner un raccourci clavier


une macro ? . . . . . . . . . . . . . . . . . . . . . .

21

Comment associer une icne une macro ? . . . . . .

23

Conseils pour lenregistrement des macros . . . . . .

26

tdm.fm Page VI Vendredi, 26. janvier 2007 10:03 10

VI

Formation VBA

Le choix du nom des macros . . . . . . . . . . . . . .


Les limitations de lenregistreur de macros . . . . .

27
29

Enregistrement dune macro avec Excel . . . . . . . .

32

Chapitre 3 Modifier le code des macros . . . . . . . .

37

Voir le code de la macro . . . . . . . . . . . . . . . .

38

Modifier le code de la macro

47

. . . . . . . . . . . . .

Partie 2
Le langage VBA
Chapitre 4 Syntaxe de VBA

. . . . . . . . . . . . .

55

Historique de VBA . . . . . . . . . . . . . . . . . . .

55

Diffrences entre Visual Basic et VBA . . . . . . . .

56

Syntaxe de VBA . . . . . . . . . . . . . . . . . . . .

57

Variables . . . . . . . . . . . . . . . . . . . . . . . .

58

Constantes . . . . . . . . . . . . . . . . . . . . . . .

63

Oprateurs . . . . . . . . . . . . . . . . . . . . . . .

65

Mots cls . . . . . . . . . . . . . . . . . . . . . . . .
Instructions . . . . . . . . . . . . . . . . . . . .

68
70

Chapitre 5 Variables et tableaux . . . . . . . . . . .

73

Types de donnes . . . . . . . .
Les dates . . . . . . . . .
Les caractres . . . . . . .
Les nombres . . . . . . . .
Le type de donnes Variant
Les erreurs de type . . . . .
Les expressions . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

73
76
79
80
82
82
83

Visibilit des variables . . . . . . . . . . . . . . . . .

85

Tableaux . . . . . . . . . . . . . . . . . . . . . . . .

88

tdm.fm Page VII Vendredi, 26. janvier 2007 10:03 10

VII

Table des matires

Chapitre 6 Tests conditionnels . . . . . . . . . . . .


Les tests conditionnels . . . . . . . . . .
If Then Else . . . . . . . . . . . . .
Traiter plus de deux choix . . . . . .
Oprateur logique dans une condition

. . . . . .
. . . . . .
. . . . . .
. . . . .

91
92
94
96

Imbriquer des tests conditionnels . . . . . . . . . . .

97

Select Case . . . . . . . . . . . . . . . . . . . . . . .

99

Chapitre 7 Boucles . . . . . . . . . . . . . . . . . .

103

For Next . . . . . . . . . . . . . . . . . . . . . . . .
Sortir de la boucle . . . . . . . . . . . . . . . . .

103
109

While Wend . . . . . . . . . . . . . . . . . . . . . .

111

Do Loop . . . . . . .
Expression logique
Null . . . . . . .
Empty . . . . . .

.
.
.
.

114
116
117
118

Gare aux boucles infinies . . . . . . . . . . . . . . .

119

Diffrences entre While et Until . . . . . . . . . . .

121

Chapitre 8 Procdures et fonctions . . . . . . . . . .

125

Procdures et fonctions

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

91

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

. . . . . . . . . . . . . . . .

Syntaxe dune fonction . . . . . . . . . .


MsgBox en dtail . . . . . . . . . . .
Fonctions de Visual Basic par catgorie
crire ses propres fonctions . . . . . .
Les paramtres facultatifs . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

126

.
.
.
.
.

127
132
145
161
166

Chapitre 9 Objets . . . . . . . . . . . . . . . . . . .

171

Dfinition dun objet . . . . . . . . . . . . . . . . . .

172

Partie 3
Modles dobjets

tdm.fm Page VIII Vendredi, 26. janvier 2007 10:03 10

VIII

Formation VBA

Objets dans Office . . . . . . . . . . . . . . . . . . .

173

Un objet en situation . . . . . . . . . . . . . . . . .

174

crire des fonctions pour manipuler des objets . . . .

185

Lexplorateur dobjets

. . . . . . . . . . . . . . . . .

186

Autres modles dobjets . . . . . . . . . . . . . . . .

188

Chapitre 10 Programmer Word . . . . . . . . . . . .

191

Objet Application . . . . . . . . . . . . . . . . . . .

192

Objet Document . . . . . . . . . . . . . . . . . . . .

196

Objet Range . . . . . . . . . . . . . . . . . . . . . .

199

Objet Selection . . . . . . . . . . . . . . . . . . . . .

203

Mise en pratique . . . . . . . . . . . . . . . . . . . .

207

Pilotage dune application Office partir


dune autre application . . . . . . . . . . . . . . . . .

211

Chapitre 11 Programmer Excel . . . . . . . . . . . .

217

Objet Application . . . . . . . . . . . . . . . . . . .

217

Objet Workbook . . . . . . . . . . . . . . . . . . . .

223

Objet Worksheet . . . . . . . . . . . . . . . . . . . .

225

Objet Range . . . . . . . . . . . . . . . . . . . . . .

227

Mise en pratique . . . . . . . . . . . . . . . . . . . .

233

Chapitre 12 Programmer Access . . . . . . . . . . .

237

Collections dAccess . . . . . . . . . . . . . . . . . .

238

Objets dAccess . . . . . . . . . . . . . . . . . . . . .

239

Objet DoCmd . . . . . . . . . . . . . . . . . . . . .

241

Objet Form . . . . . . . . . . . . . . . . . . . . . . .

245

Mise en pratique . . . . . . . . . . . . . . . . . . . .
Apparition et remplissage dune liste
par programmation . . . . . . . . . . . . . . . .
Remplir un champ automatiquement . . . . . . . .

250
251
255

tdm.fm Page IX Vendredi, 26. janvier 2007 10:03 10

IX

Table des matires

Chapitre 13 ADO

. . . . . . . . . . . . . . . . . .

257

Installation dADO . . . . . . . . . . . . . . . . . . .

258

Objets dADO . . . . . . . . . . . . . . . . . . . . .

259

Objet Connection . . . . . . . . . . . . . . . . . . .

261

Objet Recordset . . . . . . . . . . . . . . . . . . . .

263

Mise en pratique . . . . . . . . . . . . . .
Exemples Access . . . . . . . . . . . .
Exemple Word . . . . . . . . . . . . .
Exemple Excel . . . . . . . . . . . . .
Exemples dutilisation dun fichier MDB
sans Access . . . . . . . . . . . . . .

.
.
.
.

265
265
269
272

. . . . . .

274

. . . . . . . . . .

283

Modle dobjets . . . . . . . . . . . . . . . . . . . . .

283

Objet MailItem . . . . . . . . . . . . . . . . . . . . .

285

Objet MAPIFolder . . . . . . . . . . . . . . . . . . .
Accs un sous-dossier partir
de la Bote de rception . . . . . . . . . . . . . .

287
289

Mise en pratique . . . . . . . . . . . . . .
Envoyer un message partir dune BD
Analyser tous les messages entrants . .
Exporter les messages dans une BD . .
Exporter les contacts dans une BD . .

.
.
.
.
.

291
292
293
294
296

Chapitre 15 Programmer PowerPoint . . . . . . . . .

299

Objet Application . . . . . . . . . . . . . . . . . . .

301

Collection Presentations . . . . . . . . . . . . . . . .

303

Collection Slides . . . . . . . . . . . . . . . . . . . .

310

Collection Shapes . . . . . . . . . . . . . . . . . . .

315

Numros et numrations . . . . . . . . . . . . . . .

319

Mise en pratique . . . . . . . . . . . . . . . . . . . .

324

Chapitre 14 Programmer Outlook

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

tdm.fm Page X Vendredi, 26. janvier 2007 10:03 10

Formation VBA

Chapitre 16 XML . . . . . . . . . . . . . . . . . . .

329

Introduction . . . . . . . . . . . . . . . . . . . . . .

329

De SGML XML en passant par HTML


Histoire d'une norme . . . . . . . .
Description de SGML . . . . . . . .
Objectif de SGML . . . . . . . . . .
Une DTD particulire : HTML . . .
Description de XML . . . . . . . . .
Objectifs de XML . . . . . . . . . .

.
.
.
.
.
.
.

330
331
332
333
334
337
337

XML en action . . . . . . . . . . . . . . . . . . . . .

339

Le nouveau format des fichiers Office 2007 . . . . . .

343

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

Partie 4
Programmation VBA avance
Chapitre 17 Crer des formulaires . . . . . . . . . .

349

Exemple de UserForm pas pas . . . . . . . . . . . .

350

Mise en pratique . . . . . . . . . . . . . . . . . . . .
Cration du UserForm . . . . . . . . . . . . . .

364
368

Chapitre 18 Grer des fichiers texte

. . . . . . . . .

375

Objet FileSystemObject . . . . . . . . . . . . . . . .

376

Objet TextStream . . . . . . . . . . . . . . . . . . .

377

Mise en pratique . . . . . . . . . . . . . . . . . . . .
Conversion de fichiers au format Vcard . . . . . .
Crateur de fichiers batch . . . . . . . . . . . . .

381
381
384

Chapitre 19 Programmer les API . . . . . . . . . . .

387

Concept dAPI . . . . . . . . . . . . . . . . . . . . .

388

Declare . . . . . . . . . . . . . . . . . . . . . . . . .

389

Appel de fonction API . . . . . . . . . . . . . . . . .

390

tdm.fm Page XI Vendredi, 26. janvier 2007 10:03 10

XI

Table des matires

Mise en pratique . . . . . . . . . . . . . . .
Lecture dun fichier WAV . . . . . . . .
Lecture dun fichier Midi . . . . . . . .
Rcuprer des informations
sur la configuration vido . . . . . . . .
Macro globale de recherche-remplacement

. . . . .
. . . . .
. . . . .

391
391
392

. . . . .
. . . . .

393
395

Chapitre 20 Dboguer un programme . . . . . . . . .

401

Erreurs de programmation
Erreurs de syntaxe . .
Erreurs dexcution .
Erreurs de logique . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

401
402
404
410

Dbogage . . . . . . . . . . . . . . . . . . . . . . . .

410

Dbogueur . . . . . . . . . . . . . . . . . . .
Lancement du dbogueur . . . . . . . . .
Fonctionnement du dbogueur . . . . . . .
Visualisation des variables dans le dbogueur

.
.
.
.

413
413
414
420

Gestion des erreurs . . . . . . . . . . . . . . . . . . .

421

Chapitre 21 Aller plus loin . . . . . . . . . . . . . .

425

Organiser les macros . . . . . . . . . . . . . . . . . .

425

Prendre de bonnes habitudes

. . . . . . . . . . . . .

427

Se documenter . . . . . . . . . . . . . . . . . . . . .

430

Index . . . . . . . . . . . . . . . . . . . . . . . . . .

437

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

tdm.fm Page XII Vendredi, 26. janvier 2007 10:03 10

Intro.fm Page XIII Vendredi, 26. janvier 2007 10:02 10

Avant-propos
Jutilise le traitement de texte Word depuis sa deuxime version
sous DOS, ce qui signifie quentre les versions en mode texte et les
versions sous Windows, jai connu une bonne dizaine de versions
diffrentes. Jai toujours t fascin par la puissance de cet outil avec
lequel je travaille quasi quotidiennement. Jai aussi trs vite dcouvert que la puissance intrinsque de Word pouvait tre dcuple par
lutilisation dun mini-langage, baptis lpoque, macro-commandes. Il ntait pas rare de constater que quelques macro-commandes
dune quinzaine de lignes pouvaient conomiser des heures de travail pnible. Lcriture de ces petits bouts de programme ncessitait
parfois du temps mais on avait toujours la sensation, une fois la
macro-commande finalise, davoir travaill plus intelligemment
que si lon avait d raliser la tche accomplir manuellement. En
fait, la plupart des utilisateurs de Word sont tellement absorbs par
leur travail dcriture quils ngligent totalement de lire la documentation du produit et passent ct des fonctions les plus puissantes de ce traitement de texte. Le mme constat sapplique bien
videmment Excel, ainsi quaux autres applications de la suite
Office.
En rdigeant ce livre, jai voulu dmontrer tous les utilisateurs
dOffice quils se privent inutilement de la richesse fonctionnelle de
leur traitement de texte, de leur tableur ou de leur base de donnes en
ignorant la programmation. En vous apprenant programmer Word,
Excel, Access, Outlook et PowerPoint, je souhaite premirement
vous montrer que cette activit nest pas rserve aux professionnels
de linformatique et, deuximement, vous faire gagner du temps dans
lexcution des tches rptitives et fastidieuses.

Intro.fm Page XIV Vendredi, 26. janvier 2007 10:02 10

XIV

Formation VBA

QUI SADRESSE CE LIVRE ?


Cet ouvrage est un livre dinitiation et il ne ncessite donc aucune
connaissance pralable en programmation ; il vise par consquent
un public de dbutants. Il sadresse dabord aux utilisateurs de la
suite Office qui souhaitent aborder lapprentissage de la programmation afin damliorer leur productivit. Les personnes utilisant
Office et possdant dj une exprience de programmeur peuvent
galement profiter de ce livre en faisant lconomie de la lecture des
chapitres consacrs aux rudiments de la programmation. Cet
ouvrage nest pas un ouvrage de rfrence en ce sens o il ne prtend
absolument pas lexhaustivit ; de nombreuses informations sont
sciemment passes sous silence afin de clarifier le propos et de ne pas
semer la confusion dans lesprit du lecteur par un apport trop important de connaissances nouvelles ( titre dinformation, louvrage
intitul Microsoft Word 2000 Language Reference comporte prs de
1 500 pages...).
La dmarche pdagogique mise en uvre dans ce livre est similaire
la mthode de programmation qui procde par raffinements successifs ; cette mthode reprend en fait un principe cartsien qui stipule
quil faut commencer par les objets les plus simples et les plus aiss
connatre, pour monter peu peu comme par degrs jusqu la connaissance des plus composs . La dernire partie de cet ouvrage proposera, ceux qui le souhaitent, des pistes pour quils puissent
approfondir les sujets abords dans ces pages ou bien explorer dautres
horizons plus complexes de la programmation sous Office.

POURQUOI APPRENDRE PROGRAMMER


OFFICE ?
Il peut paratre tonnant de se poser une telle question dans un
ouvrage dinitiation la programmation Office. En effet, les gens qui
souhaitent sinitier une discipline particulire connaissent en
gnral trs bien leurs motivations. Pourtant, il existe tellement de
malentendus au sujet de la programmation que jai souhait clarifier
certains points et galement tordre le cou des ides reues qui sont
fort rpandues. Je pense galement que de nombreuses personnes

Intro.fm Page XV Vendredi, 26. janvier 2007 10:02 10

Avant-propos

XV

nosent pas saventurer dans lapprentissage de la programmation par


peur de ne pas y arriver. Dans cet avant-propos, je souhaite dculpabiliser tous ceux qui en ont envie, mais qui nosent pas sauter le pas.
Quest-ce qui peut bien pousser un utilisateur de micro-ordinateur
se lancer dans lapprentissage de la programmation ? Je vais ici faire
un tour dhorizon de toutes les raisons qui peuvent influencer
quelquun vouloir sinitier VBA qui est le langage de programmation dOffice. Quand jaurai termin linventaire de tous ces motifs,
vous constaterez quils sont tellement nombreux quil ny a vraiment
aucune raison valable de sen priver.
La premire raison est dordre intellectuel. Apprendre programmer, cest devenir acteur du processus informatique. Quand on programme, on est moins passif devant sa machine et on acquiert une
meilleure connaissance du fonctionnement matriel et logiciel de
lordinateur. En mme temps, on acquiert certains types de raisonnements logiques qui peuvent servir dans dautres domaines que celui de
la programmation.
La deuxime raison est culturelle. Quand vous voulez comprendre
la culture dun pays tranger, il est ncessaire de connatre les rudiments de la langue parle par les autochtones. Il en va de mme pour
linformatique : vous devez apprendre un langage de programmation
pour mieux comprendre la culture informatique qui, au fil du temps, a
pntr tous les secteurs de la socit.
La troisime raison est sociale. Aujourdhui, linformatisation de la
socit est pousse lextrme et cest finalement un enjeu social que
de comprendre comment les programmes fonctionnent. Nous sommes un certain nombre penser que la chose informatique ne doit pas
tre lapanage des informaticiens. En apprenant un langage de programmation, vous empitez sur le territoire des informaticiens et vous
vous attaquez ainsi leur toute puissance, ce qui est dmocratiquement sain car il est anormal quune caste dindividus ait autant de
pouvoirs sans rendre de comptes personne.
La quatrime raison est productiviste. La programmation, mme
un niveau peu lev, va vous permettre de gagner un temps prcieux,
surtout si vous accomplissez des tches rptitives. En effet, lautomatisation des tches va augmenter votre productivit, parfois dans des

Intro.fm Page XVI Vendredi, 26. janvier 2007 10:02 10

XVI

Formation VBA

proportions que vous nimaginez mme pas. Outre le gain de temps,


vous allez galement vous affranchir des tches pnibles et pouvoir
ainsi vous consacrer des tches plus nobles. Au final, vous constaterez que lamlioration est non seulement quantitative, mais galement
qualitative.
La dernire raison est quen programmant vous allez pouvoir bnficier dun logiciel sur mesure car vous allez crer tout ce qui vous
manque. Les possibilits de paramtrage dOffice sont dj importantes, mais en programmant, vous allez contrler exactement les traitements de votre systme dinformation. Apprendre programmer
ouvre des horizons quasiment infinis et il est bien difficile dtre
exhaustif si on veut inventorier toutes les applications pratiques.
Nous nous contenterons ici de quelques exemples. En matrisant les
rudiments de la programmation, vous allez dj pouvoir inventer des
commandes et des fonctions qui nexistent pas dans le logiciel (par
exemple des fonctions dExcel qui vous manquent).
Vous allez pouvoir galement contrler la validit des informations
qui sont saisies dans Word, Excel ou Access. Dans tous ces logiciels, il
est extrmement facile de saisir des donnes mais ds que lon veut
exercer un contrle minimal sur les informations qui sont saisies, il
faut avoir recours la programmation. Et si on rflchit bien, on
saperoit quil est inutile de traiter des donnes par de savants calculs
si on na pas pris la prcaution de sassurer de la validit de ces informations.
De la mme manire, si vous dveloppez des modles qui doivent
tre utiliss par dautres, la programmation vous aidera dfinir des
crans daide spcifiques ou bien des formulaires de saisie personnaliss qui faciliteront la tche de ceux qui doivent entrer les informations.
Enfin, et cest ce qui est sans doute le plus simple, vous automatiserez tous les traitements rptitifs. Cest dailleurs souvent dans lautomatisation des tches banales que la programmation se rvle dune
efficacit maximale, et lapprenti programmeur est toujours tonn du
gain de productivit fantastique que peuvent lui procurer quelques
lignes de code.

Intro.fm Page XVII Vendredi, 26. janvier 2007 10:02 10

XVII

Avant-propos

Ainsi, aprs avoir lu cet ouvrage :

vous aurez une bonne ide de ce quest la programmation ;


vous matriserez les concepts de base de la programmation ;
vous saurez crire de petits programmes sous Office ;
vous aurez tordu le cou des mythes encore vivaces ;
vous pourrez vous lancer dans lapprentissage dun langage de programmation plus puissant.

Importance des exemples de code


Il est impossible de concevoir un ouvrage traitant de la programmation
Office sans de nombreux exemples de code car, si lon apprend programmer en programmant, on tudie galement la programmation en
examinant le code de programmes crits par dautres. Imprimer le
code de tous les exemples au sein de cet ouvrage ne serait gure raisonnable car cela prendrait une place considrable ; il est dautre part
prouv que la recopie dun listing imprim engendre de nombreuses
erreurs de retranscriptions. Cest pour cette raison que ne sont imprims dans ce livre que de courts exemples ou bien des extraits de programmes plus longs. Cependant, il faudra absolument que vous vous
procuriez la totalit des exemples de code de cet ouvrage qui sont disponibles sur Internet sur le site des ditions Dunod ladresse suivante :
www.dunod.com
ou bien sur mon site personnel (dans la rubrique Code des ouvrages)
ladresse suivante :
www.cosi.fr

UN OUVRAGE VRAIMENT CONU


POUR LES DBUTANTS
Cest peut-tre parce que je narrivais pas trouver les livres que
javais envie de lire que je me suis mis en crire. Cela ne veut pas
dire que mes livres sont meilleurs que les autres, mais tout simplement quils correspondent mieux ce que je recherche.
Quand jai commenc apprendre programmer, il y a de cela une
vingtaine dannes, jai dvor des dizaines de livres sur le sujet.
Mme aujourdhui, quand japprends un nouveau langage de program-

Intro.fm Page XVIII Vendredi, 26. janvier 2007 10:02 10

XVIII

Formation VBA

mation, je lis des ouvrages de programmation. Aprs toutes ces annes


passes lire cette littrature technique sur la programmation, je suis
arriv la conclusion quil nexistait pas vritablement douvrage
conu pour les dbutants qui ny connaissent rien du tout. Les livres
de programmation sont avant tout conus pour les informaticiens ;
cette dmarche peut se comprendre dans la mesure o la plupart des
informaticiens programment, mais comme notre credo est que tout le
monde peut programmer et que la programmation ne doit surtout pas
tre rserve aux informaticiens, il existe un vritable problme pour
les lecteurs qui ne sont pas informaticiens, mais qui souhaitent nanmoins sinitier la programmation. Ce livre a donc pour but de
sadresser aux gens qui ny connaissent vraiment rien et qui veulent
dcouvrir les joies (et les peines) de la programmation avec Office.
Cet objectif implique que la pdagogie mise en uvre dans cet
ouvrage prenne vritablement en compte le caractre nophyte du
lecteur. Je ne prendrai quun seul exemple qui illustre bien cette diffrence de traitement pdagogique ; dans les livres de programmation, il
est ncessaire dapprendre la syntaxe (cest--dire la grammaire) du
langage de programmation tudi. En gnral, tous les livres commencent par dcrire la syntaxe formelle, puis prennent des exemples.
Nous sommes persuads que cette mthode ne fonctionne pas avec
des dbutants qui ne sont pas habitus au formalisme de la description
de la syntaxe du langage. Nous pensons au contraire quil faut commencer par les exemples et ventuellement passer au formalisme aprs
avoir tudi de nombreux exemples.

POURQUOI APPRENDRE LA PROGRAMMATION


DE CINQ LOGICIELS EN MME TEMPS ?
Dans les premires versions dOffice, chaque logiciel de la suite avait
son propre langage et les langages de programmation taient donc
incompatibles entre eux ; ainsi, par exemple, Word Basic ntait pas
compatible avec Access Basic. Avec lavnement dOffice 2000,
Microsoft a ralis un effort considrable dharmonisation et dsormais, VBA (Visual Basic pour Applications) est lunique langage de
programmation de la suite. Ce qui signifie que quand japprends
programmer Word, je sais programmer la fois Excel, Access, Out-

Intro.fm Page XIX Vendredi, 26. janvier 2007 10:02 10

Avant-propos

XIX

look et PowerPoint. Lunicit de ce langage est un progrs norme et


cest pour cette raison quil serait dommage de se limiter lapprentissage de la programmation dun seul logiciel quand il est si facile de
passer dun logiciel lautre.
Lapprentissage de VBA reprsente donc un trs bon investissement car, si vous nutilisez, par exemple, que Word et Excel, vous
pourrez trs facilement apprendre la programmation Access tant
donn que le langage est rigoureusement le mme. Le fait quOffice
propose un mme langage pour toutes ses applications est rellement
un avantage dterminant et nous pensons quil va inciter plus dun
utilisateur se lancer dans laventure de lapprentissage de la programmation VBA.

COMMENT APPRENDRE A PROGRAMMER


OFFICE ?
Au risque de rappeler une vidence, pour apprendre programmer
Office, il faut dj apprendre Office. Cette vrit premire mrite
dtre rpte tant on a vu dutilisateurs se lancer dans lapprentissage de la programmation sans matriser les fonctionnalits lmentaires de Word (comme par exemple, les styles, les modles ou bien
encore les tableaux), dExcel (criture dune formule, adresse relative ou absolue, etc.) ou dAccess (cration de tables, de requtes ou
de formulaires). Si vous pensez que vos connaissances dOffice sont
imparfaites, il faudra donc les approfondir et nous vous conseillons
pour ce faire la lecture des ouvrages consacrs aux applications de la
suite Office, la collection Au quotidien chez Microsoft Press
constituant un bon point de dpart.
Une fois que ces connaissances sont acquises, il faut apprendre le
langage de programmation VBA et le modle dobjets des applications Office. Nous emploierons ici souvent lanalogie avec lapprentissage des langues vivantes et lambition de ce livre est donc de vous
enseigner la syntaxe (le langage VBA) et le vocabulaire (le modle
dobjets) de chacun des logiciels de la suite afin que vous puissiez
crire vous-mme rapidement des programmes.

Intro.fm Page XX Vendredi, 26. janvier 2007 10:02 10

XX

Formation VBA

Il existe cependant une difficult importante quand on veut


apprendre une langue trangre : par o commencer ? La tche semble
immense (elle lest rellement) et la logique voudrait quavant de
sexprimer on commence par matriser la grammaire et le lexique.
Mais cette approche pdagogique est bien peu efficace et chacun
dentre nous se rend bien compte que lon apprend une langue en la
pratiquant, la thorie ne pouvant venir que dans un deuxime temps.
Nous allons donc apprendre programmer en programmant et nous
tudierons la thorie seulement quand nous en aurons rellement
besoin.

QUELLE VERSION DOFFICE FAUT-IL UTILISER


AVEC CE LIVRE ?
Cet ouvrage couvre le langage de programmation des versions
dOffice allant de la version 2000 la version 2007. Outre sa dnomination commerciale, chaque version dOffice comporte un
numro de version interne quil est prfrable de connatre. Le
tableau suivant tablit la correspondance entre ces deux dnominations :
Appellation commerciale

Numro de version

Office 2000

Office XP

10

Office 2003

11

Office 2007

12

Office 2007 introduit quelques diffrences notables entre les prcdentes versions dOffice du point de vue de la programmation. Ces
diffrences sont signales dans cet ouvrage par des encadrs labelliss
Nouveaut Office 2007.

Dominique MANIEZ, le 24 dcembre 2006.

Partie01.fm Page 1 Mardi, 23. janvier 2007 5:18 17

PARTIE 1

Apprendre
programmer

Partie01.fm Page 2 Mardi, 23. janvier 2007 5:18 17

Chap01.fm Page 3 Mardi, 23. janvier 2007 5:08 17

1
Quest-ce que
programmer ?
Nombreux sont ceux qui pensent que cest la connaissance de la
programmation qui fait la diffrence entre linformaticien et lutilisateur averti. Ainsi, de nombreux utilisateurs chevronns du traitement de texte craignent de se lancer dans lapprentissage de la
programmation en pensant quil sagit l dun monde qui leur est
inaccessible. Lambition de ce livre est de dmontrer quils ont tort
et que la programmation, aborde en douceur et avec pdagogie,
nest pas lapanage des professionnels de linformatique ; en effet,
lutilisateur lambda, sil matrise les bases de la logique, peut apprendre aisment programmer. Cette entreprise est la porte de tous
et cet ouvrage prtend dmythifier la programmation, en montrant
tout dabord que cette discipline de linformatique repose sur des
techniques que chacun utilise dans la vie courante. Cela signifie
que, comme Monsieur Jourdain faisait de la prose sans le savoir,
vous avez dj programm, mme si vous lignorez.
Nous dfinirons tout dabord la programmation comme lart
dcrire des programmes et nous dirons quun programme est une suite
dinstructions. Le Grand Robert donne une dfinition plus complte
que je vous livre ci-dessous :
Ensemble ordonn des oprations ncessaires et suffisantes pour obtenir un rsultat ; dispositif permettant un mcanisme d'effectuer ces
oprations.

Chap01.fm Page 4 Mardi, 23. janvier 2007 5:08 17

Chapitre 1. Quest-ce que programmer ?

Cette dfinition introduit la notion importante de rsultat ; on programme toujours un ordinateur pour aboutir un rsultat. Nous reviendrons plus loin sur cet aspect non ngligeable de la programmation.
On peut donc dire que lorsque vous crivez une suite dinstructions, vous rdigez un programme. En fait, la ralisation en squence
dune liste dordres est une opration assez banale dans la vie quotidienne et quand, par exemple, on ralise une recette de cuisine, on
excute un programme. Voici une recette facile raliser que je vous
recommande personnellement :
Gougre bourguignonne (pour 16 choux)
Verser dans une casserole 25 cl deau, 100 grammes de beurre
coup en morceaux, du sel, du poivre et une pince de noix de
muscade rpe.
Faire chauffer pour porter ce mlange bullition.
Ds que le mlange bout, retirer la casserole du feu et verser dun
seul coup 150 grammes de farine ptisserie.
Mlanger avec une spatule jusqu obtenir une pte homogne.
Attendre que la pte ne dgage plus de vapeur.
Ajouter un un quatre ufs.
Si les ufs sont trs gros, najouter que trois ufs.
Incorporer la prparation 300 grammes de gruyre rp.
Avec cette prparation, faire des choux de taille moyenne et les
dposer sur une plaque ptisserie beurre et farine.
Faire cuire 30 minutes dans un four 250.
Dans cette recette de cuisine qui est la porte de tous, on trouve
en fait une bonne partie des concepts de la programmation que nous
tudierons tout au long de cet ouvrage, comme les boucles, les tests
conditionnels et les fonctions.
Si vous ntes pas trs port sur la gastronomie et que cet exemple
ne vous dit pas grand-chose, vous avez sans doute dj ralis le montage dun meuble en kit ; cette opration sapparente galement la
ralisation dun programme informatique. Si vous commencez rflchir certaines oprations de la vie quotidienne, vous vous rendrez
alors compte quil existe de nombreuses activits o lon doit reproduire en squence toute une srie dactions afin daboutir un rsultat. Prendre son petit-djeuner le matin ou bien se laver les dents sont

Chap01.fm Page 5 Mardi, 23. janvier 2007 5:08 17

Plusieurs niveaux de programmation

en gnral des activits qui sont parfaitement codifies et que vous


accomplissez tous les jours sans vous poser de questions. Pourtant, au
sens informatique du terme, il sagit de programmes que vous excutez. Programmer consiste crire le scnario complet de ces activits
pour arriver un rsultat toujours identique ; dans le cas du petitdjeuner, le but est dingrer des aliments qui apporteront suffisamment de calories pour vous permettre de tenir le coup jusquau repas
de midi. Excuter un programme consiste effectuer les unes aprs les
autres les diffrentes instructions dun scnario qui bien videmment
dans la vie courante na pas besoin dtre crit : prendre le tube de
dentifrice, ouvrir le tube, taler la pte sur la brosse dents, refermer
le tube, etc.
Grce ces exemples extraits de la vie quotidienne, on constate
facilement que la logique et les concepts de la programmation nous
sont en fait trs proches. Il ny a donc pas lieu de redouter la programmation informatique car nous en possdons la plupart de ses
mcanismes ; les seules choses qui vont changer sont le but que lon
va assigner au programme et le langage qui va permettre de dcrire le
droulement des oprations excuter.

PLUSIEURS NIVEAUX DE PROGRAMMATION


De la mme manire quil existe des recettes plus ou moins compliques, il existe plusieurs niveaux de programmation. On peut considrer que le premier niveau de programmation dans Office consiste
ni plus, ni moins, paramtrer le logiciel afin quil rponde nos
exigences particulires. Ainsi, le simple fait de renseigner la bote de
dialogue des options de Word est une programmation basique dans
la mesure o lon va donner des instructions Word pour quil se
comporte de la manire souhaite (par exemple, afficher les codes
de champ).
Le deuxime niveau est lautomatisation de certaines tches rptitives grce la sauvegarde des oprations accomplies les unes la suite
des autres : on parle alors de macro-commandes (ou macros). Il existe
certains logiciels (notamment Word, Excel et PowerPoint) qui permettent denregistrer la squence des oprations que vous tes en

Chap01.fm Page 6 Mardi, 23. janvier 2007 5:08 17

Chapitre 1. Quest-ce que programmer ?

train de raliser et qui vous autorisent ensuite rejouer cette squence


quand vous le dsirez. Cest un peu le principe du magntoscope :
vous enregistrez et vous rejouez autant de fois que vous le voulez et
quand vous le voulez.
Le troisime niveau est lcriture de fonctions qui sont absentes du
logiciel que vous utilisez, que ce soit le systme dexploitation ou bien,
par exemple, un des logiciels de la suite Office. Imaginons que vous
ayez souvent besoin dans Excel de convertir des valeurs exprimes en
minutes en valeurs exprimes en heures ; ainsi la valeur 230 devra
tre convertie en 3 heures et 50 minutes . ma connaissance, une
telle fonction nexiste pas dans Excel et vous pouvez, laide du langage de programmation dOffice, crire votre propre fonction de conversion et faire en sorte que votre programme devienne une nouvelle
fonction intgre dExcel.
Le dernier niveau est lcriture de programmes complets prenant
en charge une tche complexe, par exemple un logiciel de facturation. Le programme prend en compte tous les aspects dune
application : linterface utilisateur (les botes de dialogue et les formulaires de saisie), les calculs et les impressions.
Un programme consiste donc en une squence dinstructions
ncessaires pour atteindre un but. Avant dcrire un programme, il
faut toujours dterminer prcisment le but atteindre et chacun
comprendra que plus lobjectif est complexe, plus le programme sera
long et difficile crire.

LES LANGAGES DE PROGRAMMATION


La recette de cuisine cite plus haut est rdige en langage naturel
(en loccurrence le franais) alors que les programmes informatiques
scrivent laide de langages de programmation. De la mme
manire que les langues vivantes sont censes obir des rgles de
grammaire, les langages de programmation suivent des rgles que
lon nomme syntaxe. Cependant, les langues naturelles tolrent
assez bien les approximations et la phrase Je kiffe grave la fille que
je sors avec sera comprise par tout le monde (pour ceux que cette
formulation ne choque pas, nous signalons, toutes fins utiles, que

Chap01.fm Page 7 Mardi, 23. janvier 2007 5:08 17

La syntaxe

lon doit dire en bon franais Je kiffe grave la fille avec qui je
sors ). En revanche, les langages informatiques sont beaucoup plus
puristes et pointilleux, si bien que la moindre omission dune virgule, dune parenthse ou bien dun point sera immdiatement sanctionne. Le caractre strict de la syntaxe dun langage informatique
est parfois mal vcu par les apprentis programmeurs ; il faut bien
comprendre que lordinateur, la diffrence dun tre humain, ne
peut pas interprter les mots qui manquent et les phrases mal construites. Larchitecture binaire dun ordinateur a pour consquence
quun programme est syntaxiquement correct ou incorrect et quil
ne peut pas y avoir de juste milieu. Un programme peut donc planter, cest--dire sarrter brutalement, parce que vous avez oubli un
point-virgule dans le code.
On appelle code ou code source, voire source, lensemble des
lignes dun programme et encoder ou coder le fait de transcrire
les actions excuter dans un langage informatique.

LA SYNTAXE
Le code dun programme est compos de phrases lmentaires appeles lignes dinstruction. Chaque ligne dinstruction doit excuter
une action comme afficher un message lcran, additionner deux
nombres, lire une valeur stocke dans un fichier, etc. Chaque langage de programmation possde sa propre syntaxe, cest--dire ses
propres rgles dcriture. Les lignes dun programme doivent tre
crites avec le vocabulaire du langage de programmation qui comprend un nombre de mots fini. Comme dans une langue naturelle, il
existe plusieurs catgories de mots (verbe, adjectif, conjonction de
coordination, etc.) dans un langage de programmation et nous
apprendrons, au fur et mesure de notre progression, ces diffrents
types de mots.
Tout comme un nonc humain, une instruction peut tre ambigu
et il convient tout prix dviter les ambiguts. Ainsi, le rsultat de
linstruction qui effectue le calcul suivant :
x=2+3*4

Chap01.fm Page 8 Mardi, 23. janvier 2007 5:08 17

Chapitre 1. Quest-ce que programmer ?

parat incertain car on ne sait pas si x vaut 20 ou 14. La simple utilisation de parenthses lvera, dans le cas prsent, lambigut.
En ralit, la plupart des langages de programmation considreront quil ny a pas dambigut dans cette formule de calcul car
loprateur de la multiplication est prioritaire sur celui de laddition. Les oprateurs mathmatiques (+, -, * et /) ont un degr de
priorit les uns par rapport aux autres qui dtermine lordre dans
lequel les oprations mathmatiques sont effectues.

LES PHASES DE CONCEPTION DUN PROGRAMME


Quel que soit le langage employ pour crire un programme, il existe
une mthodologie pour le rdiger. On a lhabitude de dcomposer
lcriture dun programme en diffrentes phases.

La phase dtude pralable


Sil fallait rsumer cette premire tape par une maxime, nous
proposerions : rflchir avant dagir ! . En effet, avant dcrire un
programme quelconque, la premire des choses faire est dteindre
son ordinateur et de rflchir. On peut notamment commencer par
se poser les questions suivantes :

Quel est lobjectif de ce programme ?


Nest-il pas plus rapide de raliser cet objectif manuellement ?
Cet objectif a-t-il rellement un intrt ?
Ce programme nexiste-t-il pas dj sous une autre forme ?
Ce programme est-il ralisable ?
La ralisation de ce programme nest-elle pas trop coteuse ?

Bien videmment, il existe de nombreux cas o vous pourrez crire


un programme sans vous poser toutes ces questions. Ainsi, quand vous
voudrez rdiger un programme trs simple pour automatiser une tche
prcise qui nest pas complexe, vous pourrez foncer bille en tte. En
revanche, ds que le projet de programmation devient un peu plus
ambitieux, il vaut vraiment mieux se poser des questions avant de
programmer. Cette manire de faire sapparente (ou devrait sapparen-

Chap01.fm Page 9 Mardi, 23. janvier 2007 5:08 17

Les phases de conception dun programme

ter) la pratique des informaticiens professionnels. En tant quamateur, vous pensez peut-tre pouvoir vous dispenser de toute cette
rigueur qui est lapanage du professionnel. Nous pensons que vous
auriez tort dagir de la sorte. On peut programmer en dilettante tout
en adoptant une dmarche professionnelle ; cela nest pas
contradictoire ! En fait, la programmation est une discipline exigeante et si lon ne respecte pas un minimum les rgles du jeu, on risque de ne pas arriver au but que lon stait assign, ce qui engendrera
dconvenues et frustrations. De trs nombreux projets informatiques
ne sont pas mens jusquau bout car on a nglig la phase de dfinition de lobjectif du logiciel. Si cette description nest pas assez complte, tout ldifice risque dtre compromis. Ne perdez jamais de vue
que lon ne programme pas pour programmer, mais toujours pour
atteindre un but. Quand un architecte dessine les plans dune maison,
il doit avoir une ide prcise de ce que souhaite son client.

La phase danalyse
Une fois que lon a lassurance que le projet de programmation est
ralisable, il faut rflchir la structuration du programme. Linformatique tant la science du traitement automatis de linformation,
un programme nest jamais quun processus de transformation
dinformations. Il convient donc dinventorier toutes les informations dont le programme a besoin au dpart et toutes les informations dont il aura besoin en sortie. Quand on possde toutes ces
donnes, il faut dcrire les algorithmes qui permettront de transformer les informations disponibles en entre afin de produire les informations disponibles en sortie.
Un algorithme est lensemble des rgles opratoires qui permettent deffectuer un traitement de donnes ; ce procd
dcrit formellement toutes les tapes dun calcul qui doit fonctionner dans tous les cas de figure.
Par exemple, lalgorithme pour trouver si un nombre entier est pair
est trs simple :
Diviser le nombre entier par 2,

Chap01.fm Page 10 Mardi, 23. janvier 2007 5:08 17

10

Chapitre 1. Quest-ce que programmer ?

Si le reste de la division est 0, le nombre est pair,


Sinon, le nombre est impair.
On peut alors dcrire tout le droulement du programme dans un
langage quasi naturel que lon appellera pseudo-code. Voici un exemple de pseudo-code qui permet dappliquer un tarif rduit pour les
mineurs :

Demander lutilisateur sa date de naissance,


Si lutilisateur a moins de 18 ans,
Diviser le prix par deux,
Sinon appliquer le prix normal.

La phase dencodage
Une fois que lanalyse est termine, il faut transcrire le pseudo-code
dans un langage de programmation. Les phases dtude et danalyse
sont indpendantes de tout langage de programmation et le choix
de ce dernier peut se faire au moment de lencodage. Plus la phase
danalyse a t pousse, plus lencodage sera simple. La plupart des
problmes de programmation proviennent dune analyse trop succincte, voire dune absence totale danalyse.

La phase de test
Quand lencodage est achev, il faut tester le programme car il est
excessivement rare quun programme, sauf sil est trs court et extrmement simple, fonctionne correctement du premier coup. Les causes derreur sont multiples et un chapitre de cet ouvrage est consacr
leur tude. Quand les tests permettent de mettre en vidence des
erreurs, il faut revenir en arrire et retourner, en fonction de la gravit de lerreur, la phase danalyse (erreur de conception) ou
dencodage (erreur de programmation).

La phase de production
Une fois que le programme parat exempt derreurs (ce nest malheureusement souvent quune illusion...), on peut envisager de le
diffuser auprs des utilisateurs.

Chap01.fm Page 11 Mardi, 23. janvier 2007 5:08 17

Les phases de conception dun programme

11

Le cycle de vie du logiciel nest pas pour autant termin car il est
fort probable que certains utilisateurs trouvent des bugs (erreurs de
programmation) qui nauront pas t dtects lors des phases de tests
ou bien que dautres utilisateurs demandent au programmeur des amliorations ou de nouvelles fonctionnalits. Il faudra alors se relancer
dans une analyse, voire repartir de zro si les modifications souhaites
sont trop importantes...

CONCLUSION
Un programme doit avoir un but bien dtermin et la programmation consistera crire les instructions permettant de raliser
un objectif. Avant de commencer programmer, il faut bien
rflchir la structure du programme et inventorier les informations qui sont manipules par le programme. Apprendre programmer, cest apprendre un langage de programmation qui est
compos dun vocabulaire (une liste de mots finie dont on peut
consulter chaque dfinition dans laide en ligne) et dune syntaxe (la manire dagencer les mots). Programmer nest pas difficile si lon a lesprit un tant soit peu logique et si lon respecte
rigoureusement la syntaxe du langage de programmation que lon
utilise, car la moindre erreur de syntaxe peut bloquer le programme.

Chap01.fm Page 12 Mardi, 23. janvier 2007 5:08 17

Chap02.fm Page 13 Mardi, 23. janvier 2007 5:29 17

2
Enregistrer une macro
La documentation de Word dfinit une macro comme une srie de
commandes et dinstructions regroupes au sein dune mme commande afin dexcuter automatiquement une tche. Pour Excel, une
macro est une srie de commandes et de fonctions stockes dans un
module Visual Basic, qui peut tre excute chaque fois quon doit
accomplir cette tche. Nous allons voir dans ce chapitre quil est
trs simple dcrire ses premires macros en utilisant lenregistreur
de macros.
Il y a une vingtaine dannes, une poque o lon abrgeait moins
les mots, Microsoft inventa pour ses logiciels Word et Multiplan le
concept de macro-commande. Il sagissait de la possibilit de mmoriser les touches frappes au clavier, les options slectionnes et les
commandes excutes afin de les rutiliser plus tard. Lutilisateur avait
donc la possibilit denregistrer une suite de commandes du logiciel
pour automatiser les actions les plus rptitives. Mais lcriture de
macro-commandes tait assez complexe et le mini langage de programmation qui accompagnait Word et Multiplan tait assez pauvre.
Aujourdhui, avec Office, les choses ont considrablement volu
et de la mme manire que lon ne parle plus de micro-informatique,
mais de micro, les macro-commandes sont devenues les macros. Lutilisateur de la suite Office dispose prsent dun langage de programmation puissant et complet dot dun environnement digne des
langages utiliss par les informaticiens professionnels.

Chap02.fm Page 14 Mardi, 23. janvier 2007 5:29 17

14

Chapitre 2. Enregistrer une macro

LENREGISTREUR DE MACROS
Word, Excel et PowerPoint disposent dun enregistreur de macros
qui, la manire dun magntophone, peut enregistrer vos actions
dans le logiciel et rejouer volont ce que vous avez excut.
Les autres logiciels de la suite Office (Access, Outlook, etc.) ne
possdent pas denregistreur de macros et le code VBA ne peut
donc pas tre gnr automatiquement. En revanche, il existe
dans Access un type dobjet nomm macro qui permet de stocker squentiellement une srie dactions accomplir ; cependant, les macros de ce type nutilisent pas le langage VBA.

Quand devez-vous enregistrer une macro ?


Chaque fois que vous ralisez une tche rptitive dans Word, dans
Excel ou dans PowerPoint, vous devez vous poser la question de
lintrt dune macro. Il nest nul besoin que la tche accomplir
soit excessivement longue ; il suffit simplement que vous laccomplissiez souvent. Si, par exemple, vous devez tous les jours imprimer
la dixime page dun document, vous pouvez enregistrer une macro
qui automatisera cette tche. Mme si le temps gagn est en loccurrence minime (une dizaine de secondes), vous devez systmatiser
cette dmarche qui vous permettra au final dconomiser un temps
apprciable. En crivant des macros, vous allez avoir le sentiment
(vridique) de travailler plus intelligemment et puis vous gagnerez
en efficacit car, quand une macro fonctionne bien, elle fonctionne
bien tout le temps, ce qui nest malheureusement pas le cas des tres
humains. Mais, ne perdez pas de vue que le but ultime des macros est
un gain de temps.
A contrario, il ne sert rien denregistrer une macro pour une
tche que vous naccomplissez quune seule fois ou de manire trs
pisodique. Mme si le fait denregistrer une macro nest pas complexe
et ne prend que quelques secondes en plus, il est inutile de le faire si
vous navez pas loccasion dexploiter la macro enregistre.

Chap02.fm Page 15 Mardi, 23. janvier 2007 5:29 17

15

Lenregistreur de macros

Si vous effectuez souvent la mme mise en forme sous Word


(par exemple, une modification de la police, un changement
de la taille de la police et une mise en gras), il est prfrable de
crer un style plutt que denregistrer une macro. Si jamais le
style dfini ne vous convient plus, une seule modification du
style suffira changer automatiquement toutes les occurrences
de ce style dans lensemble du document. En revanche, avec
une macro, il faudrait non seulement modifier la macro, mais
lexcuter nouveau sur tout le document pour chaque occurrence du style. En pareil cas, une commande de recherche et de
remplacement serait dailleurs plus efficace.

Enregistrement de votre premire macro

Dunod La photocopie non autorise est un dlit

Imaginez, par exemple, que vous deviez souvent remettre en forme


des documents Word dans lesquels lutilisateur na pas cru bon de
saisir un espace inscable avant le caractre deux-points. Pour ce
faire, une simple commande de recherche et de remplacement fait
laffaire et cette opration nest pas trs longue, mais si elle doit se
rpter souvent, elle deviendra vite fastidieuse. Nous allons voir
comment nous pouvons facilement lautomatiser grce une macro.
Pour faire lexercice, lancez Word et choisissez la commande
OutilsMacroNouvelle macro.
Une bote de dialogue semblable celle-ci apparat :

Figure 2.1 Bote de dialogue


Enregistrer une macro

Chap02.fm Page 16 Mardi, 23. janvier 2007 5:29 17

16

Chapitre 2. Enregistrer une macro

Office Dans Word 2007, vous devez, pour enregistrer des macros,
2 0 0 7 faire apparatre longlet Dveloppeur. Pour ce faire, dans les
options standard de Word, cochez la case Afficher longlet Dveloppeur dans le ruban. Une fois longlet Dveloppeur activ
(figure 2.2), cliquez sur licne Enregistrer une macro.

Figure 2.2 Onglet Dveloppeur de Word 2007

la place du nom macro1, saisissez remplacedp (nous reviendrons


plus tard sur les autres options de cette bote de dialogue) et cliquez
sur le bouton OK. Ds que vous avez valid, une petite bote de dialogue apparat :

Figure 2.3 Bote de dialogue darrt


denregistrement dune macro

Vous noterez tout dabord que le pointeur de votre souris a t


modifi et quil symbolise prsent une cassette audio. Cela signifie
que Word est prt enregistrer tous vos faits et gestes. La bote de dialogue comporte deux boutons. Celui de gauche sert arrter lenregistrement et celui de droite sert mettre en pause. Si vous cliquez sur ce
bouton, vos actions ne seront plus enregistres.
Vous pouvez donc commencer enregistrer votre macro. Pour
notre exemple, choisissez la commande EditionRemplacer (ou bien
saisissez le raccourci clavier CRTL + H). Dans le champ Rechercher,
saisissez un espace suivi du caractre deux-points et dans le champ
Remplacer, saisissez un espace inscable (CTRL + Majuscule +
Espace) suivi du caractre deux points.

Chap02.fm Page 17 Mardi, 23. janvier 2007 5:29 17

17

Excuter une macro

Figure 2.4 Enregistrement dune macro ralisant


une opration de recherche et de remplacement

Quand la saisie des caractres rechercher puis remplacer est termine, cliquez sur le bouton Remplacer tout, puis fermez la bote de
dialogue Rechercher et remplacer. Une fois que cela est ralis, cliquez sur le bouton gauche de la tlcommande de lenregistreur de
macros afin darrter la squence denregistrement.

Dunod La photocopie non autorise est un dlit

Office Dans Word 2007, pour arrter lenregistrement de la macro,


2 0 0 7 cliquez sur le bouton Arrter lenregistrement qui se trouve
sur le ruban (figure 2.5).

Figure 2.5 Arrt de lenregistrement


de la macro dans Word 2007

Notre macro est pour linstant modeste, mais nous allons lamliorer au fil de ces pages.

EXCUTER UNE MACRO


La premire des choses vrifier est de savoir si lenregistrement
sest correctement droul et si le fait de rejouer la macro produit

Chap02.fm Page 18 Mardi, 23. janvier 2007 5:29 17

18

Chapitre 2. Enregistrer une macro

bien leffet escompt. Pour ce faire, choisissez la commande


OutilsMacroMacros (notez que le raccourci clavier de cette
commande est ALT + F8) qui fait apparatre la bote de dialogue
suivante :

Figure 2.6 Bote de dialogue permettant


dexcuter les macros enregistres

Office Dans Word 2007, pour faire apparatre la liste des macros enre2 0 0 7 gistres, cliquez sur le bouton Macros qui se trouve sur le
ruban.

Si vous avez bien ralis lexercice prcdent, une macro du nom


de remplacedp doit figurer dans la liste (il est possible que dautres
macros, installes automatiquement par dautres logiciels, figurent
galement dans cette liste). Pour excuter la macro remplacedp, slectionnez son nom puis cliquez sur le bouton Excuter. Normalement, la
macro effectue lopration de recherche et de remplacement pour
laquelle elle a t prvue. Afin de voir si la macro fonctionne bien,
effectuez le test sur un document qui comprend bien des caractres
deux-points non prcds dun espace inscable.

O SONT STOCKES LES MACROS


Quand vous dmarrez lenregistreur de macros, une bote de dialogue vous demande o vous voulez enregistrer la macro :

Chap02.fm Page 19 Mardi, 23. janvier 2007 5:29 17

O sont stockes les macros

19

Figure 2.7 Dsignation de lemplacement


de stockage des macros

La liste droulante contient deux possibilits :


Tous les documents (normal.dot)
<nom du document actif> (document)

Dunod La photocopie non autorise est un dlit

Si vous choisissez loption par dfaut (stockage de la macro dans


Normal.dot), la macro sera accessible dans tous les documents Word
que vous pourrez crer par la suite. En effet, Normal.dot est ce que lon
appelle un modle global et tous les documents que vous crez dans
Word, si vous ne prcisez pas un autre modle, sont bass sur Normal.dot.
Office Le format natif des documents dans Office 2007 tant XML, le
2 0 0 7 fichier Normal.dot a pour quivalent dans Word 2007,
Normal.dotm. Ce fichier, situ normalement dans C:\Documents and
Settings\Utilisateur\Application Data\Microsoft\Templates, est une archive
ZIP compose de fichiers XML et dun fichier nomm vbaProject.bin qui
contient le code des macros.

Si vous choisissez lautre option, la macro sera enregistre dans le


document actif et vous ne pourrez lexcuter qu partir de ce document, cest--dire, seulement quand il sera ouvert.
Dans ces conditions, le choix de lemplacement des macros est
important et vous privilgierez lenregistrement dans Normal.dot
pour toutes vos macros gnriques et dans tous les autres cas, lenregistrement dans le document actif. De toutes les faons, ce choix nest
pas dfinitif et il est possible de dplacer ou de copier des macros.

Chap02.fm Page 20 Mardi, 23. janvier 2007 5:29 17

20

Chapitre 2. Enregistrer une macro

Vous pouvez galement bnficier dune troisime option pour le


choix de lemplacement des macros :
Documents bass sur <nom du modle>
En effet, si le document partir duquel vous enregistrez une macro
a t cr partir dun modle utilisateur (par exemple Brochure.dot
qui est un modle livr avec Word), vous avez la possibilit de crer
votre macro dans ce modle de telle sorte que tous les documents
crs partir de ce modle hriteront de cette macro.

Figure 2.8 Stockage dune macro dans un fichier


de modle diffrent de Normal.dot

Rappel sur les modles


Un modle est un document qui sert produire dautres documents.
Chaque document Word est bas sur un modle (un moule) ; quand
on cre un nouveau document, si on ne prcise aucun modle, le
document est bas par dfaut sur le modle intitul Normal.dot (dot
tant lextension des modles de document, le t de dot signifiant
template qui est le nom anglais pour modle). Si on veut prciser un
modle particulier, il faut utiliser la commande FichierNouveau et
choisir parmi les nombreux modles proposs par Word ou bien parmi
ceux que lon a crs.
Un modle peut contenir diffrents lments comme des styles, des
macros, des menus et des barres doutils dont hritera tout document
qui sera bas sur ce modle.
Dans Word 2007, les modles ont pour extension dotx ou bien dotm,
sils contiennent des macros.

Chap02.fm Page 21 Mardi, 23. janvier 2007 5:29 17

Comment assigner un raccourci clavier une macro ?

21

COMMENT ASSIGNER UN RACCOURCI CLAVIER


UNE MACRO ?
Nous avons vu que le fait dappuyer sur ALT + F8 faisait apparatre
la liste des macros disponibles. Il est souvent plus rapide, afin dexcuter une macro, de lui assigner un raccourci clavier. Pour ce faire,
choisissez la commande AffichageBarre doutilsPersonnaliser...
et cliquez sur le bouton Clavier... ce qui affiche lcran suivant :

Dunod La photocopie non autorise est un dlit

Figure 2.9 Assignation dun raccourci clavier une macro

Office Dans Word 2007, on atteint la bote de dialogue Personnaliser


2 0 0 7 le clavier partir des options de Word (menu Personnaliser).
Dans la liste de gauche, choisissez Macros, puis slectionnez la macro
laquelle vous voulez assigner un raccourci clavier. Cliquez enfin sur le
bouton Personnaliser.

Faites dfiler la liste Catgories pour atteindre litem Macros, puis


slectionnez dans la liste Macros situe droite la macro laquelle
vous voulez assigner un raccourci clavier.
Vous devez alors choisir un raccourci clavier : pour cela, positionnez-vous dans la zone Nouvelle touche de raccourci et saisissez un raccourci. Dans la mesure o notre macro effectue une opration de
remplacement, il serait intressant, dun point de vue mnmotechnique, de lassocier au raccourci CTRL + R. Cependant, en fonction de
la version de Word que vous utilisez, il est possible que la combinaison

Chap02.fm Page 22 Mardi, 23. janvier 2007 5:29 17

22

Chapitre 2. Enregistrer une macro

de touches soit dj attribue. Ainsi, dans Word 2007, la combinaison


CRTL + R est attribue la commande Retrait.

Figure 2.10 Le raccourci clavier est dj affect


une commande de Word

En testant dautres combinaisons de touches, vous allez vous apercevoir que de trs nombreux raccourcis sont dj programms dans
Word. Pour contourner cette difficult, vous pouvez chercher une
combinaison de touche qui nest pas attribue.

Figure 2.11 Ce raccourci clavier nest pas affect

Vous pouvez galement dcider daffecter votre macro une combinaison laquelle une commande a dj t attribue. Sil est dconseill de raffecter les commandes classiques comme CTRL + C, il
nest pas draisonnable de rattribuer une combinaison telle que
CTRL + K qui est affecte la commande InsertionLienHypertexte si
vous nutilisez jamais ce raccourci.
Vous pouvez aussi utiliser la touche ALT dans votre combinaison ;
dans notre exemple, nous dcidons dattribuer le raccourci ALT + R

Chap02.fm Page 23 Mardi, 23. janvier 2007 5:29 17

Comment associer une icne une macro ?

23

notre macro de remplacement dans la mesure o cette combinaison


nest pas attribue.
Dans la liste droulante Catgories, cliquez sur Macros puis, dans la
liste Macros, slectionnez remplacedp. Cliquez enfin sur le bouton
Attribuer.

Figure 2.12 Affectation dun raccourci clavier une macro

Dunod La photocopie non autorise est un dlit

Cliquez sur le bouton Fermer de la bote de dialogue.


prsent, quand vous appuyez, sur ALT + R, vous dclenchez
lexcution de la macro remplacedp.

COMMENT ASSOCIER UNE ICNE


UNE MACRO ?
Les interfaces tant devenues graphiques, les utilisateurs sont devenus friands de boutons divers et varis et il est dsormais possible de
dclencher une macro en cliquant sur un bouton. Pour associer
notre macro un bouton, il faut dabord excuter la commande
AffichageBarre doutilsPersonnaliser... Cliquez ensuite sur
longlet Commandes et, dans la liste droulante Catgories, choisissez Macros puis slectionnez Normal.NewMacros.remplacedp.

Chap02.fm Page 24 Mardi, 23. janvier 2007 5:29 17

24

Chapitre 2. Enregistrer une macro

Office Compte tenu de la modification en profondeur de linterface


2 0 0 7 dOffice 2007, la personnalisation de linterface fera lobjet dun
chapitre part dans cet ouvrage. Dans limmdiat, vous pouvez ajouter
une icne sur la barre doutils Accs rapide grce au menu Personnaliser
des options de Word. Choisissez la macro dans la liste de gauche et
cliquez sur le bouton Ajouter ; la macro passe alors dans la liste de droite,
intitule Personnaliser la barre doutils Accs rapide. Vous pouvez modifier licne du bouton en cliquant sur Modifier. Aprs avoir valid par
OK, licne que vous avez choisie se retrouve dans la barre doutils Accs
rapide et vous pouvez excuter la macro dun clic de souris.

Figure 2.13 Affectation dune icne une macro

Il suffit ensuite, par une simple opration de glisser-dplacer, daller


dposer la commande sur une des barres doutils de Word ce qui
donne le rsultat suivant :

Figure 2.14 Insertion dune macro


dans une barre doutils

Le rsultat graphique ntant pas trs heureux, il faut faire, immdiatement aprs lavoir dpos, un clic droit sur ce nouveau bouton
afin dafficher les options disponibles :

Chap02.fm Page 25 Mardi, 23. janvier 2007 5:29 17

Comment associer une icne une macro ?

25

Figure 2.15 Proprits de licne


de notre macro

Cest loption Texte seul pour ce bouton qui est responsable de


laffichage du texte du bouton. Si lon souhaite avoir un bouton graphique, il suffit, dans un premier temps, de choisir loption Par dfaut
qui affiche licne suivante :

Dunod La photocopie non autorise est un dlit

Figure 2.16 Icne par dfaut pour les macros Word

Si cette icne ne vous convient pas, il est possible, grce loption


Modifier limage du bouton, de choisir dans une palette de boutons
supplmentaires :

Figure 2.17 Icnes de remplacement


de licne par dfaut

Si, malgr tout, vous ne trouvez toujours pas le bouton qui vous
convient, vous pouvez vous retrousser les manches et choisir la commande Editeurs de boutons...

Chap02.fm Page 26 Mardi, 23. janvier 2007 5:29 17

26

Chapitre 2. Enregistrer une macro

Figure 2.18 Vous pouvez dessiner vous-mme


licne du bouton qui excutera la macro

Comme vous pouvez le constater, lauteur de ces lignes na pas fait


les Beaux-Arts et le rsultat nest pas toujours garanti. On trouve
cependant sur Internet de trs bonnes bibliothques dicnes...

CONSEILS POUR LENREGISTREMENT


DES MACROS
Enregistrer des macros, comme vous avez pu le voir, est extrmement simple puisquil suffit de faire ce que vous avez dj lhabitude
de faire, savoir utiliser votre logiciel ; cependant, il convient de
prendre certaines prcautions, notamment parce que lenregistreur
de macros enregistre tout. Cela signifie quil enregistrera galement
toutes les erreurs que vous commettrez. Par exemple, si vous faites
une erreur de frappe et que vous la corrigez, le code de la macro contiendra lerreur de frappe et sa correction. Cela nest pas trs grave
en soi, mais peut arriver surcharger le code de la macro si les
erreurs sont trop nombreuses et, par voie de consquence, ralentir
son excution.
Le premier conseil suivre est donc de prparer son scnario avant
lenregistrement dune macro. De la mme manire que lorsque vous
dictez votre annonce votre rpondeur enregistreur, vous avez la possibilit dcrire le texte de votre annonce au pralable, il vaut mieux
avoir une ide assez prcise de lordre de laccomplissement des

Chap02.fm Page 27 Mardi, 23. janvier 2007 5:29 17

Le choix du nom des macros

27

actions que vous souhaitez enregistrer. Dans cette perspective, il nest


peut-tre pas inutile de faire quelques rptitions avant la prise finale.
Si lenregistrement dune macro est trs long, le risque de commettre des erreurs saccrotra et il est donc judicieux de dcomposer
lenregistrement de la macro en plusieurs squences. Il sera ultrieurement facile de combiner les diffrentes parties de la macro pour nen
faire quune seule (nous verrons comment faire cela au prochain chapitre).

LE CHOIX DU NOM DES MACROS

Dunod La photocopie non autorise est un dlit

Une autre recommandation a trait au nom des macros : vous avez pu


voir que Word propose par dfaut comme nom de macro Macro1. Il
est assez difficile dimaginer un nom moins expressif que celui-ci et
vous devez donc vous empresser de le changer. En effet, quand vous
aurez crit trois macros, vous vous y retrouverez sans peine. En
revanche, quand vous en aurez cr plus dune centaine, il sera
beaucoup moins vident de faire le tri et vous avez donc tout intrt
donner vos macros des noms qui indiquent leur objet. Il existe
plusieurs cueils dans le choix du nom dune macro, comme nous
allons le voir.
Premirement, il existe des rgles de pure forme pour lattribution
dun nom une macro ; en voici une liste quasi exhaustive :
un nom ne peut pas dpasser 255 caractres ;
un nom ne doit pas commencer par un chiffre ;
un nom ne doit pas contenir les caractres tels quun espace, un
point (.), un point dexclamation (!), un point-virgule (;), un
point dinterrogation (?) ou les caractres @, &, $, #, ^, %, , +, =,
`, {, (, [, }, ), ] ou le symbole de leuro ;
Visual Basic ne faisant pas la diffrence entre les majuscules et les
minuscules, les noms de macros test et TEST seront considrs
comme quivalents. En revanche les noms ditioncouper et EditionCouper ne sont pas considrs comme quivalents.

Chap02.fm Page 28 Mardi, 23. janvier 2007 5:29 17

28

Chapitre 2. Enregistrer une macro

Dune manire gnrale, vitez les caractres sotriques dans


les noms de vos macros et limitez-vous aux chiffres, aux lettres
et la barre de soulignement. Vous pouvez cependant vous
autoriser les lettres accentues comme , , , etc.
Vous noterez galement quil existe en quelque sorte des noms
rservs car Word possde des macros prdfinies. En effet, chaque
commande que lon peut activer par un menu a un nom de macro qui
lui est dj attribu. Ainsi la commande Copier du menu Edition a
pour nom EditionCopier. Si vous enregistrez une nouvelle macro et
que vous lappelez EditionCopier (ou bien editioncopier ou bien
encore Editioncopier), le code de cette macro sera alors excut
quand vous emploierez la commande Copier du menu Edition. Ceci
est fort gnant car vous pouvez ainsi modifier totalement le comportement de Word. Il y a donc lieu dviter au maximum lemploi de tels
noms pour vos macros moins que vous ne souhaitiez redfinir les
commandes internes de Word, mais cela nest gure conseill. Vous
trouverez dans la documentation lectronique qui accompagne cet
ouvrage la liste complte des noms des macros prdfinies de Word.
Consultez cette liste quand vous nommez une macro ou bien adoptez
la convention dont nous allons parler ci-dessous.
Si vous travaillez tout seul dans votre coin, vous tes sans doute le
plus heureux des hommes (terme gnrique qui embrasse les femmes)
et vous tes donc labri dautrui ; cette hypothse est malheureusement assez rare et mme si vous tes un solipsiste forcen, vous allez
bien, un moment ou un autre, devoir ctoyer des macros crites par
dautres programmeurs (ne serait-ce que les miennes...). Cela peut
poser un problme car les programmeurs, quand ils nomment leurs
macros, font en gnral preuve dune banalit affligeante ; ceci a pour
consquence que lorsque vous rcuprez des macros crites par
dautres (sur Internet, dans un magazine, etc.), il y a des risques que
certaines de ces macros comportent le mme nom que les vtres. Pour
viter cela, il existe une solution simple qui consiste prfixer toutes
vos macros par un identificateur qui peut tre vos initiales suivies du
caractre de soulignement. Vous pouvez toujours tomber sur un
homonyme qui adopte la mme convention que vous, mais le risque
est beaucoup plus rare.

Chap02.fm Page 29 Mardi, 23. janvier 2007 5:29 17

29

Le choix du nom des macros

Enfin, nous vous conseillons vivement lorsque vous enregistrez une


macro de bien remplir le champ Description qui est mis votre disposition. Ce commentaire vous permettra ultrieurement de mieux vous
y retrouver dans toutes vos macros.

Figure 2.19 Documentation de la macro par lajout


dun commentaire lors de lenregistrement

Dunod La photocopie non autorise est un dlit

Les limitations de lenregistreur de macros


Nous avons vu plus haut que lenregistreur de macros enregistrait
tout, y compris vos erreurs. Cela nest pas tout fait exact dans la
mesure o certaines actions ne peuvent pas tre enregistres. Ainsi,
la principale limite concerne lutilisation de la souris. Si vous choisissez une commande laide de la souris, vous naurez aucun
problme ; en revanche, si vous voulez slectionner du texte, dplacer le point dinsertion, couper, copier ou dplacer du texte laide
de la souris, aucune de ces actions ne sera enregistre car la souris
reste inactive pendant lenregistrement dune macro (pour la mme
raison, les menus contextuels associs au clic droit de la souris sont
inactifs). Pour enregistrer ces actions, la seule solution consiste
utiliser le clavier et nous vous indiquons ci-dessous les raccourcis
clavier les plus importants qui remplacent lutilisation de la souris :
Actions de dplacement du point dinsertion
Dun mot vers la gauche

CTRL+GAUCHE

Dun mot vers la droite

CTRL+DROITE

Chap02.fm Page 30 Mardi, 23. janvier 2007 5:29 17

30

Chapitre 2. Enregistrer une macro

Actions de dplacement du point dinsertion


Dun paragraphe vers le haut

CTRL+HAUT

Dun paragraphe vers le bas

CTRL+BAS

En haut de la fentre

ALT+CTRL+PG.PRC

En bas de la fentre

ALT+CTRL+PG.SUIV

En haut de la page suivante

CTRL+PG.SUIV

En haut de la page prcdente

CTRL+PG.PRC

la fin dun document

CTRL+FIN

Au dbut dun document

CTRL+ORIGINE

lemplacement occup par


le point dinsertion lors de la dernire
fermeture du document

MAJ+F5

Actions dextension de la slection


Dun caractre vers la droite

MAJ+DROITE

Dun caractre vers la gauche

MAJ+GAUCHE

la fin dun mot

CTRL+MAJ+DROITE

Au dbut dun mot

CTRL+MAJ+GAUCHE

la fin dune ligne

MAJ+FIN

Au dbut dune ligne

MAJ+ORIGINE

Dune ligne vers le bas

MAJ+BAS

Dune ligne vers le haut

MAJ+HAUT

la fin dun paragraphe

CTRL+MAJ+BAS

Au dbut dun paragraphe

CTRL+MAJ+HAUT

Dun cran vers le bas

MAJ+PG.SUIV

Dun cran vers le haut

MAJ+PG.PRC

Au dbut du document

CTRL+MAJ+ORIGINE

Chap02.fm Page 31 Mardi, 23. janvier 2007 5:29 17

31

Le choix du nom des macros

Actions dextension de la slection


la fin dun document

CTRL+MAJ+FIN

la fin dune fentre

ALT+CTRL+MAJ+PG.SUIV

Au document tout entier

CTRL+A

un bloc de texte vertical

CTRL+MAJ+F8, puis utilisez


les touches de direction ; appuyez
sur ECHAP pour annuler
le mode de slection

un endroit dtermin du document

F8+touches de direction ;
appuyez sur ECHAP pour annuler
le mode de slection

Dunod La photocopie non autorise est un dlit

Actions de dplacement dans un tableau


la cellule suivante dune ligne

TABULATION

la cellule prcdente dune ligne

MAJ+TABULATION

la premire cellule dune ligne

ALT+ORIGINE

la dernire cellule dune ligne

ALT+FIN

la premire cellule dune colonne

ALT+PG.PRC

la dernire cellule dune colonne

ALT+PG.SUIV

la ligne prcdente

HAUT

la ligne suivante

BAS

Actions de slection dans un tableau


Slectionner le contenu de la cellule
suivante

TABULATION

Slectionner le contenu de la cellule


prcdente

MAJ+TABULATION

tendre une slection aux cellules


avoisinantes

Maintenez la touche MAJ enfonce


et appuyez plusieurs fois sur
une touche de direction

Chap02.fm Page 32 Mardi, 23. janvier 2007 5:29 17

32

Chapitre 2. Enregistrer une macro

Actions de slection dans un tableau


Slectionner une colonne

Se dplacer dans la cellule


en haut ou en bas de la colonne.
Maintenez la touche MAJ enfonce
et appuyez plusieurs fois sur
la touche HAUT ou BAS

tendre une slection (ou un bloc)

CTRL+MAJ+F8, puis utilisez


les touches de direction ; appuyez
sur ECHAP pour annuler
le mode de slection

Slectionner lintgralit dun tableau

ALT+5 sur le pav numrique


(VERR.NUM tant dsactiv)

Lenregistreur de macros possde dautres limitations, mais elles se


rencontrent plus rarement.

ENREGISTREMENT DUNE MACRO


AVEC EXCEL
Le processus denregistrement dune macro avec Excel est similaire
celui de Word. Il diffre seulement en quelques points que nous
allons dtailler. Pour activer lenregistrement, il faut choisir la commande OutilsMacroNouvelle macro... Notez que vous pouvez
galement afficher la barre doutils de Visual Basic (commande AffichageBarre doutilsVisual Basic) :

Figure 2.20 Barre doutils


de Visual Basic

La deuxime icne en partant de la gauche (reprsente par un


point bleu) vous permet de dclencher lenregistrement dune macro
qui fait apparatre la bote de dialogue suivante :

Chap02.fm Page 33 Mardi, 23. janvier 2007 5:29 17

Enregistrement dune macro avec Excel

33

Figure 2.21 Enregistrement


dune macro avec Excel

Office Dans Excel 2007, vous devez, pour enregistrer des macros, faire
2 0 0 7 apparatre longlet Dveloppeur. Pour ce faire, dans les options
standard dExcel, cochez la case Afficher longlet Dveloppeur dans
le ruban. Une fois longlet Dveloppeur activ, cliquez sur licne Enregistrer une macro.

Dunod La photocopie non autorise est un dlit

Les recommandations concernant le nom de la macro et sa description sont identiques celles que nous avons dj nonces. Le champ
Touche de raccourci permet de programmer la touche CTRL pour lui
associer la macro. Vous noterez quExcel fait ici la diffrence entre les
majuscules et les minuscules : CTRL + K sera donc considr comme
diffrent de CTRL + k.
Vous avez la possibilit denregistrer la macro dans trois emplacements diffrents :
le classeur de macros personnelles,
un nouveau classeur,
le classeur actif.
Le classeur de macros personnelles
Le classeur de macros personnelles est un fichier spcial baptis
PERSO.XLS qui se trouve dans le rpertoire de dmarrage dExcel (le
plus souvent, il sagit du rpertoire Documents and Settings\Utilisateur\Application Data\Microsoft\Excel\XLSTART). Ce fichier est donc
charg automatiquement au dmarrage dExcel et ses macros sont disponibles pour tous les autres classeurs. PERSO.XLS est donc lquivalent du fichier NORMAL.DOT de Word. Si vous tenez examiner le

Chap02.fm Page 34 Mardi, 23. janvier 2007 5:29 17

34

Chapitre 2. Enregistrer une macro

contenu de ce fichier, il suffit de choisir la commande FentreAfficher... et de faire un double-clic sur Perso.
Il peut tre utile de visualiser ce fichier si vous souhaitez y stocker autre
chose que des macros personnelles, par exemple des donnes. Pour
supprimer laffichage de ce classeur, choisissez la commande FentreMasquer.
Si vous enregistrez des macros dans le classeur de macros personnelles, noubliez pas de sauvegarder ce fichier quand vous quittez Excel.
La bote de dialogue illustre la figure 2.22 vous le rappellera.

Figure 2.22 Enregistrement du classeur


de macros personnelles

Office Dans Excel 2007, le classeur de macros personnelles se nomme


2 0 0 7 Personal.XLSB. Vous pouvez le visualiser dans longlet Affichage,
en cliquant sur licne Afficher de la zone Fentre.

Aprs avoir rempli la bote de dialogue vous demandant le nom de


la macro que vous voulez enregistrer, lenregistrement peut commencer et une nouvelle bote de dialogue apparat :

Figure 2.23 Enregistrement


dune macro Excel

Outre licne qui permet darrter lenregistrement (notez qu la


diffrence de Word, vous ne pouvez pas mettre lenregistrement en
pause), licne de droite permet de choisir entre des adresses absolues
ou relatives de cellules. Prenons un exemple simple pour bien voir
cette diffrence qui est trs importante. Ouvrez une nouvelle feuille
de calcul et demandez enregistrer une nouvelle macro. Le pointeur

Chap02.fm Page 35 Mardi, 23. janvier 2007 5:29 17

Enregistrement dune macro avec Excel

35

de cellule tant en A1, dmarrez lenregistrement et accomplissez les


actions suivantes :

Slectionnez la cellule B3
Saisissez Lundi
Dplacez-vous en C3 puis saisissez Mardi
Dplacez-vous en D3 puis saisissez Mercredi
Dplacez-vous en E3 puis saisissez Jeudi
Dplacez-vous en F3 puis saisissez Vendredi
Dplacez-vous en B4
Vous devez tre dans la mme situation que sur la figure 2.24 :

Figure 2.24 Enregistrement dune macro Excel

Dunod La photocopie non autorise est un dlit

Arrtez lenregistrement de la macro.


Par dfaut, lenregistreur de macros prend en compte des cellules
absolues et si vous excutez la macro sur une autre feuille, la saisie des
jours commencera toujours dans la cellule B3.
Ouvrez une nouvelle feuille de calcul et recommencez exactement
lenregistrement de la macro prcdente, mais cette fois-ci, avant de
slectionner la cellule B3, vous allez cliquer sur licne qui vous permet de travailler en mode relatif.
Une fois lenregistrement arrt, positionnez le pointeur de cellules
en C10 et excutez la macro : cette fois-ci, la saisie des jours commencera en D12 puisquExcel a enregistr la saisie des jours relativement ;
B3 tant situ deux lignes en dessous et une colonne droite par rapport A1, il est normal que la saisie commence en D12 si le pointeur
est situ en C10.

Chap02.fm Page 36 Mardi, 23. janvier 2007 5:29 17

36

Chapitre 2. Enregistrer une macro

Cette diffrence est extrmement importante et il est capital que


vous dcidiez lavance si vous voulez procder un enregistrement
en mode absolu (mode par dfaut) ou en mode relatif.
Il est possible de cliquer sur licne Rfrence relative en cours
denregistrement, mais nous ne vous le conseillons pas car le rsultat
est souvent droutant.

CONCLUSION
Lenregistreur de macros reprsente le moyen le plus simple pour
gnrer rapidement un programme sans avoir crire une seule
ligne de code. Il sagit l dun outil puissant dont seuls Word,
Excel et PowerPoint sont dots. Lenregistreur de macros est galement un fantastique outil dapprentissage car une fois que le
code aura t gnr, vous aurez tout le loisir daller lexaminer
afin de voir comment il est structur. Dans un second temps,
quand vous en saurez plus, vous pourrez modifier les programmes
gnrs par lenregistreur afin de les amliorer. Mme quand
vous possderez bien les bases du langage macro de Word,
dExcel et de PowerPoint, lenregistreur de macros sera souvent
un excellent moyen de vrifier la syntaxe dune commande ;
ainsi, plutt que de vous plonger dans la documentation, il sera
beaucoup plus simple de faire enregistrer la commande que vous
souhaitez mettre en uvre et daller ensuite dcortiquer le programme dans lditeur. Dans le chapitre suivant, nous allons justement apprendre visualiser et modifier les macros que nous
venons de crer.

Chap03.fm Page 37 Mardi, 23. janvier 2007 5:30 17

3
Modifier le code
des macros

Lenregistreur de macros procure un moyen rapide et efficace de


gnrer des programmes sans avoir crire une seule ligne de code.
Il comporte cependant des limites et il devient vite indispensable,
quand on lutilise, de modifier le code qui a t gnr. Dans ce chapitre, nous allons tout dabord apprendre visualiser le code et
ensuite le modifier pour le complter et lamliorer.
Nous reprendrons lexemple de la macro de remplacement ralise
dans le chapitre prcdent. Si vous avez bien suivi la leon, cette
macro doit prsent se trouver dans le modle de Word Normal.DOT
(ou Normal.dotm si vous utilisez Word 2007).
Nous vous conseillons ce sujet de faire une copie de sauvegarde
de ce fichier-l et de la conserver en un lieu sr car il peut se rvler
assez dangereux de travailler directement sur les modles globaux de
Word ou dExcel. Cest pour cette raison que nous ferons tous les exercices dans des fichiers indpendants de manire ne pas modifier des
fichiers dont laltration pourrait avoir des consquences fcheuses
pour la bonne marche dOffice. Si vous ne lavez pas encore fait, cest
le moment dinstaller les fichiers du livre sur votre disque dur (pour ce
faire, reportez-vous lavant-propos de cet ouvrage).

Chap03.fm Page 38 Mardi, 23. janvier 2007 5:30 17

38

Chapitre 3. Modifier le code des macros

VOIR LE CODE DE LA MACRO


Vous allez maintenant ouvrir dans Word le fichier REMPLACE.DOC : ce fichier contient le code de la macro que vous avez
enregistre dans le chapitre 2.
Virus et macros
Avec la gnralisation dInternet qui permet leur propagation rapide,
les virus sont devenus une plaie quotidienne ; il appartient donc chacun de se prmunir contre ce flau afin de protger son ordinateur et,
par voie de consquence, dempcher la contamination des autres utilisateurs. Les virus sont avant tout des programmes dont leur auteur a
des intentions malfaisantes ; dans la mesure o les macros sont galement des programmes, rien nempche un programmeur dcrire un
virus qui sexcute lintrieur dune macro. Devant la simplicit du langage VBA, on a donc vu apparatre toute une srie de virus macro qui
se nichaient au sein de fichiers Word ou Excel. Le virus Melissa reste
sans doute le meilleur exemple du virus programm en VBA. Il faut
bien reconnatre que Microsoft a mis beaucoup de temps se proccuper du problme de la scurit des macros et les premires versions
dOffice intgrant VBA ntaient pas spcialement bien protges contre les virus macro.
Les choses ont heureusement chang et lutilisateur dOffice a dsormais le choix entre trois attitudes :
Toutes les macros des fichiers Office sont susceptibles dtre excutes sans que lutilisateur en soit averti (niveau de scurit faible).
La prsence de toutes les macros des fichiers Office est signale lors
de louverture dun fichier et lutilisateur a le choix dactiver ou de
dsactiver les macros (niveau de scurit moyen).
Toutes les macros des fichiers Office sont dsactives lors de leur
ouverture, hormis les macros provenant de sources fiables (niveau de
scurit lev). Pour quune source soit juge fiable, la macro doit tre
signe numriquement laide dun certificat numrique (comme un
courrier lectronique) qui doit tre acquis auprs dune autorit de certification. Bien que Microsoft fournisse un outil (SELFCERT.EXE) permettant de signer ses propres macros, la signature numrique des
macros est dans les faits rserve aux professionnels.
Pour paramtrer le niveau de scurit des macros, vous devez utiliser la
commande OutilsMacroScurit et dterminer le niveau de scu-

Chap03.fm Page 39 Mardi, 23. janvier 2007 5:30 17

Voir le code de la macro

39

rit qui vous convient. Dans la pratique, seul le niveau de scurit


moyen est efficace. En effet, le niveau de scurit faible est vraiment
dangereux et laisse la porte ouverte tous les virus potentiels. Le
niveau de scurit lev est quant lui trop restrictif et ne laisserait
mme pas la possibilit dutiliser les macros livres avec cet ouvrage
dans la mesure o elles ne sont pas signes numriquement. La seule
solution acceptable est donc le niveau de scurit moyen. Quand un
fichier qui contient des macros est ouvert, la bote de dialogue illustre
la figure 3.1 apparat.

Figure 3.1 Activation ou dsactivation des macros contenues


dans un fichier Office.

Vous avez alors le choix dactiver ou de dsactiver les macros contenues dans le fichier. La conduite tenir en la matire est assez simple :
vous devez vous mfier des macros provenant dune origine inconnue
ou de la prsence de macros dans un fichier qui nest pas cens en contenir. Dans ce cas-l, cliquez sur le bouton Dsactiver les macros.
Quand les macros sont dsactives, il est toujours possible dexaminer
leur code ; en cas de doute sur une macro, vous pouvez, dans un premier temps, la dsactiver puis expertiser son code tranquillement.
Quand lexamen du code de la macro vous aura montr son innocuit,
vous pourrez alors recharger le fichier et activer cette fois-ci la macro.
Cela tant, vous me ferez lhonneur de maccorder votre confiance et
de croire que les macros livres avec cet ouvrage sont sans danger.
Vous pourrez donc, chaque fois que vous ouvrirez un fichier de ce livre
et que vous obtiendrez ce genre de message, cliquer sans crainte sur le
bouton Activer les macros.

Office Dans Office 2007, les options de scurit des macros ont t
2 0 0 7 renforces. Dans longlet Dveloppeur. Vous trouverez loutil
Scurit des macros qui fait apparatre la bote de dialogue Centre de
gestion de la confidentialit o vous pouvez paramtrer le niveau de scurit de vos macros. Quand le Centre de gestion de la confidentialit dtecte

Chap03.fm Page 40 Mardi, 23. janvier 2007 5:30 17

40

Chapitre 3. Modifier le code des macros

un problme, il affiche dans la barre de message (situe au-dessus du document) la mention Avertissement de scurit Les macros ont tdsactives. Le bouton Options permet alors dactiver le contenu de la macro.
Pour de plus amples informations sur la scurit des macros, consultez
laide en ligne la rubrique Signer numriquement un projet macro ou
bien la page Web suivante :
http://office.microsoft.com/fr-fr/outlook/HA100310711036.aspx

Figure 3.2 Centre de gestion de la confidentialit dans Office 2007.

Figure 3.3 Activation dune macro dsactive par le Centre


de gestion de la confidentialit dans Office 2007.

Quand le fichier REMPLACE.DOC est charg, la fentre de Word


affiche un texte qui explique le rle de la macro ainsi que des paragraphes qui permettent de tester la macro de remplacement.

Chap03.fm Page 41 Mardi, 23. janvier 2007 5:30 17

Voir le code de la macro

41

Pour examiner le code de cette macro, excutez la commande


OutilsMacroVisual Basic Editor (dans Word 2007, cliquez sur
loutil Visual Basic qui se trouve sur longlet Dveloppeur) qui fait
apparatre lcran suivant :

Figure 3.4 Fentre de lditeur de code, Visual Basic Editor

Le raccourci clavier pour faire apparatre lditeur Visual Basic


est ALT + F11.
Il est fort probable que votre cran ne ressemble pas exactement
celui qui est illustr la figure 3.4, mais cela nest pas important pour
linstant.
La fentre Visual Basic Editor, comme son nom lindique, est un
diteur pour Visual Basic, cest--dire un mini traitement de texte qui
va vous servir crire vos programmes Word, Excel, Access, PowerPoint ou Outlook puisque ces cinq applications partagent le mme
langage. Autant vous le dire tout de suite, lditeur de programmes est
un logiciel extrmement puissant et il peut vite se montrer droutant
pour le nophyte tant il recle de commandes et doptions. La complexit rside galement dans le nombre de fentres et de barres

Chap03.fm Page 42 Mardi, 23. janvier 2007 5:30 17

42

Chapitre 3. Modifier le code des macros

doutils qui peuvent venir encombrer lcran et le rendre confus.


Exceptionnellement riche, lditeur Visual Basic est souvent un cassette pour le dbutant qui ne sait pas par o commencer, les concepts
nouveaux mergeant de toutes parts. Ltude exhaustive de toutes les
fonctionnalits de cet diteur est bien videmment impossible dans le
cadre qui nous est imparti et nous nous concentrerons sur les fonctions vraiment essentielles de ce quon appelle un environnement de
dveloppement intgr (EDI).
Pour y voir plus clair, commencez par fermer toutes les fentres de
lditeur afin de ne garder que la barre de titre, la barre de menus et la
barre doutils.

Figure 3.5 Visual Basic Editor sans aucune fentre ouverte

Pour raliser cela, fermez individuellement toutes les fentres


ouvertes en cliquant sur la case de fermeture de chaque fentre.
Choisissez ensuite la commande AffichageExplorateur de projets
qui fait apparatre la fentre suivante :

Figure 3.6 Explorateur de projets

Comme son nom lindique, lExplorateur de projets permet de


visualiser les diffrents lments constitutifs dun projet. La documentation lectronique dOffice est assez succincte quant la notion de

Chap03.fm Page 43 Mardi, 23. janvier 2007 5:30 17

Voir le code de la macro

43

projet quelle dfinit comme un jeu de modules En fait, il faut comprendre quun projet est un ensemble qui regroupe tous les lments
rajouts lapplication hte (Word, Excel, Access, PowerPoint ou
Outlook) pour crer un programme. Ces lments diffrent dune
application lautre et lExplorateur de projets dun fichier Excel sera
diffrent de celui dune base de donnes Access.
Il nexiste quun seul projet pour les applications Outlook et il
sagit du fichier nomm VBAProject.OTM. Tout le code des
macros que vous crez dans lditeur de programmes dOutlook
est stock dans ce fichier.
Les lments constitutifs dun projet sont principalement les documents eux-mmes (Word ou Excel), des programmes crits en Visual
Basic (appels modules) ou des formulaires. Un projet dpend toujours dun document (fichier Word, fichier Excel, fichier PowerPoint
ou base de donnes Access) et comme Word, Excel et PowerPoint
permettent de charger plusieurs documents la fois, cela explique
quil puisse y avoir plusieurs projets au sein de lExplorateur de projets.
Il y a en fait au moins autant de projets quil y a de documents chargs.
Vous noterez que si vous travaillez la fois sur des documents Word,
Excel et PowerPoint, chaque application dispose de sa propre fentre
Microsoft Visual Basic. Chaque projet prsent dans lExplorateur est
reprsent par une icne et en cliquant sur le signe plus (+) gauche
de ce symbole, on dcouvre la liste des lments du projet.

Figure 3.7 lments constitutifs dun projet Word

Chap03.fm Page 44 Mardi, 23. janvier 2007 5:30 17

44

Chapitre 3. Modifier le code des macros

Certains projets peuvent tre chargs automatiquement et il


sagit notamment du projet Normal pour les documents Word
et du projet EuroTool pour les documents Excel.
Dans notre document Word, il existe trois catgories (Microsoft
Word Objets, Modules et Rfrences). Retenez bien que ces catgories dpendent du type de lapplication (Word, Excel, Access, PowerPoint ou Outlook) et quau sein dune mme application il peut y
avoir diffrents sous-ensembles, en fonction des objets contenus dans
le document.
Dans notre exemple, lobjet Microsoft Word a pour nom ThisDocument et il sagit dun nom gnrique pour dsigner le document
Word lui-mme.
Le deuxime sous-ensemble, Modules, contient les programmes,
quils aient t crits directement dans lditeur ou bien quils aient
t gnrs grce lenregistreur de macros. Le module NewMacros
est un module spcial qui renferme toutes les macros qui ont t gnres par lenregistreur. Si vous faites un double-clic sur lobjet NewMacros, vous faites afficher son code dans une fentre baptise tout
simplement Code.
La dernire catgorie, Rfrences, contient une rfrence Normal.DOT, tant donn que tous les documents Word sont bass par
dfaut sur ce modle.
La fentre Code contient donc le code de la macro que nous avons
enregistre dans le chapitre prcdent et nous allons maintenant examiner ce code plus attentivement.
Ce programme est compos de 21 lignes que nous allons dcortiquer ; chaque ligne logique du programme reprsente une action qui
est excute squentiellement.
Sub remplacedp()

La premire ligne comporte le titre de notre macro prcd du mot


Sub. Ce terme, qui est labrviation de Subroutine (sous-programme),
indique quil sagit du dbut du programme. Le nom de notre macro

Chap03.fm Page 45 Mardi, 23. janvier 2007 5:30 17

Voir le code de la macro

45

est suivi dune paire de parenthses, ce qui constitue une convention


dcriture.
'
' remplacedp Macro
' Remplace la suite de caractres espace + deux-points par la
suite espace inscable + deux-points
'

Les quatre lignes suivantes commencent toutes par une apostrophe


et sont de couleur verte. Lapostrophe indique quil sagit dun commentaire ; un commentaire est une ligne qui nest pas excute et qui
fournit des renseignements sur le programme. Les commentaires sont
extrmement importants et la plupart des dbutants ngligent cette
facult qui leur est offerte. Vous devez absolument documenter vos
programmes et nous reviendrons plus tard sur lart et la manire
dcrire des commentaires. Ces lignes ont t crites par lenregistreur
de macros et la troisime ligne de commentaire est le contenu de la
zone Description de la bote de dialogue Enregistrer une macro.
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting

Ces deux lignes indiquent Word de supprimer les options de mise


en forme des champs de la bote de dialogue Rechercher et remplacer
et correspondent lutilisation du bouton Sans attributs.
With Selection.Find
.Text = " :"
.Replacement.Text = " :"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With

Le bloc dlimit par With End With permet de dfinir les options
de la bote de dialogue Rechercher et remplacer. Mme si lon nest
pas particulirement anglophone, on devine que Text correspond la
suite de caractres rechercher et Replacement.Text la suite de

Chap03.fm Page 46 Mardi, 23. janvier 2007 5:30 17

46

Chapitre 3. Modifier le code des macros

caractres qui serviront pour le remplacement. Alors que lon na saisi


que deux paramtres dans la bote de dialogue, on peut stonner du
fait que la macro comporte dix lignes dont chacune dentre elle dfinit une option. En ralit, quand on laisse une option vide, lenregistreur de macros crit cependant une ligne pour signifier que loption
na pas t coche si bien que la mention False (qui signifie faux en
anglais) apparat pour toutes les options que nous navons pas
coches. Ainsi, la commande MatchCase = False signifie tout simplement que lon na pas coch la case Respecter la casse.
Il faut donc bien reconnatre que lenregistreur de macros est parfois bavard et gnre un code qui est inutilement long. Cela est
notamment vrai quand on veut paramtrer une seule option de la
bote de dialogue Options. Le code gnr par lenregistreur de
macros indique toutes les options de la bote de dialogue au lieu de la
seule option qui a t modifie (ce problme a t rgl dans Office
2007). Dans ces conditions, il faut faire le mnage manuellement et
supprimer les lignes de code qui ne servent pas le but recherch. Pour
le dbutant, cette tche nest pas toujours aise et il aura tendance
laisser le code tel quel, mme si le programme devient moins ais lire
puisquil est noy dans des lignes de code qui nont pas grand rapport
avec lobjectif du programme.
Selection.Find.Execute Replace:=wdReplaceAll

La dernire ligne du programme correspond au clic de lutilisateur


sur le bouton Remplacer tout.
Mme si la langue de Melville (Herman, pas Jean-Pierre !)
vous est totalement trangre, vous avez tout intrt vous
familiariser avec certains termes anglais ; il est ainsi utile de
savoir que row signifie ligne, que workbook signifie classeur,
etc. En effet, le code VBA est truff de mots anglais et leur
comprhension, mme minimale, vous facilitera la tche.
La dernire ligne indique la fin du programme :
End Sub

Chap03.fm Page 47 Mardi, 23. janvier 2007 5:30 17

Modifier le code de la macro

47

Arriv ce point, chacun saperoit bien, mme sil na jamais programm, que ce programme est la simple transcription des actions ralises dans le chapitre prcdent que lenregistreur a fidlement
mmorises. Si lon analyse ce programme, on se rend compte quil ny
a en fait que trois actions diffrentes :
remise zro des options
dfinition des options
excution de la commande de remplacement
Nous avons employ indiffremment les termes de commande ou
dinstruction pour dsigner chacune de ces actions, mais il convient
en fait de prciser cette terminologie. Le langage Visual Basic qui est
employ pour crire ce programme distingue plusieurs catgories de
commandes et notamment les instructions, comme Sub, et les mthodes, comme Selection.Find.Execute Replace. Les instructions se
reconnaissent facilement dans un programme car elles sinscrivent en
bleu dans lditeur. Les mthodes ne sont pas proprement parler des
commandes Visual Basic, mais elles permettent de raliser des actions
sur les objets de Word. Insrer un tableau, supprimer un paragraphe ou
imprimer un document sont des exemples de mthodes qui agissent
sur des objets de Word. En fait, ces mthodes sont des lments du
modle dobjets de Word (le chapitre 9 est consacr lexplicitation
de ce concept). Pour apprendre programmer Word, il vous faudra
apprendre le modle dobjets de Word. La principale difficult de
lapprentissage de la programmation Office consiste matriser les diffrents modles dobjets de chaque application.

MODIFIER LE CODE DE LA MACRO


Afin de tester les possibilits de lditeur de programmes, nous allons
amliorer ce programme de remplacement en supprimant les lignes
inutiles et en lui rajoutant des fonctionnalits.
Comme nous lavons dj mentionn, lenregistreur de macros est
bavard et il enregistre parfois des lignes de code qui nont pas beaucoup dintrt. Dans notre exemple, nous allons simplifier le code
dans les lignes o les options de la bote de dialogue Rechercher et
remplacer sont dfinies, savoir :

Chap03.fm Page 48 Mardi, 23. janvier 2007 5:30 17

48

Chapitre 3. Modifier le code des macros

.Text = " :"


.Replacement.Text = " :"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False

La premire chose faire consiste bien identifier le rle de chaque ligne. Si les deux premires lignes sont assez simples, il faut bien
reconnatre que le rle de loption MatchSoundsLike nest pas vident
saisir quand on nest pas programmeur. En pareil cas, il ne faut pas
hsiter faire appel laide en ligne de lditeur Visual Basic. Cette
dernire nest pas toujours un modle de clart, mais elle vous dpannera bien souvent. Pour invoquer lassistance de Word, slectionnez
le mot MatchSoundsLike (en faisant par exemple un double-clic) puis
appuyez sur la touche de fonction F1. Aussitt, le systme daide affiche une fentre dans laquelle figurent des explications au sujet de
cette proprit.

Figure 3.8 Systme daide en ligne de Visual Basic

Chap03.fm Page 49 Mardi, 23. janvier 2007 5:30 17

Modifier le code de la macro

49

la lecture de laide en ligne, on comprend que cette proprit


correspond au paramtre Recherche phontique (qui nest valable
que pour les textes en anglais) de la bote de dialogue Rechercher et
remplacer. Pour le type de remplacement auquel nous avons affaire, il
est clair que ce paramtre na aucun intrt et peut donc tre limin.
Il en ira de mme pour les paramtres suivants :
.Forward = True (option Rechercher vers le bas ; inutile puisque
lon remplace tout)
.Wrap = wdFindContinue (autorise la recherche au dbut du texte
quand la fin a t atteinte)
.Format = False (pas dattributs de formatage)
.MatchCase = False (option Respecter la casse)
.MatchWholeWord = False (option Mot entier)
.MatchWildcards = False (option Utiliser les caractres gnriques)
.MatchAllWordForms = False (option Rechercher toutes les formes
du mot)
On peut donc allgrement allger notre programme en supprimant
ces lignes du code. Pour ce faire, slectionnez ces lignes dans lditeur
de programmes et appuyez sur la touche Suppr.
Notre programme raccourci ressemble dsormais :
Sub remplacedp()
'
' remplacedp Macro
' Remplace la suite de caractres espace + deux-points par la
suite espace inscable + deux-points
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " :"
.Replacement.Text = " :"
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Afin de faire les choses proprement, nous allons rajouter quelques


commentaires :

Chap03.fm Page 50 Mardi, 23. janvier 2007 5:30 17

50

Chapitre 3. Modifier le code des macros

Sub remplacedpcourt()
' Remplace la suite de caractres espace + deux-points par la
suite espace inscable + deux-points
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " :" ' texte rechercher
.Replacement.Text = " :" ' texte de remplacement
End With
Selection.Find.Execute Replace:=wdReplaceAll ' on remplace
sur tout le texte
End Sub

Comme vous pouvez le constater, les commentaires peuvent constituer une ligne de code part entire ou bien dbuter la fin dune
ligne de code existante. Dans ce cas, il suffit de saisir une apostrophe
au bout de la ligne suivi du texte du commentaire. Lajout de commentaires ainsi que la suppression des lignes de code intutiles rend
notre programme plus lisible. Nous pouvons prsent envisager
damliorer notre programme en lui ajoutant dautres fonctionnalits ;
en effet, labsence despace inscable est prjudiciable non seulement
devant le caractre deux-points, mais galement devant toutes les
autres ponctuations doubles, comme le point dinterrogation, le point
dexclamation et le point-virgule. Il serait donc trs pratique deffectuer tous ces remplacements au sein dun mme programme. Comme
vous allez le constater, il ny rien de plus simple : il suffit de faire quelques copier-coller et de remplacer dans le code le caractre remplacer pour obtenir une macro qui va faciliter la vie de ceux qui ont
remettre en forme des textes. Voici la nouvelle version de notre macro
qui effectue dsormais quatre types de remplacements :
Sub remplacements_typo()
' Effectue des remplacements typographiques
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
' Remplacement des deux-points
With Selection.Find
.Text = " :"
.Replacement.Text = " :"
End With
Selection.Find.Execute Replace:=wdReplaceAll
' Remplacement du point-virgule

Chap03.fm Page 51 Mardi, 23. janvier 2007 5:30 17

Modifier le code de la macro

51

With Selection.Find
.Text = " ;"
.Replacement.Text = " ;"
End With
Selection.Find.Execute Replace:=wdReplaceAll
' Remplacement du point d'exclamation
With Selection.Find
.Text = " !"
.Replacement.Text = " !"
End With
Selection.Find.Execute Replace:=wdReplaceAll
' Remplacement du point d'interrogation
With Selection.Find
.Text = " ?"
.Replacement.Text = " ?"
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Nous avons modifi les commentaires pour bien isoler dans la


macro la partie du code qui est reponsable de chaque type de remplacement.

CONCLUSION
Si vous ne comprenez pas toutes les subtilits de ce programme et
la manire dont nous lavons transform, cela na pas, pour linstant, une grande importance. En effet, les nouvelles notions
abordes dans ce chapitre sont trs nombreuses et toutes ne peuvent pas tre expliques en dtail. Les chapitres suivants vont
approfondir les concepts fondamentaux du langage VBA. Vous
devez prsent savoir comment visualiser et modifier le code
dune macro dans lditeur Visual Basic. Vous avez pu constater
que nous sommes partis dune macro enregistre et que par raffinements successifs, nous sommes arrivs rendre notre macro
plus lisible et plus efficace. Nous poursuivrons cette dmarche
qui permet de bien dcomposer les problmes.

Chap03.fm Page 52 Mardi, 23. janvier 2007 5:30 17

Partie02.fm Page 53 Mardi, 23. janvier 2007 5:28 17

PARTIE 2

Le langage
VBA

Partie02.fm Page 54 Mardi, 23. janvier 2007 5:28 17

Chap04.fm Page 55 Mardi, 23. janvier 2007 5:09 17

4
Syntaxe de VBA
Pour pouvoir progresser dans ltude de la programmation Office, il
faut se rsoudre apprendre la grammaire du langage et nous allons
donc, au cours de cette leon, tudier les bases du langage VBA. Au
risque de me rpter, la programmation ne demande pas un grand
savoir mathmatique, mais simplement le respect de quelques rgles
formelles et un minimum de logique. Lapprentissage de la syntaxe
dun langage de programmation est souvent un peu aride et dcourage parfois les meilleures volonts. Aussi tenterons-nous dtre le
plus clair possible et den dire le minimum. Il suffit sans doute de se
persuader quil sagit l dun passage oblig et dadmettre que lon ne
peut pas parler une langue sans faire un peu de grammaire. Mais
vous apprendrez galement la syntaxe de VBA en lisant des programmes et cest pour cette raison quil est important de pouvoir
accder des recueils de programmes, Internet tant en la matire
une ressource incontournable.

HISTORIQUE DE VBA
VBA est lacronyme de Visual Basic pour Applications et vous rencontrerez parfois la dnomination Visual Basic Edition Application
qui est tombe en dsutude. Il sagit donc dune version de Visual
Basic pour les applications. Le langage de programmation Basic est
un langage assez ancien qui a t cr en 1965 ; langage dinitiation
(Basic signifie Beginners All-purpose Symbolic Instruction Code), il a

Chap04.fm Page 56 Mardi, 23. janvier 2007 5:09 17

56

Chapitre 4. Syntaxe de VBA

connu dinnombrables versions sur la plupart des systmes dexploitation. Pour Bill Gates, il sagit pourtant dun langage ftiche car
cest le premier programme quil a crit et commercialis avec son
ami Paul Allen. Il sagissait lpoque dune version de Basic pour
un ordinateur baptis Altair. Lorsque nos deux compres crrent
Microsoft et proposrent leur systme dexploitation IBM, une
version du langage Basic tait bien videmment propose dans le
package. Chacun connat la suite de lhistoire
Avec lavnement de Windows, les interfaces utilisateur sont devenues graphiques et Microsoft se devait de faire voluer son Basic : cest
ainsi que Microsoft Basic est devenu Visual Basic. Simple et visuelle,
cette nouvelle version du langage obtint un succs formidable et
encore aujourdhui, Visual Basic est sans doute le langage de programmation le plus utilis sur la plante. Mais le rve de Bill Gates tait
vritablement dimposer ce langage tous les produits que commercialisait Microsoft. On a donc vu apparatre en 1993 une version
minimale de Visual Basic dans Excel et cette version fut appele
VBA. Puis ce fut le tour de Project et dAccess daccueillir VBA ; dans
le cas dAccess, VBA venait remplacer Access Basic. En 1996, sortit
la version 4 de Visual Basic et VBA remplaa Word Basic. Une anne
plus tard, la version 5 de Visual Basic vit le jour et chaque application
de la suite Office 97 ( lexception dOutlook) incorporait dsormais
une version de VBA mme si de lgres diffrences entre les applications subsistaient encore. En 1998, Microsoft livra Visual Basic 6 et
cest cette dernire version qui est prsente dans Office 2000, Office
XP, Office 2003 et Office 2007. Pour la premire fois, le Basic rgne
en matre sur toutes ces applications et le rve de Bill Gates est
devenu ralit : en matrisant le Basic (qui na plus grand-chose voir
dailleurs avec le Basic des origines), on peut dvelopper sous Word,
Excel, Access, PowerPoint, Outlook, Project et Visio.

DIFFRENCES ENTRE VISUAL BASIC ET VBA


La principale diffrence entre Visual Basic et VBA rside dans le
fait que VBA a besoin dune application hte pour pouvoir excuter
ses programmes. Les applications htes de VBA sont essentiellement les applications de la suite Office, mais dautres programmes,

Chap04.fm Page 57 Mardi, 23. janvier 2007 5:09 17

Syntaxe de VBA

57

comme Autocad, peuvent tre programms laide de VBA. Si vous


crivez une macro en VBA pour Word, vous devez absolument possder Word pour faire tourner votre programme. En revanche, si
vous crivez un programme en Visual Basic, vous pouvez le compiler
afin de produire un fichier excutable autonome qui pourra tre
lanc sur un ordinateur qui ne dispose pas de Visual Basic. cette
diffrence prs, les deux langages sont extrmement proches et il est
particulirement ais de passer de lun lautre.
Quand un programme est compil ( laide dun compilateur),
son code source (les instructions du programme) est transform en code machine et on obtient au final un programme
excutable (avec une extension .EXE). Les programmes crits
en VBA ne peuvent pas tre compils ; on dit quils sont interprts ( laide dun interprteur). Chaque application Office
possde un interprteur VBA qui permet dexcuter les programmes crits en VBA. Les programmes interprts sexcutent moins rapidement que les programmes compils.

SYNTAXE DE VBA
Chaque ligne dun programme est compose dlments du langage
Visual Basic. la manire dune phrase, une ligne de programme,
quon appelle parfois instruction, doit tre complte et syntaxiquement correcte ; nous parlons ici de lignes logiques car nous vous rappelons quune ligne logique peut tre dcoupe en plusieurs lignes
physiques grce au caractre de soulignement (_). Notez galement
que les bons programmes doivent contenir des commentaires (lignes
commenant par une apostrophe) qui, bien videmment, ne sont
pas des lignes excutables.
Les lments du langage, quon peut comparer des catgories
grammaticales (nom, verbe, adjectif, adverbe, etc.), servent donc
crire des phrases compltes et nous allons en tudier les principaux et
notamment :
les variables,

Chap04.fm Page 58 Mardi, 23. janvier 2007 5:09 17

58

Chapitre 4. Syntaxe de VBA

les constantes,
les oprateurs,
les commandes,
les fonctions,
les mots cls.

VARIABLES
Linformatique tant la science du traitement automatique de
linformation, il ny a rien dtonnant ce quun programme manipule des informations. On peut dailleurs rsumer lessentiel des
tches dun programme dans les phases suivantes :
acquisition de linformation,
traitement de linformation,
restitution de linformation traite.
Lacquisition de linformation peut se faire de manire multiple :
saisie au clavier par lutilisateur, lecture dun fichier, saisie optique
laide dun lecteur de codes barre, etc. Le traitement de linformation peut galement revtir des formes trs diverses et les exemples
sont infinis : calcul arithmtique, traduction dans une langue trangre, transposition dune sonate dans une tonalit diffrente, suppression de leffet yeux rouges sur une photographie numrique. La
restitution de linformation peut se faire lcran, sur du papier, par le
biais des haut-parleurs ou bien encore dans un fichier. Tous ces exemples montrent bien que le matriau de base est linformation et un
programmeur passe donc son temps jongler avec des informations.
Si lon veut travailler avec des informations, il faut bien trouver un
lieu o lon puisse les entreposer, de la mme manire que si vous
devez rdiger une note de synthse dun rapport, il faut bien que vous
puissiez poser les pages du rapport sur votre bureau. Dans un programme, une variable est un emplacement de stockage de linformation. Plus un programme manipule des informations, plus il
contiendra de variables. Trs pratiquement, les informations ne sont
pas stockes dans des variables mais dans la mmoire vive de lordinateur et une variable nest jamais quun nom facile retenir qui dsignera lemplacement de stockage dans la mmoire de la machine. Ces

Chap04.fm Page 59 Mardi, 23. janvier 2007 5:09 17

Variables

59

emplacements, quon appelle aussi adresses, sont dsigns par un


numro en hexadcimal (nombre en base 16) et vous conviendrez
quil est infiniment plus facile quand on veut additionner deux nombres dcrire :
PrixHT + TVA

plutt que :
FFA12BF + FFA129A

Une variable est donc un nom qui va nous servir manipuler des
informations. La variable ne contient pas les informations mais elle
pointe vers un emplacement numrot qui renferme les informations.
Le nom de la variable doit tre significatif et il est cens nous cacher
la complexit de lorganisation de la mmoire interne de lordinateur.
Pensez aussi une autre analogie : quand vous allez chez le mdecin,
ce dernier vous appelle par votre nom mais quand il va tltransmettre votre feuille de soins, cest votre numro de scurit sociale quil va
envoyer.
Pour quune variable existe, il faut commencer par lui donner un
nom. Ce nom obit aux mmes rgles que celles que nous avons nonces pour les macros et les noms suivants sont par consquent des
noms de variables valides :

CA1999
Consommation_annuelle
Prnom
Date_chance

En revanche, les noms qui suivent ne respectent pas les conventions dattribution des noms :
2000CA (commence par un chiffre)
Adresse@internet (contient un caractre interdit)
Prix HT (contient un espace)
Il faut noter que de nombreux programmeurs se refusent utiliser
des noms de variables comportant des lettres accentues. Il y a principalement deux raisons cela : la premire est que cette possibilit est
assez rcente et quelle tait interdite dans les premires versions du
Basic. Lautre raison est que Visual Basic ne fait pas la diffrence entre

Chap04.fm Page 60 Mardi, 23. janvier 2007 5:09 17

60

Chapitre 4. Syntaxe de VBA

les minuscules et les majuscules ; ainsi les noms de variables suivants


seront tous considrs comme identiques : PRENOM, prenom, Prenom, PreNom. Mais Visual Basic (en abrg VB) fait la diffrence
entre les deux variables prenom et prnom ce qui peut crer des confusions.
Une fois que le nom de la variable a t choisi, il faut dclarer
lexistence de la variable au programme et on utilise la commande
DIM pour ce faire.
Ainsi linstruction suivante :
Dim jour

dclare une variable nomme jour.


Dim est en fait labrviation de Dimension ; cette commande ralise
en fait deux oprations en une seule : elle cre la dclaration de la
variable (elle dclare la naissance de la variable comme quand on
dclare une naissance sur un registre dtat civil) et rserve en mme
temps un emplacement dans la mmoire de lordinateur en lui accordant une certaine place, do lide de dimensionnement.

Quand la variable est dclare, on peut lutiliser et la premire des


choses faire consiste attribuer une valeur la variable. On dsigne
aussi cette opration sous le nom daffectation. Ainsi la commande
suivante affecte la valeur 50 la variable prix :
prix = 50

Vous en conclurez aisment que le signe gal (=) est loprateur


daffectation des variables.
On peut se passer de dclarer une variable avant de lutiliser ; si lon
se contente dcrire :
Euro = 6.55957

au lieu de :
Dim Euro
Euro = 6.55957

la variable sera dclare implicitement par Visual Basic la premire


fois o il rencontrera son nom.

Chap04.fm Page 61 Mardi, 23. janvier 2007 5:09 17

61

Variables

Nous vous dconseillons fortement dutiliser la dclaration


implicite des variables dans vos programmes car cette mthode
(qui nen est pas une) vous apportera plus dennuis quelle ne
vous fera gagner du temps. En effet, le fait de dclarer toutes ses
variables avant de les utiliser vous force un minimum dorganisation qui sera salutaire pour la bonne marche de vos programmes.
Si vous vous connaissez bien et que vous sentez que vous naurez
pas la rigueur ncessaire pour dclarer explicitement toutes vos variables avant de les utiliser, Visual Basic a prvu une option pour ceux
qui manquent de courage. Il suffit de choisir dans lditeur Visual
Basic la commande OutilsOptions et de cocher la case Dclaration
des variables obligatoire :

Figure 4.1 Cette option vous forcera


dclarer toutes vos variables

Cela a pour effet de vous obliger dclarer explicitement (avec


linstruction Dim) toutes les variables que vous utilisez dans un programme ; si vous cochez cette case, linstruction Option Explicit sera
automatiquement ajoute tous vos programmes. Mme si cela peut
vous paratre contraignant, limmense avantage sera que toute erreur
dans lcriture du nom dune variable sera automatiquement dtecte.
Lexprience prouve quune bonne partie des erreurs dun programme
sont dues des fautes de frappe et notamment des variables mal

Chap04.fm Page 62 Mardi, 23. janvier 2007 5:09 17

62

Chapitre 4. Syntaxe de VBA

orthographies. Avec loption de dclaration explicite des variables,


toute erreur dans lcriture dune variable sera dtecte comme une
variable non dclare et par voie de consquence signale au programmeur (figure 4.2).

Figure 4.2 Lditeur de programmes signale


les variables mal orthographies

Au cours dun programme, le contenu de la variable peut changer


la suite de laffectation dune nouvelle valeur la variable. Cest
dailleurs pour cela quon appelle une variable, une variable Toute
nouvelle affectation dune valeur une variable crase lancien contenu de la variable, exactement comme cela se passe avec le pressepapiers o le fait de copier ou de couper efface le prcdent contenu
du presse-papiers.
Dim Valeur
Valeur = 4
Valeur = Valeur * Valeur
Valeur = Valeur / 2

la dernire ligne de ce programme, la variable Valeur vaut 8.


Les variables sont extrmement importantes dans un programme et
il convient dattacher un soin tout particulier leur dclaration ainsi
quau choix de leur nom. Le prochain chapitre complte ltude des
variables.

Chap04.fm Page 63 Mardi, 23. janvier 2007 5:09 17

Constantes

63

CONSTANTES
Une constante est une variable dont on ne peut pas changer le contenu. Une constante peut tre une chane de caractres (du texte),
un nombre ou bien encore une date. Une constante possde un
nom, et une fois quelle a t dfinie, on peut lemployer dans un
programme la place de la valeur quelle reprsente. On dclare une
constante laide de la commande Const, comme dans lexemple
suivant :
Cont Euro = 6.55957

Quand la constante est dclare, on peut lutiliser dans le programme ce qui amliore la lisibilit :
Const TauxTva = 1.196
PrixHT = 100
PrixTTC = PrixHT * TauxTva

Limmense avantage de cette solution est que si vous employez 100


fois dans votre programme le taux de TVA 19,60 %, vous naurez
modifier quune seule ligne de programme si le taux change ; il vous
suffira alors de changer la dfinition de la constante. Quand vous programmez et que vous utilisez des informations dont la valeur nest pas
modifie au cours de lexcution du programme, il est donc prfrable
de dfinir et dutiliser des constantes. Voici quelques exemples de
donnes que lon a intrt grer comme des constantes :

Taux de TVA
Bornes infrieure et suprieure dune plage de valeurs
Constantes mathmatiques (Pi, par exemple)
Dates de dbut et de clture dexercice fiscal

Dune manire gnrale, il faut toujours viter de coder en dur dans


un programme. On appelle coder en dur la pratique qui consiste saisir la valeur (numrique, caractre ou date) directement dans le programme, plutt que dutiliser une variable ou une constante.
Voil un exemple de codage en dur :
Dim revenus As Double, CSG As Double
CSG = revenus * 0.075

Chap04.fm Page 64 Mardi, 23. janvier 2007 5:09 17

64

Chapitre 4. Syntaxe de VBA

Si vous avez cod votre programme de cette manire-l, le jour o


le taux de recouvrement de la CSG changera, il vous faudra relire tout
votre programme pour modifier chaque ligne o ce taux apparat.
Une solution plus lgante et plus efficace consiste crire le programme suivant :
Dim revenus As Double, CSG As Double
Const TauxCSG = 0.075
CSG = revenus * TauxCSG

Visual Basic lui-mme comprend un trs grand nombre de constantes et la plupart des fonctions qui acceptent des paramtres numriques possdent galement des constantes quil vaut mieux utiliser
pour des raisons videntes de lisibilit. Les constantes peuvent remplacer les valeurs relles partout dans votre code.
Par exemple, la fonction Weekday qui renvoie le jour de la semaine
dune date communique cette information sous la forme dun numro
de 1 7. Visual Basic dfinit automatiquement des constantes pour
chacun des jours de la semaine et pour peu que lon connaisse les
noms des jours de la semaine en anglais, vous avouerez que vbThursday est un nom un peu plus parlant que 5. Le tableau suivant illustre
les constantes des jours de la semaine dfinies par Visual Basic.
Tableau 4.1 Constantes des jours de la semaine
Constante

Valeur

Description

vbSunday

Dimanche

vbMonday

Lundi

vbTuesday

Mardi

vbWednesday

Mercredi

vbThursday

Jeudi

vbFriday

Vendredi

vbSaturday

Samedi

Chap04.fm Page 65 Mardi, 23. janvier 2007 5:09 17

65

Oprateurs

La plupart des constantes dfinies par Visual Basic sont prfixes


par les lettres en minuscules vb et nous vous conseillons dutiliser au
maximum ces constantes. Vous trouverez dans laide en ligne la totalit de ces constantes.

OPRATEURS
Le terme oprateur est emprunt aux mathmatiques et chacun sait
ce que cest puisque tout le monde a dj utilis loprateur de laddition. Un oprateur est donc un symbole permettant une opration
sur des donnes ; il existe plusieurs types doprateurs en fonction du
type des donnes qui sont traites. On distingue communment les
oprateurs mathmatiques, les oprateurs de comparaison et les oprateurs logiques.
Vous trouverez dans le tableau ci-dessous une liste des principaux
oprateurs de Visual Basic :
Tableau 4.2 Oprateurs de Visual Basic
Oprateur

Signification

&

Provoque la concatnation de deux chanes de caractres (ajoute la


deuxime chane la premire)

Multiplie deux nombres

Ajoute deux nombres

Soustrait deux nombres ou inverse le signe dun nombre

Divise deux nombres

Divise deux nombres en renvoyant un rsultat entier

lve un nombre une puissance

Affecte une valeur une variable ou bien compare deux valeurs


entre elles

<

Oprateur de comparaison infrieur

<=

Oprateur de comparaison infrieur ou gal

Chap04.fm Page 66 Mardi, 23. janvier 2007 5:09 17

66

Chapitre 4. Syntaxe de VBA

Tableau 4.2 Oprateurs de Visual Basic


Oprateur

Signification

>

Oprateur de comparaison suprieur

>=

Oprateur de comparaison suprieur ou gal

<>

Oprateur de comparaison diffrent de

And

tablit une conjonction logique entre deux expressions

Like

Compare deux chanes de caractres

Mod

Renvoie un entier qui est le reste de la division de deux nombres

Not

tablit la ngation logique dune expression

Or

tablit une disjonction logique entre deux expressions

Xor

tablit une exclusion logique entre deux expressions

Si certains de ces oprateurs vous sont inconnus, reportez-vous


laide en ligne.
Lorsquune formule contient plusieurs oprateurs, chaque oprateur est valu (cest--dire que lopration est ralise) dans un ordre
prdfini quon appelle priorit des oprateurs.
Dans les formules qui contiennent des oprateurs de diffrentes
catgories, les oprateurs sont valus dans lordre suivant : oprateurs
arithmtiques, puis oprateurs de comparaison et enfin oprateurs
logiques. Les oprateurs de comparaison ont la mme priorit ; cest-dire quils sont valus dans leur ordre dapparition, de gauche
droite. Les oprateurs arithmtiques et logiques sont valus dans
lordre de priorit qui est nonc ci-dessous (de la priorit la plus leve la priorit la plus basse) :
Tableau 4.3 Ordre de priorit des oprateurs
Arithmtique

Comparaison

Logique

lvation une puissance (^)

galit (=)

Not

Ngation ()

Ingalit (<>)

And

Chap04.fm Page 67 Mardi, 23. janvier 2007 5:09 17

67

Oprateurs

Tableau 4.3 Ordre de priorit des oprateurs


Arithmtique

Comparaison

Logique

Multiplication et division (*, /)

Infriorit (<)

Or

Division d'entiers (\)

Supriorit (>)

Xor

Modulo arithmtique (Mod)

Infriorit ou galit (<=)

Addition et soustraction (+, )

Supriorit ou galit (>=)

Concatnation de chanes (&)

Like

Ainsi, pour un programmeur VBA, lopration 3 * 2 + 5 ne revt


aucun caractre ambigu car lordre de priorit des oprateurs implique
que la multiplication doit tre ralise avant laddition.
Lorsquune mme expression comprend une multiplication et une
division, chaque opration est value dans lordre dapparition, de
gauche droite. Il en va de mme des expressions contenant une
addition et une soustraction. Lutilisation de parenthses permet de
modifier lordre de priorit afin quun lment dune formule soit valu avant les autres. Les oprations situes lintrieur de parenthses
sont toujours traites avant les autres. La priorit des oprateurs
sapplique cependant lintrieur des parenthses.
Si vous ntes pas certain de bien matriser lordre de priorit
des oprateurs, utilisez des parenthses pour lever toute ambigut. Au pire, vos parenthses seront inutiles, mais vous
gagnerez bien souvent en lisibilit.
Loprateur de concatnation de chanes (&) nest pas un oprateur arithmtique, mais sa priorit est infrieure celle des oprateurs
arithmtiques et suprieure celle des oprateurs de comparaison.
Loprateur Like, qui a la mme priorit que les oprateurs de comparaison, est en ralit un oprateur de comparaison avec des critres
spciaux.

Chap04.fm Page 68 Mardi, 23. janvier 2007 5:09 17

68

Chapitre 4. Syntaxe de VBA

MOTS CLS
Les mots cls sont les mots ou les symboles qui sont dfinis dans le
langage Visual Basic. Il sagit en quelque sorte du vocabulaire de
base de VBA. Parmi les catgories de mots cls, on peut citer les instructions, les fonctions ou les oprateurs. Quand vous choisissez le
nom dune variable (on appelle cela un identificateur, cest--dire
un nom qui identifie), il est prfrable que ce nom ne soit pas celui
dun mot cl. Mme si cela nest pas interdit, il vaut mieux, pour des
raisons de lisibilit, ne pas appeler une variable par le nom dune
fonction. Ainsi, linstruction suivante est syntaxiquement valide,
mais peu recommande (SQR est le nom dune fonction qui calcule
la racine carre) :
Dim Sqr As Double

Cest pour cette raison quil est prfrable de connatre la liste des
mots cls du langage, mme si on en ignore la signification exacte.
Vous trouverez ci-dessous la liste de mots cls particuliers de Visual
Basic ; ces mots cls sont classs part dans la documentation de
Visual Basic car soit ils appartiennent plusieurs catgories et peuvent tre employs dans plusieurs contextes (cest le cas, par exemple,
de Date qui peut tre un type de donnes, une fonction ou une instruction) soit ils reprsentent une valeur particulire (cest le cas de
True, False, Null et Empty).
Tableau 4.4 Mots cls particuliers de Visual Basic
As

Len

Private

Binary

Let

Property

ByRef

Lock

Public

ByVal

Me

Resume

Date

Mid

Seek

Else

New

Set

Empty

Next

Static

Chap04.fm Page 69 Mardi, 23. janvier 2007 5:09 17

69

Mots cls

Tableau 4.4 Mots cls particuliers de Visual Basic


Error

Nothing

Step

False

Null

String

For

On

Then

Friend

Option

Time

Get

Optional

To

Input

ParamArray

True

Is

Print

WithEvents

Il existe cependant une catgorie de mots spciaux quon appelle


mots rservs. Il est strictement interdit dutiliser ces mots en tant
quidentificateurs. Ainsi le fait de dclarer une variable du nom de
Option provoque une erreur dans lditeur Visual Basic.
Vous trouverez ci-dessous la liste des mots rservs de Visual Basic :
Tableau 4.5 Mots rservs
And

Exit

Option

Any

False

PsetOr

As

For

Private

Boolean

Function

Public

Byte

Get

ReDim

ByVal

Global

Rem

Call

GoSub

Resume

Case

GoTo

Return

Close

If

RSet

Const

Imp

Set

Currency

Integer

Single

Date

Let

Static

Chap04.fm Page 70 Mardi, 23. janvier 2007 5:09 17

70

Chapitre 4. Syntaxe de VBA

Tableau 4.5 Mots rservs


Decimal

Like

Stop

Double

Local

String

Debug

Long

Sub

Declare

Loop

To

Dim

Lset

True

Do

Me

Type

Each

New

Typeof

Else

Next

Until

Elseif

Not

Variant

End

Nothing

Wend

Endif

Null

While

Erase

On

With

Eqv

Open

Xor

Instructions
Visual Basic compte un peu moins de 80 instructions (ou commandes). Nous avons dj tudi la commande Dim qui permet de dclarer une variable. Nous examinerons au fil de cet ouvrage les
commandes les plus importantes et vous vous apercevrez bien vite
quelles nexcdent pas la vingtaine. Il faut pourtant connatre le
nom de toutes les commandes, ne serait-ce que pour viter de les
employer comme nom de variable. Le tableau 4.6 inventorie toutes
les commandes de Visual Basic.
Tableau 4.6 Commandes de VBA
AppActivate

If...Then...Else

Public

Beep

Implements

Put

Chap04.fm Page 71 Mardi, 23. janvier 2007 5:09 17

71

Mots cls

Tableau 4.6 Commandes de VBA


Call

Input #

RaiseEvent

ChDir

Kill

Randomize

ChDrive

Let

ReDim

Close

Line Input #

Rem

Const

Load

Reset

Date

Lock

Resume

Declare

LSet

RmDir

Deftype

Mid

RSet

DeleteSetting

MidB

SaveSetting

Dim

MkDir

Seek

Do...Loop

Name

Select Case

End

On Error

SendKeys

Enum

On...GoSub

Set

Erase

On...GoTo

SetAttr

Error

Open

Static

Event

Option Base

Stop

Exit

Option Compare

Sub

FileCopy

Option Explicit

Time

For Each...Next

Option Private

Type

For...Next

Print #

Unload

Function

Private

While...Wend

Get

Property Get

Width #

GoSub...Return

Property Let

With

GoTo

Property Set

Write #

Chap04.fm Page 72 Mardi, 23. janvier 2007 5:09 17

72

Chapitre 4. Syntaxe de VBA

CONCLUSION
Nous venons de passer en revue les principaux lments du langage VBA et vous devez prsent mieux comprendre les diffrentes catgories grammaticales du langage. Si on tente de
catgoriser le langage Visual Basic, on saperoit quil existe en
fait trois types dinstructions :
les instructions de dclaration qui dclarent une variable ou
une constante ;
les instructions d'affectation qui attribuent une valeur une
variable ou une constante ;
les instructions excutables qui modifient le droulement dun
programme ou bien excutent une fonction.
Dans les chapitres qui suivent, nous allons approfondir certaines
notions du langage VBA, notamment les variables, les tests, les
boucles, les procdures et les fonctions.

Chap05.fm Page 73 Mardi, 23. janvier 2007 5:10 17

5
Variables et tableaux
Dans ce chapitre, nous allons approfondir la notion de variable et notamment aborder le concept fondamental de type de donnes. Ensuite nous
tudierons une caractristique importante des variables : leur visibilit.
Puis nous examinerons les tableaux qui sont des variables un peu particulires qui rendent dminents services quand on programme.

TYPES DE DONNES
Pendant toute notre enfance, nos instituteurs nous ont rpt (
juste titre) quil ne fallait pas additionner des choux et des carottes.
Cette rgle est valable aussi en informatique pour les variables. Soit
le programme suivant :
Sub erreur_type()
Dim age
Dim prenom
Dim c
age = 20
prenom = "Dominique"
c = age + prenom
End Sub

Ce programme dclare trois variables nommes age, prenom et c,


puis affecte une valeur age et prenom ; enfin, il affecte une valeur
la variable c en lui assignant le rsultat de laddition des variables age et
prenom. Si lon excute ce programme, on obtient le message suivant :

Chap05.fm Page 74 Mardi, 23. janvier 2007 5:10 17

74

Chapitre 5. Variables et tableaux

Figure 5.1 Le programme contient


une erreur de type

Le message est assez clair et il signifie que lon ne doit pas additionner un prnom et un ge ; le programme ne sait pas ajouter le nombre
20 au prnom Dominique et cela na aucun sens pour lui. Ce message
derreur attire notre attention sur la notion de type de donnes. Nous
avons dit prcdemment quun programme manipulait des informations, mais il faut reconnatre que la notion dinformation est trs
vague. Pourtant, chacun fait spontanment des diffrences entre certains types dinformations. Ainsi, la distinction entre donnes textuelles et donnes numriques est communment admise car les types
de traitement auxquels on peut soumettre ces donnes ne sont pas
identiques. On peut diviser deux nombres et mettre un texte en
majuscules, mais pas linverse. Afin de faciliter le traitement des donnes, les langages de programmation instituent des catgories dinformation que lon appelle types de donnes. Un type de donnes
subdivise donc linformation en diffrentes catgories et il convient,
chaque fois que lon souhaite dclarer lexistence dune variable, de
prciser galement son type de donnes. Le nombre de types de donnes pris en charge varie dun langage de programmation lautre.
Le tableau 5.1 indique les types de donnes grs par Visual Basic
ainsi que la plage dinformations gre par chaque type :
Tableau 5.1 Types de donnes en Visual Basic
Type de donnes

Plage

Boolean

True et False

Byte

Nombre de 8 bits (un octet) non sign, compris entre 0 et


255

Chap05.fm Page 75 Mardi, 23. janvier 2007 5:10 17

75

Types de donnes

Tableau 5.1 Types de donnes en Visual Basic


Type de donnes

Plage

Currency

Nombres de 64 bits (8 octets) au format entier, avec un


dcalage de 10 000 afin d'obtenir un nombre virgule
fixe comprenant 15 chiffres gauche du sparateur
dcimal et 4 chiffres droite. Cette reprsentation offre
une plage comprise entre -922 337 203 685 477,5808 et
922 337 203 685 477,5807

Date

Nombres virgule flottante de 64 bits (8 octets) reprsentant


des dates comprises entre le 1er janvier 100 et le 31 dcembre
9999, et des heures allant de 0:00:00 23:59:59.

Decimal

Entiers de 96 bits (12 octets), signs, dcals d'une puissance


de 10 variable. Le facteur de dcalage (puissance de 10), qui
dfinit le nombre de chiffres situs droite du sparateur
dcimal, est compris entre 0 et 28. Avec un dcalage de 0 (pas
de dcimales), la valeur maximale est +/-79 228 162 514 264
337 593 543 950 335. Avec 28 dcimales, la valeur
maximale est +/-7,9228162514264337593543950335 et la
valeur minimale diffrente de zro est +/0,0000000000000000000000000001.

Double

Nombres virgule flottante de 64 bits (8 octets) dont la


valeur est comprise entre -1,79769313486231E308 et 4,94065645841247E-324 pour les nombres ngatifs et
entre 4,94065645841247E-324 et
1,79769313486231E308 pour les positifs

Integer

Nombres de 16 bits (2 octets) dont la valeur est comprise


entre -32 768 et 32 767

Long

Nombres signs de 32 bits (4 octets) dont la valeur est


comprise entre -2 147 483 648 et 2 147 483 647

Object

Adresses 32 bits (4 octets) qui font rfrence des objets

Single

Nombres virgule flottante de 32 bits (4 octets) dont la


valeur est comprise entre -3,402823E38 et -1,401298E45 pour les nombres ngatifs et entre 1,401298E-45 et
3,402823E38 pour les positifs

String

Chanes de caractres de longueur variable pouvant


contenir environ 2 milliards (231) de caractres

Variant

Type de donnes spcial pouvant contenir des donnes de


toutes sortes

Chap05.fm Page 76 Mardi, 23. janvier 2007 5:10 17

76

Chapitre 5. Variables et tableaux

Pour prciser le type de donnes dune variable, il faut faire suivre


le nom de la variable du mot cl AS et prciser ensuite le type de donnes, comme dans lexemple suivant :
Dim premier As Variant
Dim jour As Integer

Il est possible de grouper les dclarations de variables sur une seule


et mme ligne mais le programme perd en lisibilit :
Dim premier As Variant, jour As Integer

Parmi les types de donnes que nous venons de lister, certains types
sont trs souvent employs et nous allons nous y attarder. En fait, si
lon examine ces types de donnes, on saperoit quil existe un type
pour grer les dates, un type pour grer les caractres, huit types pour
grer les nombres et un type fourre-tout. Nous laissons de ct, pour
linstant, le type Object, sur lequel nous reviendrons longuement.
Comment excuter les programmes ?
Au fur et mesure de lapprentissage de VBA, vous allez tre amen
excuter les programmes que vous aurez crits. Nous avons dj vu
comment associer un raccourci clavier ou une icne une macro
(chapitre 2). Vous pouvez aussi, quand vous travaillez avec Word, Excel
ou PowerPoint, utiliser la commande OutilsMacroMacros pour faire
afficher la liste des macros disponibles ; dans cette bote de dialogue,
slectionnez la macro dont vous voulez lancer lexcution et cliquez sur
le bouton Excuter.
Bien souvent, vous voudrez galement tester un petit programme de
quelques lignes pour voir son comportement (vous voulez, par exemple, recopier un exemple de cet ouvrage et tudier la manire dont il
fonctionne). Il suffit alors de vous placer dans lditeur Visual Basic et
dafficher la fentre de code. Saisissez ensuite votre programme en
noubliant pas de le dlimiter par les mots cls Sub et End Sub. Pour
excuter votre programme, il suffit de placer le curseur lintrieur du
code et dappuyer sur la touche de fonction F5.

Les dates
Les dates sont gres en Visual Basic comme dans Excel, cest--dire
quelles sont stockes en mmoire sous la forme de nombres. Pour

Chap05.fm Page 77 Mardi, 23. janvier 2007 5:10 17

77

Types de donnes

vous en persuader, crivez dans lditeur le petit programme


suivant :
Sub datetest()
Dim x As Date
x = 1
' La fonction MsgBox affiche une bote de dialogue
MsgBox (x)
End Sub

Si on excute ce programme, on obtient la rponse suivante :

Figure 5.2 Les dates sont traites


en interne comme des nombres

Quand un des exemples de cet ouvrage fait moins dune dizaine


de lignes de code, nhsitez pas le saisir dans la fentre de
code de lditeur de programmes et lexcuter. En agissant de
la sorte, vous vous familiarisez rapidement avec lenvironnement de dveloppement intgr.
Heureusement, Visual Basic convertit automatiquement le format
interne de date en un format beaucoup plus lisible par les tres
humains ; ce nest donc pas 1 qui est affich, mais le 30 dcembre
1899. Il faut cependant garder lesprit que les dates sont des nombres. Cette proprit est dailleurs trs pratique quand on veut faire
certains calculs. Si un fournisseur autorise les paiements 90 jours, il
suffit pour connatre la date dchance de calculer Date + 90.
Essayez la formule suivante dans un programme :
MsgBox (Date + 90)

Vous verrez que la bote de dialogue affiche la date systme augmente de 90 jours.

Chap05.fm Page 78 Mardi, 23. janvier 2007 5:10 17

78

Chapitre 5. Variables et tableaux

Voici un autre petit programme pour bien vous montrer que les
dates sont gres comme des nombres ; ce programme affiche le nombre affect la date du jour :
Sub datetest2()
Dim vardate As Date
Dim varnum As Long
vardate = Date
' Initialise vardate avec la date du jour
varnum = vardate
' Stocke dans varnum le numro du jour de la date systme
MsgBox (varnum)
' Affiche ce numro
End Sub

Dans la mesure o varnum est une variable de type numrique, elle


contient le nombre de jours couls depuis le 30/12/1899 ; il ny a
donc pas de conversion automatique du nombre en date et cest bien
un nombre qui saffiche.
Vous devez galement retenir que les nombres entiers ngatifs
reprsentent des dates antrieures au 30 dcembre 1899
Si un nombre dcimal reprsente une date, les valeurs situes
gauche du sparateur dcimal reprsentent la date, tandis que celles
situes droite correspondent lheure. Minuit est reprsent par 0 et
midi par 0,5. Ainsi lexcution du programme suivant :
Dim x As Date
x = 38770.5
MsgBox (x)

affichera 22/02/2006 12:00:00.


Tout cela est trs clair mais une question se pose : quand on veut
affecter une valeur une variable de date, est-il ncessaire de lui fournir un nombre ? Bien videmment, la rponse est ngative. Les variables de type Date acceptent dtre initialises (initialiser signifie
donner une valeur initiale une variable) par des valeurs quon
appelle littrales, cest--dire des dates crites en clair. Par exemple
pour affecter la valeur du 1er janvier 2002 la variable PassageEuro,
vous pouvez utiliser la mthode suivante :
Dim PassageEuro As Date
PassageEuro = #1/1/2002#

Chap05.fm Page 79 Mardi, 23. janvier 2007 5:10 17

Types de donnes

79

Comme vous laurez remarqu, les dates au format littral doivent


tre encadres par le symbole dise.
Le format littral de date que vous devez utiliser dpend des
options rgionales qui sont dfinies dans le Panneau de configuration
(onglet Date, Format de date court).
De toutes les manires, si vous saisissez dans lditeur de programmes, le littral #01/01/02#, lditeur convertit automatiquement cette
date au format #1/1/2002#. Il fera de mme si vous entrez la date au
format amricain :
PassageEuro = #January 1, 2002#

Il est galement possible de saisir les dates avec dautres formes de


littraux, comme par exemple :
PassageEuro = "1 janvier 2002"

ou bien mme encore :


PassageEuro = "1 janvier 02"

Nous vous conseillons toutefois dutiliser le format standard,


savoir #JJ/MM/AAAA#.

Les caractres
Les donnes de type caractre sont appeles chanes de caractres,
parfois string (nom anglais qui signifie chane) ou bien encore texte.
Ces informations, qui sont dlimites par le caractre guillemet ("),
peuvent contenir du texte de nimporte quelle longueur. Une
chane de caractres peut contenir un seul caractre, comme un millier de caractres. Elle peut mme tre vide, cest--dire ne contenir
aucun caractre. Voici quelques exemples dinitialisation de variables caractres :
Dim prenom As String
Dim citation As String
Dim insee As String
Dim adresse As String
Dim vide As String
prenom = "Marcel"
citation = "Longtemps, je me suis couch de bonne heure."
insee = "1721171094076"

Chap05.fm Page 80 Mardi, 23. janvier 2007 5:10 17

80

Chapitre 5. Variables et tableaux

adresse = "36 quai des Orfvres"


vide = "" ' il ny a aucun espace entre les deux guillemets

Comme vous pouvez le voir, une chane de caractres ne contient


pas que des lettres et peut renfermer des chiffres ou un mlange des
deux. La variable insee qui stocke un numro de scurit sociale nest
compose que de chiffres, mais on la considre comme une chane de
caractres et non pas comme un nombre. Pour savoir si une donne
qui ne comporte que des chiffres doit tre dclare comme une variable caractre ou bien comme une variable numrique, il suffit de se
poser la question suivante : doit-on faire des calculs arithmtiques
avec cette information ? Il est fort peu probable quon doive additionner des numros de scurit sociale ou bien des numros de tlphone
et quand vous aurez manipuler ce genre dinformations, vous les initialiserez donc en tant que variable de type String.

Les nombres
Nous avons vu quil existe huit types diffrents pour grer les nombres (nous incluons le type Boolean dans les types numriques).
Cette plthore est de nature perturber les apprentis programmeurs
car sil faut passer en revue chaque type de donnes numriques pour
savoir lequel choisir quand on veut dfinir une variable, on risque de
se perdre dans des questions mtaphysiques. En fait, il faut comprendre la raison de cette abondance ; au dbut de lhistoire de linformatique, la mmoire tait rare et excessivement coteuse. Il tait alors
de bon ton dconomiser chaque bit de mmoire vive et si on dsirait manipuler un nombre de 8 bits (de 0 255), il fallait donc rserver 8 bits dans la mmoire et pas un de plus. De l vient cette
quantit de types de donnes numriques diffrents. Aujourdhui, la
donne a beaucoup chang et on nen est plus vraiment quelques
octets prs ; cependant, pour des raisons de compatibilit, on a gard
tous les types de donnes. En pratique, vous utiliserez seulement
deux ou trois types de donnes numriques et notamment le type
Boolean pour les variables binaires, le type Integer pour les petits
entiers et le type Double pour les entiers longs ou les nombres dcimaux.
Vous noterez dailleurs que dans un exemple prcdent de dclaration dune variable qui sert stocker le numro du jour dune date,

Chap05.fm Page 81 Mardi, 23. janvier 2007 5:10 17

81

Types de donnes

nous avons dfini la variable jour avec le type de donnes Integer ;


cela ne se justifie pas car une dclaration en tant que Byte aurait
amplement suffi dans la mesure o il ny a pas plus de 31 jours dans un
mois. Comme vos programmes ne font pour linstant que quelques
dizaines de lignes, il faut bien admettre que ce type de gaspillage est
sans consquence sur la rapidit de vos macros, mais pourquoi ne pas
prendre tout de suite de bonnes habitudes et uvrer pour le dveloppement durable en ne consommant que le strict minimum de
mmoire ncessaire ?
Voici quelques exemples dinitialisation de variables :
Dim i As Byte
Dim entier As Integer
Dim euro As Double
Dim majeur As Boolean
i = 100
entier = 32000
euro = 6.55957
majeur = True

Mme si nous vous avons incit lconomie de mmoire, la dclaration de variables consommant ce type de ressources, il ne faut pas
non plus tomber dans lexcs inverse et tre trop chiche en la matire.
En effet, si vous visez trop juste, vous obtiendrez des erreurs comme le
montrent les deux lignes suivantes :
Dim i As Byte
i = 256

Figure 5.3 Un mauvais choix de type


peut entraner une erreur dexcution

Lerreur de dpassement de capacit indique que vous avez dpass


la plage autorise pour le type de donnes que vous avez dclar. Le

Chap05.fm Page 82 Mardi, 23. janvier 2007 5:10 17

82

Chapitre 5. Variables et tableaux

type Byte dfinit une plage de valeurs de 0 255 ; 256 tant en dehors
de cette plage, il se produit une erreur.

Le type de donnes Variant


Le type de donnes Variant est attribu toutes les variables qui ne
sont pas explicitement dclares laide de linstruction Dim ou bien
celles qui sont dclares avec Dim sans prcision de type. Il sagit
donc dun type de variable par dfaut, mais la particularit est que le
type Variant peut contenir des donnes de nimporte quel autre type
et on peut ainsi dire que Variant est sans type. Il est donc clair que si
vous avez du mal matriser les notions de types de donnes,
Variant est pour vous la solution miracle. Dans la pratique, Variant
ralise pour vous, en arrire-plan, tout le travail de typage des variables et essaye de dterminer au mieux le type des variables que vous
utilisez. Mais ce qui peut apparatre comme une simplification du
travail du programmeur comporte nanmoins des inconvnients. Le
principal inconvnient est que le travail que vous ne faites pas,
Visual Basic doit le faire votre place et cela peut avoir des consquences sur la vitesse dexcution des programmes. Lautre problme
est que si vous nutilisez que des variables de type Variant dans votre
programme, la lisibilit de ce dernier va diminuer. Il faut donc utiliser les variables Variant bon escient et il est prfrable, chaque fois
que cela est possible, dutiliser un autre type de donnes. Si vous
voulez tester rapidement un programme, ce style de variable fourretout peut se rvler trs pratique mais il ne faut surtout pas en abuser.

Les erreurs de type


Attribuer le bon type de donnes une variable est trs important
car cela va conditionner les traitements quon va pouvoir lui faire
subir. Une des principales sources derreur des nophytes provient
en effet des erreurs de type. Comme nous lavons vu prcdemment,
essayer dadditionner un nombre et une chane de caractres provoque une erreur de type. En revanche, si on additionne deux nombres, il ny aura pas de problme ; de mme si on ajoute deux chanes
de caractres, elles seront mises bout bout et nen formeront plus

Chap05.fm Page 83 Mardi, 23. janvier 2007 5:10 17

Types de donnes

83

quune (on appelle cela une concatnation). Lautre erreur de type


classique survient quand vous fournissez un paramtre qui a un type
diffrent de celui qui est attendu. Prenons un exemple : la fonction
Sqr (pour Square root) renvoie la racine carre dun nombre quon
lui passe comme paramtre. Ainsi, le programme suivant produira
une erreur de type :
Dim chaine As String
chaine = "neuf"
MsgBox (Sqr(chaine))
End Sub

Mais assez curieusement, lexemple suivant affichera la valeur 3


(qui est bien la racine carre de 9) :
Dim chaine As String
chaine = "9"
MsgBox (Sqr(chaine))
End Sub

On remarquera que Visual Basic est donc trs tolrant (les puristes
diront quil est laxiste !) et quil fait tout pour nous arranger. La variable chaine est bien une variable de type caractre, mais comme elle ne
contient que des chiffres, Visual Basic linterprte comme un nombre
tant donn que la fonction Sqr attend une donne numrique. Nous
vous conseillons, afin de prendre de bonnes habitudes, de ne pas trop
cder la facilit et de bien faire attention aux types de vos variables.
Pour viter les erreurs de type, il est souvent ncessaire de convertir
un type de donnes en un autre type de donnes. Visual Basic dispose
pour cela de toute une panoplie de fonctions de conversion de type.

Les expressions
Le concept dexpression est malheureusement assez flou et Microsoft
le dfinit comme une combinaison de mots cls, d'oprateurs, de
variables et de constantes gnrant une chane, un nombre ou un
objet. Cette dfinition ne nous avance gure et nous dfinirons personnellement une expression comme une suite dlments du langage Visual Basic laquelle on peut attribuer un type de donnes.
On parlera ainsi dexpression numrique, dexpression de chane (ou
expression caractre), dexpression de date ou bien encore dexpression logique (ou boolenne).

Chap05.fm Page 84 Mardi, 23. janvier 2007 5:10 17

84

Chapitre 5. Variables et tableaux

Dterminer le type dune expression nest pas toujours vident si


lexpression est extraite de son contexte. Ainsi, on ne peut pas dire
quel est le type de lexpression suivante :
A+B
On peut juste dire quil sagit dune expression puisque la formule
contient des variables et un oprateur mais tant quon ne connat pas
le contenu des variables A et B, on ne peut rien dcider quant au type
de cette expression. Le plus simple pour apprhender le concept
dexpression est sans doute dexaminer quelques exemples.
Les expressions numriques
Il sagit dune formule dont le rsultat doit obligatoirement tre un
nombre. Voici des exemples dexpressions numriques :

7
159.45
123 + 45
Sqr (25)
Int((99 * Rnd) + 1)

Les expressions de type caractre


Il sagit dune formule dont le rsultat doit obligatoirement tre une
chane de caractres. Voici des exemples dexpressions de chane :

"Dominique"
"Dominique" & " " & "MANIEZ"
Mid("1721171094076", 4, 2)
"00" + Right(Str(Val(Chr(Asc("7")))), 1)

Les expressions de date


Il sagit dune formule dont le rsultat peut tre interprt comme
une date. Il peut s'agir d'une date, de nombres ayant l'aspect de
dates, de chanes ressemblant des dates et de dates renvoyes par
des fonctions. Une expression de date ne peut contenir que des
combinaisons de chiffres et de chanes reprsentant une date comprise entre le 1er janvier 100 et le 31 dcembre 9999.Voici des
exemples dexpressions de date :

Chap05.fm Page 85 Mardi, 23. janvier 2007 5:10 17

Visibilit des variables

85

Date
Date + 30
DateSerial(2002, 1, 1)
CDate("15/05/1987") + 10

Les expressions logiques


Il sagit dune formule dont le rsultat doit obligatoirement tre vrai
(True) ou faux (False). Voici des exemples dexpressions logiques :

True
False
X=2
x > nbjours

Les expressions logiques sont le type mme dexpression des conditions qui servent lors des tests conditionnels If Then (voir le chapitre
6) ou bien dans les boucles Do Loop (voir le chapitre 7).

VISIBILIT DES VARIABLES


Le concept de visibilit des variables (on parle galement de porte)
nest pas vident saisir pour un dbutant. Si vous ne ralisez que de
courtes macros autonomes, vous nen aurez dailleurs absolument
pas besoin. Il nest cependant pas inutile de dvoiler les grandes
lignes de la notion de visibilit des variables car cest un problme
que vous rencontrerez trs certainement dans votre apprentissage de
VBA si vous ralisez des programmes moyennement complexes. De
quoi sagit-il ? Quand vous utilisez une variable dans une macro, tout
se passe bien, mais il arrivera forcment un jour o vous serez oblig
de concevoir un programme qui se compose de plusieurs macros ou
dune macro et dun formulaire. La question qui se pose est alors la
suivante : une variable dune macro est-elle visible dans une autre
macro ? On peut formuler la question autrement : est-ce quune
macro peut accder (en lecture ou en criture) la valeur dune
variable qui a t dfinie dans une autre macro ? Considrons
lexemple suivant qui se compose de deux macros :
Sub Macro1()
Dim prenom

Chap05.fm Page 86 Mardi, 23. janvier 2007 5:10 17

86

Chapitre 5. Variables et tableaux

prenom = "Dominique"
End Sub
Sub Macro2()
Dim nom
nom = "Maniez"
MsgBox (prenom + " " + nom)
End Sub

La premire macro, Macro1, se contente de dclarer et dinitialiser


la variable prenom. La deuxime macro, Macro2, dclare et initialise
la variable nom puis utilise la fonction MsgBox qui permet dafficher
une bote de dialogue. On pourrait penser que la fonction affiche le
prnom suivi du nom, mais en fait, il nen est rien. Si vous recopiez ces
deux macros dans lditeur de programmes et excutez Macro1 puis
Macro2, il ne saffichera que la variable nom. La raison en est assez
simple : les variables nont quune porte locale ce qui signifie quelles
ne sont visibles qu lintrieur de la macro dans laquelle elles ont t
dclares. La variable prenom ne peut donc tre vue que dans
Macro1. Quand, dans Macro2, la fonction MsgBox veut afficher la
valeur de la variable prenom, il ne sagit pas de la variable dclare
dans Macro1. En effet, Macro2 considre que prenom est une nouvelle variable qui est dclare de manire implicite et qui na aucune
valeur. Il est donc parfaitement normal que seul le nom soit affich
puisque la variable prenom est vide.
Pour que la macro Macro2 puisse afficher la variable prenom dclare dans Macro1, il faut modifier la visibilit de la variable prenom.
Pour ce faire, il faut placer la dclaration de la variable dans un
endroit spcial du programme : la section Dclarations. Au sommet
de la fentre de code, il y a deux listes droulantes ; dans la liste droulante de droite, il y a la liste de toutes les macros du module, un
module tant un lment de lditeur Visual Basic qui regroupe des
macros. Cette liste droulante permet daccder rapidement au code
dune macro particulire quand un module comporte de nombreuses
macros. Le premier lment de cette liste a pour nom (Dclarations).
Il ne sagit pas du nom dune macro, mais de lemplacement dans
lequel vous allez pouvoir dclarer les variables que vous voulez utiliser
dans toutes les macros du module. Pour saisir une variable dans cet
emplacement, cliquez sur la liste droulante de droite et choisissez

Chap05.fm Page 87 Mardi, 23. janvier 2007 5:10 17

87

Visibilit des variables

llment (Dclaration). Dans la fentre de code, saisissez linstruction Dim suivie du nom de la variable (figure 5.4).

Figure 5.4 Cration dune variable


dans la section Dclarations

Si vous excutez nouveau Macro1 (positionnez-vous dans le code


et appuyez sur la touche de fonction F5) puis Macro2, vous verrez que
cette fois-ci sont affichs le prnom et le nom.
La porte de la variable prenom a t modifie : elle est dsormais
visible dans lensemble des macros du module. Si vous souhaitez que
la variable soit galement visible dans les autres modules (vous pouvez
en effet crer autant de modules que vous le voulez dans un mme
document), il faut remplacer linstruction Dim par le mot cl Public.
Il pourrait tre tentant, afin danticiper les problmes de visibilit des variables, de dclarer toutes les variables dont on a
besoin dans toutes les macros dans la section Dclarations du
module. De la sorte, chaque variable peut tre visible depuis
nimporte quelle macro. Si vous avez un grand nombre de
variables, cette solution nest gure envisageable car vous risquez de crer plus de problmes que vous nen rsolvez. En
effet, le fait quune variable ne soit visible qu lintrieur de la
macro dans laquelle elle a t dclare nest pas toujours un
problme ; elle est ainsi protge contre les lments extrieurs
et cela peut se rvler utile dans certains cas. Il ne faut donc
inclure dans la section des dclarations que les variables qui
entrent en jeu dans plusieurs macros.

Chap05.fm Page 88 Mardi, 23. janvier 2007 5:10 17

88

Chapitre 5. Variables et tableaux

TABLEAUX
Au fur et mesure que vous allez apprendre programmer, vous
vous trouverez dans des situations o vous allez utiliser des variables
qui reprsentent des donnes similaires. Vous pouvez ainsi vouloir
stocker les noms des jours de la semaine dans des variables, comme
dans lexemple (on a ici dclar les variables de manire implicite ce
qui nest pas bien, mais on est un peu press...) :
jour1
jour2
jour3
jour4
jour5
jour6
jour7

=
=
=
=
=
=
=

"lundi"
"mardi"
"mercredi"
"jeudi"
"vendredi"
"samedi"
"dimanche"

De la mme manire, on pourrait aussi dclarer les noms des lves


dune classe, les jours de lanne, les noms des joueurs dune quipe de
rugby, etc.
Cette faon de procder, mme si elle est correcte, nest pas trs
efficace car elle va empcher tout traitement automatique de la liste
(des jours, des lves, des joueurs, etc.). Il existe donc en Visual Basic
une autre structure de donnes qui permet de rsoudre ce genre de
problmes : les tableaux.
Ne confondez pas les tableaux qui sont des variables avec les
tableaux Word ou les tableaux Excel. On utilise le mme
terme en franais, mais les ralits sont bien diffrentes. Dans
le contexte de la programmation, tableau traduit le terme
anglais array qui signifie aussi matrice.
Un tableau est une liste de donnes qui reprsentent un mme type
dinformations. On appelle lments les donnes qui composent la
liste. Comme les variables, les tableaux ont un nom qui sert les
manipuler. Pour diffrencier chaque lment dun tableau, on leur
attribue un numro que lon nomme indice. Le nom dun lment
dun tableau est compos du nom du tableau suivi de son numro
dindice. Si lon veut transformer le code prcdent pour utiliser un

Chap05.fm Page 89 Mardi, 23. janvier 2007 5:10 17

Tableaux

89

tableau la place des 7 variables individuelles, cela donne le rsultat


suivant :
Dim jours(6) As String
jours(0) = "lundi"
jours(1) = "mardi"
jours(2) = "mercredi"
jours(3) = "jeudi"
jours(4) = "vendredi"
jours(5) = "samedi"
jours(6) = "dimanche"

Vous pouvez alors constater plusieurs choses :


On dclare un tableau avec linstruction Dim (comme pour les
variables).
Le nombre dlments (moins 1) du tableau est inscrit entre
parenthses aprs le nom du tableau.
On peut attribuer un type de donnes au tableau.
La numrotation des lments du tableau commence zro.
Pour utiliser un lment de tableau, il suffit dindiquer son indice,
comme dans lexemple suivant :
MsgBox jours(3) ' Affiche jeudi

Lavantage de ce systme est que lon peut utiliser une variable la


place de lindice de llment :
numjour = 4
MsgBox jours(numjour) 'Affiche vendredi

Cette possibilit va permettre, notamment grce des boucles


(chapitre 7), de traiter automatiquement lensemble des lments
dune liste.
Vous trouverez parfois, dans la littrature informatique, les
tableaux dsigns sous lappellation de variables indices. Cela
signifie tout simplement quil sagit de variables munies dun
numro (un indice).
Dans lexemple que nous avons pris, nous connaissons a priori le
nombre des lments du tableau (en loccurrence 7). Il arrivera sou-

Chap05.fm Page 90 Mardi, 23. janvier 2007 5:10 17

90

Chapitre 5. Variables et tableaux

vent que vous ayez manipuler des tableaux dont vous ne connaissez
pas lavant le nombre dlments. Il faut alors dclarer un tableau
dynamique dont vous pourrez dans le programme modifier la taille
laide de linstruction Redim (redimensionner). On dclare un
tableau dynamique en ne prcisant pas le nombre dlments lors de la
dclaration (les parenthses sont vides). Vous pouvez redimensionner
autant de fois que vous le souhaitez un tableau dynamique, comme
lillustre lexemple suivant :
Dim notes() As Byte
ReDim notes(2)
notes(0) = 15
notes(1) = 12
notes(2) = 17
ReDim Preserve notes(4)
notes(3) = 8
notes(4) = 16

Vous remarquerez lutilisation du mot cl Preserve qui permet de


redimensionner un tableau existant tout en conservant les valeurs
quil contient.

CONCLUSION
Il est rigoureusement impossible dcrire des macros sans utiliser
des variables. Cest la raison pour laquelle il convient de bien
comprendre leur fonctionnement (dclaration, type de donnes,
porte). Les tableaux qui sont un type de variable spcial facilitent beaucoup la vie des programmeurs et il faut au moins
apprendre matriser les rudiments des tableaux une seule
dimension (certains tableaux peuvent en effet avoir plusieurs
dimensions, mais pour des raisons de simplification, nous prfrons ne pas aborder ce sujet). Nhsitez pas vous lancer et
crire de petits programmes qui dclarent et manipulent des
variables afin de mieux comprendre leur fonctionnement. Mme
si ces petits programmes ne marchent pas du premier coup et
nont pour linstant pas une grande utilit, vous ne risquez absolument rien essayer de les crer.

Chap06.fm Page 91 Mardi, 23. janvier 2007 5:10 17

6
Tests conditionnels
Si la vie nest pas toujours un long fleuve tranquille, il en va de
mme de certains programmes. En effet, le droulement squentiel
des instructions nest quexceptionnel car, comme dans la vie, il survient trs souvent des complications, des obstacles et des problmes
qui viennent bouleverser la linarit des choses. On se retrouve
ainsi trs souvent dans un programme devoir faire des choix. Nous
allons tudier dans ce chapitre les commandes qui permettent de
contrler lexcution des instructions.

LES TESTS CONDITIONNELS


Sous ce nom barbare, on dsigne en fait une ralit assez simple que
lon accomplit quotidiennement car notre vie est faite de choix,
petits ou grands : fromage ou dessert, PC ou Macintosh, PACS ou
mariage ? Aucun programme informatique ne peut traiter ces dilemmes, mais on retrouve dans les macros cette forme dinterrogation ;
en effet, si lon veut par exemple crire un programme qui affiche le
calendrier du mois en cours, il faut prvoir le nombre de jours exact
du mois en cours. Comme les mois peuvent avoir 28, 29, 30 ou 31
jours, des tests conditionnels vont nous permettre de rgler ce problme. On appelle test conditionnel une commande qui pose une
question au programme et qui excute une action en fonction de la
rponse donne. Si on voulait donner un exemple de test conditionnel dans la vie de tous les jours, cela donnerait :

Chap06.fm Page 92 Mardi, 23. janvier 2007 5:10 17

92

Chapitre 6. Tests conditionnels

Si le chocolat quon me propose contient plus de 70% de cacao,


Jen prends deux carrs
Sinon
Je refuse poliment en prtextant un rgime.

Linformatique tant assez binaire, il est impratif qu la question


pose, on ne puisse rpondre que par oui ou par non. Dans un test
conditionnel, le programme va valuer une condition logique, cest-dire dterminer si un nonc est vrai ou faux. Dans notre exemple, la
condition logique est :
ce chocolat comporte-t-il plus de 70 % de cacao ?
Dans une macro, les conditions logiques sont bien videmment diffrentes, mais on doit pouvoir nanmoins toujours pouvoir leur assigner la valeur Vrai (True) ou Faux (False). Voici quelques exemples de
conditions logiques :
Age >= 18
Montant = 1000
Prenom = "Dominique"
Jour > Date

If Then Else
En fonction des valeurs assignes aux variables, le programme peut
dcider si chacun de ces noncs logiques est vrai ou faux. Pour raliser un test conditionnel en Visual Basic, on se servira de la commande If Then Else
Afin de mieux comprendre son fonctionnement, vous allez saisir
un petit programme et lexcuter. Si cela nest dj fait, lancez Word
et ouvrez lditeur Visual Basic. Dans la fentre de code, saisissez le
programme suivant :
Sub testcond()
Dim varnum As Byte
varnum = InputBox("Entrez un nombre entier entre 0 et 255")
If varnum Mod 2 = 0 Then
MsgBox ("Ce nombre est pair")
Else
MsgBox ("Ce nombre est impair")
End If
End Sub

Chap06.fm Page 93 Mardi, 23. janvier 2007 5:10 17

Les tests conditionnels

93

Une fois que le programme est saisi, retournez dans Word et


appuyez sur la touche ALT + F8, slectionnez la macro testcond et cliquez sur le bouton Excuter.
Une bote de dialogue saffiche et vous demande de saisir un nombre :

Figure 6.1 La fonction InputBox permet


lutilisateur de saisir une valeur

Quand vous avez cliqu sur le bouton OK, une autre bote de dialogue affiche le rsultat du test conditionnel (le nombre est pair ou
impair).
Expliquons en dtail le fonctionnement de ce programme : la premire ligne dclare une variable de type Byte. La deuxime ligne excute une fonction qui permet de dialoguer avec lutilisateur ; ce
dernier est invit saisir un nombre et la valeur du nombre qui a t
entr est assigne la variable varnum. La troisime ligne est un test
conditionnel ; la formule varnum Mod2 = 0 signifie en clair : est-ce
que le reste de la division par deux du nombre contenu dans la variable varnum est gal zro ? La quatrime ligne nous dit que ce nombre
est pair si la condition logique prcdente est vraie. La cinquime
ligne est un mot cl qui veut dire sinon en anglais. La sixime ligne
nous dit que ce nombre est impair si la condition logique prcdente
est fausse.
Voici la syntaxe de linstruction If Then Else :
If condition logique Then
Instructions excutes si la condition logique est vraie
Else
Instructions excutes si la condition logique est fausse
End If

Chap06.fm Page 94 Mardi, 23. janvier 2007 5:10 17

94

Chapitre 6. Tests conditionnels

Traiter plus de deux choix


Il arrive cependant que le monde ne soit pas aussi binaire et que lon
doive examiner des situations o il y a plus de deux choix possibles.
Que faire sil faut choisir, par exemple, entre 7 possibilits ? Si on
rflchit bien, on se rendra compte que nimporte quel problme, o
il y a plus de deux conditions logiques, peut se rsumer une succession de choix binaires, en procdant par limination successive.
Nous allons mettre cette mthode en uvre dans un programme qui
va dterminer le jour de votre naissance. Comme dans le programme prcdent, on interroge lutilisateur et on stocke sa date de
naissance dans une variable appele vardate. Puis, grce la fonction Weekday (afin de connatre sa syntaxe exacte, consultez laide en
ligne de Visual Basic, partir de lditeur de programmes), nous
dterminons le numro du jour de naissance qui vaut 1 pour dimanche, 2 pour lundi, etc. Pour annoncer en clair lutilisateur le nom
du jour de sa naissance, il faut donc convertir en un jour de la
semaine la variable journaissance qui contient un numro de 1 7.
Nous employons ici la structure If Then mais nous rajoutons le mot
cl ElseIf (Sinon si) qui va permettre denvisager plusieurs cas. En
pseudo-code, cela donnerait :
Si journaissance est gal 1
Vous tes n un dimanche
Sinon si journaissance est gal
Vous tes n un lundi
Sinon si journaissance est gal
Vous tes n un mardi
Sinon si journaissance est gal
Vous tes n un mercredi
Sinon si journaissance est gal
Vous tes n un jeudi
Sinon si journaissance est gal
Vous tes n un vendredi
Sinon
Vous tes n un samedi

2
3
4
5
6

Si on code le programme, on obtient la macro suivante :


Sub testcond2()
Dim vardate As Date, journaissance As Byte
vardate = InputBox _
("Entrez votre date de naissance au format JJ/MM/AAAA")
journaissance = Weekday(vardate)

Chap06.fm Page 95 Mardi, 23. janvier 2007 5:10 17

95

Les tests conditionnels

If journaissance = 1 Then
MsgBox ("Vous tes n un dimanche")
ElseIf journaissance = 2 Then
MsgBox ("Vous tes n un lundi")
ElseIf journaissance = 3 Then
MsgBox ("Vous tes n un mardi")
ElseIf journaissance = 4 Then
MsgBox ("Vous tes n un mercredi")
ElseIf journaissance = 5 Then
MsgBox ("Vous tes n un jeudi")
ElseIf journaissance = 6 Then
MsgBox ("Vous tes n un vendredi")
Else
MsgBox ("Vous tes n un samedi")
End If

Avec cette construction, un seul choix peut tre valid car ds


quune condition a t remplie, le programme excute les actions
situes aprs le mot cl Then puis passe la main la premire instruction qui se trouve en dessous de End If.
Vous noterez que lors de lexamen du dernier cas (journaissance =
7), il nest pas ncessaire dnoncer la condition logique laide dun
ElseIf puisque toutes les autres possibilits ont t limines.
On se servira galement de ce genre de structure de contrle pour
dterminer un nombre ou un libell qui dpend dune plage de
valeurs. Prenons un exemple simple, celui des mentions aux
examens ; il existe cinq plages de valeurs que lon peut lister dans le
tableau suivant :
Moyenne gnrale

Rsultat

< 10

chec

>= 10 et < 12

Mention passable

>= 12 et < 14

Mention assez bien

>= 14 et < 16

Mention bien

>= 16

Mention trs bien

Chap06.fm Page 96 Mardi, 23. janvier 2007 5:10 17

96

Chapitre 6. Tests conditionnels

Si lon veut crire un programme qui dtermine la mention en


fonction de la moyenne gnrale, on peut proposer la macro suivante :
Sub donnemention()
Dim moyenne As Double
moyenne = InputBox _
("Saisissez la moyenne gnrale de l'tudiant")
If moyenne < 10 Then
MsgBox ("L'tudiant a chou son examen")
ElseIf moyenne < 12 Then
MsgBox ("L'tudiant obtient la mention passable")
ElseIf moyenne < 14 Then
MsgBox ("L'tudiant obtient la mention assez bien")
ElseIf moyenne < 16 Then
MsgBox ("L'tudiant obtient la mention bien")
Else
MsgBox ("L'tudiant obtient la mention trs bien")
End If
End Sub

Dans ce genre de programme, vous devez faire particulirement


attention lordre dans lequel les conditions sont nonces. En effet,
si vous commencez par tester la plage suprieure, votre programme
tournera mais les rsultats seront faux car vous ne devez pas oublier
que ds quune condition est remplie, le programme excute les instructions qui sont aprs Then, mais sarrte au premier Else ou ElseIf
suivant pour ne reprendre quaprs le mot cl End If. Il faut donc tre
bien vigilant quand vous employez ce genre de construction qui est
trs utile pour dterminer un nombre en fonction dune plage de
valeurs, lexemple typique tant le calcul du taux dimposition sur le
revenu.

Oprateur logique dans une condition


On peut galement essayer de tester une plage de valeurs en combinant deux conditions, laide dun oprateur logique, comme le
montre le programme suivant :
Sub donnemention2()
Dim moyenne As Double
moyenne = InputBox _
("Saisissez la moyenne gnrale de l'tudiant")
If moyenne < 10 Then
MsgBox ("L'tudiant a chou son examen")

Chap06.fm Page 97 Mardi, 23. janvier 2007 5:10 17

Imbriquer des tests conditionnels

97

ElseIf moyenne >= 16 Then


MsgBox ("L'tudiant obtient la mention trs bien")
ElseIf moyenne >= 12 And moyenne < 14 Then
MsgBox ("L'tudiant obtient la mention assez bien")
ElseIf moyenne >= 10 And moyenne < 12 Then
MsgBox ("L'tudiant obtient la mention passable")
Else
MsgBox ("L'tudiant obtient la mention bien")
End If
End Sub

Dans ce cas-l, lordre des conditions na plus aucune espce


dimportance mais ce genre de programme est sans doute moins lisible.

IMBRIQUER DES TESTS CONDITIONNELS


Le mot cl Else nest pas obligatoire dans une construction If Then,
ce qui signifie quil est possible de tester uniquement la vrit dune
condition sans prvoir daction excuter quand la condition nest
pas remplie comme dans lexemple suivant :
If stock < stock_alerte Then
MsgBox ("Il faut commander cet article !")
End If

Il est galement possible dimbriquer plusieurs tests conditionnels


comme cela est illustr dans lexemple suivant :
' calcul du nombre de jours du mois
' on stocke dans mois le numro du mois (janvier = 1, etc.)
mois = Month(Date)
If mois = 1 Then ' mois de janvier
nbjours = 31
ElseIf mois = 2 Then
' il s'agit du mois de fvrier
' il faut calculer si le mois a 28 ou 29 jours
If Day(DateSerial(Year(Now), 2, 28) + 1) = 29 Then
nbjours = 29
Else
nbjours = 28
End If
ElseIf mois = 3 Then ' mois de mars
nbjours = 31
ElseIf mois = 4 Then ' mois d'avril

Chap06.fm Page 98 Mardi, 23. janvier 2007 5:10 17

98

Chapitre 6. Tests conditionnels

nbjours = 30
ElseIf mois = 5 Then ' mois de mai
nbjours = 31
ElseIf mois = 6 Then ' mois de juin
nbjours = 30
ElseIf mois = 7 Then ' mois de juillet
nbjours = 31
ElseIf mois = 8 Then ' mois d'aot
nbjours = 31
ElseIf mois = 9 Then ' mois de septembre
nbjours = 30
ElseIf mois = 10 Then ' mois d'octobre
nbjours = 31
ElseIf mois = 11 Then ' mois de novembre
nbjours = 30
Else ' mois de dcembre
nbjours = 31
End If

Comme vous laurez compris, ce programme calcule le nombre de


jours du mois en cours et cet extrait pourra nous servir crire un programme de calendrier. Lalgorithme employ ici est trs simple : la
fonction Month renvoie un numro, de 1 12, qui indique le mois. Un
test conditionnel se contente, en fonction du numro du mois, de
renvoyer 30 ou 31 jours. Il y a cependant un problme avec le mois de
fvrier qui peut compter 28 ou 29 jours. Plutt que de calculer si
lanne en cours est une anne bissextile (divisible par 4, pas divisible
par 100 mais divisible par 400), on adopte une autre mthode :
If Day(DateSerial(Year(Now), 2, 28) + 1) = 29 Then

Year(Now) renvoie lanne de la date du jour ; puis la fonction DateSerial(Year(Now), 2, 28) renvoie la date du 28 fvrier de lanne en

cours. Si on ajoute 1 cette date, on obtient soit le 29 fvrier, soit le


1er mars. La fonction Day de cette date renverra donc 29 ou 1. Si elle
renvoie 29, on a donc une anne bissextile et le nombre de jours du
mois de fvrier est bien 29 ; dans le cas contraire, le mois de fvrier a
28 jours.
Vous aurez sans doute remarqu que le bloc If Then qui est imbriqu est dcal vers la droite. On nomme cette pratique indentation et
indenter un bloc de code sert mettre en vidence les diffrents
niveaux des structures de contrle. Cela rend le programme beaucoup
plus lisible et on se rend ainsi bien compte que le test conditionnel est

Chap06.fm Page 99 Mardi, 23. janvier 2007 5:10 17

Select Case

99

un sous-cas du mois de fvrier. Vous pouvez imbriquer plusieurs


niveaux de tests conditionnels.

SELECT CASE
Il existe une autre structure de contrle qui est trs proche du test
conditionnel If Then et qui peut se rvler plus lisible dans certains
cas. Il sagit de la commande Select Case dont voici un exemple
(nous reprenons ici notre programme de calcul du jour de
naissance) :
Sub testselect()
Dim vardate As Date, journaissance As Byte
vardate = InputBox _
("Entrez votre date de naissance au format JJ/MM/AAAA")
journaissance = Weekday(vardate)
Select Case journaissance
Case 1
MsgBox ("Vous tes n un dimanche")
Case 2
MsgBox ("Vous tes n un lundi")
Case 3
MsgBox ("Vous tes n un mardi")
Case 4
MsgBox ("Vous tes n un mercredi")
Case 5
MsgBox ("Vous tes n un jeudi")
Case 6
MsgBox ("Vous tes n un vendredi")
Case Else
MsgBox ("Vous tes n un samedi")
End Select
End Sub

Voici la syntaxe de linstruction Select Case :


Select Case variable
Case valeur1
Instructions excutes si valeur1 est gale variable
Case valeur2
Instructions excutes si valeur2 est gale variable
Case valeur3
Instructions excutes si valeur3 est gale variable
Etc.
Case Else

Chap06.fm Page 100 Mardi, 23. janvier 2007 5:10 17

100

Chapitre 6. Tests conditionnels

Instructions excutes si aucune valeur ne correspond variable


End Select

Vous noterez que le mot cl Case Else est facultatif.


Il est aussi possible de tester plusieurs valeurs la fois et la commande Select Case va nous rendre dans ce cas un grand service si on
reprend notre calcul de nombre de jours dun mois :
' calcul du nombre de jours du mois
' on stocke dans mois le numro du mois (janvier = 1, etc.)
mois = Month(Date)
Select Case mois
Case 1, 3, 5, 7, 8, 10, 12
nbjours = 31
Case 4, 6, 9, 11
nbjours = 30
Case Else
' il s'agit du mois de fvrier
' il faut calculer si le mois a 28 ou 29 jours
If Day(DateSerial(Year(Now), 2, 28) + 1) = 29 Then
nbjours = 29
Else
nbjours = 28
End If
End Select

Cette version est beaucoup plus concise et elle rendra le code du


programme plus lisible. On peut galement indiquer des plages de
valeurs laide du mot cl To et il est possible de cette manire de
coder une variante de notre programme dattribution des mentions :
Sub donnemention3()
Dim moyenne As Double
moyenne = InputBox _
("Saisissez la moyenne gnrale de l'tudiant")
Select Case moyenne
Case 0 To 9.99
MsgBox ("L'tudiant a chou son examen")
Case 10 To 11.99
MsgBox ("L'tudiant obtient la mention passable")
Case 12 To 13.99
MsgBox ("L'tudiant obtient la mention assez bien")
Case 14 To 15.99
MsgBox ("L'tudiant obtient la mention bien")
Case Else
MsgBox ("L'tudiant obtient la mention trs bien")

Chap06.fm Page 101 Mardi, 23. janvier 2007 5:10 17

Select Case

101

End Select
End Sub

Cette version est sans doute plus lisible que lautre et ltendue de
la plage de valeurs apparat plus clairement. Vous noterez que dans
cette construction, lordre des conditions na aucune espce dimportance mme sil parat plus logique de procder dans un ordre croissant ou dcroissant.
Enfin, vous remarquerez que dans lnonciation des plages de
valeurs, le point sert de sparateur dcimal ; en revanche, si vous voulez saisir dans la bote de dialogue une note comportant des dcimales,
vous devez utiliser la virgule comme sparateur sous peine de provoquer une erreur de type.

CONCLUSION
Les tests conditionnels vous permettent rellement de programmer et dinterrompre la squence des instructions. En effet, si le
premier stade de la programmation consiste enregistrer ses
actions afin de pouvoir les rejouer (chapitre 2), l'intelligence du
programmeur se manifeste quand il arrive prvoir tous les cas
possibles. Seuls les tests conditionnels permettent de prendre en
compte la multiplicit des situations. Plus un programme saura
grer des cas diffrents, plus il sera puissant et souple dutilisation.
Le prochain chapitre prsente les boucles qui permettent de programmer simplement et efficacement les invitables rptitions
dans le code des macros.

Chap06.fm Page 102 Mardi, 23. janvier 2007 5:10 17

Chap07.fm Page 103 Mardi, 23. janvier 2007 5:10 17

7
Boucles
Avec les tests conditionnels, les boucles sont lautre grande catgorie de structure de contrle. Comme son nom lindique, une boucle
sert faire tourner en boucle un programme, cest--dire rpter
son excution autant de fois que ncessaire. Cette construction est
essentielle en informatique car de nombreuses tches sont trs rptitives et les boucles vont donc permettre de rationaliser les programmes en les rendant plus concis. Nous allons prsent tudier
les trois types de boucles que sont les commandes For Next, While et
Do Loop.

FOR NEXT
La boucle For Next, quon appelle parfois itration, permet de rpter un bloc dinstructions. Le nombre de rptitions du bloc dinstructions est contrl par une variable qui sert de compteur. On
indique la valeur de dpart et la valeur de fin de ce compteur. Voici
un exemple de programme comportant une boucle :
Sub copie()
For exemplaires = 1 To 100
Selection.TypeText Text:="Vous me le copierez 100 fois" & vbCrLf
Next exemplaires
End Sub

Saisissez ce petit programme dans Word et excutez-le dans un


document vide. Comme vous pourrez le constater, cest encore bien

Chap07.fm Page 104 Mardi, 23. janvier 2007 5:10 17

104

Chapitre 7. Boucles

mieux que le copier-coller ! En effet, la macro recopie une centaine de


fois lnonc qui est entre guillemets et insre la fin de chaque ligne
un saut de ligne (cest le rle de la constante vbCrLf). La syntaxe de la
boucle For Next est extrmement simple :
For variable = valeur de dpart To valeur de fin
Bloc dinstructions rpter
Next variable

Les boucles For Next sont vraiment trs utiles et elles permettent
de gagner un temps considrable quand on veut gnrer automatiquement des listes. Si lon souhaite, par exemple, obtenir avec Word une
table des caractres ASCII (American Standard Code for Information
Interchange), un programme de cinq lignes fera laffaire comme le
montre lexemple suivant :
Sub tableascii()
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=12, NumColumns:= 19, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
' on n'imprime pas les codes infrieurs 32
For codeascii = 32 To 255
Selection.TypeText Text:=Chr(codeascii)
Selection.MoveRight Unit:=wdCell
Next codeascii
End Sub

La premire ligne du programme insre un tableau de 12 lignes et


de 19 colonnes. Elle a t gnre par lenregistreur de macro, ce qui
nous vite dapprendre la syntaxe de la commande dinsertion dun
tableau dans Word. Vous serez sans doute tonn de voir que le programme annonc de 5 lignes en compte en ralit 8. En fait, les quatre
premires lignes nen forment quune seule et le caractre de soulignement (_) prcd dun espace indique que la ligne de programme se
poursuit sur la ligne suivante si bien que ces quatre lignes physiques ne
forment donc quune seule ligne logique. Ce caractre, appel caractre de continuit de ligne, est utilis pour des raisons videntes de
lisibilit. Certaines lignes de programme peuvent tre relativement
longues et ne sont pas affiches lcran en totalit ; pour visualiser
ou modifier les lignes importantes, il faut alors utiliser les barres de
dfilement horizontales, ce qui nest gure pratique. On peut dcouper une ligne peu prs nimporte o, la seule rgle tant de ne pas

Chap07.fm Page 105 Mardi, 23. janvier 2007 5:10 17

For Next

105

dcouper les chanes de caractres, cest--dire le texte encadr par


des guillemets ou des apostrophes (par exemple, "Jeudi" ou Vendredi). Il vaut mieux cependant essayer de dcouper logiquement les
lignes. Lenregistreur de macro utilise galement le caractre de soulignement pour dcouper les lignes, mais il ne tient aucun compte de la
logique du programme. Ainsi, le code gnr pour linsertion du
tableau se prsente de la manire suivante :
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=12,
NumColumns _
:=19, DefaultTableBehavior:=wdWord9TableBehavior,
AutoFitBehavior:= _
wdAutoFitFixed

Dans ces conditions, il est prfrable de redcouper la ligne comme


nous lavons fait en isolant sur chaque ligne les phases logiques de
linstruction. Mais retournons lobjet principal de notre macro : la
rptition dune commande.
La boucle For Next imprime tous les caractres ASCII de la table
de 32 255. Le code 32 est celui de lespace et les codes infrieurs 32
ne sont pas imprimables puisquil sagit de caractres de contrle. La
fonction Chr renvoie un caractre ASCII quand on lui donne un code
en paramtre. Lexcution de ce programme permet dobtenir le rsultat suivant :

Figure 7.1 Gnration dune table ASCII laide dune boucle

Pour connatre le nombre de rptitions (ou ditrations), il faut


faire la diffrence entre la valeur de fin et la valeur de dpart puis
ajouter 1. Dans notre exemple, il y a (255 32) + 1 itrations.

Chap07.fm Page 106 Mardi, 23. janvier 2007 5:10 17

106

Chapitre 7. Boucles

Vous trouverez ci-dessous un autre exemple de boucle qui imprime


une table de conversion de francs en euros. Encore une fois, le programme est excessivement simple et produit un rsultat rapide :
Sub tableuro()
' Insertion d'un tableau de 100 lignes et 2 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=100, NumColumns:= 2, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
' on imprime un tableau de conversion de francs en euros
' remplissage des en-ttes de colonne
Selection.TypeText Text:="Franc"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Euro"
Selection.MoveRight Unit:=wdCell
For francs = 1 To 100
Selection.TypeText Text:=francs
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=francs / 6.55957
Selection.MoveRight Unit:=wdCell
Next francs
End Sub

La figure 7.2 illustre un extrait de ce tableau ralis sous Word.

Figure 7.2 Gnration dun tableau


de conversion laide dune boucle

Chap07.fm Page 107 Mardi, 23. janvier 2007 5:10 17

For Next

107

Lintroduction du mot cl Step dans la syntaxe de la boucle For


Next peut donner des rsultats intressants. Dans tous les exemples
que nous avons vus, la variable compteur voluait dune unit chaque fois (on dit quelle sincrmentait dune unit ou bien que la
valeur de lincrment tait 1) ; il est possible avec le mot cl Step de
prciser la valeur de lincrment. On peut ainsi reprendre notre programme de table de conversion en euros pour calculer des valeurs de
1 franc 1 000 francs par pas de 10 :
Sub tableuro2()
' Insertion d'un tableau de 100 lignes et 2 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=100, NumColumns:= 2, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
' on imprime un tableau de conversion de francs en euros
' remplissage des en-ttes de colonne
Selection.TypeText Text:="Franc"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Euro"
Selection.MoveRight Unit:=wdCell
For francs = 10 To 1000 Step 10
Selection.TypeText Text:=francs
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=francs / 6.55957
Selection.MoveRight Unit:=wdCell
Next francs
End Sub

Il est mme possible de prciser une valeur dcimale pour lincrment et si lon souhaite faire cette fois-ci une table de conversion
deuros en francs, on peut imaginer le programme suivant :
Sub tableuro3()
' Insertion d'un tableau de 100 lignes et 2 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=100, NumColumns:= 2, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
' on imprime un tableau de conversion d'euros en francs
' remplissage des en-ttes de colonne
Selection.TypeText Text:="Euro"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Franc"
Selection.MoveRight Unit:=wdCell
For euros = 0 To 10 Step 0.1

Chap07.fm Page 108 Mardi, 23. janvier 2007 5:10 17

108

Chapitre 7. Boucles

Selection.TypeText Text:=euros
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=euros * 6.55957
Selection.MoveRight Unit:=wdCell
Next euros
End Sub

Figure 7.3 Utilisation dun incrment


dcimal dans une boucle

Nous attirons votre attention sur le fait quil est trs fortement
dconseill de modifier la valeur de la variable compteur lintrieur
de la boucle car vous risquez des rsultats inattendus ou bien une boucle infinie. Comme son nom lindique, une boucle infinie est une
boucle qui ne se termine jamais. La macro suivante, si vous lexcutez,
ne sarrtera qu la prochaine grve dEDF...
Sub boucle_infinie()
' Insertion d'un tableau de 100 lignes et 2 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=100, NumColumns:= 2, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
' on imprime un tableau de conversion de francs en euros
Selection.TypeText Text:="Franc"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Euro"
Selection.MoveRight Unit:=wdCell
For francs = 1 To 100

Chap07.fm Page 109 Mardi, 23. janvier 2007 5:10 17

109

For Next

Selection.TypeText Text:=francs
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=francs / 6.55957
Selection.MoveRight Unit:=wdCell
francs = francs - 1
Next francs
End Sub

Une telle macro ne sarrte jamais car la variable compteur francs


est modifie lintrieur de la boucle (francs = francs 1) juste
avant dtre incrmente ce qui a pour effet quelle garde toujours la
mme valeur, savoir 1. Pour arrter une boucle infinie, il suffit
dappuyer sur les touches CTRL + PAUSE ce qui fait apparatre la bote
de dialogue suivante :

Figure 7.4 Arrt dune macro


l'aide des touches CTRL + PAUSE

Vous avez alors la possibilit darrter lexcution du programme


(bouton Fin) ou bien de modifier le code du programme dans lditeur
(bouton Dbogage).

Sortir de la boucle
Mme si lon a parfaitement prvu tout ce qui pouvait se passer, il
peut cependant tre utile de se rserver une porte de sortie, cest-dire la possibilit dinterrompre la boucle. Le mot cl Exit For plac
lintrieur dune boucle For Next permet de quitter la boucle et
passe la main l'instruction situe immdiatement aprs la commande Next. En gnral, il convient de prvoir un test conditionnel
qui va valuer une condition qui, si elle est remplie, fera sortir de la
boucle.

Chap07.fm Page 110 Mardi, 23. janvier 2007 5:10 17

110

Chapitre 7. Boucles

Voici un programme qui illustre cette technique :


Sub nombresecret()
Dim x As Byte
Dim y As Byte
' Initialise le gnrateur de nombres alatoires
Randomize
' x est nombre tir au hasard qu'il faut deviner
x = Int((99 * Rnd) + 1)
MsgBox _
("J'ai choisi un nombre de 1 100 que vous devez deviner." _
+ Chr(13) _
+ "Quand vous tapez un nombre, je vous dis s'il est plus grand"
_
+ Chr(13) _
+ "ou plus petit que le nombre secret." + Chr(13) _
+ "Vous avez 10 essais pour trouver ce nombre.")
For i = 1 To 10
y = InputBox("Entrez un nombre entre 1 et 100")
If y = x Then
MsgBox ("Bravo, vous avez trouv le nombre secret !")
Exit For
ElseIf y > x Then
MsgBox ("Trop grand !")
Else
MsgBox ("Trop petit !")
End If
Next i
If i = 11 Then
MsgBox ("Vous n'avez pas russi trouver en 10 coups !")
End If
End Sub

Figure 7.5 Si la solution est trouve,


le programme doit sortir de la boucle

Tout le monde connat ce clbre jeu o il faut trouver un nombre


secret. Le jeu prvoit dans notre exemple que lon a droit dix rponses possibles (ce qui est largement suffisant si on connat la mthode
du tri dichotomique...). Si la rponse est trouve en moins de dix

Chap07.fm Page 111 Mardi, 23. janvier 2007 5:10 17

While Wend

111

coups, il faut bien pouvoir sortir de la boucle ; pour cela, on inclut une
commande Exit For si la rponse est trouve (condition y = x). Vous
noterez galement quen sortie de la boucle, la variable compteur est
gale la borne de fin de la boucle augmente de la valeur de lincrment (dans notre exemple 10 +1). Connatre cette valeur peut tre
important et nous permet de savoir que notre joueur na pas pu trouver le nombre secret en dix tentatives.

WHILE WEND
La commande While Wend est un type de boucle trs simple o le
nombre de rptitions est contrl grce une condition. Imaginons
une macro Word qui trace le calendrier du mois en cours ; nous
allons nous servir dune boucle pour inscrire les jours dans un
tableau Word :
Sub calendrier()
' Dclaration des variables
Dim premier As Variant ' le premier jour du mois
Dim jour As Integer
jour = 1
' insertion d'un tableau de 6 lignes et 7 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range,
NumRows:=6, NumColumns:= _
7, DefaultTableBehavior:=wdWord9TableBehavior,
AutoFitBehavior:= _
wdAutoFitFixed
' on remplit les en-ttes du tableau avec les noms des jours
Selection.TypeText Text:="Lundi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mardi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mercredi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Jeudi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Vendredi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Samedi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Dimanche"
' calcul du premier jour du mois
premier = Weekday((Date - Day(Date) + 1), vbMonday)

Chap07.fm Page 112 Mardi, 23. janvier 2007 5:10 17

112

Chapitre 7. Boucles

' on se dplace sur le premier jour


Selection.MoveRight Unit:=wdCell, Count:=premier
' grce une boucle, on remplit le tableau automatiquement
While jour < 32
Selection.TypeText Text:=Str(jour)
Selection.MoveRight Unit:=wdCell
jour = jour + 1
Wend
End Sub

La commande While Wend rpte les instructions tant que la condition (ici jour < nbjours + 1) est vraie. Si lon voulait exprimer cela
en pseudo-code, cela donnerait :
Tant que la variable jour est infrieure au nombre du jour du
mois + 1
Ecrire jour dans la cellule
Se dplacer dune cellule vers la droite
Augmenter jour dune unit
Fin de la boucle

La syntaxe de la commande While Wend est :


While condition
Bloc dinstructions rpter si la condition est vraie
Wend

La condition est une condition logique et elle est similaire aux conditions que nous avons rencontres dans la commande If Then. Le
bloc dinstructions compris entre While et Wend est rpt tant que la
condition est vraie. Si la condition nest pas vraie, aucune instruction
nest excute comme le montre le programme suivant :
Sub boucle1()
While x
Beep
Wend
End Sub

Linstruction Beep (qui met un signal sonore) nest pas excute


car x est une variable qui na pas t initialise la valeur True.
En revanche, si on crit le programme suivant :
Sub boucle2()
Dim x
x = True

Chap07.fm Page 113 Mardi, 23. janvier 2007 5:10 17

While Wend

113

While x
Beep
Wend
End Sub

le programme fonctionne parfaitement et sans doute mme trop


bien puisquil ne sarrte jamais (CTRL + PAUSE si vous voulez pargner vos oreilles). On se trouve ici en prsence dune boucle infinie
car la condition nest jamais modifie lintrieur de la boucle. Pensez
toujours bien vrifier que la condition dentre dans la boucle est
susceptible de devenir fausse, sinon votre programme narrivera
jamais sortir de la boucle. Le programme ci-dessous pourra attirer
lattention de vos utilisateurs :
Sub boucle3()
Dim compteur
compteur = 1
While compteur < 20
Beep
compteur = compteur + 1
Wend
End Sub

Dans ce cas, le programme sort bien de la boucle car la variable


compteur est bien incrmente au sein de la boucle.

Il est possible dimbriquer les boucles While Wend comme le montre


la macro suivante qui imprime une table de multiplication :
Sub tabmult()
Dim x As Byte
Dim y As Byte
x = 1
y = 1
' Insertion d'un tableau de 11 lignes et 11 colonnes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=11, NumColumns:=11, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed
' Remplissage des en-ttes de colonnes
For i = 1 To 10
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=i
Next i
Selection.MoveRight Unit:=wdCell
' La premire boucle imprime les chiffres de la premire colonne

Chap07.fm Page 114 Mardi, 23. janvier 2007 5:10 17

114

Chapitre 7. Boucles

While x < 11
Selection.TypeText Text:=x
Selection.MoveRight Unit:=wdCell
' la deuxime boucle imprime le rsultat des multiplications
While y < 11
Selection.TypeText Text:=x * y
Selection.MoveRight Unit:=wdCell
y = y + 1
Wend
x = x + 1
' on passe la colonne suivante
y = 1
' on rinitialise le compteur
Wend
End Sub

Notez lindentation de la deuxime boucle au sein de la premire


afin de bien marquer limbrication.
Il est en revanche impossible de sortir dune boucle While Wend
comme nous avons pu le faire avec le mot cl Exit dans une boucle
For Next. Ceci est une limitation importante et si vous avez besoin
dune telle fonctionnalit, vous emploierez alors la boucle Do Loop que
nous allons tudier prsent.

DO LOOP
La commande Do Loop est une commande de boucle beaucoup plus
volue que la commande While Wend et elle permet un meilleur
contrle du programme. Il faudra donc privilgier son utilisation par
rapport celle de While Wend qui ne convient que dans des cas trs
simples et sans embches.
Pour tudier cette commande, nous allons avoir recours laide en
ligne de Visual Basic ; non pas parce que cette aide lectronique est un
modle du genre, mais parce que cest souvent le seul document de
rfrence dont vous disposez, tant donn que les logiciels ne sont
plus livrs avec une documentation papier. Le but dun tel livre nest
pas dtre une version imprime de laide lectronique et il vous faudra donc parfois consulter la documentation en ligne pour trouver des
informations importantes qui ne sont pas disponibles dans cet
ouvrage. Nous sommes malheureusement bien obligs de constater

Chap07.fm Page 115 Mardi, 23. janvier 2007 5:10 17

115

Do Loop

que bien souvent laide en ligne naide pas beaucoup. En effet, la terminologie qui y est employe est souvent absconse et le principal
reproche que lui font les dbutants est quils ny comprennent pas
grand-chose. Nous allons donc tenter, dans les pages qui suivent, de
dbroussailler cette phrasologie car vous allez forcment, un
moment ou un autre, tre dans lobligation dappuyer sur la
touche F1 qui invoque le systme daide. Vous devez ce sujet savoir
que laide en ligne est contextuelle ce qui signifie que quand vous tes
en train de taper un programme dans lditeur, il suffit que vous slectionniez le mot cl Loop et que vous appuyiez sur la touche F1 pour
voir apparatre les informations suivantes :
Do...Loop, instruction : rpte un bloc dinstructions aussi longtemps quune condition est vraie (True) ou jusqu ce quune condition devienne vraie (True).
Syntaxe
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop

Vous pouvez galement utiliser la syntaxe suivante :


Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]

La syntaxe de linstruction Do Loop comprend les lments suivants :


lment

Description

condition

Facultatif. Expression numrique ou expression de chane vraie (True)


ou fausse (False). Si la valeur de condition est Null, elle est considre
comme fausse (False).

statements

Une ou plusieurs instructions rptes tant que condition est True, ou


jusqu' ce qu'elle le devienne.

Chap07.fm Page 116 Mardi, 23. janvier 2007 5:10 17

116

Chapitre 7. Boucles

Commenons dj par expliquer quelques termes importants. Le


terme statement est un terme anglais qui signifie commande ou instruction et nous dirons donc que le traducteur na pas trs bien fait son
travail et quun bon quivalent serait bloc dinstructions. Un autre
lment trs important pour comprendre la syntaxe est la barre verticale quon retrouve dans While | Until. Cette barre signifie que vous
devez obligatoirement employer un des deux mots cls placs de chaque ct de la barre. Les lments entre crochets indiquent des lments facultatifs. Si vous avez bien suivi, linstruction :
Do [{While | Until} condition] peut se dcliner selon trois possibilits :
Do
Do While condition
Do Until condition
En possession de ces lments, vous pouvez dduire que cette commande peut donc revtir les quatre formes suivantes :
Do [While condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Do [Until condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [While condition]

Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [Until condition]

Il y a en fait encore plus de combinaisons puisque les lments


entre crochets sont facultatifs.

Expression logique
Laide en ligne nous prcise galement que la condition dune boucle
Do Loop est une expression numrique ou une expression de chane
vraie (True) ou fausse (False). Nous avons dj tudi le concept
dexpression, mais il faut en fait ici comprendre expression numri-

Chap07.fm Page 117 Mardi, 23. janvier 2007 5:10 17

117

Do Loop

que vraie ou fausse ou bien expression de chane vraie ou fausse .


Ceci est cependant un abus de langage car les expressions X > 2 et
Nom = "MARTIN" , mme si elles contiennent respectivement un
nombre et une chane de caractres nen demeurent pas moins des
expressions logiques puisque lvaluation de la formule donne bien un
rsultat logique qui ne peut tre que vrai ou faux. Il faut donc bien
garder lesprit quune condition logique doit imprativement pouvoir tre value vrai ou faux. Sil est facile de dterminer le caractre vrai ou faux dune expression telle que 15 >10, certaines
expressions peuvent tre trs complexes ou bien dconcertantes.
Vous essayerez ce sujet le petit programme suivant et puis vous remplacerez ensuite la valeur 10 par 0 puis par 1 :
If 10 Then
Beep
Else
MsgBox ("Faux")
End If

Null
Laide en ligne nous prcise aussi que si la valeur de condition est
Null, elle est considre comme fausse (False). Quel est donc ce mot
cl Null ? Null ne sapplique quaux variables de type Variant et indique que la variable ne contient aucune donne valide. Si vous
essayez dinitialiser une variable dun autre type que Variant avec la
valeur Null, comme dans lextrait suivant :
Dim var As String
var = Null

Vous obtiendrez le message derreur illustr la figure 7.6.

Figure 7.6 Null ne s'applique


qu'aux variables de type Variant

Chap07.fm Page 118 Mardi, 23. janvier 2007 5:10 17

118

Chapitre 7. Boucles

Une variable de type Variant contient la valeur Null quand on lui a


affect cette valeur ou bien quand on lui a affect une expression qui
contient la valeur Null. Il peut tre trs important dans un programme
de tester si une variable contient la valeur Null. On pourrait penser de
prime abord que la simple comparaison de la variable avec Null suffit
mais pour vous persuader du contraire, nous vous conseillons dexcuter le programme suivant :
Sub testnull()
Dim var As Variant
var = Null
If var = Null Then
MsgBox ("var = Null est vrai")
Else
MsgBox ("var = Null est faux")
End If
End Sub

Vous serez sans doute tonn de voir que var = Null est considr
comme faux.
Si vous voulez savoir si une variable Variant contient Null, il faut
utiliser la fonction IsNull comme dans ce programme :
Sub testnull2()
Dim var As Variant
var = Null
If IsNull(var) = True Then
MsgBox ("IsNull(var) est vrai")
Else
MsgBox ("IsNull(var) est faux")
End If
End Sub

Cette fois-ci, la condition IsNull(var) = True est bien vraie. Vous


noterez ce sujet que dans la mesure o le rsultat de la fonction est
True, la formule est redondante et que ce programme fonctionne tout
aussi bien si on crit le test conditionnel comme ceci :
If IsNull(var) Then

Empty
Mais sil est important de savoir si une variable contient des donnes valides, il est aussi frquent de vouloir dterminer si une varia-

Chap07.fm Page 119 Mardi, 23. janvier 2007 5:10 17

Gare aux boucles infinies

119

ble nest pas vide, cest--dire contient des donnes. Et il ne faut pas
confondre le concept de vide et le concept de Null. Une variable
Variant qui na pas t initialise contiendra la valeur Empty (qui
signifie vide en anglais) que lon peut dtecter laide de la fonction
IsEmpty. Pour bien voir la diffrence entre Null et Empty, excutez le
programme suivant :
Sub testnull3()
Dim var As Variant
If IsNull(var) Then
MsgBox ("IsNull(var) est vrai")
Else
MsgBox ("IsNull(var) est faux")
End If
If IsEmpty(var) Then
MsgBox ("IsEmpty(var) est vrai")
Else
MsgBox ("IsEmpty(var) est faux")
End If
End Sub

Retenez bien que Null et Empty ne sappliquent quaux variables


Variant. Le concept de Null nexiste pas pour les autres types de donnes. En revanche, on parlera souvent de chane de caractres vide ; le
code suivant initialise une chane vide :
Dim var As String
var = ""

Le fait dinitialiser une variable caractre avec deux guillemets cre


donc une chane de caractres vide, mais la fonction IsEmpty sera dans
ce cas inoprante.

GARE AUX BOUCLES INFINIES


En examinant la syntaxe de la commande Do Loop, on peut stonner
du caractre facultatif de la condition. On peut donc envisager une
version minimale de boucle qui scrirait :
Do
[bloc dinstructions]
Loop

Chap07.fm Page 120 Mardi, 23. janvier 2007 5:10 17

120

Chapitre 7. Boucles

Bien videmment, une telle boucle tournerait sans arrt et naurait


aucun intrt. Il faut donc prvoir au minimum une clause de sortie
grce au mot cl Exit Do. Cette construction est en fait assez courante
et dans le cadre dun dialogue avec un utilisateur, il nest pas rare de
rentrer dans une boucle infinie et de donner la possibilit lutilisateur de sortir de la boucle en saisissant une valeur particulire. Le programme suivant illustre cette possibilit :
Sub naissance()
Dim vardate As Variant, journaissance As Byte
Do
vardate = InputBox _
("Entrez votre date de naissance au format JJ/MM/AAAA" _
+ Chr(13) + "Tapez 0 pour quitter le programme.")
If vardate = 0 Then
Exit Do
End If
journaissance = Weekday(vardate)
Select Case journaissance
Case 1
MsgBox ("Vous tes n un dimanche")
Case 2
MsgBox ("Vous tes n un lundi")
Case 3
MsgBox ("Vous tes n un mardi")
Case 4
MsgBox ("Vous tes n un mercredi")
Case 5
MsgBox ("Vous tes n un jeudi")
Case 6
MsgBox ("Vous tes n un vendredi")
Case Else
MsgBox ("Vous tes n un samedi")
End Select
Loop
End Sub

Figure 7.7 Linstruction Exit Do


permet de sortir de la boucle

Chap07.fm Page 121 Mardi, 23. janvier 2007 5:10 17

121

Diffrences entre While et Until

La commande Exit Do passe la main linstruction qui suit immdiatement linstruction Loop ce qui, dans notre exemple, met un terme
au programme. Quand les instructions DoLoop sont imbriques, le
contrle est transfr linstruction DoLoop situe un niveau audessus de la boucle dans laquelle linstruction Exit Do apparat.

DIFFRENCES ENTRE WHILE ET UNTIL


While signifie tant que en anglais et Until jusqu ce que ; il faut donc
comprendre chaque variante de la boucle Do Loop de la manire suivante :
Do [While condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Do [Until condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Faire tant que la condition est vraie


[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Faire jusqu ce que la condition soit vraie


[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop

Pour bien voir la diffrence entre ces deux constructions, tudions


en parallle deux petits programmes :
Sub while1()
i=1
Do While i < 3
MsgBox (i)
i=i+1
Loop
End Sub

Sub until1()
i=1
Do Until i > 3
MsgBox (i)
i=i+1
Loop
End Sub

La macro while1 va afficher dans une bote de message 1 puis 2 ; la


macro until1 va afficher dans une bote de message 1, 2 et 3. La diffrence dans ces deux programmes est quavec While la condition doit
tre vraie pour rentrer dans la boucle tandis quavec Until elle doit

Chap07.fm Page 122 Mardi, 23. janvier 2007 5:10 17

122

Chapitre 7. Boucles

tre fausse, linverse tant vrai pour sortir de la boucle. Il existe des cas
o une boucle Do While paratra plus naturelle quune boucle Do Until,
mais il faut bien se rendre compte quon peut transformer nimporte
quelle boucle Do While en boucle Do Until (et vice versa) en jouant
sur la formulation de la condition.
Lautre variante de ces boucles propose que la condition soit value la fin de la boucle, ce qui donne :
Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [While condition]

Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [Until condition]

Faire
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Boucler tant que la condition est
vraie

Faire
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Boucler jusqu ce que la condition soit
vraie

La grande diffrence avec la prcdente formulation est que le bloc


dinstructions est au moins excut une fois, mme si la condition
nest pas remplie comme le montrent les programmes suivants :
Sub while2()
i=1
Do
MsgBox (i)
i=i+1
Loop While i > 3
End Sub

Sub until2()
i=1
Do
MsgBox (i)
i=i+1
Loop Until i < 3
End Sub

Dans les deux cas, le programme affiche la valeur de i puis sarrte


parce que la condition nest pas remplie.
En fonction des objectifs de votre programme et de sa logique, vous
choisirez tel ou tel type de boucle. Les boucles sont une aide trs prcieuse et nous les utiliserons trs souvent dans nos programmes. Ds
quil sagit de faire une opration de recherche/remplace dans un

Chap07.fm Page 123 Mardi, 23. janvier 2007 5:10 17

Diffrences entre While et Until

123

document Word, une boucle simpose. De mme si on veut balayer


tous les enregistrements dune table Access ou bien faire du calcul itratif dans une feuille Excel.

CONCLUSION
La matrise des structures de contrle est un pralable indispensable toute programmation et cest justement ce qui va faire la
diffrence avec lenregistreur de macros qui ne peut transcrire
que des actions parfaitement squentielles. Tout lart du programmeur consistera faire gnrer par lenregistreur de macros
le code qui peut ltre pour ensuite le modifier en y ajoutant les
structures de contrle appropries.
Pour bien dominer les tests conditionnels et les boucles, il est
important de sentraner et pour ce faire, lexcution des programmes lists dans cette leon est un minimum. Mme si ces
programmes vous sont fournis, il nest pas inutile de les retaper,
ne serait-ce que pour vous familiariser avec lditeur de code.
Nhsitez pas pour progresser modifier ces programmes et tester toutes les ides qui vous passent par la tte. Vous vous tromperez certainement de trs nombreuses fois, mais cest comme
cela que vous avancerez. Il ne faut surtout pas craindre de lancer
les programmes, mme les plus simples, car quand on dbute, lire
un programme ne suffit pas toujours et il vaut mieux vrifier
quon a bien compris son rle en lexcutant. Prenez garde aux
boucles infinies et souvenez-vous que CTRL + PAUSE permet de se
sortir dune boucle infernale.
Nous avons enfin, dans ce chapitre, tent dapprivoiser laide en
ligne ; de manire assez paradoxale, plus vous progresserez en
programmation, plus vous y aurez recours et il vaut donc mieux,
aussitt que possible, essayer de percer le mystre du jargon des
informaticiens.

Chap07.fm Page 124 Mardi, 23. janvier 2007 5:10 17

Chap08.fm Page 125 Mercredi, 24. janvier 2007 5:17 17

8
Procdures et fonctions

Nous avons vu dans le chapitre 3 ce qutait un projet. Les projets


correspondent en fait aux documents eux-mmes (fichier Word,
fichier Excel ou base de donnes Access) et permettent au programmeur dy insrer son code. Normal.dot (pour Word ou Normal.dotm
pour Word 2007) et Perso.xls (pour Excel ou Personal.xlsb pour
Excel 2007) sont des projets un peu particuliers dans la mesure o le
code contenu dans ces fichiers peut tre excut respectivement par
tous les documents Word et Excel. Il nexiste pas ce genre de fichier
pour Access et Outlook ne possde quun seul projet (VBAProject.OTM).
lintrieur dun projet, le code est stock dans des modules.
Quand vous enregistrez une macro Word ou Excel, un module est
insr automatiquement (il a pour nom NewMacros dans Word et
Module1 dans Excel). Vous pouvez modifier le nom de ces modules en
affichant la fentre Proprits (touche de fonction F4) dans lditeur
de programmes. Vous pouvez galement insrer un module en faisant
un clic droit dans lExplorateur de projets puis en choisissant la commande InsertionModule. Si vous avez peu de code, vous avez intrt stocker vos programmes dans un seul module. Si, au contraire,
vous avez de nombreuses fonctions et procdures, vous avez sans
doute intrt crer plusieurs modules afin dorganiser de manire
thmatique vos programmes.

Chap08.fm Page 126 Mercredi, 24. janvier 2007 5:17 17

126

Chapitre 8. Procdures et fonctions

Vous verrez apparatre dans lditeur de programmes le terme


module de classe. Un module de classe sert crer des objets
qui peuvent ensuite tre manipuls par le programmeur. Cet
aspect de la programmation dpasse le cadre de cet ouvrage et
nous ne lvoquerons pas. Avant de vous attaquer aux modules
de classe, commencez par matriser les bases de la programmation VBA.
Dans un module, le programmeur crit son code qui peut revtir
plusieurs formes. Dans ce chapitre, nous allons voir la diffrence quil
y a entre procdure et fonction puis nous prsenterons les fonctions
intgres de Visual Basic. Pour finir, nous apprendrons crer une
fonction personnalise.

PROCDURES ET FONCTIONS
Si vous avez bien suivi, vous savez quun programmeur crit son
code dans un module qui est stock lintrieur dun projet. Dans un
module, le code scrit dans une procdure. Il existe deux sortes de
procdures : les procdures Sub et les procdures Function. Les procdures Sub, parfois appeles sous-routines, commencent par le mot cl
Sub et se terminent par End Sub. Les macros que nous avons dj
cres grce lenregistreur taient toutes des procdures Sub.
Les fonctions commencent par le mot cl Function et se terminent
par End Function. Par souci de simplification, bon nombre dauteurs
parlent de procdure pour dsigner une procdure Sub et de fonction
pour dsigner une procdure Function. Nous adopterons galement
cette dnomination dans la suite de cet ouvrage.
La grande diffrence entre les procdures et les fonctions est que les
procdures ne renvoient pas de rsultat. En gnral, les procdures
nont pas de paramtres et si vous souhaitez crer une procdure qui
possde des arguments, nous vous conseillons de la transformer en
fonction.
Les procdures peuvent tre excutes partir du menu
OutilsMacrosMacro, dune icne, dun raccourci clavier, dun

Chap08.fm Page 127 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

127

menu (cr en VBA) ou bien encore dun formulaire. En revanche,


les fonctions ne peuvent tre excutes qu lintrieur dune procdure. Vous noterez quon peut appeler une procdure partir dune
autre procdure.

SYNTAXE DUNE FONCTION


Au cours des diffrents programmes que nous avons crits, nous
avons dj rencontr plusieurs fonctions. De plus, tous les utilisateurs dExcel connaissent la fonction SOMME() si bien que ceux
qui travaillent avec Office savent plus ou moins ce quest une fonction.
Mme si cela nest pas trs connu, les utilisateurs de Word peuvent aussi utiliser des fonctions, notamment dans les tableaux,
grce la commande TableauFormuleInsrer la fonction.
En ce sens, les fonctions sont galement trs proches des fonctions
que vous avez pu tudier lors de vos cours de mathmatiques au lyce :
on fournit un paramtre la fonction qui renvoie un rsultat. Une fonction est donc un programme qui traite des informations fournies par
lutilisateur ; une fois le traitement des donnes achev, les informations
transformes sont retournes lutilisateur. Par exemple, dans le cas de
la fonction Excel SOMME(), les informations fournies la fonction par
lutilisateur sont ladresse dune plage de cellules. Le programme de la
fonction a pour mission de faire la somme des valeurs contenues dans la
plage de cellules et de renvoyer le rsultat lutilisateur.
On dit quune fonction reoit des paramtres (ou arguments) et
quelle renvoie une valeur de retour. Quand on excute une fonction,
on dit quon appelle une fonction ou bien que lon fait un appel de fonction.
La syntaxe normale dappel de fonction est :
Variable = Nom_de_fonction(Arguments)

Variable est le nom de la variable qui va recevoir la valeur de retour


de la fonction. Nom_de_fonction est une fonction interne de Visual

Chap08.fm Page 128 Mercredi, 24. janvier 2007 5:17 17

128

Chapitre 8. Procdures et fonctions

Basic ou bien une fonction dfinie par lutilisateur. Arguments est une
liste darguments qui peut tre compose de variables, de constantes
ou de valeurs littrales.
Voici un exemple dappel de la fonction Mid qui permet dextraire
une chane de caractres partir dune autre chane.
Sub extrait()
Dim insee As String
Dim departement As String
insee = "1721171094076"
departement = Mid(insee, 6, 2)
MsgBox (departement)
End Sub

Le programme commence par dclarer deux variables String puis


initialise la variable insee avec une chane de caractres reprsentant
un numro Insee. La ligne suivante appelle la fonction Mid avec trois
arguments et la dernire ligne affiche la variable dans laquelle la fonction a renvoy la valeur de retour.
Telle quelle est appele, la fonction Mid extrait 2 caractres partir du 6me caractre dans la chane insee ce qui donne comme rsultat
"71" ; ce nombre reprsente le numro du dpartement de naissance
de la personne qui possde ce numro Insee. Pour utiliser la fonction
Mid, il est prfrable de connatre sa syntaxe et notamment la liste des
arguments ainsi que leur ordre. Mais ce nest pas totalement obligatoire car lditeur de Visual Basic nous procure une aide prcieuse en
la matire. En effet, quand vous saisissez dans lditeur de programmes
un nom de fonction interne, ds que vous ouvrez la parenthse qui
dlimite la liste des arguments, Visual Basic affiche une info-bulle qui
vous donne des renseignements trs importants :

Figure 8.1 La saisie du nom dune fonction


dclenche laffichage dune info-bulle

Chap08.fm Page 129 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

129

Cette info-bulle nous indique que le premier argument de la fonction Mid est une chane de caractres (String). Le paramtre qui est
indiqu en gras est celui que vous devez saisir. Ds que vous avez fini
de saisir le premier paramtre et que vous avez tap une virgule, linfobulle est modifie et le deuxime paramtre passe en gras.
Cette information nous dit que le deuxime paramtre est un
nombre (As Long) et quil sagit de la valeur de dpart de lextraction de la chane (Start = dpart en anglais). Il en va de mme pour
le troisime paramtre ds quon a fini de saisir le deuxime. Linfobulle nous indique cette fois-ci quil sagit dune longueur (Length
en anglais) et comme ce paramtre apparat entre crochets, cela
signifie quil est facultatif. Vous apprendrez en consultant laide en
ligne que si le dernier paramtre est omis, toute la chane, partir de
la position de dpart dextraction, est renvoye.

Figure 8.2 Les arguments facultatifs


apparaissent entre crochets

Cette fonctionnalit documentaire est extrmement pratique,


surtout quand vous dbutez lapprentissage de Visual Basic. Elle vous
dispense de connatre de manire rigoureuse la syntaxe complte des
fonctions et vous vous contenterez, dans un premier temps, de connatre le nom de la fonction et ce quelle ralise pour vous laisser
guider par cet assistant.
Les infobulles sont bien videmment disponibles pour toutes les
fonctions internes de VB et quand vous ouvrez la parenthse de la
fonction MsgBox, lcran illustr la figure 8.3 apparat :

Chap08.fm Page 130 Mercredi, 24. janvier 2007 5:17 17

130

Chapitre 8. Procdures et fonctions

Figure 8.3 info-bulle de la fonction MsgBox

Grce cette aide, vous savez que la fonction MsgBox comporte 5


arguments mais que seul le premier est obligatoire. Il sagit du message (Prompt) que vous affichez dans la bote de dialogue. Cette
info-bulle nous renseigne galement sur la valeur de retour de la
fonction : le nomVbMsgBoxResult nous indique quil sagit dune
constante dfinie par Visual Basic. Nous tudierons un peu plus loin
le dtail de cette fonction.
Si vous avez bien suivi, vous serez sans doute tonn de voir que
lappel de la fonction MsgBox seffectue alors quaucune variable na t
prvue pour rcuprer la valeur de retour. La version correcte de
lappel de la fonction serait donc :
Sub extrait2()
Dim insee As String
Dim departement As String
Dim resultat
insee = "1721171094076"
departement = Mid(insee, 6)
resultat = MsgBox(departement)
MsgBox (resultat)
End Sub

Ce programme nous montre que la fonction MsgBox renvoie la


valeur 1 et nous verrons plus tard sa signification. Il est donc possible
dexcuter certaines fonctions sans pour autant rcuprer la valeur de
retour. Ceci nest gure recommand, mais il faut reconnatre que
lorsquon veut juste afficher une bote de dialogue titre informatif,
cette manire de ne pas prendre en compte la valeur de retour est plus
rapide. Faites cependant attention : cette simplification de lcriture
ne marche pas pour toutes les fonctions et si vous essayez, par exemple, avec la fonction Mid, vous obtiendrez un message derreur. On
pourrait penser que cette simplification est autorise quand on na pas

Chap08.fm Page 131 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

131

besoin de la valeur de retour, mais ceci nest absolument pas vrai car
lappel de fonction suivant est parfaitement valide :
InputBox ("Ceci est un test")

et parfaitement inutile puisque si lon emploie la fonction InputBox,


cest prcisment pour rcuprer la rponse de lutilisateur qui, dans
le cas prsent, ne sera stocke dans aucune variable.
Dautre part, certaines fonctions ne comportent pas darguments et
on laisse alors tomber les parenthses. Cest notamment le cas de la
fonction Date qui renvoie la date systme :
MsgBox (Date)

Il serait dailleurs beaucoup plus logique et lisible dcrire cette instruction comme ceci :
MsgBox (Date())

Mais Visual Basic vous linterdit et si vous persistez crire lappel


de fonction tel quel dans lditeur, il sera automatiquement modifi
pour revenir la premire formulation sans parenthses.
Il est tout fait possible dimbriquer plusieurs fonctions et lappel
de fonction suivant est, par exemple, tout fait valide :
MsgBox ("Nous sommes le " & jour(Weekday(Date)) _
& " " & Str(Day(Date)) _
& " " & MonthName(Month(Date)) _
& " " & Str(Year(Date)))

Enfin, quand une fonction comporte plusieurs paramtres dont


certains sont facultatifs, il faut faire attention quand on souhaite
laisser de ct certains arguments. Nous avons vu que la fonction
MsgBox comptait cinq paramtres dont seul le premier est obligatoire
(le message afficher). Le troisime paramtre est le titre de la fentre. Si lon veut que la bote de dialogue comporte un titre, il faut
placer une virgule entre le premier et le troisime paramtre pour
bien indiquer que le deuxime paramtre, qui est facultatif, nest pas
pris en compte. Voici un exemple de fonction MsgBox illustrant cette
obligation syntaxique :
Message = MsgBox("Vous avez du courrier !", , _
"Rception d'un message")

Chap08.fm Page 132 Mercredi, 24. janvier 2007 5:17 17

132

Chapitre 8. Procdures et fonctions

Quand vous souhaitez omettre un paramtre facultatif dans une


fonction, il faut donc placer une virgule la place du paramtre dans
la liste des arguments.

MsgBox en dtail
Cela fait plusieurs chapitres que nous voquons la fonction MsgBox ; nous
allons prsent en faire une tude approfondie car cette fonction est intressante plus dun titre. Tout dabord, elle est une pice matresse dans le
dialogue entre le programme et lutilisateur ; ensuite, nous verrons quon
peut sen servir pour chercher les erreurs dans un programme car elle peut
facilement nous renseigner sur le contenu dune variable ou dune expression. De plus, elle comporte de nombreux paramtres ce qui en fait une
fonction trs puissante. Nous allons commencer par examiner ce que
nous dit laide en ligne sur cette fonction et nous ferons ensuite une explication de texte. Nous vous rappelons que pour invoquer laide en ligne, il
suffit, dans lditeur de programmes, de slectionner le terme rechercher
et dappuyer sur la touche de fonction F1.
Voici donc les informations que nous dlivre le systme daide :
MsgBox
Affiche un message dans une bote de dialogue, attend que l'utilisateur clique sur un bouton, puis renvoie une valeur de type Integer
qui indique le bouton choisi par l'utilisateur.
Syntaxe
MsgBox(prompt[, buttons] [, title] [, helpfile, context])

La syntaxe de la fonction MsgBox comprend les arguments nomms


suivants :
lment
prompt

Description
Expression de chane affiche comme message dans la bote de dialogue.
La longueur maximale de l'argument prompt est d'environ 1 024
caractres selon la largeur des caractres utiliss. Si l'argument prompt
occupe plus d'une ligne, n'oubliez pas d'insrer un retour chariot (Chr(13))
ou un saut de ligne (Chr(10)) entre les lignes, ou une combinaison de
caractres retour chariot-saut de ligne (Chr(13) & Chr(10)).

Chap08.fm Page 133 Mercredi, 24. janvier 2007 5:17 17

133

Syntaxe dune fonction

lment

Description

buttons

Facultatif. Expression numrique qui reprsente la somme des valeurs


indiquant le nombre et le type de boutons afficher, le style d'icne
utiliser, l'identit du bouton par dfaut, ainsi que la modalit du
message. Si l'argument buttons est omis, sa valeur par dfaut est 0.

title

Facultatif. Expression de chane affiche dans la barre de titre de la


bote de dialogue. Si l'argument title est omis, le nom de l'application
est plac dans la barre de titre.

helpfile

Facultatif. Expression de chane indiquant le fichier d'aide utiliser pour


fournir une aide contextuelle sur la bote de dialogue. Si l'argument
helpfile est dfini, l'argument context doit l'tre galement.

context

Facultatif. Expression indiquant le numro de contexte attribu par


l'auteur de l'aide la rubrique approprie. Si l'argument context est
dfini, l'argument helpfile doit l'tre galement.

Pour linstant, nous ne nous sommes servis de la fonction MsgBox


que pour afficher des informations et lutilisateur se contentait de cliquer sur le bouton OK. Mais un des buts de MsgBox est bien de renvoyer le numro du bouton sur lequel lutilisateur a cliqu ; ce qui est
sans intrt quand lutilisateur ne peut que cliquer sur OK (cest pourquoi on nglige la valeur de retour) revt en revanche une importance
capitale quand lutilisateur doit par exemple confirmer la suppression
dun fichier dans une bote de dialogue.
Laide en ligne nous prcise que MsgBox comporte cinq arguments
nomms et il nous faut expliciter ce concept important. Un argument
nomm est un paramtre dont le nom est connu par Visual Basic ce
qui a pour consquence quau lieu de fournir une valeur pour chaque
argument dans lordre dfini par la syntaxe, on peut affecter des
valeurs aux arguments nomms dans nimporte quel ordre.
Si lon reprend notre exemple prcdent, la ligne de code suivante :
Message = MsgBox("Vous avez du courrier !", , _
"Rception d'un message")

peut trs bien scrire galement :


Message = MsgBox(Title:="Rception d'un message", _
prompt:="Vous avez du courrier !")

Chap08.fm Page 134 Mercredi, 24. janvier 2007 5:17 17

134

Chapitre 8. Procdures et fonctions

Le rsultat sera strictement quivalent et vous pouvez remarquer


dune part que lordre des paramtres nest pas respect (le troisime
paramtre vient en premier) et que dautre part, il ny a plus de virgule
supplmentaire pour montrer que le deuxime paramtre a t omis. Il
ne vous aura sans doute pas chapp non plus quentre le nom du
paramtre et le signe gal figure le signe deux-points. Dans la plupart
des langages de programmation, le symbole := (les deux-points suivis
du signe gal) est appel symbole daffectation et sert affecter une
valeur une variable. Ce symbole a t invent pour faire la diffrence entre le signe gal qui est en ralit un oprateur de comparaison et qui sert donc mesurer lgalit de deux expressions. Dans de
trs nombreux langages, on crit donc :
var := 10

pour affecter la valeur 10 la variable var. En Visual Basic, cette


possibilit ne se retrouve que pour affecter une valeur des arguments nomms. La facult dutiliser des arguments nomms est trs
intressante car elle amliore la lisibilit du code et vous navez plus
vous soucier des virgules rajouter quand vous omettez des paramtres. Nous vous conseillons toutefois de garder lordre des paramtres car il ny a a priori aucune raison valable pour le bouleverser.
Nous vous recommandons donc dutiliser les arguments nomms
mme sils rallongent le code mais vous devez tre particulirement
attentifs ne pas oublier les deux-points dans laffectation des
valeurs aux arguments car, dans le cas contraire, vous risquez dtre
surpris du rsultat. En effet, lditeur de programmes ne signalera
aucune erreur mais lexcution, le rsultat ne sera pas celui
escompt. En effet, le code suivant :
Message = MsgBox(Title = "Rception d'un message", _
prompt = "Vous avez du courrier !")

affichera la bote de dialogue suivante :

Figure 8.4 Mauvaise transmission


des paramtres la fonction

Chap08.fm Page 135 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

135

Prompt
Prompt qui signifie message en anglais (le verbe prompt veut dire
souffler au thtre et vous savez tous que les journalistes tl ont un
prompteur) est le premier argument de MsgBox et cest le seul qui soit
obligatoire. Laide en ligne nous prcise que le message doit tre une
chane de caractres, donc une variable de type caractres ou bien
un littral encadr par des guillemets. Cela tant, MsgBox est beaucoup plus souple que ne le prtend laide en ligne et le programme
suivant :
Dim varnum As Integer
varnum = 1000
MsgBox (varnum)
MsgBox (Date)

affichera bien une bote de dialogue contenant la valeur 1000 puis


une autre bote de message contenant la date systme bien quil
sagisse dune variable numrique et dune fonction renvoyant une
date.
Vous pouvez en fait afficher un peu ce que vous voulez pourvu que
lexpression soit valide et ne mlange pas les types de donnes comme
le montrent les exemples suivants :
Dim varnum1 As Integer, varnum2 As Integer
varnum1 = 1000
varnum2 = 90
MsgBox (varnum1 + varnum2) ' affiche 1090
MsgBox (Date + varnum2) ' affiche la date systme + 90 jours
MsgBox (varnum1 + " feux") ' provoque une erreur de type
MsgBox (varnum1 + "10") ' affiche 1010

Laide en ligne indique que la longueur maximale de largument


prompt est denviron 1 024 caractres selon la largeur des caractres
utiliss.
Les tests que nous avons mens confirment ce chiffre. La saisie de
trs longues chanes de caractres dans lditeur de programmes est
assez peu ergonomique car le caractre de soulignement ne peut pas
tre utilis au milieu dune chane de caractres pour dcouper la ligne
logique en plusieurs lignes physiques. Dautre part, une ligne de programme nest pas non plus extensible linfini et ne peut pas dpasser
1 023 caractres. Si on souhaite faire afficher un texte relativement

Chap08.fm Page 136 Mercredi, 24. janvier 2007 5:17 17

136

Chapitre 8. Procdures et fonctions

long dans une bote de dialogue, le plus simple est encore de dcomposer le texte en plusieurs parties et de stocker chacune de ces parties
dans une variable caractre. Ensuite, une simple fonction telle que
celle-ci :
MsgBox (a + b + c + d)

pourra afficher la bote de dialogue en concatnant (en mettant


bout bout) le contenu des variables :

Figure 8.5 En concatnant des variables,


on peut afficher un texte trs long

Dans notre exemple, le paramtre prompt contient 1 113 caractres et comme la chane est trop longue, elle est tronque et seuls les
1 023 premiers caractres sont affichs. La chane tant dun seul
bloc, elle est affiche sans que lon puisse matriser les retours la
ligne qui dpendent de la rsolution de laffichage. Par consquent, si
vous changez la rsolution de votre cran, vous obtiendrez une bote
de dialogue dont les lignes seront plus ou moins longues. Si lon souhaite pouvoir forcer les retours la ligne, il faut ajouter la fin de chaque ligne un caractre de contrle. Laide nous indique quil faut
insrer un retour chariot (Chr(13)) ou un saut de ligne (Chr(10))
entre les lignes, ou une combinaison de caractres retour chariot-saut
de ligne (Chr(13) & Chr(10)).
Le programme suivant produit en fait trois fois la mme bote de
dialogue et il ny a aucune diffrence entre ces trois mthodes pour
sauter une ligne dans une bote de dialogue :
MsgBox ("Premire ligne" + Chr(10) + _
"Deuxime ligne.")
MsgBox ("Premire ligne" + Chr(13) + _
"Deuxime ligne.")

Chap08.fm Page 137 Mercredi, 24. janvier 2007 5:17 17

137

Syntaxe dune fonction

MsgBox ("Premire ligne" + Chr(13) & Chr(10) + _


"Deuxime ligne.")

Figure 8.6 Saut de ligne


dans une bote de dialogue

Ces caractres, Chr(10) et Chr(13), sont ce quon appelle des


caractres de contrle. Ils font partie du jeu de caractres ASCII et la
fonction Chr, quand on lui fournit un paramtre numrique, renvoie
le caractre qui est associ au code ASCII. Le code ASCII est un code
universel qui comprend une table de caractres numrots de 0 255.
Le code 32 correspond lespace et les caractres dont le code est
infrieur 32 ne sont pas imprimables. Le caractre ASCII n 10 a
pour nom LF qui est labrviation de Line Feed ce qui signifie saut de
ligne en anglais. Le caractre ASCII n 13 a pour nom CR qui est
labrviation de Carriage Return ce qui signifie retour de chariot en
anglais. Si pour sauter une ligne, vous ne souhaitez pas utiliser la fonction Chr, vous pouvez employer les constantes Visual Basic suivantes :
Constante

quivalent

Description

VbCrLf

Chr(13) + Chr(10)

Combinaison des caractres de retour


chariot et de saut de ligne

VbCr

Chr(13)

Caractre de saut de paragraphe

VbLf

Chr(10)

Caractre de saut de ligne

VbNewLine

Chr(13) + Chr(10) ou,


sur Macintosh, Chr(13)

Caractre de saut de ligne spcifique


la plate-forme ; choix en fonction de la
plate-forme

Si ces constantes ne sont pas trs parlantes pour vous, vous avez la
possibilit de dclarer vos propres constantes comme le montre le programme suivant :

Chap08.fm Page 138 Mercredi, 24. janvier 2007 5:17 17

138

Chapitre 8. Procdures et fonctions

Const sautligne = vbCr


MsgBox ("Premire ligne" + sautligne + _
"Deuxime ligne.")
MsgBox ("Premire ligne" + vbCr + _
"Deuxime ligne.")

Mais gardez bien lesprit que ce nest pas parce que vous sautez des
lignes que vous vous affranchissez de la limite des 1 024 caractres
pour la taille du message. Le programme suivant illustre cette limitation :
Dim var As String
var = "Ce qui se conoit bien s'nonce clairement et "
var = var & "les mots pour le dire arrivent aisment."
MsgBox (Len(var))
var = var + Chr(13)
For i = 1 To 4
var = var + var
Next i
MsgBox (Len(var))
MsgBox (var)

Figure 8.7 La taille du message


ne peut excder 1 023 caractres

Le programme dclare et initialise la variable var puis affiche la


longueur de cette variable (en loccurrence 86) grce la fonction
Len. On ajoute la variable var un retour de chariot pour passer la
ligne et grce une boucle, on augmente par progression gomtrique
(1 + 1, 2 + 2, 4 + 4, 8 + 8) la longueur de la variable, qui la sortie de
la boucle mesure 1 392 caractres (87 * 16) et compte 16 lignes. La
copie dcran montre bien que la totalit des lignes nest pas affiche
et notre variable est tronque 1 023 caractres (11 lignes de
87 caractres + 1 ligne de 66 caractres).

Chap08.fm Page 139 Mercredi, 24. janvier 2007 5:17 17

139

Syntaxe dune fonction

Buttons
Le deuxime argument permet dindiquer le nombre et le type de
boutons qui figurent dans la bote de dialogue. Si lon omet cet argument, MsgBox affiche par dfaut le bouton OK (valeur 0). Laide en
ligne nous indique que largument buttons prend les valeurs
suivantes :
Constante

Valeur

Description

VbOKOnly

Affiche le bouton OK uniquement.

vbOKCancel

Affiche les boutons OK et Annuler.

vbAbortRetryIgnore

Affiche le bouton Abandonner, Ressayer et


Ignorer.

vbYesNoCancel

Affiche les boutons Oui, Non et Annuler.

VbYesNo

Affiche les boutons Oui et Non.

vbRetryCancel

Affiche les boutons Ressayer et Annuler.

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

Le premier bouton est le bouton par dfaut.

vbDefaultButton2

256

Le deuxime bouton est le bouton par


dfaut.

vbDefaultButton3

512

Le troisime bouton est le bouton par dfaut.

vbDefaultButton4

768

Le quatrime bouton est le bouton


par dfaut.

vbApplicationModal

vbMsgBoxHelpButton

16384

Bote de dialogue modale. L'utilisateur doit


rpondre au message affich dans la zone de
message avant de pouvoir continuer de
travailler dans l'application en cours.
Ajoute le bouton Aide la zone
de message.

Chap08.fm Page 140 Mercredi, 24. janvier 2007 5:17 17

140

Chapitre 8. Procdures et fonctions

Laide en ligne fournit des informations concernant trois autres


constantes nommes vbSystemModal, vbMsgBoxSetForeground et vbMsgBoxRight. Ces constantes ne fonctionnent
pas et il est donc inutile de perdre du temps essayer de les
faire marcher. On a ici lexemple typique dune fonctionnalit
qui a t implmente sous Windows 3.1 et quon a conserve
pour dobscures raisons de compatibilit sans prendre la peine
de rviser la documentation. Ceci prouve encore une fois, si
besoin en tait encore, quil ne faut pas faire confiance tout
ce qui est crit ; cette dernire remarque, bien videmment, ne
vaut pas pour ce livre
La documentation nous indique ensuite comment utiliser ces
valeurs :
Le premier groupe de valeurs (0 5) dcrit le nombre et le type de
boutons affichs dans la bote de dialogue. Le deuxime groupe (16,
32, 48 et 64) dcrit le style dicne. Le troisime groupe (0, 256 et
512) dfinit le bouton par dfaut. Enfin, le quatrime groupe (0 et 4
096) dtermine la modalit de la zone de message. Au moment
dadditionner ces nombres pour obtenir la valeur finale de largument
buttons, ne slectionnez quun seul nombre dans chaque groupe.
En fait, le quatrime groupe na plus aucune raison dtre parce que
depuis Windows 95, les systmes 32-bits sont devenus vraiment multitches et par dfaut, les botes de dialogue MsgBox sont modales
(cest--dire bloquantes) par rapport lapplication hte mais nempchent absolument pas les autres applications de tourner. Afin dclairer toutes ces possibilits, nous allons examiner quelques exemples.
Si lon souhaite afficher une bote telle que celle qui est illustre
la figure 8.8, le premier paramtre doit avoir pour valeur "Voulez-vous
vraiment supprimer ce fichier ?", le deuxime paramtre doit avoir
pour valeur 275 qui se dcompose de la manire suivante :
3 : affiche les boutons Oui, Non et Annuler
16 : affiche licne Message critique
256 : le deuxime bouton est le bouton par dfaut

Chap08.fm Page 141 Mercredi, 24. janvier 2007 5:17 17

141

Syntaxe dune fonction

Le troisime paramtre doit avoir pour valeur "Alerte", ce qui au


final donne le code suivant :
reponse = MsgBox("Voulez-vous vraiment supprimer ce fichier ?" _
, 275, "Alerte")

Figure 8.8 Bote de dialogue


avec des boutons et un titre

Bien videmment, il est beaucoup plus lisible dutiliser les constantes dfinies par Visual Basic et le code qui suit est bien prfrable :
reponse = MsgBox("Voulez-vous vraiment supprimer ce fichier ?" _
, vbYesNoCancel + vbCritical + vbDefaultButton2, "Alerte")

Cette manire de coder est dautant plus simple raliser que lditeur, une nouvelle fois encore, nous facilite grandement la tche
comme vous pouvez le voir :

Figure 8.9 Lditeur affiche les constantes valides pour ce paramtre

Ds quon a saisi la virgule qui spare le premier du deuxime argument, lditeur affiche dans une liste droulante les constantes pour ce
paramtre. Il suffit alors de se dplacer dans la liste pour trouver la
bonne constante et le fait dappuyer sur la barre despacement ou la
touche de tabulation insre la constante dans le code. Si lon veut
ajouter plusieurs constantes, on tape le signe plus (+) et la liste droulante rapparat. Pour afficher la liste droulante, vous pouvez aussi

Chap08.fm Page 142 Mercredi, 24. janvier 2007 5:17 17

142

Chapitre 8. Procdures et fonctions

faire un clic droit et choisir dans le menu contextuel la commande


Complter le mot. Nutilisez pas les constantes vbSystemModal,
vbMsgBoxSetForeground et vbMsgBoxRight qui ne servent rien. La
constante vbMsgBoxRtlReading indique, quant elle, que le texte
doit apparatre de droite gauche sur les systmes hbraques et arabes.
La fonction MsgBox va donc renvoyer une valeur qui correspond au
bouton sur lequel lutilisateur a cliqu. Ces valeurs sont numriques
mais Visual Basic fournit des constantes quil vaut bien mieux utiliser.
En voici la liste :
Constante

Valeur

Description

VbOK

OK

vbCancel

Annuler

vbAbort

Abandonner

vbRetry

Ressayer

vbIgnore

Ignorer

VbYes

Oui

VbNo

Non

Si la bote de dialogue est dote dun bouton Annuler, le fait


dappuyer sur la touche ECHAP quivaut cliquer sur le bouton Annuler.
Dans un programme, il faudra utiliser un test conditionnel (If Then
ou bien condition dans une boucle) pour traiter le choix de lutilisateur. Voyons un court exemple o la rponse de lutilisateur permet de
sortir dune boucle :
Sub jeu()
Dim x As Byte
Dim y As Byte
Dim reponse As Byte
MsgBox ("J'ai choisi un nombre de 1 100 que vous devez
deviner." _
+ Chr(13) _

Chap08.fm Page 143 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

143

+ "Quand vous tapez un nombre, je vous dis s'il est plus grand"
_
+ Chr(13) _
+ "ou plus petit que le nombre secret." + Chr(13) _
+ "Vous avez 10 essais pour trouver ce nombre.")
Do
' Initialise le gnrateur de nombres alatoires
Randomize
' x est le nombre tir au hasard qu'il faut deviner
x = Int((99 * Rnd) + 1)
For i = 1 To 10
y = InputBox("Entrez un nombre entre 1 et 100")
If y = x Then
MsgBox ("Bravo, vous avez trouv le nombre secret
!")
Exit For
ElseIf y > x Then
MsgBox ("Trop grand !")
Else
MsgBox ("Trop petit !")
End If
Next i
If i = 11 Then
MsgBox ("Vous n'avez pas russi trouver en 10 coups
!")
End If
reponse = MsgBox("Voulez-vous recommencer une partie ?", _
vbYesNo + vbQuestion + vbDefaultButton2, _
"Nouvelle partie")
Loop Until reponse = vbNo
End Sub

Figure 8.10 La rponse une bote de dialogue


peut tre la condition darrt dune boucle

Vous remarquerez que lindentation du programme permet de bien


visualiser les structures de contrle.
Le troisime paramtre, title (titre en anglais), se passe de commentaires. Faites attention cependant ne pas employer des titres trop
longs, sinon, ils seront tronqus. La longueur du titre de la fentre

Chap08.fm Page 144 Mercredi, 24. janvier 2007 5:17 17

144

Chapitre 8. Procdures et fonctions

dpend de la rsolution de laffichage et titre indicatif, en rsolution


de 1 024 par 768, le titre de la fentre ne peut pas dpasser une centaine de caractres.
Les deux derniers arguments de MsgBox, helpfile et context servent
dfinir des rubriques daide et leur tude sort du cadre de cet ouvrage.
La fonction MsgBox vous servira dans tous vos programmes pour
dlivrer des informations lutilisateur ou bien pour valider ses choix.
Il sagit donc dune fonction primordiale pour la gestion de linterface
utilisateur de vos macros et il convient dattacher le plus grand soin
la slection de ses paramtres. Comme les options de MsgBox sont
nombreuses et quil nest pas toujours vident de dterminer a priori
laspect visuel dune bote de dialogue, nous avons crit (en VBA,
bien videmment) un programme qui permet de dfinir les paramtres
de manire interactive et ensuite de tester la fonction pour voir le
rsultat final ; quand on est satisfait, on peut ensuite gnrer le code
de la fonction.

Figure 8.11 Gnrateur de code pour la fonction MsgBox

Ce programme, qui est disponible avec le code de ce livre, vous


permettra de crer facilement des botes de dialogue. Vous pourrez
galement examiner la manire dont il a t crit.

Chap08.fm Page 145 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

145

Fonctions de Visual Basic par catgorie


Il existe un peu plus de 150 fonctions en Visual Basic. Mme sil
vous est impossible de toutes les mmoriser, il est important de connatre leur existence ou tout du moins les grandes catgories de
fonctions de manire pouvoir orienter votre recherche. En effet, il
est particulirement inutile de rinventer la roue et avant de vous
lancer dans lcriture dun programme, vous devez vous demander si
Visual Basic ne possde pas une fonction qui rpond votre besoin.
Pour prendre un exemple, si vous souhaitez extraire la racine carre
dun nombre, ne tentez pas de rdiger une macro qui accomplisse
cette tche ; la fonction Sqr fera trs bien laffaire. Nous allons donc
vous prsenter diffrentes catgories de fonctions et quand vous
aurez un besoin particulier, il vous faudra consulter ces listes afin de
vrifier si une fonction convient vos exigences. Les tableaux listent les fonctions par catgorie et par ordre alphabtique, chaque
nom de fonction tant accompagn dune courte description. Si
vous reprez une fonction qui est susceptible de vous intresser, il
faudra aller voir sa description complte dans laide en ligne.
Les fonctions de chane
Asc

Renvoie une donne de type Integer reprsentant le code de


caractre correspondant la premire lettre d'une chane.

Chr

Renvoie une valeur de type String contenant le caractre associ


au code de caractre indiqu.

InStr

Renvoie une valeur de type Variant (Long) indiquant la position de la


premire occurrence d'une chane l'intrieur d'une autre chane.

InStrRev

Renvoie la position d'une occurrence d'une chane dans une autre,


partir de la fin de la chane.

LCase

Renvoie une valeur de type String convertie en minuscules.

Left

Renvoie une valeur de type Variant (String) contenant le nombre


indiqu de caractres d'une chane en partant de la gauche.

Len

Renvoie une valeur de type Long contenant le nombre de


caractres d'une chane ou le nombre d'octets requis pour stocker
une variable.

Chap08.fm Page 146 Mercredi, 24. janvier 2007 5:17 17

146

Chapitre 8. Procdures et fonctions

LTrim

Renvoie une valeur de type Variant (String) contenant une copie


d'une chane en supprimant les espaces de gauche.

Mid

Renvoie une valeur de type Variant (String) contenant un nombre


indiqu de caractres extraits d'une chane de caractres.

Replace

Renvoie une chane dans laquelle une sous-chane spcifie a t


remplace plusieurs fois par une autre sous-chane.

Right

Renvoie une valeur de type Variant (String) contenant le nombre


indiqu de caractres d'une chane en partant de la droite.

RTrim

Renvoie une valeur de type Variant (String) contenant une copie


d'une chane en supprimant les espaces de droite.

Space

Renvoie une valeur de type Variant (String) comprenant le nombre


d'espaces indiqu.

Str

Renvoie une valeur de type Variant (String) reprsentant un


nombre.

StrComp

Renvoie une valeur de type Variant (Integer) indiquant le rsultat


d'une comparaison de chanes.

StrConv

Renvoie une valeur de type Variant (String) convertie au format


indiqu.

String

Renvoie une valeur de type Variant (String) contenant une chane


constitue d'un caractre rpt sur la longueur indique.

StrReverse

Renvoie une chane contenant des caractres dont l'ordre a t


invers par rapport une chane donne.

Trim

Renvoie une valeur de type Variant (String) contenant une copie


d'une chane en supprimant les espaces de gauche et de droite.

UCase

Renvoie une valeur de type Variant (String) contenant la chane


indique, convertie en majuscules.

Comme leur nom lindique, les fonctions de chane travaillent sur


des chanes de caractres ; la plupart de ces fonctions semploient trs
souvent dans les programmes et il est par consquent important de
connatre les principales et notamment les fonctions suivantes :
Asc
Chr
InStr

Chap08.fm Page 147 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

147

Left
Len
LTrim
Mid
Right
Str
Trim
UCase

Si vous fouillez dans laide en ligne, vous serez sans doute surpris de
voir que certaines fonctions de chane sont doubles, comme par
exemple Left et Left$ ou bien encore Mid et Mid$ ; apparemment,
quand on examine les explications sur ces fonctions jumelles, on ne
note aucune diffrence. Et pourtant, elles existent et nous allons
cette occasion reparler des variables de type Variant. Vous vous souvenez peut-tre que je vous avais dit que le type de donnes Variant tait
trs souple et quil accomplissait une partie du travail votre place.
Ce travail a bien videmment un cot et ce que vous navez pas
faire, vous le payez en termes de performance. En fait, la diffrence
entre Mid et Mid$ a trait au type de variable avec lequel la fonction va
travailler : Mid travaille avec des donnes Variant et Mid$ travaille
avec des donnes String. La belle affaire me direz-vous puisque cette
distinction est totalement transparente pour vous. En ralit, elle ne
lest pas puisque la fonction Left$ est dans certains cas presque deux
fois plus rapide que son quivalent qui marche avec des variables
Variant. Mme si la programmation nest pas votre activit principale
et que vous navez aucun souci doptimisation de votre code, il est
important de comprendre ces diffrences et de pouvoir les valuer.
Nous allons voir dans lexemple suivant quil est trs facile de mettre
en place une procdure de test de performance et vous verrez quun
petit programme peut fournir des rsultats significatifs :
Sub testperf1()
Dim boucle As Double
chaine = "Trahi de toutes parts, accabl dinjustices"
depart = Timer 'dclenche le chrono
For boucle = 1 To 1000000
Dim x
x = Mid(chaine, 22, 7)
Next boucle
fin = Timer ' arrte le chrono

Chap08.fm Page 148 Mercredi, 24. janvier 2007 5:17 17

148

Chapitre 8. Procdures et fonctions

MsgBox (fin - depart)


' affiche le rsultat en secondes
End Sub

Ce premier programme initialise une chane de caractres puis


dclenche un compteur laide de la fonction Timer qui renvoie une
valeur reprsentant le nombre de secondes coules depuis minuit.
Puis une boucle est excute un million de fois. lintrieur de cette
boucle, on initialise une variable qui est de type Variant tant donn
quaucun type nest dclar et on ralise une opration sur une chane
de caractres. la fin de la boucle, on dclenche un deuxime chrono
et on affiche la diffrence entre les deux chronos, cest--dire le temps
coul pendant le droulement de la boucle.
Le deuxime programme de test est similaire sauf quon prend la
peine de dclarer les variables chane en tant que String et quon utilise la fonction Mid$ :
Sub testperf2()
Dim chaine As String
Dim boucle As Double
chaine = "Trahi de toutes parts, accabl dinjustices"
depart = Timer
For boucle = 1 To 1000000
Dim x As String
x = Mid$(chaine, 22, 7)
Next boucle
fin = Timer
MsgBox (fin - depart)
End Sub

Le tableau ci-dessous vous montre les rsultats des tests effectus


sur huit fonctions. La deuxime colonne indique le temps avec la
fonction renvoyant une variable Variant et la troisime colonne indique le temps avec la fonction renvoyant une variable String. Les
valeurs de temps sont exprimes en secondes.
Fonction

Variant

String

Diffrence en %

x = Mid(chaine, 26, 7)

1.54

1.14

35 %

x = Left(chaine, 20)

1.30

.92

41 %

x = Right(chaine, 20)

1.30

.92

41 %

Chap08.fm Page 149 Mercredi, 24. janvier 2007 5:17 17

149

Syntaxe dune fonction

Fonction

Variant

String

Diffrence en %

x = LTrim(chaine)

1.30

.99

31 %

x = RTrim(chaine)

1.26

.98

29 %

x = Trim(chaine)

1.38

1.10

25 %

x = LCase(chaine)

12.14

11.87

2%

x = UCase(chaine)

11.32

10.93

4%

Mme sil faut prendre ces mesures avec des pincettes, elles sont
suffisamment significatives sur certaines fonctions pour que cela
puisse avoir un impact dans des programmes qui font un usage intensif
du traitement des chanes de caractres. Ces deux petits programmes
ont surtout un but pdagogique : ils vous montrent quil est ais
dcrire une macro pour tester deux versions diffrentes dun mme
programme. De plus, ils vous enseignent que la facilit fait finalement
perdre du temps et quon a toujours intrt tre le plus explicite possible dans un programme car on gagne en temps et en lisibilit.
Les fonctions de date
Date

Renvoie une valeur de type Variant (Date) contenant la


date systme actuelle.

DateAdd

Renvoie une valeur de type Variant (Date) contenant une


date laquelle un intervalle de temps spcifi a t ajout.

DateDiff

Renvoie une valeur de type Variant (Long) indiquant le


nombre d'intervalles de temps entre deux dates donnes.

DatePart

Renvoie une valeur de type Variant (Integer) contenant


l'lment spcifi d'une date donne.

DateSerial

Renvoie une valeur de type Variant (Date) correspondant


une anne, un mois et un jour dtermins.

DateValue

Renvoie une valeur de type Variant (Date).

Day

Renvoie une valeur de type Variant (Integer) indiquant un


nombre entier compris entre 1 et 31, inclus, qui reprsente
le jour du mois.

Chap08.fm Page 150 Mercredi, 24. janvier 2007 5:17 17

150

Chapitre 8. Procdures et fonctions

Hour

Renvoie une valeur de type Variant (Integer) indiquant un


nombre entier compris entre 0 et 23 inclus, qui reprsente
l'heure du jour.

Minute

Renvoie une valeur de type Variant (Integer) indiquant un


nombre entier compris entre 0 et 59, inclus, qui
reprsente la minute de l'heure en cours.

Month

Renvoie une valeur de type Variant (Integer) indiquant un


nombre entier compris entre 1 et 12, inclus, qui
reprsente le mois de l'anne.

MonthName

Renvoie une chane indiquant le mois spcifi.

Now

Renvoie une valeur de type Variant (Date) indiquant la


date et l'heure en cours fournies par la date et l'heure
systme de votre ordinateur.

Second

Renvoie une valeur de type Variant (Integer) indiquant un


nombre entier compris entre 0 et 59, inclus, qui
reprsente la seconde de la minute en cours.

Time

Renvoie une valeur de type Variant (Date) indiquant


l'heure systme en cours.

Timer

Renvoie une valeur de type Single reprsentant le nombre


de secondes coules depuis minuit.

TimeSerial

Renvoie une valeur de type Variant (Date) contenant une


heure prcise (heure, minute et seconde).

TimeValue

Renvoie une valeur de type Variant (Date) contenant une


heure.

Weekday

Renvoie une valeur de type Variant (Integer) contenant un


nombre entier qui reprsente le jour de la semaine.

WeekdayName

Renvoie une chane indiquant le jour de la semaine spcifi.

Year

Renvoie une valeur de type Variant (Integer) contenant un


nombre entier qui reprsente l'anne.

Les fonctions de date sont nombreuses en Visual Basic et nous


avons dj rencontr les principales avec nos exemples de macros
manipulant des dates. Si vous avez traiter des dates dans votre programme, il serait bien rare que vous ne trouviez pas dans cette liste
une fonction qui rponde vos besoins.

Chap08.fm Page 151 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

151

Les fonctions mathmatiques


Abs

Renvoie une valeur de mme type que celle transmise, indiquant la


valeur absolue d'un nombre.

Atn

Renvoie une valeur de type Double indiquant l'arctangente d'un


nombre.

Cos

Renvoie une valeur de type Double indiquant le cosinus d'un


angle.

Exp

Renvoie une valeur de type Double indiquant la valeur de e (base


des logarithmes npriens) lev une puissance.

Fix

Renvoie la partie entire d'un nombre.

Hex

Renvoie une valeur de type String reprsentant un nombre sous


forme hexadcimale.

Int

Renvoie la partie entire d'un nombre.

Log

Renvoie une valeur de type Double indiquant le logarithme


nprien d'un nombre.

Oct

Renvoie une valeur de type Variant (String) reprsentant la valeur


octale d'un nombre.

Partition

Renvoie une chane de caractres de type Variant (String)


indiquant l'endroit o un nombre apparat au sein d'une srie
calcule de plages de valeurs.

Rnd

Renvoie une valeur de type Single contenant un nombre alatoire.

Round

Renvoie un nombre arrondi un nombre spcifi de positions


dcimales.

Sgn

Renvoie une valeur de type Variant (Integer) indiquant le signe


d'un nombre.

Sin

Renvoie une valeur de type Double indiquant le sinus d'un angle.

Sqr

Renvoie une valeur de type Double indiquant la racine carre d'un


nombre.

Tan

Renvoie une valeur de type Double indiquant la tangente d'un


angle.

Val

Renvoie le nombre contenu dans une chane de caractre sous la


forme d'une valeur numrique d'un type appropri.

Chap08.fm Page 152 Mercredi, 24. janvier 2007 5:17 17

152

Chapitre 8. Procdures et fonctions

Certaines de ces fonctions sont trs spcialises (comme les fonctions trigonomtriques) et ne vous serviront sans doute que trs rarement. En revanche vous utiliserez souvent les fonctions Abs, Int,
Round et Val.
Les fonctions financires
DDB

Renvoie une valeur de type Double indiquant


l'amortissement d'un bien au cours d'une priode
spcifique en utilisant la mthode d'amortissement
dgressif taux double ou toute autre mthode prcise.

DDB

FV

Renvoie une valeur de type Double indiquant le futur


montant d'une annuit base sur des versements
constants et priodiques et sur un taux d'intrt fixe.

VC

IPmt

Renvoie une valeur de type Double indiquant le montant,


sur une priode donne, d'une annuit base sur des
versements constants et priodiques et sur un taux
d'intrt fixe.

INTPER

IRR

Renvoie une valeur de type Double indiquant le taux de


rendement interne d'une srie de mouvements de
trsorerie priodiques (paiements et encaissements).

TRI

MIRR

Renvoie une valeur de type Double indiquant le taux de


rendement interne modifi d'une srie de mouvements de
trsorerie priodiques (paiements et encaissements).

TRIM

Nper

Renvoie une valeur de type Double indiquant le nombre


d'chances d'une annuit base sur des versements
constants et priodiques et sur un taux d'intrt fixe.

NPM

NPV

Renvoie une valeur de type Double indiquant la valeur


nette actuelle d'un investissement, calcule en fonction
d'une srie de mouvements de trsorerie priodiques
(paiements et encaissements) et d'un taux d'escompte.

VAN

Pmt

Renvoie une valeur de type Double indiquant le montant


d'une annuit base sur des versements constants et
priodiques et sur un taux d'intrt fixe.

VPM

PPmt

Renvoie une valeur de type Double indiquant le


remboursement du capital, pour une chance donne,
d'une annuit base sur des versements constants et
priodiques et sur un taux d'intrt fixe.

PRINCPER

Chap08.fm Page 153 Mercredi, 24. janvier 2007 5:17 17

153

Syntaxe dune fonction

PV

Renvoie une valeur de type Double indiquant le montant


actuel d'une annuit base sur des chances futures
constantes et priodiques, et sur un taux d'intrt fixe.

VA

Rate

Renvoie une valeur de type Double indiquant le taux


d'intrt par chance pour une annuit.

TAUX

SLN

Renvoie une valeur de type Double indiquant


l'amortissement linaire d'un bien sur une priode
donne.

AMORLIN

SYD

Renvoie une valeur de type Double indiquant


l'amortissement global d'un bien sur une priode donne.

SYD

Ces fonctions sont lquivalent des fonctions financires que lon


trouve dans Excel (la troisime colonne du tableau indique dailleurs
le nom correspondant Excel). Si vous dveloppez une macro avec
Excel, il est sans doute prfrable dutiliser les fonctions internes
dExcel mais si vous devez faire du calcul financier dans un programme Word ou Access, il sera plus facile dutiliser les fonctions de
Visual Basic.
Les fonctions de gestion de fichiers
CurDir

Renvoie une valeur de type Variant (String) indiquant le


chemin en cours.

Dir

Renvoie une valeur de type String reprsentant le nom d'un


fichier, d'un rpertoire ou d'un dossier correspondant une
chane de recherche, un attribut de fichier ou au nom de
volume d'un lecteur.

EOF

Renvoie une valeur de type Integer contenant la valeur


Boolean True lorsque la fin d'un fichier ouvert en mode
Random ou Input squentiel est atteinte.

FileAttr

Renvoie une valeur de type Long reprsentant le mode


d'ouverture des fichiers avec l'instruction Open.

FileDateTime

Renvoie une valeur de type Variant (Date) indiquant la date et


l'heure de cration ou de dernire modification d'un fichier.

FileLen

Renvoie une valeur de type Long indiquant la longueur en


octets d'un fichier.

Chap08.fm Page 154 Mercredi, 24. janvier 2007 5:17 17

154

Chapitre 8. Procdures et fonctions

FreeFile

Renvoie une valeur de type Integer reprsentant le prochain


numro de fichier pouvant tre utilis par l'instruction Open.

GetAttr

Renvoie une valeur de type Integer indiquant les attributs du


fichier ou du dossier.

Input

Renvoie une valeur de type String contenant les caractres lus


dans un fichier ouvert en mode Input ou Binary.

Loc

Renvoie une valeur de type Long indiquant la position de


lecture/criture courante dans un fichier ouvert.

LOF

Renvoie une valeur de type Long reprsentant la taille, exprime


en octets, d'un fichier ouvert l'aide de l'instruction Open.

Seek

Renvoie une valeur de type Long indiquant la position de


lecture/criture courante dans un fichier ouvert l'aide de
l'instruction Open.

Ces fonctions permettent de manipuler des fichiers au sens large du


terme et vous pouvez aussi bien obtenir le nom dun fichier, connatre
ses attributs, calculer sa longueur que le parcourir octet par octet. Cela
tant, on prfrera souvent une autre mthode pour manipuler des
fichiers et notamment par le biais de lobjet FileSystemObject que
nous tudierons plus tard.
Les fonctions logiques
Choose

Slectionne et renvoie une valeur partir d'une liste


d'arguments.

Iif

Renvoie l'un ou l'autre de deux arguments selon l'valuation


d'une expression.

IsDate

Renvoie une valeur de type Boolean qui indique si une


expression peut tre convertie en date.

IsEmpty

Renvoie une valeur de type Boolean indiquant si une variable


a t initialise.

IsError

Renvoie une valeur de type Boolean qui indique si une


expression est une valeur d'erreur.

IsMissing

Renvoie une valeur de type Boolean qui indique si un argument


facultatif de type Variant a t pass dans une procdure.

Chap08.fm Page 155 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

155

IsNull

Renvoie une valeur de type Boolean qui indique si une


expression ne contient aucune donne valide (Null).

IsNumeric

Renvoie une valeur de type Boolean qui indique si une


expression peut tre interprte comme un nombre.

IsObject

Renvoie une valeur de type Boolean qui indique si un


identificateur reprsente une variable objet.

Switch

value une liste d'expressions et renvoie une valeur de type


Variant ou une expression associe la premire expression
de la liste qui a pour valeur True.

Parmi toutes ces fonctions, vous utiliserez surtout la fonction Iif


qui permet de faire un test conditionnel If Then sur une seule ligne et
les fonctions IsEmpty et IsNull.
Les fonctions de conversion
Les fonctions de conversion sont extrmement importantes et elles
seront bien souvent le seul remde pour ne pas commettre des
erreurs de type. Vous devez vous rappeler quil est en effet impossible
de mlanger les types de donnes au sein dune mme expression ; si
je souhaite, par exemple, afficher dans une bote de dialogue le nom
dun tudiant suivi de sa moyenne gnrale aux examens, il faut que
je fasse une conversion de la note puisque je nai pas le droit de mettre bout bout une variable caractre et une variable numrique. Je
vais donc employer une fonction de conversion qui va changer le
type de la variable numrique en caractre. Le programme suivant
illustre cette technique :
Dim nometudiant As String
Dim moyenne As Double
nometudiant = "MARTIN"
moyenne = 12
' Erreur de type
' MsgBox (nometudiant + " : " + moyenne)
' Conversion donc pas d'erreur
MsgBox (nometudiant + " : " + CStr(moyenne))

Les fonctions de conversion convertissent une expression en un


type de donnes spcifique. Leur syntaxe est la suivante :
Nom_de_fonction(expression)

Chap08.fm Page 156 Mercredi, 24. janvier 2007 5:17 17

156

Chapitre 8. Procdures et fonctions

Largument expression peut tre nimporte quelle expression de


chane ou expression numrique et le nom de la fonction dtermine le
type renvoy, comme le montre le tableau suivant :
Fonction

Type renvoy

Plage de valeurs de l'argument expression

CBool

Boolean

Toute chane ou expression numrique valide.

CByte

Byte

0 255.

CCur

Currency

-922 337 203 685 477,5808 922 337 203 685


477,5807.

CDate

Date

Toute expression de date valide.

CDbl

Double

-1.79769313486231E308
-4,94065645841247E-324 pour les valeurs
ngatives ; 4,94065645841247E-324
1,79769313486232E308 pour les valeurs
positives.

CDec

Decimal

+/-79 228 162 514 264 337 593 543 950 335
pour les nombres sans dcimales. La plage de
valeurs des nombres 28 dcimales est
+/-7,9228162514264337593543950335. Le
plus petit nombre diffrent de zro est
0,0000000000000000000000000001.

CInt

Integer

-32 768 32 767 ; les fractions sont arrondies.

CLng

Long

-2 147 483 648 2 147 483 647 ; les fractions


sont arrondies.

CSng

Single

-3,402823E38 -1,401298E-45 pour les valeurs


ngatives ; 1,401298E-45 3,402823E38 pour
les valeurs positives.

CStr

String

Les valeurs renvoyes par la fonction Cstr


dpendent de l'argument expression.

CVar

Variant

Mme plage de valeurs que le type Double pour


les nombres et que le type String pour les chanes
non numriques.

Si largument expression pass la fonction excde la plage de


valeurs du type de donnes cible, une erreur se produit. Il est donc

Chap08.fm Page 157 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

157

prfrable avant de raliser une conversion de sassurer quelle soit


valide. Vous utiliserez pour ce faire des fonctions logiques comme par
exemple la fonction IsDate pour dterminer si la valeur de largument
date peut tre convertie en date ou en heure.
La fonction CDate reconnat les littraux de date et heure ainsi que
certains nombres appartenant la plage de dates autorises. Lors de la
conversion dun 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. Lordre des jours, mois et annes risque de ne
pouvoir tre dfini si les donnes sont fournies dans un format diffrent des paramtres de date reconnus. De plus, les formats de date
complets prcisant le jour de la semaine ne sont pas reconnus.
Il existe dautres fonctions de conversion comme Str ou Val mais il
vaut mieux utiliser les fonctions normalises. Par exemple, la fonction
Val ne respecte pas les conventions trangres alors que 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 systme
Command

Renvoie la partie argument de la ligne de commande utilise


pour lancer Microsoft Visual Basic ou un programme excutable
dvelopp avec Visual Basic.

DoEvents

Arrte momentanment l'excution afin que le systme


d'exploitation puisse traiter d'autres vnements.

Environ

Renvoie la valeur de type String associe une variable


d'environnement du systme d'exploitation. Non disponible sur
le Macintosh.

GetAllSettings

Renvoie une liste des cls et leurs valeurs respectives (cres


l'origine l'aide de l'instruction SaveSetting), figurant dans une
entre d'application de la base de registres de Windows.

GetSetting

Renvoie une valeur de cl d'une entre d'application de la base


de registres de Windows.

Chap08.fm Page 158 Mercredi, 24. janvier 2007 5:17 17

158

Chapitre 8. Procdures et fonctions

IMEStatus

Renvoie une valeur de type Integer indiquant le mode IME


(Input Method Editor) en cours de Microsoft Windows ;
disponible uniquement dans les versions destines aux pays
asiatiques.

MacID

Utilise sur Macintosh pour convertir une constante quatre


caractres en une valeur pouvant tre exploite par les fonctions
Dir, Kill, Shell et AppActivate.

MacScript

Excute un script AppleScript et retourne une valeur renvoye


par le script, le cas chant.

QBColor

Renvoie une valeur de type Long indiquant le code de couleur


RGB correspondant au numro de couleur indiqu.

RGB

Renvoie un entier de type Long reprsentant le code RGB.

Shell

Lance un programme excutable et renvoie une valeur de type


Variant (Double) reprsentant l'identificateur (ID) de la tche
excute en cas de succs, ou un zro en cas d'chec.

TypeName

Renvoie une valeur de type String qui fournit des informations


sur une variable.

VarType

Renvoie une valeur de type Integer qui indique le sous-type


d'une variable.

Ces fonctions donnent des renseignements sur ltat du systme et


vous en aurez rarement besoin car certaines sont vraiment trs spcialises. La fonction VarType peut tre intressante pour bien comprendre le rle des types de donnes.
Les fonctions de tableau
Array

Renvoie une variable de type Variant contenant un tableau.

Filter

Renvoie un tableau de base zro contenant un sous-ensemble


d'un tableau de chane bas sur des critres
de filtre spcifis.

IsArray

Renvoie une valeur de type Boolean qui indique si une variable


est un tableau.

Join

Renvoie une chane cre par la jonction de plusieurs


sous-chanes contenues dans un tableau.

Chap08.fm Page 159 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

159

LBound

Renvoie une valeur de type Long contenant le plus petit indice


disponible pour la dimension indique d'un tableau.

Split

Renvoie un tableau de base zro une dimension contenant le


nombre spcifi de sous-chanes.

UBound

Renvoie une valeur de type Long contenant le plus grand indice


disponible pour la dimension indique d'un tableau.

Les fonctions de gestion dobjet


CallByName

Excute une mthode d'un objet, ou dfinit ou renvoie une


proprit d'un objet.

CreateObject

Cre et renvoie une rfrence un objet ActiveX.

GetObject

Renvoie une rfrence un objet fourni par un composant ActiveX.

Un objet est un type de variable particulier et nous expliciterons ce


concept en dtail dans le prochain chapitre.
Les fonctions de gestion derreur
CVErr

Renvoie une donne de type Variant et de sous-type Error


contenant un numro d'erreur spcifi par l'utilisateur.

Error

Renvoie le message d'erreur correspondant un numro d'erreur


donn.

Si on veut bien programmer, il faut tre paranoaque et prvoir le


pire. Les fonctions de gestion derreur vous permettent de traiter
prventivement les erreurs ventuelles qui peuvent se produire dans
votre programme.
Les fonctions de formatage
Format

Renvoie une valeur de type Variant (String) contenant une


expression formate en fonction des instructions contenues
dans l'expression de mise en forme.

Chap08.fm Page 160 Mercredi, 24. janvier 2007 5:17 17

160

Chapitre 8. Procdures et fonctions

FormatCurrency

Renvoie une expression formate sous forme de valeur de


type Currency utilisant le symbole montaire dfini dans le
Panneau de configuration du systme.

FormatDateTime

Renvoie une expression formate sous forme de date ou


d'heure.

FormatNumber

Renvoie une expression formate sous forme de nombre.

FormatPercent

Renvoie une expression formate sous forme de pourcentage


(multipli par 100) avec un caractre % de fin.

Les fonctions dinterface utilisateur


InputBox

Affiche une invite dans une bote de dialogue, attend que l'utilisateur
tape du texte ou clique sur un bouton, puis renvoie le contenu de la
zone de texte sous la forme d'une valeur de type String.

MsgBox

Affiche un message dans une bote de dialogue, attend que


l'utilisateur clique sur un bouton, puis renvoie une valeur de type
Integer qui indique le bouton choisi par l'utilisateur.

Nous avons tudi la fonction MsgBox en dtail et il nous faut dire un


mot de la fonction InputBox qui est aussi une fonction importante
dans le cadre du dialogue homme-machine puisquelle permet de
rcuprer des informations saisies par lutilisateur. Il est trs important de noter que la valeur renvoye par InputBox est une variable
String ce qui signifie que si vous faites saisir un nombre un utilisateur, il faudra en principe le convertir, grce une fonction de conversion telle que CDbl, CInt ou CLng, en une variable numrique,
mme si Visual Basic nest parfois pas trs regardant. La syntaxe de
InputBox ressemble celle de MsgBox :
InputBox(prompt[, title] [, default] [, xpos] [, ypos]
[, helpfile, context])

Par rapport MsgBox, il y a trois arguments nouveaux :


default

Facultatif. Expression de chane affiche par dfaut dans la zone


de texte en l'absence de toute autre valeur. Si l'argument default
est omis, la zone de texte qui s'affiche est vide.

Chap08.fm Page 161 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

161

xpos

Facultatif. Expression numrique indiquant, en twips, la distance


horizontale qui spare le bord gauche de l'cran de la bordure
gauche de la bote de dialogue. Si l'argument xpos est omis, la
bote de dialogue est centre horizontalement.

ypos

Facultatif. Expression numrique indiquant, en twips, la distance


verticale qui spare le haut de l'cran de la bordure suprieure de la
bote de dialogue. Si l'argument ypos est omis, la bote de dialogue est
positionne verticalement, environ un tiers de l'cran en partant du
haut.

Pour votre gouverne, vous pouvez retenir quun twip est un 20me de
point et quun point est approximativement un 72me de pouce qui, comme
chacun le sait, mesure 2,54 centimtres. Visual Basic utilise les twips en
interne pour la rsolution de laffichage et certains paramtres de fonctions
doivent tre exprims dans cette mesure. Il ny a pas malheureusement de
correspondance directe entre les twips et les pixels car les twips dpendent
de la taille de la police qui peut varier dun systme lautre.
Les fonctions dimpression
Spc

Utilise avec l'instruction Print # ou la mthode Print pour


positionner la sortie.

Tab

Utilise avec l'instruction Print # ou la mthode Print pour


positionner la sortie.

crire ses propres fonctions


Vous avez pu voir que Visual Basic offre des fonctions qui couvrent de
nombreux domaines et ces fonctions suffiront votre bonheur dans la
majorit des cas. Mais il arrivera forcment un jour o vous vous trouverez
dans une situation o les fonctions internes de VB ne font pas laffaire et
vous serez alors dans lobligation de crer votre propre fonction. En fait,
crer ses propres fonctions nest pas plus compliqu qucrire un autre programme puisquune fonction nest jamais quun programme qui renvoie
une valeur. On nest dailleurs jamais oblig dcrire une fonction mais
cest souvent un moyen lgant de rsoudre un problme. Dans le chapitre 6, nous avons crit un programme pour connatre le jour de naissance
quand on fournit la date de naissance :

Chap08.fm Page 162 Mercredi, 24. janvier 2007 5:17 17

162

Chapitre 8. Procdures et fonctions

Dim vardate As Date, journaissance As Byte


vardate = InputBox _
("Entrez votre date de naissance au format JJ/MM/AAAA")
journaissance = Weekday(vardate)
If journaissance = 1 Then
MsgBox ("Vous tes n un dimanche")
ElseIf journaissance = 2 Then
MsgBox ("Vous tes n un lundi")
ElseIf journaissance = 3 Then
MsgBox ("Vous tes n un mardi")
ElseIf journaissance = 4 Then
MsgBox ("Vous tes n un mercredi")
ElseIf journaissance = 5 Then
MsgBox ("Vous tes n un jeudi")
ElseIf journaissance = 6 Then
MsgBox ("Vous tes n un vendredi")
Else
MsgBox ("Vous tes n un samedi")
End If

Avouez que le mme programme serait beaucoup plus concis et lisible sil scrivait comme ceci :
Dim vardate As Date
vardate = InputBox _
("Entrez votre date de naissance au format JJ/MM/AAAA")
MsgBox("Vous tes n un " + jour(Weekday(vardate)))

Bien videmment, il ny a pas de miracle et si le programme a


fondu, cest parce que nous avons cr une fonction baptise jour
(appel en gras dans le code) qui va jouer le mme rle que dans le premier programme, savoir fournir le nom du jour en clair la place
dun numro de 1 7.
Quel est lintrt dcrire une telle fonction ? Outre la lisibilit qui
est manifeste, la cration dune fonction va permettre un gain de
temps car il est possible de la rutiliser dans nimporte quel autre programme. Une fois que la fonction est crite, il suffit dune seule ligne
de code pour lappeler. En effet, notre premier programme marche
parfaitement, mais sil faut encore renvoyer le nom dun jour de la
semaine au sein du mme programme ou bien dans un autre, il faudra
crire nouveau une quinzaine de lignes de code. Mme sil est facile
de copier cette portion de code et de la coller ailleurs, cette solution
nest pas lgante et alourdit considrablement les programmes. En

Chap08.fm Page 163 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

163

thorie, ds quon crit deux fois le mme code, il serait souhaitable


den faire une fonction.
Dautre part, notre premier programme est trs spcifique et il ne
pourra pas nous servir pour afficher une date avec le nom du jour en
entier puisquil ne sert que pour les dates de naissance. Notre fonction
jour, quant elle, est beaucoup plus flexible et gnrique. Nous allons
prsent voir comment rdiger cette fonction et vous pourrez vous
apercevoir que cela est extrmement simple. Pour crer une fonction,
on utilise la syntaxe suivante :
Function Nom_de_la-fonction([arguments]) [As Type]
Instructions de la fonction
End Function

Ce qui dans le cas de notre fonction jour donne :


Function jour(NumJour As Byte) As String
Select Case NumJour
Case 1
jour = "Dimanche"
Case 2
jour = "Lundi"
Case 3
jour = "Mardi"
Case 4
jour = "Mercredi"
Case 5
jour = "Jeudi"
Case 6
jour = "Vendredi"
Case 7
jour = "Samedi"
End Select
End Function

Il existe une fonction interne Visual Basic appele WeekdayName qui joue pratiquement le mme rle que notre fonction
jour mais son utilisation est plus complexe. Notre fonction
sappelle jour parce quelle renvoie un nom de jour et autant
que faire se peut, il vaut mieux utiliser un nom de fonction descriptif. Les rgles dattribution du nom des fonctions sont les
mmes que pour les identificateurs de Visual Basic.

Chap08.fm Page 164 Mercredi, 24. janvier 2007 5:17 17

164

Chapitre 8. Procdures et fonctions

la suite du nom de la fonction, se trouvent entre parenthses les


arguments de la fonction. La fonction peut ne comporter aucun argument ou bien en comporter plusieurs. Sil y a plus dun argument, ils
doivent tre spars par des virgules. Il est prfrable de choisir des
noms darguments significatifs car nous verrons tout lheure que cela
a son importance. Il est galement judicieux de dclarer un type pour
les paramtres car cela permet un meilleur contrle de votre code.
Aprs la liste des arguments, vous pouvez prciser le type de donnes de la valeur de retour. Encore une fois, plus votre code sera fortement typ, cest--dire plus il comportera des variables dclares
explicitement avec un type autre que Variant, meilleur il sera et cette
pratique est donc recommande.
Dans le corps de la fonction, vous devez calculer la valeur que votre
fonction doit renvoyer. Pour indiquer quelle est la valeur qui est
retourne, il suffit quune ligne de code mentionne :
Nom_de_fonction = valeur renvoye

Voil ! Vous savez prsent crire des fonctions. Pratiquement, il


suffit dcrire dans lditeur de programmes une fonction pour pouvoir
lutiliser tout de suite comme le montre la copie dcran suivante :

Figure 8.12 Une info-bulle apparat aussi


pour les fonctions personnalises

Chap08.fm Page 165 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

165

Vous pouvez remarquer galement que Visual Basic sest appropri


votre fonction puisquil propose une info-bulle dcrivant le nom du
paramtre, son type et la valeur de retour de votre fonction, do lutilit de ne pas choisir des noms sotriques pour vos paramtres.
Utiliser une fonction personnalise dans Excel
Quand vous avez crit une fonction en VBA, vous pouvez lutiliser dans
Excel comme sil sagissait dune fonction intgre, comme SOMME(),
en la faisant prcder du signe gal dans la barre de formule. Pour ce
faire, il suffit dinsrer un module (commande InsertionModule dans
lditeur de programmes) dans le projet Excel dans lequel vous voulez
utiliser votre fonction puis de recopier le code de la fonction dans ce
module.
Si vous voulez utiliser votre fonction dans toutes vos feuilles de calcul,
le plus simple est alors de recopier cette fonction dans un module du
classeur de macros personnelles (dans lExplorateur de projets, le classeur de macros personnelles apparat sous le nom VBAProject
(Perso.xls ou Personal.xlsb)). Quand vous crivez une fonction personnalise dans Excel, faites cependant particulirement attention ce que
le nom de votre fonction ne rentre pas en concurrence avec lune des
300 fonctions intgres dExcel. Ainsi, le nom que nous avons choisi
pour notre exemple de fonction personnalise (jour) ne convient pas
car il existe dj une fonction nomme JOUR() dans Excel. Il faut dans
ce cas choisir un autre nom pour la fonction personnalise (par exemple nomjour).
Une fois que vous avez crit le code de votre fonction dans un module,
son nom apparat dans la liste des fonctions personnalises que lon
obtient en excutant la commande InsertionFonction.

Figure 8.13 Utilisation dune fonction


personnalise dans une formule

Chap08.fm Page 166 Mercredi, 24. janvier 2007 5:17 17

166

Chapitre 8. Procdures et fonctions

Quand vous crez une fonction de toutes pices, vous devez cependant faire trs attention ne pas choisir le nom dune fonction
interne de VB car dans ce cas, vous redfiniriez la fonction interne ce
qui pourrait causer de srieux problmes. Aucune protection nexiste
en ce domaine et vous pouvez trs bien dfinir une fonction de la
sorte :
Function Second(nombre1 As Double, nombre2 As Double) As Double
If nombre1 > nombre2 Then
Second = nombre2
Else
Second = nombre1
End If
End Function

Cette fonction qui renvoie le plus petit de deux nombres marche


sans doute trs bien mais elle a limmense dfaut davoir le mme nom
quune fonction interne de Visual Basic qui est cense renvoyer une
valeur indiquant un nombre entier compris entre 0 et 59 qui reprsente la seconde de la minute en cours.

Les paramtres facultatifs


Comme nous lavons dj vu, un argument nomm est compos
dun nom dargument suivi des deux-points et du signe gal (:=),
puis de la valeur de largument. Les arguments nomms sont particulirement pratiques lors de lappel dune fonction comportant des
arguments facultatifs. Si vous utilisez des arguments nomms, il nest
pas ncessaire dinclure des virgules pour signaler les arguments
manquants. Lutilisation darguments nomms permet donc de voir
plus facilement les arguments passs et omis.
Les arguments facultatifs sont prcds du mot cl Optional dans la
dfinition de la fonction. Vous pouvez galement prciser une valeur
par dfaut pour largument facultatif dans la dfinition de la fonction.
On peut ainsi amliorer notre fonction jour et proposer un deuxime
argument facultatif qui indique si linitiale du nom du jour doit comporter une majuscule ; en voici la seconde mouture :
Function jour(NumJour As Byte, _
Optional Majuscule As Boolean = True) As String
Select Case NumJour

Chap08.fm Page 167 Mercredi, 24. janvier 2007 5:17 17

Syntaxe dune fonction

167

Case 1
jour = "dimanche"
Case 2
jour = "lundi"
Case 3
jour = "mardi"
Case 4
jour = "mercredi"
Case 5
jour = "jeudi"
Case 6
jour = "vendredi"
Case 7
jour = "samedi"
End Select
If Majuscule Then
' Met une majuscule l'initiale
jour = UCase(Left(jour, 1)) + Mid(jour, 2)
End If
End Function

Le deuxime paramtre est un paramtre optionnel qui a une


valeur par dfaut initialise True. Si ce paramtre est omis, la fonction renvoie le nom du jour avec une majuscule ; si cette fonction est
appele avec le paramtre Majuscule initialis False, le nom du jour
est retourn en minuscules. On peut appeler la fonction de trois
manires diffrentes et lditeur nous assiste dans la saisie des paramtres puisquil nous indique que le paramtre Majuscule est optionnel
(il est inscrit entre crochets) et en plus il nous dsigne les deux valeurs
disponibles pour ce paramtre :

Figure 8.14 Lditeur affiche une info-bulle ainsi


que les valeurs valides du paramtre facultatif

Chap08.fm Page 168 Mercredi, 24. janvier 2007 5:17 17

168

Chapitre 8. Procdures et fonctions

CONCLUSION
Au cours de ce chapitre, nous avons vu comment utiliser au
mieux la richesse de la bibliothque de fonctions de Visual Basic.
Chaque fois que cela est ncessaire dans vos programmes, il faudra utiliser toute la palette de fonctions mises votre disposition.
Faites attention cependant bien tester les fonctions que vous
employez car certaines vous tendent des piges et la documentation nest pas toujours la hauteur. Enfin, quand vous ne trouvez
pas la fonction qui vous convient parfaitement, retroussez-vous
les manches et crez votre propre fonction. Vos macros gagneront ainsi en modularit et en lisibilit. Nous avons prsent fait
le tour du langage Visual Basic et il nous reste, pour tre tout
fait complet et exploiter la puissance des applications hbergeant
VBA, tudier le concept dobjet que nous allons aborder dans
la prochaine partie.

Partie03.fm Page 169 Mardi, 23. janvier 2007 5:18 17

PARTIE 3

Modles
dobjets

Partie03.fm Page 170 Mardi, 23. janvier 2007 5:18 17

Chap09.fm Page 171 Mardi, 23. janvier 2007 5:11 17

9
Objets
En franais, le terme objet est un mot vraiment passe-partout : si lon
jette un coup dil dans un dictionnaire, on sapercevra que dans son
acception la plus courante, son meilleur synonyme est chose et dans un
registre plus familier, truc, machin, bidule. tymologiquement, objet
dsigne dailleurs ce qui est plac devant soi, ce qui a pour consquence
que virtuellement tout peut tre un objet, les hommes (terme gnrique
qui embrasse les femmes) y compris Le terme objet est devenu trs
la mode en informatique depuis une vingtaine dannes avec lapparition du langage C++ ; on sest mis alors parler de programmation
oriente objets (POO) ou de programmation par objets. Pourtant,
lapparition du premier langage objet eut lieu au milieu des annes 1960
avec Simula 67, puis Smalltalk. Smalltalk tait le langage utilis pour
programmer linterface utilisateur graphique invente par les ingnieurs
de Xerox au Palo Alto Research Center (PARC) dont sinspirrent trs
largement les crateurs du Macintosh. Ce type dinterface fut galement
imit, ce qui donna naissance, quelques annes plus tard, Windows
(fin de la leon dhistoire).
Aujourdhui, de nombreux ayatollahs ont tendance penser que si
lon ne programme pas objet, on nest rien en informatique. Nous
emploierons ici un propos beaucoup plus nuanc car nous considrons
que si la thorie de la programmation objet peut se rvler sduisante,
certains concepts demeurent flous et son implmentation (sa mise en
uvre) peut tre trs dcevante. De plus, mme si Office est constell
dobjets, il est clair que VBA nest pas totalement un langage orient

Chap09.fm Page 172 Mardi, 23. janvier 2007 5:11 17

172

Chapitre 9. Objets

objets. Enfin, nous montrerons quon peut trs bien programmer Office
sans matriser les concepts de programmation par objets. Cette bonne
nouvelle a pour consquence que vous ne subirez pas ici de longs discours thoriques sur la POO et que nous ferons lconomie de la mtaphore de lautomobile prsente comme un systme objet, grand
classique de tous les ouvrages traitant de la POO. Nous pensons en effet
que lon peut trs bien utiliser la puissance de Word, dExcel dAccess,
dOutlook et PowerPoint dans des programmes VBA en ignorant compltement les concepts de la POO. Quand vous connatrez bien le
modle objet dOffice, il sera toujours temps de vous plonger dans la
thorie des objets et de crer ventuellement vos propres objets.

DFINITION DUN OBJET


En fait, dans Windows, tout ou presque est un objet ; ainsi, une fentre, un ascenseur, un bouton dans une bote de dialogue sont des
objets. Microsoft dfinit un objet comme une combinaison de code et
de donnes pouvant tre traite comme une entit. Classiquement,
les programmeurs avaient lhabitude de sparer les traitements (commandes et fonctions) des donnes. Avec la POO, on traite globalement le code et les donnes au sein dun objet. On retrouve
nanmoins cette distinction car un objet est constitu de proprits et
de mthodes. Les proprits dun objet sont ses attributs ; elles dfinissent les caractristiques dun objet. Si lon prend lexemple dune
fentre, ses proprits sont sa taille, sa couleur, sa position, etc. Les
mthodes sont des procdures agissant sur un objet : rduire, restaurer,
agrandir et fermer sont les mthodes dun objet fentre. Une mthode
est identique une fonction, mais elle ne renvoie pas de valeur de
retour. Les proprits sont donc censes contenir des informations sur
les objets et les mthodes exercer des actions sur les objets. Cette distinction dans les faits nest malheureusement pas toujours aussi claire
comme nous allons le voir. Reprenons lexemple de notre objet fentre : cet objet a une proprit Visible qui indique si la fentre est visible ou non. Si cette proprit est vraie et que lon dcide de la
modifier, cela aura pour effet de rendre lobjet invisible. Cette proprit a donc pour effet dafficher ou de masquer la fentre et on aurait
pu tout aussi bien employer une mthode dans ce cas prcis.

Chap09.fm Page 173 Mardi, 23. janvier 2007 5:11 17

Objets dans Office

173

OBJETS DANS OFFICE


Les objets sont galement omniprsents dans Office ; prenons le cas
de Word : les moindres lments du logiciel sont considrs comme
des objets. Pour ne prendre que quelques exemples, un paragraphe,
la slection, une phrase, un mot, voire un caractre sont des objets.
Office est un logiciel trs puissant et trs complet qui permet un
utilisateur daccomplir de trs nombreuses tches ; mais ce qui en
fait un logiciel incomparable, cest quil met la disposition du programmeur ses composants. En fait, programmer Office consiste utiliser les objets qui constituent Office en employant le langage de
programmation VBA. De la mme manire que nous avons utilis
des variables pour manipuler des informations, nous allons prsent
utiliser les objets dOffice pour traiter des donnes. Les actions que
nous pourrons accomplir sur les objets ne sont pas trs nombreuses
et elles se rsument :
lire la proprit dun objet,
modifier la proprit dun objet,
excuter la mthode dun objet.
Pour programmer Office, il faut connatre la grammaire (VBA) et
le vocabulaire (les objets) dOffice. Nous avons vu dans les chapitres
prcdents que la syntaxe de VBA tait relativement simple, mais il
faut en revanche reconnatre que la manipulation des objets dans
Office nest pas toujours une partie de plaisir. Il y a principalement
trois raisons cela : tout dabord, la terminologie objet nest pas toujours claire et cohrente ; en outre, il y a plusieurs manires daccder
des objets et enfin il y a une plthore dobjets, ce qui fait quon ne
sait pas trs bien par o commencer quand on veut entamer ltude
des objets dOffice. Pour ne prendre quun seul exemple, le manuel de
rfrence des objets de Word comporte prs de 1 500 pages Dans
ces conditions, comment sy retrouver ?
Il y a plusieurs mthodes et nous allons laborer une stratgie qui
vous permettra davancer votre rythme et de trouver les rponses
aux questions que vous vous posez. Nous allons par consquent voir
dans ce chapitre comment apprivoiser un modle objet puis nous tudierons dans les chapitres suivants les principaux objets de Word,
dExcel dAccess, dOutlook et de PowerPoint.

Chap09.fm Page 174 Mardi, 23. janvier 2007 5:11 17

174

Chapitre 9. Objets

UN OBJET EN SITUATION
Si lon reprend lexemple dune macro enregistre qui insre un
tableau de 6 lignes et de 7 colonnes, on saperoit que le gnrateur
de code a produit lextrait de programme suivant :
ActiveDocument.Tables.Add _
Range:=Selection.Range, _
NumRows:=6, _
NumColumns:=7, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed

Cette instruction, comme vous le savez, a pour effet de tracer un


tableau form de 6 lignes et de 7 colonnes. Nous allons prsent examiner la manire dont elle est forme car vous vous apercevez bien quelle
ne ressemble rien de ce que nous avons dj tudi. Cette instruction
en effet nest ni une commande (on ne retrouve aucun mot faisant partie de la liste des commandes) ni une fonction interne de Visual Basic.
Il sagit, vous laurez devin, dun objet. Nous vous rappelons que cette
instruction qui, pour des raisons videntes de lisibilit, se compose de 6
lignes physiques ne reprsente en fait quune seule ligne logique.
La premire chose qui tonne dans cette syntaxe est lutilisation
des points : le point est ici considr comme un sparateur ; il indique
le chemin parcourir dans la hirarchie des objets un peu comme
lantislash (\) est un sparateur de rpertoires et indique un chemin
daccs un fichier.
ActiveDocument.Tables.Add dsigne donc une arborescence
trois niveaux. Il est dailleurs possible de consulter cette organisation
hirarchique dans laide en ligne.
Laide en ligne de VBA
Il est tout fait possible dappeler laide en ligne de VBA laide de la
touche de fonction F1 quand vous tes dans lditeur de programmes
Visual Basic. Il existe cependant une autre manire dinvoquer le systme daide de VBA : il suffit pour cela douvrir directement les fichiers
daide qui sont des fichiers HTML compils (ayant une extension
.CHM). Quand on fait un double-clic sur un de ces fichiers, son contenu saffiche dans un navigateur.

Chap09.fm Page 175 Mardi, 23. janvier 2007 5:11 17

175

Un objet en situation

Il existe un fichier daide pour chaque application Office et il ne vous


reste plus qu les reprer sur votre disque dur pour pouvoir les visualiser. En gnral, ces fichiers sont situs dans le dossier \Program
File\Microsoft Office\Office\1036. Le tableau suivant liste les principaux
fichiers de laide en ligne de VBA :
Application

Version 2000

Version XP

Version 2003

Version 2007

Word

VBAWRD9.CHM

VBAWD10.CHM

VBAWD10.CHM

WINWORD.DEV.HXS

Excel

VBAXL9.CHM

VBAXL10.CHM

VBAXL10.CHM

EXCEL.DEV.HXS

Access

ACMAIN9.CHM

VBAAC10.CHM

VBAAC10.CHM

MSACCESS.DEV.HXS

Outlook

VBAOUTL9.CHM

VBAOL10.CHM

VBAOL11.CHM

OUTLOOK.DEV.HXS

PowerPoint

VBAPP9.CHM

VBAPP10.CHM

VBAPP10.CHM

POWERPNT.DEV.HXS

Comme vous pouvez le constater, Microsoft a utilis la numrotation


interne des versions dOffice, savoir 9 pour Office 2000, 10 pour
Office XP, 11 pour Office 2003 et 12 pour Office 2007. Il y a visiblement
eu un petit problme de numrotation pour les fichiers de la version
2003, mais heureusement, le contenu est bien jour. Vous remarquerez
galement que pour Access 2000, laide en ligne de VBA est intgre
dans laide en ligne gnrale dAccess alors que pour les versions XP et
2003, il existe un fichier part consacr exclusivement VBA.
La premire page de ces fichiers daide affiche le modle dobjets de
lapplication concerne (figure 9.1).

Figure 9.1 Hirarchie du modle dobjets de Word

Chap09.fm Page 176 Mardi, 23. janvier 2007 5:11 17

176

Chapitre 9. Objets

Notons enfin que grce lapplication HTML Help Workshop (tlchargeable gratuitement sur le site de Microsoft), il est possible de dcompiler chacun de ces fichiers daide au format CHM, ce qui peut offrir
des perspectives intressantes si lon souhaite se forger sa propre documentation.

Office Dans Office 2007, le format lectronique de laide en ligne a t


2 0 0 7 modifi. Microsoft a abandonn le format CHM au profit du
format HXS. Si vous voulez dcompiler les fichiers de laide en ligne
dOffice 2007, nous vous conseillons de vous procurer le logiciel FAR
disponible ladresse suivante : http://www.helpware.net/FAR/

Un modle dobjets prsente tous les objets relatifs une application (ou une technologie) sous forme darborescence ; cette arborescence nest pas parfaitement hirarchique comme nous le verrons plus
tard, mais on peut nanmoins constater quil existe plusieurs niveaux
car certains objets pointent vers dautres objets (EmailOptions pointe
vers EmailSignature) et certains objets comportent une flche qui sert
dvelopper un autre niveau darborescence. La lgende du graphique
nous indique aussi que certains lments sont la fois des objets et des
collections : il sagit des pavs les plus clairs dont lintitul comporte
un mot au pluriel et, entre parenthses, ce mme mot au singulier
comme dans Documents (Document). Microsoft dfinit une collection comme un objet contenant plusieurs objets, gnralement du
mme type, mais pas toujours. Dans lexemple qui nous concerne, la
collection Documents contient tous les objets Document de Word.
On pourrait donc dire quune collection est un ensemble dobjets. Les
lments dune collection peuvent tre identifis par un numro (un
indice) ou bien directement par leur nom. Ainsi Documents(1) identifie le premier document de Word ouvert, Documents(2) le
deuxime et ainsi de suite. Si un fichier Word sappelle TEST.DOC,
on peut galement y faire rfrence sous la dsignation Documents("TEST.DOC").
Vous pouvez aussi voir dans le modle dobjets de Word quil existe
un objet appel Application et partir duquel partent tous les autres
objets ou collections. Dans notre cas, lobjet Application reprsente
lapplication Word et cet objet contient des proprits et des mthodes
qui renvoient des objets de premier niveau. Chaque application
dOffice, que ce soit Word, Excel, Access, Outlook ou PowerPoint, pos-

Chap09.fm Page 177 Mardi, 23. janvier 2007 5:11 17

Un objet en situation

177

sde un objet Application qui sert de base tous les autres objets et
reprsente lapplication en question. Cet objet Application, comme
tout objet, possde des proprits et des mthodes. Il existe de nombreux moyens pour connatre les mthodes et les proprits dun objet
et nous allons prsent en exprimenter un. Pour ce faire, lancez Word
et ouvrez lditeur de programmes. Dans la fentre de code, saisissez :
Application.

Ds que vous avez tap le point, vous devez voir apparatre une liste
droulante (figure 9.2).

Figure 9.2 Lditeur affiche les proprits et les mthodes des objets

La technologie Intellisense, une fois de plus, fait merveille : cette


liste prsente la totalit des proprits et des mthodes de lobjet
Application. Les proprits sont distingues des mthodes par un symbole plac devant et, dans notre exemple, Activate est une mthode
et ActiveDocument une proprit. Cette dernire proprit nous
intresse car elle figure dans notre exemple de code :
ActiveDocument.Tables.Add

Pour insrer cette proprit, il suffit de la slectionner dans la liste


droulante et dappuyer sur la barre despacement. Si lon souhaite
connatre la signification de cette proprit, il ny a rien de plus simple puisquil ny a qu slectionner le mot ActiveDocument et presser
la touche de fonction F1. Laide en ligne nous apprend alors que cette
proprit renvoie un objet Document qui reprsente le document
actif (celui qui est slectionn). Laide nous prcise encore que si
aucun document nest ouvert, une erreur se produit ; cette proprit
est en lecture seule, ce qui signifie quon ne peut pas la modifier.

Chap09.fm Page 178 Mardi, 23. janvier 2007 5:11 17

178

Chapitre 9. Objets

La formule Application.ActiveDocument renvoie donc le document


actif. La documentation de lobjet Application mentionne toutefois que la
plupart des proprits et des mthodes peuvent tre utilises sans le qualificateur dobjet Application, ce qui signifie que Application.ActiveDocument et ActiveDocument sont des quivalents. Dans la mesure o
ActiveDocument renvoie le document actif, il sagit dun lment de la
collection Documents et nous devons explorer le deuxime niveau de
larborescence du modle dobjets de Word (en pratique, il suffit de cliquer
sur la flche rouge situe droite du pav de la collection Documents) :

Figure 9.3 Hirarchie de la collection Documents

Chap09.fm Page 179 Mardi, 23. janvier 2007 5:11 17

Un objet en situation

179

On peut alors sapercevoir en bas de la copie dcran que la collection Documents renferme elle-mme une collection baptise Tables
que lon peut galement visualiser en cliquant sur la flche rouge
(figure 9.4).

Figure 9.4 Hirarchie de la collection Tables

Sur ce schma, la collection Tables ne comporte aucun objet intitul Add si bien que lon peut en conclure que le mot Add dans la hirarchie ActiveDocument.Tables.Add ne peut reprsenter quune
proprit ou une mthode. Si on connat langlais, on sait que le verbe
add signifie ajouter ; en gnral, les mthodes sont dsignes par des
verbes anglais et il est ainsi facile de faire la diffrence entre mthodes
et proprits. Pour sen persuader, il suffit de retourner dans lditeur
de programmes (figure 9.5).

Figure 9.5 Proprits et mthodes de la collection


Tables affiches dans lditeur

Si lon souhaite avoir plus de renseignements sur la collection


Tables, il suffit de cliquer dans le graphique sur le pav adquat pour
afficher laide en ligne (figure 9.6).

Chap09.fm Page 180 Mardi, 23. janvier 2007 5:11 17

180

Chapitre 9. Objets

Figure 9.6 Aide en ligne de la collection Tables

La documentation nous fournit des explications concernant lobjet


Table, mais elle possde surtout deux hyperliens qui permettent de lister les proprits et les mthodes de lobjet. Ainsi, le fait de cliquer sur
le lien Proprits affiche la bote de dialogue suivante :

Figure 9.7 Proprits de la collection Tables

Bien videmment, en cliquant sur le lien Mthodes, on affiche les


mthodes de lobjet. La collection Tables compte donc cinq
proprits :

Application
Count
Creator
NestingLevel
Parent

et deux mthodes :

Chap09.fm Page 181 Mardi, 23. janvier 2007 5:11 17

Un objet en situation

181

Add
Item
Ce qui est rassurant, cest que laide en ligne indique exactement la
mme chose que laide disponible dans lditeur de programmes quand
on saisit le point juste aprs ActiveDocument.Tables.
Allons prsent examiner ce que nous dit laide en ligne propos
de la mthode Add.
Cette mthode ajoute un nouveau tableau vide dans un document.
Syntaxe :
expression.Add(Range, NumRows, NumColumns, DefaultTableBehavior,
AutoFitBehavior)

expression Obligatoire. Expression qui renvoie un objet Tables.


Range Argument de type Range obligatoire. Plage dans laquelle
vous souhaitez faire figurer le tableau. Si la plage nest pas rduite,
le tableau la remplace.
NumRows Argument de type Long obligatoire. Nombre de
lignes que vous souhaitez inclure dans le tableau.
NumColumns Argument de type Long obligatoire. Nombre de
colonnes que vous souhaitez inclure dans un tableau.
DefaultTableBehavior Argument de type Variant facultatif.
Dfinit une valeur qui indique si Microsoft Word doit redimensionner automatiquement les cellules des tables en fonction de
leur contenu (Ajustement automatique). Il peut sagir de lune
des deux constantes suivantes : wdWord8TableBehavior (Ajustement automatique dsactiv) ou wdWord9TableBehavior
(Ajustement automatique activ). La constante par dfaut est
wdWord8TableBehavior.
AutoFitBehavior Argument de type Variant facultatif. Dfinit
les rgles dAjustement automatique relatives au dimensionnement des tables par Word. Il peut sagir de lune des constantes
WdAutoFitBehavior suivantes : wdAutoFitContent, wdAutoFitFixed ou wdAutoFitWindow. Si DefaultTableBehavior a
pour valeur wdWord8TableBehavior, cet argument est ignor.
Des renseignements plus succincts nous sont galement donns par
laide de lditeur (figure 9.8).

Chap09.fm Page 182 Mardi, 23. janvier 2007 5:11 17

182

Chapitre 9. Objets

Figure 9.8 Une info-bulle indique la liste des paramtres de la mthode

Remarquons tout dabord que la mthode Add se prsente exactement


comme une fonction puisquelle comporte des parenthses et des paramtres. Laide Intellisense nous permet tout de suite de voir que les trois premiers arguments sont obligatoires et les deux derniers sont facultatifs.
Le premier paramtre, Range, est le plus difficile cerner : il sagit
dun objet du modle dobjets de Word et ce titre, il peut galement
tre visualis sous la forme dun schma hirarchique :

Figure 9.9 Hirarchie de lobjet Range dans le modle


dobjets de Word

Chap09.fm Page 183 Mardi, 23. janvier 2007 5:11 17

Un objet en situation

183

Ce qui choque de prime abord, cest que lobjet Range peut contenir une collection Tables alors que cet objet est lui-mme renvoy par
la mthode Add dun objet Table, si bien que lon a la trs nette
impression dune arborescence qui tourne en rond. Il faudra pourtant
vous y faire car les modles dobjets dOffice ne sont pas totalement
hirarchiques et si lon considre cette arborescence comme un arbre
gnalogique, des parents risquent de se retrouver les enfants de leurs
enfants
Comme le laisse supposer le schma, lobjet Range (qui signifie
plage en anglais) est un objet particulirement important dans Word ;
il reprsente une zone contigu dans un document qui est dfinie par
la position dun caractre de dbut et celle dun caractre de fin.
Grce un objet Range, on peut identifier les parties spcifiques dun
document. Il ne faut cependant pas confondre un objet Range avec la
slection mme si lon peut dfinir un objet Range avec le contenu de
la slection. Un objet Range est indpendant de la slection, cest-dire que lon peut dfinir et manipuler une plage sans modifier la
slection. Il est galement possible de dfinir plusieurs plages dans un
document, alors quil ne peut y avoir quune seule slection. Le code
suivant dfinit une plage qui comprend les 100 premiers caractres du
document actif :
ActiveDocument.Range(Start :=0, End :=100)

Quand on insre un tableau, le plus simple est sans nul doute de


linsrer la position courante du curseur et cest ce que fait le code
gnr par lenregistreur de macros :
Range:=Selection.Range

Lobjet Range est ainsi dfini par la proprit Range de lobjet


Selection, ce qui signifie que lon assigne la plage le contenu de la
slection. Mais si la slection est vide (aucun caractre nest slectionn), la plage est rduite sa plus simple expression, savoir le
pointeur dinsertion. En revanche, si la slection nest pas vide et ne
comporte ne serait-ce quun seul caractre, le tableau remplace le
contenu de la slection qui a t assign lobjet Range. Cest comme
cela quil faut comprendre la phrase de laide en ligne qui dclare que
si la plage nest pas rduite, le tableau la remplace. Cela signifie que si
la plage comporte au moins un caractre, la zone dfinie par la plage

Chap09.fm Page 184 Mardi, 23. janvier 2007 5:11 17

184

Chapitre 9. Objets

est remplace par le tableau. Si lon souhaite insrer un tableau une


position particulire sans remplacer quoi que ce soit, il suffit de dfinir
une plage qui ne contient aucun caractre. Lexemple suivant insre
un tableau, au centime caractre du document actif sans rien effacer :
Application.ActiveDocument.Tables.Add _
Range:=ActiveDocument.Range(Start:=100, End:=100), _

Les deux paramtres suivants sont trs simples et indiquent le nombre de lignes et de colonnes du tableau :
NumRows:=6, _
NumColumns:=7, _

Il sagit ici bien videmment darguments nomms et vous devez


respecter scrupuleusement lorthographe de ces paramtres.
Les deux derniers arguments sont facultatifs :
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed

Si le paramtre DefaultTableBehavior est bien dcrit dans la documentation, les constantes de AutoFitBehavior, en revanche, ne sont
pas explicites. Ceci peut se comprendre par le fait que ces constantes
sont parlantes pour un anglophone. Ces trois constantes correspondent en fait aux options de la commande TableauAjustement automatique :
wdAutoFitContent correspond Ajuster au contenu,
wdAutoFitFixed correspond Largeur de colonne fixe,
wdAutoFitWindow correspond Ajuster la fentre.
Ainsi sachve lexplication dune seule ligne de code gnre
laide de lenregistreur de macros lorsque vous insrez un tableau. Tout
ceci a pu vous paratre laborieux, mais il faut reconnatre que pntrer
les modles dobjets dOffice nest pas chose facile. Il faut parfois parcourir la documentation en tous sens pour arriver ses fins et les dbutants sont souvent apeurs devant le nombre dobjets, proprits et
mthodes. Il ne faut pas cependant tre effray car le nombre des
objets que vous allez rellement utiliser est assez restreint ; en effet, de
la mme manire que vous utilisez Word 30 % de ses possibilits
(dans le meilleur des cas), vous emploierez une faible quantit

Chap09.fm Page 185 Mardi, 23. janvier 2007 5:11 17

crire des fonctions pour manipuler des objets

185

dobjets. Dautre part, comme nous le verrons un peu plus loin, il


existe une stratgie pour construire ses macros mme si le modle
dobjets dune application vous est tranger. Enfin, on prend trs vite
lhabitude de manipuler des objets et ce qui pouvait apparatre comme
totalement sotrique de prime abord deviendra rapidement une
seconde nature.

CRIRE DES FONCTIONS POUR MANIPULER


DES OBJETS
Au cours de ltude de la mthode Add qui insre un tableau, il a pu
vous apparatre une certaine similitude entre les mthodes et les
fonctions. Cette ressemblance nest pas fortuite et il est assez facile
de transformer lexcution dune mthode par un appel de fonction.
Il suffit pour ce faire dcrire une fonction qui masque la complexit
apparente de lobjet et sa syntaxe si particulire. Admettons que
dans les macros Word que vous crivez, vous deviez souvent insrer
des tableaux dans des documents ; si lon prend comme hypothse
que vous les insrez toujours lendroit o se situe le curseur et que
vos colonnes sont de largeur gale, il suffit dcrire une fonction
avec deux paramtres : le nombre de lignes et de colonnes du
tableau.
Cette fonction peut scrire de cette manire :
Function InsereTableau(Lignes As Integer, Colonnes As Integer)
Application.ActiveDocument.Tables.Add _
Range:=Selection.Range, _
NumRows:=Lignes, _
NumColumns:=Colonnes, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed
InsereTableau = 0
End Function

Une fois que cette fonction est rdige, il suffit ensuite pour insrer
un tableau de 10 lignes et de 6 colonnes, deffectuer lappel de fonction suivant :
x = InsereTableau(10, 6)

Chap09.fm Page 186 Mardi, 23. janvier 2007 5:11 17

186

Chapitre 9. Objets

Lapplication peut ainsi gagner en lisibilit et masquer la complexit de certains objets. Il est ainsi possible de crer toute une srie
de fonctions dont on se servira en lieu et place de la manipulation
directe des objets.

LEXPLORATEUR DOBJETS
Une fois que lon connat la syntaxe de VBA, le grand dfi rside dans
lapprentissage des objets qui constituent lapplication avec laquelle
on dveloppe. Pour parfaire cette connaissance, il existe un outil disponible dans lditeur de programmes : lExplorateur dobjets. Cette
fentre, que lon appelle par la commande AffichageExplorateur
dobjets (ou bien en appuyant sur F2), affiche les objets, les proprits,
les mthodes et les constantes du modle dobjets de lapplication en
cours. Par exemple, si vous travaillez sous Excel, lappui sur les touches
ALT + F11 puis F2 fera apparatre la fentre suivante :

Figure 9.10 Lexplorateur dobjets


dans lditeur de programmes dExcel

La premire liste droulante affiche la liste des bibliothques


dobjets disponibles. Une bibliothque dobjets (library en anglais
signifie bibliothque) est lensemble des objets dune application ;
dans notre exemple, il sagit de la bibliothque dExcel 2003. Cette

Chap09.fm Page 187 Mardi, 23. janvier 2007 5:11 17

Lexplorateur dobjets

187

bibliothque est dans les faits un fichier, nomm EXCEL11.OLB dont


le chemin daccs figure en bas dans le volet Dtails de lExplorateur
dobjets. Ce volet est similaire une barre dtat et il affiche des informations sur llment slectionn.
La liste Classes affiche toutes les classes disponibles dans la bibliothque dobjets. Le terme classe appartient au vocabulaire de la POO ;
une classe est une usine objets, une sorte de moule qui permet de
produire des objets en srie. Dans le jargon de la POO, on dira quun
objet est une instance dune classe. Instance est ici prendre au sens
anglais du terme, savoir exemple ou occurrence. Cette liste affiche
donc les objets et les collections du modle dobjets dExcel. La liste
commence toujours par <globales> ; il sagit des mthodes et des proprits qui peuvent tre utilises sans que lobjet Application soit
explicitement mentionn. Nous avons dj rencontr une proprit
globale avec ActiveDocument. On appelle membres dun objet les
proprits et les mthodes de cet objet. Les membres sont classs par
ordre alphabtique. Si vous voulez regrouper les membres par catgorie (proprits puis mthodes), faites un clic droit dans lExplorateur
dobjets et choisissez la commande Membres du groupe dans le menu
contextuel (le traducteur qui a localis le logiciel a traduit Group
members par Membres du groupe au lieu de Grouper les membres).
Vous remarquerez, en passant, que le volet Dtails donne la syntaxe
des mthodes en leur attribuant le titre de Function. Si vous souhaitez
obtenir de laide sur un des membres dun objet, il suffit de le slectionner et de cliquer ensuite sur le bouton qui affiche un point dinterrogation jaune.
Il est galement possible deffectuer une recherche dans lexplorateur dobjets ce qui se rvle souvent beaucoup plus pratique et efficace que linterrogation de laide en ligne. Ce type de recherche a
pour principal avantage de pouvoir situer rapidement les lments
trouvs au sein de larborescence du modle dobjets. Le systme
nimpose pas une correspondance exacte ce qui signifie quon nest pas
oblig de rechercher un terme exact et quune chane de caractres
peut tre retrouve au sein dun nom de mthode ou de proprit
comme le montre lexemple suivant :

Chap09.fm Page 188 Mardi, 23. janvier 2007 5:11 17

188

Chapitre 9. Objets

Figure 9.11 Recherche dans le modle


dobjets de Word

Le volet Rsultats de la recherche affiche la bibliothque, la classe


et le membre correspondant aux lments indiqus dans la chane de
recherche. La chane de caractres autofitbehavior a ici t retrouve
la fois dans la mthode AutoFitBehavior de lobjet Table mais galement dans la constante WdAutoFitBehavior.

AUTRES MODLES DOBJETS


Dans le cadre de cet ouvrage, nous nous concentrons sur les modles
dobjets de Word, dExcel, dAccess, dOutlook et de PowerPoint. Il
existe cependant dautres modles dobjets dont vous trouverez cidessous la liste :
Application

Fichier daide en ligne

Graph

VBAGR10.CHM

Office (composants communs


toutes les applications Office)

VBAOF11.CHM

Extensions serveur Office

VBAOWS10.CHM

Publisher

VBAPB10.CHM

FrontPage

VBAFPD10.CHM et VBAFPW10.CHM

Chap09.fm Page 189 Mardi, 23. janvier 2007 5:11 17

Autres modles dobjets

189

Office Dans Office 2007, le fichier VBE.DEV.HXS est laide en ligne de


2 0 0 7 Visual Basic (manuel de rfrence du langage, guide de lditeur
de programmes, techniques de programmation, etc.). Le fichier
MSPUB.DEV.HXS reprsente laide en ligne VBA de Publisher. Les
fichiers concernant FrontPage ont disparu dans la mesure o ce logiciel
ne fait plus partie de la suite.

Outre la documentation en ligne propose par Microsoft, vous


trouverez dans les fichiers qui accompagnent cet ouvrage plusieurs
documents qui compltent laide en ligne dOffice. En effet, la documentation de Microsoft est loin dtre parfaite et nous avons essay,
autant que faire se peut, de combler certaines lacunes. Vous trouverez
notamment des fichiers HTML qui listent les modles dobjets de
chaque application en faisant bien apparatre les lments nouveaux
entre les quatre versions dOffice (2000, XP, 2003 et 2007).

Figure 9.12 Exemple de documentation


lectronique livre avec cet ouvrage

Chap09.fm Page 190 Mardi, 23. janvier 2007 5:11 17

190

Chapitre 9. Objets

CONCLUSION
Nous avons vu dans ce chapitre la manire dexploiter les objets
dOffice. Pour parfaire vos connaissances et crire des programmes de plus en plus sophistiqus, il vous reste dsormais
apprendre le modle dobjets de chaque application dOffice
avec laquelle vous souhaitez dvelopper.
Pour apprendre ces modles dobjets, vous disposez de plusieurs
sources dinformations :
lenregistreur de macros (disponible avec Word, Excel et
PowerPoint) ;
la technologie Intellisense qui vous guide pas pas dans lcriture de vos programmes ;
lExplorateur dobjets ;
la documentation lectronique (celle livre avec Office et celle
disponible avec cet ouvrage).
Dans les prochains chapitres, nous allons vous prsenter les
modles dobjets de Word, dExcel, dAccess, dOutlook et de
PowerPoint.

Chap10.fm Page 191 Mardi, 23. janvier 2007 5:11 17

10
Programmer
Word
Par la taille, le modle dobjets de Word est le plus important de
toutes les applications Office. Compte tenu de ses dimensions, il est
bien videmment hors de question que nous soyons exhaustifs sur le
sujet. Nous nous contenterons dtudier les objets les plus importants. Comme souvent en informatique, vous constaterez quil
existe plusieurs moyens pour arriver au mme rsultat et il nest pas
rare de trouver quatre versions diffrentes dun mme programme
pour manipuler le mme objet. Cette abondance ne doit pas vous
effrayer et lessentiel est que vous reteniez au moins la formule qui
vous parat la plus simple.
Nous vous rappelons cependant que pour connatre un modle
dobjets, il faut dabord commencer par bien connatre lapplication
elle-mme. Lenregistreur de macros (sil existe dans lapplication),
lExplorateur dobjets et la documentation lectronique sont galement
dexcellents moyens pour apprendre les objets dune application.
Vous trouverez dans la documentation lectronique qui
accompagne ce livre un fichier nomm ObjetsWord.HTM qui
recense lensemble des collections et objets des diffrentes versions de Word (2000, XP, 2003 et 2007).

Chap10.fm Page 192 Mardi, 23. janvier 2007 5:11 17

192

Chapitre 10. Programmer Word

OBJET APPLICATION
Lobjet Application est lobjet de plus haut niveau et cest donc
partir de cet objet que lon peut descendre dans larborescence du
modle dobjets. En thorie, nimporte quelle rfrence un objet
devrait toujours commencer par Application, comme dans Application.ActiveDocument ; cependant, bon nombre de proprits de
lobjet Application sont globales et on peut les employer directement sans les prfixer par Application (cest notamment le cas de
ActiveDocument).
Attardons-nous un moment sur quelques proprits importantes de
lobjet Application.
La proprit ActiveDocument est trs intressante car elle renvoie
un objet de type Document qui reprsente le document qui est actif
(dans le jargon de Windows, on dit quil dtient le focus). Word peut
avoir plusieurs documents ouverts en mme temps, mais il ny a quun
seul document actif un instant donn.
La proprit ActivePrinter permet de renvoyer ou de dfinir le
nom de limprimante active, comme dans lexemple suivant :
ActivePrinter = "HP LaserJet 4 local on LPT1:"

Les proprits Build et Version permettent de connatre exactement le numro de la version de Word qui est excute. Ainsi, sur
notre machine, Application.Version renvoie 12.0 ce qui signifie que
nous utilisons Word 2007 ; Application.Build renvoie le numro de
Build, cest--dire de sous-version de Word (ces informations apparaissent galement dans la commande ? propos de Microsoft
Word). Ces proprits sont trs importantes si vous envisagez de crer
des macros qui puissent fonctionner la fois sous Word 2000, Word
2002, Word 2003 ou bien encore Word 2007. Bien que la majorit des
programmes fonctionnent indiffremment sur lune ou lautre version,
il est vident que les macros prenant en compte les nouveaux objets
de Word 2007 ne pourront pas fonctionner sous Word 2000. Un simple test conditionnel pour vrifier le numro de la version de Word
qui excute la macro permet dviter un message derreur bloquant.

Chap10.fm Page 193 Mardi, 23. janvier 2007 5:11 17

193

Objet Application

If Val(Application.Version) <> 10 Then


MsgBox "Cette macro ne peut fonctionner qu'avec Word 2002"
End If

La proprit Dialogs permet de renvoyer la collection Dialogs qui


contient lensemble des botes de dialogue de Word. Grce la
mthode Show, on peut afficher nimporte quelle bote de dialogue de
Word si lon prcise comme paramtre le numro de la bote de dialogue. Par exemple :
Application.Dialogs(577).Show

affiche la bote suivante :

Figure 10.1 Bote de dialogue affiche


laide de la proprit Dialogs

Comme pour la fonction MsgBox, il existe des constantes qui permettent de remplacer les numros des botes de dialogue par des libells un peu plus explicites ; notre dernire ligne de code peut ainsi
scrire :
Application.Dialogs(wdDialogViewZoom).Show

Il y a 225 constantes dans Word 2003 et 326 constantes dans Word


2007 qui dfinissent les numros des botes de dialogue de la collection Dialogs. Ces constantes forment ce que lon appelle en VBA une
numration. Vous trouverez la liste complte de ces constantes dans
la documentation lectronique livre avec cet ouvrage.
La proprit FileSearch permet de renvoyer un objet FileSearch
qui recherche des fichiers sur le disque dur. Ainsi le programme sui-

Chap10.fm Page 194 Mardi, 23. janvier 2007 5:11 17

194

Chapitre 10. Programmer Word

vant affiche dans une bote de message tous les documents Word
situs dans le rpertoire Mes Documents :
Application.FileSearch.FileName = ".DOC"
Application.FileSearch.LookIn = "C:\Mes Documents"
Application.FileSearch.Execute
For I = 1 To Application.FileSearch.FoundFiles.Count
MsgBox (Application.FileSearch.FoundFiles(I))
Next I

Il existe une construction du langage VBA qui permet de mettre en


facteur commun un lment dun objet qui se rpte comme dans le
programme prcdent. Ainsi, notre macro peut tre rcrite laide de
linstruction With End With :
With Application.FileSearch
.FileName = ".DOC"
.LookIn = "C:\Mes Documents"
.Execute
For I = 1 To .FoundFiles.Count
MsgBox .FoundFiles(I)
Next I
End With

Le programme gagne ainsi en concision et en lisibilit.


La proprit Language permet de dterminer la langue qui est
employe pour linterface utilisateur de Word. Elle renvoie un nombre
qui correspond une langue dfinie dans lEnum MsoLanguageID.
Pour la France, Application.Language renvoie 1036 qui correspond
la constante MsoLanguageIDFrench. Cette proprit vous permet de
crer des macros multilingues et de prvoir ainsi plusieurs langues
dans vos botes de dialogue en fonction de la valeur renvoye par la
proprit Language.
La proprit Options permet de dfinir les options de Word et la
plupart des proprits de lobjet Options correspondent aux lments
de la bote de dialogue de la commande OutilsOptions (certaines
options, notamment celles daffichage, sont cependant dfinies grce
la proprit ActiveWindow.View). Vous pourriez alors penser que
pour dfinir des options dans un programme, il est beaucoup plus simple denregistrer automatiquement une macro, plutt que dapprendre
la syntaxe des nombreuses options de Word. Malheureusement,
lenregistreur de macros se montre trs bavard, et si lon obtient bien

Chap10.fm Page 195 Mardi, 23. janvier 2007 5:11 17

Objet Application

195

le rsultat voulu, il est noy dans un volume de code trs important.


Ainsi, le simple fait de choisir la commande OutilsOptions
GnralConfirmation des conversions lors de louverture gnre un
programme dune cinquantaine de lignes, alors quune seule ligne de
code suffit :
Application.Options.ConfirmConversions = True

Office Ce dfaut nexiste plus dans Word 2007 ; en pareil cas, lEnre2 0 0 7 gistreur de macros gnre le code suivant :
Options.ConfirmConversions = True

Dans ces conditions, il vaut alors mieux dfinir les options individuellement grce un code beaucoup plus compact. Lexemple de
code suivant dfinit trois options :
With Options
.ConfirmConversions = True
.MeasurementUnit = wdMillimeters
.AllowAccentedUppercase = True
End With

Lobjet Options accepte 169 proprits dans Word 2000, 205 en


Word 2003 et 232 en Word 2007.
La proprit System donne accs lobjet System qui permet de
rcuprer des informations intressantes sur lordinateur qui excute
la macro. Voici, titre dexemple, quelques commandes et les valeurs
renvoyes par lobjet System sur un de nos ordinateurs :
Application.System.Country ' renvoie 33 (code de la France)
Application.System.HorizontalResolution ' 1024
Application.System.LanguageDesignation ' Franais(France)
Application.System.OperatingSystem ' Windows NT
Application.System.ProcessorType ' Pentium
Application.System.Version ' 5.1 (Windows XP)
Application.System.VerticalResolution ' 768

Lobjet Application compte galement un grand nombre de


mthodes. La mthode qui vous servira le plus souvent dans vos
macros est Quit qui permet de quitter Word en sauvegardant ou non
les documents. La commande suivante quitte Word tout en sauvegardant les modifications :
Application.Quit SaveChanges:=wdSaveChanges

Chap10.fm Page 196 Mardi, 23. janvier 2007 5:11 17

196

Chapitre 10. Programmer Word

Le paramtre SaveChanges peut prendre les valeurs suivantes :


wdDoNotSaveChanges
wdPromptToSaveChanges
wdSaveChanges

OBJET DOCUMENT
Comme son nom lindique, lobjet Document reprsente un document Word. Il sagit bien videmment dun objet essentiel au sein
du modle dobjets de Word et un grand nombre dobjets dpendent
de ce dernier. Un objet Document fait partie de la collection Documents qui recense lensemble des documents Word ouverts. Pour
savoir combien de documents sont ouverts, il suffit dutiliser la proprit Count :
Application.Documents.Count

Dans la mesure o Document est un objet global, il nest pas ncessaire de prfixer la commande avec Application. Le programme suivant affiche le nom du document actif puis active, un par un, tous les
documents ouverts et affiche leur nom :
MsgBox (ActiveDocument.Name)
For i = 1 To Documents.Count
Documents(i).Activate
MsgBox (Documents(i).Name)
Next i

Il est trs important de savoir jongler avec les diffrents documents


ouverts dans Word car il est assez rare que vous nayez travailler
quavec un seul document. Vous pouvez galement activer un document en faisant rfrence son nom plutt qu son numro dindice,
comme dans lexemple suivant :
Documents("ANNEXE C.DOC").Activate

Lobjet Document renvoie un grand nombre de collections. Vous


pouvez atteindre les objets de ces collections de la mme manire que
nimporte quel document, grce leur numro dindice. Voici un programme pour afficher tous les paragraphes du document actif :

Chap10.fm Page 197 Mardi, 23. janvier 2007 5:11 17

Objet Document

197

For i = 1 To ActiveDocument.Paragraphs.Count
MsgBox (ActiveDocument.Paragraphs(i))
Next i

Il existe une structure de contrle particulire pour traiter les collections : For Each Next.
Le programme suivant, qui affiche toutes les phrases du document
actif,
For i = 1 To ActiveDocument.Sentences.Count
MsgBox (ActiveDocument.Sentences(i))
Next i

peut galement scrire avec la commande For Each de la manire


suivante :
For Each phrase In ActiveDocument.Sentences
MsgBox phrase
Next

La syntaxe de cette commande est :


For Each lment In collection
[blocs dinstructions]
[Exit For]
[blocs dinstructions]
Next [lment]

Voici un autre exemple de programme qui affiche dans une bote de


message toutes les balises dindex du document actif :
Sub affiche_balises()
Dim champ As Field
For Each champ In ActiveDocument.Fields
If champ.Type = wdFieldIndexEntry Then
x = MsgBox(champ, , "Balises d'index")
End If
Next
End Sub

De la mme manire, on peut utiliser la collection Indexes pour


supprimer les balises dindex du document actif :
Sub supprime_balises()
Dim champ As Field
For Each champ In ActiveDocument.Fields
If champ.Type = wdFieldIndexEntry Then

Chap10.fm Page 198 Mardi, 23. janvier 2007 5:11 17

198

Chapitre 10. Programmer Word

champ.Delete
End If
Next
End Sub

Certaines macros peuvent se rvler dangereuses pour vos


documents. Ainsi, la macro prcdente supprime dun seul
coup toutes les balises dindex du document actif ; si ces dernires sont trs nombreuses, il sera trs fastidieux de revenir en
arrire laide de la commande dannulation. Moralit : faites
des sauvegardes rgulires et travaillez sur des copies de sauvegarde de vos documents quand vous laborez une macro dont
vous ne matrisez pas toujours lavance les rsultats.
Lobjet Document compte de nombreuses mthodes, mais vous ne
trouverez aucune mthode pour ouvrir ou bien crer un document. En
fait, ces mthodes existent bien, mais elles ne peuvent tre appeles
quau niveau de la collection Documents.
Pour crer un nouveau document vide, il suffit donc dexcuter la
commande :
Documents.Add

Le premier paramtre de la mthode Add permet de prciser un


nom de modle (fichier .DOT), mais vous devez faire attention de
bien prciser le chemin daccs complet au modle, comme dans
lexemple suivant :
Documents.Add Template:= _
"C:\Program Files\Microsoft Office\Templates\Mmo.dot"

Comme leur nom le laisse supposer, les mthodes Close, Open et


Save permettent respectivement de fermer, douvrir et de sauvegarder
un document.
La mthode Activate, comme nous lavons dj dit, permet dactiver un des documents de la collection ; cette commande vous sera trs
utile quand vous aurez passer dun document lautre (comme
quand vous souhaitez copier des donnes dun document dans un
autre). Il faut savoir que le numro dindice dun document na aucun
rapport avec le numro qui est attribu dans le menu Fentre puisque

Chap10.fm Page 199 Mardi, 23. janvier 2007 5:11 17

Objet Range

199

le menu Fentre se contente de classer par ordre alphabtique les


documents. En fait, ds quun document est ouvert ou cr, il prend
lindice numro 1 dans la collection, ce qui signifie qu chaque
ouverture ou cration, tous les indices des documents de la collection
sont modifis. Pour vous en persuader, excutez le programme suivant,
en ayant deux ou trois fichiers Word ouverts :
For i = 1 To Documents.Count
MsgBox Documents(i).Name + " = indice n" + CStr(i)
Next i
Documents.Add
For i = 1 To Documents.Count
MsgBox Documents(i).Name + " = indice n" + CStr(i)
Next i

OBJET RANGE
Range signifie plage en anglais et un objet Range permet donc de
dsigner dans Word une tendue. On se sert dans de trs nombreuses commandes dun objet Range pour prciser ltendue ou la porte dune opration : quel endroit le tableau va-t-il tre insr ?
Sur quelle portion de texte la recherche va-t-elle tre effectue ? Un
objet Range permet de rpondre prcisment ces deux questions.
La plage de caractres dun objet Range est dfinie par un caractre
de dbut et un caractre de fin ; le caractre de dbut peut avoir pour
valeur 0 ce qui signifie que la plage commencera partir du premier
caractre. Pour dfinir par exemple une plage de 100 caractres
partir du 10me caractre, il faut excuter les commandes suivantes :
Dim plage As Range
Set plage = ActiveDocument.Range(Start:=10, End:=110)

Linconvnient avec un objet Range, cest quil est invisible la diffrence dune slection qui est affiche en surbrillance. Par exemple,
si vous excutez les deux dernires lignes de code, en apparence, il ne
se passera rien. Cest pour cette raison quil est conseill lorsque vous
commencez travailler avec des objets Range de les visualiser. Pour ce
faire, on dispose de la mthode Select qui permet de slectionner la
plage. Ainsi, il suffit dajouter une mthode au programme prcdent

Chap10.fm Page 200 Mardi, 23. janvier 2007 5:11 17

200

Chapitre 10. Programmer Word

pour que le contenu de la plage soit slectionn, ce qui permet de


vrifier visuellement le rsultat de la dfinition de lobjet Range :
Dim plage As Range
Set plage = ActiveDocument.Range(Start:=10, End:=110)
plage.Select

Figure 10.2 Visualisation dun objet Range

En visualisant cet exemple, vous pouvez remarquer que la dfinition de la plage commence bien partir du 10me caractre (ce dernier
nest pas inclus dans la plage) et que les espaces et les marques de paragraphe comptent bien comme des caractres. La taille maximale dun
objet Range est le document en entier ; si vous pensez que pour dfinir
une plage couvrant un document entier, il suffit dexcuter la commande suivante :
Set plage = ActiveDocument.Range(Start:=0, _
End:=ActiveDocument.Characters.Count)

vous vous trompez ; ActiveDocument.Characters.Count reprsente


bien le nombre total de caractres de la collection Characters, mais
la plage ne couvre pas toujours le document entier. Cela signifie que
certains caractres non imprimables ne font pas partie de la collection Characters, mais que lobjet Range en tient nanmoins compte.
Pour dfinir une plage qui recoupe le document entier, vous utiliserez lune de ces mthodes :

Chap10.fm Page 201 Mardi, 23. janvier 2007 5:11 17

Objet Range

201

Dim plage As Range


Set plage = ActiveDocument.Range
plage.WholeStory

ou bien :
Set plage = ActiveDocument.Range

Vous pouvez mme encore utiliser :


Set plage = ActiveDocument.Content

A contrario, une plage peut tre rduite sa plus simple expression si le


caractre de dbut et le caractre de fin ont la mme valeur. Cela signifie
quaucun caractre nest inclus dans la plage et que la plage ne reprsente
en fait que le point dinsertion. Pour que la plage soit dfinie comme
reprsentant le dbut du document, il suffit dexcuter le code suivant :
Dim plage As Range
Set plage = ActiveDocument.Range(Start:=0, End:=0)

Cette commande dfinit une plage reprsentant le point dinsertion qui est situ au dbut du document actif ; mais tant quon na pas
excut la commande :
plage.Select

le point dinsertion nest pas dplac.


Vous devez cependant bien comprendre quun objet Range est
indpendant de la slection, mme si lon peut assigner un objet
Range le contenu de la slection et vice-versa. Il peut y avoir plusieurs
objets Range, alors quil ny a quun seul objet Selection.
Il est possible dtendre une plage grce la mthode Expand.
Lexemple suivant tend la plage par pallier successif :
Dim plage As Range
Set plage = ActiveDocument.Range(Start:=175, End:=175)
plage.Expand Unit:=wdCharacter ' caractre
plage.Expand Unit:=wdWord ' mot
plage.Expand Unit:=wdSentence ' phrase
plage.Expand Unit:=wdParagraph ' paragraphe
plage.Expand Unit:=wdStory ' texte entier

En plaant une mthode plage.Select entre chaque mthode


Expand, vous pourrez voir lextension du domaine de la plage.

Chap10.fm Page 202 Mardi, 23. janvier 2007 5:11 17

202

Chapitre 10. Programmer Word

Si vous voulez que la plage soit forme de plusieurs paragraphes


contigus, vous pouvez utiliser les proprits Start et End de lobjet
Range comme dans lexemple suivant qui dfinit une plage forme des
paragraphes 3 7 :
Dim plage As Range
Set plage = ActiveDocument.Range _
(Start:=ActiveDocument.Paragraphs(3).Range.Start, _
End:=ActiveDocument.Paragraphs(7).Range.End)

Une fois que vous savez dfinir des plages, vous pouvez alors appliquer toutes sortes de traitements des portions spcifiques dun document. Voici, par exemple, le code dun programme qui met en gras le
5me paragraphe du document actif :
Dim plage As Range
Set plage = ActiveDocument.Paragraphs(5).Range
plage.Bold = True

Vous noterez quil nest pas toujours obligatoire dinitialiser une


variable Range pour appliquer un traitement et que vous pouvez
rcrire le programme prcdent de manire plus concise :
ActiveDocument.Paragraphs(5).Range.Bold = True

Range est un objet trs puissant qui vous permettra de dvelopper


des fonctionnalits qui sont absentes de Word. Ainsi, le programme
suivant affiche le nombre de caractres du paragraphe dans lequel se
trouve le curseur :
Dim plage As Range
Set plage = Selection.Paragraphs(1).Range
MsgBox
(plage.ComputeStatistics(wdStatisticCharactersWithSpaces))

Vous pouvez afficher des statistiques dans Word (grce la commande FichierProprits), mais cette fonctionnalit ne sapplique
quau document entier.
Vous avez pu remarquer que nous avons utilis dans ce dernier programme un objet Selection : nous allons prsent tudier cet objet
qui est galement trs important et qui complte lobjet Range.

Chap10.fm Page 203 Mardi, 23. janvier 2007 5:11 17

Objet Selection

203

OBJET SELECTION
Lobjet Selection est facile apprhender intellectuellement parce que
lon en a une reprsentation visuelle. Lobjet Selection est assez similaire
lobjet Range ceci prs quil ne peut y avoir quun seul objet Selection
la fois. Ces deux objets partagent dailleurs de nombreuses proprits et
mthodes. Si lon veut par exemple mettre un texte en gras, on peut aussi
bien utiliser un objet Range quun objet Selection. La mthode de cration dun objet Selection diffre cependant de la cration dun objet
Range car un document Word contient toujours une slection. Mme si
la slection est vide (aucun caractre nest en surbrillance), la slection se
rsume au caractre qui est situ juste droite du point dinsertion. On
peut dfinir une slection de la manire suivante :
Dim sel As Selection
Set sel = Application.Selection

Si lon fait afficher lobjet Selection par la commande :


MsgBox sel

on obtiendra le caractre droite du curseur ou bien le contenu de la


slection si des caractres sont slectionns. Dans la mesure o Selection
est un objet global, il est inutile de le prfixer avec lobjet Application.
Ainsi notre programme de trois lignes peut en fait se rsumer :
MsgBox Selection

Il arrive quand on veut rechercher ou remplacer des caractres


spciaux que lon ne puisse pas les reproduire dans lditeur de programmes qui ne bnficie pas de la commande InsertionCaractres
spciaux Bien videmment, il est souvent possible de faire un
copier-coller entre Word et lditeur Visual Basic, mais cette solution
nest pas toujours possible ou optimale. Le seul moyen de rgler le
problme est alors de connatre le code ASCII du caractre rechercher ou remplacer. Cest ce moment-l que la commande Selection va nous tre trs utile. Quand vous voulez, par exemple,
connatre le code du a majuscule avec un accent grave ou bien
encore le code du caractre des points de suspension, il suffit de slectionner dans Word ce caractre et dexcuter la macro suivante :

Chap10.fm Page 204 Mardi, 23. janvier 2007 5:11 17

204

Chapitre 10. Programmer Word

Sub affiche_code_car()
MsgBox Asc(Selection)
End Sub

Le code ASCII du caractre en question est affich dans une bote


de message. Il ne vous reste plus alors qu utiliser la fonction
inverse de Asc, Chr, pour rechercher ou remplacer ce caractre. Sil
sagit dun caractre Unicode, vous utiliserez la fonction AscW.
Voici un programme qui recherche la squence . A et la remplace par la squence . :
Sub remplacement_Agrave()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = ". A "
.Replacement.Text = ". " + Chr(192) + " "
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Mme si dans cet exemple, on aurait trs bien pu saisir le caractre


sous forme littrale (), et ne pas utiliser son code ASCII avec la
fonction Chr, cela ne sera pas toujours le cas. Il est en effet beaucoup plus pratique de manipuler les codes ASCII de certains signes
de ponctuation, plutt que leurs caractres littraux, notamment
pour les guillemets droits (code ASCII 34) ou bien encore les
guillemets typographiques (codes ASCII 171 et 187).
Vous vous servirez principalement de lobjet Selection pour dplacer le point dinsertion ou bien pour dfinir une zone en surbrillance.
Pour dplacer le point dinsertion, vous utiliserez la mthode
MoveRight, comme dans lexemple suivant qui dplace le point
dinsertion dun caractre vers la droite :
Dim sel As Selection
Set sel = Application.Selection
sel.MoveRight unit:=wdCharacter, Count:=1

La mthode MoveRight, comme son nom lindique, dplace le


point dinsertion vers la droite ; cette mthode accepte deux paramtres nomms. Le premier argument, qui indique lunit de dplace-

Chap10.fm Page 205 Mardi, 23. janvier 2007 5:11 17

205

Objet Selection

ment, peut tre exprim laide dune numration qui peut prendre
les valeurs suivantes :

wdCharacter = 1
wdWord = 2
wdSentence = 3
wdParagraph = 4
wdLine = 5
wdStory = 6
wdScreen = 7
wdSection = 8
wdColumn = 9
wdRow = 10
wdWindow = 11
wdCell = 12
wdCharacterFormatting = 13
wdParagraphFormatting = 14
wdTable = 15
wdItem = 16

Le deuxime paramtre indique le nombre dunits du dplacement.


Vous trouverez dans les tableaux 10.1 et 10.2 les commandes de
dplacement du point dinsertion les plus courantes.
Tableau 10.1 Commandes de dplacement du point dinsertion vers la droite
Dplacement vers la droite

Commande

Dun caractre

sel.MoveRight unit:=wdCharacter, Count:=1

Dun mot

sel.MoveRight unit:=wdWord, Count:=1

Dune phrase

sel.MoveRight unit:=wdSentence, Count:=1

Dun paragraphe

sel.Moveright unit:=wdParagraph, Count:=1

la fin de la ligne

sel.Selection.EndKey unit:=wdLine

Dune ligne

sel.Moveright unit:=wdLine, Count:=1

la fin du document

sel.MoveRight unit:=wdStory, Count:=1

Chap10.fm Page 206 Mardi, 23. janvier 2007 5:11 17

206

Chapitre 10. Programmer Word

Tableau 10.2 Commandes de dplacement du point dinsertion vers la gauche


Dplacement vers la gauche

Commande

Dun caractre

sel.MoveLeft unit:=wdCharacter, Count:=1

Dun mot

sel.MoveLeft unit:=wdWord, Count:=1

Dune phrase

sel.MoveLeft unit:=wdSentence, Count:=1

Dun paragraphe

sel.MoveLeft unit:=wdParagraph, Count:=1

Au dbut de la ligne

sel.Selection.HomeKey unit:=wdLine

Dune ligne

sel.MoveLeft unit:=wdLine, Count:=1

Au dbut du document

sel.Selection.HomeKey Unit:=wdStory

Si lon souhaite tendre la slection, au lieu de dplacer le point


dinsertion, il suffit tout simplement de rajouter aux mthodes MoveRight, MoveLeft, HomeKey ou bien EndKey un paramtre nomm
Extend avec la valeur wdExtend, comme dans lexemple suivant :
Selection.EndKey Unit:=wdStory, Extend:=wdExtend

Ce code slectionne le texte de la position courante du point


dinsertion jusqu la fin du document.
Il est galement possible de slectionner des cellules dun tableau ;
voici un exemple de programme qui slectionne toutes les lignes du
premier tableau dun document sauf la premire ligne :
ActiveDocument.Tables(1).Select
Selection.SetRange _
Start:=Selection.Rows(2).Range.Start, _
End:=Selection.End

Cet autre exemple slectionne toutes les cellules de la cellule


(ligne2, colonne2) la cellule (ligne3, colonne3) :
If Selection.Information(wdWithInTable) = False Then Exit Sub
Selection.SetRange _
Start:=Selection.Tables(1).Cell(2, 2).Range.Start, _
End:=Selection.Tables(1).Cell(3, 3).Range.End
End Sub

Chap10.fm Page 207 Mardi, 23. janvier 2007 5:11 17

Mise en pratique

207

Lobjet Selection a galement une grande utilit car il nous permet


de connatre le numro dindice de lobjet courant dune collection,
que ce soit un paragraphe, un tableau, une section, etc. En fait, on
peut retrouver lindice de nimporte quel objet qui possde une proprit Range. Si lon souhaite faire rfrence au paragraphe courant
(celui qui est slectionn ou bien celui dans lequel figure le point
dinsertion), il suffit dutiliser la commande :
Selection.Paragraphs(1)

Le raisonnement vaut galement sil sagit dun tableau :


Selection.Tables(1)

dsigne le tableau dans lequel se trouve le point dinsertion.

MISE EN PRATIQUE
Pour illustrer notre propos, voici un programme qui procure des
informations sur le tableau dans lequel se trouve le curseur :
Sub infotab()
Dim nomdocu
Dim nbtabs
Dim numtab
Dim nbligs
Dim nbcols
Dim nbcells
Dim numligne
Dim numcol
Dim cellule
nomdocu = Selection.Cells(1).Parent
nbtabs = ActiveDocument.Tables.Count
numtab = indextab()
nbligs = Selection.Tables(1).Rows.Count
nbcols = Selection.Tables(1).Columns.Count
nbcells = Selection.Tables(1).Range.Cells.Count
numligne = Selection.Cells(1).RowIndex
numcol = Selection.Cells(1).ColumnIndex
cellule = Selection.Cells(1).Range
cellule = Left(cellule, Len(cellule) - 2)
MsgBox ("Nom du document : " + nomdocu + vbCr + _
"Nombre de tableaux : " + CStr(nbtabs) + vbCr + _
"N du tableau dans le document : " + CStr(numtab) + vbCr + _

Chap10.fm Page 208 Mardi, 23. janvier 2007 5:11 17

208

Chapitre 10. Programmer Word

"Nombre de lignes : " + CStr(nbligs) + vbCr + _


"Nombre de colonnes : " + CStr(nbcols) + vbCr + _
"Nombre de cellules : " + CStr(nbcells) + vbCr + _
"Ligne actuelle : " + CStr(numligne) + vbCr + _
"Colonne actuelle : " + CStr(numcol) + vbCr + _
"Contenu cellule actuelle : " + cellule)
End Sub

La figure 10.3 illustre les rsultats fournis par notre programme.

Figure 10.3 Informations sur un tableau


obtenues par programmation

Pour retrouver le numro dindice de notre tableau, nous avons d


crire une fonction dont voici le code :
Function indextab() As Long
Dim i
For i = 1 To ActiveDocument.Tables.Count
If Selection.Characters(1).InRange _
(ActiveDocument.Tables(i).Range) Then
indextab = i
Exit For
End If
Next i
End Function

Cette fonction balaye la collection Tables qui contient la liste de


tous les tableaux du document ; la mthode InRange permet de savoir
si la slection (Selection.Characters(1) se trouve dans la plage spcifie par largument (ActiveDocument.Tables(i).Range). Si tel est le
cas, on sort de la boucle For Next et la valeur de lincrment i est gale
lindice du tableau.
Vous pouvez bien videmment crire une telle fonction pour trouver lindice dune section ou bien dun paragraphe (en fait tout objet

Chap10.fm Page 209 Mardi, 23. janvier 2007 5:11 17

Mise en pratique

209

dune collection possdant une proprit Range). Voici titre


dexemple le code dune fonction retrouvant lindice du paragraphe
courant :
Function indexpara() As Long
Dim i
For i = 1 To ActiveDocument.Paragraphs.Count
If Selection.Characters(1).InRange _
(ActiveDocument.Paragraphs(i).Range) Then
indexpara = i
Exit For
End If
Next i
End Function

Le seul problme de cette mthode de balayage de la collection est


quelle peut se rvler extrmement longue si la collection comporte
de nombreux lments, ce qui se produit immanquablement pour la
collection des paragraphes si le texte du document est important. Il
faut alors trouver un algorithme plus performant et nous allons retrouver notre mthode de tri dichotomique que vous avez d utiliser pour
trouver le nombre secret (chapitre 7). Petit rappel : pour trouver un
nombre secret compris entre 1 et 100, il faut dabord tester 50 ; puis si
le nombre secret est plus petit, il faut tester 25 et dans le cas contraire,
il faut tester 75, et ainsi de suite. chaque fois, on dcoupe lespace
de recherche en deux, do le nom de tri dichotomique.
Notre nouvelle fonction peut alors scrire :
Public Function indexpara2() As Long
Dim posdepart As Long
Dim min As Long
Dim max As Long
Dim moyen As Long
min = 1
max = ActiveDocument.Paragraphs.Count
posdepart = Selection.Start
Do
moyen = (min + max) \ 2
If posdepart < _
ActiveDocument.Paragraphs(moyen).Range.Start Then
max = moyen - 1
ElseIf posdepart > _
ActiveDocument.Paragraphs(moyen).Range.End Then
min = moyen + 1

Chap10.fm Page 210 Mardi, 23. janvier 2007 5:11 17

210

Chapitre 10. Programmer Word

Else
Exit Do
End If
Loop Until max < min
Indexpara2 = moyen
End Function

Sur un texte de 70 000 caractres, la procdure indexpara met 343


secondes pour trouver lindice du dernier paragraphe alors que la procdure indexpara2 ne met que 2,5 secondes ! Voil qui va peut-tre
vous inciter optimiser votre code
Nous terminerons ltude de lobjet Selection par un programme
qui repre si deux paragraphes qui se suivent sont identiques ; si tel est
le cas, la macro supprime le doublon. Ce genre de programmes peut
savrer trs utile quand vous souhaitez ddoublonner une liste ; il suffit alors de trier la liste par ordre alphabtique puis dexcuter la
macro :
Sub supprdoublon()
Dim deplacement As Long
'on se dplace au dbut du texte
Selection.HomeKey unit:=wdStory
' on slectionne les deux premiers paragraphes
Selection.MoveDown unit:=wdParagraph, Count:=1, Extend:=wdExtend
deplacement = Selection.MoveDown(unit:=wdParagraph, _
Count:=1, Extend:=wdExtend)
' tant qu'on n'a pas atteind la fin du document
Do While deplacement > 0
If Selection.Paragraphs(1).Range.Text = _
Selection.Paragraphs(2).Range.Text Then
' les paragraphes sont identiques
Selection.Paragraphs(2).Range.Delete
' on efface le paragraphe
deplacement = Selection.MoveDown(unit:=wdParagraph, _
Count:=1, Extend:=wdExtend)
Else ' les paragraphes ne sont pas identiques
deplacement = Selection.MoveDown(unit:=wdParagraph, _
Count:=1, Extend:=wdExtend)
Selection.MoveStart unit:=wdParagraph, Count:=1
End If
Loop
End Sub

Chap10.fm Page 211 Mardi, 23. janvier 2007 5:11 17

Pilotage dune application Office partir dune autre application

211

PILOTAGE DUNE APPLICATION OFFICE PARTIR


DUNE AUTRE APPLICATION
Quand on programme Office, il arrive trs souvent que lon soit
oblig de piloter une application partir dune autre application. En
effet, quand vous voulez changer des informations entre deux
applications, il est beaucoup plus simple de programmer une application partir dune autre, plutt que de concevoir un systme de
copier-coller entre les deux applications. Dans cet exemple, nous
allons utiliser Word (que nous appellerons lapplication pilote) pour
piloter Access (que nous appellerons lapplication pilote). Ce
mcanisme nest pas trs compliqu et il obit des rgles identiques
quelle que soit lapplication qui est pilote.
La premire des choses faire consiste tablir une rfrence vers
lapplication pilote. En effet, si vous voulez pouvoir utiliser les objets
de lapplication pilote, vous devez indiquer lapplication pilote le
lien vers la bibliothque dobjets de lapplication pilote. Dans notre
exemple, nous allons donc indiquer Word la rfrence vers la bibliothque dobjets dAccess. Pour ce faire, allez dans lditeur Visual
Basic et choisissez la commande OutilsRfrences.

Figure 10.4 Rfrences


vers les bibliothques dobjets

Chap10.fm Page 212 Mardi, 23. janvier 2007 5:11 17

212

Chapitre 10. Programmer Word

La bote de dialogue Rfrences indique les liens vers les bibliothques dobjets. Dans cette bote de dialogue, vous trouvez obligatoirement un lien vers Visual Basic For Applications, un lien vers la
bibliothque dobjets de lapplication, un lien vers OLE Automation
et un lien vers la bibliothque dobjets dOffice (Microsoft Office 12.0
Object Library). Dans la copie dcran illustre la figure 10.4, on
trouve galement des rfrences ADO qui est un modle dobjets
servant piloter des bases de donnes.
Pour pouvoir piloter Access partir de Word, nous allons ajouter
un lien vers la bibliothque dobjets dAccess. Pour ce faire, faites dfiler la liste des rfrences disponibles jusqu voir apparatre la rfrence Microsoft Access 12.0 Object Library. Cochez la case en face
de cette rfrence et cliquez sur le bouton OK. Bien videmment, si
vous utilisez Office 2003, la rfrence sappellera Microsoft Access
11.0 Object Library, si vous utilisez Office XP, la rfrence sappellera
Microsoft Access 10.0 Object Library, et ainsi de suite.

Figure 10.5 Ajout de la rfrence


la bibliothque dobjets dAccess 2007

Si vous ouvrez nouveau la bote de dialogue, vous constatez que la


rfrence Microsoft Access 12.0 Object Library figure bien dans la
liste des rfrences disponibles.

Chap10.fm Page 213 Mardi, 23. janvier 2007 5:11 17

Pilotage dune application Office partir dune autre application

213

Figure 10.6 La rfrence la bibliothque


dobjets dAccess 2007 a t ajoute

Une fois la rfrence tablie, vous devez dclarer lapplication pilote en tant que variable objet. Comme toute variable, une variable
objet est dclare laide de linstruction Dim. Dans notre exemple,
nous allons dclarer la variable objet qui nous permettra de piloter
Access de la manire suivante :
Dim AppliAccess As New Access.Application

Nous avons choisi le nom de variable AppliAccess car il nous


parat bien significatif. Le mot cl New permet la cration implicite
de lobjet ; il nest pas obligatoire, mais il facilite lutilisation de
lobjet, si bien que nous vous recommandons de lemployer. Aprs le
mot cl New, vous devez inscrire le nom de lapplication pilote (en
loccurrence Access) suivie de la mention .Application.
Si vous avez correctement rfrenc la bibliothque dobjets
dAccess, lapplication Access apparat dans la liste Intellisense ds
que vous avez saisi un espace aprs le mot cl New.

Figure 10.7 La rfrence la bibliothque dobjets


dAccess apparat dans la liste Intellisense

Chap10.fm Page 214 Mardi, 23. janvier 2007 5:11 17

214

Chapitre 10. Programmer Word

Une fois que la variable objet est dclare, il suffit demployer cette
variable la place de la mention Application dans toutes les commandes qui font rfrence des objets dAccess. Ainsi, au lieu demployer la
commande Application.OpenCurrentDatabase qui ouvre une base de
donnes, vous utiliserez AppliAccess.OpenCurrentDatabase.
Notre macro est trs simple : elle affiche une bote de dialogue o
lutilisateur saisit le nom dun fichier de base de donnes Access 2007.
Ensuite, la macro Word ouvre la base de donnes et liste dans Word
les noms des tables, des requtes, des formulaires et des tats de la base
de donnes. Linterface de la macro est trs simpliste et, de la mme
manire, aucune mise en forme des informations rcupres partir
dAccess nest ralise au sein du document Word car nous avons
voulu nous concentrer uniquement sur le pilotage dAccess partir de
Word. Pour amliorer la macro, on pourrait, par exemple, prvoir de
dsigner un dossier pour rcuprer les informations de toutes les bases
de donnes prsentes dans ce dossier.
Vous noterez que cette macro ne fonctionne quavec des bases de
donnes Access 2007, mais il suffit de modifier lextension des fichiers
accdb en mdb pour que la macro marche avec les fichiers Access
2000, 2002 ou 2003.
Sub liste_infos_bd()
Dim chemin As String
chemin = "C:\BasesAccess2007\"
Dim bd As String
bd = LTrim(RTrim(InputBox("Saisissez le nom de la base de
donnes (sans l'extension)")))
chemin = chemin + bd + ".accdb"
' on cre une nouvelle instance de l'application Access
Dim AppliAccess As New Access.Application
' ouverture de la base de donnes
AppliAccess.OpenCurrentDatabase chemin
Dim obj As AccessObject, dbs As Object
' on dfinit la source de donnes active
Set dbs = AppliAccess.CurrentData
' on importe dans Word le nom de la base de donnes
Selection.TypeText Text:=AppliAccess.CurrentDb.Name
' on saute une ligne
Selection.TypeParagraph
Selection.TypeText Text:="Liste des tables"
Selection.TypeParagraph
' on parcourt la collection AllTables

Chap10.fm Page 215 Mardi, 23. janvier 2007 5:11 17

Pilotage dune application Office partir dune autre application

215

For Each obj In dbs.AllTables


' on n'importe pas les tables systme
If Left(obj.Name, 4) <> "MSys" Then
Selection.TypeText Text:=obj.Name + vbCrLf
End If
Next obj
Selection.TypeText Text:="Liste des requtes" + vbCrLf
For Each obj In dbs.AllQueries
Selection.TypeText Text:=obj.Name + vbCrLf
Next obj
Set dbs = AppliAccess.CurrentProject
Selection.TypeText Text:="Liste des formulaires" + vbCrLf
For Each obj In dbs.AllForms
Selection.TypeText Text:=obj.Name + vbCrLf
Next obj
Selection.TypeText Text:="Liste des tats" + vbCrLf
For Each obj In dbs.AllReports
Selection.TypeText Text:=obj.Name + vbCrLf
Next obj
' on ferme la base de donnes
AppliAccess.CloseCurrentDatabase
End Sub

Si vous souhaitez trouver des exemples de macros o des applications pilotent dautres applications, saisissez dans un moteur de
recherche les requtes suivantes, en fonction de lapplication que
vous voulez piloter :
Dim as "Access.Application"
Dim as "Word.Application"
Dim as "Excel.Application"
Dim as "Outlook.Application"
Dim as "PowerPoint.Application"
Nous verrons, dans cette partie de louvrage, dautres exemples de
macros o des applications Office pilotent dautres applications Office.

Chap10.fm Page 216 Mardi, 23. janvier 2007 5:11 17

216

Chapitre 10. Programmer Word

CONCLUSION
Nous navons couvert quune petite partie du modle dobjets de
Word, mais nous esprons vous avoir fourni lessentiel pour assurer les tches courantes ainsi que les outils pour explorer par
vous-mme tous les mandres de cette myriade dobjets. La documentation de Word ntant pas toujours un modle de clart, il
ne faudra pas hsiter procder selon une mthode empirique et
faire ainsi de nombreux essais (et donc de nombreuses erreurs)
afin de percer les mystres de certaines syntaxes. Ne soyez pas
drout par le fait quil existe bien souvent plusieurs manires
darriver au mme rsultat ; choisissez la mthode qui vous convient le mieux et oubliez les autres. Pour bien comprendre un
objet, il faut le voir en action et par voie de consquence, crire
un programme qui le mette en uvre ; commencez par crire des
programmes trs courts qui dcomposent bien tous les aspects
dun objet (proprits et mthodes). Essayez galement de visualiser (grce la fonction MsgBox ou bien la mthode Select
dun objet Range) les rsultats de vos actions, ce qui vous apportera une meilleure comprhension du modle dobjets.

Chap11.fm Page 217 Mardi, 23. janvier 2007 5:12 17

11
Programmer Excel
Le modle dobjets dExcel est assez similaire celui de Word mme
si son arborescence est moins complexe ; nous examinerons les
objets les plus importants tout en sachant trs bien que nous ne couvrirons qu peine 10 % du modle dobjets. Ce sera donc vous, si
vous en ressentez le besoin, dapprofondir cette tude grce laide
en ligne dExcel et la documentation lectronique fournie avec cet
ouvrage.
En appliquant la mthodologie que nous vous avons indique dans
les chapitres prcdents, vous serez mme de dcouvrir les objets qui
vous intressent. Lavantage des modles dobjets dOffice, cest que
quand on a compris comment un modle fonctionnait, on peut facilement apprendre un autre modle dobjets.

OBJET APPLICATION
Comme pour Word, lobjet Application reprsente lapplication
Excel elle-mme et se situe au sommet de la hirarchie du modle
dobjets. Bon nombre de ses proprits tant globales, vous navez
pas les prfixer avec le nom dobjet Application.
Le tableau 11.1 liste les proprits principales de lobjet Application (les proprits en gris sont globales).

Chap11.fm Page 218 Mardi, 23. janvier 2007 5:12 17

218

Chapitre 11. Programmer Excel

Tableau 11.1 Principales proprits de lobjet Application


ActiveCell

Renvoie un objet Range qui reprsente la cellule active


de la fentre active (celle qui se trouve au premier plan)
ou la fentre spcifie.

ActiveSheet

Renvoie un objet qui reprsente la feuille active (feuille


au premier plan) dans le classeur actif ou dans la
fentre ou le classeur spcifi.

ActiveWindow

Renvoie un objet Window qui reprsente la fentre


active (celle qui se trouve au premier plan).

ActiveWorkbook

Renvoie un objet Workbook qui reprsente le classeur de


la fentre active (celle qui se trouve au premier plan).

Application

Utilise sans qualificateur d'objet (objet gauche du point),


cette proprit renvoie un objet Application qui reprsente
l'application Microsoft Excel. Lorsqu'elle est utilise avec un
qualificateur d'objet, elle renvoie un objet Application
reprsentant l'application ayant cr l'objet spcifi.

Build

Renvoie le numro de build de Microsoft Excel.

Calculation

Renvoie ou dfinit le mode de calcul. Il peut s'agir de


l'une des constantes XlCalculation suivantes :
xlCalculationAutomatic, xlCalculationManual ou
xlCalculationSemiautomatic.

CalculationVersion

Renvoie un nombre dont les quatre derniers chiffres


correspondent au numro de version du moteur de
calcul secondaire, les autres chiffres ( gauche)
correspondant la version principale de Microsoft
Excel. Pour un objet Workbook, cette proprit renvoie
des informations sur la version de Excel dans laquelle
le classeur a t entirement recalcul.

Caption

Renvoie le nom affich dans la barre de titre de la


fentre Microsoft Excel principale.

Cells

Renvoie un objet Range qui reprsente toutes les


cellules dans la feuille de calcul active.

Columns

Renvoie un objet Range qui reprsente toutes les


colonnes de la feuille de calcul active.

DataEntryMode

Renvoie ou dfinit le mode saisie de donnes.

Chap11.fm Page 219 Mardi, 23. janvier 2007 5:12 17

219

Objet Application

Tableau 11.1 Principales proprits de lobjet Application


DefaultFilePath

Renvoie ou dfinit le chemin par dfaut utilis par


Microsoft Excel l'ouverture des fichiers.

DefaultSaveFormat

Renvoie ou dfinit le format d'enregistrement par


dfaut des fichiers.

Dialogs

Renvoie une collection Dialogs qui reprsente toutes


les botes de dialogue prdfinies.

DisplayFullScreen

A la valeur True si Microsoft Excel fonctionne en mode


plein cran.

EditDirectlyInCell

A la valeur True si Microsoft Excel autorise la


modification directement dans les cellules.

FileSearch

Renvoie un objet FileSearch pour effectuer des


recherches de fichier.

FixedDecimal

Toutes les donnes saisies aprs que la valeur True a


t affecte cette proprit sont formates avec le
nombre de dcimales fixes dfini par la proprit
FixedDecimalPlaces.

FixedDecimalPlaces

Renvoie ou dfinit le nombre de positions de dcimales


fixes utilis quand la valeur True est affecte la
proprit FixedDecimal.

Interactive

A la valeur True si Microsoft Excel est en mode


interactif. Cette proprit a gnralement la valeur
True. Si vous lui affectez la valeur False, Microsoft Excel
empchera toute interaction partir du clavier et de la
souris ( l'exception de la saisie dans les botes de
dialogue affiches par votre code). L'utilisateur ne
risque ainsi pas d'entraver l'excution de la macro qui
dplace ou active des objets.

International

Renvoie des informations relatives aux paramtres


rgionaux et internationaux en cours.

LanguageSettings

Renvoie l'objet LanguageSettings, qui contient des


informations sur les paramtres de langue de Microsoft
Excel. En lecture seule.

Names

L'objet Application renvoie une collection Names qui


reprsente tous les noms du classeur actif.

Chap11.fm Page 220 Mardi, 23. janvier 2007 5:12 17

220

Chapitre 11. Programmer Excel

Tableau 11.1 Principales proprits de lobjet Application


NetworkTemplatesPath

Renvoie le chemin d'accs rseau o les modles sont


stocks.

OperatingSystem

Renvoie le nom et le numro de version du systme


d'exploitation en cours, par exemple Windows (32
bits) 4.00 ou Macintosh 7.00 .

RecentFiles

Renvoie une collection RecentFiles qui reprsente la


liste des fichiers rcemment utiliss.

ReferenceStyle

Renvoie ou dfinit le style des rfrences utilises par


Microsoft Excel pour afficher les rfrences de cellules
et les en-ttes de lignes ou de colonnes : il s'agit du
style A1 ou L1C1. Il peut s'agir de l'une des constantes
XlReferenceStyle suivantes : xlA1 ou xlR1C1.

Rows

Renvoie un objet Range qui reprsente toutes les


lignes de la feuille de calcul active.

Selection

Renvoie l'objet slectionn dans la fentre active.

Sheets

Renvoie une collection Sheets qui reprsente toutes les


feuilles du classeur actif.

ShowToolTips

A la valeur True si les info-bulles sont actives.

TemplatesPath

Renvoie le chemin d'accs local de l'emplacement o


les modles sont stocks.

ThisWorkbook

Renvoie un objet Workbook qui reprsente le classeur


dans lequel s'excute le code de la macro en cours.

UserName

Renvoie ou dfinit le nom de l'utilisateur actuel.

Version

Renvoie le numro de version de Microsoft Excel.

Visible

A la valeur True si l'objet est visible.

Windows

Renvoie une collection Windows qui reprsente


chacune des fentres de l'ensemble des classeurs.

Workbooks

Renvoie une collection Workbooks qui reprsente


l'ensemble des classeurs ouverts.

Worksheets

Renvoie une collection Sheets qui reprsente toutes les


feuilles de calcul du classeur actif.

Chap11.fm Page 221 Mardi, 23. janvier 2007 5:12 17

221

Objet Application

Pour vous familiariser avec ces proprits, le plus simple est de les
tester dans lditeur de programmes en faisant afficher leur valeur
laide de la fonction MsgBox. Vous pouvez soit crer une procdure
soit saisir directement linstruction dans la fentre Excution. Si la
fentre Excution nest pas affiche dans lditeur, excutez la commande AffichageFentre Excution. Dans cette fentre, vous pouvez saisir une instruction et lexcuter immdiatement en appuyant
sur la touche Entre. La figure 11.1 illustre la saisie dune instruction
dans la fentre Excution.

Figure 11.1 Test dune instruction


dans la fentre Excution

Vous pouvez ainsi saisir les instructions suivantes qui renverront le


contenu de la cellule et ladresse de la cellule active (noubliez pas de
valider votre saisie avec la touche Entre aprs chaque ligne pour excuter linstruction) :
msgbox Activecell.Address
msgbox Activecell

Excel ne possde pas dobjet Options et la plupart des options


dExcel sont des proprits de lobjet Application.
Comme pour Word, la proprit Dialogs permet de renvoyer
lensemble des botes de dialogue dExcel. Grce la mthode Show,
on peut afficher nimporte quelle bote de dialogue dExcel si on prcise comme paramtre le numro de la bote de dialogue ou une des
constantes de lnumration xlBuiltInDialog qui en compte plus de
200.
La ligne de code suivante fait apparatre la bote de dialogue illustre la figure 11.2 :
Application.Dialogs(xlDialogOptionsCalculation).Show

Chap11.fm Page 222 Mardi, 23. janvier 2007 5:12 17

222

Chapitre 11. Programmer Excel

Figure 11.2 Bote de dialogue affiche grce la proprit Dialogs

Le tableau 11.2 liste les principales mthodes de lobjet Application.


Tableau 11.2 Principales mthodes de lobjet Application
ActivateMicrosoftApp

Active une application Microsoft. Si celle-ci est dj en cours


d'excution, cette mthode l'active. Si tel n'est pas le cas, la
mthode dmarre une nouvelle instance de l'application.

AddCustomList

Ajoute une liste personnalise pour la recopie


incrmente et/ou le tri personnalis.

Calculate

Calcule tous les classeurs ouverts, une feuille de calcul


particulire dans un classeur ou une plage de cellules
dtermine dans une feuille de calcul, comme indiqu
dans le tableau ci-dessous.

CalculateFull

Provoque un calcul intgral des donnes dans tous les


classeurs ouverts.

ConvertFormula

Permet de convertir les rfrences de cellule dans une


formule en passant du style de rfrence A1 au style
R1C1, d'une rfrence relative une rfrence absolue,
voire les deux.

Evaluate

Convertit un nom Microsoft Excel en un objet ou une


valeur.

FindFile

Affiche la bote de dialogue Ouvrir et autorise


l'utilisateur ouvrir un fichier.

Intersect

Renvoie un objet Range qui reprsente l'intersection


rectangulaire de deux plages ou plus.

Chap11.fm Page 223 Mardi, 23. janvier 2007 5:12 17

223

Objet Workbook

Tableau 11.2 Principales mthodes de lobjet Application


Quit

Quitte Excel.

SendKeys

Envoie des touches l'application active.

Wait

Marque une pause dans l'excution de la macro jusqu'


une heure spcifie.

OBJET WORKBOOK
Lobjet Workbook est un membre de la collection Workbooks qui
contient tous les classeurs (workbook signifie classeur en anglais)
ouverts dans Excel. En tant que membre dune collection, on accde
un classeur de la mme manire qu un document Word, savoir
son numro dindice. Le programme suivant permet donc dafficher
tous les noms des classeurs :
For i = 1 to Workbooks.Count
MsgBox Workbooks(i).Name
Next

Il est galement possible de dsigner un classeur par son nom :


Workbooks("Tableau d'amortissement.XLS").Activate

Le tableau 11.3 liste les principales proprits de lobjet Workbook.


Tableau 11.3 Principales proprits de lobjet Workbook
ActiveSheet

Renvoie un objet qui reprsente la feuille active (feuille


au premier plan) dans le classeur actif ou dans la fentre
ou le classeur spcifi.

Charts

Renvoie une collection Sheets qui reprsente toutes les


feuilles graphiques du classeur actif.

Date1904

A la valeur True si le classeur utilise le calendrier depuis


1904.

Names

Renvoie une collection Names qui reprsente tous les


noms du classeur actif.

Chap11.fm Page 224 Mardi, 23. janvier 2007 5:12 17

224

Chapitre 11. Programmer Excel

Tableau 11.3 Principales proprits de lobjet Workbook


PrecisionAsDisplayed

A la valeur True si les calculs dans ce classeur sont


raliss en utilisant uniquement la prcision des
nombres tels qu'ils sont affichs.

ReadOnly

A la valeur True si le classeur a t ouvert en lecture seule.

Saved

A la valeur True si le classeur spcifi n'a pas t modifi


depuis son dernier enregistrement.

SaveLinkValues

A la valeur True si Microsoft Excel enregistre les valeurs


des liaisons externes avec le classeur.

Sheets

Renvoie une collection Sheets qui reprsente toutes les


feuilles du classeur actif.

Styles

Renvoie une collection Styles qui reprsente tous les


styles du classeur spcifi.

Worksheets

Renvoie une collection Sheets qui reprsente toutes les


feuilles de calcul du classeur actif.

WriteReserved

A la valeur True si le classeur est protg contre l'criture.

Le tableau 11.4 liste les principales mthodes de lobjet Workbook.


Tableau 11.4 Principales mthodes de lobjet Workbook
Activate

Active la premire fentre associe au classeur.

Close

Ferme le classeur.

PrintOut

Imprime le classeur.

PrintPreview

Affiche un aperu du classeur tel qu'il apparatra une fois


imprim.

RefreshAll

Actualise toutes les plages de donnes externes et les


rapports de tableau crois dynamique du classeur
spcifi.

Save

Enregistre les modifications apportes au classeur


spcifi.

SaveAs

Enregistre les modifications du classeur dans un fichier


diffrent.

Chap11.fm Page 225 Mardi, 23. janvier 2007 5:12 17

225

Objet Worksheet

Tableau 11.4 Principales mthodes de lobjet Workbook


SaveCopyAs

Enregistre une copie du classeur dans un fichier sans


modifier le classeur ouvert en mmoire.

Unprotect

Supprime la protection d'une feuille ou d'un classeur.


Cette mthode est sans effet si la feuille ou le classeur
n'est pas protg.

OBJET WORKSHEET
Lobjet Worksheet est un membre de la collection Worksheets qui
contient toutes les feuilles de calcul (worksheets en anglais) dun
classeur. En tant que membre dune collection, on accde une
feuille de calcul par son numro dindice. Le programme suivant
permet dafficher tous les noms des feuilles dun classeur :
For i = 1 To Worksheets.Count
MsgBox Worksheets(i).Name
Next

Il est galement possible de dsigner une feuille par son nom :


Worksheets("Feuil1").Activate

Le tableau 11.5 liste les principales proprits de lobjet Worksheet.


Tableau 11.5 Principales proprits de lobjet Worksheet
Cells

Renvoie un objet Range qui reprsente toutes les


cellules dans la feuille de calcul active.

Columns

Renvoie un objet Range qui reprsente toutes les


colonnes de la feuille de calcul active.

EnableCalculation

A la valeur True si Microsoft Excel recalcule


automatiquement la feuille de calcul quand cela est
ncessaire.

Name

Renvoie ou dfinit le nom de l'objet.

Names

Renvoie une collection Names qui reprsente tous les


noms du classeur actif.

Chap11.fm Page 226 Mardi, 23. janvier 2007 5:12 17

226

Chapitre 11. Programmer Excel

Tableau 11.5 Principales proprits de lobjet Worksheet


Next

Renvoie un objet Chart, Range ou Worksheet qui


reprsente la prochaine feuille ou cellule.

PageSetup

Renvoie un objet PageSetup contenant tous les


paramtres de mise en page de l'objet spcifi.

Previous

Renvoie un objet Chart, Range ou Worksheet qui


reprsente la cellule ou la feuille prcdente.

ProtectContents

A la valeur True si le contenu de la feuille est protg.

ProtectionMode

A la valeur True si la protection Interface utilisateur


seulement est active. Pour activer la protection Interface
utilisateur seulement, utilisez la mthode Protect en
affectant la valeur True l'argument UserInterfaceOnly.

Range

Renvoie un objet Range

Rows

Renvoie un objet Range qui reprsente toutes les lignes


de la feuille de calcul active.

Visible

A la valeur True si l'objet est visible.

Le tableau 11.6 liste les principales mthodes de lobjet Worksheet.


Tableau 11.6 Principales mthodes de lobjet Worksheet
Activate

Active la feuille (revient cliquer sur l'onglet de la


feuille).

Calculate

Calcule tous les classeurs ouverts, une feuille de calcul


particulire dans un classeur ou une plage de cellules
dtermine dans une feuille de calcul.

Copy

Copie un objet Range dans la plage spcifie ou dans le


Presse-papiers.

Delete

Supprime un objet.

Evaluate

Convertit un nom Microsoft Excel en un objet ou une


valeur.

Move

Dplace la feuille en un autre endroit du classeur.

Paste

Colle le contenu du Presse-papiers dans la feuille.

Chap11.fm Page 227 Mardi, 23. janvier 2007 5:12 17

227

Objet Range

Tableau 11.6 Principales mthodes de lobjet Worksheet


PasteSpecial

Colle dans la feuille les donnes provenant du Pressepapiers en respectant le format spcifi. Utilisez cette
mthode pour coller des donnes provenant d'autres
applications ou pour coller des donnes en respectant
un format particulier.

PrintOut

Imprime la feuille de calcul.

PrintPreview

Affiche un aperu de la feuille de calcul telle qu'elle


apparatra une fois imprime.

Protect

Protge une feuille de calcul afin d'empcher toute


modification.

SaveAs

Enregistre les modifications de la feuille dans un fichier


diffrent.

Select

Slectionne la feuille de calcul.

Unprotect

Supprime la protection d'une feuille ou d'un classeur.


Cette mthode est sans effet si la feuille ou le classeur
n'est pas protg.

OBJET RANGE
Lobjet Range est au cur de tous les programmes Excel car cest
celui qui permet de manipuler les cellules : il reprsente une cellule,
plusieurs cellules (contigus ou non), des lignes ou des colonnes.
Pour dsigner une seule cellule, il suffit de passer en paramtre son
adresse la proprit Range. Ainsi, Range("A1") dsigne la cellule
A1 de la feuille active (lutilisation du style de notation L1C1 est
interdite). Si lon souhaite inscrire un libell dans une cellule, on
utilise la proprit Value de lobjet Range. La ligne de code suivante
inscrit en B5 le mot Tableau :
Range("B5").Value = "Tableau"

Bien videmment, si vous travaillez avec plusieurs classeurs qui ont


eux-mmes plusieurs feuilles de calcul, il vaut mieux tre le plus explicite possible et dsigner les cellules en droulant le chemin daccs
complet la plage de cellules comme dans lexemple suivant :

Chap11.fm Page 228 Mardi, 23. janvier 2007 5:12 17

228

Chapitre 11. Programmer Excel

Workbooks("Tableau d'amortissement.XLS").Worksheets("Feuil2"). _
Range("A1").Value = "Tableau"

Si lon ne prcise aucun classeur ni aucune feuille spcifique, lobjet


Range dsigne la feuille active. Si lon souhaite utiliser une feuille particulire et ne pas employer de qualificateur dobjet, il faudra donc
activer au pralable cette feuille grce la mthode Activate.
Si lon veut dsigner une plage de cellules, il suffit dindiquer la
plage comme on le fait sous Excel et le code suivant :
Range("A1:A5").Value = "Moyenne"

insre dans la plage A1 :A5 le libell Moyenne .


Il est aussi possible dutiliser un nom dfini dans une plage ce qui
permet par exemple deffacer le contenu dune plage :
Range("donnes").ClearContents

On nest pas oblig de prciser un littral comme plage dadresses et


on peut trs bien transmettre en tant que paramtre la proprit
Range une variable contenant une adresse :
Dim var
var = "A6"
Worksheets("Feuil2").Range(var).Value = "Dmonstration"

Une cellule individuelle peut aussi tre dsigne grce la proprit Cells en prcisant ses coordonnes (ligne, colonne). Ainsi,
Cells(2, 3).Value = "Janvier" permet dinscrire en ligne 2, colonne 3
de la feuille active le premier mois de lanne. Cette construction permet de gnrer facilement des sries comme dans lexemple suivant :
For i = 1 To 100
Worksheets("Feuil2").Cells(i, 2).Value = i
Next

Vous noterez quon peut tout aussi bien utiliser un objet Range
pour raliser la mme tche comme le montre le code suivant :
Dim i, var
For i = 1 To 100
var = "C" + CStr(i)
Worksheets("Feuil2").Range(var).Value = i
Next

Chap11.fm Page 229 Mardi, 23. janvier 2007 5:12 17

229

Objet Range

Le premier programme est sans doute plus lisible.


Un objet Range peut contenir des cellules non contigus ; il suffit
pour cela de prciser les adresses des cellules en les sparant par des
virgules :
Range("E8,G8,G13,E13").Select

Le tableau 11.7 liste les principales proprits de lobjet Range.


Tableau 11.7 Principales proprits de lobjet Range
Address

Renvoie la rfrence de la plage en langage macro.

AddressLocal

Renvoie la rfrence de la plage spcifie en langage


utilisateur.

Cells

Renvoie un objet Range qui reprsente toutes les cellules


dans la feuille de calcul active.

Column

Renvoie le numro de la premire colonne de la premire


zone de la plage spcifie.

Columns

Renvoie un objet Range qui reprsente toutes les


colonnes de la feuille de calcul active.

ColumnWidth

Renvoie ou dfinit la largeur de toutes les colonnes de la


plage spcifie.

Count

Renvoie le nombre des objets de la collection.

End

Renvoie un objet Range qui reprsente la cellule situe


la fin de la rgion contenant la plage source. Revient
appuyer sur FIN+HAUT, FIN+BAS, FIN+GAUCHE, ou
FIN+DROITE.

EntireColumn

Renvoie un objet Range qui reprsente la colonne entire


(ou plusieurs colonnes) contenant la plage spcifie.

EntireRow

Renvoie un objet Range qui reprsente la ligne entire


(ou plusieurs lignes) contenant la plage spcifie.

Formula

Renvoie ou dfinit la formule de l'objet dans le style de


rfrence A1 et dans la langue de la macro.

HasFormula

A la valeur True si toutes les cellules de la plage contiennent


une formule, la valeur False si aucune cellule de la plage ne
contient une formule, et la valeur Null dans les autres cas.

Chap11.fm Page 230 Mardi, 23. janvier 2007 5:12 17

230

Chapitre 11. Programmer Excel

Tableau 11.7 Principales proprits de lobjet Range


Offset

Renvoie un objet Range qui reprsente une plage dcale


de la plage spcifie.

Resize

Renvoie un objet Range qui reprsente la plage


redimensionne.

Row

Renvoie le numro de la premire ligne de la premire


zone de la plage.

RowHeight

Renvoie la hauteur, mesure en points, de toutes les


lignes de la plage spcifie.

Rows

Renvoie un objet Range qui reprsente toutes les lignes


de la feuille de calcul active.

Validation

Renvoie l'objet Validation qui reprsente la validation de


donnes pour la plage spcifie.

Value

Renvoie ou dfinit la valeur de la cellule spcifie. Si la


cellule est vide, la proprit Value renvoie la valeur Empty
(utilisez la fonction IsEmpty pour tester ce cas).

Value2

Renvoie ou dfinit la valeur de la cellule.

Worksheet

Renvoie un objet Worksheet qui reprsente la feuille de


calcul contenant la plage spcifie.

Le tableau 11.8 liste les principales mthodes de lobjet Range .


Tableau 11.8 Principales mthodes de lobjet Range
Activate

Active une cellule situe l'intrieur de la slection


courante. Pour slectionner une plage de cellules, utilisez
la mthode Select.

ApplyNames

Attribue des noms aux cellules de la plage spcifie.

AutoComplete

Renvoie une correspondance trouve par la fonctionnalit


saisie semi-automatique de la liste.

AutoFill

Excute une recopie incrmente sur les cellules de la


plage spcifie.

AutoFit

Modifie la largeur des colonnes de la plage ou la hauteur


des lignes de la plage pour l'ajuster au mieux.

Chap11.fm Page 231 Mardi, 23. janvier 2007 5:12 17

231

Objet Range

Tableau 11.8 Principales mthodes de lobjet Range


AutoFormat

Applique automatiquement un format prdfini la plage


spcifie.

Calculate

Calcule tous les classeurs ouverts, une feuille de calcul


particulire dans un classeur ou une plage de cellules
dtermine dans une feuille de calcul.

Clear

Efface lobjet Range.

ClearContents

Efface les formules de la plage.

ClearFormats

Annule la mise en forme de l'objet.

ColumnDifferences

Renvoie un objet Range qui reprsente toutes les cellules


dont le contenu est diffrent de celui de la cellule de
comparaison dans chaque colonne.

Consolidate

Consolide les donnes provenant de plusieurs plages


situes dans diffrentes feuilles de calcul au sein d'une
seule plage situe dans une seule feuille de calcul.

Copy

Copie l'objet Range dans la plage spcifie ou dans le


Presse-papiers.

CreateNames

Cre des noms dans la plage spcifie en fonction des


tiquettes de texte de la feuille.

Cut

Coupe l'objet et le place dans le Presse-papiers.

DataSeries

Cre une srie de donnes dans la plage spcifie.

Delete

Supprime l'objet Range.

FillDown

Remplit la plage spcifie de haut en bas partir de la ou des


cellules situes en haut de cette plage. Le contenu et le
format de la ou des cellules de la ligne du haut d'une plage
sont copis dans toutes les autres lignes de cette plage.

FillLeft

Recopie gauche partir de la ou des cellules situes les plus


droite de la plage spcifie. Le contenu et le format de la ou
des cellules de la colonne la plus droite d'une plage sont
copis dans toutes les autres colonnes de cette plage.

FillRight

Recopie droite partir de la ou des cellules les plus


gauche de la plage spcifie. Le contenu et le format de la
ou des cellules de la colonne la plus gauche d'une plage
sont copis dans toutes les autres colonnes de cette plage.

Chap11.fm Page 232 Mardi, 23. janvier 2007 5:12 17

232

Chapitre 11. Programmer Excel

Tableau 11.8 Principales mthodes de lobjet Range


FillUp

Remplit la plage spcifie de bas en haut partir de la ou


des cellules situes en bas de cette plage. Le contenu et le
format de la ou des cellules de la ligne du bas d'une plage
sont copis dans toutes les autres lignes de la plage.

Find

Recherche une information spcifique dans une plage et


renvoie un objet Range qui reprsente la premire cellule
o cette information apparat.

FindNext

Poursuit une recherche dbute avec la mthode Find.


Recherche la cellule suivante qui correspond aux mmes
critres et renvoie un objet Range qui la reprsente.

FindPrevious

Poursuit une recherche dbute avec la mthode Find.


Recherche la cellule prcdente qui correspond aux
mmes critres et renvoie un objet Range qui la reprsente.

Insert

Insre une cellule ou une plage de cellules dans la feuille


de calcul et dcale les autres cellules pour librer la place
ncessaire.

ListNames

Colle la liste de tous les noms de la feuille de calcul qui ne


sont pas masqus, en commenant au niveau de la
premire cellule de la plage.

Parse

Redistribue une plage de donnes et la divise en plusieurs


cellules.

PasteSpecial

Colle dans la plage spcifie les donnes provenant du


Presse-papiers.

PrintOut

Imprime l'objet Range.

PrintPreview

Affiche un aperu de l'objet tel qu'il apparatra une fois


imprim.

Replace

Recherche et remplace des caractres dans les cellules de


la plage spcifie.

RowDifferences

Renvoie un objet Range qui reprsente toutes les cellules


dont le contenu est diffrent de celui de la cellule de
comparaison dans chaque ligne.

Select

Slectionne l'objet Range.

SpecialCells

Renvoie un objet Range qui reprsente toutes les cellules


correspondant au type et la valeur spcifis.

Chap11.fm Page 233 Mardi, 23. janvier 2007 5:12 17

233

Mise en pratique

Tableau 11.8 Principales mthodes de lobjet Range


Table

Cre une table de donnes partir des valeurs d'entre et


des formules que vous dfinissez dans une feuille de
calcul.

TextToColumns

Redistribue sur plusieurs colonnes une colonne de cellules


qui comportent du texte.

MISE EN PRATIQUE
Pour illustrer notre propos, nous allons vous prsenter deux macros
qui montrent en situation les objets que nous venons dtudier.
La macro suivante permet de griser une ligne sur deux de la plage
slectionne par lutilisateur. Le programme sassure dabord que lutilisateur a bien slectionn plusieurs cellules. Si tel nest pas le cas,
linstruction Exit Sub permet de quitter la procdure. Puis grce une
boucle, on applique, une ligne sur deux un motif de gris chaque cellule. Loprateur modulo permet de sauter une ligne sur deux. Vous
noterez galement la construction With End With qui permet dappliquer la mise en forme aux cellules concernes.
Sub alterne_lignes()
' on teste si l'utilisateur a slectionn plusieurs cellules
If Selection.Count = 1 Then
MsgBox "Vous devez slectionner plusieurs lignes !"
Exit Sub
End If
Dim adresse As String ' contient l'adresse de la plage
slectionne
Dim compteur As Integer ' compteur de boucle
adresse = ActiveSheet.Name & "!" & Selection.Address
' MsgBox adresse
' l'instruction commente ci-dessus permet de s'assurer que
' la valeur renvoye est correcte. Quand la macro fonction
' correctement, on supprime la ligne ou on la commente
For compteur = 1 To Selection.Rows.Count
If compteur Mod 2 = 1 Then ' on saute une ligne sur deux
With Range(adresse).Rows(compteur).Interior
.ColorIndex = 15 ' gris 25 %
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With

Chap11.fm Page 234 Mardi, 23. janvier 2007 5:12 17

234

Chapitre 11. Programmer Excel

End If
Next compteur
End Sub

La figure 11.3 illustre les rsultats fournis par notre programme.

Figure 11.3 Le programme grise une ligne


sur deux de la plage slectionne

La macro suivante permet de reprer les cellules qui contiennent


une formule. En effet, quand vous analysez une feuille de calcul que
vous navez pas conue vous-mme, il peut tre intressant de dtecter rapidement les cellules contenant une formule. Lutilisateur slectionne une plage de cellules et la macro parcourt la collection laide
de la structure For Each. Si la cellule contient une formule, une bote
de dialogue affiche ladresse de la cellule puis le libell de la formule
(aprs avoir saut une ligne).
Sub affiche_formules()
Dim adresse As String ' contient l'adresse de la plage
slectionne
For Each cellule In Selection
adresse = ActiveSheet.Name & "!" & cellule.Address
If Range(adresse).HasFormula Then
MsgBox cellule.Address + vbCr + _
Range(adresse).Formula
End If

Chap11.fm Page 235 Mardi, 23. janvier 2007 5:12 17

235

Mise en pratique

Next cellule
End Sub

La figure 11.4 illustre les rsultats fournis par notre programme.

Figure 11.4 Le programme affiche les cellules


qui contiennent une formule

Si vous le voulez, vous pouvez, au lieu dafficher la formule dans


une bote de dialogue, griser les cellules qui contiennent une formule
en utilisant la technique que nous avons employe dans la premire
macro. Mais le plus judicieux est sans doute encore de placer un commentaire dans les cellules contenant une formule. De cette manire,
chaque cellule qui contient une formule est identifie par un petit
triangle rouge dans son coin suprieur droit. Le code suivant insre le
libell de la formule comme texte du commentaire :
For Each cellule In Selection
adresse = ActiveSheet.Name & "!" & cellule.Address
If Range(adresse).HasFormula Then
Range(adresse).AddComment (cellule.Formula)
End If
Next cellule

Chap11.fm Page 236 Mardi, 23. janvier 2007 5:12 17

236

Chapitre 11. Programmer Excel

Il suffit alors de passer le curseur de la souris au-dessus des cellules


commentes pour voir apparatre le texte de la formule.

CONCLUSION
Nous navons couvert quune petite partie du modle dobjets
dExcel et nous nous sommes concentrs sur les objets les plus
courants que sont Application, Workbook, Worksheet et Range.
Dans la mesure o vous aurez trs souvent balayer une collection, vous devez apprendre bien matriser la construction For
Each qui amliorera la lisibilit de vos macros. Comme la hirarchie du modle dobjets dExcel peut comporter de nombreux
niveaux pour arriver jusqu la cellule qui est lentit de base
dune feuille de calcul, il ne faut pas hsiter procder par tapes
et tester chaque niveau pour arriver ses fins. Pour bien comprendre le modle dobjets dExcel, commencez par crire des
macros trs courtes qui mettent en uvre les mthodes et les
proprits des principaux objets. Utilisez aussi souvent que possible lenregistreur de macros qui permet dobtenir rapidement un
squelette de programme.

Chap12.fm Page 237 Mardi, 23. janvier 2007 5:31 17

12
Programmer Access
Le modle dobjets dAccess est assez diffrent des modles de Word
et dExcel. Cela tient dabord aux diffrences entre ces applications ;
Word et Excel sont des applications orientes document alors
quAccess ne sait grer que des bases de donnes. Access, ds sa sortie, tait dot dun langage nomm Access Basic ; la parution
dOffice 97, Access Basic a t fondu dans le moule commun
qutait VBA. De plus, Access possde des macros, mais pas denregistreur ; les macros dAccess ne sont pas crites en VBA, mais dans
un langage spcial ; elles sapparentent plus aux macro-commandes
(empilement dinstructions sans possibilit de modifier le flux des
commandes) des anciens logiciels qu des programmes VBA.
Le modle dobjets dAccess comporte moins dobjets que ceux de
Word et dExcel car les niveaux darborescence sont plus restreints et la
structure en est par consquent plus simple. Access contient en natif
des objets identifis en tant que tels qui saffichent ds louverture dune
base de donnes : tables, requtes, formulaires, tats et pages.
Cela tant, la programmation Access est beaucoup moins aise que
la programmation de Word ou dExcel ; il y a plusieurs raisons cela :
premirement, une base de donnes est un objet plus complexe quun
document Word ou Excel. Deuximement, une base de donnes est
souvent utilise en rseau par plusieurs personnes en mme temps ce
qui pose toute une srie de problmes particuliers. Enfin, le dveloppeur Access doit construire sa propre interface utilisateur, ce qui
nest pas vraiment le cas avec Word et Excel. Toutes ces raisons font

Chap12.fm Page 238 Mardi, 23. janvier 2007 5:31 17

238

Chapitre 12. Programmer Access

quil faudrait plusieurs ouvrages de ce type pour couvrir de manire


exhaustive le sujet de la programmation dAccess. Nous nous contenterons ici daller lessentiel et de vous donner des pistes pour aller
plus loin.

COLLECTIONS DACCESS
Comme pour Word ou Excel, on peut accder un objet dAccess
en fournissant son numro dans la collection ou bien son nom :
AllForms(0)
AllReports("Bordereau journalier")

Acces autorise galement une autre forme de syntaxe :


AllForms![Saisie de la fiche]

Nous nous contenterons dans ce chapitre de lister lensemble des


collections et des objets dAccess puis nous dtaillerons les objets
DoCmd et Form.
Les collections en gris (tableau 12.1) correspondent aux objets
natifs dAccess.
Tableau 12.1 Collections dAccess
AccessObjectProperties

Proprits d'une instance dtermine d'un objet.

AllDataAccessPages

Page d'accs aux donnes dans l'objet CurrentProject ou


CodeProject.

AllDatabaseDiagrams

Schma de base de donnes dans l'objet CurrentData


ou CodeData.

AllForms

Formulaire dans l'objet CurrentProject ou CodeProject.

AllMacros

Macro dans l'objet CurrentProject ou CodeProject.

AllModules

Module dans l'objet CurrentProject ou CodeProject.

AllQueries

Requte dans l'objet CurrentData ou CodeData.

AllReports

Etat dans l'objet CurrentProject ou CodeProject.

Chap12.fm Page 239 Mardi, 23. janvier 2007 5:31 17

239

Objets dAccess

Tableau 12.1 Collections dAccess


AllStoredProcedures

Procdure stocke dans l'objet CurrentData ou


CodeData.

AllTables

Table dans l'objet CurrentData ou CodeData.

AllViews

Vue dans l'objet CurrentData ou CodeData.

Controls

Contrles d'un formulaire, d'un tat ou d'une section, ou


contrles figurant dans un autre contrle ou qui y sont
attachs. La collection Controls fait partie d'un objet
Form, Report, Section ou Control.

FormatConditions

Formats conditionnels d'un contrle Zone de liste


modifiable ou Zone de texte. Chaque format
conditionnel est reprsent par un objet
FormatCondition.

Forms

Formulaires ouverts en cours dans une base de donnes


Access.

Modules

Modules standard et modules de classe ouverts dans


une base de donnes Access.

Pages

Objets Page d'un contrle Onglet.

Properties

Proprits prdfinies d'une instance d'un objet Form,


Report ou Control ouvert.

References

Objets Reference reprsentant chaque rfrence


actuellement dfinie.

Reports

tats actuellement ouverts dans une base de donnes


Access.

OBJETS DACCESS
Le tableau 12.2 liste les principaux objets dAccess.
Tableau 12.2 Objets dAccess
AccessObject

Fait rfrence un objet Access dtermin dans les


collections AllDataAccessPages, AllDatabaseDiagrams,
AllForms, AllMacros, AllModules, AllQueries, AllReports,
AllStoredProcedures, AllTables, AllViews

Chap12.fm Page 240 Mardi, 23. janvier 2007 5:31 17

240

Chapitre 12. Programmer Access

Tableau 12.2 Objets dAccess


AccessObjectProperty

Caractristique prdfinie ou dfinie par l'utilisateur d'un


objet AccessObject.

Application

Fait rfrence l'application Access active.

CodeData

Objets stocks dans la base de donnes du code par


l'application source (serveur) (Jet ou SQL).

Control

Contrle de formulaire, d'tat ou de section, ou un


contrle dans un autre contrle ou attach un autre
contrle.

CurrentData

Objets stocks dans la base de donnes en cours par


l'application source (serveur) (Jet ou SQL).

CurrentProject

Projet du projet Access (.adp) ou de la base de donnes


Access (.mdb) en cours.

DefaultWebOptions

Attributs d'application globaux utiliss par Access pendant


l'enregistrement d'une page d'accs aux donnes comme
page Web ou pendant l'ouverture d'une page Web.

DoCmd

Sert excuter des actions Access partir de VBA.

Form

Formulaire Access.

FormatCondition

Mise en forme conditionnelle d'un contrle Zone de liste


modifiable ou Zone de texte (membre de la collection
FormatConditions).

Hyperlink

Lien hypertexte associ un contrle dans un formulaire,


un tat ou une page d'accs aux donnes.

Module

Fait rfrence un module standard ou un module de


classe.

Page

Membre de la collection Pages.

Reference

Rfrence dfinie sur la bibliothque de type d'une autre


application ou d'un autre projet.

Report

Rapport.

Screen

Fait rfrence au formulaire, l'tat ou au contrle


particulier qui est actif.

WebOptions

Proprits des options Web d'une page d'accs aux


donnes Microsoft Access dtermine.

Chap12.fm Page 241 Mardi, 23. janvier 2007 5:31 17

241

Objet DoCmd

OBJET DOCMD
Lobjet DoCmd est un objet un peu part car il ne possde aucune
proprit ; la raison en est que cet objet ne sert en fait qu excuter
des actions qui sont normalement effectues en mode interactif,
comme louverture dun formulaire. Voici la syntaxe dutilisation de
lobjet DoCmd :
[application.]DoCmd.mthode [arg1, arg2, ...]
Lobjet DoCmd possde les arguments suivants :

arg1,
arg2...

Argument

Description

Application

Facultatif. L'objet
Application

Mthode

Une des mthodes prises


en charge par cet objet.

Arguments de la mthode slectionne.


Ces arguments sont semblables aux
arguments d'action de l'action
correspondante.

Voici un exemple dimpression dun tat :


DoCmd.OpenReport strNomDoc, acViewNormal, "Filtre factures"

Vous vous servirez trs souvent dans vos programmes de la commande DoCmd.OpenForm qui permet douvrir un formulaire. Une
nouvelle fois, Intellisense vous guidera dans lutilisation de la syntaxe
et des commandes de cette mthode :

Figure 12.1 Lditeur nous guide dans la saisie


des paramtres de lobjet DoCmd

Chap12.fm Page 242 Mardi, 23. janvier 2007 5:31 17

242

Chapitre 12. Programmer Access

La plupart des mthodes de lobjet DoCmd ont des paramtres


facultatifs. Par exemple, la mthode OpenForm utilise sept arguments
dont seul le premier (le nom du formulaire) est obligatoire.
Le tableau 12.3 liste les principales mthodes de lobjet DoCmd.
Tableau 12.3 Principales mthodes de lobjet DoCmd
ApplyFilter

Applique un filtre, une requte ou une clause WHERE


SQL un formulaire.

Beep

Emet un signal sonore dans le haut-parleur de l'ordinateur.

CancelEvent

Annule l'vnement qui a entran l'excution par


Access de la macro contenant cette action.

Close

Ferme une fentre Microsoft Access spcifie, ou la


fentre active au cas o aucune fentre n'est spcifie.

CopyObject

Copie l'objet de base de donnes spcifi dans une


autre base de donnes Access (.mdb) ou dans la
mme base de donnes, ou bien dans un projet
Access (.adp) sous un nom nouveau.

DeleteObject

Supprime un objet de base de donnes spcifi. Cette


action quivaut slectionner un objet dans la fentre
Base de donnes, puis appuyer sur la touche SUPPR
ou cliquer sur Supprimer dans le menu Edition.

FindNext

Trouve l'enregistrement suivant qui satisfait aux


critres spcifis par l'action TrouverEnregistrement
prcdente ou la bote de dialogue Rechercher dans le
champ.

FindRecord

Trouve la premire instance des donnes qui satisfont


aux critres spcifis par les arguments de l'action
TrouverEnregistrement.

GoToControl

Active le champ ou le contrle spcifi de l'enregistrement


en cours du formulaire ouvert, de la feuille de donnes du
formulaire, de la table ou de la requte.

GoToPage

Active le premier contrle d'une page spcifie dans


le formulaire actif.

GoToRecord

Transforme l'enregistrement spcifi en enregistrement


courant dans une table ouverte, un formulaire ou une
feuille de rponses dynamique de requte.

Chap12.fm Page 243 Mardi, 23. janvier 2007 5:31 17

243

Objet DoCmd

Tableau 12.3 Principales mthodes de lobjet DoCmd


Hourglass

Transforme le pointeur de la souris en une image de


sablier (ou en une autre icne que vous avez choisie)
lors de l'excution d'une macro.

Maximize

Agrandit la fentre active de manire ce qu'elle


remplisse la fentre Access.

Minimize

Rduit la fentre active en icne au bas de la fentre


Microsoft Access.

MoveSize

Dplace ou redimensionne la fentre active.

OpenDataAccessPage

Ouvre une page d'accs aux donnes en mode Page


ou en mode Cration.

OpenForm

Ouvre un formulaire en mode Formulaire, en mode


Cration de formulaire, en mode Aperu avant
impression ou en mode Feuille de donnes. Vous
pouvez slectionner les modes de saisie et d'affichage
des donnes du formulaire et limiter les
enregistrements affichs.

OpenQuery

Ouvre une requte Slection ou Analyse croise en


mode Feuille de donnes, en mode Cration ou en
mode Aperu avant impression. Cette action excute
une requte action. Vous pouvez aussi slectionner un
mode de saisie de donnes pour la requte.

OpenReport

Ouvre un tat en mode Cration ou en mode Aperu


avant impression, ou imprime cet tat
immdiatement. Vous pouvez aussi limiter les
enregistrements imprims dans l'tat.

OpenTable

Ouvre une table en mode Feuille de donnes, en


mode Cration ou en mode Aperu avant impression.
Vous pouvez aussi slectionner un mode de saisie de
donnes pour la table.

OpenView

Ouvre une vue en mode Feuille de donnes, en mode


Cration ou en mode Aperu avant impression. Cette
action excute la vue nomme lors de son ouverture
en mode Feuille de donnes. Vous pouvez
slectionner la saisie de donnes pour la vue et limiter
les enregistrements affichs par la vue.

Chap12.fm Page 244 Mardi, 23. janvier 2007 5:31 17

244

Chapitre 12. Programmer Access

Tableau 12.3 Principales mthodes de lobjet DoCmd


OutputTo

Copie les donnes de l'objet de base de donnes


Access spcifi (feuille de donnes, formulaire, tat,
module, page d'accs aux donnes) dans un fichier au
format Microsoft Excel 98 (*.xls), MS-DOS text (*.txt),
ou Rich Text Format (*.rtf).

Quit

Quitte Access. L'action Quitter vous donne le choix entre


plusieurs options pour enregistrer les objets de la base de
donnes avant de sortir de Microsoft Access.

Requery

Met jour les donnes d'un contrle spcifi dans


l'objet en actualisant la source du contrle. Si aucun
contrle n'est spcifi, cette action actualise la source
de l'objet lui-mme. Utilisez cette action pour vrifier
que l'objet actif ou l'un de ses contrles affiche les
donnes les plus rcentes.

Restore

Rend une fentre agrandie ou rduite sa taille


prcdente.

RunCommand

Excute une des commandes intgres de Microsoft


Access. La commande peut apparatre sur une barre
de menus, une barre d'outils ou un menu contextuel
de Microsoft Access.

Save

Enregistre soit un objet Microsoft Access spcifique,


soit l'objet actif si aucun objet n'est spcifi. Vous
pouvez galement enregistrer l'objet actif sous un
nouveau nom dans certains cas (ceci fonctionne de
manire identique la commande Enregistrer sous du
menu Fichier).

SelectObject

Slectionne un objet de la base de donnes spcifi.

SetMenuItem

Dfinit l'tat d'lments du menu (actifs ou inactifs,


cochs ou non-cochs) dans la barre d'outils
personnalise ou la barre de menus globale pour la
fentre active.

SetWarnings

Active ou dsactive les messages systme.

ShowAllRecords

Supprime tout filtre appliqu de la table, du jeu


rsultant de requte ou du formulaire actif, et affiche
tous les enregistrements de la table ou de la feuille de
rponses dynamique ou tous les enregistrements de
la table ou de la requte sous-jacente du formulaire.

Chap12.fm Page 245 Mardi, 23. janvier 2007 5:31 17

245

Objet Form

Tableau 12.3 Principales mthodes de lobjet DoCmd


ShowToolbar

Affiche ou masque une barre d'outils par dfaut ou


personnalise. Vous pouvez afficher une barre d'outils
par dfaut dans toutes les fentres Microsoft Access
ou seulement dans son mode normal d'affichage (par
exemple, la barre d'outils Formulaires en mode
Formulaire).

TransferDatabase

Importe ou exporte des donnes entre la base de


donnes Access (.mdb) active ou le projet Access
(.adp) et une autre base de donnes.

TransferSpreadsheet

Importe ou exporte des donnes entre la base de


donnes Access (.mdb) ou le projet Access (.adp) en
cours et un fichier de feuille de calcul.

TransferText

Importe ou exporte du texte entre la base de donnes


Access (.mdb) ou le projet Access (.adp) en cours et un
fichier texte.

OBJET FORM
Les formulaires sont la base de tout dveloppement Access car ils
constituent linterface utilisateur du programme qui va permettre de
raliser les oprations courantes de gestion de la base de donnes :
crer, modifier, supprimer et rechercher des donnes. Les formulaires (UserForm) grs par VBA, qui seront tudis dans la dernire
partie de cet ouvrage, constituent une forme gnrique de dialogue
homme-machine quelque peu diffrente des formulaires Access ; en
effet, Access dispose de ses propres formulaires et nutilise pas les
UserForm VBA car il a des besoins spcifiques comme la gestion des
sous-formulaires qui sont indispensables dans ltablissement dune
relation de un plusieurs. Les formulaires dAccess sont donc une
version beaucoup plus volue des UserForm de VBA ; la collection
Forms contient tous les formulaires ouverts en cours dans une base
de donnes Access. On fait rfrence un objet Form issu de la collection Forms en mentionnant son nom ou son indice dans la collection. Il est toujours prfrable de faire rfrence son nom parce
que l'indice dans la collection d'un formulaire peut changer. La collection Forms est indice partir de zro. Si vous faites rfrence

Chap12.fm Page 246 Mardi, 23. janvier 2007 5:31 17

246

Chapitre 12. Programmer Access

un formulaire par son indice, le premier formulaire ouvert est


Forms(0), le second est Forms(1), et ainsi de suite. Si le nom du formulaire comprend un espace, il doit tre entour de crochets droits
([ ]).
Voici un tableau rsumant toutes les syntaxes possibles pour faire
rfrence un formulaire :
Syntaxe

Exemple

Forms!nomformulaire

Forms!FormulaireCommandes

Forms![nom formulaire]

Forms![Formulaire Commandes]

Forms("nomformulaire")

Forms("FormulaireCommandes")

Forms(index)

Forms(0)

Si vous souhaitez connatre par programme le nom de tous vos formulaires, vous pouvez utiliser le code suivant :
Dim formulaire As Object
For Each formulaire In Application.CurrentProject.AllForms
MsgBox formulaire.Name
Next

Notez que la proprit CurrentProject de lobjet Application fait


rfrence la base de donnes ouverte et que lobjet Application peut
ne pas tre mentionn puisque CurrentProject est une proprit globale.
Chaque objet Form comprend une collection Controls qui contient tous les contrles du formulaire. Vous pouvez faire rfrence un
contrle situ sur un formulaire en vous rfrant la collection Controls de manire implicite ou explicite. Lutilisation de votre code sera
plus efficace si vous y faites rfrence implicitement. Les exemples suivants montrent deux manires possibles de faire rfrence au contrle
NouvDonnes du formulaire Commandes :
' Rfrence implicite.
Forms!Commandes!NouvDonnes
' Rfrence explicite.
Forms!Commandes.Controls!NouvDonnes

Chap12.fm Page 247 Mardi, 23. janvier 2007 5:31 17

247

Objet Form

Les deux exemples suivants vous montrent comment faire rfrence un contrle intitul NouvDonnes dans un sous-formulaire
ctlSousForm contenu dans le formulaire appel Commandes :
Forms!Commandes.ctlSousForm.Form!Controls.NouvDonnes
Forms!Commandes.ctlSousForm!NouvDonnes

Vous pouvez, grce la commande For Each, numrer tous les contrles dun formulaire. Le programme suivant se contente de lister leur
nom dans la fentre Excution de lditeur de programmes (commande
Debug.Print) mais on peut trs bien imaginer de modifier leur taille :
Dim controle As Control
For Each controle In Application.Forms(0).Controls
Debug.Print controle.Name
Next

Le tableau 12.4 liste les proprits les plus importantes de lobjet Form.
Tableau 12.4 Principales proprits de lobjet Form
ActiveControl

Identifie le contrle actif.

AllowAdditions

Permet de spcifier si un utilisateur peut ajouter un


enregistrement lorsqu'il utilise un formulaire.

AllowDeletions

Permet de spcifier si un utilisateur peut supprimer un


enregistrement lorsqu'il utilise un formulaire.

AllowEdits

Permet de spcifier si un utilisateur peut modifier des


enregistrements sauvegards lorsqu'il utilise un formulaire.

AutoCenter

Permet de spcifier si un formulaire sera centr


automatiquement dans la fentre de l'application lors de
l'ouverture de ce dernier.

AutoResize

Permet de dterminer si une fentre Formulaire doit tre


automatiquement dimensionne lors de son ouverture de
manire afficher des enregistrements complets.

CloseButton

Permet de spcifier si le bouton Fermer d'un formulaire est activ.

ControlBox

Permet de spcifier si un formulaire contient un menu Systme


en mode Formulaire et en mode Feuille de donnes.

Controls

Permet de faire rfrence la collection Controls d'un


formulaire ou d'un sous-formulaire.

Chap12.fm Page 248 Mardi, 23. janvier 2007 5:31 17

248

Chapitre 12. Programmer Access

Tableau 12.4 Principales proprits de lobjet Form


CurrentRecord

Identifie l'enregistrement en cours dans le jeu


d'enregistrements affich dans un formulaire.

Cycle

Permet de spcifier ce qui se produit lorsque vous appuyez


sur la touche TAB quand le dernier contrle d'un formulaire
dpendant est activ.

DataEntry

Spcifie si un formulaire dpendant ne doit s'ouvrir que pour


permettre l'utilisateur de taper des donnes. La proprit
EntreDonnes (DataEntry) ne dtermine pas si des
enregistrements peuvent tre ajouts ; elle dtermine
uniquement si des enregistrements existants sont affichs.

DefaultView

Permet de spcifier le mode d'affichage d'un formulaire lors


de son ouverture.

Dirty

Permet de dterminer si l'enregistrement en cours a subi des


modifications depuis sa dernire sauvegarde.

Filter

Spcifie un sous-jeu d'enregistrements afficher lorsqu'un


filtre est appliqu un formulaire.

FilterOn

Spcifie ou dtermine si la proprit Filtre (Filter) d'un


formulaire ou d'un tat est applique.

FrozenColumns

Dtermine le nombre de colonnes geles en mode Feuille de


donnes. Les colonnes geles sont affiches dans la partie
gauche de la feuille de donnes et ne bougent pas lorsque
vous faites dfiler la feuille de donnes horizontalement.

Modal

Spcifie si un formulaire s'ouvre en tant que formulaire


modal. Dans ce cas, vous devez fermer ce formulaire avant
de pouvoir activer un autre objet.

NavigationButtons

Spcifie si un formulaire comprend des boutons de


dplacement et une zone Enr. .

NewRecord

Dtermine si l'enregistrement en cours est un nouvel


enregistrement.

OrderBy

Spcifie de quelle manire les enregistrements doivent tre


tris dans un formulaire.

OrderByOn

Spcifie si le paramtrage de la proprit OrderBy d'un objet


est appliqu.

Chap12.fm Page 249 Mardi, 23. janvier 2007 5:31 17

249

Objet Form

Tableau 12.4 Principales proprits de lobjet Form


PopUp

Spcifie si un formulaire doit s'ouvrir en tant que formulaire


indpendant.

Properties

Renvoie une rfrence l'objet de collection Properties d'un


contrle.

RowHeight

Spcifie la hauteur de toutes les lignes en mode Feuille de


donnes.

Visible

Affiche ou masque un formulaire. Cela s'avre utile si vous


souhaitez conserver l'accs aux informations sans pour
autant afficher le formulaire. Vous pouvez, par exemple,
vous servir de la valeur d'un contrle d'un formulaire
masqu comme critre pour une requte.

Tableau 12.5 Principales mthodes de lobjet Form


GoToPage

Permet d'activer le premier contrle de la page spcifie


dans le formulaire actif.

Recalc

Effectue une mise jour immdiate de tous les contrles


calculs d'un formulaire.

Refresh

Effectue une mise jour immdiate des enregistrements de


la source d'enregistrements sous-jacente d'un formulaire ou
d'une feuille de donnes, de manire tenir compte de vos
modifications et de celles des autres utilisateurs dans un
environnement multi-utilisateur.

Repaint

Effectue toutes les mises jour d'cran en attente pour un


formulaire spcifi. La mthode Repaint effectue aussi tous
les calculs en attente des contrles du formulaire.

Requery

Met jour les donnes sous-jacentes d'un formulaire spcifi


ou un contrle du formulaire actif, en interrogeant nouveau
la source de donnes du formulaire ou du contrle.

SetFocus

Active le formulaire spcifi, le contrle spcifi du formulaire


actif ou le champ spcifi de la feuille de donnes active.

Undo

Restaure un contrle ou un formulaire tel qu'il tait avant


d'tre modifi. Par exemple, la mthode Undo vous permet
d'effacer une modification dans un enregistrement qui
contient une entre non valide.

Chap12.fm Page 250 Mardi, 23. janvier 2007 5:31 17

250

Chapitre 12. Programmer Access

Programmation des vnements


Avant lapparition de Windows, les programmes qui sexcutaient sous
MS-DOS, dans une interface en mode texte, taient assez simples
concevoir : une fentre unique contenait un menu et lutilisateur ne
pouvait excuter quune seule commande la fois.
Avec lavnement de Windows, les choses ont considrablement volu du point de vue du programmeur ; les fentres ont envahi lcran
et un priphrique de saisie supplmentaire a vu le jour : la souris.
L o le programmeur devait se contenter de grer la saisie au clavier
dune commande, les dveloppeurs doivent prsent grer le multifentrage, le redimensionnement des fentres, la saisie au clavier et les
actions de la souris sur tous les objets constituant linterface utilisateur.
Si la vie est devenue plus simple pour lutilisateur, elle a eu tendance
se complexifier pour le programmeur. Il a donc fallu inventer un nouveau modle de dveloppement logiciel : le modle vnementiel.
Windows considre en effet que chaque objet peut ragir des vnements et dfinit pour chaque type dobjet une srie dvnements.
Ainsi, tous les objets dun formulaire, cest--dire principalement les
contrles, ragissent des vnements.
Quand on programme sous Access, il faut donc prvoir les vnements
qui sont susceptibles de se dclencher pour un objet donn et crire
des programmes pour traiter ces vnements.
Un programme qui traite un vnement sappelle un gestionnaire
dvnement.
Pour connatre la liste des vnements rattachs un contrle, il suffit
de regarder la feuille de proprits.
Vous devez faire attention lordre dexcution des diffrents vnements dun formulaire ou dun contrle.

MISE EN PRATIQUE
Pour illustrer notre propos, nous allons vous prsenter plusieurs
macros qui illustrent la programmation des formulaires.

Chap12.fm Page 251 Mardi, 23. janvier 2007 5:31 17

251

Mise en pratique

Apparition et remplissage dune liste par programmation


Les listes de choix amliorent lergonomie dun formulaire en permettant un utilisateur de slectionner, laide de la souris, une
valeur plutt que de la saisir au clavier. La plupart du temps, les lments de la liste sont stocks dans une table. Mais il peut arriver
quil soit prfrable que la liste soit gnre par programmation,
notamment parce que son contenu dpend dun champ saisi prcdemment. Pour remplir une liste par programmation, il faut en fait
crire un programme qui attribue des valeurs des proprits. Ce
que vous auriez pu faire manuellement, en remplissant la feuille de
proprits dun contrle, doit alors tre accompli par un programme.
Notre exemple permet de faire apparatre un contrle sur un formulaire en fonction de la valeur dun autre contrle. Une table Disques (qui stocke des DVD) contient un champ toutpublic qui permet
de savoir si le DVD est visible par tous. Nous souhaitons affiner cette
information et, dans le cas o le film ne soit pas visible par tous, nous
voulons pouvoir saisir la limite dge de linterdiction. Pour ce faire,
nous allons lgrement modifier notre table et transformer le champ
toutpublic en interdiction. De plus, nous allons ajouter un autre
champ qui sera intitul limite (figure 12.2).

Figure 12.2 Structure de la table Disques

La rgle de gestion est la suivante : si le champ interdiction est gal Oui


(cela signifie que la case est coche), alors un contrle zone de liste apparat
et lutilisateur peut choisir entre les valeurs -12 ans, -16 ans et -18 ans.
La premire tche consiste laborer le formulaire de saisie. Celui
qui est illustr la figure 12.3 est relativement classique : il a t
gnr avec lAssistant Formulaire puis a t retravaill en mode conception. Essentiellement trois modifications ont t ralises :

Chap12.fm Page 252 Mardi, 23. janvier 2007 5:31 17

252

Chapitre 12. Programmer Access

Le champ limite a t transform en un contrle zone de liste


grce la commande FormatRemplacer parZone de liste
droulante.
La proprit Visible du contrle limite a t initialise Non.
La proprit Visible du contrle lgende_limite (ltiquette de
texte qui apparat devant la liste) a t initialise Non.

Figure 12.3 Formulaire Disques en mode cration

Le fait que la proprit Visible de ces deux contrles soit initialise


Non a pour effet de ne pas les afficher quand le formulaire est ouvert
comme lillustre la figure 12.4.

Figure 12.4 Formulaire Disques en mode affichage

Chap12.fm Page 253 Mardi, 23. janvier 2007 5:31 17

253

Mise en pratique

Dans la mesure o ces contrles sont masqus, notre programme va


se contenter de les afficher en modifiant leur proprit Visible. Une
fois que cela sera ralis, il faudra construire par programmation la
liste droulante ; nous aurions trs bien pu dfinir cette liste en remplissant les proprits du contrle dans le concepteur de formulaires,
mais dans la mesure o seules deux instructions suffisent, nous ne
nous en sommes pas priv. Une dernire instruction positionnera le
curseur au bon endroit.
Maintenant que la logique de notre programme est dtermine, la
question est de savoir o ce programme doit tre stock pour quil se
dclenche au bon moment. Vous devez choisir, pour ce faire, un vnement dans la feuille de proprits du contrle (figure 12.5).

Figure 12.5 Onglet vnement de la feuille


de proprits du contrle case cocher

Nous avons choisi le contrle interdiction parce quil est situ juste
avant le contrle limite et sa valeur va dterminer laffichage ou non
de la liste droulante. Longlet vnement de la feuille de proprits
liste tous les vnements du contrle qui sont susceptibles dtre programms. Les noms des vnements sont relativement explicites et
chacun comprend aisment que lvnement Sur clic se produit
quand lutilisateur clique sur le bouton de la souris. Notre travail consiste donc choisir le bon vnement puis crire le code qui va grer
laffichage de la liste.
Un bon vnement pour rsoudre notre problme est Sur sortie.
Comme son nom lindique, cet vnement se produit quand lutilisa-

Chap12.fm Page 254 Mardi, 23. janvier 2007 5:31 17

254

Chapitre 12. Programmer Access

teur sort du contrle. Cest donc pour cet vnement que nous allons
crire un gestionnaire. Pour ce faire, cliquez sur longlet vnements
(figure 12.5), puis sur lvnement Sur sortie. Cliquez sur le bouton
situ sur la bordure droite ( ) et dans la fentre Choisir Gnrateur,
choisissez loption Gnrateur de code puis cliquez sur le bouton OK.
La fentre de lditeur de code Visual Basic apparat avec le squelette du gestionnaire dvnement Sur sortie du contrle interdiction
(figure 12.6).

Figure 12.6 Saisie du code du gestionnaire


dvnements dans lditeur Visual Basic

Dans la fentre de code, saisissez le programme suivant :


If interdiction.Value = True Then
lgende_limite.Visible = True
limite.Visible = True
limite.RowSourceType = "Liste valeurs"
limite.RowSource = "-12 ans;-16 ans;-18 ans"
limite.SetFocus
End If

Cliquez sur licne de la disquette pour enregistrer le programme


puis fermez la fentre de lditeur de code ; fermez galement la feuille
de proprits et le formulaire.

Chap12.fm Page 255 Mardi, 23. janvier 2007 5:31 17

255

Mise en pratique

Voici la signification de ce programme qui ne compte que sept


lignes :
si la case interdiction est coche, alors ;
je fais apparatre ltiquette de la liste droulante ;
je fais apparatre la liste droulante ;
je dcide que les lments de la liste droulante seront une liste
de valeurs ;
les lments de la liste droulante sont -12 ans, -16 ans et -18 ans ;
je place le curseur sur la liste droulante.

Si vous saisissez un DVD qui nest pas pour tout public, une liste
droulante apparat quand vous sortez de la case cocher.

Remplir un champ automatiquement


Il y a une fonctionnalit qui est trs prise des utilisateurs : il sagit
du remplissage automatique dun champ en fonction de la valeur
dun autre champ. Lexemple le plus classique consiste complter
le nom dune ville quand lutilisateur a saisi son code postal. Pour ce
faire, il suffit de disposer dune table qui contienne les codes postaux
et les noms des villes associes. En utilisant la fonction DLookup,
qui retourne la valeur dun champ en fonction dun critre de
recherche, on peut rcuprer le nom de la commune qui correspond
au code postal qui vient dtre saisi. Un programme de deux lignes,
comme le montre lexemple suivant, permet de raliser cette fonctionnalit :
varville =
"Cpostal",
"[CODPOST]
Me![ville]

DLookup("[LOCALITE]", _
_
= '" & [code] & "'")
= varville

Dans notre exemple, la fonction DLookup va rechercher dans la


table Cpostal le champ LOCALITE (qui contient le nom de la commune) qui correspond au critre de recherche [CODPOST] = [code] ;
[CODPOST] est le nom du champ contenant le code postal dans la table
Cpostal, et [code] est le nom du contrle dans lequel lutilisateur a
saisi le code postal. La valeur trouve par la fonction DLookup est
stocke dans une variable baptise varville. Il suffit ensuite dinitialiser le contrle [ville], qui contient le nom de la ville, avec cette

Chap12.fm Page 256 Mardi, 23. janvier 2007 5:31 17

256

Chapitre 12. Programmer Access

variable, pour que le champ soit automatiquement rempli. Pour excuter ce programme, on utilisera lvnement Sur sortie du contrle
[code].
Dans le programme notez bien la diffrence entre les guillemets
simples et les guillemets doubles. Le critre de recherche est
une chane de caractres qui contient des guillemets simples.

CONCLUSION
Nous navons parcouru quune petite partie du modle dobjets
dAccess en nous focalisant sur lobjet Form. Nous vous conseillons de commencer par la programmation des formulaires
dans Access car cest dans ce domaine que vous constaterez le
meilleur retour sur investissement. En effet, une base de donnes
ne vaut que par la qualit des donnes qui y sont stockes. En
programmant des formulaires, vous pouvez crer des contrles de
saisie sophistiqus et amliorer grandement lergonomie de la
saisie en procurant des fonctionnalits que linterface utilisateur
dAccess ne sait pas grer en mode interactif.
Inspirez-vous des programmes de ce chapitre pour tenter den
crer dautres ; vous trouverez dans les fichiers qui accompagnent
ce livre dautres gestionnaires dvnements qui vous donneront
des ides et que vous pourrez imiter facilement.
Le prochain chapitre aborde une technologie qui permet de programmer le moteur de base de donnes dAccess.

Chap13.fm Page 257 Mercredi, 24. janvier 2007 6:17 18

13
ADO
Access possde deux autres modles dobjets : DAO et ADO. Ces
deux modles permettent de programmer le moteur de base de donnes. DAO, qui est lacronyme de Data Access Object (objet daccs
aux donnes), reprsente la structure de la base de donnes et les
donnes quelle contient.
Vous pouvez utiliser des objets DAO dans VBA pour crer ou
modifier des tables et des requtes. Cependant, DAO est en perte de
vitesse et vous avez tout intrt privilgier ltude dADO (ActiveX
Data Objects, objets de donnes ActiveX) qui est un modle de donnes plus rcent.
Le grand avantage dADO par rapport DAO est quil permet de
se connecter des bases de donnes autres que les fichiers de base de
donnes dAccess (.MDB), notamment des bases SQL Server.
Grce ADO et aux projets Access (fichiers .ADP), il est ainsi possible de dvelopper une application Access qui serve de frontal une
base de donnes SQL Server.
ADO ne se limite pas aux bases de donnes et peut galement
sattaquer dautres types de fichiers reprsentant des donnes structures (fichier texte ou fichier XML, par exemple).
Dans ce chapitre, nous allons tudier le modle dobjets dADO et
nous concentrer sur ses principaux objets.

Chap13.fm Page 258 Mercredi, 24. janvier 2007 6:17 18

258

Chapitre 13. ADO

INSTALLATION DADO
Pour bnficier dADO, il faut que cette technologie daccs aux donnes
soit installe sur votre ordinateur. ADO est install avec de nombreux
logiciels (Access, par exemple), mais il peut tre absent de votre machine.
Pour vrifier sa prsence, il suffit de regarder sil existe un dossier ADO
dans le chemin \Program Files\Fichiers communs\System\. Si ADO
nest pas prsent sur votre machine, il faut installer MDAC (Microsoft
Data Access Components). MDAC, comme son nom lindique, est une
suite de composants qui permettent laccs aux donnes. Tlchargeable
gratuitement sur le site Web de Microsoft (http://msdn.microsoft.com/
data/), MDAC contient entre autres ADO, ce qui signifie quen installant MDAC vous allez installer ADO sur votre ordinateur.
Afin de vous assurer quADO est bien prsent sur votre systme,
ouvrez lditeur Visual Basic (dans nimporte quelle application
dOffice) et excutez la commande OutilsRfrences.
Dans la liste des rfrences disponibles, vous devez voir la rfrence
la bibliothque dobjets Microsoft ActiveX Data Objects 2.X
Library (figure 13.1). X reprsente le numro de version de la bibliothque installe et il est parfaitement possible davoir plusieurs versions installes sur un mme ordinateur.

Figure 13.1 Rfrences la bibliothque dobjets ADO

Afin de pouvoir utiliser la technologie ADO, cochez, si cela nest


dj fait, une rfrence ADO. Si vous avez plusieurs versions dADO
sur votre machine, il est prfrable de slectionner la version qui a le
numro le plus lev car cest celle qui possde le plus de fonctionnalits et, en thorie, le moins de bugs

Chap13.fm Page 259 Mercredi, 24. janvier 2007 6:17 18

259

Objets dADO

SQL Server 2005 Express Edition


Vous ne disposez pas dAccess et vous voulez quand mme utiliser une
base de donnes : SQL Server 2005 Express Edition est fait pour vous !
Son anctre, le MSDE (Microsoft Database Engine, cest--dire Moteur
de base de donnes Microsoft) tait prcdemment livr avec certaines
versions dOffice ; SQL Server 2005 Express Edition, qui fait partie des
versions Express de Visual Studio, est accessible gratuitement en tlchargement sur le site de Microsoft ladresse suivante :
www.microsoft.com/france/msdn/vstudio/express/sql/default.mspx
SQL Server 2005 Express Edition fournit aux dveloppeurs un environnement de travail ct client entirement compatible avec SQL Server, ce qui facilite la migration des solutions vers SQL Server.
SQL Server 2005 Express Edition peut tre utilis avec des solutions
bureautiques de base de donnes partages construites aussi bien avec
Access, Excel, Word, Outlook ou PowerPoint. Cette base de donnes
est rigoureusement compatible avec SQL Server 2005. Utilis avec
Access, SQL Server 2005 Express Edition est une alternative attrayante
Jet qui est le moteur de base de donnes par dfaut dAccess. SQL
Server 2005 Express Edition autorise une dizaine daccs concurrents
la base de donnes dont la taille maximale est limite 4 Go.

OBJETS DADO
ADO se compose de neuf objets et de quatre collections. La
figure 13.2 illustre le diagramme de ce modle dobjets.

Figure 13.2 Modle dobjets ADO

Chap13.fm Page 260 Mercredi, 24. janvier 2007 6:17 18

260

Chapitre 13. ADO

Le tableau 13.1 donne une courte description de chacun des objets


dADO (les collections apparaissent en gris).
Tableau 13.1 Collections et objets dADO
Objet

Description

Connection

Reprsente une session unique avec une source de donnes. Dans


le cas dune base de donnes client/serveur, cela peut tre un
quivalent dune connexion rseau au serveur. La nature de la
source de donnes conditionne la disponibilit des collections, des
mthodes ou des proprits dun objet Connection.

Command

Utilis pour dfinir une commande spcifique, comme une requte


SQL, qui est excute sur la source de donnes.

Recordset

Reprsente lensemble des enregistrements dune table ou bien les


rsultats de lexcution dune requte SQL. Les objets Recordset se
composent denregistrements (lignes) et de champs (colonnes).

Record

Reprsente une ligne de donnes issue dun objet Recordset ou bien


dune source de donnes. Il peut sagir dun enregistrement dune
base de donnes ou bien dun autre type dobjet comme un fichier
ou un dossier, en fonction de la source de donnes.

Stream

Reprsente un flux (stream) de donnes binaires ou textuelles. Par


exemple, un document XML peut tre charg dans un flux pour servir
de fichier de commandes ; un document XML peut aussi tre retourn
par certaines sources de donnes en tant que rsultat dune requte. Un
objet Stream peut tre utilis pour manipuler des champs ou des
enregistrements qui contiennent des flux de donnes.

Parameter

Reprsente un paramtre ou un argument associ un objet Command


bas sur une requte paramtre ou une procdure stocke.

Field

Reprsente une colonne de donnes dun type de donnes courant.


Chaque objet Field correspond une colonne dun objet Recordset.

Property

Reprsente une caractristique dun objet ADO qui est dfini par la
source de donnes. Les objets ADO ont deux types de proprits :
les proprits intgres et les proprits dynamiques. Les proprits
intgres sont les proprits implmentes dans ADO et
immdiatement disponibles dans tout nouvel objet. Lobjet Property
est un conteneur pour les proprits dynamiques qui sont dfinies
par la source de donnes sous-jacente.

Error

Contient les dtails des erreurs daccs aux donnes qui dpendent
dune seule opration impliquant la source de donnes.

Chap13.fm Page 261 Mercredi, 24. janvier 2007 6:17 18

261

Objet Connection

Tableau 13.1 Collections et objets dADO


Objet

Description

Fields

Contient tous les objets Field dun objet Recordset ou Record.

Properties

Contient tous les objets Property dune instance spcifique dun objet.

Parameters

Contient tous les objets Parameter dun objet Command.

Errors

Contient tous les objets Error crs la suite dune erreur daccs
aux donnes.

OBJET CONNECTION
Lobjet Connection est le premier objet auquel on est confront quand
on travaille avec ADO car cest celui qui fait le trait dunion entre la
source de donnes et le programmeur. Afin de pouvoir manipuler des
donnes, vous devez dabord crer un objet Connection qui dfinit la
source des donnes que vous allez utiliser. Lemploi de cet objet peut se
rvler assez complexe si vous souhaitez vous connecter une source de
donnes un peu exotique, mais si vous voulez travailler avec une base
Access, la syntaxe est extrmement simple utiliser. En effet, la proprit CurrentProject.Connection dAccess permet dinitialiser directement et simplement un objet Connection ADO.
Pour initialiser un objet Connection sous Access, il suffit dutiliser
le code suivant :
Dim connex As ADODB.Connection
Set connex = CurrentProject.Connection

La premire ligne dclare une variable connex en tant quobjet


Connection du modle dobjets ADODB (cest le nom dADO quand
on veut initialiser un type de donnes ADO). Avec une autre source
de donnes, il faut dfinir une chane de connexion (ConnectionString) dont lutilisation peut se rvler relativement complexe. Pour
sen persuader, on peut visualiser la proprit ConnectionString dun
objet Connection Access laide de la commande suivante :
MsgBox connex.ConnectionString

Chap13.fm Page 262 Mercredi, 24. janvier 2007 6:17 18

262

Chapitre 13. ADO

Le rsultat est illustr la figure 13.3 et vous pouvez voir que les informations listes par la proprit ConnectionString sont nombreuses.

Figure 13.3 Affichage de la proprit ConnectionString dun fichier Access

Comme en tmoigne le code reproduit ci-dessous, pas moins de 17


paramtres sont passs cette proprit :
Provider=Microsoft.Jet.OLEDB.4.0;
User ID=Admin;
Data Source=C:\DVD.mdb;
Mode=Share Deny None;Extended Properties="";
Jet OLEDB:System database=C:\Documents and
Settings\Administrateur\Application
Data\Microsoft\Access\System.mdw;
Jet OLEDB:Registry
Path=Software\Microsoft\Office\11.0\Access\Jet\4.0;
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=5;
Jet OLEDB:Database Locking Mode=1;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False

Si vous voulez rcuprer le texte dune proprit ConnectionString pour le rutiliser dans un programme, saisissez dans la
fentre Excution la commande Debug.Print CurrentProject.Connection.ConnectionString. Cela aura pour effet
dcrire dans la fentre dExcution le texte de la proprit que
vous pourrez alors copier puis coller dans un programme.

Chap13.fm Page 263 Mercredi, 24. janvier 2007 6:17 18

Objet Recordset

263

Heureusement, quand vous programmerez en ADO, vous vous rendrez vite compte que de nombreux paramtres sont facultatifs. Dans la
chane ConnectionString, il y a dabord le nom du paramtre suivi
dun signe gal puis la valeur assigne au paramtre. Un point-virgule
spare chaque paramtre. Le paramtre le plus important est Provider
(fournisseur) : il dtermine le type de donnes auquel on souhaite se
connecter. De plus, ce paramtre dtermine galement le nombre et
la nature des autres paramtres de la proprit ConnectionString.
Comme Provider, on peut dfinir une base de donnes ODBC, une
base de donnes SQL Server, une base de donnes Oracle ou bien
encore un fichier squentiel index, une feuille de calcul, un fichier
de courrier lectronique, etc.
Le deuxime paramtre le plus important est Data Source (source
des donnes). Bien videmment, ce paramtre dsigne lemplacement
physique du fichier avec lequel vous souhaitez travailler. Si vous voulez travailler avec une base de donnes Access partir dune application Office comme Word, Excel ou Outlook, les paramtres Provider
et Data Source sont les seuls arguments obligatoires.

OBJET RECORDSET
Une fois que lon a tabli la connexion avec une source de donnes,
il faut dfinir un objet Recordset qui reprsente les enregistrements
avec lesquels on souhaite travailler. Dans le cas dune base de donnes Access, le Recordset permet de prciser la table que lon va
manipuler. Il est galement possible de dfinir le jeu denregistrements laide dune requte crite en langage SQL, ce qui permet de
restreindre le nombre denregistrements.
Si vous utilisez une base de donnes Access, vous ntes pas oblig
de dfinir un objet Connection et vous pouvez vous contenter de
dclarer un objet Recordset. Il faudra cependant prciser la proprit
ActiveConnection de lobjet Recordset afin de pouvoir utiliser cet
objet dans un programme. Lextrait de code suivant dfinit un objet
Recordset qui utilise la table Disques :
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

Chap13.fm Page 264 Mercredi, 24. janvier 2007 6:17 18

264

Chapitre 13. ADO

Set rst.ActiveConnection = CurrentProject.Connection


rst.CursorType = adOpenStatic
rst.Open ("Disques")

Arrtons-nous un moment sur la proprit CursorType de lobjet


Recordset. Comme son nom lindique, cette proprit dfinit le type
de curseur dun Recorset. Microsoft dfinit un curseur comme un lment de base de donnes qui contrle la navigation entre les enregistrements, la possibilit de mettre jour les donnes et la visibilit des
modifications apportes la base de donnes par dautres utilisateurs.
La proprit CursorType peut prendre les valeurs suivantes :

adOpenForwardOnly (valeur par dfaut)


adOpenKeyset
adOpenDynamic
adOpenStatic

Cette proprit permet de spcifier le type de curseur qui doit tre utilis louverture de lobjet Recordset. Il est impratif de dfinir cette proprit avant louverture dune table et cest pour cette raison que la
proprit se place avant la mthode Open qui dsigne la table ouvrir.
La valeur par dfaut (adOpenForwardOnly) du type de curseur permet juste de parcourir la table dans un seul sens (en avant, cest--dire
du premier jusquau dernier enregistrement). Un curseur statique permet de parcourir une table dans les deux sens. Les curseurs Keyset et
dynamique sont identiques un curseur statique, mais ils permettent
de visualiser les modifications faites par les autres utilisateurs, ce qui
nest pas le cas des deux premiers types de curseurs.
Une fois que lobjet Recordset a t dfini, il est ensuite facile dutiliser
des mthodes et des proprits pour manipuler des enregistrements. Par
exemple, la proprit AddNew permet lajout dun nouvel enregistrement. Les proprits MoveFirst, MoveLast, MoveNext et MovePrevious
permettent de dplacer le pointeur denregistrement et par consquent de
passer dun enregistrement lautre. Avec une boucle et la mthode
MoveNext, vous pouvez ainsi facilement parcourir une table.
La proprit Fields dun Recordset permet daccder en lecture ou
en criture au contenu dun champ. Par exemple, le code suivant permet dajouter un nouvel enregistrement et de saisir le contenu de
deux champs :

Chap13.fm Page 265 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

265

Dim rst As ADODB.Recordset


Set rst = New ADODB.Recordset
Set rst.ActiveConnection = CurrentProject.Connection
rst.CursorType = adOpenDynamic
rst.LockType = adLockOptimistic
rst.Open ("Disques")
rst.AddNew
rst.Fields("titre") = "Duck soup"
rst.Fields("date_saisie") = Now()
rst.Update

Vous noterez lutilisation de la proprit LockType qui dfinit le


type de verrouillage des enregistrements lors des modifications. La
mthode Update enregistre les modifications effectues dans la ligne
en cours dun objet Recordset.
Il nous est impossible de couvrir lensemble des proprits et
des mthodes des objets du modle dobjets ADO ; si vous souhaitez approfondir ltude dADO, il vous faudra donc vous
plonger dans laide en ligne qui est livre avec le MDAC ou
bien avec les logiciels qui prennent en charge ADO (par
exemple Access). Si vous narrivez pas localiser laide en
ligne dADO, cherchez sur votre disque dur les fichiers correspondant au filtre ADO2*.CHM.

MISE EN PRATIQUE
Afin dillustrer notre propos, nous allons vous prsenter plusieurs
macros qui illustrent la programmation ADO, tout dabord avec
Access, puis avec Word et Excel.

Exemples Access
Les programmes Access suivants utilisent une base de donnes intitule DVD.MDB qui comporte une table Disques qui contient des
DVD. La macro liste ci-dessous compte le nombre denregistrement qui rpondent un critre :

Chap13.fm Page 266 Mercredi, 24. janvier 2007 6:17 18

266

Chapitre 13. ADO

Sub compte_enreg()
Dim rst As ADODB.Recordset ' le recordset contenant la table des
disques
Set rst = New ADODB.Recordset
Set rst.ActiveConnection = CurrentProject.Connection
rst.CursorType = adOpenStatic
rst.Open "SELECT titre, genre FROM Disques WHERE genre =
'comdie'"
MsgBox rst.RecordCount ' affiche le nombre d'enregistrement du
recordset
End Sub

Dans la mesure o Access et ADO sont troitement lis, il ny a nul


besoin de dfinir un objet Connection. Il suffit de dfinir un objet
Recordset et de lui assigner la proprit CurrentProjetConnection.
Au lieu dutiliser un nom de table, la mthode Open a pour paramtre une requte crite en langage SQL. Le Recordset est donc peupl avec tous les enregistrements qui remplissent le critre nonc
dans la requte. Vous noterez lutilisation des guillemets simples dans
le code SQL pour dlimiter une chane de caractres dans la mesure
o la totalit du code SQL de la requte doit tre encadre par des
guillemets doubles.
Enfin, la proprit RecordCount de lobjet Recordset permet de
connatre le nombre denregistrements du Recordset. Il est ainsi facile
de rcuprer le rsultat de requtes si lon souhaite faire des statistiques sur les enregistrements dune table.
Le programme suivant ralise la mme tche tout en employant
une autre technique :
Sub requete()
Dim cmd As ADODB.Command
Dim test As Variant ' variable contenant le rsultat de la commande
Set cmd = New ADODB.Command
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT Count(Genre) FROM Disques WHERE Genre
='Policier'"
Set test = cmd.Execute
MsgBox (test(0).Value)
End Sub

Chap13.fm Page 267 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

267

Cette fois-ci, on utilise un objet Command qui permet de dfinir


une commande pouvant tre excute sur une table. On stocke le
texte de la commande dans la proprit CommandText de lobjet
Command puis la commande est excute grce la mthode Execute. Dans notre exemple, la requte SQL effectue une totalisation du
nombre denregistrements de la table Disques rpondant au critre
Genre = policier. Le rsultat de la requte est envoy dans la variable
test qui est un tableau. Le premier lment de ce tableau contient le
nombre denregistrements satisfaisant le critre.
Il faut noter que lon peut passer nimporte quelle commande SQL
lobjet Command, y compris des requtes qui modifient une table ou un jeu
denregistrements (suppression, ajout ou modification denregistrements).
Le programme suivant modifie en srie un champ dune table ; il
adopte une technique de parcours dune table que lon rencontre trs
souvent en programmation Access :
Sub modifie_serie()
Dim rst As ADODB.Recordset ' le recordset contenant la table des
disques
Set rst = New ADODB.Recordset
Set rst.ActiveConnection = CurrentProject.Connection
rst.CursorType = adOpenStatic
rst.LockType = adLockOptimistic
rst.Open ("Disques")
rst.MoveFirst
While Not rst.EOF
rst.Fields("prix_francs") = rst.Fields("prix") * 6.55957
rst.MoveNext
Wend
End Sub

Aprs avoir dfini un Recordset sur la table Disques, le pointeur


denregistrement est plac au tout dbut de la table grce la mthode
MoveFirst. Ensuite, grce une boucle While Wend, on parcourt la
table en se dplaant denregistrement en enregistrement laide de la
mthode MoveNext. La condition darrt est la proprit EOF de
lobjet Recordset. EOF signifie End Of File, ce qui se traduit par Fin de
fichier. La condition signifie donc que tant que lon na pas atteint la
fin du fichier on continue dplacer le pointeur denregistrement.
lintrieur de la boucle, le champ prix_franc est mis jour avec la
valeur du champ prix multipli par la valeur de leuro.

Chap13.fm Page 268 Mercredi, 24. janvier 2007 6:17 18

268

Chapitre 13. ADO

Grce cette technique de boucle, vous pouvez facilement effectuer


des modifications en srie ou bien exporter les donnes dune table
Access dans un autre logiciel, comme nous allons le voir dans la section
suivante.
Il est galement possible de dfinir plusieurs objets Recordset afin,
par exemple, de comparer une table une autre. Le programme suivant cherche savoir si tous les enregistrements de la table Premier
sont dans la table Second :
Sub compare()
Dim rst1 As ADODB.Recordset
Set rst1 = New ADODB.Recordset
Set rst1.ActiveConnection = CurrentProject.Connection
rst1.CursorType = adOpenStatic
rst1.LockType = adLockOptimistic
rst1.Open ("Premier") ' la premire table
Dim rst2 As ADODB.Recordset '
Set rst2 = New ADODB.Recordset
Set rst2.ActiveConnection = CurrentProject.Connection
rst2.CursorType = adOpenStatic
rst2.LockType = adLockOptimistic
rst2.Open ("Second") ' la deuxime table
rst1.MoveFirst
rst2.MoveFirst
' On parcourt la premire table
While Not rst1.EOF
Var_nom = rst1.Fields("Nom")
rst2.Find "Nom = " & Var_nom
If rst2.EOF Then
Debug.Print Var_nom
rst2.MoveFirst
End If
rst1.MoveNext
Wend
End Sub

Ce programme cre deux objets Recordset (rst1 et rst2) qui


ouvrent respectivement les tables Premier et Second. On imagine que
ces deux tables ont la mme structure et comportent un champ intitul Nom. Lalgorithme de comparaison est extrmement simple :
On parcourt tous les enregistrements de la table Premier lintrieur dune boucle While Wend.

Chap13.fm Page 269 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

269

On stocke dans la variable Var_nom le contenu du champ Nom


de la table Premier.
Grce la mthode Find, on effectue dans le deuxime Recordset
une recherche pour comparer les champs Nom des deux tables.
Si la fin du deuxime Recordset a t atteinte (EOF), alors cela
signifie que lenregistrement de la table Premier ne se trouve pas
dans la table Second.
Dans ces conditions, on inscrit le contenu du champ Nom dans la
fentre Excution (on pourrait tout aussi bien lafficher lcran,
dans une autre table ou bien encore dans un fichier texte).
On passe ensuite lenregistrement suivant (rst1.MoveNext) du
premier Recordset et on retourne au sommet de la boucle.
Voici un algorithme trs simple de comparaison de deux listes qui vous
rendra de grands services quand vous avez tablir la diffrence entre
deux ensembles de donnes. Sil y a normment de donnes, le programme peut mettre un peu de temps sexcuter, mais cela sera toujours
infiniment plus rapide que si vous deviez faire la comparaison la main.

Exemple Word
Dans la mesure o Access et ADO sont troitement lis, la rfrence ADO est dj prsente dans Access ; cela nest pas forcment le cas dans Word ou dans Excel, ce qui signifie que la premire
des choses que vous devez faire pour programmer en ADO est de
dfinir une rfrence vers la bibliothque dobjets (figure 13.4).

Figure 13.4 Dfinition dune rfrence vers la bibliothque ADO

Chap13.fm Page 270 Mercredi, 24. janvier 2007 6:17 18

270

Chapitre 13. ADO

Si vous omettez dtablir la rfrence, vous obtiendrez une erreur


dans lditeur de programmes qui affichera le message Erreur de
compilation : Type dfini par lutilisateur non dfini .
Le programme Word suivant cre un tableau partir des donnes
dune table Access :
Sub remplir_tableau()
Dim conn As ADODB.Connection ' la connexion la base de donnes
Dim rst As ADODB.Recordset ' le recordset contenant la table des
disques
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\DVD.MDB;"
rst.ActiveConnection = conn
rst.Source = "Disques" ' la table que l'on va lire
' Dfinition du type de curseur
rst.CursorType = adOpenStatic
rst.Open 'on ouvre la table
' insertion d'un tableau Word
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=2, NumColumns:=3, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed
' Remplissage des en-ttes de colonne
Selection.TypeText Text:="Titre"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Ralisateur"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Genre"
Selection.MoveRight Unit:=wdCell
' Grce une boucle, on parcourt toute la table
rst.MoveFirst ' on se place sur le premier enregistrement
For i = 1 To rst.RecordCount ' le nombre d'enregistrement de la
table
Selection.TypeText Text:=rst.Fields("titre")
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rst.Fields("ralisateur")
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=rst.Fields("genre")
Selection.MoveRight Unit:=wdCell
rst.MoveNext ' on passe l'enregistrement suivant
Next i

Chap13.fm Page 271 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

271

rst.Close
conn.Close ' on ferme la connexion
End Sub

Le programme commence dj par dfinir un objet Connection et


un objet Recordset qui pointe sur la table Disques de notre base de
donnes DVD. Comme on nest plus dans Access, il nexiste plus de
proprit CurrentProjetConnection si bien quil est ncessaire de
dfinir prcisment la source de donnes (le Provider). Pour ce faire,
on dfinit la mthode Open de lobjet Connection avec la valeur suivante :
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DVD.MDB;"

Le premier paramtre indique le type de source de donnes ; ici, il


sagit de Jet, cest--dire le moteur de base de donnes dAccess.
Une seule erreur dans lorthographe du nom du fournisseur de
donnes empchera votre programme de fonctionner. Si vous
voulez utiliser une table Access dans un programme Word ou
Excel, respectez scrupuleusement lorthographe du nom du
provider tel quil est dsign ci-dessus.
Ensuite, la macro insre un tableau Word. Vous remarquerez quil
est inutile de connatre le nombre exact denregistrements dans la
table pour dfinir le nombre exact de lignes du tableau Word. En effet,
le fait dinsrer des donnes dans le tableau augmente automatiquement le nombre de lignes. On rcupre cependant le nombre denregistrements de la table car au lieu dutiliser une boucle While Wend pour
parcourir la table, on emploie une boucle For Next. lintrieur de la
boucle, la proprit Fields nous sert rcuprer les valeurs des champs
que nous voulons insrer dans le tableau (titre, ralisateur et genre).
Vous noterez qu la fin de la macro les deux objets Recorset et Connection sont ferms (mthode Close) ; cest une trs bonne habitude
en programmation de fermer ce que lon a ouvert.
La figure 13.5 illustre le rsultat du programme prcdent.

Chap13.fm Page 272 Mercredi, 24. janvier 2007 6:17 18

272

Chapitre 13. ADO

Figure 13.5 Insertion de donnes Access dans un tableau Word

Exemple Excel
Le programme Excel est identique au programme Word prcdent
sauf quil importe dautres champs dans une feuille Excel et emploie
une autre technique pour remplir les cellules :
Sub remplir_tableau()
Dim conn As ADODB.Connection ' la connexion la base de donnes
Dim rst As ADODB.Recordset ' le recordset contenant la table des
disques
Dim ligne As Integer
Dim col As Integer
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\DVD.MDB;"
rst.ActiveConnection = conn
rst.Source = "Disques" ' la table que l'on va lire
' Dfinition du type de curseur
rst.CursorType = adOpenStatic
rst.Open 'on ouvre la table
' on dtermine l'adresse de la cellule active
ligne = ActiveCell.Row
col = ActiveCell.Column
' Remplissage des en-ttes de colonne
ActiveSheet.Cells(ligne, col).Value = "Titre"
ActiveSheet.Cells(ligne, col + 1).Value = "Prix"
' Grce une boucle, on parcourt toute la table
rst.MoveFirst ' on se place sur le premier enregistrement
For i = 1 To rst.RecordCount ' le nombre d'enregistrement de la
table

Chap13.fm Page 273 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

273

ActiveSheet.Cells(ligne + i, col).Value =
rst.Fields("titre")
ActiveSheet.Cells(ligne + i, col + 1).Value =
rst.Fields("prix")
rst.MoveNext ' on passe l'enregistrement suivant
Next i
rst.Close
conn.Close ' on ferme la connexion
End Sub

Aprs avoir cr un objet Connection et un objet Recordset, on


dsigne la table Disques comme source des donnes du Recordset.
Grce aux proprits Row et Column, on connat le numro de ligne
et le numro de colonne de la cellule active. Les donnes seront donc
insres partir de la position du pointeur de cellule, ce qui rend la
macro plus souple quun fonctionnement avec des adresses absolues.
Aprs avoir inscrit le titre des colonnes (Titre et Prix), une boucle For
Next insre les valeurs des champs dans les bonnes cellules. La proprit
Cells dActiveSheet permet de dfinir simplement ladressage des cellules
en fournissant les coordonnes ligne et colonne. En prenant comme valeur
de dpart ladresse de la cellule active et en ajoutant lindice qui sert de
compteur une boucle For Next, on place ensuite les valeurs importes de
la table Access dans les bonnes cellules. Cest la proprit Value de lobjet
Range qui permet dinsrer une valeur dans une cellule. Excel reconnat
parfaitement les types de donnes Access et le titre dun DVD est bien considr comme du texte et son prix comme un nombre.
La figure 13.6 illustre le rsultat du programme prcdent.

Figure 13.6 Insertion de donnes Access dans une feuille Excel

Chap13.fm Page 274 Mercredi, 24. janvier 2007 6:17 18

274

Chapitre 13. ADO

Exemples dutilisation dun fichier MDB sans Access


Comme nous lavons dj soulign, ADO permet dattaquer une
base de donnes Access (fichier MDB) sans pour autant disposer
dAccess. En effet, certaines versions dOffice sont livres sans
Access et il peut donc se rvler trs intressant de manipuler un
fichier MDB, mme si lon ne possde pas ce logiciel. Les exemples
que nous allons vous montrer peuvent donc sexcuter indiffremment partir de Word, dExcel, de PowerPoint, dOutlook, de
FrontPage, cest--dire partir de toute application qui prend en
charge VBA.
Interrogation dune base de donnes
Dans les exemples pour Access, le premier programme illustrait la
manire de passer une requte une table dun fichier Access. Ce
type de programme est intressant, mais il manque cruellement
dinteractivit. Pour lamliorer sensiblement, il faudrait pouvoir
poser une question lutilisateur qui pourrait ainsi saisir le genre de
film dont il souhaite comptabiliser le nombre denregistrements.
Grce la fonction InputBox, ce genre de script est facile programmer comme le montre lexemple suivant :
Sub interro_BD()
genre = InputBox("Saisissez un genre de film")
Dim connex ' la connexion la base de donnes
Set connex = CreateObject("ADODB.Connection")
connex.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\DVD.MDB;"
Dim rst ' l'objet RecordSet
Set rst = CreateObject("ADODB.Recordset")
Set rst.ActiveConnection = connex
rst.CursorType = 3 ' adOpenStatic
rst.Open "SELECT titre FROM Disques WHERE genre ='" & genre &
"'"
' affiche le nombre d'enregistrement du recordset
MsgBox rst.RecordCount & " films trouvs"
rst.Close
connex.Close
End Sub

Chap13.fm Page 275 Mercredi, 24. janvier 2007 6:17 18

275

Mise en pratique

Figure 13.7 Interrogation dune base


de donnes en mode interactif

Vous noterez bien dans la construction de la requte SQL lutilisation des guillemets simples et des guillemets doubles. Comme le genre
doit tre encadr par des guillemets simples dans le code SQL, la premire chane de caractres (qui est dlimite par des guillemets doubles) doit se terminer par un guillemet simple. On ajoute ensuite le
contenu de la variable qui est la valeur de retour de la fonction InputBox et on termine enfin la chane par ladjonction dun guillemet simple (qui est encadr par des guillemets doubles).
Si la requte renvoie un faible nombre denregistrements, vous pouvez
mme trs simplement afficher les informations filtres dans une bote de
message. Le script suivant qui reprend le programme prcdent affiche la
liste des films dont le genre a t saisi comme condition :
Sub interro_BD2()
genre = InputBox("Saisissez un genre de film")
Dim connex ' la connexion la base de donnes
Set connex = CreateObject("ADODB.Connection")
connex.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\DVD.MDB;"
Dim rst ' l'objet RecordSet
Set rst = CreateObject("ADODB.Recordset")
Set rst.ActiveConnection = connex
rst.CursorType = 3 ' adOpenStatic
rst.Open "SELECT titre FROM Disques WHERE genre ='" & genre & "'"
' affiche le nombre d'enregistrement du recordset
info = rst.RecordCount & " films trouvs" + vbCr
While Not rst.EOF
info = info + rst.Fields("titre") + vbCr
rst.movenext
Wend
rst.Close
connex.Close
MsgBox info, , "Catgorie de films = " & genre
End Sub

Chap13.fm Page 276 Mercredi, 24. janvier 2007 6:17 18

276

Chapitre 13. ADO

Figure 13.8 Affichage du rsultat


de la requte dans une bote de message

Le principe de ce genre de programme est extrmement simple et


peut vous rendre de grands services. Outre le fait que vous pouvez
interroger de manire interactive un fichier de base de donnes
Access sans disposer de ce logiciel, vous gagnez galement du temps
dans la mise en uvre de la requte car lexcution dune simple
macro sera toujours plus rapide que le lancement dAccess suivi de
lexcution dune requte dans Access.
Programmation dun jeu
Accordons-nous une petite rcration et tentons de programmer un
jeu qui utilise une base de donnes. Il sagit dun jeu de lettres que
nous avons baptis Mastermot en hommage au clbre jeu Mastermind. Au Mastermind, il faut trouver une combinaison de pions de
couleur en faisant des dductions ; le Mastermot est quivalent au
Mastermind, sauf quil ne faut pas dcouvrir une combinaison de
couleurs, mais un mot. Voici la description du jeu tel que nous le
souhaitons, ce texte constituant le cahier des charges de notre application :
Lordinateur choisit un mot de x lettres (x tant un nombre variant
de 5 10) dans une table qui compte plusieurs milliers de mots. Le
joueur saisit un mot et lordinateur lui dit le nombre de lettres bien
places et le nombre de lettres mal places. Par dduction, le joueur
doit arriver trouver le mot slectionn par lordinateur en affinant
chaque tour sa proposition. Le nombre de tentatives du joueur nest

Chap13.fm Page 277 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

277

pas illimit. Si le joueur na pas trouv la rponse correcte au bout du


nombre dessais dtermin au dpart, la solution est affiche. Lhistorique des tentatives du joueur est affich, de manire ce que le joueur
puisse faire ses dductions sans avoir utiliser un papier et un crayon.
Pour notre rservoir de mots, nous utilisons un fichier Access intitul Mastermot.MDB. Cette base de donnes Access contient 6 tables
nommes :

lettres5
lettres6
lettres7
lettres8
lettres9
lettres10

Comme vous laurez devin, la table lettres5 contient des mots de 5


lettres, la table lettres6 des mots de 6 lettres, et ainsi de suite. On
pourra ainsi faire varier le niveau de jeu en choisissant un mot dans
une table ou une autre, la difficult augmentant avec la longueur des
mots. La structure de chaque table est identique et ne comporte quun
seul champ baptis terme.
Avant de passer au codage de notre programme, il est prfrable
dexpliciter lalgorithme de la solution envisage. Rappelons quun
algorithme est lensemble des rgles opratoires qui permettent
deffectuer un traitement de donnes ; ainsi, lalgorithme dcrit formellement toutes les tapes dun programme. Dans cette phase-l,
vous allez dcrire prcisment les rgles de calcul de votre logiciel.
Plus les procds seront minutieusement dcrits, plus le codage informatique de la solution sera facile. Pour dcrire les algorithmes, nous
allons employer ce que nous appelons un pseudo-code, cest--dire un
langage intermdiaire entre le langage naturel et le langage de programmation. Voici donc le pseudo-code de notre programme de jeu :
Ouvrir le fichier de base de donnes.
Choisir un nombre alatoire.
Extraire alatoirement un enregistrement de la base de donnes
qui constituera le mot rechercher.
Afficher une bote de message qui contient la rgle du jeu.
Tant que le nombre de tentatives du joueur nest pas dpass.

Chap13.fm Page 278 Mercredi, 24. janvier 2007 6:17 18

278

Chapitre 13. ADO

Demander au joueur de saisir un mot de x lettres.


Si le mot ne fait pas x caractres, demandez au joueur de recommencer la saisie.
Si la saisie du joueur est gale au mot recherch.
Afficher un message de flicitations et de fin du jeu.
Sortir de la boucle.
Sinon, analyser la rponse et afficher le nombre de lettres mal
places et le nombre de lettres bien places.
Fin de la boucle tant que.
Une fois lalgorithme du jeu termin, vous pouvez passer la phase
de codage. Le jeu se compose dune procdure Sub et dune fonction
qui sert analyser la rponse de lutilisateur. Le code source de ce programme tant comment, vous ne devriez pas avoir de difficult le
comprendre.
Le programme commence par dfinir deux constantes qui reprsentent le nombre de tentatives auquel le joueur a droit ainsi que la longueur du mot trouver. Il est ainsi trs facile de modifier ces
paramtres si lon veut changer les rgles du jeu. Vous pourriez galement envisager lutilisation de la fonction InputBox en dbut de jeu
afin de demander lutilisateur de choisir la valeur de ces deux paramtres.
Sub mastermot()
Const max_coups = 10 ' le nombre d'essais du joueur
Const longueur_mot = 7 ' la longueur du mot trouver
Dim connex ' la connexion la base de donnes
Set connex = CreateObject("ADODB.Connection")
connex.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\MASTERMOT.MDB;"
Dim rst ' l'objet RecordSet
Set rst = CreateObject("ADODB.Recordset")
Set rst.ActiveConnection = connex
rst.CursorType = adOpenStatic
nomtable = "lettres" + LTrim(Str(longueur_mot))
rst.Open (nomtable)
Dim max_mots As Integer ' le nombre de mots dans la table
max_mots = rst.RecordCount
rst.MoveFirst
Dim mot ' le mot secret retrouver
Dim coup ' le numro de la tentative du joueur
Dim histo ' l'historique des tentatives
Dim essai ' la saisie du joueur

Chap13.fm Page 279 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

279

Dim vainqueur ' drapeau pour savoir si le joueur a gagn


' Initialise le gnrateur de nombres alatoires
Randomize
' x est le n de l'enregistrement sur lequel on se positionne
x = Int(max_mots * Rnd)
rst.Move x
mot = rst.Fields("terme")
' Affichage de la rgle du jeu
MsgBox "Vous devez trouver un nom de " & longueur_mot & "
lettres." + vbCr & _
"Proposez un nom au singulier de " & longueur_mot & " lettres "
& _
"et l'ordinateur vous dira :" + vbCr & _
"- le nombre de lettres bien places (BP)" + vbCr & _
"- le nombre de lettres mal places (MP)" + vbCr & _
"Vous avez droit " & max_coups & " tentatives pour trouver le
mot secret !" _
, , "Jeu de Mastermot"
coup = 1
histo = ""
Do
Do While Len(essai) <> longueur_mot
essai = InputBox("Saisissez un nom au singulier de " &
longueur_mot & " lettres en minuscules" _
+ vbCr & histo, _
"Essai n " & coup)
' Analyse de la rponse
' on supprime les espaces ventuellement saisis
essai = Trim(essai)
' on teste si le mot a la bonne longueur
If Len(essai) <> longueur_mot Then
MsgBox essai & " n'est pas un nom de " & longueur_mot & "
caractres" _
, vbExclamation + vbOKOnly, "Erreur de saisie !!!"
Else
Exit Do
End If
Loop
' si le mot a t trouv
If essai = mot Then
MsgBox "Bravo ! Vous avez gagn en " & coup & " coups." _
+ vbCr + "Le mot trouver tait bien : " & mot _
+ vbCr + histo, , "Fin de la partie"
vainqueur = True
Exit Do ' on sort de la boucle principale
Else ' analyse de la rponse
' on utilise une fonction pour une plus grande lisibilit

Chap13.fm Page 280 Mercredi, 24. janvier 2007 6:17 18

280

Chapitre 13. ADO

histo = histo + essai + " : " + analyse(essai, mot,


longueur_mot) + vbCr
End If
coup = coup + 1
essai = ""
Loop Until coup = max_coups + 1
If Not vainqueur Then
MsgBox "Vous n'avez pas trouv le mot secret !" + vbCr & _
"La solution tait : " & mot _
+ vbCr + histo, , "Fin de la partie !"
End If
End Sub

Figure 13.9 Affichage de la rgle du jeu

Function analyse(chaine, motif, longueur)


' cette fonction analyse une chane de caractres
' par rapport un motif (le mot deviner)
' elle renvoie le nombre de lettres bien places
' et le nombre de lettres mal places
' calcul du nombre de lettres bien places
bp = 0 'compteur du nombre de lettres bien places
chainemp = "" ' chaine de la saisie du joueur
motifmp = "" ' chaine du mot deviner
For i = 1 To longueur
If Mid(chaine, i, 1) = Mid(motif, i, 1) Then
bp = bp + 1
Else
' les caractres bien placs sont supprims des chanes
chainemp = chainemp + Mid(chaine, i, 1)
motifmp = motifmp + Mid(motif, i, 1)
End If
Next
' calcul du nombre de lettres mal places
mp = 0 ' compteur du nombre de lettres mal places
' on analyse la chane des caractres mal placs
For j = 1 To Len(chainemp)
' on teste la prsence de chaque caractre
' de chainemp dans motifmp

Chap13.fm Page 281 Mercredi, 24. janvier 2007 6:17 18

281

Mise en pratique

' si un caractre de chainemp est trouv dans motifmp


' on le retire de motifmp
If InStr(1, chainemp, Mid(motifmp, j, 1)) > 0 Then
mp = mp + 1
' on supprime ce caractre de motifmp
' en le remplaant par le caractre dollar
motifmp = Left(motifmp, j - 1) + "$" + Mid(motifmp, j + 1)
End If
Next
' la fonction renvoie le rsultat de l'analyse
analyse = "BP : " & bp & " ; " & "MP : " & mp
End Function

Figure 13.10 Droulement


dune partie de MasterMot

Vous pouvez, grce ce programme, constater que la programmation dun jeu de lettres nest pas si complexe que cela. Un des aspects
essentiels de ce logiciel est quil utilise une base de donnes Access par
le biais dADO sans que la prsence dAccess soit ncessaire. Bien videmment, ce programme, mme sil fonctionne trs bien, est minimaliste dessein afin de diminuer la taille de son code. De nombreuses
amliorations sont envisageables et nous vous encourageons vous
retrousser les manches.
Une amlioration intressante, par exemple, consisterait tester si
la saisie du joueur est un mot valide. Dans la mesure o notre base de
donnes est assez complte, le joueur serait oblig de faire des propositions qui seraient des mots vritables et qui figureraient dans la base
de donnes des mots. Il ne pourrait pas ainsi proposer des solutions du
genre elinsur pour tester la prsence dune lettre. On pourrait aussi
proposer une aide qui consisterait indiquer les lettres qui sont bien
places, plutt que de se contenter de leur nombre. Ces quelques propositions ne sont pas exhaustives et nont pour but que de vous don-

Chap13.fm Page 282 Mercredi, 24. janvier 2007 6:17 18

282

Chapitre 13. ADO

ner quelques pistes. Il peut tre trs formateur pour vous de reprendre
le programme que nous avons crit et de tenter dimplmenter les
amliorations que nous venons de suggrer.
La plus grosse amlioration concernerait linterface utilisateur qui,
nous le reconnaissons bien volontiers, est assez pauvre. Vous verrez
dans la dernire partie de cet ouvrage que lutilisation de formulaires
pourrait grandement amliorer les choses et notamment apporter un
peu de couleur lensemble. Il est vident que lutilisation exclusive
des fonctions InputBox et MsgBox appauvrit linterface utilisateur,
mais il faut bien reconnatre dun autre ct que ce nest dj pas si
mal darriver programmer un jeu avec ces deux fonctions. Cela
prouve, sil en tait besoin, quen tirant le maximum doutils simples
on peut dj raliser de grandes choses.

CONCLUSION
Nous navons parcouru quune petite partie du modle dobjets
ADO en nous concentrant sur les objets Connection et Recordset. ADO est un modle dobjets extrmement riche qui mriterait un livre lui tout seul. Les exemples qui illustrent ce
chapitre vous permettent nanmoins daccomplir simplement
des tches courantes qui se rvlent lusage extrmement pratiques. Ne perdez cependant pas de vue quADO reprsente une
mthode universelle daccs aux donnes qui nest pas rserve
aux tables Access. Toutes sortes dautres types de donnes peuvent tre gres avec ADO. Cette universalit mrite quon
sintresse ADO et quon laisse tomber lautre technologie
daccs aux donnes Access quest DAO.
Pour ceux qui ont dj une bonne connaissance des bases de donnes,
nous vous conseillons de prendre le temps dtudier le couple SQL
Server 2005 Express Edition et ADO. laide de ces deux technologies qui sont disponibles gratuitement, il est possible de produire des
applications de bases de donnes sophistiques et robustes.
Enfin, ceux qui ne possdent pas Access peuvent nanmoins
manipuler des bases de donnes Access (fichier .MDB) laide
dADO partir de Word, dExcel, dOutlook ou de PowerPoint.

Chap14.fm Page 283 Mercredi, 24. janvier 2007 6:17 18

14
Programmer Outlook
la diffrence de Word et Excel qui sont des applications orientes
document, Outlook regroupe toutes les informations quil gre dans
un environnement unique. Outlook, qui appartient la catgorie
des programmes de gestion dinformations personnelles, permet
dorganiser de nombreux objets : vnements du calendrier, tches,
contacts et notes. De plus, Outlook fait office de logiciel de messagerie. Nous nous concentrerons, dans le cadre de cet ouvrage, sur
ltude de la programmation de la fonctionnalit de courrier lectronique dOutlook.

MODLE DOBJETS
Bien quil comporte relativement peu dobjets, le modle dobjets
dOutlook (figure 14.1) est assez droutant. Il y a principalement
deux raisons cela : lutilisation du terme Item et lemploi du concept de namespace. Si vous avez bien suivi jusque-l, vous savez
quitem dsigne en anglais un lment dun tableau (array) ou bien
un objet au sein dune collection, ce qui est un peu la mme chose
dans la mesure o les collections sont considres comme des
tableaux. Malheureusement, dans Outlook, les items sont les diffrents objets que gre Outlook, savoir un courrier lectronique,
une tche, un vnement, un contact, etc. Outlook comporte
donc une collection Items qui renferme des lments Outlook baptiss MailItem, TaskItem, MeetingItem, ContactItem, etc.

Chap14.fm Page 284 Mercredi, 24. janvier 2007 6:17 18

284

Chapitre 14. Programmer Outlook

Figure 14.1 Modle dobjets dOutlook

Le modle dobjets dOutlook introduit le concept de namespace


(espace de noms ou espace de nommage) que la documentation de
Microsoft dfinit comme un objet racine abstrait pour un type de
source de donnes quelconque . Un namespace sert donc despace de
stockage pour des donnes dun type particulier ; on peut assimiler un
namespace un type de donnes. Si lon prend la peine de regarder le
modle dobjets dOutlook, on saperoit quil existe un objet NameSpace juste en dessous de lobjet Application. Cet objet est donc un
passage oblig pour accder la collection Items qui renferme tous les
objets grs par Outlook. Le concept de namespace implique en gnral que lon puisse choisir de travailler avec plusieurs namespaces en
fonction des objets que lon veut manipuler. Dans Outlook, il nexiste
pourtant quun seul namespace appel MAPI (Messaging Application
Programming Interface ou Interface de Programmation dApplication
de Messagerie) si bien que lon pourrait lgitimement penser que
lappartenance des objets au namespace MAPI soit implicite. Malheureusement, il nen est rien et tout programme Outlook doit obligatoirement faire rfrence MAPI, un peu de la mme manire que
vous dfinissez une rfrence ADODB quand vous voulez programmer un objet Recordset en ADO. Cela tant, il nest pas interdit de
penser qu lavenir Microsoft dfinisse dautres namespaces.

Chap14.fm Page 285 Mercredi, 24. janvier 2007 6:17 18

285

Objet MailItem

OBJET MAILITEM
Lobjet MailItem reprsente un courrier lectronique. On utilise cet
objet pour crer un message lectronique et lenvoyer. On emploie
galement cet objet quand on souhaite manipuler les courriers qui
sont stocks dans la Bote de rception.
Le tableau 14.1 liste les principales proprits dun objet MailItem.
Tableau 14.1 Principales proprits dun objet MailItem
Proprit

Description

Attachments

Renvoie une collection qui reprsente les pices jointes


dun message.

BCC

Contient la liste des destinataires en BCC (Blind Carbon


Copy ou CCI pour Copie Carbone Invisible).

Body

Contient le texte du message lectronique.

BodyFormat

Renvoie ou dfinit une constante OlBodyFormat


indiquant le format du corps de texte. Ce format
dtermine la norme utilise pour afficher le texte du
message. Microsoft Outlook propose trois options de
format du corps de texte : Texte brut, Texte enrichi
(RTF, Rich Text Format) et HTML

CC

Contient la liste des destinataires en CC (Carbon Copy


ou Copie Carbone).

CreationTime

Renvoie une valeur de type Date qui indique l'heure de


cration du message.

Importance

Renvoie ou dfinit une constante OlImportance qui


indique le niveau d'importance du message parmi les
trois choix suivants : olImportanceHigh,
olImportanceLow et olImportanceNormal.

ReceivedTime

Renvoie ou dfinit une valeur de type Date qui indique


la date et l'heure de rception du message.

Recipients

Renvoie une collection Recipients qui reprsente tous


les destinataires du message.

SenderName

Renvoie une valeur de type String qui indique le nom


complet de l'expditeur du message.

Chap14.fm Page 286 Mercredi, 24. janvier 2007 6:17 18

286

Chapitre 14. Programmer Outlook

Tableau 14.1 Principales proprits dun objet MailItem


Proprit

Description

Size

Renvoie une valeur de type Long qui indique la taille


(en octets) du message.

Subject

Renvoie ou dfinit une valeur de type String qui


indique l'objet (sujet) du message.

To

Renvoie ou dfinit une valeur de type String dlimite


par des points-virgules prsentant la liste des noms
complets des destinataires du message.

Le tableau 14.2 liste les principales mthodes de lobjet MailItem.


Tableau 14.2 Principales mthodes dun objet MailItem
Mthode

Description

Copy

Cre une copie dun message.

Delete

Supprime un message.

Display

Affiche un message.

Forward

Transfre un message.

Move

Dplace un message dans un dossier.

PrintOut

Imprime un message.

Reply

Cre, partir du message d'origine, une rponse


pradresse l'expditeur d'origine et renvoie la
rponse sous la forme d'un objet MailItem.

ReplyAll

Cre, partir du message d'origine, une rponse


destine tous les destinataires d'origine et renvoie la
rponse sous la forme d'un objet MailItem.

Send

Envoie un message.

Pour envoyer un courrier lectronique par programmation, on utilise un code similaire celui-ci :
Dim courriel As MailItem
Dim destinataire As Recipient

Chap14.fm Page 287 Mercredi, 24. janvier 2007 6:17 18

Objet MAPIFolder

287

' cration d'un nouvel objet MailItem


Set courriel = Application.CreateItem(olMailItem)
' dfinition du destinataire
Set destinataire = _
courriel.Recipients.Add("suzy@azf.fr")
' dfinition de l'objet
courriel.Subject = "Test"
' dfinition du corps du message
courriel.Body = _
"Ceci est un message envoy par un programme"
' envoi du message
courriel.Send

OBJET MAPIFOLDER
Lobjet MAPIFolder qui reprsente un dossier dOutlook est un
objet important car dans ce logiciel, tous les lments sont stocks
dans des dossiers. Un objet MAPIFolder peut contenir dautres
objets MAPIFolder et ainsi de suite. Ds que lon veut parcourir le
contenu dun dossier, il faut employer un objet MAPIFolder.
On utilise souvent la mthode GetDefaultFolder qui permet dassigner un dossier par dfaut en fonction du type dlment. Cette
mthode emploie les constantes suivantes :

olFolderCalendar (Calendrier)
olFolderContacts (Contacts)
olFolderDeletedItems (lmnts supprims)
olFolderDrafts (Brouillons)
olFolderInbox (Bote de rception)
olFolderJournal (Journal)
olFolderNotes (Notes)
olFolderOutbox (Bote denvoi)
olFolderSentMail (lments envoys)
olFolderTasks (Tches)
olPublicFoldersAllPublicFolders (Tous les dossiers publics)

Ainsi, le code suivant permet de dfinir la Bote de rception


comme dossier par dfaut :

Chap14.fm Page 288 Mercredi, 24. janvier 2007 6:17 18

288

Chapitre 14. Programmer Outlook

Set monOlApp = CreateObject("Outlook.Application")


Set monNameSpace = monOlApp.GetNamespace("MAPI")
Set monDossier = monNameSpace.GetDefaultFolder(olFolderInbox)

Linstruction MsgBox monDossier.Name affiche dailleurs bien le libell


Bote de rception .
Pour parcourir la liste des dossiers, on utilise la proprit Folders
qui renvoie la collection Folders qui reprsente tous les dossiers contenus dans le dossier ou lespace de noms spcifi. Lobjet NameSpace
est la racine de tous les dossiers de lespace de noms indiqu (MAPI
en loccurrence).
Si lon reprend lextrait de code prcdent, linstruction suivante
affiche le nombre de dossiers dans la Bote de rception :
MsgBox monDossier.Folders.Count

Il est souvent ncessaire davoir parcourir larborescence dune


srie de dossiers. Le fait que des dossiers puissent tre imbriqus
impose un algorithme rcursif. La rcursivit consiste crire un programme qui sappelle lui-mme. Ainsi, le programme suivant affiche
dans la fentre Excution la liste de tous les dossiers et sous-dossiers de
la Bote de rception. Pour afficher le nom du dossier, il utilise une
fonction affiche_dossier qui sappelle elle-mme lintrieur de la
fonction. Linstruction For Each permet de parcourir la collection Folders.
Sub
Set
Set
Set
Dim

affiche_dossiers()
monOlApp = CreateObject("Outlook.Application")
monNameSpace = monOlApp.GetNamespace("MAPI")
monDossier = monNameSpace.GetDefaultFolder(olFolderInbox)
dossier2 As MAPIFolder
For Each dossier2 In monDossier.Folders
a = affiche_dossier(dossier2)
Next dossier2
End Sub
Function affiche_dossier(ByVal dossier_dpart As MAPIFolder)
Debug.Print dossier_dpart.Name
For Each dossier2 In dossier_dpart.Folders
' appel rcursif
b = affiche_dossier(dossier2)
Next dossier2
End Function

Chap14.fm Page 289 Mercredi, 24. janvier 2007 6:17 18

Objet MAPIFolder

289

Accs un sous-dossier partir de la Bote de rception


Dans Outlook, afin de classer son courrier, il est recommand de
crer des sous-dossiers thmatiques qui correspondent un thme de
votre activit ou bien un expditeur. On cre ce type de dossier en
faisant un clic droit sur la Bote de rception et en choisissant la
commande Nouveau dossier dans le menu contextuel. Bien
entendu, il est possible de crer un sous-dossier partir dun dossier
personnalis. Dans ces cas-l, laccs au sous-dossier personnalis se
fera de la manire suivante :
Set monOlApp = CreateObject("Outlook.Application")
Set monNameSpace = monOlApp.GetNamespace("MAPI")
Set monDossier = monNameSpace.GetDefaultFolder(olFolderInbox)
Set monDossier2 = monDossier.Folders("Dossier
Perso").Folders("Sous-dossier Perso")

Notez bien la syntaxe dutilisation o la collection .Folders sert


finalement sparateur entre les dossiers de niveau hirarchique diffrent. Cette syntaxe nest pas trs intuitive et si vous ne la connaissez
pas, vous aurez du mal la trouver dans laide en ligne.
Outlook et la scurit
Comme vous le savez certainement, le courrier lectronique est
aujourdhui le principal vecteur de propagation des virus. Compte tenu
du fait que de plus en plus dutilisateurs professionnels ou particuliers
bnficient dune connexion permanente Internet, il nest pas rare
quun virus bien conu arrive faire le tour de la plante en moins
dune journe. Conscient des risques encourus par les utilisateurs
dOutlook, Microsoft a multipli les scurits et il faut bien reconnatre
que parfois cela se fait au dtriment du programmeur. Outre les problmes de signature numrique des macros dj voqus au chapitre
3, vous constaterez trs vite quand vous programmerez Outlook que
ds que votre code tente de lire une adresse lectronique Outlook
met un message davertissement. Cela est d au fait que la majorit
des virus cherchent se reproduire ; or, pour quun virus se reproduise,
il faut quil envoie une copie du virus dautres destinataires. Bien videmment, le meilleur endroit pour trouver des adresses de destinataires se trouve tre le carnet dadresses ; la moindre tentative de lecture
de ladresse lectronique dun contact provoquera donc laffichage de
la bote de dialogue illustre la figure 14.2.

Chap14.fm Page 290 Mercredi, 24. janvier 2007 6:17 18

290

Chapitre 14. Programmer Outlook

Figure 14.2 Message dalerte dOutlook

Pour rgler le problme (temporairement), cochez la case Autoriser


laccs pour et choisissez la dure qui vous convient (10 minutes au
maximum). ma connaissance, il nexiste pas de moyen de contourner
ce problme. Microsoft diffuse sur son site Web un outil baptis Outlook Administrator Pack (ADMPACK.EXE) qui fait partie des outils de
lORK (Office Resource Kit, disponible ladresse http://www.microsoft.com/office/ork/) ; cet utilitaire permet de modifier les paramtres
de scurit, mais il ne fonctionne que si Outlook marche en tandem
avec un serveur de courrier lectronique Exchange.
Il nest pas rare galement que les antivirus dtectent lexcution dune
macro Outlook et vous pouvez tre oblig de rpondre une bote de
dialogue du genre de celle qui est illustre la figure 14.3 quand vous
excutez un programme VBA qui utilise le modle dobjets dOutlook.

Figure 14.3 Message dalerte de lantivirus McAfee

Si vous voulez au moins viter les messages dOutlook concernant la


scurit des macros, nous vous conseillons de ne pas abaisser le niveau
de scurit de moyen faible, mais dutiliser loutil SelfCert qui se
trouve en gnral dans le rpertoire racine dOffice. Cet outil est galement accessible partir du menu Dmarrer, grce au chemin Tous les
programmesMicrosoft OfficeOutils Microsoft OfficeCertificat
numrique pour les projets VBA Excutez cet utilitaire et attribuez un
nom votre certificat (figure 14.4).

Chap14.fm Page 291 Mercredi, 24. janvier 2007 6:17 18

291

Mise en pratique

Figure 14.4 Utilitaire SelfCert permettant


de crer un certificat numrique

Une fois le certificat cr, Outlook affiche la bote de dialogue illustre


la figure 14.5 la prochaine fois que vous excutez une macro.

Figure 14.5 Validation du certificat numrique cr par SelfCert

Si la bote de dialogue affiche le nom du certificat que vous avez cr


avec SelfCert, cochez la case Toujours faire confiance aux macros provenant de cette source et cliquez sur le bouton Activer les macros. Vous
noterez cependant que nimporte qui peut crer laide de SelfCert
une signature qui possde le mme nom que la vtre. Vous avez donc
tout intrt choisir un nom compliqu et le garder secret si vous ne
voulez pas que quelquun usurpe le nom de votre certificat.

MISE EN PRATIQUE
Afin dillustrer notre propos, nous allons vous prsenter plusieurs
macros qui montrent comment utiliser le modle dobjets dOutlook.

Chap14.fm Page 292 Mercredi, 24. janvier 2007 6:17 18

292

Chapitre 14. Programmer Outlook

Envoyer un message partir dune BD


La macro suivante utilise une table Access (figure 14.6) qui contient
des champs permettant de crer un courrier personnalis. Cette
macro permet donc de raliser trs simplement un publipostage
lectronique laide dOutlook et dune table Access.

Figure 14.6 Structure de la table Mailing

Lexemple suivant nemploie que deux champs pour personnaliser


le message, mais vous pouvez envisager des traitements beaucoup plus
sophistiqus :
Sub mailing_personnalis()
' On envoie un mailing partir d'une table Access
' qui stocke l'adresse du destinataire
' et des lments pour personnaliser le courrier
' Dclaration d'un recordset
Dim rst As ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.ConnectionString = "data source=C:\Email.mdb"
conn.Open
Set rst = New ADODB.Recordset
rst.CursorType = adOpenStatic
rst.Source = "Mailing"
rst.LockType = adLockOptimistic
rst.ActiveConnection = conn
rst.Open
rst.MoveFirst
' on parcourt toute la table grce une boucle
While Not rst.EOF
Dim courriel As MailItem
Dim destinataire As Recipient
Dim adresse As String
Dim message As String
' cration d'un nouvel objet MailItem
Set courriel = Application.CreateItem(olMailItem)
' dfinition du destinataire
adresse = rst.Fields("Email")
Set destinataire = courriel.Recipients.Add(adresse)

Chap14.fm Page 293 Mercredi, 24. janvier 2007 6:17 18

293

Mise en pratique

' dfinition de l'objet


courriel.Subject = "Montant de la cotisation"
' dfinition du corps du message
message = rst.Fields("Titre")
message = message + vbCr
message = message + "Cette anne, votre cotisation s'lve
" _
+ Str(rst.Fields("Cotisation")) + " euros." + vbCr
message = message + "Bien cordialement." + vbCr
message = message + "Le trsorier de l'Association"
courriel.Body = message
' envoi du message
courriel.Send
' on passe l'enregistrement suivant
rst.MoveNext
Wend
End Sub

Analyser tous les messages entrants


Comme vous le savez dj, Outlook ne possde quun seul fichier
projet qui sappelle VbaProject.OTM (figure 14.7). Lobjet Application de ThisOutlookSession possdant un vnement NewMail, il
est relativement facile dappliquer un traitement tout nouveau
courriel.

Figure 14.7 Projet Outlook

Pour ce faire, slectionnez llment Application dans la liste


droulante de gauche de la fentre de code qui affiche par dfaut la
mention (Gnral). Dans la liste de droite, slectionnez lvnement
NewMail. La fentre de code affiche le squelette suivant :
Private Sub Application_NewMail()
End Sub

Chap14.fm Page 294 Mercredi, 24. janvier 2007 6:17 18

294

Chapitre 14. Programmer Outlook

Il ne vous reste alors plus qu crire du code entre ces deux lignes
et larrive de chaque nouveau message, ce code sera excut. Gardez cependant lesprit que les rgles de message que vous avez pu
dfinir sexcutent avant la procdure vnementielle NewMail.
Le code suivant analyse tous les messages entrants et affiche une
bote de dialogue contenant le nom de lexpditeur (dans la barre de
titre) ainsi que le sujet et le corps du message si limportance du courriel est haute :
Private Sub Application_NewMail()
Set monOlApp = CreateObject("Outlook.Application")
Set monNameSpace = monOlApp.GetNamespace("MAPI")
Set monDossier = monNameSpace.GetDefaultFolder(olFolderInbox)
If monDossier.Items(monDossier.Items.Count).Importance = 2 Then
' Importance haute
message = monDossier.Items(monDossier.Items.Count).Subject + _
vbCr + monDossier.Items(monDossier.Items.Count).Body
titre = "Message de " +
monDossier.Items(monDossier.Items.Count).SenderName
alerte = MsgBox(message, vbCritical, titre)
End If
End Sub

Vous noterez que le courrier qui vient darriver est le dernier lment de la collection ; on y accde donc par la syntaxe :
monDossier.Items(monDossier.Items.Count).proprit

Bien videmment, vous pouvez envisager des traitements beaucoup


plus sophistiqus ; grce cet vnement, vous allez pouvoir crire des
rgles de messages trs complexes. En matire de lutte contre le spam,
vous pouvez ainsi rdiger des filtres qui seront bien plus efficaces que
des simples listes dexclusion comportant les termes viagra ou
enlargement
Vous pouvez mme dans certains cas envisager un systme de
rponse automatique. Bref, les possibilits sont en la matire normes
et votre imagination sera votre seule limite.

Exporter les messages dans une BD


Avez-vous dj song sauvegarder ou archiver vos courriers lectroniques dans un format qui soit facilement exploitable ? Le pro-

Chap14.fm Page 295 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

295

blme est en fait pineux car si vous voulez faire une sauvegarde de
vos courriels, la solution la plus simple consiste faire une copie du
fichier PST. Outlook peut galement archiver vos messages, mais il
les stocke dans un fichier ARCHIVE.PST qui occupe de la place sur
le disque et ne sera daucune utilit sil est sauvegard sur un CDROM. Dans ces conditions, le plus simple est dexporter ses messages dans une base de donnes Access o ils seront alors facilement
exploitables. La macro suivante sauvegarde le contenu de la Bote
de rception dans une table Access. Seules les informations suivantes sont sauvegardes : lexpditeur, la date, le sujet, le message et sa
taille.
Sub sauve_bal()
Set monOlApp = CreateObject("Outlook.Application")
Set monNameSpace = monOlApp.GetNamespace("MAPI")
Set monDossier = monNameSpace.GetDefaultFolder(olFolderInbox)
' dclaration d'un recordset
' pour stockage dans une table Access
Dim rst As ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.ConnectionString = "data source=C:\Email.mdb"
conn.Open
Set rst = New ADODB.Recordset
rst.CursorType = adOpenStatic
rst.Source = "Courriers"
rst.LockType = adLockOptimistic
rst.ActiveConnection = conn
rst.Open
For Each mel In monDossier.Items
rst.AddNew
rst.Fields("Expditeur") = mel.SenderName
rst.Fields("Date") = mel.ReceivedTime
rst.Fields("Sujet") = mel.Subject
rst.Fields("Message") = mel.Body
rst.Fields("Taille") = mel.Size
rst.Update
Next mel
rst.Close
End Sub

Vous noterez la construction For Each qui permet de parcourir


lintgralit du contenu dun dossier.

Chap14.fm Page 296 Mercredi, 24. janvier 2007 6:17 18

296

Chapitre 14. Programmer Outlook

Vous pouvez bien videmment adapter ce programme et sauvegarder dautres informations. Vous pouvez galement faire une analyse du
corps du message et dcider selon des critres que vous aurez dfinis de
ne pas sauvegarder le message.

Exporter les contacts dans une BD


La macro suivante exporte certaines informations des contacts dans
une table Access. Contrairement au programme prcdent, cest
cette fois-ci le dossier Contacts qui est parcouru et non pas la Bote
de rception. La macro rcupre le prnom, le nom et les deux premires adresses lectroniques du contact.
Dim ol As New Outlook.Application
Dim olns As Outlook.NameSpace
Dim cf As Outlook.MAPIFolder
Dim c As Outlook.ContactItem
Dim objItems As Outlook.Items
Dim Prop As Outlook.UserProperty
Set olns = ol.GetNamespace("MAPI")
Set cf = olns.GetDefaultFolder(olFolderContacts)
Set objItems = cf.Items
iNumContacts = objItems.Count
' dclaration d'un recordset
' pour stockage dans une table Access
Dim rst As ADODB.Recordset
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.ConnectionString = "data source=C:\Email.mdb"
conn.Open
Set rst = New ADODB.Recordset
rst.CursorType = adOpenStatic
rst.Source = "Contacts"
rst.LockType = adLockOptimistic
rst.ActiveConnection = conn
rst.Open
For i = 1 To iNumContacts
If TypeName(objItems(i)) = "ContactItem" Then
Set c = objItems(i)
rst.AddNew
rst.Fields("Prnom") = c.FirstName
rst.Fields("Nom") = c.LastName
rst.Fields("Email1") = c.Email1Address
rst.Fields("Email2") = c.Email2Address

Chap14.fm Page 297 Mercredi, 24. janvier 2007 6:17 18

Mise en pratique

297

rst.Update
End If
Next i
rst.Close
End Sub

Les spammeurs en puissance noteront quil est facile, avec les proprits de lobjet MailItem, de rcuprer toutes les adresses lectroniques qui tranent dans les messages que vous recevez. En effet, bon
nombre dutilisateurs ne matrisent pas les subtilits du champ Cci et
sont prompts vider leur carnet dadresses au moindre hoax reu, ce
qui a pour consquence que certains courriels regorgent dadresses
lectroniques

CONCLUSION
Laspect un peu particulier du modle dobjets dOutlook est de
prime abord un peu rebutant, mais il ne faut pas se laisser impressionner car les possibilits de programmation dOutlook sont trs
vastes. Nous navons abord que la partie qui concerne la messagerie lectronique, mais le modle dobjets gre bien videmment les autres lments dOutlook que sont le calendrier, les
contacts, les notes et les tches.
Le courrier lectronique tient aujourdhui une place considrable
et bon nombre dutilisateurs consacrent un temps important de
leur journe de travail lire ou rpondre des courriels. Une
programmation bien pense dOutlook peut faire gagner un
temps prcieux et viter bien des msaventures.

Chap14.fm Page 298 Mercredi, 24. janvier 2007 6:17 18

Chap15.fm Page 299 Mercredi, 24. janvier 2007 6:27 18

15
Programmer
PowerPoint
Le modle dobjets de PowerPoint est moins important en volume
que celui de Word ou dExcel, mais il recle nanmoins tous les
objets dont vous avez besoin pour grer ou crer des prsentations.
Comme pour les autres applications de la suite Office, notre prtention nest pas de couvrir de manire exhaustive lensemble du
modle dobjets, mais de vous en faire une prsentation gnrale et
dattirer votre attention sur les principaux objets qui le composent.
Comme nous lavons dj soulign pour Word et Excel, lapprentissage du modle dobjets de PowerPoint pourra tre facilit par lutilisation de lenregistreur de macro.
Il ne faudra surtout pas hsiter, quand vous voulez crire une
macro, partir du squelette que vous aura gnr lenregistreur. Mme
si le code nest pas toujours optimis, vous aurez au moins un exemple
dutilisation en situation relle des objets que vous voulez programmer.
Office Malheureusement, lenregistreur de macro a t supprim dans
2 0 0 7 PowerPoint 2007. Dans un article du site Web de Microsoft intitul Quest devenu lenregistreur de macro ? il nous est expliqu quil
faut dsormais utiliser en remplacement VBA pour crer des macros

Chap15.fm Page 300 Mercredi, 24. janvier 2007 6:27 18

300

Chapitre 15. Programmer PowerPoint

Figure 15.1 Modle dobjets dOutlook

Le code des macros PowerPoint ne peut tre stock qu lintrieur


du fichier de la prsentation et il nexiste pas comme dans Word (avec
Normal.dot) ou Excel (avec le classeur de macros personnelles) de
modle qui puisse servir de conteneur aux macros les plus souvent utilises. Le code est stock dans un projet nomm VBAProject ; pour
crire une macro, vous devez au pralable insrer un module. Si vous
utilisez lenregistreur de macro pour gnrer du code, la cration du
module est automatique.

Chap15.fm Page 301 Mercredi, 24. janvier 2007 6:27 18

301

Objet Application

OBJET APPLICATION
Comme pour Word et Excel, lobjet Application reprsente lapplication PowerPoint elle-mme et se situe au sommet de la hirarchie
du modle dobjets. Une dizaine de proprits sont globales et vous
navez donc pas les prfixer avec le nom dobjet Application.
Le tableau 15.1 liste les principales proprits de lobjet Application (les proprits en gris sont globales).
Tableau 15.1 Principales proprits de lobjet Application
Active

Spcifie si la fentre est active.

ActivePresentation

Renvoie un objet Presentation qui reprsente la


prsentation ouverte dans la fentre active.

ActivePrinter

Renvoie le nom de limprimante active.

ActiveWindow

Renvoie un objet DocumentWindow qui reprsente la


fentre de document active.

Build

Renvoie le numro de build de PowerPoint.

Caption

Affiche le titre dune fentre.

CommandBars

Renvoie une collection CommandBars reprsentant les


barres de commandes de PowerPoint.

FileDialog

Permet douvrir la bote de dialogue Fichier pour ouvrir ou


enregistrer des fichiers.

OperatingSystem

Renvoie le nom du systme dexploitation.

Presentations

Renvoie une collection Presentations qui reprsente toutes


les prsentations ouvertes.

ShowStartupDialog

Permet dactiver ou de dsactiver laffichage du volet Office.

SlideShowWindows

Renvoie une collection SlideShowWindows qui reprsente


toutes les fentres de diaporama ouvertes.

Version

Renvoie le numro de version de PowerPoint.

Windows

Renvoie une collection DocumentWindows reprsentant


l'intgralit des fentres de document ouvertes.

WindowState

Gre ltat de la fentre spcifie.

Chap15.fm Page 302 Mercredi, 24. janvier 2007 6:27 18

302

Chapitre 15. Programmer PowerPoint

Pour vous familiariser avec ces proprits, le plus simple est de les
tester dans lditeur de programmes en faisant afficher leur valeur
laide de la fonction MsgBox. Vous pouvez, par exemple saisir directement linstruction dans la fentre Excution. Si la fentre Excution
nest pas affiche dans lditeur, excutez la commande AffichageFentre Excution. Dans cette fentre, vous pouvez saisir une
instruction et lexcuter immdiatement en appuyant sur la touche
Entre.
La figure 15.2 illustre le test dune proprit dans la fentre Excution. Comme vous pouvez le constater, la technologie Intellisense
fonctionne galement dans la fentre Excution.

Figure 15.2 Test dune proprit


dans la fentre Excution

Parmi toutes les proprits de lobjet Application, vous vous servirez trs souvent de la proprit ActivePresentation qui permet daccder la prsentation qui est actuellement en cours dutilisation. Cette
proprit tant globale, vous navez pas besoin de la prfixer par
Application. Ainsi, la proprit suivante renvoie le nom du fichier de
la prsentation active :
MsgBox ActivePresentation.Name

Lobjet Application compte peu de mthodes et vous utiliserez


principalement les trois mthodes Activate, Quit et Run dont la
dnomination est suffisamment significative pour que lon nen dise
pas plus.

Chap15.fm Page 303 Mercredi, 24. janvier 2007 6:27 18

303

Collection Presentations

COLLECTION PRESENTATIONS
La collection Presentations regroupe des objets Presentation qui,
comme leur nom lindique, dsignent une prsentation PowerPoint.
Le tableau 15.2 liste les principales proprits de lobjet Presentation.
Tableau 15.2 Principales proprits de lobjet Presentation
BuiltInDocumentProperties

Renvoie une collection DocumentProperties


qui reprsente toutes les proprits de la
prsentation spcifie.

ColorSchemes

Renvoie une collection ColorSchemes qui


reprsente les jeux de couleurs de la
prsentation.

Fonts

Renvoie une collection Fonts qui reprsente


toutes les polices utilises dans la prsentation.

FullName

Renvoie le nom de la prsentation avec le


chemin d'accs complet.

HandoutMaster

Renvoie un objet Master qui reprsente le


masque du document.

Name

Renvoie le nom de la prsentation avec son


extension, mais pas le chemin.

NotesMaster

Renvoie un objet Master qui reprsente le


masque de commentaires.

PageSetup

Renvoie un objet PageSetup dont les


proprits contrlent les attributs de mise en
page des diapositives de la prsentation.

Path

Renvoie le chemin daccs de la prsentation.

PrintOptions

Renvoie un objet PrintOptions qui reprsente


les options d'impression enregistres avec la
prsentation.

Saved

Dtermine si des modifications ont t


apportes la prsentation depuis son dernier
enregistrement.

Chap15.fm Page 304 Mercredi, 24. janvier 2007 6:27 18

304

Chapitre 15. Programmer PowerPoint

Tableau 15.2 Principales proprits de lobjet Presentation


SlideMaster

Renvoie un objet Master qui reprsente le


masque des diapositives.

Slides

Renvoie une collection Slides qui reprsente


toutes les diapositives de la prsentation.

SlideShowSettings

Renvoie un objet SlideShowSettings qui


reprsente les paramtres du diaporama de la
prsentation spcifie.

SlideShowWindow

Renvoie un objet SlideShowWindow qui


reprsente la fentre du diaporama dans
laquelle la prsentation est en cours
d'excution.

TemplateName

Renvoie le nom du modle de prsentation


associ la prsentation.

Windows

Renvoie une collection DocumentWindows


qui reprsente toutes les fentres de
document associes la prsentation.

Le tableau 15.3 liste les principales mthodes de lobjet Presentation.


Tableau 15.3 Principales mthodes de lobjet Presentation
ApplyTemplate

Applique un modle de conception la


prsentation en cours.

Close

Ferme la fentre ouverte d'une


prsentation.

Export

Exporte chaque diapositive de la


prsentation l'aide du filtre graphique
spcifi et enregistre les fichiers exports
dans le dossier spcifi.

Merge

Fusionne une prsentation au sein d'une


autre prsentation.

PrintOut

Imprime la prsentation.

Save

Enregistre la prsentation.

Chap15.fm Page 305 Mercredi, 24. janvier 2007 6:27 18

305

Collection Presentations

Tableau 15.3 Principales mthodes de lobjet Presentation


SaveAs

Enregistre une prsentation qui ne l'a pas


encore t, ou enregistre sous un autre
nom une prsentation dj enregistre
prcdemment.

SaveCopyAs

Enregistre une copie de la prsentation


spcifie dans un fichier sans modifier
l'original.

WebPagePreview

Affiche un aperu de la prsentation dans


le navigateur Web actif.

Quand on souhaite faire lapprentissage dun nouveau modle


dobjets, la difficult rside dans labondance des objets, des proprits
et des mthodes ; comme il nexiste plus de documentation papier des
modles dobjets, il est mme difficile dapprhender lampleur dun
modle, sa reprsentation graphique nindiquant quune arborescence
hirarchique et absolument pas le nombre de proprits et de mthodes que recle chaque objet. Dans cette masse dinformations, il faut
donc tenter de faire le tri entre ce qui est important et ce qui est superflu. Les tableaux de cet ouvrage, en vous signalant les principales
mthodes et proprits des objets importants vous aident dans cette
tche, mais vous devez aussi essayer par vous-mme le plus grand
nombre possible de proprits et de mthodes pour voir si elles peuvent vous rendre service dans vos programmes VBA. Lutilisation de
lenregistreur de macro va attirer votre attention sur les objets dont
vous avez besoin pour raliser une tche et vous naurez plus ensuite
qu vous plonger dans laide en ligne pour percer toutes les subtilits
de ces objets. Laide propose pour la plupart des objets des exemples de
code qui illustrent lemploi des proprits et des mthodes. Il est vivement conseill de copier et de coller ces exemples dans lditeur de
programme afin de les excuter. Nayez pas peur de modifier tous les
paramtres de la macro afin de bien comprendre lincidence des diffrentes variables sur le programme. Trs souvent, vous pouvez partir
dun de ces extraits de code et lamliorer considrablement sans
beaucoup defforts. Nous allons illustrer notre propos par un exemple.

Chap15.fm Page 306 Mercredi, 24. janvier 2007 6:27 18

306

Chapitre 15. Programmer PowerPoint

la lecture du tableau des proprits de lobjet Presentation, votre


attention a t attire par la proprit BuiltInDocumentProperties.
Comme vous voulez en savoir plus, vous invoquez laide en ligne et
trouvez la rubrique consacre cette proprit.

Figure 15.3 Aide en ligne de la proprit


BuiltInDocumentProperties

Dans la mesure o laide propose un extrait de code, vous le copiez


et le collez dans lditeur de programmes.
Si vous avez activ, comme cela est recommand, la dclaration
obligatoire des variables, il faudra lgrement modifier le programme
propos :
Sub affiche_props()
Dim p, bidpList
For Each p In Application.ActivePresentation _
.BuiltInDocumentProperties
bidpList = bidpList & p.Name & Chr$(13)
Next
MsgBox bidpList
End Sub

Lexcution de ce programme produit le rsultat illustr la


figure 5.4.

Chap15.fm Page 307 Mercredi, 24. janvier 2007 6:27 18

Collection Presentations

307

Figure 15.4 Affichage de la collection


DocumentProperties

Laide en ligne propose un deuxime extrait de code :


With ActivePresentation.BuiltInDocumentProperties
If .Item("author").Value = "Jake Jarmel" Then
.Item("category").Value = "Creative Writing"
End If
End With

Ce deuxime exemple est intressant car il nous montre que grce


aux proprits Item et Value, on peut lire ou modifier les proprits
dune prsentation. Votre premier rflexe doit tre de tester toutes les
proprits renvoyes par la proprit BuiltInDocumentProperties.
Pour ce faire, il suffit dexcuter dans une macro ou dans la fentre
Excution une instruction du genre de celle-ci :
MsgBox
ActivePresentation.BuiltInDocumentProperties.Item("Author").Value

Chap15.fm Page 308 Mercredi, 24. janvier 2007 6:27 18

308

Chapitre 15. Programmer PowerPoint

Malheureusement pour nous, la proprit BuiltInDocumentProperties renvoie une trentaine de proprits et il peut se rvler assez
fastidieux de saisir une trentaine de lignes de code afin de tester toutes
ces proprits. Vous devez ce moment-l vous souvenir que lun des
buts de la programmation est dautomatiser les tches rptitives et
ennuyeuses. Ce principe sapplique bien videmment la cration du
code, si bien que lon peut crire une macro dont le but va tre
dcrire une macro
Le principe est finalement assez simple : on va reprendre lextrait
de code de laide en ligne et faire en sorte que la boucle For Each
gnre des lignes de code prtes lemploi. Le code sera gnr, grce
la commande Debug.Print, dans la fentre Excution et il ny aura
ensuite plus qu coller le rsultat de ce programme entre deux instructions Sub et End Sub pour obtenir un programme de test des proprits de la collection DocumentProperties. En fait, le programme se
contente de gnrer une instruction de la forme :
Debug.Print
ActivePresentation.BuiltInDocumentProperties.Item("Title").Value

Nous employons nouveau linstruction Debug.Print pour diriger


laffichage de la valeur de la proprit dans la fentre Excution. Nous
aurions pu employer la fonction MsgBox, mais cela aurait ncessit de
cliquer une trentaine de fois sur le bouton OK de la bote de dialogue.
Grce notre petit programme, nous testons dun seul coup la valeur
dune trentaine de proprits.
Comme vous pourrez le constater, notre gnrateur de code est
extrment simple :
Sub GenereProps()
Dim prop
For Each prop In ActivePresentation.BuiltInDocumentProperties
Debug.Print "Debug.Print
ActivePresentation.BuiltInDocumentProperties.Item(" & Chr(34) &
prop.Name & Chr(34) & ").Value"
Next
End Sub

Vous noterez lutilisation de la fonction Chr(34) dont le but est de


produire des guillemets qui encadrent le nom de la proprit teste,
comme dans Item("Title").Value.

Chap15.fm Page 309 Mercredi, 24. janvier 2007 6:27 18

309

Collection Presentations

Une fois que vous avez excut ce programme, il suffit de rcuprer


les lignes de code dans la fentre Excution et de les coller dans lditeur de programmes. Vous pouvez alors excuter ce programme pour
voir le rsultat du test des proprits dans la fentre Excution.
Malheureusement, lexcution de notre programme provoque une
erreur.

Figure 15.5 Message derreur

Pour une fois, le message derreur est relativement clair, mme si la


bote de message appelle mthode ce qui est en ralit une proprit.
Pour voir do vient lerreur, cliquez sur le bouton Dbogage (nous en
apprendrons plus sur le dbogage des programmes dans la dernire
partie de cet ouvrage). Cela a pour effet de vous ramener dans lditeur Visual Basic et de surligner en jaune la ligne de code litigieuse.

Figure 15.6 Dbogage dune macro

Chap15.fm Page 310 Mercredi, 24. janvier 2007 6:27 18

310

Chapitre 15. Programmer PowerPoint

Ne vous posez pas de question mtaphysique et choisissez la commande ExcutionRinitialiser qui a pour effet darrter le dbogage.
Puis mettez une apostrophe devant la ligne de code surligne en
jaune, ce qui en fait un commentaire et empche donc son excution.
Relancez le programme et vous constaterez que lerreur dj rencontre se produit nouveau cinq fois. Appliquez le mme remde en
transformant en commentaires les lignes qui posent problme. Au
final, vous testez dans la fentre Excution une bonne vingtaine de
proprits dune prsentation PowerPoint et vous navez pas eu la
peine dcrire tout ce code.
Vous vous demandez sans doute pourquoi certaines proprits ne
fonctionnent pas. La raison est donne dans laide en ligne. En fait,
lobjet DocumentProperty ne fait pas partie du modle dobjets de
PowerPoint, mais du modle dobjets dOffice et, comme son nom
lindique, il sagit dun objet gnrique qui liste les proprits des
documents Office. Si vous consultez la documentation de lobjet
DocumentProperty qui est disponible dans la rubrique Rfrence
Visual Basic Microsoft Office, vous pourrez lire la remarque suivante :
Les applications conteneur ne dfinissent pas ncessairement une
valeur pour chaque proprit de document prdfinie. Si une application donne ne dfinit pas une valeur pour une des proprits de
document prdfinies, renvoyer la proprit Value pour cette proprit de document provoque une erreur.

COLLECTION SLIDES
Les adeptes du franglais savent que la collection Slides renferme les
diapositives dune prsentation. Un objet Slide dsigne une des diapositives dune prsentation. Il existe galement une collection baptise SlideRange qui reprsente une page de commentaires ou un
ensemble de diapositives ; cet ensemble peut tre form de plusieurs
diapositives, voire de la totalit des diapositives de la prsentation.
Les collections Slides et SlideRange partagent de nombreuses proprits et mthodes.
Le tableau 15.4 liste les principales proprits de lobjet Slide.

Chap15.fm Page 311 Mercredi, 24. janvier 2007 6:27 18

311

Collection Slides

Tableau 15.4 Principales proprits de lobjet Slide


Background

Renvoie un objet ShapeRange qui reprsente


l'arrire-plan de la diapositive.

ColorScheme

Renvoie ou dfinit un objet ColorScheme reprsentant


les couleurs du jeu de la diapositive, du groupe de
diapositives ou du masque de diapositive spcifi.

Design

Renvoie un objet Design reprsentant une conception.

DisplayMasterShapes

Dtermine si la diapositive ou plage de diapositives


spcifie affiche les objets d'arrire-plan sur le
masque des diapositives.

FollowMasterBackground

Dtermine si l'arrire-plan de la diapositive ou de la


plage de diapositives spcifie est identique celui
du masque des diapositives.

Layout

Renvoie ou dfinit une constante PpSlideLayout


qui reprsente la mise en page de la diapositive.

Master

Renvoie un objet Master qui reprsente le masque


des diapositives.

Name

Renvoie le nom de la diapositive qui est gal Slide suivi


dun numro qui nest pas forcment squentiel.

Shapes

Renvoie une collection Shapes reprsentant tous les


lments qui ont t placs ou insrs sur la
diapositive, la plage de diapositives ou le masque de
diapositives.

SlideID

Renvoie un numro d'identification unique pour la


diapositive spcifie.

SlideIndex

Renvoie le numro d'index de la diapositive


spcifie au sein de la collection Slides.

SlideNumber

Numro qui s'affiche dans le coin infrieur droit de


la diapositive lorsque vous affichez les numros de
diapositive.

SlideShowTransition

Renvoie un objet SlideShowTransition qui


reprsente les effets spciaux pour la transition
spcifie entre les diapositives.

TimeLine

Renvoie un objet TimeLine reprsentant la


chronologie d'animation de la diapositive.

Chap15.fm Page 312 Mercredi, 24. janvier 2007 6:27 18

312

Chapitre 15. Programmer PowerPoint

Le tableau 15.5 liste les mthodes de lobjet Slide.


Tableau 15.5 Mthodes de lobjet Slide
ApplyTemplate

Applique un modle de conception la


prsentation en cours.

Copy

Copie l'objet spcifi dans le Presse-papiers.

Cut

Supprime l'objet spcifi et le place dans le Pressepapiers.

Delete

Supprime l'objet spcifi.

Duplicate

Cre une copie de l'objet Slide spcifi, ajoute la


nouvelle diapositive la collection Slides
immdiatement aprs la diapositive spcifie
l'origine, puis renvoie un objet Slide reprsentant la
copie de la diapositive.

Export

Exporte une diapositive l'aide du filtre graphique


spcifi et enregistre le fichier export sous le nom
de fichier spcifi.

MoveTo

Dplace l'objet Slide un emplacement prcis au


sein de la mme collection et renumrote en
consquence tous les autres lments de la
collection.

Select

Slectionne l'objet spcifi.

la lecture des proprits et des mthodes de lobjet Slide, vous


pouvez constater que grce cet objet il est possible de modifier de
nombreux paramtres dune diapositive. La proprit Layout notamment permet de dfinir la mise en page dune diapositive. Par exemple, linstruction :
MsgBox ActivePresentation.Slides(6).Layout

affiche la mise en page de la sixime diapositive de la prsentation


active. Cette instruction renvoie un numro qui correspond une
numration qui liste tous les types de mise en page disponibles pour
une diapositive. Cette numration apparat dailleurs grce la technologie Intellisense dans lditeur de code ds que vous saisissez le
signe gal la suite de la proprit Layout. Une nouvelle fois, nous

Chap15.fm Page 313 Mercredi, 24. janvier 2007 6:27 18

Collection Slides

313

dsirons tester rapidement toutes les possibilits de mise en page


quoffre PowerPoint pour une diapositive. Vous pouvez utiliser la liste
Intellisense pour crire une macro de test, mais nous allons cette foisci utiliser une boucle qui balaye lnumration. Vous dcouvrirez un
peu loin dans ce chapitre comment nous avons trouv la correspondance entre les valeurs de lnumration et leurs numros. Voici la
liste complte de lnumration ppLayout :
ppLayoutMixed = 0xfffffffe, -2
ppLayoutTitle = 1,
ppLayoutText = 2,
ppLayoutTwoColumnText = 3,
ppLayoutTable = 4,
ppLayoutTextAndChart = 5,
ppLayoutChartAndText = 6,
ppLayoutOrgchart = 7,
ppLayoutChart = 8,
ppLayoutTextAndClipart = 9,
ppLayoutClipartAndText = 10,
ppLayoutTitleOnly = 11,
ppLayoutBlank = 12,
ppLayoutTextAndObject = 13,
ppLayoutObjectAndText = 14,
ppLayoutLargeObject = 15,
ppLayoutObject = 16,
ppLayoutTextAndMediaClip = 17,
ppLayoutMediaClipAndText = 18,
ppLayoutObjectOverText = 19,
ppLayoutTextOverObject = 20,
ppLayoutTextAndTwoObjects = 21,
ppLayoutTwoObjectsAndText = 22,
ppLayoutTwoObjectsOverText = 23,
ppLayoutFourObjects = 24,
ppLayoutVerticalText = 25,
ppLayoutClipArtAndVerticalText = 26,
ppLayoutVerticalTitleAndText = 27,
ppLayoutVerticalTitleAndTextOverChart = 28,
ppLayoutTwoObjects = 29,
ppLayoutObjectAndTwoObjects = 30,
ppLayoutTwoObjectsAndObject = 31

Si lon excepte la valeur -2, on remarque que les numros de cette


numration vont de 1 31. Il ny a donc rien de plus simple que
dcrire une boucle qui va parcourir cette numration et tester ainsi
chaque type de mise en page.

Chap15.fm Page 314 Mercredi, 24. janvier 2007 6:27 18

314

Chapitre 15. Programmer PowerPoint

Sub test_mise_en_page()
Dim i
For i = 1 To 31
ActivePresentation.Slides(6).Layout = i
MsgBox "Proprit Layout = " & i
Next i
End Sub

Ce programme teste toutes les mises en page possibles pour la


sixime diapositive de la prsentation active. La fonction MsgBox
affiche le numro de la constante ppLayout, si bien que vous pouvez
facilement noter les mises en page qui vous conviennent.

Figure 15.7 Programme de test de la proprit Layout

Vous avez pu constater que dans le programme prcdent jai dsign une diapositive particulire dune prsentation en passant son
numro comme paramtre la collection Slides de lobjet ActivePresentation. Comme nous allons le constater, il existe plusieurs manires de faire rfrence une diapositive spcifique.
Il existe trois proprits qui renvoient un numro de diapositive :
SlideID, SlideIndex et SlideNumber. Ces proprits dsignent des
informations diffrentes et il convient de ne pas les confondre. SlideID renvoie un numro qui est attribu par PowerPoint et qui nest
jamais modifi, mme si la diapositive est dplace au sein de la prsentation ou si vous supprimez ou insrez des diapositives. La mthode
FindBySlideID vous permet daccder une diapositive par lidenti-

Chap15.fm Page 315 Mercredi, 24. janvier 2007 6:27 18

Collection Shapes

315

fiant SlideID dune diapositive. Il faudra donc privilgier cette


mthode daccs si des diapositives sont insres, supprimes ou
dplaces dans votre prsentation.
La proprit SlideIndex renvoie le numro dindice de la diapositive spcifie au sein de la collection Slides. Ce numro peut changer
si des diapositives sont insres, supprimes ou dplaces.
La proprit SlideNumber, quant elle, renvoie le numro qui saffiche dans le coin infrieur droit de la diapositive lorsque votre prsentation affiche les numros des diapositives. Ce numro est dtermin par le
nombre de diapositives de la prsentation (ActivePresentation.Slides.Count) et le numro de la premire diapositive de la prsentation qui
est reprsent par la valeur de la proprit FirstSlideNumber.
Afin de bien faire la diffrence entre toutes ces proprits, placezvous sur une diapositive de votre prsentation et excutez le programme suivant :
Sub num_diapo()
MsgBox "Nombre de diapos : " & ActivePresentation.Slides.Count &
vbCrLf _
& "Numro de la diapo : " & ActiveWindow.View.Slide.SlideNumber
& vbCrLf _
& "Numro sur la diapo : " & ActiveWindow.View.Slide.SlideIndex
& vbCrLf _
& "Identifiant de la diapo : " & ActiveWindow.View.Slide.SlideID
End Sub

Figure 15.8 Diffrentes manires de dsigner une diapositive

COLLECTION SHAPES
La collection Shapes contient les objets Shape qui sont prsents sur
un objet Slide. Un objet Shape est une forme qui se situe sur la couche dessin ; cette forme peut tre aussi bien une forme automatique,

Chap15.fm Page 316 Mercredi, 24. janvier 2007 6:27 18

316

Chapitre 15. Programmer PowerPoint

quune forme libre ou un objet OLE. Cette collection renferme de


trs nombreuses possibilits de cration graphique et ceux qui
aiment la gomtrie peuvent sen donner cur joie pour programmer de trs jolis motifs bass sur des quations mathmatiques. De
manire plus simple, vous pouvez vous servir de cette collection
pour programmer laffichage dobjets dont la cration manuelle
serait fastidieuse. Ainsi, le programme suivant permet de tracer la
grille qui est illustre la figure 15.9 :
Sub Grille()
Dim x As Integer, y As Integer, i As Byte, j As Byte
x = 100
y = 150
For i = 1 To 16
ActiveWindow.Selection.SlideRange.Shapes.AddLine(x, y, x + 600,
y).Select
y = y + 25
Next
x = 100
y = 150
For j = 1 To 29
ActiveWindow.Selection.SlideRange.Shapes.AddLine(x, y, x, y +
375).Select
x = x + 25
Next
End Sub

Avouez que le trac est plus facile et plus prcis si on le programme


au lieu de le raliser la main.

Figure 15.9 Dessin dune grille par programmation

Chap15.fm Page 317 Mercredi, 24. janvier 2007 6:27 18

317

Collection Shapes

Le tableau 15.6 liste les principales proprits de lobjet Shape.


Tableau 15.6 Principales proprits de lobjet Shape
ActionSettings

Renvoie un objet ActionSettings qui contient des


informations sur l'action qui est excute lorsque
l'utilisateur clique ou fait glisser la souris sur la forme ou
la plage de texte spcifie au cours d'un diaporama.

AnimationSettings

Renvoie un objet AnimationSettings qui reprsente


tous les effets spciaux que vous pouvez appliquer
l'animation de la forme spcifie.

AutoShapeType

Renvoie ou dfinit le type de forme pour l'objet Shape


ou ShapeRange spcifi, qui doit reprsenter une
forme automatique autre qu'un trait, une forme libre
ou un connecteur.

Fill

Renvoie un objet FillFormat qui contient les proprits de


mise en forme du remplissage pour la forme spcifie.

Height

Renvoie ou dfinit, en points, la hauteur de l'objet


spcifi.

Id

Renvoie une valeur de type Long identifiant la forme.

Left

Renvoie ou dfinit une valeur de type Single qui


spcifie, en points, la distance entre le bord gauche du
cadre de la forme et le bord gauche de la diapositive.

Line

Renvoie un objet LineFormat qui contient les


proprits de mise en forme des traits pour la forme
spcifie.

LockAspectRatio

Dtermine si la forme spcifie conserve ses


proportions d'origine lorsque vous la redimensionnez.

Name

Renvoie le nom de la forme spcifie.

PictureFormat

Renvoie un objet PictureFormat qui contient les proprits


de mise en forme d'images pour la forme spcifie.

Table

Renvoie un objet Table qui reprsente un tableau


contenu dans une forme ou dans une plage de formes.

TextFrame

Renvoie un objet TextFrame qui contient les proprits


d'alignement et d'ancrage pour la forme spcifie ou le
style du texte du masque.

Chap15.fm Page 318 Mercredi, 24. janvier 2007 6:27 18

318

Chapitre 15. Programmer PowerPoint

Tableau 15.6 Principales proprits de lobjet Shape


Top

Renvoie ou dfinit une valeur de type Single


reprsentant la distance entre le bord suprieur du
cadre de la forme et le bord suprieur du document.

Type

Renvoie une constante MsoShapeType reprsentant le


type d'une forme.

Visible

Renvoie ou dfinit la visibilit de l'objet spcifi ou la


mise en forme applique l'objet spcifi.

Width

Renvoie ou dfinit en points la largeur de l'objet


spcifi.

Le tableau 15.7 liste les principales mthodes de lobjet Shape.


Tableau 15.7 Principales mthodes de lobjet Shape
Apply

Applique la forme spcifie la mise en forme


qui a t copie l'aide de la mthode PickUp.

Copy

Copie l'objet spcifi dans le Presse-papiers.

Cut

Supprime l'objet spcifi et le place dans le


Presse-papiers.

Delete

Supprime l'objet spcifi.

Duplicate

Cre une copie de l'objet Shape spcifi, ajoute


la nouvelle forme la collection Shapes
immdiatement aprs la forme spcifie
l'origine, puis renvoie le nouvel objet Shape.

PickUp

Copie la mise en forme de la forme spcifie.

ScaleHeight

Met l'chelle la hauteur de la forme selon un


facteur spcifi.

ScaleWidth

Met l'chelle la largeur de la forme selon un


facteur spcifi.

Select

Slectionne l'objet spcifi.

SetShapesDefaultProperties

Applique le formatage de la forme spcifie la


forme par dfaut.

Chap15.fm Page 319 Mercredi, 24. janvier 2007 6:27 18

Numros et numrations

319

NUMROS ET NUMRATIONS
Nous avons dj vu le grand intrt de la technologie Intellisense
qui offre au programmeur, quand il code une macro, une aide en
ligne sur la syntaxe des mthodes et des proprits. Ainsi, quand on
souhaite dessiner sur une diapositive PowerPoint un objet Shape, il
est plus facile de slectionner le type de la forme dans une liste
droulante plutt que de se souvenir du nom ou du numro dun des
138 types de formes disponibles dans Office. Dautant plus que les
noms des constantes des numrations ont t choisis de telle
manire quils soient significatifs ; par exemple, les types de formes
msoShapeHexagon ou bien encore msoShapeParallelogram donnent une assez bonne ide du rsultat que lon va obtenir.

Figure 15.10 La technologie Intellisense facilite le codage

Concernant ces numrations, plusieurs questions viennent


lesprit :
est-il possible den avoir une liste complte autrement quen recopiant le contenu de la liste droulante Intellisense ?
comment connatre le numro qui correspond la constante de
lnumration ?
o sont stockes ces numrations ?
Pour toutes ces questions, le point de dpart est lExplorateur
dobjets que lon peut invoquer partir de lditeur de programme en
appuyant sur la touche de fonction F2. Afin dillustrer notre propos,
nous allons prendre un exemple : dans la premire liste droulante,
slectionnez PowerPoint, puis saisissez dans la zone de texte juste en
dessous la constante msoAnimEffectPathDown. Pour lancer la

Chap15.fm Page 320 Mercredi, 24. janvier 2007 6:27 18

320

Chapitre 15. Programmer PowerPoint

recherche, cliquez sur licne reprsentant une paire de jumelles. Le


rsultat de la recherche est illustr la figure 15.11.

Figure 15.11 Recherche dans lExplorateur dobjets

LExplorateur dobjets a trouv la constante msoAnimEffectPathDown qui fait partie de la classe MsoAnimEffect. Dans le bas de
lexplorateur, il est indiqu que la constante a pour valeur 127, ce qui
reprsente la valeur 7F en hexadcimal. Dans la zone Membres de
MsoAnimEffect, vous retrouvez lintgralit des constantes qui saffichent dans la liste droulante Intellisense, classes par ordre alphabtique.
En cliquant sur chacune de ces constantes, vous pouvez faire apparatre en bas de lexplorateur son numro. Vous constatez alors que la
numrotation ne suit pas lordre alphabtique. Si lon clique sur le lien
PowerPoint (affich en vert) en bas de lexplorateur, saffiche alors le
chemin de la bibliothque dobjets de lapplication (en loccurrence
PowerPoint 2003).
Le lien pointe vers le fichier MSPPT.OLB, lextension OLB signifiant Object Library, autrement dit bibliothque dobjets. Il est possible, grce un outil spcialis, dinspecter ce fichier OLB.

Chap15.fm Page 321 Mercredi, 24. janvier 2007 6:27 18

Numros et numrations

321

Figure 15.12 Indication du chemin de la bibliothque


dobjets de PowerPoint

Pour ce faire, nous allons utiliser lapplication Oleview qui est un


visualisateur dobjets COM et OLE. Oleview est un outil gratuit que
lon peut tlcharger sur le site Web de Microsoft (saisissez Oleview
dans le moteur de recherche du site Web www.microsoft.com) ; il est
galement disponible dans les kits de ressources (Resource Toolkit)
des diffrentes versions de Windows. Une fois que vous avez tlcharg puis install cet outil, faites une copie du fichier MSPPT.OLB
et stockez-la dans un rpertoire que vous aurez cr cet effet. Excutez lapplication Oleview et dans le menu File, choisissez loption
View TypeLib. Dans la bote de dialogue Ouvrir, dsignez la copie du
fichier MSPPT.OLB que vous avez faite. Une nouvelle fentre affiche
la bibliothque dobjets de PowerPoint.

Figure 15.13 Bibliothque dobjets de PowerPoint


affiche dans Oleview

Chap15.fm Page 322 Mercredi, 24. janvier 2007 6:27 18

322

Chapitre 15. Programmer PowerPoint

Dans le volet de gauche, vous avez les grands types de donnes qui
forment cette bibliothque et vous constatez la prsence dun type
nomm Enums. Cliquez sur le signe plus afin de drouler la liste des
numrations de PowerPoint. Dans cette liste, vous constatez la prsence dune numration intitule typedef enum MsoAnimEffect.

Figure 15.14 numration MsoAnimEffect

Cette liste contient 149 constantes que vous pouvez slectionner


et copier ( laide du raccourci Ctrl + C).
Vous pouvez galement fouiner dans les autres catgories dlments et vous constaterez notamment que dans la catgorie Interfaces
on retrouve les objets du modle dobjets de PowerPoint. Mme si
vous ne comprenez pas la totalit des informations qui sont visualises
laide dOleview, cela vous permet de comprendre les grandes lignes
de larchitecture objet du modle de dveloppement dOffice. Tous les
objets manipuls par Office ne sont pas stocks dans des fichiers OLB.
Par exemple, si vous recherchez dans lExplorateur dobjets la chane
msoShapeRectangle dans la bibliothque de PowerPoint, vous constaterez que cette constante ny figure pas. Pourtant, quand vous voulez
spcifier le type dun objet Shape dans lditeur de programme, cette
constante apparat bien dans la liste Intellisense. En fait, pour retrou-

Chap15.fm Page 323 Mercredi, 24. janvier 2007 6:27 18

Numros et numrations

323

ver la trace de cette constante, il faut spcifier dans la premire liste


droulante de lExplorateur dobjets loption <Toutes bibliothques>.
ce moment-l, la constante est trouve dans la bibliothque Office
dont lexplorateur nous apprend quelle est stocke dans le fichier suivant (pour Office 2003) :
C:\Program Files\Fichiers communs\Microsoft Shared\OFFICE11\
MSO.DLL
Ce fichier constitue la bibliothque dobjets de Microsoft
Office 11.0 (Office 2003).
Si vous voulez galement explorer ce fichier qui est une DLL, vous
pouvez en faire une copie et utiliser Oleview pour lexaminer. Vous
constaterez alors quil existe dans la catgorie Enums une numration intitule MsoAutoShapeType qui comporte 138 lments.

Figure 15.15 numration MsoAutoShapeType

Grce ces listes des constantes des numrations, vous pouvez


vous forger votre propre documentation lectronique. De plus, la connaissance des numros des valeurs de lnumration vous permet de
raliser des boucles pour tester toutes les valeurs de lnumration ;

Chap15.fm Page 324 Mercredi, 24. janvier 2007 6:27 18

324

Chapitre 15. Programmer PowerPoint

cest ce que nous avons fait dans ce chapitre pour tester les valeurs de
lnumration ppLayout.

MISE EN PRATIQUE
Pour illustrer notre propos, nous allons vous prsenter une macro
qui montre en situation les objets que nous venons dtudier.
Cette macro gnre automatiquement une prsentation partir du
texte dun document Word. Nous avons en effet souvent constat que
les prsentations sont crites partir de documents qui existent dj
au format Word. Plutt que de raliser une srie de copier-coller, la
macro va lire le texte du document Word et crer automatiquement
les diapositives. Notre document Word (illustr la figure 15.16) se
prsente sous la forme dune srie de paragraphes ; les paragraphes
impairs contiennent les titres des diapositives et les paragraphes pairs
contiennent les textes des diapositives.

Figure 15.16 Texte dun document Word


qui sert gnrer une prsentation

Chap15.fm Page 325 Mercredi, 24. janvier 2007 6:27 18

Mise en pratique

325

Afin de vous montrer la facilit avec laquelle ce genre de macro


peut tre crit, nous nous sommes servis du code gnr par lenregistreur de macro que nous avons ensuite intgr dans notre propre programme. Pour bien illustrer cette mthode de travail, nous avons
indiqu en gras les parties que nous avons rajoutes ou modifies par
rapport au code gnr. Vous pourrez ainsi constater que notre intervention dans le code est somme toute minime et que la majorit du
code a t crite par lenregistreur de macro.
Cet exemple de code constitue une bonne illustration de la
programmation inter-application dans Office : PowerPoint est
pilot partir dune macro Word.
Fondamentalement, le programme dclare quelques variables et
initialise une nouvelle variable objet afin de pouvoir piloter PowerPoint partir de Word. Cela permet de crer une nouvelle prsentation PowerPoint partir de Word. Ensuite, la collection des
paragraphes du texte Word est balaye grce une boucle et lintrieur de la boucle, on ajoute une diapositive et on remplit automatiquement le titre et le texte de la diapositive. La majeure partie du
code lintrieur de la boucle For Next a t gnre par lenregistreur
de macro. Ce code mriterait dtre optimis, mais pour bien vous
montrer lutilisation du code gnr, nous lavons laiss en ltat.
Sub gnre_prsentation()
' Dclaration des variables
Dim titre As Variant, para As Variant
Dim nb_para As Integer, num_para As Integer
' Nombre de paragraphes du texte Word
nb_para = ActiveDocument.Paragraphs.Count
' On dclare un nouvel objet pour pouvoir
' appeler PowerPoint partir de Word
' Ne pas oublier d'inclure la rfrence PowerPoint
' grce la commande Outils --> Rfrences
Dim AppliPPT As New PowerPoint.Application
' ajout d'une nouvelle prsentation
AppliPPT.Presentations.Add WithWindow:=msoTrue
' On balaye les paragraphes du document Word
For num_para = 1 To nb_para / 2
' Ajout d'une diapositive

Chap15.fm Page 326 Mercredi, 24. janvier 2007 6:27 18

326

Chapitre 15. Programmer PowerPoint

AppliPPT.ActiveWindow.View.GotoSlide
Index:=AppliPPT.ActivePresentation.Slides.Add(Index:=num_para,
Layout:=ppLayoutText).SlideIndex
' Rcupration du titre et du texte de la diapositive
titre = ActiveDocument.Paragraphs(num_para * 2 - 1)
para = ActiveDocument.Paragraphs(num_para * 2)
AppliPPT.ActiveWindow.Selection.SlideRange.Shapes("Rectangle
2").Select
AppliPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Select
AppliPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Charac
ters(Start:=1, Length:=0).Select
' On dfinit le titre de la diapositive avec un paragraphe de Word
With AppliPPT.ActiveWindow.Selection.TextRange
.Text = titre
With .Font
.Name = "Arial"
.Size = 44
.Bold = msoFalse
.Italic = msoFalse
.Underline = msoFalse
.Shadow = msoFalse
.Emboss = msoFalse
.BaselineOffset = 0
.AutoRotateNumbers = msoFalse
.Color.SchemeColor = ppTitle
End With
End With
AppliPPT.ActiveWindow.Selection.SlideRange.Shapes("Rectangle
3").Select
AppliPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Select
AppliPPT.ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Charac
ters(Start:=1, Length:=0).Select
' On dfinit le titre de la diapositive avec un paragraphe de Word
With AppliPPT.ActiveWindow.Selection.TextRange
.Text = para
With .Font
.Name = "Arial"
.Size = 14
.Bold = msoFalse
.Italic = msoFalse
.Underline = msoFalse
.Shadow = msoFalse
.Emboss = msoFalse
.BaselineOffset = 0
.AutoRotateNumbers = msoFalse
.Color.SchemeColor = ppForeground
End With
End With

Chap15.fm Page 327 Mercredi, 24. janvier 2007 6:27 18

327

Mise en pratique

Next num_para
End Sub

Le rsultat de la macro est illustr la figure 15.17.

Figure 15.17 Prsentation gnre


partir dun texte Word

CONCLUSION
Bien que moins important en volume que les modles dobjets de
Word et dExcel, le modle dobjets de PowerPoint nen demeure
pas moins complexe. Il est surtout difficile apprhender si on
cherche tout prix faire des analogies avec Word ou Excel.
Pour bien comprendre le modle dobjets de PowerPoint, il est
prfrable de considrer avant tout cette application comme un
programme de dessin qui rassemble des formes sur des diapositives. De la mme manire, il faut se reprsenter les objets SlideRange, ShapeRange et TextRange comme tant bien diffrents
des objets Range dans Word ou Excel.

Chap15.fm Page 328 Mercredi, 24. janvier 2007 6:27 18

328

Chapitre 15. Programmer PowerPoint

On ne peut que regretter labsence de lenregistreur de macro


dans PowerPoint 2007 et il ne faudra peut-tre pas hsiter conserver une copie dune version prcdente de PowerPoint afin de
gnrer des extraits de code et tudier le modle dobjets.

Chap16.fm Page 329 Mardi, 23. janvier 2007 5:14 17

16
XML
INTRODUCTION
XML nest pas un modle dobjets dOffice, mais il constitue la base
des objets dOffice 2007 puisque dsormais tous les documents produits par Office 2007 sont enregistrs au format XML. Mme si
XML tait dj prsent dans Office 2003, cette volution constitue
une vritable rvolution plus dun titre. Premirement, la compatibilit ascendante des documents Office est rompue : les documents
produits par Office 2007 ne sont pas compatibles avec les documents produits avec les versions antrieures dOffice (Office 2000,
Office XP et Office 2003). Microsoft a cependant sorti un pack de
compatibilit qui permet douvrir les fichiers Word, Excel et PowerPoint estampills 2007 avec une version antrieure dOffice. Si
Microsoft a choisi dadopter XML comme format de base de ses
fichiers, cest bien parce que ce format est en passe de devenir universel. Microsoft suit donc le sens de lhistoire et on ne peut que se
rjouir de cette dcision, mme si dimportants problmes de compatibilit sont prvoir. Une des consquences fondamentales du
passage XML est louverture du format des fichiers Office. En effet,
pour la premire fois dans lhistoire dOffice, on va enfin connatre
la structure des documents qui est dsormais publique. Beaucoup de
gens semblent lavoir oubli, mais jusqu Office 2003, il tait rigoureusement impossible de savoir comment un document Office tait
architectur. Le format propritaire des documents Office tait
secret et il fallait se lancer dans des oprations hasardeuses de

Chap16.fm Page 330 Mardi, 23. janvier 2007 5:14 17

330

Chapitre 16. XML

reverse engineering pour apprendre de quoi tait form un document Office. Avec Office 2007, le standard sur lequel sont bass les
documents est parfaitement connu et les spcifications des documents Office ont t publies. Ce changement dattitude est extrmement important et il y a fort parier que lon ne mesure pas
encore toutes les consquences de ce qui constitue une mini rvolution.
Dans ce chapitre, nous allons vous proposer une brve introduction
XML, tenter de vous montrer les avantages de ce format et dcrire
sommairement le nouveau format des fichiers Office 2007. Nous sommes bien conscients que XML ncessiterait un ouvrage complet pour
tre exhaustif sur ce sujet et nous ne ferons malheureusement que survoler les choses. Notre ambition est ici de faire dcouvrir XML ceux
qui ignorent ce langage et de leur donner envie daller plus loin.

DE SGML XML EN PASSANT PAR HTML


Si le langage HTML est aujourdhui parfaitement connu en raison
du succs dInternet, SGML ne lest que par quelques spcialistes,
alors que HTML nest quune drivation de SGML. Les informaticiens sont friands de normes et si aujourdhui un programme crit en
C ANSI peut tre implment sur des machines aussi diverses quun
PC, un Macintosh, une station SUN ou bien un HP 9000, cest bien
parce que trs tt, les programmeurs ont ressenti le besoin dtablir
des rgles de normalisation des langages de programmation. Ce qui a
t ralis pour les langages de programmation a bizarrement t
nglig pour les documents lectroniques et il nexiste aujourdhui
que trs peu de standards en matire de format de document, si ce
nest quelques logiciels qui aspirent devenir des standards de fait
(Word, Acrobat, etc). Celui qui a dj tent la difficile entreprise de
rassembler des documents issus de traitements de texte diffrents en
vue dune publication sait que le cauchemar nest jamais trs loin et
que bien souvent, la seule chose que lon arrive rcuprer est un
vulgaire texte en ASCII. La norme SGML tente de mettre de lordre
dans tout cela et apporte une solution ce dlicat problme.

Chap16.fm Page 331 Mardi, 23. janvier 2007 5:14 17

De SGML XML en passant par HTML

331

Histoire d'une norme


Le langage SGML, qui signifie Standard Generalized Markup Language ou langage standard de balisage gnralis, est une norme de
lOrganisation internationale de normalisation (ISO) ; intitule
ISO 8879, cette norme dcrit un langage servant au codage des textes. Ce langage comprend un ensemble de conventions servant au
balisage ou la description dun document en texte plein ; il permet
aux applications informatiques didentifier et de manipuler des parties individuelles du document. Ces conventions prcisent les codes
autoriss et obligatoires, tablissent la distinction entre les balises et
le texte lui-mme et fournissent la signification de chaque code.
Le langage SGML est un produit de lindustrie de ldition et
remonte lautomatisation des signes de correction au cours des
annes 1970. La notion dun langage de balisage gnralis a t aborde la premire fois au cours dune runion de reprsentants de lAssociation des communications graphiques et de lImprimerie du
gouvernement canadien, en 1967. Les travaux effectus la suite de
cette runion ont donn lieu la publication dune norme portant sur
le premier langage de balisage gnralis, le GML, au dbut des
annes soixante-dix. En 1978, cette norme servit tablir la premire
version de la norme SGML, mise par lAssociation des communications graphiques. En 1986, cette norme fut rvise et devint la norme
internationale ISO 8879, dans la version finale que lon connat
encore aujourdhui.
Contrairement la plupart des langages de balisage, le SGML nest
pas un produit propritaire, cest--dire quil nappartient aucun
fournisseur particulier et quil nest pas ncessaire de dtenir une
licence pour lutiliser. Nimporte qui peut donc examiner la spcification SGML et en implanter une version. De plus, SGML nest pas li
un environnement matriel particulier ni une application prcise.
Le balisage SGML nintgre pas de codes de formatage spcifiques
dans le texte dun document et sert uniquement identifier certaines
parties du document des fins de traitement ultrieur. Cette capacit
unique sparer le format, la structure et le contenu dun document et
traiter chaque partie sparment confre aux documents cods en
format SGML un degr dindpendance par rapport au matriel et au
logiciel qui reste ingal.

Chap16.fm Page 332 Mardi, 23. janvier 2007 5:14 17

332

Chapitre 16. XML

Description de SGML
Un document SGML est compos de plusieurs parties :

la synthse du document
la dfinition du type de document (DTD)
linstance du document
la spcification de sortie.

La synthse du document sert prciser les aspects fondamentaux


du dialecte SGML utilis. Cest ce niveau que lon tablit les
paramtres implicites, que lon dtermine les options et les sparateurs, que lon prcise le jeu de caractres qui sera utilis ainsi que les
autres fonctions similaires. La synthse du document peut tre maintenue sous forme de table dans les applications de traitement plutt
que dans le document mme et demeurer ainsi invisible aux yeux de
lutilisateur.
La dfinition du type de document (DTD) sert prciser la structure du document. Ainsi, une organisation qui possderait un vaste
programme ddition pourrait recourir une DTD pour dfinir une
catgorie complte de documents similaires. Par exemple, on pourrait
attribuer la mme DTD tous les manuels administratifs et une autre
tous les catalogues. Un tel partage des DTD constitue un procd
conomique et confre en mme temps un aspect uniforme et commun aux documents dune organisation. La principale fonction dune
DTD consiste prciser lensemble des balises utilises pour le codage
du texte dun document, y compris les noms des balises relles, la relation entre les balises, lordre dans lequel elles apparaissent dans le
document et tous les attributs de qualification qui sappliquent aux
balises individuelles. Une autre fonction importante de la DTD est de
dfinir le format des liens avec les autres documents.
La DTD reprsente donc le vocabulaire du balisage et la dfinition
hirarchique du document ; elle utilise la syntaxe concrte : les dclarations dlments qui dfinissent quels identificateurs gnriques
peuvent apparatre dans chaque lment et dans quel ordre, les dclarations dentits qui dfinissent les entits auxquelles on peut se rfrer dans un document. Aprs une compilation syntaxique, la DTD
permet de sassurer que le document est valide et conforme.

Chap16.fm Page 333 Mardi, 23. janvier 2007 5:14 17

De SGML XML en passant par HTML

333

Lcriture dune DTD ncessite la dclaration des lments, des


attributs et des entits (pour les similitudes). Pour cela un ensemble
de balises est prdfini.
chaque lment de la structure, il va falloir associer un nom,
abrg de prfrence, mais permettant tout de mme une lecture
rapide du balisage. Un quilibre doit tre trouv entre longueur et
clart. un lment il ne peut correspondre quun seul nom. Il sera
form de huit caractres au plus.
Il faut donc crire tous les lments en les qualifiant avec les attributs et en respectant larborescence que lon a dfinie. Les attributs
permettent de grer dynamiquement les renvois lintrieur du document. Il existe deux attributs particuliers, appartenant au langage, ID
(identificateur) et RID (renvoi a un identificateur).
Linstance du document reprsente le texte rel du document comportant les balises SGML qui lui ont t intgres et qui identifient les
diverses parties du texte. La plupart de ces textes constituent des
fichiers ASCII standard crs laide dun logiciel de traitement de
texte ou dun diteur spcialis SGML. Mme si une instance de
document peut partager une DTD avec dautres documents, comme
nous lavons mentionn prcdemment, elle ne peut se conformer
qu une seule DTD et ne peut faire appel aux ensembles de balises,
aux valeurs implicites ni aux dfinitions de plusieurs DTD.
La spcification de sortie fournit de linformation sur la mise en
forme des lments de texte spcifiques, comme lil du caractre, la
mise en retrait et la taille de la police. Elle est particulirement utile
lorsque vous devez prserver le format exact du document, comme
dans le cas des transmissions de formules. Il existe actuellement deux
types de spcifications : FOSI, acronyme de Formatting Output Specification Instance, qui est utilise pour les imprims, et DSSSL, abrviation de Document Style Semantic and Specification Language, qui
est utilise pour tous les autres types de supports ainsi que les imprims. La spcification DSSSL est une norme ISO.

Objectif de SGML
Lobjectif de SGML est de fournir une syntaxe cohrente et non
ambigu qui comprend :

Chap16.fm Page 334 Mardi, 23. janvier 2007 5:14 17

334

Chapitre 16. XML

une syntaxe abstraite pour le balisage descriptif des lments dun


document ;
une syntaxe concrte de rfrence qui relie la syntaxe abstraite
des caractres particuliers servant de dlimiteurs des quantits ;
des dclarations de balisages ;
des moyens dutiliser des contenus textuels arbitraires ;
des dlimiteurs particuliers des proprits mtalinguistiques.
La norme SGML permet la dfinition de schmas de balisage gnralis visant des applications spcifiques. Par exemple, un diteur dfinit un schma de balisage pour dcrire les manuels, ce qui permet un
change illimit darticles avec tous les diteurs possibles. Alors
SGML fournit des rgles pour parser (raliser une analyse syntaxique)
les documents SGML. De plus, tout document cod selon un schma
SGML peut tre transfr vers un parseur (analyseur syntaxique)
SGML et reconstruit fidlement, en prservant toutes les donnes de
contenu, de structure, de mise en page.
Ainsi, SGML est une ossature ou une mthodologie pour dvelopper des mthodes normalises pour le balisage de document. SGML
nest pas utilis comme langage de balisage, mais comme moyen de
crer des schmas de codage en crant des balises respectant la syntaxe du schma de base.

Une DTD particulire : HTML


Lapplication SGML la plus connue et la plus utilise est le format
HTML ; peu de gens le savent, mais HTML nest en fait quune
DTD SGML qui est spcialise dans laffichage des documents du
Web. HTML va cependant plutt lencontre de la philosophie
SGML qui vise sparer le balisage du contenu dun document du
balisage de son apparence. HTML comporte un mlange de balises
de prsentation et de balises dcrivant le contenu; la structure (mais
en nombre trs limit).
Le danger de mlanger des balises de formatage avec des balises de
structure devient vident quand on veut modifier rapidement lapparence dun texte. Supposons que lon ait balis une bibliographie de
500 titres en HTML et que les mots trangers, les titres des monographies, et les titres des priodiques soient en italique. On vous

Chap16.fm Page 335 Mardi, 23. janvier 2007 5:14 17

De SGML XML en passant par HTML

335

demande de changer de feuille de style pour suivre plutt les normes


de lAPA o les titres doivent apparatre souligns. Comment ferezvous vos modifications sans toucher aux mots trangers ? Vous ne
pourrez pas effectuer une opration de recherche-remplacement car il
ny a rien qui ressemble plus une balise <i> quune autre balise <i>.
Vous devrez dpartager visuellement les italiques reprsentant des
titres des italiques reprsentant des mots trangers. Si les balises
avaient t <titre de priodique>, <mot tranger> et <titre de monographie>, vous nauriez eu quun seul changement effectuer, dans le
fichier externe contenant la feuille de style associe la DTD.
On voit aussi que les balises HTML ne peuvent pas dcrire toutes
les catgories de documents lectroniques disponibles sur le Web.
Avec HTML, tout doit entrer dans le mme moule. Donc, si on
rsume, HTML est un langage qui comporte trois avantages principaux :
La simplicit : HTML est facile apprendre et comprendre.
Les liens : les liens hypertexte sont trs faciles crer et il ny a
quune faon de lier des objets sur Internet : la balise <A ...>. On
doit baliser la source et la cible du lien.
La portabilit : tant donn la faible quantit de balises, il est trs
facile dintgrer la DTD HTML dans les navigateurs Internet. On
na pas se proccuper de savoir si lautre logiciel saura lire nos
balises HTML.
En revanche, HTML comporte des faiblesses au niveau de :
Lintelligence. Avec SGML, on peut transmettre notre intelligence du texte au moyen de balises spcifiques. Cette absence
de notion de contenu spcifique dans HTML cause dnormes
problmes aux moteurs de recherche.
Ladaptation. Pour pouvoir afficher des tableaux en HTML, il a
fallu attendre la version 3 du langage HTML et attendre le long
processus de dlibration du comit HTML au W3C. Cette version a t trs longue venir, cause de guerres de religion au
W3C, o les partisans des documents structurs affrontaient les
partisans de la simplicit. En SGML, il na suffi que demprunter
une solution dveloppe ailleurs (chez les militaires), de linclure
dans une nouvelle DTD et on pouvait faire des tableaux.

Chap16.fm Page 336 Mardi, 23. janvier 2007 5:14 17

336

Chapitre 16. XML

Lentretien. Les liens en HTML sont souvent briss. HTML a t


conu comme si les objets prsents sur Internet ne pouvaient
changer de place. Or, cest ce quils font tout le temps et tout se
passe comme si on classait les documents en bibliothque en
disant : ce livre sera class au 3me tage dans la 2me range sur
la 4me tablette et la 14me position partir de la droite .
Quarrive-t-il quand le 12me livre est emprunt ? Erreur 404,
document non trouv ! Cest aussi primitif que cela. Il y a donc
ncessit damliorer le systme de liens du HTML. Un autre problme dentretien mentionn plus haut, le mlange des balises
contrlant lapparence, rend la rutilisation du texte trs difficile
et laborieuse.
SGML reprsente donc la solution aux principaux dsavantages de
HTML, mais cette solution se fait au dtriment des principaux avantages de HTML. SGML est en effet compliqu car les textes doivent
tre valids ; de plus, les liens hypertexte sont plus riches, mais ils utilisent plusieurs mthodes plus complexes. Enfin, la portabilit SGML
est plus problmatique sur Internet : on doit installer un logiciel
accessoire pour visualiser un document SGML et on doit transmettre
la DTD en mme temps que le document.
Malgr les merveilles que peut raliser SGML, on doit constater
que plus de vingt ans aprs sa reconnaissance comme norme ISO,
SGML na pas atteint une masse critique chez les millions dusagers du
Web. Un groupe de travail du consortium W3C sest donc attaqu
aux problmes de HTML la fin de lanne 1996 avec pour objectif
de chercher un moyen terme entre la simplicit de HTML et la complexit de SGML. Les noms qui ont t suggrs pour ce nouveau langage rvlent bien lesprit dans lequel travaillaient ses dveloppeurs :
MGML (Minimal Generalized Markup Language), SLIM (Structured
Language for Internet Markup), MAGMA (Minimal Architecture for
Generalized Markup Applications).
Finalement cest lacronyme XML (eXtensible Markup Language)
qui emporta le plus grand nombre de votes parmi les membres du
comit. XML combine les points forts de SGML la simplicit de
HTML. La norme SGML comporte plus de 300 pages, alors que XML
en compte 32.

Chap16.fm Page 337 Mardi, 23. janvier 2007 5:14 17

De SGML XML en passant par HTML

337

Description de XML
Le Langage de balisage extensible (en anglais Extensible Markup
Language ou en abrg XML) dcrit une classe dobjets de donnes
appels documents XML et dcrit partiellement le comportement
des programmes qui les traitent. XML est un profil dapplication ou
une forme restreinte de SGML. Par construction, les documents
XML sont des documents conformes SGML.
Les documents XML se composent dunits de stockage appeles
entits, qui contiennent des donnes analysables ou non. Les donnes
analysables se composent de caractres, certains formant les donnes
textuelles, et le reste formant le balisage. Le balisage dcrit la structure
logique et la structure de stockage du document. XML fournit un
mcanisme pour imposer des contraintes ces structures.
Un module logiciel appel processeur XML est utilis pour lire les
documents XML et pour accder leur contenu et leur structure.
On suppose quun processeur XML effectue son travail pour le compte
dun autre module, appel lapplication. Cette spcification dcrit le
comportement requis dun processeur XML, cest--dire la manire
dont il doit lire des donnes XML et les informations quil doit fournir
lapplication.

Objectifs de XML
XML a t dvelopp par un groupe de travail du Consortium du
World Wide Web (W3C) en 1996. Les objectifs de conception de
XML sont les suivants :
XML devra pouvoir tre utilis sans difficult sur Internet ;
XML devra soutenir une grande varit dapplications ;
XML devra tre compatible avec SGML ;
Il devra tre facile dcrire des programmes traitant les documents
XML ;
Le nombre doptions dans XML doit tre rduit au minimum,
idalement aucune ;
Les documents XML devraient tre lisibles par lhomme et raisonnablement clairs ;
La conception de XML devra tre prpare rapidement ;

Chap16.fm Page 338 Mardi, 23. janvier 2007 5:14 17

338

Chapitre 16. XML

La conception de XML sera formelle et concise ;


Il devrait tre facile de crer des documents XML ;
La concision dans le balisage de XML est de peu dimportance.
Le 10 fvrier 1998, le W3C a publi la recommandation de XML
que lon peut trouver ladresse suivante :
http://www.w3.org/TR/REC-xml
XML comporte trois parties importantes :
la DTD,
XSL,
Xlink.
Dans XML, on peut utiliser une DTD, mais ce nest pas obligatoire.
Si on utilise une DTD, le document sera dit valide ; cest--dire
quil fera appel cette DTD et sy conformera. Si on nutilise pas de
DTD, le document XML devra tre bien form ; il ne devra comporter aucune ambigut dans le balisage. Par exemple, tous les attributs devront tre entre guillemets (HTML de son ct tolre trs
facilement cet oubli) ; les lments ne pourront tre vides ; chaque
lment X devra se terminer par une balise de fermeture </X> ; mme
des lments vides en HTML, comme une ligne horizontale <HR>,
devront, en XML, scrire <HR/> ou encore <HR></HR>. De plus,
le document devra indiquer explicitement quil nutilise pas de DTD
en dbutant ainsi :
<?XML version="1.0" standalone = "yes"?>
XSL (Extensible Style Language) est le langage utilis pour dfinir les
feuilles de style qui seront associes aux documents XML. Cest le
fichier XSL qui permettra de dfinir que tel lment XML doit tre
affich avec telle police, de telle couleur, etc. Ces dcisions seront,
grce XSL, prises par le crateur du document qui aura ainsi un
meilleur contrle sur lapparence de son document. Il pourra galement faire rfrence un fichier XSL public dj existant. Le XSL
sinspire de deux normes de feuilles de style, le Cascading Style Sheet,
qui est beaucoup utilis avec les fichiers HTML et le DSSSL (Document Style Semantics and Specification Language) qui est une norme de
feuilles de style plus complexe. Encore une fois, les dveloppeurs choisissent le moyen terme : XSL emprunte aux normes CSS et DSSSL.

Chap16.fm Page 339 Mardi, 23. janvier 2007 5:14 17

339

XML en action

XLink (XML Linking Language) est le langage de description des


liens hypertexte en XML. XLink permet de rsoudre les problmes de
liens hypertexte briss quon retrouve actuellement sur Internet.
XLink est bas sur la norme ISO 10744, (Technologies de linformation : langage de structuration hypermdia/vnementiel) plus
connue sous le nom de HyTime. XLink permet, entre autres, des liens
bidirectionnels, des liens vers des cibles sur Internet non balises au
pralable, des liens qui peuvent tre grs dans un fichier extrieur
linstance du document et mme des attributs sur des liens qui permettent de dfinir le type de lien (lien vers une dfinition, lien extrieur,
etc.).

XML EN ACTION
La description formelle et thorique de XML peut tre assez indigeste et pour apprhender au mieux ces nouveaux concepts, le plus
simple est encore de prendre un exemple.
Comme nous lavons dj soulign, XML tait dj prsent dans
Office 2003 o chaque document pouvait tre enregistr au format
XML. Pour bien vous faire comprendre la diffrence entre HTML et
XML, nous allons prendre lexemple dune table Access 2003 qui contient uniquement des noms et des prnoms.

Figure 16.1 Exemple de table Access

Si nous enregistrons cette table au format HTML, nous obtenons


un fichier HTML qui affiche correctement la table Access dans un
format tabulaire.

Chap16.fm Page 340 Mardi, 23. janvier 2007 5:14 17

340

Chapitre 16. XML

Figure 16.2 Affichage dune table Access au format HTML

Si lon prend la peine de regarder le fichier HTML, on saperoit


alors que lon a perdu des informations :
<HTML DIR=LTR>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;
charset=Windows-1252">
<TITLE>Personnes</TITLE>
</HEAD>
<BODY>
<TABLE DIR=LTR BORDER>
<CAPTION>Personnes</CAPTION>
<TR>
<TD DIR=LTR ALIGN=LEFT>Lampion</TD>
<TD DIR=LTR ALIGN=LEFT>Sraphin</TD>
</TR>
<TR>
<TD DIR=LTR ALIGN=LEFT>Bourdon</TD>
<TD DIR=LTR ALIGN=LEFT>Sigismond</TD>
</TR>
<TR>
<TD DIR=LTR ALIGN=LEFT>Orient</TD>
<TD DIR=LTR ALIGN=LEFT>Luc</TD>
</TR>
</TABLE>
</BODY>
</HTML>

Chap16.fm Page 341 Mardi, 23. janvier 2007 5:14 17

XML en action

341

On a en effet perdu les informations sur la nature des donnes du


tableau et on ne sait plus du tout que les donnes textuelles affiches
reprsentent des noms et des prnoms.
Si lon convertit la table Access 2003 au format XML, Access
ouvre la bote de dialogue Exportation XML qui permet de choisir
lexportation des donnes, du schma ou de la mise en forme.

Figure 16.3 Exportation dune table Access au format XML

Le fait de cocher la case Donnes produira un fichier de donnes


XML ; en cochant la case Schma de donnes, Access va crer un
fichier suffix .XSD qui reprsente le schma des donnes XML, et en
cochant la case Prsentation des donnes, Access gnrera une feuille
de style XSL. Access cre galement un fichier suffix HTM qui fait
rfrence tous ces fichiers.
Laffichage du fichier HTM est relativement similaire celui du
fichier HTML, mais cette fois-ci les colonnes comportent des en-ttes
qui indiquent le type de donnes.

Figure 16.4 Affichage dune table Access au format XML

Chap16.fm Page 342 Mardi, 23. janvier 2007 5:14 17

342

Chapitre 16. XML

Qui plus est, si lon examine le code source du fichier XML, on


saperoit alors que les donnes sont clairement balises et notamment que la diffrence entre le champ Nom et Prnom est parfaitement tablie.
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Personnes.xsd" generated="200612-21T20:53:20">
<Personnes>
<Nom>Lampion</Nom>
<Prnom>Sraphin</Prnom>
</Personnes>
<Personnes>
<Nom>Bourdon</Nom>
<Prnom>Sigismond</Prnom>
</Personnes>
<Personnes>
<Nom>Orient</Nom>
<Prnom>Luc</Prnom>
</Personnes>
</dataroot>

Le fichier XML fait rfrence au fichier Personnes.xsd qui constitue le schma XML des donnes. Dans ce fichier, on va trouver des
indications sur le type des donnes :
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Personnes" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Personnes">
<xsd:annotation>
<xsd:appinfo/>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>

Chap16.fm Page 343 Mardi, 23. janvier 2007 5:14 17

Le nouveau format des fichiers Office 2007

343

<xsd:element name="Nom" minOccurs="0" od:jetType="text"


od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Prnom" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

On apprend, entre autres, que les champs Nom et Prnom sont de


type Caractre (nvarchar) et que leur longueur maximale est de 50
caractres.
Grce cet exemple simple, on apprhende beaucoup mieux
lavantage considrable quapporte XML par rapport HTML en
matire de structuration de donnes. En XML, on ne perd aucune
information et le fond (les donnes XML et le schma) est isol de la
forme (la feuille de styles).

LE NOUVEAU FORMAT DES FICHIERS OFFICE 2007


Comme nous lavons dj maintes fois soulign, Office 2007 inaugure donc un nouveau format de fichier bas sur XML. Outre la nouveaut du format XML, Microsoft a souhait faire du format des
fichiers Office un standard ouvert. Baptis Office Open XML, ce
nouveau format de fichier est par consquent entirement document et vous pouvez vous rendre sur le site de lECMA pour consulter ses spcifications qui ont t publies en dcembre 2006 :
http://www.ecma-international.org/publications/standards/Ecma376.htm

Chap16.fm Page 344 Mardi, 23. janvier 2007 5:14 17

344

Chapitre 16. XML

Figure 16.5 Spcifications du nouveau format Office Open XML

Si vous avez le courage de tlcharger ce document au format PDF,


vous constaterez quil pse prs de 50 Mo et totalise plus de 6 000
pages. Inutile de dire que nous ne prtendons pas tre exhaustifs sur le
sujet
Pour apprhender le nouveau format, le plus simple est de crer un
fichier Office 2007 et de regarder sa structure. Pour notre exemple,
nous avons choisi un fichier Word 2007 dont lextension est docx.

Figure 16.6 Exemple de fichier Office 2007


au nouveau format Office Open XML

Si vous ne possdez pas Office 2007, vous pouvez nanmoins lire ce


type de fichier aprs avoir install le Pack de compatibilit Microsoft

Chap16.fm Page 345 Mardi, 23. janvier 2007 5:14 17

Le nouveau format des fichiers Office 2007

345

Office pour les formats de fichiers Word, Excel et PowerPoint 2007


qui, au moment o nous mettons sous presse est disponible ladresse
suivante :
http://www.microsoft.com/france/office/2007/beta/converter.mspx
Vous devez savoir que tous les fichiers dOffice 2007 sont en fait des
fichiers compresss au format Zip. Ainsi, pour dcortiquer de lintrieur un fichier Office, il faut commencer par modifier son extension.
Dans notre exemple, nous allons par consquent modifier notre
fichier Test.docx en Test.zip. Bien entendu, Windows nous signale
que si lon modifie lextension du fichier, ce dernier risque dtre inutilisable, mais nous pouvons sans problme ngliger cet avertissement.
On obtient donc au final un fichier Zip que lon peut dcompresser.

Figure 16.7 Exemple de fichier Office 2007


au nouveau format Office Open XML

Larchive se dcompresse en plusieurs dossiers et sous-dossiers.


Dans le dossier word, vous trouverez un fichier intitul document.xml
qui contient le texte de notre fichier Word et que vous pouvez visualiser dans un navigateur Internet.

Figure 16.8 Fichier XML du texte dun document Word 2007

Chap16.fm Page 346 Mardi, 23. janvier 2007 5:14 17

346

Chapitre 16. XML

laide de la documentation disponible sur le site de lECMA,


vous pouvez tenter de voir quel rle joue chaque fichier et essayer de
comprendre larchitecture du nouveau format des documents Office.

CONCLUSION
Ces quelques pages ont pour ambition de vous permettre dentrevoir la rvolution quapporte le format XML. Si XML est pour
vous une terre inconnue, nous ne saurions trop vous encourager
creuser ce domaine qui prend aujourdhui de plus en plus
dimportance en informatique. Vritable esperanto des formats
de documents, XML favorise linter-oprabilit. Le fait davoir
adopt le format Office Open XML dans Office 2007 signifie que
Microsoft a mis un terme sa logique de documents propritaires
qui tait tant dcrie ( juste titre dailleurs). Relle nouveaut
dOffice 2007, le format XML en est encore ses dbuts dans
Office, mais on peut penser que de trs nombreuses applications
vont prochainement prendre en compte cette fonctionnalit.

Partie04.fm Page 347 Mardi, 23. janvier 2007 5:19 17

PARTIE 4

Programmation
VBA avance

Partie04.fm Page 348 Mardi, 23. janvier 2007 5:19 17

Chap17.fm Page 349 Mardi, 23. janvier 2007 5:33 17

17
Crer des formulaires
Un programme sert traiter des donnes et il faut donc quil existe
un moyen pour rcuprer des informations en provenance de lutilisateur. Dans les chapitres prcdents, nous avons dj utilis les
fonctions MsgBox et InputBox pour transmettre des informations
aux programmes. Si ces deux fonctions remplissent bien leur rle
lorsquil sagit de communiquer une information, elles sont nettement insuffisantes ds que le programme a besoin de toute une srie
dinformations. Cest alors que les formulaires UserForm rentrent en
jeu. Grce eux, vous allez pouvoir crer des botes de dialogue
beaucoup plus sophistiques qui seront parfaitement adaptes vos
besoins.
Ceux qui utilisent Access savent ce quest un formulaire ; il existe
galement dans Word des formulaires qui sont des documents structurs contenant des espaces rservs pour la saisie dinformations. Les
formulaires que nous allons prsent tudier ne sont pas diffrents
dans leur principe et sont baptiss UserForm (formulaire utilisateur) ;
ils sont crs lintrieur de lditeur de programmes et offrent un
moyen efficace dchanger des informations entre lutilisateur et le
programmeur.
Comme tout est objet dans Windows, les formulaires ne drogent
pas cette rgle et ils bnficient ce titre dun modle dobjets que
nous vous prsentons figure 17.1.

Chap17.fm Page 350 Mardi, 23. janvier 2007 5:33 17

350

Chapitre 17. Crer des formulaires

Figure 17.1 Modle dobjets Microsoft Forms

Vous noterez que dans certains ouvrages en franais, on emploie le


terme feuille la place de formulaire.

EXEMPLE DE USERFORM PAS PAS


Si la saisie dune information avec la fonction InputBox se rvle
assez pratique, il faut reconnatre que ds quon a plusieurs informations demander un utilisateur, ce systme ne se rvle pas trs
pratique ; en effet, lutilisateur doit valider chaque rponse individuellement et na pas une vision globale de lensemble de ses choix.
Pour remdier ces problmes, il faut crer un formulaire UserForm.
Nous allons reprendre notre exemple de macro de calendrier qui
permet de crer un calendrier du mois en cours. Cette limitation
peut poser de nombreux problmes et il suffirait pour rendre le programme plus efficace de faire choisir lutilisateur le mois et lanne
pour lesquels il souhaite un calendrier. Deux appels une fonction
InputBox pourraient rsoudre notre problme, mais vous allez voir
que la cration dun formulaire, mme si elle est plus complexe, permet une solution beaucoup plus lgante.
Pour raliser notre nouveau programme, excutez Word et invoquez lditeur Visual Basic.
Dans la fentre Projet, vous dcouvrez le projet qui correspond au
document que vous venez douvrir. Si le document vide dans lequel
vous allez crer le UserForm porte un autre numro que Document1,
cela na aucune importance.

Chap17.fm Page 351 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

351

Faites un clic droit sur le nom du projet, Project (Document1), et


choisissez la commande InsertionUserForm :

Figure 17.2 Insertion dun UserForm dans un projet

Ceci a pour effet dafficher une nouvelle fentre qui contient une
grille ainsi quune bote outils.

Figure 17.3 Grille du formulaire et bote outils

Cette grille est un canevas sur lequel nous allons dessiner notre formulaire et la bote outils renferme des lments dinterface utilisateur appels contrles que nous pouvons placer sur le formulaire.
Le formulaire comporte des poignes qui permettent de modifier la
taille de la fentre. Dans la barre de titre de la fentre apparat le
libell UserForm1. Commenons par modifier cela : faites un clic

Chap17.fm Page 352 Mardi, 23. janvier 2007 5:33 17

352

Chapitre 17. Crer des formulaires

droit sur le formulaire et choisissez Proprits. Une autre fentre apparat dans lditeur :

Figure 17.4 Fentre Proprits du formulaire

Il sagit de la feuille de proprits du formulaire. En effet, les formulaires, qui sont des objets, sont par consquent dots de proprits et
de mthodes. Le grand avantage des formulaires par rapport aux autres
objets, cest que leurs proprits sont dfinies de manire interactive,
par le biais de la feuille de proprits ; on na ainsi pas besoin dcrire
du code pour initialiser les proprits. La premire proprit qui apparat dans la feuille est Name et a pour valeur UserForm1. Changez
cette proprit et saisissez Calendrier. Vous pouvez constater que ceci
ne modifie pas le titre de la fentre, ce qui signifie quil existe une
autre proprit pour grer cela. Il sagit de la proprit Caption et vous
allez modifier sa valeur en saisissant Choix du mois et de l'anne. Ds
que vous avez modifi la feuille de proprits, le titre de la fentre est
chang. Vous remarquerez quil existe de nombreuses autres proprits
concernant ce formulaire et vous pouvez dcouvrir leur utilit en
essayant de modifier leur valeur.
Il faut ensuite nous consacrer aux contrles du formulaire. Un
contrle est un objet dinterface qui permet de stocker des informations ; vous connaissez tous ces contrles parce quon les rencontre
dans les botes de dialogue des applications Windows. Examinons
cependant lensemble des contrles que propose la bote outils.

Chap17.fm Page 353 Mardi, 23. janvier 2007 5:33 17

353

Exemple de UserForm pas pas

Nous nvoquerons ici que les contrles standard, mais vous devez
savoir quil est possible de rajouter la bote outils dautres contrles (des contrles ActiveX) qui procurent des fonctionnalits supplmentaires.
Le tableau 17.1 dcrit les contrles dans leur ordre dapparition
dans la bote outils.
Tableau 17.1 Contrles standard de la bote outils
Nom de loutil

Nom du contrle

Slectionner des
objets

Description
L'outil Slectionner des objets est le seul
lment de la bote outils qui ne trace
pas un contrle. Une fois slectionn, il
permet de dplacer ou de
redimensionner un contrle
prcdemment trac sur un formulaire.

Intitul

Label

Permet d'insrer une chane de texte non


modifiable par l'utilisateur, comme la
lgende d'une image.

Zone de texte

TextBox

Contient du texte insrable ou


modifiable par l'utilisateur.

Zone de liste
modifiable

ComboBox

Contrle runissant les caractristiques


de la zone de liste et de la zone de texte.
L'utilisateur peut choisir un lment dans
la liste ou entrer une chane dans la zone
de texte.

Zone de liste

ListBox

Permet d'afficher une liste d'lments


que l'utilisateur peut slectionner. Il est
possible de faire dfiler la liste si tous les
lments ne peuvent tre affichs
simultanment.

Case cocher

CheckBox

Cre une case que l'utilisateur peut


facilement slectionner pour activer ou
dsactiver un lment ou slectionner
plusieurs options parmi des choix
multiples.

Bouton doption

OptionButton

Permet d'afficher plusieurs choix, l'utilisateur


ne pouvant en slectionner qu'un seul.

Chap17.fm Page 354 Mardi, 23. janvier 2007 5:33 17

354

Chapitre 17. Crer des formulaires

Tableau 17.1 Contrles standard de la bote outils


Nom de loutil

Nom du contrle

Description

Bouton bascule

ToggleButton

Cre un bouton basculant entre deux


positions.

Cadre

Frame

Permet de crer un groupe de contrles


graphique ou fonctionnel. Pour grouper
des contrles, placez d'abord l'lment
Frame, puis faites glisser des contrles
l'intrieur du cadre.

Bouton de
commande

CommandButton

Cre un bouton que l'utilisateur peut


slectionner pour excuter une
commande.

Contrle Onglet

TabStrip

Permet de dfinir plusieurs pages pour la


mme zone d'une fentre ou d'une bote
de dialogue de votre application.

Multipage

MultiPage

Prsente en un mme ensemble


plusieurs crans d'informations.

Dfilement

ScrollBar

Outil graphique permettant de parcourir


rapidement une longue liste d'lments
ou une grande quantit d'informations,
d'indiquer une position sur une chelle,
d'entrer des donnes ou d'indiquer une
vitesse ou une quantit.

Toupie

SpinButton

Contrle de compteur utilisable avec un


autre contrle pour incrmenter ou
dcrmenter des nombres. Il permet
galement de faire dfiler vers l'avant et
vers l'arrire une plage de valeurs ou une
liste d'lments.

Image

Image

Affiche une image sur la feuille partir


d'une image bitmap, d'une icne ou
d'un mtafichier. Les images affiches
dans un contrle Image ont un usage
purement dcoratif.

Quand on parle dun contrle, on le dsigne aussi bien par le nom de


loutil qui sert le dposer sur le formulaire que par son nom dobjet.
Ainsi, vous entendrez parler de zone de liste ou bien de ListBox.

Chap17.fm Page 355 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

355

Pour notre programme, nous avons besoin de trois contrles :


un contrle pour stocker le mois,
un contrle pour stocker lanne,
un contrle pour valider le formulaire.
Le choix du type de contrle est trs important et il nest pas toujours facile faire car il existe bien souvent de nombreuses possibilits
pour arriver au mme rsultat. Prenons lexemple du contrle pour
stocker le mois de notre calendrier : on peut choisir parmi les cinq
possibilits suivantes :

TextBox
ListBox
ComboBox
OptionButton
ScrollBar

Dans la mesure o il sagit dune liste ferme (il ny a que 12 mois),


un contrle TextBox ne parat pas trs appropri. Nous choisirons
donc un contrle ComboBox, mais les trois autres types de contrles
sont galement possibles.
Pour la saisie de lanne, nous opterons pour un contrle TextBox.
Encore une fois, dautres choix auraient t tout aussi lgitimes.
Pour la validation du formulaire, seul un contrle Bouton de commande simpose vritablement.
Pour placer un contrle sur un formulaire, il faut au pralable choisir loutil dans la bote outils puis dessiner, laide de la souris, un
cadre sur le formulaire afin de dsigner lemplacement du contrle :

Figure 17.5 Placement dun contrle sur un formulaire

Chap17.fm Page 356 Mardi, 23. janvier 2007 5:33 17

356

Chapitre 17. Crer des formulaires

Quand on relche le bouton de la souris, le contrle est plac sur le


formulaire. Si lemplacement ne convient pas, on peut dplacer le
contrle, voire le supprimer (clic droit pour appeler un menu contextuel et commande Supprimer). Si les dimensions du contrle ne sont
pas conformes vos souhaits, vous pouvez galement modifier sa taille
laide des huit poignes qui encerclent lobjet.
On ralise la mme opration pour le contrle Zone de texte et
pour le Bouton de commande pour arriver au rsultat suivant :

Figure 17.6 Contrles ComboBox, TextBox


et CommandButton sur un formulaire

Vous pouvez constater que la feuille de proprits ne prsente plus


les proprits du formulaire mais celles de lobjet actif ; la figure 17.7
illustre la feuille de proprits de lobjet CommandButton1.

Figure 17.7 Feuille de proprits


dun objet CommandButton

Chap17.fm Page 357 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

357

En fait, la liste droulante au sommet de la feuille de proprits prsente tous les objets du formulaire (y compris le formulaire lui-mme) et
on peut donc consulter les proprits dun objet particulier en le choisissant dans la liste. Le fait de slectionner un des lments de cette liste
ou de cliquer sur un objet dans le formulaire revient au mme.
Vous remarquerez que les noms des contrles sont forms partir du nom
du type de contrle suivi dun numro. Il est bien videmment possible de
modifier ces noms, comme nous lavons fait pour le nom du formulaire et,
grce la feuille de proprits, vous affecterez les noms mois, annee, et valider respectivement aux contrles ComboBox1, TextBox1 et
CommandButton1. De plus, vous modifierez la proprit Caption du bouton de commande pour lui attribuer la valeur Crer le calendrier. Afin de
mieux nous rendre compte de laspect visuel de notre bote de dialogue,
nous allons la tester. Pour ce faire, cliquez sur le formulaire pour le slectionner, puis cliquez sur le bouton Excuter Sub/UserForm dans la barre doutils
de lditeur ( ). Ceci a pour effet dafficher notre formulaire (figure 17.8).

Figure 17.8 Aspect visuel du formulaire

Bien videmment, il ne sagit pour linstant que dune coquille vide


et les seules choses que vous puissiez faire avec ce formulaire sont de
saisir du texte dans la zone de texte et de fermer la fentre en cliquant
dans la case de fermeture. Si vous pensez que le titre de la bote de dialogue nest pas assez explicite, vous pouvez ventuellement rajouter
des contrles Label affichant les libells Mois et Anne.
Il nous reste encore beaucoup de travail pour que notre programme
de calendrier fonctionne.
Occupons-nous de la ComboBox qui, pour linstant, ne contient
rien du tout. En consultant la documentation sur lobjet ComboBox,
on peut voir quil possde une mthode Additem qui ajoute un lment la liste. Pour remplir notre liste avec les noms des mois, il va
donc falloir crire un programme de ce style :

Chap17.fm Page 358 Mardi, 23. janvier 2007 5:33 17

358

Chapitre 17. Crer des formulaires

mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem

("Janvier")
("Fvrier")
("Mars")
("Avril")
("Mai")
("Juin")
("Juillet")
("Aot")
("Septembre")
("Octobre")
("Novembre")
("Dcembre")

Le vritable problme rside dans le fait quon ne sait pas trs bien
pour linstant o placer ce code pour quil soit excut au bon endroit.
Nous avons dj voqu au chapitre 12 le rle des vnements dans
les formulaires Access ; les vnements sont bien sr trs importants
dans la programmation des UserForm.
Le plus simple pour apprhender la notion dvnement est de
donner quelques exemples. Voici un tableau listant quelques objets et
des vnements auxquels ils sont susceptibles de ragir :
Objet

vnements associs

Formulaire UserForm

Activation, initialisation, fermeture.

Contrle ComboBox

Clic, activation, sortie.

Contrle CommandButton

Clic, double-clic.

Contrle Zone de texte

Modification, entre, sortie.

Document Word

Cration, fermeture, ouverture.

Feuille Excel

Activation, calcul, modification.

Quand on programme sous Windows, il faut donc prvoir les vnements qui sont susceptibles de se dclencher pour un objet donn et
crire des programmes pour traiter ces vnements. Un programme
qui traite un vnement sappelle un gestionnaire dvnement. Dans
le cas qui nous occupe, il va falloir, par exemple, crire un gestionnaire dvnement pour lvnement Click du bouton de commande
de notre formulaire qui sert valider la saisie de lutilisateur.

Chap17.fm Page 359 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

359

Il existe plusieurs mthodes pour connatre la liste des vnements


rattachs un objet ; la premire consiste tout simplement consulter
laide en ligne. Si lon consulte la documentation sur lobjet UserForm, on saperoit, quoutre la liste des proprits et des mthodes, il
existe des vnements.
La deuxime mthode exploite les facilits de lditeur de code
Visual Basic. En cliquant avec le bouton droit de la souris sur le formulaire Calendrier (sous-menu Feuilles du projet Document1), vous
pouvez choisir la commande Code qui affiche la fentre de code du
formulaire en lieu et place de la grille de cration du formulaire. Cette
fentre comporte deux listes droulantes : une liste qui comprend tous
les objets du formulaire (y compris lobjet lUserForm) et une liste
baptise Dclarations (figure 17.9).

Figure 17.9 Liste des objets du formulaire

Si lon choisit par exemple lobjet UserForm, la liste Dclarations


prend la forme illustre la figure 17.10.

Figure 17.10 Liste des vnements rattachs un objet

Chap17.fm Page 360 Mardi, 23. janvier 2007 5:33 17

360

Chapitre 17. Crer des formulaires

Cette liste dnombre tous les vnements attachs lobjet UserForm. Si vous slectionnez un autre objet (mois, annee ou valider),
vous constaterez que la liste Dclarations est modifie ce qui signifie
que tous les objets nacceptent pas les mmes vnements. Le simple
fait de slectionner un vnement dans la liste Dclarations fait apparatre un squelette de procdure. Par exemple si lon slectionne
lobjet valider et que lon choisit lvnement Click, le code suivant
apparat dans lditeur :
Private Sub valider_Click()
End Sub

Le curseur se place entre ces deux lignes afin que vous puissiez saisir
le code de la procdure. Cest donc entre ces lignes que vous devez
placer le code qui sera dclench quand lutilisateur cliquera sur le
bouton de commande valider. Le mot cl Private signifie que la procdure est interne au formulaire.
La notion dvnement doit prsent tre un peu plus claire, mais
il demeure cependant encore deux questions : quel vnement choisir
pour affecter du code un objet, et dans quel ordre les vnements se
produisent-ils ?
La rponse la premire question viendra avec lexprience et en
lisant laide en ligne. Il ne faut pas cependant tre effray par la multitude dvnements que peut prendre en compte un objet. Dans la plupart des cas, vous ne grerez quun vnement ou deux par objet ; pour
reprendre lexemple des contrles CommandButtton, on ne se sert en
gnral que de lvnement Click alors que cet objet gre 13 vnements.
La deuxime question est lie la premire car lorsquun objet
comporte plusieurs vnements il faut absolument connatre lordre
dans lequel les vnements se produisent pour pouvoir affecter le code
lvnement adquat. Le plus simple pour apprivoiser les vnements est encore dcrire un programme qui dmontre lordre dans
lequel ils se produisent. Un tel programme est excessivement simple
crire et vous montrera de manire clatante les vnements en
action. Pour ce faire, choisissez lobjet UserForm et crivez les gestionnaires dvnement suivants :

Chap17.fm Page 361 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

361

Private Sub UserForm_Activate()


MsgBox "vnement Activate dclench"
End Sub
Private Sub UserForm_Click()
MsgBox "vnement Click dclench"
End Sub
Private Sub UserForm_Initialize()
MsgBox "vnement Initialize dclench"
End Sub
Private Sub UserForm_Terminate()
MsgBox "vnement Terminate dclench"
End Sub

Excutez ensuite votre formulaire et vous pourrez alors constater


que cest lvnement Initialize qui se dclenche en premier. Lui succde immdiatement lvnement Activate. Si vous cliquez sur le formulaire, vous constaterez sans surprise que lvnement Click se
dclenche. Enfin, en fermant le formulaire, vous verrez que lvnement Terminate se produit.
Cette dmonstration nous permet de dterminer lemplacement du
code dinitialisation de la liste de notre ComboBox. Il faut le placer
dans le gestionnaire dvnement Initialize de lobjet UserForm.
Cette procdure vnementielle scrit de la manire suivante :
Private Sub UserForm_Initialize()
' Initialize se dclenche avant l'ouverture du formulaire
' On remplit la liste des mois
mois.AddItem ("Janvier")
mois.AddItem ("Fvrier")
mois.AddItem ("Mars")
mois.AddItem ("Avril")
mois.AddItem ("Mai")
mois.AddItem ("Juin")
mois.AddItem ("Juillet")
mois.AddItem ("Aot")
mois.AddItem ("Septembre")
mois.AddItem ("Octobre")
mois.AddItem ("Novembre")
mois.AddItem ("Dcembre")
End Sub

Chap17.fm Page 362 Mardi, 23. janvier 2007 5:33 17

362

Chapitre 17. Crer des formulaires

Un autre problme se pose : comment rcuprer dans notre programme la valeur du mois choisi par lutilisateur ? Il ny a pas dans ce
cas de valeur de retour renvoye par une fonction. Il faut se tourner du
ct des proprits de notre ComboBox ; la proprit Value contient
llment de la liste slectionn par lutilisateur. Pour sen persuader, il
suffit dcrire le gestionnaire dvnement suivant :
Private Sub valider_Click()
MsgBox mois.Value
End Sub

Aprs avoir slectionn un mois dans la ComboBox, cliquez sur le


bouton de commande du formulaire ; vous devriez alors voir apparatre une bote de dialogue du style de celle qui est illustre la
figure 17.11.

Figure 17.11 Rcupration de la valeur


de llment slectionn

Pour achever notre formulaire, il ne nous reste plus qu crire le


gestionnaire dvnement du bouton de commande. Ce dernier va
rcuprer les valeurs des contrles grce aux proprits Value des contrles ComboBox et TextBox puis gnrer le calendrier correspondant
aux valeurs choisies par lutilisateur. La proprit ListIndex de la
ComboBox permet de connatre le numro du mois choisi ce qui nous
vite dcrire une fonction qui transforme le nom dun mois en
numro. Voici le listing complet de la procdure :
Private Sub valider_Click()
Dim premier As Variant
Dim jour As Integer
Dim nannee As Integer
Dim cmois As String
Dim nmois As Integer
jour = 1
' on rcupre les valeurs des contrles du formulaire
nannee = annee.Value

Chap17.fm Page 363 Mardi, 23. janvier 2007 5:33 17

Exemple de UserForm pas pas

363

cmois = mois.Value
' calcul du nombre de jours du mois
' on stocke dans nmois le numro du mois (janvier = 1, etc.)
If mois.ListIndex = -1 Then
' l'utilisateur n'a pas choisi de mois
' on prend le mois de janvier par dfaut
nmois = 1
Else
nmois = mois.ListIndex + 1
' 0 est le premier lment de la liste
End If
Select Case nmois
Case 1, 3, 5, 7, 8, 10, 12
nbjours = 31
Case 4, 6, 9, 11
nbjours = 30
Case Else
' il s'agit du mois de fvrier
' il faut calculer si le mois a 28 ou 29 jours
If Day(DateSerial(nannee, 2, 28) + 1) = 29 Then
nbjours = 29
Else
nbjours = 28
End If
End Select
' Inscrit le mois et l'anne
Selection.TypeText Text:=cmois + " " + CStr(nannee)
' Centre le titre
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
' Saute une ligne
Selection.TypeParagraph
Selection.TypeParagraph
' Insre le tableau
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=6, NumColumns:= 7 _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
Selection.TypeText Text:="Lundi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mardi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mercredi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Jeudi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Vendredi"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Samedi"

Chap17.fm Page 364 Mardi, 23. janvier 2007 5:33 17

364

Chapitre 17. Crer des formulaires

Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Dimanche"
' calcul du premier jour du mois et de l'anne slectionns
premier = Weekday("1 " & cmois & " " & Str(nannee),
vbMonday)
Selection.MoveRight Unit:=wdCell, Count:=premier
While jour < nbjours + 1
Selection.TypeText Text:=Str(jour)
Selection.MoveRight Unit:=wdCell
jour = jour + 1
Wend
' Masque le formulaire
Calendrier.Hide
End Sub

la fin du programme, la mthode Hide permet de fermer le formulaire. A contrario, on utilisera la mthode Show pour faire apparatre le formulaire. Il suffit dcrire la procdure suivante pour pouvoir
excuter le formulaire :
Sub ImprimeCalendrier()
Calendrier.Show
End Sub

Notre UserForm est prsent termin ; il est bien videmment possible de lamliorer et vous pouvez par exemple prvoir une valeur par
dfaut pour la saisie de lanne (Year(Now)).

MISE EN PRATIQUE
Afin dappliquer ce que nous venons dapprendre et de rviser ce
que nous avons dj tudi, nous allons crer une application qui
imprime le tableau damortissement dun prt.
Commenons par faire une analyse minimale de nos besoins et
inventorions les donnes collectes en entre et les donnes produites
en sortie. Le programme doit demander lutilisateur au minimum
trois informations :
le montant du prt,
le taux dintrt,
la dure du prt.

Chap17.fm Page 365 Mardi, 23. janvier 2007 5:33 17

Mise en pratique

365

Pour ce faire, nous allons bien videmment crer un UserForm.


Une fois les informations collectes, le programme doit fournir en
sortie les informations suivantes :

le montant du prt pour mmoire,


le taux dintrt pour mmoire,
la dure du prt pour mmoire,
le montant de la mensualit,
le cot total du crdit,
le tableau damortissement lui-mme.

Rappelons quun tableau damortissement prsente pour chaque


mensualit verse la part de capital rembours et la part dintrt rembours.
Pour calculer le montant de la mensualit, nous utiliserons la fonction Pmt qui renvoie une valeur de type Double indiquant le montant
dune annuit base sur des versements constants et priodiques et sur
un taux dintrt fixe.
Pour calculer la part de capital dans chaque mensualit, nous utiliserons la fonction PPmt qui renvoie une valeur de type Double indiquant le remboursement du capital, pour une chance donne, dune
annuit base sur des versements constants et priodiques et sur un
taux dintrt fixe.
La part dintrt sera calcule par la diffrence entre le montant de
la mensualit et le montant du capital rembours.
Nous souhaitons que le tableau damortissement se prsente sous
cette forme :

Tableau d'amortissement
Montant emprunt : 60 000
Taux du prt : 7 %
Nombre d'annuits : 4
Montant de la mensualit : 1 436,77
Cot du crdit : 8 964,96

Chap17.fm Page 366 Mardi, 23. janvier 2007 5:33 17

366

Chapitre 17. Crer des formulaires

N mensualit

Mensualit

Capital

Intrt

1 436,77

1 086,77

350

1 436,77

1 093,11

343,66

1 436,77

1 099,49

337,28

1 436,77

1 105,9

330,87

Maintenant que nous savons exactement ce que nous voulons


faire, nous pouvons rdiger le pseudo-code de ce programme :
Afficher un formulaire qui permet lutilisateur de saisir le montant, le taux et le nombre de mensualits du prt.
Crer un nouveau document.
crire le titre du document.
Sauter une ligne.
Calculer le montant de la mensualit.
Calculer le cot du crdit.
Remplir les 5 lignes de renseignements sous le titre.
Sauter une ligne.
Insrer un tableau de 4 colonnes.
Remplir les titres des colonnes du tableau.
Remplir les lignes du tableau grce une boucle.
Toute la partie de cration du document Word peut tre gnre
automatiquement et nous allons pour ce faire utiliser lenregistreur de
macros. La liste des actions gnrer est la suivante :

Crer un nouveau document


Taper Tableau damortissement et centrer
Sauter deux lignes et cadrer gauche
Taper Montant emprunt :
Aller la ligne
Taper Taux du prt :
Aller la ligne
Taper Nombre dannuits :
Aller la ligne
Taper Montant de la mensualit :
Aller la ligne

Chap17.fm Page 367 Mardi, 23. janvier 2007 5:33 17

Mise en pratique

367

Taper Cot du crdit :


Sauter deux lignes
Insrer un tableau de 10 lignes et 4 colonnes
Taper le titre de chaque colonne

Si vous ralisez bien squentiellement ces actions, le code gnr


doit tre le suivant :
Documents.Add Template:= _
"C:\WINDOWS\Application Data\Microsoft\Modles\Normal.dot", _
NewTemplate:= False, DocumentType:=0
Selection.TypeText Text:="Tableau d'amortissement"
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
Selection.TypeParagraph
Selection.TypeParagraph
Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
Selection.TypeText Text:="Montant emprunt : "
Selection.TypeParagraph
Selection.TypeText Text:="Taux du prt : "
Selection.TypeParagraph
Selection.TypeText Text:="Nombre d'annuits : "
Selection.TypeParagraph
Selection.TypeText Text:="Montant de la mensualit : "
Selection.TypeParagraph
Selection.TypeText Text:="Cot du crdit : "
Selection.TypeParagraph
Selection.TypeParagraph
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=10, _
NumColumns:=4, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:= wdAutoFitFixed
Selection.TypeText Text:="N mensualit"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mensualit"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Capital"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Intrt"

Nous allons prsent examiner ce quil faut modifier dans cette


macro gnre.
On doit tout dabord ajouter chacun des cinq libells (Montant
emprunt, Taux du prt, etc.) la valeur correspondante.

Chap17.fm Page 368 Mardi, 23. janvier 2007 5:33 17

368

Chapitre 17. Crer des formulaires

Ensuite, il faut modifier le nombre de lignes du tableau qui est


insr ; le nombre de lignes dpend du nombre dannes du prt et la
formule de calcul est simple : (nombre dannes du prt * 12) + 1
ligne den-tte. Il faut enfin remplir les cellules du tableau avec les
valeurs adquates.
Pour rendre lapplication plus conviviale, une fois que lutilisateur a
saisi le montant, le taux et le nombre dannuits du prt, il peut cliquer sur un bouton pour afficher les rsultats du calcul dans une bote
de dialogue (figure 17.12).

Figure 17.12 Bote de dialogue


affichant les rsultats du calcul

Si la simulation ne convient pas lutilisateur, ce dernier a la possibilit de modifier les donnes du calcul de prt.
Une fois que la simulation est satisfaisante, lutilisateur a le choix
dimprimer ou non son tableau damortissement.

Cration du UserForm
Sur le formulaire, crez les six contrles suivants :
un contrle TextBox pour saisir le montant du prt ;
un contrle TextBox associ un contrle SpinButton pour saisir
le taux du prt (valeur par dfaut 5 % et incrment de 0,25 %) ;
un contrle ComboBox pour saisir le nombre dannes ;
un contrle CommandButton pour calculer les rsultats ;
un contrle CommandButton pour gnrer le tableau damortissement ;
un contrle CommandButton pour fermer le formulaire.

Chap17.fm Page 369 Mardi, 23. janvier 2007 5:33 17

369

Mise en pratique

La figure 17.13 illustre laspect de ce formulaire dans lditeur de


programmes.

Figure 17.13 Formulaire permettant


de saisir les donnes du calcul de prt

Une fois le formulaire cr, il faut crire les gestionnaires dvnements des diffrents contrles du formulaire.
Private Sub UserForm_Initialize()
SpinButton1.Min = 1
SpinButton1.Max = 20
SpinButton1.Value = 5
SpinButton1.SmallChange = 0.25
' On remplit la liste des annuits
cannuites.AddItem "1"
cannuites.AddItem "2"
cannuites.AddItem "3"
cannuites.AddItem "4"
cannuites.AddItem "5"
cannuites.AddItem "6"
cannuites.AddItem "7"
cannuites.AddItem "8"
cannuites.AddItem "9"
cannuites.AddItem "10"
cannuites.AddItem "11"
cannuites.AddItem "12"
cannuites.AddItem "13"
cannuites.AddItem "14"
cannuites.AddItem "15"
cannuites.AddItem "16"
cannuites.AddItem "17"

Chap17.fm Page 370 Mardi, 23. janvier 2007 5:33 17

370

Chapitre 17. Crer des formulaires

cannuites.AddItem "18"
cannuites.AddItem "19"
cannuites.AddItem "20"
End Sub

On se sert de lvnement Initialize pour paramtrer le contrle


SpinButton et dfinir la liste droulante du contrle ComboBox.
Voici le code du bouton de commande qui permet de calculer la
mensualit et dafficher les rsultats dans une bote de dialogue :
Private Sub calculer_Click()
Dim mensualite As Double
Dim cout As Double
Dim autrecalcul As Integer
Dim imprimetableau As Integer
' on rcupre les valeurs dans le formulaire
principal = CDbl(cprincipal.Value)
taux = CDbl(ctaux.Value)
annuites = CDbl(cannuites.Value)
' Calcul du montant de la mensualit
' Pour arrondir la somme deux chiffres aprs la virgule
' on utilise une fonction personnalise arrondir
mensualite = -arrondir _
(Pmt(taux / 1200, annuites * 12, principal), 2)
' calcul du cot du crdit
cout = (mensualite * 12 * annuites) - principal
' on affiche les lments du calcul
' le montant de la mensualit
' et le cot du crdit
MsgBox ("Principal : " + CStr(principal) + vbCr + "Taux : " + _
CStr(taux) + " %" + vbCr + "Annuits : " + CStr(annuites) + _
vbCr + "Mensualit : " + CStr(mensualite) + vbCr + _
"Cot du crdit : " + CStr(cout))
End Sub

Comme il existe parfois des problmes darrondi dans les fonctions


intgres de Visual Basic, nous avons programm notre propre fonction darrondi dont voici le code :
Function arrondir(Nombre As Double, NbDecimales As Integer) _
As Double
Dim facteur As Double, intermediaire As Double
facteur = 10 ^ NbDecimales
intermediaire = Nombre * facteur + 0.5
arrondir = Int(intermediaire) / facteur
End Function

Chap17.fm Page 371 Mardi, 23. janvier 2007 5:33 17

Mise en pratique

371

Le code du bouton pour fermer le formulaire est extrmement simple :


Private Sub sortir_Click()
' Masque le formulaire
Emprunt.Hide
End Sub

Il ne nous reste plus alors qu programmer le bouton qui imprime


le tableau damortissement :
Private Sub tableau_Click()
Dim x
' on appelle la fonction d'impression du tableau d'amortissement
' laquelle on passe les trois paramtres principaux
x = tabamort(principal, taux, annuites)
End Sub

Afin dtre plus gnrique, ce code utilise une fonction qui pourra
resservir dans dautres circonstances.
Cette fonction, qui est largement commente, ne devrait pas vous
poser de problmes de comprhension. Une grande partie de son code
a t produite par le gnrateur de macro. Voici son listing :
Function tabamort(capital As Double, _
tauxemp As Double, _
nbannuites As Double) As Integer
' on calcule nouveau la mensualit
rembour = -arrondir _
(Pmt(tauxemp / 1200, nbannuites * 12, capital), 2)
' et le cot du crdit
cout = -arrondir(capital - (rembour * nbannuites * 12), 2)
' ces deux valeurs auraient pu tre passes en paramtre
' on cre un nouveau document
Documents.Add _
Template:= _
"C:\WINDOWS\Application Data\Microsoft\Modles\Normal.dot", _
NewTemplate:=False, DocumentType:=0
' Ecriture du tableau d'amortissement
Selection.TypeText Text:="Tableau d'amortissement"
' On slectionne le titre
Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
' On le passe en corps 18
Selection.Font.Size = 18
' Et on le centre
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter

Chap17.fm Page 372 Mardi, 23. janvier 2007 5:33 17

372

Chapitre 17. Crer des formulaires

' On dslectionne le titre


Selection.EndKey Unit:=wdLine
' On saute une ligne
Selection.TypeParagraph
Selection.TypeParagraph
' On aligne le texte gauche
Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
'On inscrit "Montant emprunt : " et le montant de l'emprunt
Selection.TypeText Text:="Montant emprunt : " + _
CStr(capital)
' on va la ligne
Selection.TypeParagraph
Selection.TypeText Text:="Taux du prt : " + _
CStr(tauxemp) + " %"
Selection.TypeParagraph
Selection.TypeText Text:="Nombre d'annuits : " + _
CStr(nbannuites)
Selection.TypeParagraph
Selection.TypeText Text:="Montant de la mensualit : " + _
CStr(rembour)
Selection.TypeParagraph
Selection.TypeText Text:="Cot du crdit : " + _
CStr(cout)
Selection.TypeParagraph
Selection.TypeParagraph
' on insre le tableau
' notez la formule de calcul du nombre de lignes
ActiveDocument.Tables.Add Range:=Selection.Range, _
NumRows:=(nbannuites * 12) + 1, _
NumColumns:=4, _
DefaultTableBehavior:=wdWord9TableBehavior, _
AutoFitBehavior:=wdAutoFitFixed
'on remplit l'en-tte de chaque colonne
Selection.TypeText Text:="N mensualit"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Mensualit"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Capital"
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:="Intrt"
' Une boucle For Next imprime chaque ligne
For i = 1 To nbannuites * 12
' on se dplace d'une cellule vers la droite
Selection.MoveRight Unit:=wdCell
' on inscrit le numro de la mensualit
Selection.TypeText Text:=i

Chap17.fm Page 373 Mardi, 23. janvier 2007 5:33 17

373

Mise en pratique

' on se dplace d'une cellule vers la droite


Selection.MoveRight Unit:=wdCell
' on inscrit la valeur de la mensualit
Selection.TypeText Text:=rembour
' on se dplace d'une cellule vers la droite
Selection.MoveRight Unit:=wdCell
' on inscrit la part de capital
Selection.TypeText Text:=-arrondir(PPmt _
(tauxemp / 1200, i, nbannuites * 12, capital), 2)
' on se dplace d'une cellule vers la droite
Selection.MoveRight Unit:=wdCell
' on inscrit la part d'intrt
Selection.TypeText Text:=arrondir(rembour + _
PPmt(tauxemp / 1200, i, nbannuites * 12, capital), 2)
Next i
' on renvoie une valeur de retour
tabamort = 1
End Function

La figure 17.14 illustre un aperu de ce que peut produire cette


application.

Figure 17.14 Tableau damortissement


gnr par lapplication

Chap17.fm Page 374 Mardi, 23. janvier 2007 5:33 17

374

Chapitre 17. Crer des formulaires

CONCLUSION
Les formulaires UserForm permettent de donner un aspect professionnel votre application car vous pouvez crer des botes de
dialogue similaires celles que lon trouve dans les logiciels commerciaux. Ils facilitent aussi grandement lutilisation des programmes en optimisant la saisie et en la contrlant. Les
formulaires Access fonctionnent exactement sur le mme principe que les formulaires UserForm ; ils offrent en revanche plus
de proprits, de mthodes et dvnements parce quils grent
en plus des bases de donnes. Ils permettent aussi plusieurs
niveaux de formulaires (un formulaire peut contenir un sous-formulaire).
La notion dvnement est essentielle quand on programme sous
Windows et de trs nombreux objets dans Office ragissent des
vnements ; les documents Word et les feuilles de calcul Excel
ne font pas exception cette rgle.

Chap18.fm Page 375 Mercredi, 24. janvier 2007 6:28 18

18
Grer des fichiers texte
Quand on programme en VBA, il est assez courant davoir manipuler des fichiers texte, que ce soit pour lire des informations ou bien
pour produire un fichier dans un format particulier. En effet, mme si
les logiciels actuels savent exporter des donnes dans les formats courants (HTML, CSV, Excel, etc.), il arrive souvent que la seule solution un problme de transfert de fichier soit la cration de ce que les
informaticiens appellent une moulinette, cest--dire une procdure
qui permet la conversion des informations dun format de fichier dans
un autre format de fichier. Visual Basic possde des objets qui permettent de raliser ce genre doprations trs simplement.
Pour linstant, nous navons manipul que les objets des modles
dobjets des applications Office ; nous allons voir prsent quil existe
dautres objets qui doivent tre apprhends de manire un peu diffrente. Nous avons constat prcdemment quil existait un type de
donnes baptis Objet puisquil est en effet possible de dclarer une
variable de type objet (Dim Nomvariable As Object). Comme nous
lavons dj expliqu, une variable est en fait une adresse (un emplacement de la mmoire vive) qui indique le lieu de stockage des donnes
contenues dans la variable. De la mme manire, une variable objet est
une adresse en mmoire qui fait rfrence un objet. Mais dans ce casl, mme si cela est invisible pour vous, il faut une opration supplmentaire car pour manipuler un objet, on doit employer une instruction
Set pour affecter une rfrence dobjet une variable dclare en tant
quobjet. Pour voir comment tout cela fonctionne, nous allons tudier

Chap18.fm Page 376 Mercredi, 24. janvier 2007 6:28 18

376

Chapitre 18. Grer des fichiers texte

un objet de Visual Basic qui permet de traiter des fichiers, lobjet FileSystemObject. Cet objet est intressant parce quil donne accs au systme de fichiers de lordinateur et permet toute une srie doprations
sur les fichiers telles que la copie, la cration, la lecture, etc. Dans la
mesure o il sagit dun objet Visual Basic, vous trouverez des informations sur cet objet dans laide en ligne en consultant la rubrique intitule Visual Basic Manuel de rfrence du langage .
Il existe galement un modle dobjets pour les objets communs
toutes les applications Office. Dans ce modle, on trouve des objets
comme les assistants, les barres de menus, les barres doutils, etc.
Pour connatre la liste de ces objets et leur syntaxe dutilisation,
localisez sur votre disque dur le fichier daide VBAOFX.CHM, X
reprsentant le numro de votre version dOffice (9, 10 ou 11).

OBJET FILESYSTEMOBJECT
Lobjet FileSystemObject permet daccder au systme de fichiers de
lordinateur. Grce cet objet, vous allez pouvoir crer des fichiers, les
supprimer et les dplacer. Vous pourrez galement grer des rpertoires. Dans le cadre de cet ouvrage, nous allons surtout nous intresser
la facult qua lobjet FileSystemObject de crer des fichiers.
Cet objet ne possde quune proprit, Drives, qui renvoie la collection de tous les lecteurs de lordinateur.
En revanche lobjet FileSystemObject possde de nombreuses
mthodes dont le tableau 18.1 liste les principales.
Tableau 18.1 Principales mthodes de lobjet FileSystemObject
Mthode

Description

CopyFile

Copie un fichier dun emplacement vers un autre.

CreateFolder

Cre un dossier

CreateTextFile

Cre un nom de fichier et renvoie un objet TextStream


pouvant tre utilis pour lire ou crire dans le fichier.

Chap18.fm Page 377 Mercredi, 24. janvier 2007 6:28 18

377

Objet TextStream

Tableau 18.1 Principales mthodes de lobjet FileSystemObject


Mthode

Description

DeleteFile

Supprime un fichier

FileExists

Renvoie la valeur True si un fichier spcifi existe, False dans


le cas contraire.

MoveFile

Dplace un fichier dun emplacement vers un autre.

OpenTextFile

Ouvre un fichier et renvoie un objet TextStream pouvant


tre utilis pour lire un fichier ou y effectuer un ajout.

la lecture de ce tableau, vous avez pu constater que plusieurs mthodes


renvoient un objet TextStream. Nous allons tudier en dtail cet objet qui
va vous permettre de crer et de lire nimporte quel type de fichier.

OBJET TEXTSTREAM
Lobjet TextStream vous procure un contrle total sur les fichiers
aussi bien en lecture quen criture. Il ouvre ainsi la voie toute une
srie dapplications qui sont extrmement intressantes comme les
programmes de conversion de fichiers. Avant de rentrer dans le vif
du sujet, examiner les proprits et les mthodes dobjet TextStream
(tableaux 18.2 et 18.3).
Tableau 18.2 Proprits de lobjet TextStream
Proprit

Description

AtEndOfLine

Proprit en lecture seule qui renvoie True si le pointeur de


fichier est positionn immdiatement avant le marqueur de fin
de ligne d'un objet TextStream, et False dans le cas contraire.

AtEndOfStream

Proprit en lecture seule qui renvoie True si le pointeur de


fichier se trouve la fin d'un objet TextStream, et False dans
le cas contraire.

Column

Proprit en lecture seule qui renvoie le numro de colonne de


la position du caractre en cours dans un objet TextStream.

Line

Proprit en lecture seule qui renvoie le numro de ligne en


cours dans un objet TextStream.

Chap18.fm Page 378 Mercredi, 24. janvier 2007 6:28 18

378

Chapitre 18. Grer des fichiers texte

Tableau 18.3 Mthodes de lobjet TextStream


Mthode

Description

Close

Ferme un fichier texte TextStream.

Read

Lit un nombre spcifi de caractres dans un fichier TextStream


et renvoie la chane rsultante.

ReadAll

Lit la totalit d'un fichier TextStream et renvoie la chane


rsultante.

ReadLine

Lit toute une ligne (moins le caractre nouvelle ligne ) d'un


fichier TextStream et renvoie la chane rsultante.

Skip

Omet un nombre spcifi de caractres lors de la lecture d'un


fichier TextStream.

SkipLine

Omet la ligne suivante lors de la lecture d'un fichier


TextStream.

Write

crit une chane spcifie dans un fichier TextStream.

WriteBlankLines

crit un nombre spcifi de caractres nouvelle ligne dans


un fichier TextStream.

WriteLine

crit une chane spcifie et un caractre nouvelle ligne dans


un fichier TextStream.

Lexemple suivant permet douvrir un fichier en lecture et dafficher le texte contenu dans le fichier ligne ligne dans une bote de
dialogue :
Sub LectureFichier()
Dim objet As Object, fichier As Object
Set objet = CreateObject("Scripting.FileSystemObject")
Set fichier = objet.opentextfile("C:\FichierTexte.TXT")
Do While fichier.AtEndOfStream <> True
MsgBox fichier.ReadLine
Loop
fichier.Close
End Sub

Ce programme commence par dclarer deux variables de type


objet. La fonction CreateObject permet dtablir une rfrence
dobjet vers lobjet FileSystemObject et la commande Set assigne
cette rfrence notre variable objet. Ensuite, la mthode OpenText-

Chap18.fm Page 379 Mercredi, 24. janvier 2007 6:28 18

Objet TextStream

379

File ouvre le fichier dont le nom lui est pass en paramtre et renvoie
un objet TextStream qui va pouvoir tre utilis pour lire ou crire un
fichier. Cet objet TextStream est assign, grce la commande Set,
notre deuxime variable objet que nous avons intitule fichier. Une
fois que le fichier est ouvert, on fait une boucle afin de balayer toutes
les lignes du fichier. La proprit AtEndOfStream de lobjet TextStream renvoie la valeur True si le pointeur de fichier se trouve la fin
du fichier, et la valeur False dans le cas contraire. Cette proprit nous
sert de condition de sortie de boucle (en pseudo-code, on dirait : tant
quon na pas atteint la fin du fichier). La mthode ReadLine lit une
ligne du fichier qui est ensuite affiche au sein dune bote MsgBox. Le
fichier est enfin ferm grce la mthode Close car il est toujours
recommand de fermer ce que lon a ouvert.
Avec lobjet FileSystemObject, il est galement permis, en reprenant plus ou moins le mme modle de programme, de crer des
fichiers texte. Le programme suivant cre un fichier texte contenant
la liste de tous les jours de lanne en cours :
Sub EcritureFichier()
Dim objet As Object, fichier As Object
Dim jour As Integer, premier As Date, calendrier As String
Set objet = CreateObject("Scripting.FileSystemObject")
Set fichier = objet.CreateTextFile("C:\Calendrier.TXT", True)
jour = 1
premier = DateSerial(Year(Now), 1, 1)
Do While jour < 367
calendrier = WeekdayName(Weekday(premier, vbMonday)) + " " + _
CStr(Day(premier)) + " " + _
MonthName(Month(premier)) + " " + _
CStr(Year(premier))
fichier.WriteLine (calendrier)
jour = jour + 1
premier = premier + 1
Loop
fichier.Close
End Sub

Au lieu douvrir le fichier, on utilise la mthode CreateTextFile pour


crer un fichier ; on calcule ensuite la date du premier jour de lanne
grce la fonction DateSerial puis laide de fonctions de date, on crit
en entier la date du jour dans la variable calendrier. lintrieur dune
boucle Do While, la variable calendrier est crite dans le fichier

Chap18.fm Page 380 Mercredi, 24. janvier 2007 6:28 18

380

Chapitre 18. Grer des fichiers texte

(mthode WriteLine) puis on incrmente la date (stocke dans la


variable premier) ainsi que la variable jour qui sert de compteur et permet de sortir de la boucle la fin de lanne (la condition est jour
< 367). Ce petit programme produit le fichier illustr la figure 18.1.

Figure 18.1 Fichier texte cr laide


dun objet TextStream

Compatibilit entre Office Mac et Office Windows


Si vous utilisez Office pour Macintosh et tentez dexcuter le programme
prcdent, vous constaterez quil ne fonctionne pas. Si la compatibilit
entre les modles dobjets dOffice des versions Windows et des versions
Mac est relativement bonne, on sexpose des dconvenues ds que
lon veut utiliser des objets qui sortent du strict cadre dOffice. Ainsi, la
plupart des contrles ActiveX ne fonctionnent pas sur Macintosh. En
matire de gestion de fichiers texte, il est heureusement possible dutiliser
une alternative avec les commandes OPEN et PRINT#. Le programme
suivant illustre les deux techniques pour arriver au mme rsultat.
Quand vous voulez rdiger une macro qui tourne la fois sur les deux
plates-formes Mac et PC, vous avez trois solutions :
Vous crivez une version PC et une version Mac de votre macro.
Vous crivez une macro dont les instructions sont compatibles avec
les versions Mac et PC.

Chap18.fm Page 381 Mercredi, 24. janvier 2007 6:28 18

Mise en pratique

381

Vous crivez une seule macro dont le code prend en compte la diffrence entre les deux systmes grce la proprit Application.System.OperatingSystem. Cela donne un code similaire au squelette
suivant :
If Application.System.OperatingSystem = "Macintosh" Then
Instructions Mac
Else
Instructions Windows
End If

MISE EN PRATIQUE
Nous allons tudier deux programmes qui utilisent les possibilits de
lobjet TextStream pour crer des fichiers.

Conversion de fichiers au format Vcard


Le format Vcard est un format standard de carte de visite lectronique quacceptent tous les logiciels de messagerie dignes de ce nom.
Quand vous changez de systme de messagerie et que vous voulez
transfrer tous les contacts de votre carnet dadresses dans votre
nouveau logiciel, vous voyez bien souvent les limites de linteroprabilit entre les logiciels
Le programme suivant est une macro Word qui convertit les donnes issues dun carnet dadresses dun ancien logiciel de messagerie
en un fichier au format standard Vcard. Les donnes se prsentent
sous la forme suivante :
"Sraphin Lampion" [seraphin.lampion@moulinsart.be],Alfredo
Topolino [alfredo.topolino@italia.net],Mohammed Ben Kalish Ezab
[momo.benkal@yahoo.com],Oliveira Da Figueira [oliveira.dafigueira@hotmail.com],Piotr Szut [piotr.szut@hotmail.com],Tchang
Tchong-Yen [tchang.tchong@yahoo.com]
Grosso modo, on trouve le nom du contact suivi de son adresse
lectronique entre crochets et chaque contact est spar par une virgule. La macro extrait les donnes puis gnre un fichier texte au format Vcard. Afin que cette macro puisse tourner dans un
environnement Mac et PC, lobjet TextStream na pas t employ,

Chap18.fm Page 382 Mercredi, 24. janvier 2007 6:28 18

382

Chapitre 18. Grer des fichiers texte

mais les instructions employant cet objet figurent nanmoins dans le


programme en commentaire et en gras.
Sub export_Vcard()
Dim sel As Selection ' dfinition d'un objet de type Selection
' Dim objet As Object
' Dim fichier As Object
Dim enreg As Variant
Dim entete As Variant
Selection.WholeStory ' on slectionne tout le texte qui a t
coll dans Word
Set sel = Selection ' la totalit du texte slectionn
' Cration d'un fichier texte au format CSV
' pour importation des contacts au format Vcard
' Set objet = CreateObject("Scripting.FileSystemObject")
' Set fichier = objet.CreateTextFile("Exportetoile.txt", True)
Open "exportVcard.txt" For Output As #1
' Insertion de la ligne d'en-tte du format Vcard
entete = "last name;first name;middle
name;nickname;title;suffix;gender;language;job
title;company;department;business fax;business phone;business phone
2;home phone;home phone 2;home fax;assistant's phone;car
phone;companymain phone;mobile phone;other fax;other
phonepager;primary phone;pager;business street;business street
2;business street 3;business city;business state;business postal
code;business country;home street;home street 2;home street 3;home
city;home state;home postal code;home country;other street;other
street 2;other street 3;other city;other state;other postal
code;other country;e-mail address;e-mail display name;e-mail 2
address;e-mail 2 display name;e-mail 3 address;e-mail 3 display
name;web page;personal web page;business web page"
' fichier.Writeline ("last name;first name;middle
name;nickname;title;suffix;gender;language;job
title;company;department;business fax;business phone;business
phone 2;home phone;home phone 2;home fax;assistant's phone;car
phone;companymain phone;mobile phone;other fax;other
phonepager;primary phone;pager;business street;business street
2;business street 3;business city;business state;business postal
code;business country;home street;home street 2;home street
3;home city;home state;home postal code;home country;other
street;other street 2;other street 3;other city;other
state;other postal code;other country;e-mail address;e-mail
display name;e-mail 2 address;e-mail 2 display name;e-mail 3
address;e-mail 3 display name;web page;personal web
page;business web page")
Print #1, entete
' Boucle de traitement des adresses
' on dcoupe chaque segment compos du nom de la personne

Chap18.fm Page 383 Mercredi, 24. janvier 2007 6:28 18

Mise en pratique

383

' suivi de son adresse lectronique


While InStr(1, sel, ",") ' cherche la virgule
placevirgule = InStr(1, sel, ",")
enreg = Trim(Left(sel, placevirgule - 1))
' dcoupage des diffrents champs de l'enregistrement
' exemple d'enregistrement
' "Sraphin Lampion" [seraphin.lampion@moulinsart.be]
' si le nom comporte un signe diacritique
' le nom est encadr par des guillemets
' on doit isoler 4 champs : prnom, nom, prnomnom et adresse
' reprage des sparateurs
finprnom = InStr(1, enreg, " ")
adressedbut = InStr(1, enreg, "[") + 1
adressefin = InStr(1, enreg, "]") - adressedbut
' prnom
prnom = Trim(Left(enreg, finprnom))
If Left(prnom, 1) = Chr(34) Then ' le nom est encadr par
des guillemets
prnom = Mid(prnom, 2) ' on supprime le guillemet
End If
'nom
nom = Mid(enreg, finprnom + 1, adressedbut - finprnom - 3)
If Right(nom, 1) = Chr(34) Then ' le nom est encadr par des
guillemets
nom = Left(nom, Len(nom) - 1) ' on supprime le guillemet
End If
'prnom + nom
prnomnom = prnom + " " + nom
' adresse
adresse = Mid(enreg, adressedbut, adressefin)
' criture de l'enregistrement dans le fichier
ligne = nom + ";" + prnom +
";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + adresse + ";"
+ prnomnom + ";;;;;;;"
' fichier.Writeline ligne
Print #1, ligne
sel = Mid(sel, placevirgule + 1)
Wend
' traitement de la dernire occurrence
enreg = Trim(sel)
'fichier.Close

Chap18.fm Page 384 Mercredi, 24. janvier 2007 6:28 18

384

Chapitre 18. Grer des fichiers texte

Close #1
End Sub

Outre les fonctions dcriture de lignes dans un fichier texte, observez bien la manire dont les fonctions de chanes de caractres (Mid,
Instr, Left et Right) permettent danalyser un fichier pour en extraire
les informations pertinentes.

Crateur de fichiers batch


Sans tre pour autant ractionnaires, nous sommes un certain nombre penser que lon na pas fait grand-chose de mieux en programmation que les fichiers batch. Ces petits fichiers peuvent vous
conomiser des heures de travail fastidieux ; malheureusement, il
faut les crire et cela peut se rvler extrmement long et pnible.
Le programme suivant est un crateur de fichiers batch et en vous
inspirant de son principe, vous pourrez raliser toute une srie
dautres programmes sur le mme modle.
Pour notre travail, nous avons souvent besoin de dcompiler des
fichiers daide au format CHM (aide HTML compil). Il arrive que
ces fichiers soient trs nombreux et de plus quils soient au format
compress (extension CH_). Nous avons donc imagin une macro
VBA qui rcupre la liste de ces fichiers et gnre au choix un fichier
batch de dcompression et un fichier batch de dcompilation. Le formulaire illustr la figure 18.2 permet de rcuprer les informations
ncessaires (emplacement des fichiers traiter ; extension des
fichiers ; emplacement du traitement des fichiers).

Figure 18.2 Formulaire permettant la saisie des informations

Chap18.fm Page 385 Mercredi, 24. janvier 2007 6:28 18

Mise en pratique

385

Vous trouverez ci-dessous le gestionnaire dvnement du bouton


OK du formulaire.
Private Sub CommandButton1_Click()
Set objet = CreateObject("Scripting.FileSystemObject")
Set fichier = objet.CreateTextFile("C:\BATCH.txt", True)
MyPath = LTrim(RTrim(chemin.Value)) + "\" +
LTrim(RTrim(masque.Value)) ' Dfinit le chemin d'accs et le
masque
MyName = Dir(MyPath)
' Extrait la premire entre
If expand.Value Then ' on cre un fichier pour expand
ligne = "expand " + MyName + " " + Left$(MyName, Len(MyName) 1) + "M"
fichier.WriteLine ligne
Else
If decompile.Value Then
ligne = "hh -decompile " + RTrim(LTrim(destination.Value)) +
" " + MyName
fichier.WriteLine ligne
Else
fichier.WriteLine MyName
End If
End If
Do While RTrim(LTrim(MyName)) <> ""
' Commence la boucle
' Ignore le dossier courant et le dossier
' contenant le dossier courant.
MyName = Dir
' Extrait l'entre suivante
If MyName <> "" Then
If expand.Value Then ' on cre un fichier pour expand
ligne = "expand " + MyName + " " + Left$(MyName,
Len(MyName) - 1) + "M"
fichier.WriteLine ligne
Else
If decompile.Value Then
ligne = "hh -decompile " +
RTrim(LTrim(destination.Value)) + " " + MyName
fichier.WriteLine ligne
Else
fichier.WriteLine MyName
End If
End If
End If
Loop
fichier.Close
MsgBox ("Fichier BATCH.TXT cr sur C:\")
End Sub

Chap18.fm Page 386 Mercredi, 24. janvier 2007 6:28 18

386

Chapitre 18. Grer des fichiers texte

La figure 18.3 illustre le rsultat du fichier cr par ce programme.


Nous pouvons vous assurer que ce type de macro fait gagner un temps
prcieux et vite les erreurs qui se produisent invitablement lors du
traitement manuel de ce genre doprations.

Figure 18.3 Fichier cr laide de la macro


de cration de fichiers batch

CONCLUSION
La matrise de la cration des fichiers texte laide des objets
FileSystemObject et TextStream vous permettra de raliser des
tches que vous pensiez sans doute impossibles. En matire de
conversion de format de fichiers, vous allez pouvoir exporter des
donnes que vous pensiez perdues jamais. Quand on commence
explorer le domaine de la conversion de fichiers, on saperoit
trs vite quon peut raliser des prouesses sans dployer de grands
moyens. Il suffit juste de laisser son imagination prendre le pouvoir. En tudiant le format de certains fichiers, il est possible de
crer de toutes pices des fichiers dun format particulier sans
possder le logiciel correspondant. Si vous prenez la peine, par
exemple, danalyser dans le Bloc-notes, un fichier Excel enregistr au format SYLK, vous verrez quil est extrmement facile de
crer en VBA, laide des objets FileSystemObject et TextStream, un fichier SYLK. Et nous ne parlons mme pas des
fichiers HTML et XML

Chap19.fm Page 387 Mardi, 23. janvier 2007 5:26 17

19
Programmer
les API
API est un sigle qui signifie Application Programming Interface (Interface de Programmation dApplication).
En programmant lAPI Win32, vous allez pouvoir accder littralement des centaines de fonctions supplmentaires qui ne figurent pas
dans les modles dobjets des applications Office.
Ces fonctions vous permettent dobtenir des informations lies au
matriel ou bien au systme dexploitation.
Programmer lAPI Win32 nest pas de tout repos, mais le jeu en
vaut la chandelle car vous allez pouvoir programmer des fonctionnalits qui vous paraissaient jusque-l inaccessibles.
Tout au long de cet ouvrage, vous avez pu apprcier la richesse des
modles dobjets de Word, dExcel, dAccess, dADO, dOutlook et de
PowerPoint.
Cependant, avec VBA vous navez la matrise que des objets
dOffice et votre capacit dintervention sur le systme dexploitation
est minimale.
Grce lAPI Win32, vous ouvrez une porte sur le systme
dexploitation avec lequel vous pouvez communiquer.

Chap19.fm Page 388 Mardi, 23. janvier 2007 5:26 17

388

Chapitre 19. Programmer les API

Non seulement la programmation des API est parfois complexe,


mais elle est galement dangereuse. Dans la mesure o vous travaillez en relation troite avec le systme, ce dernier devient trs
vite instable. Si vous commettez une erreur dans le passage dun
paramtre, vous pouvez trs bien planter votre machine. La prudence est donc de mise et nous vous recommandons de mettre au
point vos appels de fonctions de lAPI Win32 dans des documents
sans importance. De la mme manire, il est judicieux de ne pas
ouvrir dapplication critique quand vous bricolez les API.

CONCEPT DAPI
Une API permet dappeler des fonctions qui ont t crites par
dautres programmeurs. Dans la pratique, ces fonctions figurent dans
des fichiers DLL (Dynamic Link Library ou Bibliothque de Liaison
Dynamique) du systme dexploitation. Parmi les DLL les plus connus que vous pouvez appeler partir de VBA figurent Kernel32.DLL
(fonctions de bas niveau sur le systme dexploitation comme la gestion de la mmoire), User32.DLL (fonctions de gestion du fentrage, des menus, des timers, etc.) et GDI32.DLL (GDI signifiant
Graphic Device Interface, cette DLL gre les aspects graphiques du
systme dexploitation). Ces DLL font partie de lAPI Win32 (version 32-bits de Windows), mais il existe dautres API, comme MAPI
(messagerie), par exemple.
Les fichiers DLL de lAPI Win32 contiennent donc des fonctions
qui peuvent tre appeles par nimporte quelle application tournant
sous Windows. lorigine, lAPI Win32 tait plutt conue pour les
programmeurs C et il faut bien avouer que la difficult de certains
appels de fonctions provient du fait quil y a incompatibilit entre certains types de donnes du langage C et les types de donnes du Visual
Basic.
Pour bnficier de la richesse des API, vous devez dabord connatre les fonctions qui sont disponibles. Internet est une bonne source
dinformations et la saisie dans un moteur de recherche de la chane
API VBA vous donnera dj de bons rsultats. Si vous matrisez

Chap19.fm Page 389 Mardi, 23. janvier 2007 5:26 17

Declare

389

langlais, le site de Microsoft donne de trs nombreux exemples de


fonctions API appelables partir de Visual Basic ou de VBA.
Une bonne rfrence est galement le fichier WIN32API.TXT.
Ce fichier est livr avec Visual Basic ou la version dveloppeur
dOffice. Vous pouvez galement le tlcharger sur le site de Microsoft. Ce fichier contient prs de 1 500 syntaxes dappels de fonctions
de lAPI Win32. Mme si ce fichier nest pas document et nindique
pas la nature de chaque fonction, le nom des fonctions est souvent
significatif et peut vous mettre sur la voie.
Une fois que vous connaissez les fonctions API qui vous intressent, vous devez apprendre appeler ces fonctions. Pour que VBA
puisse utiliser la fonction, il doit savoir o elle se trouve et la manire
de lappeler. On peut fournir ces informations en tablissant une rfrence avec la bibliothque de types de la DLL ou bien en utilisant une
commande Declare dans un module. Cest cette dernire mthode
que nous allons ici utiliser.

DECLARE
Linstruction Declare fournit VBA lemplacement de la fonction
en disant dans quelle DLL la fonction se trouve. De plus, elle indique la manire dappeler la fonction. Si vous ne connaissez pas la
syntaxe de dclaration dune fonction API, il est inutile dimproviser. Vous devez vous procurer un exemple ou bien regarder dans le
fichier WIN32API.TXT.
Lexemple suivant illustre la dclaration de la fonction GetTempPath qui permet de retourner le rpertoire temporaire de Windows
(en gnral C:\Windows\Temp) :
Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

Cette instruction Declare, que vous devez placer dans la section


Dclarations dun module, dit VBA que la fonction GetTempPath
se trouve dans le fichier intitul Kernel32.DLL (mot cl Lib). La
dclaration de la fonction peut tre prive (Private) ou publique selon

Chap19.fm Page 390 Mardi, 23. janvier 2007 5:26 17

390

Chapitre 19. Programmer les API

la visibilit que vous souhaitez donner la fonction. Le nom de la


fonction API suit le mot cl Function.
Le mot cl Alias procure la fonction un autre nom si bien que
vous avez la possibilit dutiliser cet alias pour appeler la fonction.
Cela est parfois ncessaire car certaines fonctions ont des noms qui ne
sont pas valides en VBA. Vous pouvez galement prfrer franciser les
noms des fonctions que vous utilisez. Dans notre cas, le suffixe A indique quil existe deux versions de la fonction : une version ANSI (suffixe avec un A) et une version Unicode (suffixe avec un W).
Entre parenthses se trouvent les deux arguments de la fonction.
Outre leur type de donnes (Long et String), vous pouvez voir le mot
cl ByVal. Lors du passage des paramtres une fonction, on distingue
deux mthodes diffrentes : le passage par valeur et le passage par rfrence. Quand on passe un paramtre par valeur, on passe une copie de
la valeur du paramtre dont loriginal reste intact. La fonction travaille donc sur une copie des donnes. En revanche, lors dun passage
par rfrence, on ne transmet quune rfrence la variable contenant la valeur du paramtre si bien que la valeur originale peut tre
modifie. Il est toujours plus prudent, lors de lappel dune fonction
API dutiliser un passage par valeur et cest la raison de la prsence du
mot cl ByVal qui indique un passage du paramtre par valeur.
Dune manire gnrale, vous devez recopier scrupuleusement
les dclarations de fonctions API que vous trouvez dans le fichier
WIN32API.TXT sans chercher les modifier.

APPEL DE FONCTION API


Une fois la dclaration de la fonction API acheve, vous pouvez
appeler la fonction comme nimporte quelle autre fonction dans vos
programmes VBA. Il faut cependant faire attention car la rcupration de linformation dsire nest pas aussi vidente que dans les
autres fonctions. Pour illustrer notre propos, voici un exemple
demploi de la fonction GetTempPath dont nous avons tudi la
dclaration prcdemment :

Chap19.fm Page 391 Mardi, 23. janvier 2007 5:26 17

Mise en pratique

391

Dim chemin_tempo As String


Dim longueur_chemin As Long
' on remplit la chane de caractres Null
chemin_tempo = String(250, vbNullChar)
longueur_chemin = 250
' Appel de GetTempPath et passages des paramtres
If GetTempPath(longueur_chemin, chemin_tempo) = 0 Then
MsgBox "Chemin temporaire introuvable"
Else
' le chemin a t stock dans le 2me paramtre
' on tronque la chane au premier caractre Null
chemin = Left(chemin_tempo, _
InStr(1, chemin_tempo, vbNullChar) - 1)
MsgBox chemin
End If

Vous noterez que le paramtre String est constitu dune srie de


caractres Null. La fonction crit le nom du rpertoire temporaire de
Windows dans la premire partie de la variable chemin_tempo dont
le reste de la chane demeure une suite de caractres Null. Les fonctions Left et InStr nous permettent de rcuprer la valeur exacte du
chemin temporaire. La fonction retourne en fait le nombre de caractres crits dans le paramtre String si bien que si ce nombre est gal
zro, cela signifie que la fonction na pas pu trouver le nom du chemin
temporaire.
Il faut passer une chane compose de caractres Null et la taille de
cette chane la fonction uniquement quand on souhaite rcuprer
une chane de caractres partir de la fonction.

MISE EN PRATIQUE
La pratique de lAPI Win32 est stimulante pour le programmeur
curieux et il existe de nombreux ouvrages consacrs uniquement
cette question. Vous trouverez ci-dessous quelques exemples qui
vous permettront de complter votre apprentissage.

Lecture dun fichier WAV


Vous voulez inclure la modalit sonore dans vos applications et vous
pensez juste titre que le bip du haut-parleur de votre ordinateur est

Chap19.fm Page 392 Mardi, 23. janvier 2007 5:26 17

392

Chapitre 19. Programmer les API

tristounet. Rien nest plus simple avec la fonction sndPlaySound !


Copiez la dclaration suivante dans un module :
Private Declare Function sndPlaySound Lib "winmm.dll" Alias _
"sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As
Long) _
As Long

Il suffit ensuite de passer en paramtre cette fonction le nom dun


fichier WAV et le tour est jou :
musique = sndPlaySound("C:\SON.WAV", 1)

Le paramtre 1 indique que le fichier sonore est jou de manire


asynchrone et que la fonction retourne immdiatement aprs le dbut
de la lecture du fichier.

Lecture dun fichier Midi


Vous dsirez prsent vous dtendre et couter des fichiers Midi
pendant que vous programmez. Rien de plus simple grce la fonction mciSendString qui envoie des commandes lAPI MCI qui
regroupe toute une srie de fonctions multimdia. Copiez cette
dclaration dans un module :
Public Declare Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, ByVal _
lpstrReturnString As Any, ByVal uReturnLength As Long,
ByVal _
hwndCallback As Long) As Long

Il suffit ensuite dinitialiser une variable pour la valeur de retour de


la fonction et une autre variable pour passer le chemin daccs et le
nom du fichier Midi que vous voulez jouer. Une commande MCI est
ensuite cre puis passe la fonction qui joue le fichier Midi.
Le code suivant illustre un exemple dutilisation de la fonction
mciSendString :
Dim ret As Integer
Dim musique As String
' le nom du fichier Midi jour
musique = "C:\Bond.MID"
' gnration de la commande MCI
ret = mciSendString( _

Chap19.fm Page 393 Mardi, 23. janvier 2007 5:26 17

Mise en pratique

393

"open " & musique & " type sequencer alias midi", _
0&, 0, 0)
' on donne un alias au priphrique Midi
ret = mciSendString("play midi wait", 0&, 0, 0)
' le son est jou en mode synchrone et le contrle
' ne retourne au programme qu'une fois la lecture acheve
ret = mciSendString("close midi", 0&, 0, 0)
' on ferme le priphrique Midi

Rcuprer des informations sur la configuration vido


Un bon programmeur doit prvoir tous les cas de figures possibles
(enfin presque) et une application doit pouvoir prendre en
compte des situations diffrentes. Une des raisons qui rendent la
programmation difficile est que lon ne sait jamais vraiment, quand
on crit des programmes pour les autres, sur quel type de machine
tournera la macro. Dans ces conditions, il peut se rvler important
darriver obtenir des informations sur la configuration de lutilisateur ce qui permet dagir en consquence. Si la rsolution de lcran
de lutilisateur ne permet pas de faire tourner votre application, il
vaut bien mieux avertir lutilisateur par un message poli et quitter le
programme plutt que dafficher un cran qui sera illisible et dont
lutilisateur ne saura pas quoi faire.
La fonction GetSystemMetrics permet de retourner toute une srie
dinformations sur la configuration vido dune machine.
Il faut dclarer la fonction de la manire suivante :
Declare Function GetSystemMetrics& Lib "User32" (ByVal nIndex&)

Pour utiliser la fonction, on dclare en gnral toute une srie de


constantes qui servent de paramtres la fonction. Ainsi la constante
SM_CXSCREEN dfinit la largeur de lcran :
Const SM_CXSCREEN = 0

Pour appeler la fonction, il suffit dappeler le code suivant :


Dim largeur As String
largeur = GetSystemMetrics(SM_CXSCREEN)
MsgBox largeur

Le tableau 19.1 fournit la liste des constantes principales de la


fonction GetSystemMetrics.

Chap19.fm Page 394 Mardi, 23. janvier 2007 5:26 17

394

Chapitre 19. Programmer les API

Tableau 19.1 Principales constantes de la fonction GetSystemMetrics


Constante

Valeur

Signification

SM_CXSCREEN

Largeur de lcran

SM_CYSCREEN

Hauteur de lcran

SM_CXFULLSCREEN

16

Largeur de la zone cliente de lcran

SM_CYFULLSCREEN

17

Hauteur de la zone cliente de lcran

SM_CYMENU

15

Hauteur de menu

SM_CYCAPTION

Hauteur du titre de la fentre

SM_CXFRAME

32

Largeur du cadre de la fentre

SM_CYFRAME

33

Hauteur du cadre de la fentre

SM_CXHSCROLL

21

Largeur de la flche dune barre de


dfilement horizontal

SM_CYHSCROLL

Hauteur de la flche dune barre de


dfilement horizontal

SM_CXVSCROLL

Largeur de la flche dune barre de


dfilement vertical

SM_CYVSCROLL

20

Hauteur de la flche dune barre de


dfilement vertical

SM_CXSIZE

30

Largeur de la barre de titre

SM_CYSIZE

31

Hauteur de la barre de titre

SM_CXCURSOR

13

Largeur du curseur

SM_CYCURSOR

14

Hauteur du curseur

SM_CXBORDER

Largeur de bordure non redimensionnable

SM_CYBORDER

Hauteur de bordure non redimensionnable

SM_CXDOUBLECLICK

36

Largeur de la zone du double-clic

SM_CYDOUBLECLICK

37

Hauteur de la zone du double-clic

Chap19.fm Page 395 Mardi, 23. janvier 2007 5:26 17

395

Mise en pratique

Tableau 19.1 Principales constantes de la fonction GetSystemMetrics


Constante

Valeur

Signification

SM_CXDLGFRAME

Largeur des botes de dialogue

SM_CYDLGFRAME

Hauteur des botes de dialogue

SM_CXICON

11

Largeur de licne

SM_CYICON

12

Hauteur de licne

SM_CXICONSPACING

38

Largeur de lespace entre les icnes du


Bureau

SM_CYICONSPACING

39

Hauteur de lespace entre les icnes du


Bureau

SM_CXMIN

28

Largeur minimale dune fentre

SM_CYMIN

29

Hauteur minimale dune fentre

SM_CXMINTRACK

34

Largeur minimale de tracking dune fentre

SM_CYMINTRACK

35

Hauteur minimale de tracking dune fentre

SM_CXHTHUMB

10

Largeur de la bote de dfilement dune


barre de dfilement horizontal

SM_CYVTHUMB

Hauteur de la bote de dfilement dune


barre de dfilement horizontal

SM_MOUSEPRESENT

19

Retourne une valeur diffrente de zro si


une souris est prsente

SM_SWAPBUTTON

23

Retourne une valeur diffrente de zro si les


boutons de la souris sont inverss

Macro globale de recherche-remplacement


Word possde une puissante fonction de recherche-remplacement,
mais elle nopre que sur le texte du document actif. Notre macro
perfectionne le systme en ce sens o elle va effectuer la recherche
sur tous les fichiers dun dossier. Pour grer la saisie des options de la
macro, nous avons bien entendu cr un UserForm.

Chap19.fm Page 396 Mardi, 23. janvier 2007 5:26 17

396

Chapitre 19. Programmer les API

Figure 19.1 UserForm servant dinterface pour


une macro globale de recherche-remplacement

Licne droite de la zone de texte Chemin permet dappeler une


bote de dialogue de slection de dossier. Il est impossible de faire appel
ce type de bote de dialogue dans Word et cest la raison pour laquelle
nous avons d employer un appel une fonction API. En cliquant sur
ce bouton, la bote de dialogue Rechercher un dossier saffiche et lutilisateur peut slectionner son dossier sans avoir saisir le chemin.

Figure 19.2 Bote de dialogue programme grce lAPI WIN32

Si vous essayez cette macro, testez-la sur un dossier qui ne contient que des fichiers sans importance car les modifications que
vous allez effectuer seront sauvegardes.

Chap19.fm Page 397 Mardi, 23. janvier 2007 5:26 17

Mise en pratique

397

La zone de liste Masque permet de slectionner un masque de


fichier comme *.*, *.doc, *.rtf ou *.txt. Les zones de texte Rechercher
et Remplacer correspondent aux champs classiques de la bote de dialogue de Word, tout comme les cases cocher Respecter la casse et
Mots entiers.
Voici le code de la dclaration API :
' Dclarations pour utiliser les fonctions API
' Ceci est ncessaire pour la fonction BrowseFolder
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll"
Alias _
"SHGetPathFromIDListA" (ByVal pidl As Long, _
ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll"
Alias _
"SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
As Long
Private Const BIF_RETURNONLYFSDIRS = &H1

Nous pouvons ensuite utiliser une fonction BrowseFolder dont


voici le code :
Public Function BrowseFolder(szDialogTitle As String) As String
' Fonction API pour rcuprer le nom d'un dossier
Dim X As Long, bi As BROWSEINFO, dwIList As Long
Dim szPath As String, wPos As Integer
With bi
.hOwner = hWndAccessApp
.lpszTitle = szDialogTitle
.ulFlags = BIF_RETURNONLYFSDIRS
End With

Chap19.fm Page 398 Mardi, 23. janvier 2007 5:26 17

398

Chapitre 19. Programmer les API

dwIList = SHBrowseForFolder(bi)
szPath = Space$(512)
X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
If X Then
wPos = InStr(szPath, Chr(0))
BrowseFolder = Left$(szPath, wPos - 1)
Else
BrowseFolder = vbNullString
End If
End Function

Le gestionnaire dvnement Click du bouton comportant licne


dun dossier se contente de faire un appel de fonction qui va remplir
automatiquement la zone de texte Chemin :
Private Sub nom_dossier_Click()
Chemin_text.Value = BrowseFolder("Dans quel dossier voulez-vous
faire le recherche/remplace ?")
End Sub

Il suffit ensuite de grer lvnement Click du bouton OK qui va se


contenter de rcuprer les valeurs des contrles et deffectuer les oprations de recherche-remplacement :
Private Sub OK_Click()
Dim compteur As Integer
compteur = 0 ' Compte le nombre doccurrences
With Application.FileSearch
.FileName = Masque_text.Value
.LookIn = Chemin_text.Value
.Execute
End With
' On parcourt les fichiers trouvs
For i = 1 To Application.FileSearch.FoundFiles.Count
' Ouvrir le fichier
Documents.Open
FileName:=Application.FileSearch.FoundFiles(i)
' On effectue la recherche et le remplacement
' en prenant comme paramtres les valeurs
' des contrles du formulaire UserForm
effectue la recherche et le remplacement
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Text = Rechercher_text.Value
Selection.Find.Replacement.Text = Remplacer_text.Value
Selection.Find.Forward = True

Chap19.fm Page 399 Mardi, 23. janvier 2007 5:26 17

Mise en pratique

399

Selection.Find.Wrap = wdFindContinue
Selection.Find.MatchCase = Casse_box.Value
Selection.Find.MatchWholeWord = MotsEntiers_box.Value
Selection.Find.Execute
Selection.HomeKey Unit:=wdStory
Do While Selection.Find.Found = True
compteur = compteur + 1
Selection.Collapse direction:=wdCollapseEnd
Selection.Find.Execute Replace:=wdReplaceOne
Loop
' Enregistrer le fichier
ActiveDocument.Save
' Fermer le fichier
ActiveDocument.Close
Next i
MsgBox "Nombre d'occurrences remplaces : " & compteur
End Sub

CONCLUSION
La dcouverte de la programmation de lAPI WIN32 vous ouvre
des horizons immenses et dcuple votre potentiel de programmation. Malheureusement, cest aussi un univers ingrat car la documentation sur les fonctions est assez lacunaire et bien souvent la
moindre erreur est sanctionne par un plantage de la machine.
Cest sans doute la raison pour laquelle des ouvrages sont entirement consacrs ce type de programmation et dcortiquent
par le menu les principales fonctions de lAPI. Vous trouverez
nanmoins sur Internet normment de fonctions prtes
lemploi qui auront t testes et dbogues par dautres programmeurs et que vous pourrez par consquent utiliser sans problme.

Chap19.fm Page 400 Mardi, 23. janvier 2007 5:26 17

Chap20.fm Page 401 Mardi, 23. janvier 2007 5:27 17

20
Dboguer un programme
Tout le monde sait prsent ce quest un bug tant linformatique a
pris de place dans nos vies quotidiennes. lorigine, ce terme ne
dsignait pourtant pas un problme logiciel, mais des insectes qui
causaient des dgts dans les cbles des premiers ordinateurs et les
empchaient ainsi de fonctionner. Les commissions de terminologie
sont passes par l et le terme a t francis en bogue, si bien que
lon dbogue un logiciel quand on recherche les erreurs de programmation. On rencontre aussi les termes dbogage (activit de dboguer) et dbogueur (outil logiciel servant dboguer).
Dans ce chapitre, nous allons voir comment traquer les erreurs qui
peuvent se glisser dans nos programmes.

ERREURS DE PROGRAMMATION
Un bug est une erreur de programmation dans un logiciel. Nous
allons voir quil existe diffrentes sortes de bugs, mais nous tenons
tout dabord vous rassurer sur la banalit de ces erreurs. Programmer, cest aussi accepter le fait de commettre des erreurs ; noubliez
jamais que la programmation est limage de la vie : on se trompe
tout le temps. Les programmes tant crits par des humains (et
mme si lon fait crire des programmes par dautres programmes, les
gnrateurs de code seront quand mme au bout du compte crits
par des tres humains), il est parfaitement normal quils comportent des erreurs de la mme manire que les noncs que nous pro-

Chap20.fm Page 402 Mardi, 23. janvier 2007 5:27 17

402

Chapitre 20. Dboguer un programme

duisons loral ou lcrit sont truffs de fautes (pourquoi croyezvous que mon diteur paye un relecteur ?).
Traquer les erreurs fait par consquent partie de la vie du programmeur et il ny a pas lieu de sen tonner. Il existe plusieurs types
derreurs que nous allons dtailler.

Erreurs de syntaxe
Comme le nom lindique, une erreur de syntaxe se produit quand
vous navez pas bien appliqu les rgles de grammaire du langage.
Les causes sont multiples, mais en gnral vous avez mal orthographi un mot cl du langage si bien que VBA ne reconnat pas ses
petits ou bien vous avez tout simplement oubli une partie de la syntaxe dune commande.
Par exemple, le programme suivant :
Dim varnum
varnum = InputBox("Entrez un nombre entier")
If varnum Mod 2 = 0
MsgBox ("Ce nombre est pair")
Else
MsgBox ("Ce nombre est impair")
End If

provoquera lapparition dune bote de dialogue indiquant le type de


lerreur.

Figure 20.1 Affichage dune erreur de syntaxe

Dans ce cas, le message de la bote de dialogue est suffisamment


explicite pour que lon saperoive tout de suite que lon a oubli le
mot cl Then dans la commande If. De plus, lors de lexcution du
programme, la ligne litigieuse sera affiche en rouge dans lditeur
Visual Basic, ce qui permet de localiser facilement lerreur.

Chap20.fm Page 403 Mardi, 23. janvier 2007 5:27 17

Erreurs de programmation

403

La bote de dialogue indique quil sagit dune erreur de compilation. Cela signifie que lerreur a t dtecte avant que le programme
ne soit excut. Quand vous lancez lexcution dune macro, le compilateur de VBA analyse le code source du programme et sil ny a pas
derreur, le programme est transform en code machine afin dtre
excut. Sil y a une erreur, le compilateur la signale grce une bote
de dialogue. En fait, le compilateur, avant toute chose, sassure de la
grammaticalit de votre programme. Il joue un peu le rle dun correcteur dorthographe et sassure que vous navez pas oubli de mot ou
bien mal orthographi une variable. Quand une erreur de syntaxe est
signale, le message derreur est en gnral suffisamment explicite
pour quelle soit rapidement dtecte puis rpare. Il suffit ensuite de
sauvegarder le programme et de relancer son excution. Sil y a
dautres erreurs de syntaxe, le compilateur les signalera nouveau
jusqu ce que vous les ayez toutes corriges. Cela signifie que
lorsquun programme sexcute il ne comporte aucune erreur de syntaxe ; cela est une premire garantie, mais vous ntes pas pour autant
assur que le programme fonctionne correctement
De plus, si vous avez coch la case Vrification automatique de la
syntaxe dans la bote de dialogue des Options (accessible via
OutilsOptions dans lditeur), lerreur sera signale lors de la saisie
du code dans lditeur. Ainsi, lerreur sera dtecte avant lexcution
du code.

Figure 20.2 Option de vrification automatique de la syntaxe

Chap20.fm Page 404 Mardi, 23. janvier 2007 5:27 17

404

Chapitre 20. Dboguer un programme

Dune manire gnrale, les erreurs de syntaxe sont trs vite rpares et sont dues principalement des erreurs dtourderie.

Erreurs dexcution
Les erreurs d'excution, que lon appelle aussi parfois erreurs runtime (runtime signifie excution en anglais), se produisent, comme
leur nom lindique, pendant lexcution dun programme VBA. Les
causes de ces erreurs peuvent tre trs variables, mais le message qui
saffiche donne en gnral des renseignements sur la cause de
lerreur.
Ainsi, la bote de message qui est illustre la figure 20.3 indique
clairement la nature de lerreur.

Figure 20.3 Affichage dune erreur dexcution

Quand vous cliquez sur le bouton Dbogage, VBA vous renvoie


dans lditeur et surligne en jaune la ligne qui a provoqu lerreur. En
loccurrence, il est ensuite trs facile pour le programmeur de prvoir
un test conditionnel qui sassure que le diviseur nest pas gal zro.
Vous noterez que par nature les erreurs dexcution ne peuvent se
dtecter que lors de lexcution du programme, mme si lerreur de
division par zro peut tre limine lors de la conception du programme.
Cela renforce lide que tester un programme une fois quil est termin est une absolue ncessit car ce nest quen situation relle que
lon peut vraiment se rendre compte des problmes ventuels.
Le tableau 20.1 liste les erreurs dexcution de VBA.

Chap20.fm Page 405 Mardi, 23. janvier 2007 5:27 17

405

Erreurs de programmation

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

Return sans GoSub.

Appel de procdure incorrect.

Dpassement de capacit.

Mmoire insuffisante.

Indice en dehors de la plage.

10

Ce tableau est fixe ou temporairement verrouill.

11

Division par zro.

13

Type incompatible.

14

Espace de chane insuffisant.

16

Expression trop complexe.

17

Impossible d'excuter l'opration requise.

18

Interruption par l'utilisateur.

20

Reprise sans erreur.

28

Espace pile insuffisant.

35

Sub, Function ou Property non dfinie.

47

Trop de clients d'application pour la DLL.

48

Erreur de chargement de la DLL.

49

Convention d'appel de DLL incorrecte.

51

Erreur interne.

52

Nom ou numro de fichier incorrect.

53

Fichier introuvable.

54

Mode d'accs au fichier incorrect.

55

Fichier dj ouvert.

57

Erreur d'entre/sortie de priphrique.

Chap20.fm Page 406 Mardi, 23. janvier 2007 5:27 17

406

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

58

Ce fichier existe dj.

59

Longueur d'enregistrement incorrecte.

61

Disque plein.

62

L'entre dpasse la fin de fichier.

63

Numro d'enregistrement incorrect.

67

Trop de fichiers.

68

Priphrique non disponible.

70

Permission refuse.

71

Disque non prt.

74

Impossible de renommer avec un lecteur diffrent.

75

Erreur dans le chemin d'accs.

76

Chemin d'accs introuvable.

91

Variable objet ou variable bloc With non dfinie.

92

Boucle For non initialise.

93

Format de chane incorrect.

94

Utilisation incorrecte de Null.

97

Impossible d'appeler une procdure Friend sur un objet qui nest pas
une instance de classe de dfintion.

98

Un appel de proprit ou de mthode ne peut pas faire rfrence un


objet priv ni en tant qu'argument ni en tant que valeur renvoye.

298

Impossible de charger la DLL systme

320

Impossible d'utiliser des noms de priphriques de caractres dans les


noms de fichiers spcifis.

321

Format de fichier incorrect.

322

Impossible de crer le fichier temporaire ncessaire.

Chap20.fm Page 407 Mardi, 23. janvier 2007 5:27 17

407

Erreurs de programmation

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

325

Format incorrect dans le fichier ressource.

327

La valeur de l'objet de donnes nomm est introuvable.

328

Paramtre incorrect. Impossible d'crire des tableaux.

335

Impossible d'accder au registre systme.

336

Le composant n'est pas correctement enregistr.

337

Composant introuvable.

338

Excution incorrecte du composant.

360

Objet dj charg.

361

Impossible de charger ou de dcharger cet objet.

363

Le contrle spcifi est introuvable.

364

L'objet tait dcharg.

365

Impossible de dcharger dans ce contexte.

368

Le fichier spcifi est prim. Ce programme requiert une version plus


rcente.

371

L'objet spcifi ne peut tre utilis come propritaire de la feuille pour


la mthode Show.

380

Valeur de proprit incorrecte.

381

Index du tableau de proprits incorrect.

382

Property Set ne peut pas tre excute en mode excution.

383

Property Set ne peut tre utilise avec une proprit en lecture seule.

385

Index de table de proprit requis.

387

Property Set non autorise.

393

Property Get ne peut pas tre excute en mode excution.

394

Property Get ne peut pas tre excute sur une proprit en criture
seule.

Chap20.fm Page 408 Mardi, 23. janvier 2007 5:27 17

408

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

400

Feuille dj affiche; affichage modal impossible.

402

Le code doit d'abord fermer la feuille modale de premier plan.

419

Autorisation d'utiliser l'objet refuse.

422

Proprit introuvable.

423

Proprit ou mthode introuvable.

424

Objet requis.

425

Utilisation d'objet incorrecte.

429

Un composant ne peut pas crer l'objet ou fournir une rfrence cet


objet.

430

Cette classe ne gre pas Automation.

432

Nom de fichier ou de classe non trouv pendant une opration


Automation.

438

Cet objet ne gre pas cette proprit ou mthode.

440

Erreur Automation.

442

La connexion la bibliothque de types ou d'objets pour un processus


distant a t perdue.

443

L'objet Automation n'a pas de valeur par dfaut.

445

L'objet ne gre pas cette action.

446

L'objet ne gre pas les arguments nomms.

447

L'objet ne gre pas les paramtres rgionaux en cours.

448

Argument nomm introuvable.

449

Argument non facultatif ou affectation de proprit incorrecte.

450

Nombre d'arguments incorrect ou affectation de proprit non valide.

451

Cet objet n'est pas une collection.

452

Numro incorrect.

Chap20.fm Page 409 Mardi, 23. janvier 2007 5:27 17

409

Erreurs de programmation

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

453

Fonction DLL spcifie introuvable.

454

Ressource de code introuvable.

455

Erreur de verrouillage de ressource de code.

457

Cette cl est dj associe un lment de cette collection.

458

Cette variable utilise un type non gr par Visual Basic.

459

Ce composant ne gre pas le jeu d'vnements.

460

Format de Presse-papiers incorrect.

461

Mthode ou membre de donnes introuvable.

462

Le serveur distant n'existe pas ou n'est pas disponible.

463

La classe n'est pas enregistre sur la machine locale.

480

Impossible de crer une image en mode AutoRedraw.

481

Image incorrecte.

482

Erreur d'imprimante.

483

Le gestionnaire d'imprimante ne gre pas la proprit spcifie.

484

Problme pour obtenir des informations du gestionnaire d'imprimante


du systme. Assurez-vous que le gestionnaire d'imprimante est install
correctement.

485

Type d'image incorrect.

486

Impossible d'imprimer l'image de feuille sur ce type d'imprimante.

520

Impossible de vider le Presse-papiers.

521

Impossible d'ouvrir le Presse-papiers.

735

Impossible d'enregistrer le fichier dans un rpertoire TEMP.

744

Le texte recherch est introuvable.

746

Remplacements trop longs.

31001

Mmoire insuffisante.

Chap20.fm Page 410 Mardi, 23. janvier 2007 5:27 17

410

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro

Description

31004

Pas d'objet.

31018

Classe non dfinie.

31027

Impossible d'activer l'objet.

31032

Impossible de crer un objet incorpor.

31036

Erreur l'enregistrement dans le fichier.

31037

Erreur de chargement partir du fichier.

Erreurs de logique
Les erreurs de logique sont les plus difficiles dtecter car aucune
bote de dialogue ne vient les signaler. Appeles galement erreurs
de conception, il sagit derreurs qui ne font pas planter lordinateur,
mais qui font que le programme ne fonctionne pas comme on le souhaiterait. Parmi les exemples typiques derreurs de logique, on peut
citer les boucles infinies ou bien les boucles dans lesquelles le programme ne rentre mme pas parce que la condition dentre nest
jamais vraie. Il arrive que lon trouve dans certains programmes du
code totalement inutile qui ne sert strictement rien parce que les
lignes de code en question ne sont jamais excutes.
On se rend en gnral compte quil y a une erreur de logique parce
que le programme ne fonctionne pas comme on sy attend. Dans ces
cas-l, on commence en gnral relire son code et il arrive parfois
que lon dtecte lerreur. Il y a malheureusement des cas o lon a beau
carquiller les yeux, mais on ne voit strictement rien. Il faut alors passer la vitesse suprieure et dboguer le programme.

DBOGAGE
Le dbogage consiste partir la recherche des erreurs de programmation avec un outil spcialis que lon appelle un dbogueur. En
gnral, on utilise un dbogueur uniquement pour traquer les erreurs

Chap20.fm Page 411 Mardi, 23. janvier 2007 5:27 17

Dbogage

411

de logique car la cause des erreurs de syntaxe et des erreurs dexcution est facilement identifiable. Un dbogueur agit de deux manires sur votre programme : premirement, il en contrle lexcution
et deuximement il permet de voir ce qui se passe lintrieur,
notamment en autorisant la visualisation de la valeur des variables
un moment donn. Cette fonctionnalit est trs intressante et elle
permet souvent de comprendre pourquoi le programme ne fonctionne pas.
Par exemple, quand on se trouve dans la situation o le programme
ne rentre pas dans une boucle ou bien narrive pas en sortir, le dbogueur va permettre de visualiser la valeur de la condition dentre ou
de sortie de la boucle. En fait, si vous rflchissez bien, vous pouvez
parfaitement obtenir des informations sur votre programme en vous
servant uniquement de la fonction MsgBox dont jai lhabitude de
dire quil sagit du premier outil de dbogage.
En effet, quand vous tes en train dcrire un programme dont vous
navez pas bien dtermin lalgorithme, il peut tre trs intressant de
truffer son logiciel de fonctions MsgBox qui renseignent sur ltat
dune variable ou dune expression. Rien dailleurs ne vous empche
de laisser ces lignes de code dans votre programme une fois quil est
termin et de vous contenter de les mettre en commentaire ( laide
du caractre apostrophe) quand vous diffusez le programme. En cas de
problme dans votre programme, il suffit de supprimer lapostrophe
pour remettre en route votre systme personnel de dbogage.
Si lon reprend lexemple du programme de jeu qui a t dvelopp
au chapitre 13, rien ninterdit, par exemple, de transformer le code
suivant :
For i = 1 to longueur_mot
If mid(chaine,i,1) = mid(motif, i , 1) Then
bp = bp + 1
Else
' les caractres bien placs sont supprims des chanes
chainemp = chainemp + mid(chaine,i,1)
motifmp = motifmp + mid(motif,i,1)
End If
Next

Chap20.fm Page 412 Mardi, 23. janvier 2007 5:27 17

412

Chapitre 20. Dboguer un programme

en :
For i = 1 to longueur_mot
If mid(chaine,i,1) = mid(motif, i , 1) Then
bp = bp + 1
Else
' les caractres bien placs sont supprims des chanes
chainemp = chainemp + mid(chaine,i,1)
motifmp = motifmp + mid(motif,i,1)
End If
MsgBox CStr(bp) + vbCr + _
chaine + vbCr + _
motif + vbCr + _
chainemp + vbCr + _
motifmp
Next

Le rsultat du code de dbogage est illustr la figure 20.4 ; chaque tour de boucle, la fonction MsgBox affiche le contenu des variables bp (compteur de lettres bien places), chaine, motif, chainemp et
motifmp. Bien videmment, ce code doit tre supprim ou mis en
commentaire lors de la diffusion du programme, mais il faut reconnatre que cela permet moindre cot davoir de nombreuses informations sur ce qui se passe lintrieur du programme. Vous pouvez ainsi
trs simplement vrifier que votre programme se comporte comme
vous le souhaitez.

Figure 20.4 La fonction MsgBox


peut faire office de dbogueur

Mme si lusage de la fonction MsgBox est trs performant, il y aura


cependant des situations o cet outil sera inoprant et o il faudra
passer la vitesse suprieure, cest--dire utiliser un dbogueur.

Chap20.fm Page 413 Mardi, 23. janvier 2007 5:27 17

413

Dbogueur

DBOGUEUR
Le dbogueur est un logiciel dans lequel vous allez pouvoir excuter
votre programme. Votre code sexcutera sous le contrle du dbogueur et vous pourrez tout moment en arrter lexcution pour
scruter le contenu dune variable ou bien encore tester la valeur
dune expression. Lditeur de Visual Basic possde une fonctionnalit de dbogage si bien que vous navez pas besoin dun autre logiciel pour dboguer vos macros VBA.

Lancement du dbogueur
Il y a plusieurs manires de dclencher lexcution du dbogueur de
lditeur Visual Basic. La premire mthode consiste cliquer sur le
bouton Dbogage de la bote de dialogue qui signale une erreur et
propose un dbogage. Vous pouvez galement lancer lexcution de
votre programme en mode pas pas, ce qui signifie que vous excutez une seule ligne de votre code la fois. Vous pouvez galement
placer un point darrt dans votre programme ; quand le programme
rencontre le point darrt, il stoppe son excution et passe la main
au dbogueur. Vous pouvez enfin inclure linstruction Stop dans
votre programme. la lecture de cette instruction, le programme
sarrte et passe en mode dbogage.

Figure 20.5 Menu Dbogage


de lditeur Visual Basic

Chap20.fm Page 414 Mardi, 23. janvier 2007 5:27 17

414

Chapitre 20. Dboguer un programme

Quel que soit le mode de lancement du dbogage que vous utilisez,


vous devez bien comprendre que le dbogueur permet de regarder ce
qui se passe sous le capot ; en mode dbogage, vous avez la possibilit
de vous arrter sur chaque ligne de code et de visualiser ltat de toutes
les variables du programme.

Fonctionnement du dbogueur
Pour illustrer le fonctionnement du dbogueur, nous allons prendre
un exemple pratique. Nous avons lgrement modifi notre programme de Mastermot qui prsente dsormais un fonctionnement
trange. Quand on saisit pour le premier coup une proposition, le
programme affiche immdiatement la solution (figure 20.6) en prtendant que lon na pas trouv la solution en 10 coups.

Figure 20.6 Le jeu ne permet


plus de jouer quun seul coup

Pour tester le comportement de ce programme que nous avons


nomm debugmaster, il vous suffit de lexcuter. Vous trouverez cidessous lextrait de code que nous avons modifi, les autres parties du
code (tirage alatoire du mot et fonction danalyse de la saisie du
joueur) nayant pas t changes :
coup = 1
histo = ""
Do
Do While Len(essai) <> longueur_mot

Chap20.fm Page 415 Mardi, 23. janvier 2007 5:27 17

Dbogueur

415

essai = InputBox("Saisissez un nom au singulier de " &


longueur_mot & " lettres en minuscules" _
+ vbCr & histo, _
"Essai n " & coup)
' Analyse de la rponse
' on supprime les espaces ventuellement saisis
essai = Trim(essai)
' on teste si le mot a la bonne longueur
If Len(essai) <> longueur_mot Then
MsgBox essai & " n'est pas un nom de " & longueur_mot & "
caractres" _
, vbExclamation + vbOKOnly, "Erreur de saisie !!!"
Else
Exit Do
End If
Loop
' si le mot a t trouv
If essai = mot Then
MsgBox "Bravo ! Vous avez gagn en " & coup & " coups." _
+ vbCr + "Le mot trouver tait bien : " & mot _
+ vbCr + histo, , "Fin de la partie"
vainqueur = True
Exit Do ' on sort de la boucle principale
Else ' analyse de la rponse
' on utilise une fonction pour une plus grande lisibilit
histo = histo + essai + " : " + analyse(essai, mot,
longueur_mot) + vbCr
End If
coup = coup + 1
Loop Until coup = max_coups + 1

Si vous relisez ce programme et arrivez trouver sur le papier o se


situe le problme, cest que vous tes dj devenu un bon programmeur VBA. Si tel nest pas le cas, vous allez apprendre utiliser le
dbogueur.
Dans la fentre de code de lditeur Visual Basic, la macro debugmaster tant affiche, slectionnez la ligne Do qui reprsente le point
dentre de la boucle principale et appuyez sur la touche F9. Vous pouvez aussi utiliser la commande Basculer le point darrt du menu
Dbogage ou bien encore cliquer dans la marge gauche de lditeur. La
ligne que vous avez slectionne est surligne en rouge et un point de
la mme couleur saffiche dans la marge (figure 20.7).

Chap20.fm Page 416 Mardi, 23. janvier 2007 5:27 17

416

Chapitre 20. Dboguer un programme

Figure 20.7 Pose dun point darrt dans le code

Vous venez de dfinir un point darrt. Comme son nom lindique,


un point darrt va vous permettre darrter lexcution du code et
nous allons voir dans un instant que cela ouvre de nombreuses perspectives.
Pour lancer lexcution de votre macro, appuyez sur la touche F5
ou bien choisissez la commande Excuter Sub du menu Excution.
Vous pouvez aussi faire afficher la barre doutils Dbogage en slectionnant la commande AffichageBarres doutilsDbogage.

Figure 20.8 Barre doutils Dbogage

Cette barre doutils reprend toutes les commandes du menu Dbogage. Passez lentement au-dessus de chaque icne afin de faire afficher
une info-bulle qui vous renseignera sur la fonction de chaque outil. En
mode dbogage, vous avez intrt utiliser cette barre doutils ou les
touches de fonction plutt que les commandes du menu Dbogage.

Chap20.fm Page 417 Mardi, 23. janvier 2007 5:27 17

417

Dbogueur

Aprs avoir appuy sur F5, la macro dmarre normalement et la


rgle du jeu saffiche. Cliquez sur le bouton OK de la bote MsgBox.
La ligne Do est surligne en jaune et le point rouge dans la marge
comporte dsormais une flche jaune.

Figure 20.9 Le point darrt a stopp


lexcution du programme

Le point darrt a donc bien jou son rle et le dbogueur a suspendu lexcution du programme et il attend vos instructions.
Comme vous tes curieux, vous aimeriez bien connatre le mot que
lordinateur a slectionn. Il ny a rien de plus simple : slectionnez
loption Fentre Excution du menu Affichage. Une fentre souvre et
vous allez pouvoir y saisir des commandes. Cette fentre vous permet
de connatre la valeur dune variable ou dune expression.
Saisissez la commande :
? mot

Le point dinterrogation est la commande pour faire afficher. Instantanment, le mot slectionn par lordinateur saffiche.

Figure 20.10 Utilisation de la fentre de commande


pour connatre la valeur dune variable

prsent, il est temps de chercher comprendre pourquoi notre


macro ne se comporte pas de la manire dont nous lescomptons. Pour

Chap20.fm Page 418 Mardi, 23. janvier 2007 5:27 17

418

Chapitre 20. Dboguer un programme

ce faire, nous allons utiliser le mode dexcution pas pas qui, comme
son nom lindique, permet dexcuter une seule ligne de code la fois.
Ainsi, vous pouvez aprs lexcution de chaque ligne de code, tester
les valeurs de toutes les variables du programme et vous pouvez surtout visualiser le cheminement du programme.
Pour excuter le script en mode pas pas, saisissez la touche de fonction F8 ou bien choisissez la commande Pas pas dtaill du menu Dbogage (vous pouvez aussi cliquer sur licne dans la barre doutils). La ligne
qui suit le point darrt est surligne en jaune, puis la commande est excute. Appuyez nouveau sur la touche F8. Dans la mesure o il sagit de
la fonction InputBox, la bote de dialogue de saisie saffiche. Saisissez un
mot de 7 lettres et validez votre proposition.

Figure 20.11 Excution dun script en mode pas pas

La bote de dialogue sefface et vous revenez la fentre daffichage


du dbogueur. La ligne qui suit la fonction InputBox est surligne en
jaune et il vous faut nouveau appuyer sur F8 pour lexcuter. Continuez appuyez sur F8 pour progresser dans lexcution du programme.
Si vous avez bien saisi un mot de 7 caractres, vous constatez que le
programme teste la longueur de votre saisie (If len(essai) <>
longueur_mot Then) puis passe directement sur la ligne Exit Do pour
se positionner ensuite sur la ligne If essai = mot Then. Comme en
gnral, il est assez rare de trouver le bon mot du premier coup, le code
passe dans la fonction danalyse de votre saisie.
Il vous faut alors appuyer de nombreuses fois sur la touche F8 pour
que le code de la fonction sexcute compltement. Cela est un peu
fastidieux, mais prenez au moins le temps une fois dexaminer le che-

Chap20.fm Page 419 Mardi, 23. janvier 2007 5:27 17

Dbogueur

419

minement de lexcution des lignes de code. Quand on dbute en programmation, cela est extrmement formateur.
Aprs de nombreux pas de programmation, lexcution arrive enfin
sur la ligne analyse = "BP : " & bp & " ; " & "MP : " & mp, et vous allez
pouvoir sortir de la fonction. Pendant toute lexcution en pas pas
du code de la fonction, vous pouvez en profiter pour ouvrir la fentre
de commande et visualiser ltat dune variable.
Au sortir de la fonction, le dbogueur sarrte sur la ligne coup =
coup + 1. Puis cest au tour de la ligne Loop Until coup = max_coups
+ 1 dtre value et le programme remonte sur la boucle imbrique
(Do While len(essai) <> longueur_mot) et lon sattend ce que le
prochain appui sur la touche F8 nous propose une nouvelle saisie
grce la fonction InputBox. Mais l, point de saisie ! Le programme
nous propulse directement sur la ligne If essai = mot Then. On ne
comprend pas vraiment ce qui se passe et lon se perd en conjectures.
Cest le moment dutiliser la fentre de commande et de saisir :
? essai

On saperoit alors que la variable essai a gard la valeur de


lancienne saisie. Si lon examine la condition dentre de la boucle,
on saperoit quil faut que la longueur de la variable essai soit diffrente de 7. Comme il est galement possible dvaluer des expressions
dans la fentre de commande, on saisit alors :
? len(essai)

et on saperoit que la longueur de notre variable est bien gale 7,


raison pour laquelle le programme ne rentre pas dans la boucle puisque la condition dentre nest pas vraie.

Figure 20.12 Test dune expression dans la fentre de commande

Chap20.fm Page 420 Mardi, 23. janvier 2007 5:27 17

420

Chapitre 20. Dboguer un programme

Si vous continuez appuyer sur la touche F8, vous refaites nouveau tout le parcours danalyse de la rponse, mais cest toujours la
premire tentative qui est value.
Vous avez la possibilit dexcuter lappel de fonction en une seule
fois. Pour ce faire, appuyez sur les touches Ctrl + Maj + F8 ou bien
choisissez la commande Pas pas sortant du menu Dbogage. Cette
option excute les lignes restantes de la procdure en cours. La commande suivante qui est affiche est celle qui suit lappel de procdure
ou de fonction. Quand on a, comme dans notre exemple, un appel de
fonction qui comporte de nombreuses lignes de code, cela permet de
gagner du temps une fois que lon a test et valid les lignes de code de
la fonction.
Pour rgler notre problme, il suffit alors de rinitialiser la variable
essai la fin de la boucle, en lui affectant une chane vide :
coup = coup + 1
essai = ""
Loop Until coup = max_coups + 1

Cet exemple montre bien lutilit dun dbogueur. Dans ce cas, il


nous a permis de bien comprendre o se situait le problme. Cest un
outil indispensable lors de la dtection derreurs de conception, mais le
dbogueur se rvle galement prcieux pour bien comprendre le cheminement du code dans les structures de contrle. En phase dapprentissage dun langage, il est trs formateur dexcuter ses programmes sous
le contrle du dbogueur, mme ci ces derniers ne plantent pas.

Visualisation des variables dans le dbogueur


Nous avons vu comment utiliser la fentre Excution pour visualiser
le contenu dune variable ou dune expression. Vous avez galement
dautres possibilits pour contrler la valeur de vos variables.
Dans le menu Affichage, slectionnez la commande Fentre Variables locales. Une fentre intitule Variables locales souvre en bas de
lditeur. Vous pouvez constater que cette fentre contient toutes les
variables qui ont t dclares dans le programme. La deuxime
colonne indique la valeur de la variable et la troisime colonne le type
de la variable. Cette fentre est mise jour en temps rel au fur et
mesure que vous progressez dans lexcution des lignes du code. Vous

Chap20.fm Page 421 Mardi, 23. janvier 2007 5:27 17

Gestion des erreurs

421

pouvez ainsi surveiller la valeur dune variable au fur et mesure de


lavancement du programme.

Figure 20.13 Visualisation des variables dans la fentre Variables locales

Il existe galement un moyen trs simple de connatre la valeur dune


variable quand on est en mode dbogage : il suffit de passer le curseur de la
souris sur le nom de la variable dans lditeur de code. ce moment-l,
une info-bulle apparat et affiche le nom de variable et sa valeur.

Figure 20.14 Visualisation de la valeur dune variable dans une info-bulle

GESTION DES ERREURS


Malgr tout le soin que vous allez apporter votre code, il se produira quand mme des erreurs, dont certaines ne sont pas vraiment
de votre fait ou bien sont difficilement prvisibles. Vous pouvez
minimiser les effets de ces erreurs en tentant de les grer.
VBA possde dailleurs un objet, baptis Err, dont le rle est de
fournir des informations sur les erreurs dexcution qui se produisent.

Chap20.fm Page 422 Mardi, 23. janvier 2007 5:27 17

422

Chapitre 20. Dboguer un programme

Utilis en conjonction avec certaines commandes, lobjet Err permet


de mieux grer les situations dlicates. Voici le schma de principe
dune gestion derreur :
Dans la partie du code qui est susceptible de provoquer une erreur
dexcution, on utilise la commande On Error Resume Next ; en
anglais, resume est un faux ami et ne signifie pas rsum, mais
reprendre. Cette commande permet donc quand une erreur se
produit de lignorer puis de passer la commande suivante qui est
excute normalement.
Grce aux proprits de lobjet Err, on peut avoir une ide trs
prcise de la nature de lerreur et on peut par consquent adopter
une conduite approprie.
On annule lobjet Err afin de permettre le traitement dautres
erreurs.
Parmi les traitements appropris des erreurs, on peut citer :
Retranscription dun message derreur plus clair qui permet lutilisateur de rgler le problme (par exemple, lecteur de disquette non prt).
Gestion de lerreur par programmation.
Accord dune nouvelle tentative lutilisateur.
Message lutilisateur lui expliquant la dmarche suivre pour
faire un compte rendu derreur (en effet, la plupart des utilisateurs
ne savent pas dcrire correctement les erreurs quils ont rencontres, ce qui rend le dpannage plus difficile).
Journalisation de lerreur ; en vertu de ce qui a t dit, le plus simple, en cas derreur dexcution, est de crer un fichier texte (
laide de lobjet FSO) qui dcrit la nature du problme en interceptant les informations dlivres par lobjet Err. Il faut galement faire figurer dans ce journal la date et lheure o le problme
sest produit. En possession de ce fichier texte, vous serez dans de
meilleures conditions pour analyser le problme.
Lexemple suivant montre comment on peut rcuprer les proprits de lobjet Err en cas derreur :
Dim varnum
varnum = InputBox("Entrez le chiffre zro")
On Error Resume Next
MsgBox 100 / varnum
MsgBox ("Erreur N" & CStr(Err.Number) & " " & Err.Description)
Err.Clear ' efface l'erreur

Chap20.fm Page 423 Mardi, 23. janvier 2007 5:27 17

423

Gestion des erreurs

Figure 20.15 Affichage des proprits


de lobjet Err aprs une erreur dexcution

Vous noterez que les proprits Err.Number et Err.Description renvoient des valeurs qui correspondent aux informations qui sont listes
dans le tableau 20.1.
Pour blinder son programme, il est ainsi possible dcrire des bouts
de code, appels gestionnaire derreur, qui tentent de prendre en
charge les principales erreurs dexcution qui sont susceptibles de survenir dans une macro.

CONCLUSION
Nous avons vu dans ce chapitre diffrentes techniques qui vous
permettent de traquer efficacement les erreurs dans les programmes. Mais si la rpression est indispensable, une bonne dose de
prvention vous vitera galement bien des ennuis. Nous voulons dire par l que plus la conception dun logiciel est soigne,
moins les erreurs seront nombreuses. En clair, le temps que vous
ne passez pas lors de la conception crire un logiciel de qualit,
vous serez oblig de le dpenser lors de la phase de mise au point.
Moralit : vous allez de toutes les faons passer du temps ; vous
de choisir si vous prfrez corriger les erreurs que vous avez gnres cause dune conception bcle.
Noubliez pas galement que la documentation de votre macro
facilite le dbogage. Ne cdez pas la facilit : dclarez explicitement vos variables, employez des noms significatifs et abusez des
commentaires. Concevez des programmes modulaires et crivez
des fonctions chaque fois que cela est possible. Le dbogage sen
trouvera facilit.

Chap20.fm Page 424 Mardi, 23. janvier 2007 5:27 17

Chap21.fm Page 425 Mardi, 23. janvier 2007 5:16 17

21
Aller plus loin
Compte tenu de la taille de cet ouvrage et de la vise pdagogique
qui est la ntre, nous navons pas t exhaustifs sur le sujet de la programmation VBA.
Cela na gure dimportance car, en tant que dbutant, vous avez de
trs nombreuses notions assimiler et dj beaucoup de pain sur la
planche. Dautant plus quon apprend surtout la programmation en
crivant des programmes ; dans la pratique, cela signifie que vous
devez ressaisir ou charger tous les codes de ce livre dans lditeur de
programmes, les excuter, comprendre comment ils fonctionnent et
les modifier votre convenance.
Mais il arrivera sans doute un jour o vous buterez sur des problmes qui nont pas t abords dans ce livre, et vous ressentirez alors le
besoin et lenvie daller plus loin dans lapprentissage de la programmation VBA.
Cette dernire leon vous donne des pistes de travail et des axes de
recherche pour parfaire vos connaissances en la matire.

ORGANISER LES MACROS


Dans ce livre, nous avons crit nos macros sans vraiment nous soucier
de lendroit o nous les stockions. Si vous crivez des projets de taille
modeste, vous pouvez continuer crire vos programmes directement
dans les documents ou bien dans des modles globaux. Si vos projets

Chap21.fm Page 426 Mardi, 23. janvier 2007 5:16 17

426

Chapitre 21. Aller plus loin

prennent de lampleur, vous ressentirez vite le besoin de mettre un peu


dordre dans vos programmes. Il vous faudra alors tudier la notion de
module qui permet de regrouper des procdures et des fonctions.
Conjointement au concept de module, vous dcouvrirez la notion
de porte (scope en anglais) pour les procdures et les fonctions ; cette
notion nest pas toujours vidente comprendre, mais elle se rapproche de la notion de porte que nous avons tudie pour les variables.
Pour faire simple, nous dirons que la porte dun programme permet
de dlimiter son champ daction. Les mots cl Private, Public et Static
servent dfinir la porte dune procdure ou dune fonction.
Dans un autre domaine, vous pouvez protger vos macros en leur
attribuant un mot de passe (dans longlet Protection de la commande
OutilsProprits de Project de lditeur de programmes).

Figure 21.1 Protection de votre code par un mot de passe

Ceci empchera en thorie les curieux daller examiner le code de


vos macros. Faites attention cependant ne pas oublier ce mot de
passe ; si tel tait le cas, vous seriez alors dans lobligation de faire
appel aux services dune socit spcialise dans la rcupration des
mots de passe.
De telles socits de service sont prsentes sur Internet (par exemple http://www.elcomsoft.com/) et le faible cot de leurs utilitaires

Chap21.fm Page 427 Mardi, 23. janvier 2007 5:16 17

Prendre de bonnes habitudes

427

limite donc fortement lintrt de la protection de vos uvres par un


mot de passe
Word, Excel, PowerPoint et Access ont la possibilit dexcuter des
macros automatiquement au dmarrage. Dans le cas de Word, si vous
souhaitez, par exemple, que votre ordinateur salue votre collaboratrice tous les matins quand elle arrive au bureau, il vous suffit de crer,
dans le modle global Normal.DOT, une macro nomme
AUTOEXEC :
Sub autoexec()
MsgBox ("Bonjour Nicole !" & Chr$(13) & _
"Nous sommes le " & jour(Weekday(Date)) _
& " " & Str(Day(Date)) & " " & MonthName(Month(Date)) _
& " " & Str(Year(Date)))
End Sub

Petite prcision : si vous navez pas de secrtaire, vous pouvez toujours remplacer la chane de caractres Nicole par votre prnom ;
le programme fonctionnera tout aussi bien et vous serez quand mme
trs heureux.
Les rpertoires de dmarrage jouent galement un rle trs important dans Office et vous aurez tout intrt bien comprendre la
manire dont ils sont conus.

PRENDRE DE BONNES HABITUDES


Prendre de bonnes habitudes ds le dpart est essentiel ; dans la
mesure o vous tes dbutant en programmation, vous avez la
chance de navoir subi encore aucune mauvaise influence et vous
avez donc toutes les chances de votre ct. Mais faites attention, les
mauvaises habitudes se prennent trs vite et sont terriblement difficiles abandonner.
Au fil du temps, les programmeurs saccordent souvent des drogations aux principes canoniques et une accumulation dentorses aux
rgles les plus lmentaires peut faire courir la catastrophe. La programmation est une science rigoureuse qui tolre trs mal les approximations.

Chap21.fm Page 428 Mardi, 23. janvier 2007 5:16 17

428

Chapitre 21. Aller plus loin

Au risque de rappeler un truisme, la premire habitude prendre


consiste faire rgulirement des sauvegardes de ses programmes (les
donnes doivent bien videmment tre aussi sauvegardes). Il peut
vous paratre insultant dnoncer une telle vidence, mais une assez
longue pratique de la micro-informatique dmontre que certains de
mes contemporains nobissent pas toujours aux lois de la raison
Le deuxime conseil que je prodiguerai a trait la documentation
des programmes. Vous devez documenter tous les programmes qui font
plus de trois lignes. Cette documentation servira dabord vousmme ; quand vous modifierez un programme crit quelques mois plus
tt, la documentation vous aidera comprendre ce que vous avez
voulu faire. De la mme manire, si un autre programmeur doit lire un
de vos programmes, la documentation lui fera gagner du temps.
La documentation dun programme peut revtir plusieurs formes :
elle peut tre interne au programme ou bien externe.
La documentation interne du programme se compose essentiellement des commentaires. Nous avons dj insist sur limportance des
commentaires et nous allons prsent dtailler leurs rgles dcriture.
Chaque programme devrait commencer par un en-tte compos :

du nom du programme,
du nom du programmeur,
de la date de cration,
de la date de dernire modification,
de lobjet du programme.

la fin de cet en-tte doit se trouver le bloc dinitialisation des


variables. Comme nous lavons dj dit, chaque variable doit tre
dclare explicitement.
Vous devez dcrire sommairement, dans un commentaire, lobjet
de la variable ; de plus, vous devez choisir un nom particulirement
significatif pour vos variables. Il existe plusieurs conventions concernant lattribution des noms aux identificateurs (variables, constantes,
fonctions, procdures, etc.) ; les plus connus se nomment notation
hongroise ou bien notation de Lezinsky.
La plupart de ces conventions proposent de prfixer les variables
avec un code qui identifie le type de donnes de la variable. Ainsi,

Chap21.fm Page 429 Mardi, 23. janvier 2007 5:16 17

Prendre de bonnes habitudes

429

nAnnee reprsente une variable de type numrique et cMois une


variable de type caractre. Mme si vous ne respectez pas totalement
ces principes, il est important que vous adoptiez ce genre de conventions, quitte forger votre propre systme de prfixes.
Une fois les variables dclares, vous devez commenter abondamment votre code. Un bon commentaire doit tre plac au bon endroit
et ne pas tre trop verbeux. Il ne faut pas tomber dans lexcs inverse
qui consiste commenter chaque ligne et crire un roman en guise
de commentaire.
Un commentaire doit expliquer ce qui doit ltre et il est donc inutile de clarifier ce qui est vident. En revanche, commentez les expressions complexes, les structures de contrle imbriques et les appels des
fonctions que vous avez crites. Dans la mesure o un commentaire
doit tre bref, vous ne devez pas hsiter crire en style tlgraphique.
Vous devez couper les lignes trop longues de manire ce quelles
ne dpassent pas la taille de votre cran, car il ny a rien de plus pnible, quand on lit du code, que dtre oblig de faire dfiler horizontalement lcran.
Songez enfin indenter vos programmes pour bien faire ressortir les
structures de contrle. Cette recommandation devient une ncessit
quand vous avez des boucles ou des tests conditionnels imbriqus.
La documentation externe du programme est compose de tous les
documents qui ont servi lanalyse du programme ; il peut sagir du
cahier des charges, de copies dcran, etc.
Notez quil nest sans doute pas inutile dimprimer ses programmes ;
cela constitue dailleurs une certaine mthode de sauvegarde. Access,
enfin, a son propre outil de documentation et nous vous conseillons
de lutiliser.
Le dernier conseil que je vous donnerai concerne le style de votre
programmation. Recherchez la simplicit ! Dcomposez les problmes
en units simples et prfrez une solution plus claire, mme si son
temps dexcution est moins rapide. crivez des fonctions et des procdures que vous pourrez rutiliser facilement et qui rendront vos programmes modulaires.

Chap21.fm Page 430 Mardi, 23. janvier 2007 5:16 17

430

Chapitre 21. Aller plus loin

SE DOCUMENTER
Linformation a une importance capitale quand on programme. Les
manuels imprims ayant disparu des botes des logiciels, la majeure
partie de la documentation est prsent au format lectronique.
Nous avons longuement insist sur les possibilits daide lectronique au sein de la suite Office et nous allons maintenant tudier les
sources de documentation externes au logiciel.
lheure actuelle, il existe une source dinformation qui est en
passe, dans le domaine de la programmation, de supplanter toutes les
autres ; comme vous laurez devin, il sagit dInternet.
Ce rseau de communication a vritablement rvolutionn le travail des programmeurs ; le seul inconvnient de ce nouvel outil est
quil vaut mieux avoir quelques notions danglais si lon veut en profiter, car les ressources francophones ne sont pas les plus abondantes.
Internet va vous permettre une srie impressionnante doprations
pour un cot quasiment nul :

consultation de la documentation des logiciels,


consultation des comptes rendus de bogues des logiciels,
tlchargement des correctifs logiciels,
tlchargement dexemples de code,
recherche dans des bases de donnes,
consultation des forums de discussion,
interrogation des forums de discussion.
Dveloppons chacun de ces points.

Microsoft a mis en ligne lensemble de sa documentation et, si vous


avez une connexion Internet permanente, il est parfois plus rapide
daller la consulter sur Internet plutt que de rechercher le CD-ROM
sur laquelle elle se trouve.
Le site MSDN peut tre consult ladresse suivante :
http://msdn2.microsoft.com/fr-fr/default.aspx
MSDN est lacronyme de Microsoft Developer Network. Le site
MSDN constitue une base de donnes en ligne jamais gale ce jour
en matire de programmation. Les documents qui la composent se

Chap21.fm Page 431 Mardi, 23. janvier 2007 5:16 17

431

Se documenter

chiffrent en millions de pages. Ce site Web entirement gratuit renferme une masse dinformations forte valeur ajoute.
Il est disponible en franais, mais aussi en anglais ladresse suivante :
http://msdn2.microsoft.com/en-us/library/default.aspx
Si vous matrisez langlais, nous vous conseillons de consulter cette
version car elle est beaucoup plus complte. De plus, vous tes certain
dy trouver une documentation parfaitement jour.

Figure 21.2 Le site MSDN pour les dveloppeurs

Comme vous pouvez le constater, il existe de nombreux articles


consacrs au dveloppement Office.
Mais comme il est assez facile de se perdre dans cette arborescence
gigantesque, Microsoft propose une page Web o vous pouvez effectuer des recherches dans cette base de donnes. Pour effectuer une
recherche sur le site MSDN, rendez-vous ladresse suivante :
http://search.microsoft.com/

Chap21.fm Page 432 Mardi, 23. janvier 2007 5:16 17

432

Chapitre 21. Aller plus loin

Figure 21.3 Moteur de recherche du site MSDN

La recherche peut seffectuer soit en anglais, soit en franais. Cette


base de donnes sinterroge par mot cl ; on peut galement faire des
recherches avec des oprateurs boolens et restreindre lespace de
recherche diffrentes bases de donnes.
La Knowledge Base (base de connaissances) est, elle seule, une
vritable mine de renseignements.
Chaque article de cette base traite dun sujet diffrent et vous y
trouverez, presque tous les coups, linformation que vous cherchez.
Le seul inconvnient est que cette base contient des centaines de
milliers darticles, ce que signifie que si vous ne ciblez pas bien votre
recherche, votre requte sera noye dans le bruit documentaire.
Il faut donc apprendre matriser ce trs bel outil o vous trouverez
notamment des complments la documentation, de trs nombreux
exemples de code ainsi que des articles expliquant comment remdier
aux bogues de certains logiciels.

Chap21.fm Page 433 Mardi, 23. janvier 2007 5:16 17

433

Se documenter

Lautre ressource majeure est le site consacr au dveloppement


sous Office dans la partie franaise du site Web de Microsoft ; vous le
trouverez ladresse suivante :
http://www.microsoft.com/france/msdn/office/default.mspx

Figure 21.4 Site Microsoft franais sur Office

Les autres sources dinformation essentielles, accessibles aussi par le


biais dInternet, sont les forums de discussion (newsgroups en anglais).
Sur les forums consacrs la programmation VBA, vous trouverez des
dveloppeurs qui, comme vous, se posent des questions.
Et le plus extraordinaire, est que vous trouverez dautres programmeurs qui rpondent ces questions. Mme si vous vous contentez de
lire, sans participer activement en postant sur ces forums, la frquentation de tels lieux vous sera profitable.
Encore une fois, les forums les plus intressants (o les dveloppeurs rpondent le plus volontiers) sont en langue anglaise. Pour
trouver ces forums, saisissez les mots cls VBA ou macro dans votre
logiciel de lecture de newsgroups.

Chap21.fm Page 434 Mardi, 23. janvier 2007 5:16 17

434

Chapitre 21. Aller plus loin

Figure 21.5 Recherche de groupes de discussion sur VBA

Il faut galement noter depuis quelques annes lmergence de sites


Web communautaires qui ont tendance remplacer certains groupes
de discussion.
Parmi ces ressources, on peut citer le Club dentraide des dveloppeurs francophones, qui est accessible ladresse suivante :
http://www.developpez.com/

Figure 21.6 Partie consacre Access du site Developpez.com

Chap21.fm Page 435 Mardi, 23. janvier 2007 5:16 17

Se documenter

435

CONCLUSION
Jespre que ce livre aura t utile dans votre dcouverte de la
programmation VBA. Je souhaite quil vous donne envie de
poursuivre cette exprience merveilleuse et enrichissante quest
la programmation. Souvenez-vous quon apprend programmer
en programmant ; dans cette optique, les exemples de code sont
extrmement importants, et vous devez donc faire tourner tous
les exemples proposs dans ce livre et tenter de les modifier. La
lecture de programmes crits par dautres dveloppeurs est vraiment essentielle car, comme le prtendait Aristote, la premire
forme de lart est limitation. En ce sens, Internet constitue un
vivier idal o vous pourrez trouver des millions de lignes de
code qui complteront utilement votre culture dapprenti programmeur.

Chap21.fm Page 436 Mardi, 23. janvier 2007 5:16 17

Index.fm Page 437 Mercredi, 24. janvier 2007 11:42 11

Index
A
Abs 151
Access
collections 238
formulaire 245

AddNew 264
Address 229
AddressLocal 229
ADO 257
Connection 261

objets 239

installation 258

pilotage partir de Word 211

objets 259

projet 257

Recordset 263

AccessObject 239

ADP 257

AccessObjectProperties 238

affectation

AccessObjectProperty 240
ActionSettings 317

symbole 134
aide

Activate 198, 224, 226, 230, 361

dcompilation 176

ActivateMicrosoftApp 222

format HXS 176

ActiveCell 218
ActiveControl 247
ActiveDocument 177, 192
ActivePresentation 301

aide en ligne 48, 114


VBA 174
algorithme 9, 277
rcursif 288

ActivePrinter 192, 301

Alias 390

ActiveSheet 218, 223

AllDataAccessPages 238

ActiveWindow 218, 301

AllDatabaseDiagrams 238

ActiveWindow.View 194

AllForms 238

ActiveWorkbook 218

AllMacros 238

ActiveX Data Objects Voir ADO

AllModules 238

AddCustomList 222

AllowAdditions 247

Additem 357

AllowDeletions 247

Index.fm Page 438 Mercredi, 24. janvier 2007 11:42 11

438

Formation VBA

AllowEdits 247

AtEndOfLine 377

AllQueries 238

AtEndOfStream 377, 378, 379

AllReports 238

Atn 151

AllStoredProcedures 239

AutoCenter 247

AllTables 239

AutoComplete 230

AllViews 239

AutoFill 230

amortissement 364

AutoFit 230

analyse 9

AutoFitBehavior 181, 184

AnimationSettings 317

AutoFormat 231

API

AutoResize 247

appel de fonction 390

autorit de certification 38

programmation 387

AutoShapeType 317

Application 176, 218, 240

mthodes 195
Word 192
application
multilingue 194
pilotage partir dune autre
application 211
Application Programming
Interface Voir API
Apply 318

Background 311
base de donnes
interrogation avec ADO 274
moteur 259
Beep 242
bibliothque dobjets 186, 320
rfrence 211

ApplyFilter 242

bissextile 98

ApplyNames 230

bote outils 351

ApplyTemplate 304, 312

bote de dialogue 193

argument 127
nomm 133
Array 158
arrondi 370

boutons 139
modale 140
Bote de rception
sous-dossier 289

Asc 145, 204

Boolean 74, 156

ASCII 104, 137

boucle 103

AscW 204

sortie 109

Index.fm Page 439 Mercredi, 24. janvier 2007 11:42 11

439

Index

boucle infinie 108, 113, 119


arrt 109

Case Else 100


CBool 156

bouton

CByte 156

bascule 353

CCur 156

doption 353

CDate 156

de commande 354

CDbl 156

boutons

CDec 156

bote de dialogue 139


Build 192, 218, 301
BuiltInDocumentProperties 303,
306
Buttons 139

Cells 218, 225, 229


cellule
dsignation 227
saisie 227

Byte 74, 156

Centre de gestion de la
confidentialit 39

ByVal 390

certificat numrique 38

C
cadre 354

chane
fonctions 145
vide 119

Calculate 222, 226, 231

Charts 223

CalculateFull 222

CheckBox 353

Calculation 218

Choose 154

CalculationVersion 218

Chr 105, 145, 204, 308

CallByName 159

CInt 156

CancelEvent 242

classe 187

Caption 218, 301, 357

classeur de macros personnelles


33

proprit 352
caractre

Clear 231

de continuit de ligne 104

ClearContents 231

de contrle 137

ClearFormats 231

Carriage Return 137

Click 360, 361

Cascading Style Sheet Voir CSS

CLng 156

Case 99

Close 224, 242, 304, 378, 379

case cocher 353

CloseButton 247

Index.fm Page 440 Mercredi, 24. janvier 2007 11:42 11

440

Formation VBA

codage en dur 63

commande 70

code

CommandText 267

coupure des lignes 104


dboguer 401

commentaire 45
ajout 49

formulaire 359

compatibilit 380

gnrateur 308

compilateur 57, 403

modification 37

ComputeStatistics 202

optimisation 210

concatnation 83

SQL 275

condition

stockage 300

logique 92

suppression de lignes 49

ordre 96

code source
dfinition 7

Connection 260, 261


ConnectionString 261, 262

CodeData 240

Consolidate 231

collection 176, 196

constante 63, 130, 137

Documents 196
indice 207
parcourir 197
ColorScheme 311

boutons 139
VB 65
contact
exportation dans une BD 296

ColorSchemes 303

Control 240

Column 229, 377

ControlBox 247

ColumnDifferences 231

contrle 351, 352

Columns 218, 225, 229

contrle ActiveX 353

ColumnWidth 229

contrle Onglet 354

COM 321

Controls 239, 248

ComboBox 353

conversion 155

ajouter lment 357

ConvertFormula 222

initialisation 361

Copy 226, 231, 312, 318

valeur 362

CopyFile 376

Command 157, 260, 267

CopyObject 242

CommandBars 301

Cos 151

CommandButton 354

Count 196, 229

Index.fm Page 441 Mercredi, 24. janvier 2007 11:42 11

441

Index

Country 195

date

courrier lectronique 285


envoi 286

fonction DateSerial 379


fonctions 149

CR 137

format par dfaut 79

CreateFolder 376

Date1904 223

CreateNames 231

DateAdd 149

CreateObject 159, 378

DateDiff 149

CreateTextFile 376, 379

DatePart 149

CSng 156

DateSerial 98, 149

CSS 338

fonction 379

CStr 156

DateValue 149

CurDir 153
Currency 75, 156
CurrentData 240
CurrentProject 240, 246
CurrentProjetConnection 266
CurrentRecord 248
curseur 201, 264
dplacement 204
CursorType 264

Day 149
DDB 152
dbogage 309, 401, 410
arrt 310
mode pas pas 418
dbogueur 413
excution 413
fonctionnement 414

Cut 231, 312, 318

Debug.Print 247, 308

CVar 156

Decimal 75, 156

CVErr 159

Dclarations
section 86

Cycle 248

Declare 389

ddoublonnage 210

DAO 257

DefaultFilePath 219

Data Source 263

DefaultSaveFormat 219

DataEntry 248

DefaultTableBehavior 181

DataEntryMode 219

DefaultView 248

DataSeries 231

DefaultWebOptions 240

Date 75, 76, 149, 156

dfilement 354

Index.fm Page 442 Mercredi, 24. janvier 2007 11:42 11

442

Formation VBA

Save 198

dfinition du type de document


Voir DTD

DoEvents 157

Delete 226, 231, 312, 318

dossier

DeleteFile 377

crer 376

DeleteObject 242

Outlook 287

Design 311

Double 75, 156

Dialogs 193, 219, 221

Drives 376

diapositive

DSSSL 338

modle de conception 312

DTD 332

numro 311

Duplicate 312, 318

Dim 60

Dir 153
Dirty 248
DisplayFullScreen 219
DisplayMasterShapes 311
DLL 323, 388
Do Loop 114
DoCmd 240, 241
Document 196
Activate 198
collections 196
mthodes 198
document
modle 198
SGML 332
Document Style Semantics and
Specification Language Voir
DSSSL

ECMA 343
EDI 42
EditDirectlyInCell 219
diteur
voir les constantes 141
diteur Visual Basic
ouverture 41
lment facultatif 116
Else 93
ElseIf 94
Empty 119
EnableCalculation 225
encodage 10
End 229
End If 93

DocumentProperty 310

End Sub 46

Documents 178

End With 194

Add 198

EndKey 205

Close 198

enregistrement

Open 198

ajout 264

Index.fm Page 443 Mercredi, 24. janvier 2007 11:42 11

443

Index

comptage 266

Excel

mise jour 265

Application 217

verrouillage 265

Range 227

enregistreur de macros 14, 194

Exit Do 120

limitations 29

Exit For 109

EntireColumn 229

Exit Sub 233

EntireRow 229

Exp 151

Enum 193
numration 193, 205, 319
Environ 157
environnement de
dveloppement intgr Voir
EDI

Expand 201
Explorateur dobjets 186
recherche 187
Explorateur de projets 42
Export 304, 312
expression 83

EOF 153, 267

caractre 84

Err 421

date 84

erreur

logique 85

dexcution 404

numrique 84

de logique 410

Extend 206

de syntaxe 402

Extensible Style Language Voir


XSL

de type 82, 155

dpassement de capacit 82
gestion 421
programmation 401
Error 159
espace de noms 284
tude pralable 8
Evaluate 222, 226
vnement 250, 358

False 85, 92
Faux 92
fentre
Excution 221, 247, 302, 308
feuille 350
de proprits 352
fichier 193

exemples 358

cration 376

gestionnaire 250, 358

fonctions de gestion 153

ordre 360

supprimer 377

Index.fm Page 444 Mercredi, 24. janvier 2007 11:42 11

444

Formation VBA

fichier batch 384

focus 192

fichier Office

Folders 288, 289

format propritaire 329


fichier texte

FollowMasterBackground 311
fonction

conversion 377

aide 128

gestion 375

appel 127

objet TextStream 377

arguments 164

Fields 264

catgories 145

FileAttr 153

choix du nom 166

FileDateTime 153

conversion 155

FileDialog 301
FileExists 377
FileLen 153
FileSearch 193, 219
FileSystemObject 154, 376
Fill 317
FillDown 231
FillLeft 231
FillRight 231
FillUp 232
Filter 158, 248
FilterOn 248
finance
fonctions 152

de chane 145
de date 149
dfinition 127
criture 161
financires 152
formatage 159
gestion derreur 159
gestion dobjets 159
gestion de fichiers 153
imbrication 131
Info paramtres 128
info-bulle 128
logiques 154

Find 232

mathmatiques 151

FindFile 222

paramtres facultatifs 166

FindNext 232, 242

sans argument 131

FindPrevious 232

syntaxe 127

FindRecord 242

systme 157

Fix 151

tableau 158

FixedDecimal 219

valeur de retour 127, 130, 164

FixedDecimalPlaces 219

Visual Basic 145

Index.fm Page 445 Mercredi, 24. janvier 2007 11:42 11

445

Index

Fonts
PowerPoint 303
For Each 197, 234, 247
For Next 103
Step 107
valeur compteur 111
Form 240, 245
Format 159
formatage 159
FormatCondition 240
FormatConditions 239
FormatCurrency 160

gnrateur
code 308
gestion de fichiers 193
gestionnaire
derreur 423
dvnement 250, 358
GetAllSettings 157
GetAttr 154
GetDefaultFolder 287
GetObject 159
GetSetting 157
GetSystemMetrics 393

FormatDateTime 160

GoToControl 242

FormatNumber 160

GoToPage 242, 249

FormatPercent 160

GoToRecord 242

Forms 239

guillemet 275, 308

Formula 229

formulaire 245, 349


afficher 364

HandoutMaster 303

code 359

HasFormula 229

contrles 352

Height 317

excuter 357
lgende 352
proprits 352
Frame 354

Hex 151
Hide 364
HomeKey 206
HorizontalResolution 195
Hour 150

FreeFile 154

Hourglass 243

FrozenColumns 248

HTML

FullName 303

avantages 335

FV 152

DTD SGML 334

Index.fm Page 446 Mercredi, 24. janvier 2007 11:42 11

446

Formation VBA

inconvnients 335

Intellisense 177, 182, 190, 319

HTML Help Workshop 176

Interactive 219

HXS 176

interface utilisateur 349

Hyperlink 240

International 219

HyTime 339

interprteur 57
Intersect 222

intitul 353

Id 317

IPmt 152

identificateur 68

IRR 152

If Then Else 92

IsArray 158

Iif 154

IsDate 154

image 354

IsEmpty 119, 154

IMEStatus 158

IsError 154

impression 161

IsMissing 154

incrment 107

IsNull 118, 155

indentation 98, 114

IsNumeric 155

index

ISO 10744 339

affichage des entres 197

ISO 8879 331

suppression des entres 197

IsObject 155

indice 207

Items 283

initialisation 78

itration 105

Initialize 361

Input 154
InputBox 131, 160, 274
conversion 160
Insert 232

jeu
programmation 276
Join 158

instance 187

InStr 145
InStrRev 145

Label 353

instruction 47, 70

Language 194

Int 151

LanguageDesignation 195

Integer 75, 156

LanguageSettings 219

Index.fm Page 447 Mercredi, 24. janvier 2007 11:42 11

447

Index

langue 194
Layout 311
LBound 159
LCase 145
lecteur de disque 376
Left 145, 317
Left$ 147
lgende
formulaire 352

MacID 158
Macintosh 380
macro 13
arrt 109
arrt enregistrement 17
assignation un raccourci
clavier 21
association une icne 23

Len 145

choix du nom 27

LF 137

enregistrement 15, 26

ligne

enregistrement avec Excel 32

logique 174
ligne de code
continuit 104

enregistreur 14
excution 17
gnration de code 308

Line 317, 377

lieu de stockage 18

Line Feed 137

modification du code 37

lisibilit 168

opportunit 14

ListBox 353

scurit 40

liste

visualiser le code 38

programmation 251

macro-commande 5

ListIndex 362

MacScript 158

ListNames 232

MailItem 285

littral 78

MAPI 284

Loc 154

MAPIFolder 287

LockAspectRatio 317

Master 311

LockType 265

Maximize 243

LOF 154

MDAC 258

Log 151

membre

Long 75, 156


LTrim 146

objet 187
Merge 304

Index.fm Page 448 Mercredi, 24. janvier 2007 11:42 11

448

message

Formation VBA

MoveLeft 206

analyse 293

MoveNext 267

envoi partir dune BD 292

MoveRight 204

exportation dans une BD 294

MoveSize 243

mthode 47, 172

MoveTo 312

Mid 128, 146

MsgBox 132, 160

Mid$ 147

Buttons 139

Minimize 243

dbogage 411

Minute 150

gnrateur 144

MIRR 152

Prompt 135

mise jour 265

MSO.DLL 323

Modal 248

MsoAnimEffect 320

modal 139, 140


modle 20, 198
dobjet 47
de conception diapositive 312
modularit 168
Module 240

MsoAutoShapeType 323
MsoLanguageID 194
MSPPT.OLB 321
multilingue 194
multipage 354

module 44

de classe 126
insertion 125

Name 225, 317

Modules 239

diapositive 311

modulo 233

prsentation 303

Month 150

Names 219, 223, 225

MonthName 150

namespace 284

mot

NavigationButtons 248

cl 68

NetworkTemplatesPath 220

rserv 69

NewMacros 44

moulinette 375

NewRecord 248

Move 226

Next 226

MoveFile 377

Normal.dot 19

MoveFirst 267

Normal.dotm 19

Index.fm Page 449 Mercredi, 24. janvier 2007 11:42 11

449

Index

norme

pack de compatibilit 329

SGML 331

scurit 39

notation hongroise 428

Office Open XML 343

NotesMaster 303

Offset 230

Now 98, 150

OLB 320

Nper 152

OLE 321

NPV 152

Oleview 321

Null 117

On Error Resume Next 422

O
Object 75
objet 171

onglet 354
onglet Dveloppeur
Office 2007 16
OpenDataAccessPage 243

Application 176

OpenForm 243

arborescence 176

OpenQuery 243

bibliothque 186

OpenReport 243

classe 187

OpenTable 243

collection 176

OpenTextFile 377, 379

dfinition 172

OpenView 243

explorateur 186

oprateur 65

fonction 185

priorit 66

hirarchie 174

logique 96

instance 187

OperatingSystem 195, 220, 301

membres 187

optimisation 210

mthodes 177

Optional 166

proprits 177

OptionButton 353

Oct 151
Office

Options 194
proprit 195

bibliothque dobjets 323

OrderBy 248

modle dobjets 376

OrderByOn 249

Office 2007

Outlook 283

format des fichiers 343

dossier 287

onglet Dveloppeur 16

scurit 289

Index.fm Page 450 Mercredi, 24. janvier 2007 11:42 11

450

Formation VBA

sous-dossier 289
OutputTo 244

PrecisionAsDisplayed 224
Presentation

P
Page 240
Pages 239
PageSetup 226, 303
paramtre 127

objet 303
prsentation
PowerPoint 303
Presentations 301
collection 303
Preserve 90

facultatif 129, 131

Prt 364

passage par rfrence 390

Previous 226

passage par valeur 390

PRINT#. 380

valeur par dfaut 167


Parse 232
Partition 151
Pas pas sortant 420
Paste 226
PasteSpecial 227, 232
Path 303
PickUp 318

PrintOptions 303
PrintOut 224, 227, 232, 304
PrintPreview 224, 227, 232
Private 360
procdure 126
appel 127
vnementielle 360

PictureFormat 317

production 10

Pmt 152, 365

programmation

point dinsertion 201


dplacement 29, 204

dfinition 3
erreur 401

pointeur dinsertion 183

vnementielle 250

POO 171

inter-applications 211, 325

PopUp 249

jeu 276

porte 85, 426

langages 6

PowerPoint

niveaux 5

Application 301

phases de conception 8

pilotage partir de Word 325

VBA 173

stockage du code 300


PPmt 152, 365

programmation oriente objets


171

Index.fm Page 451 Mercredi, 24. janvier 2007 11:42 11

451

Index

programme

Rate 153

arrt 109

Read 378

dbogage 309

ReadAll 378

dboguer 401

ReadLine 378, 379

diteur 41

ReadOnly 224

modification 47

Recalc 249

suppression de lignes 49

RecentFiles 220

projet 43, 125

recherche-remplacement 395

Prompt 135

RecordCount 266

Properties 239, 249

Recordset 260, 263

proprit 172, 352

Fields 264

globale 192

rcursivit 288

Visible 252

Redim 90

Protect 227

Reference 240

ProtectContents 226

rfrence 258

ProtectionMode 226

ajout 212

Provider 263

References 239

Public 87

ReferenceStyle 220

publipostage 292

Refresh 249

Publisher 189

RefreshAll 224

PV 153

Repaint 249

Replace 146, 232


Report 240

QBColor 158

Reports 239

Qualificateur dobjet 218

Requery 244, 249

Quit 195, 223, 244

requte

SQL 267, 275


Resize 230

raccourci clavier 21

Restore 244

Range 182, 199, 226, 227

RGB 158

document entier 200

Right 146

extension 201

Rnd 151

Index.fm Page 452 Mercredi, 24. janvier 2007 11:42 11

452

Formation VBA

Round 151

SetMenuItem 244

Row 230

SetShapesDefaultProperties 318

RowDifferences 232

SetWarnings 244

RowHeight 230, 249

SGML 330

Rows 220, 226, 230

document 332

RTrim 146

norme 331

RunCommand 244

S
Save 224, 244, 304
SaveAs 224, 227, 305
SaveCopyAs 225, 305

objectif 333
Sgn 151
Shape
objet 315
Shapes
collection 311, 315

Saved 224, 303

Sheets 220, 224

SaveLinkValues 224

Shell 158

ScaleHeight 318

Show 364

ScaleWidth 318

ShowAllRecords 244

scope Voir porte

ShowStartupDialog 301

Screen 240

ShowToolbar 245

Scripting.FileSystemObject 378

ShowToolTips 220

ScrollBar 354

Sin 151

Second 150

Single 75, 156

scurit 38, 289

Skip 378

Seek 154

SkipLine 378

Select 227, 232, 312, 318

Slide

Select Case 99
plage de valeurs 100

objet 310
SlideID 311

Selection 203, 220

SlideIndex 311

slection 203, 206

SlideMaster 304

SelectObject 244

SlideNumber 311

SendKeys 223

SlideRange

Set 378
SetFocus 249

collection 310
Slides 304

Index.fm Page 453 Mercredi, 24. janvier 2007 11:42 11

453

Index

collection 310

SYLK 386

SlideShowSettings 304

symbole daffectation 134

SlideShowTransition 311

syntaxe 7, 115

SlideShowWindow 304

System 195

SlideShowWindows 301

SLN 153
source

Tab 161

des donnes 263

Table 233, 317

Voir code source

tableau 88

Space 146

dclaration 89

Spc 161

dplacement 29

SpecialCells 232

dynamique 90

SpinButton 354

lments 89

Split 159

insertion 181

SQL

slection 29

code 275

Tables 179

requte 267

TabStrip 354

SQL Server 257, 259

Tan 151

Sqr 151

TemplateName 304

standardisation

TemplatesPath 220

documents Office 343


Step 107

Terminate 361
test 10

Str 146

conditionnel 91

StrComp 146

de performance 147

StrConv 146

plage de valeurs 95

stream 260
String 75, 79, 146, 156

tests conditionnel
imbrication 97

StrReverse 146

TextBox 353

Styles 224

TextFrame 317

Sub 44

TextStream 377

Switch 155

TextToColumns 233

SYD 153

ThisDocument 44

Index.fm Page 454 Mercredi, 24. janvier 2007 11:42 11

454

Formation VBA

ThisOutlookSession 293

Undo 250

ThisWorkbook 220

Unicode 204

Time 150

Unprotect 225, 227

TimeLine 311

Until 116

Timer 148, 150

diffrence avec While 121

TimeSerial 150

Update 265

TimeValue 150

UserForm 245, 349

title 143

UserName 220

Top 318

toupie 354
TransferDatabase 245
TransferSpreadsheet 245
TransferText 245
tri dichotomique 209
Trim 146

Val 151
Validation 230
Value 230, 362
Value2 230
variable 58

True 85, 92

affectation 60

twip 161
Type 318

caractre 79

type

conversion 155
date 76

erreur 155
type de donnes 73, 158

dclaration 60, 86

caractre 79

dclaration explicite 61

conversion 155

dclaration implicite 60

date 76

nom 59

numrique 80

numrique 80

objet 375

objet 375

Variant 82

type de donnes 73

TypeName 158

Variant 82

U
UBound 159
UCase 146

visibilit 85
Variant 75, 82, 147, 156
Null 117
VarType 158

Index.fm Page 455 Mercredi, 24. janvier 2007 11:42 11

455

Index

VBA 55

Width 318

aide en ligne 174

Win32 387

histoire 55

WIN32API.TXT 389

programmation 173

Windows 220, 301

syntaxe 57

prsentation 304

VbaProject.OTM 293

WindowState 301

Vcard 381

With 194

verrouillage 265

Word

Version 192, 220, 301

Application 192

VerticalResolution 195

Document 196

virus 38

pilotage dAccess 211

visibilit 85
Visible 220, 226, 249, 318
Visual Basic
aide en ligne 48
objet 376
Visual Basic Editor 41
Vrai 92

pilotage de PowerPoint 325


point dinsertion 201
Range 199
Selection 203
slection 206
statistiques 202
Workbook 223

W
Wait 223
wdStory 206
WebOptions 240
WebPagePreview 305
Weekday 150
WeekdayName 150

Workbooks 220
Worksheet 225, 230
Worksheets 220, 224
Write 378
WriteBlankLines 378
WriteLine 378, 380
WriteReserved 224

Wend 112

While 112
diffrence avec Until 121

xlBuiltInDialog 221

imbrication 113

XLink 339

sortie 114

XML 329, 337

While Wend 111

exemple 339

Index.fm Page 456 Mercredi, 24. janvier 2007 11:42 11

456

format des documents Office


343
objectifs 337
XML Linking Language Voir
XLink
XSL 338

Formation VBA

Y-Z
Year 98, 150
zone de liste 353
zone de liste modifiable 353
zone de texte 353

3952_P_457_460

8/02/07

8:27

Page 460

050872 - (I) - (5) - OSB 80 - ARC - NGT


Imprimerie CHIRAT - 42540 Saint-Just-la-Pendue
Dpt lgal : Fvrier 2007
N 3952

Imprim en France

D. MANIEZ

Formation

Dominique Maniez

VBA

Tlchargez tous les exemples de code


sur www.dunod.com

6637326
ISBN 978-2-10-050872-3

www.dunod.com

DOMINIQUE MANIEZ
a crit et traduit une
cinquantaine douvrages
dont la plupart traitent
des technologies
Microsoft.
Dveloppeur, journaliste
et universitaire,
il prne une conception
de linformatique proche
de lutilisateur, bannit
le jargon technique et
milite pour que la chose
informatique ne soit pas
la proprit exclusive
des informaticiens.

VBA

Ce livre vous est destin si vous voulez apprendre


programmer vos propres fonctions dans les principaux logiciels de la suite Microsoft Office. Mme si
vous navez aucune exprience de la programmation
vous russirez grce cet ouvrage crire des macros
qui pourront vous viter intelligemment des heures de
travail fastidieux.
Grce une progression pdagogique qui explique
lessentiel et laisse de ct le superflu vous pourrez
rapidement matriser VBA, le langage de programmation de Microsoft Office. Par affinements successifs
vous construirez des macros de plus en plus complexes et vous pourrez ainsi assimiler en douceur les
concepts fondamentaux de VBA.
Comme la programmation sapprend en lisant des programmes, vous trouverez dans ce livre de trs nombreux exemples de code.

Formation

FORMATION

Dominique Maniez

VBA
Visual Basic pour Applications
pour Word, Excel,
PowerPoint, Access et Outlook