You are on page 1of 479

Dominique Maniez

Formation

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

FORMATION

VBA

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.

FORMATION

VBA

Dominique Maniez
Dveloppeur, journaliste et universitaire

Toutes les marques cites dans cet ouvrage sont des marques dposes par leurs propritaires respectifs.

Dunod, Paris, 2007 ISBN 978-2-10-050872-3

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 6 7 8 8 9 10 10 10 13 14 14 15 17 18 21 23 26

Chapitre 2 Enregistrer une macro . . . . . . . . . . . Lenregistreur de macros . . . . . . . . . . . . . . . . Quand devez-vous enregistrer une macro ? . . . . Enregistrement de votre premire macro . . . . . . Excuter une macro . . . . . . . . . . . . . . . . . . O sont stockes les macros . . . . . . . . . . . . . . Comment assigner un raccourci clavier une macro ? . . . . . . . . . . . . . . . . . . . . . . Comment associer une icne une macro ? . . . . . . Conseils pour lenregistrement des macros . . . . . .

VI

Formation VBA

Le choix du nom des macros . . . . . . . . . . . . . . Les limitations de lenregistreur de macros . . . . . Enregistrement dune macro avec Excel . . . . . . . . Chapitre 3 Modifier le code des macros . . . . . . . . Voir le code de la macro . . . . . . . . . . . . . . . . Modifier le code de la macro . . . . . . . . . . . . .

27 29 32 37 38 47

Partie 2 Le langage VBA


Chapitre 4 Syntaxe de VBA . . . . . . . . . . . . . 55 55 56 57 58 63 65 68 70 73 73 76 79 80 82 82 83 85 88

Historique de VBA . . . . . . . . . . . . . . . . . . . Diffrences entre Visual Basic et VBA . . . . . . . . Syntaxe de VBA . . . . . . . . . . . . . . . . . . . . Variables . . . . . . . . . . . . . . . . . . . . . . . . Constantes . . . . . . . . . . . . . . . . . . . . . . . Oprateurs . . . . . . . . . . . . . . . . . . . . . . . Mots cls . . . . . . . . . . . . . . . . . . . . . . . . Instructions . . . . . . . . . . . . . . . . . . . . Chapitre 5 Variables et tableaux . . . . . . . . . . . Types de donnes . . . . . . . . Les dates . . . . . . . . . Les caractres . . . . . . . Les nombres . . . . . . . . Le type de donnes Variant Les erreurs de type . . . . . Les expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Table des matires

VII

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

91 91 92 94 96 97 99 103 103 109 111 114 116 117 118 119 121 125 126 127 132 145 161 166

Imbriquer des tests conditionnels . . . . . . . . . . . Select Case . . . . . . . . . . . . . . . . . . . . . . . Chapitre 7 Boucles . . . . . . . . . . . . . . . . . . For Next . . . . . . . . . . . . . . . . . . . . . . . . Sortir de la boucle . . . . . . . . . . . . . . . . . While Wend . . . . . . . . . . . . . . . . . . . . . . Do Loop . . . . . . . Expression logique Null . . . . . . . Empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Gare aux boucles infinies . . . . . . . . . . . . . . . Diffrences entre While et Until . . . . . . . . . . . Chapitre 8 Procdures et fonctions . . . . . . . . . . Procdures et fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntaxe dune fonction . . . . . . . . . . MsgBox en dtail . . . . . . . . . . . Fonctions de Visual Basic par catgorie crire ses propres fonctions . . . . . . Les paramtres facultatifs . . . . . . .

Partie 3 Modles dobjets


Chapitre 9 Objets . . . . . . . . . . . . . . . . . . . Dfinition dun objet . . . . . . . . . . . . . . . . . . 171 172

VIII

Formation VBA

Objets dans Office . . . . . . . . . . . . . . . . . . . Un objet en situation . . . . . . . . . . . . . . . . . crire des fonctions pour manipuler des objets . . . . Lexplorateur dobjets . . . . . . . . . . . . . . . . . Autres modles dobjets . . . . . . . . . . . . . . . . Chapitre 10 Programmer Word . . . . . . . . . . . . Objet Application . . . . . . . . . . . . . . . . . . . Objet Document . . . . . . . . . . . . . . . . . . . . Objet Range . . . . . . . . . . . . . . . . . . . . . . Objet Selection . . . . . . . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . . Pilotage dune application Office partir dune autre application . . . . . . . . . . . . . . . . . Chapitre 11 Programmer Excel . . . . . . . . . . . . Objet Application . . . . . . . . . . . . . . . . . . . Objet Workbook . . . . . . . . . . . . . . . . . . . . Objet Worksheet . . . . . . . . . . . . . . . . . . . . Objet Range . . . . . . . . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . . Chapitre 12 Programmer Access . . . . . . . . . . . Collections dAccess . . . . . . . . . . . . . . . . . . Objets dAccess . . . . . . . . . . . . . . . . . . . . . Objet DoCmd . . . . . . . . . . . . . . . . . . . . . Objet Form . . . . . . . . . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . . Apparition et remplissage dune liste par programmation . . . . . . . . . . . . . . . . Remplir un champ automatiquement . . . . . . . .

173 174 185 186 188 191 192 196 199 203 207 211 217 217 223 225 227 233 237 238 239 241 245 250 251 255

Table des matires

IX

Chapitre 13 ADO

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

257 258 259 261 263 265 265 269 272 274 283 283 285 287 289 291 292 293 294 296 299 301 303 310 315 319 324

Installation dADO . . . . . . . . . . . . . . . . . . . Objets dADO . . . . . . . . . . . . . . . . . . . . . Objet Connection . . . . . . . . . . . . . . . . . . . Objet Recordset . . . . . . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . Exemples Access . . . . . . . . . . . . Exemple Word . . . . . . . . . . . . . Exemple Excel . . . . . . . . . . . . . Exemples dutilisation dun fichier MDB sans Access . . . . . . . . . . . . . . Chapitre 14 Programmer Outlook . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . . . . . .

Modle dobjets . . . . . . . . . . . . . . . . . . . . . Objet MailItem . . . . . . . . . . . . . . . . . . . . . Objet MAPIFolder . . . . . . . . . . . . . . . . . . . Accs un sous-dossier partir de la Bote de rception . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Chapitre 15 Programmer PowerPoint . . . . . . . . . Objet Application . . . . . . . . . . . . . . . . . . . Collection Presentations . . . . . . . . . . . . . . . . Collection Slides . . . . . . . . . . . . . . . . . . . . Collection Shapes . . . . . . . . . . . . . . . . . . . Numros et numrations . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . .

Formation VBA

Chapitre 16 XML . . . . . . . . . . . . . . . . . . . Introduction . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

329 329 330 331 332 333 334 337 337 339 343

XML en action . . . . . . . . . . . . . . . . . . . . . Le nouveau format des fichiers Office 2007 . . . . . .

Partie 4 Programmation VBA avance


Chapitre 17 Crer des formulaires . . . . . . . . . . Exemple de UserForm pas pas . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . . Cration du UserForm . . . . . . . . . . . . . . Chapitre 18 Grer des fichiers texte . . . . . . . . . 349 350 364 368 375 376 377 381 381 384 387 388 389 390

Objet FileSystemObject . . . . . . . . . . . . . . . . Objet TextStream . . . . . . . . . . . . . . . . . . . Mise en pratique . . . . . . . . . . . . . . . . . . . . Conversion de fichiers au format Vcard . . . . . . Crateur de fichiers batch . . . . . . . . . . . . . Chapitre 19 Programmer les API . . . . . . . . . . . Concept dAPI . . . . . . . . . . . . . . . . . . . . . Declare . . . . . . . . . . . . . . . . . . . . . . . . . Appel de fonction API . . . . . . . . . . . . . . . . .

Table des matires

XI

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 401 401 402 404 410 410 413 413 414 420 421 425 425 427 430 437

Chapitre 20 Dboguer un programme . . . . . . . . . Erreurs de programmation Erreurs de syntaxe . . Erreurs dexcution . Erreurs de logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Gestion des erreurs . . . . . . . . . . . . . . . . . . . Chapitre 21 Aller plus loin . . . . . . . . . . . . . . Organiser les macros . . . . . . . . . . . . . . . . . . Prendre de bonnes habitudes . . . . . . . . . . . . . Se documenter . . . . . . . . . . . . . . . . . . . . . Index . . . . . . . . . . . . . . . . . . . . . . . . . .

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.

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

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

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.

Avant-propos

XVII

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-

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-

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.

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 Office 2000 Office XP Office 2003 Office 2007 Numro de version 9 10 11 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.

PARTIE 1

Apprendre programmer

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.

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

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

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

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

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-

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,

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.

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.

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.

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.

Lenregistreur de macros

15

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


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 Outils Macro Nouvelle macro.
Dunod La photocopie non autorise est un dlit

Une bote de dialogue semblable celle-ci apparat :

Figure 2.1 Bote de dialogue Enregistrer une macro

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 Edition Remplacer (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.

Excuter une macro

17

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

Dunod La photocopie non autorise est un dlit

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

18

Chapitre 2. Enregistrer une macro

bien leffet escompt. Pour ce faire, choisissez la commande Outils Macro Macros (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 :

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

Dunod La photocopie non autorise est un dlit

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.

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 Fichier Nouveau 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.

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 Affichage Barre doutils Personnaliser... et cliquez sur le bouton Clavier... ce qui affiche lcran suivant :

Figure 2.9 Assignation dun raccourci clavier une macro

Dunod La photocopie non autorise est un dlit

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

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

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

Cliquez sur le bouton Fermer de la bote de dialogue.


Dunod La photocopie non autorise est un dlit

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 Affichage Barre doutils Personnaliser... Cliquez ensuite sur longlet Commandes et, dans la liste droulante Catgories, choisissez Macros puis slectionnez Normal.NewMacros.remplacedp.

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 :

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 :

Figure 2.16 Icne par dfaut pour les macros Word

Dunod La photocopie non autorise est un dlit

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

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

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


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.
Dunod La photocopie non autorise est un dlit

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.

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.

Le choix du nom des macros

29

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

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 Dun mot vers la droite CTRL+GAUCHE CTRL+DROITE

Dunod La photocopie non autorise est un dlit

30

Chapitre 2. Enregistrer une macro

Actions de dplacement du point dinsertion Dun paragraphe vers le haut Dun paragraphe vers le bas En haut de la fentre En bas de la fentre En haut de la page suivante En haut de la page prcdente la fin dun document Au dbut dun document lemplacement occup par le point dinsertion lors de la dernire fermeture du document CTRL+HAUT CTRL+BAS ALT+CTRL+PG.PRC ALT+CTRL+PG.SUIV CTRL+PG.SUIV CTRL+PG.PRC CTRL+FIN CTRL+ORIGINE MAJ+F5

Actions dextension de la slection Dun caractre vers la droite Dun caractre vers la gauche la fin dun mot Au dbut dun mot la fin dune ligne Au dbut dune ligne Dune ligne vers le bas Dune ligne vers le haut la fin dun paragraphe Au dbut dun paragraphe Dun cran vers le bas Dun cran vers le haut Au dbut du document MAJ+DROITE MAJ+GAUCHE CTRL+MAJ+DROITE CTRL+MAJ+GAUCHE MAJ+FIN MAJ+ORIGINE MAJ+BAS MAJ+HAUT CTRL+MAJ+BAS CTRL+MAJ+HAUT MAJ+PG.SUIV MAJ+PG.PRC CTRL+MAJ+ORIGINE

Le choix du nom des macros

31

Actions dextension de la slection la fin dun document la fin dune fentre Au document tout entier un bloc de texte vertical CTRL+MAJ+FIN ALT+CTRL+MAJ+PG.SUIV CTRL+A CTRL+MAJ+F8, puis utilisez les touches de direction ; appuyez sur ECHAP pour annuler le mode de slection F8+touches de direction ; appuyez sur ECHAP pour annuler le mode de slection

un endroit dtermin du document

Actions de dplacement dans un tableau la cellule suivante dune ligne la cellule prcdente dune ligne la premire cellule dune ligne la dernire cellule dune ligne la premire cellule dune colonne la dernire cellule dune colonne
Dunod La photocopie non autorise est un dlit

TABULATION MAJ+TABULATION ALT+ORIGINE ALT+FIN ALT+PG.PRC ALT+PG.SUIV HAUT BAS

la ligne prcdente la ligne suivante

Actions de slection dans un tableau Slectionner le contenu de la cellule suivante Slectionner le contenu de la cellule prcdente tendre une slection aux cellules avoisinantes TABULATION MAJ+TABULATION Maintenez la touche MAJ enfonce et appuyez plusieurs fois sur une touche de direction

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 CTRL+MAJ+F8, puis utilisez les touches de direction ; appuyez sur ECHAP pour annuler le mode de slection ALT+5 sur le pav numrique (VERR.NUM tant dsactiv)

tendre une slection (ou un bloc)

Slectionner lintgralit dun tableau

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 Outils Macro Nouvelle macro... Notez que vous pouvez galement afficher la barre doutils de Visual Basic (commande Affichage Barre doutils Visual 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 :

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.

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.
Dunod La photocopie non autorise est un dlit

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

34

Chapitre 2. Enregistrer une macro

contenu de ce fichier, il suffit de choisir la commande Fentre Afficher... 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 Fentre Masquer. 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

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

Arrtez lenregistrement de la macro.


Dunod La photocopie non autorise est un dlit

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.

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.

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

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 Outils Macro Scurit et dterminer le niveau de scu-

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

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.

Voir le code de la macro

41

Pour examiner le code de cette macro, excutez la commande Outils Macro Visual 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

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 Affichage Explorateur 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

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

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

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

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

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 :

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

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 :

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

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.

PARTIE 2

Le langage VBA

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

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,

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,

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

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

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.

Variables

61

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 Outils Options 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

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.

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

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 vbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday Valeur 1 2 3 4 5 6 7 Description Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi

Oprateurs

65

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

66

Chapitre 4. Syntaxe de VBA

Tableau 4.2 Oprateurs de Visual Basic


Oprateur > >= <> And Like Mod Not Or Xor Signification Oprateur de comparaison suprieur Oprateur de comparaison suprieur ou gal Oprateur de comparaison diffrent de tablit une conjonction logique entre deux expressions Compare deux chanes de caractres Renvoie un entier qui est le reste de la division de deux nombres tablit la ngation logique dune expression tablit une disjonction logique entre deux expressions 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 lvation une puissance (^) Ngation () Comparaison galit (=) Ingalit (<>) Logique Not And

Oprateurs

67

Tableau 4.3 Ordre de priorit des oprateurs


Arithmtique Multiplication et division (*, /) Division d'entiers (\) Modulo arithmtique (Mod) Addition et soustraction (+, ) Concatnation de chanes (&) Comparaison Infriorit (<) Supriorit (>) Infriorit ou galit (<=) Supriorit ou galit (>=) Like Logique Or Xor

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.

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 Binary ByRef ByVal Date Else Empty Len Let Lock Me Mid New Next Private Property Public Resume Seek Set Static

Mots cls

69

Tableau 4.4 Mots cls particuliers de Visual Basic


Error False For Friend Get Input Is Nothing Null On Option Optional ParamArray Print Step String Then Time To True 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 Any As Boolean Byte ByVal Call Case Close Const Currency Date Exit False For Function Get Global GoSub GoTo If Imp Integer Let Option PsetOr Private Public ReDim Rem Resume Return RSet Set Single Static

70

Chapitre 4. Syntaxe de VBA

Tableau 4.5 Mots rservs


Decimal Double Debug Declare Dim Do Each Else Elseif End Endif Erase Eqv Like Local Long Loop Lset Me New Next Not Nothing Null On Open Stop String Sub To True Type Typeof Until Variant Wend While With 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 Beep If...Then...Else Implements Public Put

Mots cls

71

Tableau 4.6 Commandes de VBA


Call ChDir ChDrive Close Const Date Declare Deftype DeleteSetting Dim Do...Loop End Enum Erase Error Event Exit FileCopy For Each...Next For...Next Function Get GoSub...Return GoTo Input # Kill Let Line Input # Load Lock LSet Mid MidB MkDir Name On Error On...GoSub On...GoTo Open Option Base Option Compare Option Explicit Option Private Print # Private Property Get Property Let Property Set RaiseEvent Randomize ReDim Rem Reset Resume RmDir RSet SaveSetting Seek Select Case SendKeys Set SetAttr Static Stop Sub Time Type Unload While...Wend Width # With Write #

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.

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 :

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 Boolean Byte True et False Nombre de 8 bits (un octet) non sign, compris entre 0 et 255 Plage

Types de donnes

75

Tableau 5.1 Types de donnes en Visual Basic


Type de donnes Currency Plage 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 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. 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. 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 Nombres de 16 bits (2 octets) dont la valeur est comprise entre -32 768 et 32 767 Nombres signs de 32 bits (4 octets) dont la valeur est comprise entre -2 147 483 648 et 2 147 483 647 Adresses 32 bits (4 octets) qui font rfrence des objets 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 Chanes de caractres de longueur variable pouvant contenir environ 2 milliards (231) de caractres Type de donnes spcial pouvant contenir des donnes de toutes sortes

Date

Decimal

Double

Integer Long Object Single

String Variant

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 Outils Macro Macros 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

Types de donnes

77

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.

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#

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"

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,

Types de donnes

81

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

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

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

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 :

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

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

Visibilit des variables

87

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.

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

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-

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.

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 :

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

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

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)

Les tests conditionnels

95

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 < 10 >= 10 et < 12 >= 12 et < 14 >= 14 et < 16 >= 16 chec Mention passable Mention assez bien Mention bien Mention trs bien Rsultat

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

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

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

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

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

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.

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

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

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.

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

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

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

For Next

109

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.

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

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)

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

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

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

Do Loop

115

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 condition Description 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). Une ou plusieurs instructions rptes tant que condition est True, ou jusqu' ce qu'elle le devienne.

statements

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 [bloc dinstructions] [Exit Do] [bloc dinstructions] Loop [While condition] Do [Until condition] [bloc dinstructions] [Exit Do] [bloc dinstructions] Loop 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-

Do Loop

117

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

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-

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

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

Diffrences entre While et Until

121

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 Faire tant que la condition est vraie [bloc dinstructions] [Exit Do] [bloc dinstructions] Loop Do [Until condition] [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

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] Faire [bloc dinstructions] [Exit Do] [bloc dinstructions] Boucler tant que la condition est vraie Do [bloc dinstructions] [Exit Do] [bloc dinstructions] Loop [Until condition] 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

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.

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 Insertion Module. 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.

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 Outils Macros Macro, dune icne, dun raccourci clavier, dun

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 Tableau Formule Insrer 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

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

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 :

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

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

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

Syntaxe dune fonction

133

lment buttons

Description 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. 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. 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. 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.

title

helpfile

context

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 !")

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

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

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.")

Syntaxe dune fonction

137

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 VbCrLf VbCr VbLf VbNewLine quivalent Chr(13) + Chr(10) Chr(13) Chr(10) Chr(13) + Chr(10) ou, sur Macintosh, Chr(13) Description Combinaison des caractres de retour chariot et de saut de ligne Caractre de saut de paragraphe Caractre de saut de ligne 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 :

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

Syntaxe dune fonction

139

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 VbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel VbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal Valeur 0 1 2 3 4 5 16 32 48 64 0 256 512 768 0 Description Affiche le bouton OK uniquement. Affiche les boutons OK et Annuler. Affiche le bouton Abandonner, Ressayer et Ignorer. Affiche les boutons Oui, Non et Annuler. Affiche les boutons Oui et Non. Affiche les boutons Ressayer et Annuler. Affiche l'icne Message critique. Affiche l'icne Requte d'avertissement. Affiche l'icne Message d'avertissement. Affiche l'icne Message d'information. Le premier bouton est le bouton par dfaut. Le deuxime bouton est le bouton par dfaut. Le troisime bouton est le bouton par dfaut. Le quatrime bouton est le bouton par dfaut. 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.

vbMsgBoxHelpButton

16384

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

Syntaxe dune fonction

141

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

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 VbOK vbCancel vbAbort vbRetry vbIgnore VbYes VbNo Valeur 1 2 3 4 5 6 7 Description OK Annuler Abandonner Ressayer Ignorer Oui 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) _

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

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.

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 Chr InStr InStrRev LCase Left Len Renvoie une donne de type Integer reprsentant le code de caractre correspondant la premire lettre d'une chane. Renvoie une valeur de type String contenant le caractre associ au code de caractre indiqu. Renvoie une valeur de type Variant (Long) indiquant la position de la premire occurrence d'une chane l'intrieur d'une autre chane. Renvoie la position d'une occurrence d'une chane dans une autre, partir de la fin de la chane. Renvoie une valeur de type String convertie en minuscules. Renvoie une valeur de type Variant (String) contenant le nombre indiqu de caractres d'une chane en partant de la gauche. Renvoie une valeur de type Long contenant le nombre de caractres d'une chane ou le nombre d'octets requis pour stocker une variable.

146

Chapitre 8. Procdures et fonctions

LTrim Mid Replace Right RTrim Space Str StrComp StrConv String StrReverse Trim UCase

Renvoie une valeur de type Variant (String) contenant une copie d'une chane en supprimant les espaces de gauche. Renvoie une valeur de type Variant (String) contenant un nombre indiqu de caractres extraits d'une chane de caractres. Renvoie une chane dans laquelle une sous-chane spcifie a t remplace plusieurs fois par une autre sous-chane. Renvoie une valeur de type Variant (String) contenant le nombre indiqu de caractres d'une chane en partant de la droite. Renvoie une valeur de type Variant (String) contenant une copie d'une chane en supprimant les espaces de droite. Renvoie une valeur de type Variant (String) comprenant le nombre d'espaces indiqu. Renvoie une valeur de type Variant (String) reprsentant un nombre. Renvoie une valeur de type Variant (Integer) indiquant le rsultat d'une comparaison de chanes. Renvoie une valeur de type Variant (String) convertie au format indiqu. Renvoie une valeur de type Variant (String) contenant une chane constitue d'un caractre rpt sur la longueur indique. Renvoie une chane contenant des caractres dont l'ordre a t invers par rapport une chane donne. Renvoie une valeur de type Variant (String) contenant une copie d'une chane en supprimant les espaces de gauche et de droite. 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

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

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 x = Mid(chaine, 26, 7) x = Left(chaine, 20) x = Right(chaine, 20) Variant 1.54 1.30 1.30 String 1.14 .92 .92 Diffrence en % 35 % 41 % 41 %

Syntaxe dune fonction

149

Fonction x = LTrim(chaine) x = RTrim(chaine) x = Trim(chaine) x = LCase(chaine) x = UCase(chaine)

Variant 1.30 1.26 1.38 12.14 11.32

String .99 .98 1.10 11.87 10.93

Diffrence en % 31 % 29 % 25 % 2% 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 DateAdd DateDiff DatePart DateSerial DateValue Day Renvoie une valeur de type Variant (Date) contenant la date systme actuelle. Renvoie une valeur de type Variant (Date) contenant une date laquelle un intervalle de temps spcifi a t ajout. Renvoie une valeur de type Variant (Long) indiquant le nombre d'intervalles de temps entre deux dates donnes. Renvoie une valeur de type Variant (Integer) contenant l'lment spcifi d'une date donne. Renvoie une valeur de type Variant (Date) correspondant une anne, un mois et un jour dtermins. Renvoie une valeur de type Variant (Date). Renvoie une valeur de type Variant (Integer) indiquant un nombre entier compris entre 1 et 31, inclus, qui reprsente le jour du mois.

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. 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. Renvoie une valeur de type Variant (Integer) indiquant un nombre entier compris entre 1 et 12, inclus, qui reprsente le mois de l'anne. Renvoie une chane indiquant le mois spcifi. 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. 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. Renvoie une valeur de type Variant (Date) indiquant l'heure systme en cours. Renvoie une valeur de type Single reprsentant le nombre de secondes coules depuis minuit. Renvoie une valeur de type Variant (Date) contenant une heure prcise (heure, minute et seconde). Renvoie une valeur de type Variant (Date) contenant une heure. Renvoie une valeur de type Variant (Integer) contenant un nombre entier qui reprsente le jour de la semaine. Renvoie une chane indiquant le jour de la semaine spcifi. Renvoie une valeur de type Variant (Integer) contenant un nombre entier qui reprsente l'anne.

Minute

Month

MonthName Now

Second

Time Timer TimeSerial TimeValue Weekday WeekdayName Year

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.

Syntaxe dune fonction

151

Les fonctions mathmatiques


Abs Atn Cos Exp Fix Hex Int Log Oct Partition Renvoie une valeur de mme type que celle transmise, indiquant la valeur absolue d'un nombre. Renvoie une valeur de type Double indiquant l'arctangente d'un nombre. Renvoie une valeur de type Double indiquant le cosinus d'un angle. Renvoie une valeur de type Double indiquant la valeur de e (base des logarithmes npriens) lev une puissance. Renvoie la partie entire d'un nombre. Renvoie une valeur de type String reprsentant un nombre sous forme hexadcimale. Renvoie la partie entire d'un nombre. Renvoie une valeur de type Double indiquant le logarithme nprien d'un nombre. Renvoie une valeur de type Variant (String) reprsentant la valeur octale d'un nombre. 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. Renvoie une valeur de type Single contenant un nombre alatoire. Renvoie un nombre arrondi un nombre spcifi de positions dcimales. Renvoie une valeur de type Variant (Integer) indiquant le signe d'un nombre. Renvoie une valeur de type Double indiquant le sinus d'un angle. Renvoie une valeur de type Double indiquant la racine carre d'un nombre. Renvoie une valeur de type Double indiquant la tangente d'un angle. Renvoie le nombre contenu dans une chane de caractre sous la forme d'une valeur numrique d'un type appropri.

Rnd Round Sgn Sin Sqr Tan Val

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. 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. 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. Renvoie une valeur de type Double indiquant le taux de rendement interne d'une srie de mouvements de trsorerie priodiques (paiements et encaissements). Renvoie une valeur de type Double indiquant le taux de rendement interne modifi d'une srie de mouvements de trsorerie priodiques (paiements et encaissements). 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. 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. 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. 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. DDB

FV

VC

IPmt

INTPER

IRR

TRI

MIRR

TRIM

Nper

NPM

NPV

VAN

Pmt

VPM

PPmt

PRINCPER

Syntaxe dune fonction

153

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. Renvoie une valeur de type Double indiquant le taux d'intrt par chance pour une annuit. Renvoie une valeur de type Double indiquant l'amortissement linaire d'un bien sur une priode donne. Renvoie une valeur de type Double indiquant l'amortissement global d'un bien sur une priode donne.

VA

Rate SLN

TAUX AMORLIN

SYD

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 Dir Renvoie une valeur de type Variant (String) indiquant le chemin en cours. 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. 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. Renvoie une valeur de type Long reprsentant le mode d'ouverture des fichiers avec l'instruction Open. Renvoie une valeur de type Variant (Date) indiquant la date et l'heure de cration ou de dernire modification d'un fichier. Renvoie une valeur de type Long indiquant la longueur en octets d'un fichier.

EOF

FileAttr FileDateTime FileLen

154

Chapitre 8. Procdures et fonctions

FreeFile GetAttr Input Loc LOF Seek

Renvoie une valeur de type Integer reprsentant le prochain numro de fichier pouvant tre utilis par l'instruction Open. Renvoie une valeur de type Integer indiquant les attributs du fichier ou du dossier. Renvoie une valeur de type String contenant les caractres lus dans un fichier ouvert en mode Input ou Binary. Renvoie une valeur de type Long indiquant la position de lecture/criture courante dans un fichier ouvert. Renvoie une valeur de type Long reprsentant la taille, exprime en octets, d'un fichier ouvert l'aide de l'instruction Open. 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 Iif IsDate IsEmpty IsError IsMissing Slectionne et renvoie une valeur partir d'une liste d'arguments. Renvoie l'un ou l'autre de deux arguments selon l'valuation d'une expression. Renvoie une valeur de type Boolean qui indique si une expression peut tre convertie en date. Renvoie une valeur de type Boolean indiquant si une variable a t initialise. Renvoie une valeur de type Boolean qui indique si une expression est une valeur d'erreur. Renvoie une valeur de type Boolean qui indique si un argument facultatif de type Variant a t pass dans une procdure.

Syntaxe dune fonction

155

IsNull IsNumeric IsObject Switch

Renvoie une valeur de type Boolean qui indique si une expression ne contient aucune donne valide (Null). Renvoie une valeur de type Boolean qui indique si une expression peut tre interprte comme un nombre. Renvoie une valeur de type Boolean qui indique si un identificateur reprsente une variable objet. 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)

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 CBool CByte CCur CDate CDbl Type renvoy Boolean Byte Currency Date Double Plage de valeurs de l'argument expression Toute chane ou expression numrique valide. 0 255. -922 337 203 685 477,5808 922 337 203 685 477,5807. Toute expression de date valide. -1.79769313486231E308 -4,94065645841247E-324 pour les valeurs ngatives ; 4,94065645841247E-324 1,79769313486232E308 pour les valeurs positives. +/-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. -32 768 32 767 ; les fractions sont arrondies. -2 147 483 648 2 147 483 647 ; les fractions sont arrondies. -3,402823E38 -1,401298E-45 pour les valeurs ngatives ; 1,401298E-45 3,402823E38 pour les valeurs positives. Les valeurs renvoyes par la fonction Cstr dpendent de l'argument expression. Mme plage de valeurs que le type Double pour les nombres et que le type String pour les chanes non numriques.

CDec

Decimal

CInt CLng CSng

Integer Long Single

CStr CVar

String Variant

Si largument expression pass la fonction excde la plage de valeurs du type de donnes cible, une erreur se produit. Il est donc

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. Arrte momentanment l'excution afin que le systme d'exploitation puisse traiter d'autres vnements. Renvoie la valeur de type String associe une variable d'environnement du systme d'exploitation. Non disponible sur le Macintosh. 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. Renvoie une valeur de cl d'une entre d'application de la base de registres de Windows.

DoEvents Environ

GetAllSettings

GetSetting

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. Utilise sur Macintosh pour convertir une constante quatre caractres en une valeur pouvant tre exploite par les fonctions Dir, Kill, Shell et AppActivate. Excute un script AppleScript et retourne une valeur renvoye par le script, le cas chant. Renvoie une valeur de type Long indiquant le code de couleur RGB correspondant au numro de couleur indiqu. Renvoie un entier de type Long reprsentant le code RGB. 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. Renvoie une valeur de type String qui fournit des informations sur une variable. Renvoie une valeur de type Integer qui indique le sous-type d'une variable.

MacID

MacScript QBColor RGB Shell

TypeName VarType

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 Filter Renvoie une variable de type Variant contenant un tableau. Renvoie un tableau de base zro contenant un sous-ensemble d'un tableau de chane bas sur des critres de filtre spcifis. Renvoie une valeur de type Boolean qui indique si une variable est un tableau. Renvoie une chane cre par la jonction de plusieurs sous-chanes contenues dans un tableau.

IsArray Join

Syntaxe dune fonction

159

LBound Split UBound

Renvoie une valeur de type Long contenant le plus petit indice disponible pour la dimension indique d'un tableau. Renvoie un tableau de base zro une dimension contenant le nombre spcifi de sous-chanes. 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 CreateObject GetObject Excute une mthode d'un objet, ou dfinit ou renvoie une proprit d'un objet. Cre et renvoie une rfrence un objet ActiveX. 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 Error Renvoie une donne de type Variant et de sous-type Error contenant un numro d'erreur spcifi par l'utilisateur. 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.

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. Renvoie une expression formate sous forme de date ou d'heure. Renvoie une expression formate sous forme de nombre. Renvoie une expression formate sous forme de pourcentage (multipli par 100) avec un caractre % de fin.

FormatDateTime FormatNumber FormatPercent

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

MsgBox

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.

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

ypos

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 Tab Utilise avec l'instruction Print # ou la mthode Print pour positionner la sortie. 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 :

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

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.

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

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 Insertion Module 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 Insertion Fonction.

Figure 8.13 Utilisation dune fonction personnalise dans une formule

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

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

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.

PARTIE 3

Modles dobjets

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

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.

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.

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.

Un objet en situation

175

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 Word Excel Access Outlook PowerPoint Version 2000 VBAWRD9.CHM VBAXL9.CHM ACMAIN9.CHM VBAOUTL9.CHM VBAPP9.CHM Version XP VBAWD10.CHM VBAXL10.CHM VBAAC10.CHM VBAOL10.CHM VBAPP10.CHM Version 2003 VBAWD10.CHM VBAXL10.CHM VBAAC10.CHM VBAOL11.CHM VBAPP10.CHM Version 2007 WINWORD.DEV.HXS EXCEL.DEV.HXS MSACCESS.DEV.HXS OUTLOOK.DEV.HXS 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

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-

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.

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

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

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 :

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

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

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

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 Tableau Ajustement 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

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)

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 Affichage Explorateur 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

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 :

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 Graph Office (composants communs toutes les applications Office) Extensions serveur Office Publisher FrontPage Fichier daide en ligne VBAGR10.CHM VBAOF11.CHM VBAOWS10.CHM VBAPB10.CHM VBAFPD10.CHM et VBAFPW10.CHM

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

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.

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

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.

Objet Application

193

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-

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 Outils Options (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

Objet Application

195

le rsultat voulu, il est noy dans un volume de code trs important. Ainsi, le simple fait de choisir la commande Outils Options Gnral Confirmation 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

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 :

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

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

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

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 :

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.

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 Fichier Proprits), 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.

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 Insertion Caractres 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 :

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-

Objet Selection

205

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 Dun caractre Dun mot Dune phrase Dun paragraphe la fin de la ligne Dune ligne la fin du document Commande sel.MoveRight unit:=wdCharacter, Count:=1 sel.MoveRight unit:=wdWord, Count:=1 sel.MoveRight unit:=wdSentence, Count:=1 sel.Moveright unit:=wdParagraph, Count:=1 sel.Selection.EndKey unit:=wdLine sel.Moveright unit:=wdLine, Count:=1 sel.MoveRight unit:=wdStory, Count:=1

206

Chapitre 10. Programmer Word

Tableau 10.2 Commandes de dplacement du point dinsertion vers la gauche


Dplacement vers la gauche Dun caractre Dun mot Dune phrase Dun paragraphe Au dbut de la ligne Dune ligne Au dbut du document Commande sel.MoveLeft unit:=wdCharacter, Count:=1 sel.MoveLeft unit:=wdWord, Count:=1 sel.MoveLeft unit:=wdSentence, Count:=1 sel.MoveLeft unit:=wdParagraph, Count:=1 sel.Selection.HomeKey unit:=wdLine sel.MoveLeft unit:=wdLine, Count:=1 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

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 + _

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

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

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

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 Outils Rfrences.

Figure 10.4 Rfrences vers les bibliothques dobjets

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.

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

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

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.

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.

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

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. Renvoie un objet qui reprsente la feuille active (feuille au premier plan) dans le classeur actif ou dans la fentre ou le classeur spcifi. Renvoie un objet Window qui reprsente la fentre active (celle qui se trouve au premier plan). Renvoie un objet Workbook qui reprsente le classeur de la fentre active (celle qui se trouve au premier plan). 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. Renvoie le numro de build de Microsoft Excel. Renvoie ou dfinit le mode de calcul. Il peut s'agir de l'une des constantes XlCalculation suivantes : xlCalculationAutomatic, xlCalculationManual ou xlCalculationSemiautomatic. 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. Renvoie le nom affich dans la barre de titre de la fentre Microsoft Excel principale. Renvoie un objet Range qui reprsente toutes les cellules dans la feuille de calcul active. Renvoie un objet Range qui reprsente toutes les colonnes de la feuille de calcul active. Renvoie ou dfinit le mode saisie de donnes.

ActiveSheet

ActiveWindow ActiveWorkbook Application

Build Calculation

CalculationVersion

Caption Cells Columns DataEntryMode

Objet Application

219

Tableau 11.1 Principales proprits de lobjet Application


DefaultFilePath DefaultSaveFormat Dialogs DisplayFullScreen EditDirectlyInCell FileSearch FixedDecimal Renvoie ou dfinit le chemin par dfaut utilis par Microsoft Excel l'ouverture des fichiers. Renvoie ou dfinit le format d'enregistrement par dfaut des fichiers. Renvoie une collection Dialogs qui reprsente toutes les botes de dialogue prdfinies. A la valeur True si Microsoft Excel fonctionne en mode plein cran. A la valeur True si Microsoft Excel autorise la modification directement dans les cellules. Renvoie un objet FileSearch pour effectuer des recherches de fichier. 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. Renvoie ou dfinit le nombre de positions de dcimales fixes utilis quand la valeur True est affecte la proprit FixedDecimal. 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. Renvoie des informations relatives aux paramtres rgionaux et internationaux en cours. Renvoie l'objet LanguageSettings, qui contient des informations sur les paramtres de langue de Microsoft Excel. En lecture seule. L'objet Application renvoie une collection Names qui reprsente tous les noms du classeur actif.

FixedDecimalPlaces

Interactive

International LanguageSettings

Names

220

Chapitre 11. Programmer Excel

Tableau 11.1 Principales proprits de lobjet Application


NetworkTemplatesPath OperatingSystem Renvoie le chemin d'accs rseau o les modles sont stocks. 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 . Renvoie une collection RecentFiles qui reprsente la liste des fichiers rcemment utiliss. 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. Renvoie un objet Range qui reprsente toutes les lignes de la feuille de calcul active. Renvoie l'objet slectionn dans la fentre active. Renvoie une collection Sheets qui reprsente toutes les feuilles du classeur actif. A la valeur True si les info-bulles sont actives. Renvoie le chemin d'accs local de l'emplacement o les modles sont stocks. Renvoie un objet Workbook qui reprsente le classeur dans lequel s'excute le code de la macro en cours. Renvoie ou dfinit le nom de l'utilisateur actuel. Renvoie le numro de version de Microsoft Excel. A la valeur True si l'objet est visible. Renvoie une collection Windows qui reprsente chacune des fentres de l'ensemble des classeurs. Renvoie une collection Workbooks qui reprsente l'ensemble des classeurs ouverts. Renvoie une collection Sheets qui reprsente toutes les feuilles de calcul du classeur actif.

RecentFiles ReferenceStyle

Rows Selection Sheets ShowToolTips TemplatesPath ThisWorkbook UserName Version Visible Windows Workbooks Worksheets

Objet Application

221

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 Affichage Fentre 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

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. Ajoute une liste personnalise pour la recopie incrmente et/ou le tri personnalis. 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. Provoque un calcul intgral des donnes dans tous les classeurs ouverts. 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. Convertit un nom Microsoft Excel en un objet ou une valeur. Affiche la bote de dialogue Ouvrir et autorise l'utilisateur ouvrir un fichier. Renvoie un objet Range qui reprsente l'intersection rectangulaire de deux plages ou plus.

AddCustomList Calculate

CalculateFull ConvertFormula

Evaluate FindFile Intersect

Objet Workbook

223

Tableau 11.2 Principales mthodes de lobjet Application


Quit SendKeys Wait Quitte Excel. Envoie des touches l'application active. 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. Renvoie une collection Sheets qui reprsente toutes les feuilles graphiques du classeur actif. A la valeur True si le classeur utilise le calendrier depuis 1904. Renvoie une collection Names qui reprsente tous les noms du classeur actif.

Charts Date1904 Names

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. A la valeur True si le classeur a t ouvert en lecture seule. A la valeur True si le classeur spcifi n'a pas t modifi depuis son dernier enregistrement. A la valeur True si Microsoft Excel enregistre les valeurs des liaisons externes avec le classeur. Renvoie une collection Sheets qui reprsente toutes les feuilles du classeur actif. Renvoie une collection Styles qui reprsente tous les styles du classeur spcifi. Renvoie une collection Sheets qui reprsente toutes les feuilles de calcul du classeur actif. A la valeur True si le classeur est protg contre l'criture.

ReadOnly Saved SaveLinkValues Sheets Styles Worksheets WriteReserved

Le tableau 11.4 liste les principales mthodes de lobjet Workbook.


Tableau 11.4 Principales mthodes de lobjet Workbook
Activate Close PrintOut PrintPreview RefreshAll Active la premire fentre associe au classeur. Ferme le classeur. Imprime le classeur. Affiche un aperu du classeur tel qu'il apparatra une fois imprim. Actualise toutes les plages de donnes externes et les rapports de tableau crois dynamique du classeur spcifi. Enregistre les modifications apportes au classeur spcifi. Enregistre les modifications du classeur dans un fichier diffrent.

Save SaveAs

Objet Worksheet

225

Tableau 11.4 Principales mthodes de lobjet Workbook


SaveCopyAs Unprotect Enregistre une copie du classeur dans un fichier sans modifier le classeur ouvert en mmoire. 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 Columns EnableCalculation Renvoie un objet Range qui reprsente toutes les cellules dans la feuille de calcul active. Renvoie un objet Range qui reprsente toutes les colonnes de la feuille de calcul active. A la valeur True si Microsoft Excel recalcule automatiquement la feuille de calcul quand cela est ncessaire. Renvoie ou dfinit le nom de l'objet. Renvoie une collection Names qui reprsente tous les noms du classeur actif.

Name Names

226

Chapitre 11. Programmer Excel

Tableau 11.5 Principales proprits de lobjet Worksheet


Next PageSetup Previous ProtectContents ProtectionMode Renvoie un objet Chart, Range ou Worksheet qui reprsente la prochaine feuille ou cellule. Renvoie un objet PageSetup contenant tous les paramtres de mise en page de l'objet spcifi. Renvoie un objet Chart, Range ou Worksheet qui reprsente la cellule ou la feuille prcdente. A la valeur True si le contenu de la feuille est protg. 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. Renvoie un objet Range Renvoie un objet Range qui reprsente toutes les lignes de la feuille de calcul active. A la valeur True si l'objet est visible.

Range Rows Visible

Le tableau 11.6 liste les principales mthodes de lobjet Worksheet.


Tableau 11.6 Principales mthodes de lobjet Worksheet
Activate Calculate Active la feuille (revient cliquer sur l'onglet de la feuille). Calcule tous les classeurs ouverts, une feuille de calcul particulire dans un classeur ou une plage de cellules dtermine dans une feuille de calcul. Copie un objet Range dans la plage spcifie ou dans le Presse-papiers. Supprime un objet. Convertit un nom Microsoft Excel en un objet ou une valeur. Dplace la feuille en un autre endroit du classeur. Colle le contenu du Presse-papiers dans la feuille.

Copy Delete Evaluate Move Paste

Objet Range

227

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. Imprime la feuille de calcul. Affiche un aperu de la feuille de calcul telle qu'elle apparatra une fois imprime. Protge une feuille de calcul afin d'empcher toute modification. Enregistre les modifications de la feuille dans un fichier diffrent. Slectionne la feuille de calcul. 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.

PrintOut PrintPreview Protect SaveAs Select Unprotect

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 :

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

Objet Range

229

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 AddressLocal Cells Column Columns ColumnWidth Count End Renvoie la rfrence de la plage en langage macro. Renvoie la rfrence de la plage spcifie en langage utilisateur. Renvoie un objet Range qui reprsente toutes les cellules dans la feuille de calcul active. Renvoie le numro de la premire colonne de la premire zone de la plage spcifie. Renvoie un objet Range qui reprsente toutes les colonnes de la feuille de calcul active. Renvoie ou dfinit la largeur de toutes les colonnes de la plage spcifie. Renvoie le nombre des objets de la collection. 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. Renvoie un objet Range qui reprsente la colonne entire (ou plusieurs colonnes) contenant la plage spcifie. Renvoie un objet Range qui reprsente la ligne entire (ou plusieurs lignes) contenant la plage spcifie. Renvoie ou dfinit la formule de l'objet dans le style de rfrence A1 et dans la langue de la macro. 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.

EntireColumn EntireRow Formula HasFormula

230

Chapitre 11. Programmer Excel

Tableau 11.7 Principales proprits de lobjet Range


Offset Resize Row RowHeight Rows Validation Value Renvoie un objet Range qui reprsente une plage dcale de la plage spcifie. Renvoie un objet Range qui reprsente la plage redimensionne. Renvoie le numro de la premire ligne de la premire zone de la plage. Renvoie la hauteur, mesure en points, de toutes les lignes de la plage spcifie. Renvoie un objet Range qui reprsente toutes les lignes de la feuille de calcul active. Renvoie l'objet Validation qui reprsente la validation de donnes pour la plage spcifie. 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). Renvoie ou dfinit la valeur de la cellule. Renvoie un objet Worksheet qui reprsente la feuille de calcul contenant la plage spcifie.

Value2 Worksheet

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. Attribue des noms aux cellules de la plage spcifie. Renvoie une correspondance trouve par la fonctionnalit saisie semi-automatique de la liste. Excute une recopie incrmente sur les cellules de la plage spcifie. Modifie la largeur des colonnes de la plage ou la hauteur des lignes de la plage pour l'ajuster au mieux.

ApplyNames AutoComplete AutoFill AutoFit

Objet Range

231

Tableau 11.8 Principales mthodes de lobjet Range


AutoFormat Calculate Applique automatiquement un format prdfini la plage spcifie. Calcule tous les classeurs ouverts, une feuille de calcul particulire dans un classeur ou une plage de cellules dtermine dans une feuille de calcul. Efface lobjet Range. Efface les formules de la plage. Annule la mise en forme de l'objet. Renvoie un objet Range qui reprsente toutes les cellules dont le contenu est diffrent de celui de la cellule de comparaison dans chaque colonne. 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. Copie l'objet Range dans la plage spcifie ou dans le Presse-papiers. Cre des noms dans la plage spcifie en fonction des tiquettes de texte de la feuille. Coupe l'objet et le place dans le Presse-papiers. Cre une srie de donnes dans la plage spcifie. Supprime l'objet Range. 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. 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. 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.

Clear ClearContents ClearFormats ColumnDifferences

Consolidate

Copy CreateNames Cut DataSeries Delete FillDown

FillLeft

FillRight

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. Recherche une information spcifique dans une plage et renvoie un objet Range qui reprsente la premire cellule o cette information apparat. 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. 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. Insre une cellule ou une plage de cellules dans la feuille de calcul et dcale les autres cellules pour librer la place ncessaire. 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. Redistribue une plage de donnes et la divise en plusieurs cellules. Colle dans la plage spcifie les donnes provenant du Presse-papiers. Imprime l'objet Range. Affiche un aperu de l'objet tel qu'il apparatra une fois imprim. Recherche et remplace des caractres dans les cellules de la plage spcifie. Renvoie un objet Range qui reprsente toutes les cellules dont le contenu est diffrent de celui de la cellule de comparaison dans chaque ligne. Slectionne l'objet Range. Renvoie un objet Range qui reprsente toutes les cellules correspondant au type et la valeur spcifis.

Find

FindNext

FindPrevious

Insert

ListNames

Parse PasteSpecial PrintOut PrintPreview Replace RowDifferences

Select SpecialCells

Mise en pratique

233

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. Redistribue sur plusieurs colonnes une colonne de cellules qui comportent du texte.

TextToColumns

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

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

Mise en pratique

235

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

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.

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

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 AllDataAccessPages AllDatabaseDiagrams AllForms AllMacros AllModules AllQueries AllReports Proprits d'une instance dtermine d'un objet. Page d'accs aux donnes dans l'objet CurrentProject ou CodeProject. Schma de base de donnes dans l'objet CurrentData ou CodeData. Formulaire dans l'objet CurrentProject ou CodeProject. Macro dans l'objet CurrentProject ou CodeProject. Module dans l'objet CurrentProject ou CodeProject. Requte dans l'objet CurrentData ou CodeData. Etat dans l'objet CurrentProject ou CodeProject.

Objets dAccess

239

Tableau 12.1 Collections dAccess


AllStoredProcedures AllTables AllViews Controls Procdure stocke dans l'objet CurrentData ou CodeData. Table dans l'objet CurrentData ou CodeData. Vue dans l'objet CurrentData ou CodeData. 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. Formats conditionnels d'un contrle Zone de liste modifiable ou Zone de texte. Chaque format conditionnel est reprsent par un objet FormatCondition. Formulaires ouverts en cours dans une base de donnes Access. Modules standard et modules de classe ouverts dans une base de donnes Access. Objets Page d'un contrle Onglet. Proprits prdfinies d'une instance d'un objet Form, Report ou Control ouvert. Objets Reference reprsentant chaque rfrence actuellement dfinie. tats actuellement ouverts dans une base de donnes Access.

FormatConditions

Forms Modules Pages Properties References Reports

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

240

Chapitre 12. Programmer Access

Tableau 12.2 Objets dAccess


AccessObjectProperty Application CodeData Control Caractristique prdfinie ou dfinie par l'utilisateur d'un objet AccessObject. Fait rfrence l'application Access active. Objets stocks dans la base de donnes du code par l'application source (serveur) (Jet ou SQL). Contrle de formulaire, d'tat ou de section, ou un contrle dans un autre contrle ou attach un autre contrle. Objets stocks dans la base de donnes en cours par l'application source (serveur) (Jet ou SQL). Projet du projet Access (.adp) ou de la base de donnes Access (.mdb) en cours. 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. Sert excuter des actions Access partir de VBA. Formulaire Access. Mise en forme conditionnelle d'un contrle Zone de liste modifiable ou Zone de texte (membre de la collection FormatConditions). Lien hypertexte associ un contrle dans un formulaire, un tat ou une page d'accs aux donnes. Fait rfrence un module standard ou un module de classe. Membre de la collection Pages. Rfrence dfinie sur la bibliothque de type d'une autre application ou d'un autre projet. Rapport. Fait rfrence au formulaire, l'tat ou au contrle particulier qui est actif. Proprits des options Web d'une page d'accs aux donnes Microsoft Access dtermine.

CurrentData CurrentProject DefaultWebOptions

DoCmd Form FormatCondition

Hyperlink Module Page Reference Report Screen WebOptions

Objet DoCmd

241

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 :
Argument Application Mthode arg1, arg2... Arguments de la mthode slectionne. Ces arguments sont semblables aux arguments d'action de l'action correspondante. Description Facultatif. L'objet Application Une des mthodes prises en charge par cet objet.

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

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 Beep CancelEvent Close CopyObject Applique un filtre, une requte ou une clause WHERE SQL un formulaire. Emet un signal sonore dans le haut-parleur de l'ordinateur. Annule l'vnement qui a entran l'excution par Access de la macro contenant cette action. Ferme une fentre Microsoft Access spcifie, ou la fentre active au cas o aucune fentre n'est spcifie. 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. 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. Trouve l'enregistrement suivant qui satisfait aux critres spcifis par l'action TrouverEnregistrement prcdente ou la bote de dialogue Rechercher dans le champ. Trouve la premire instance des donnes qui satisfont aux critres spcifis par les arguments de l'action TrouverEnregistrement. 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. Active le premier contrle d'une page spcifie dans le formulaire actif. Transforme l'enregistrement spcifi en enregistrement courant dans une table ouverte, un formulaire ou une feuille de rponses dynamique de requte.

DeleteObject

FindNext

FindRecord

GoToControl

GoToPage GoToRecord

Objet DoCmd

243

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. Agrandit la fentre active de manire ce qu'elle remplisse la fentre Access. Rduit la fentre active en icne au bas de la fentre Microsoft Access. Dplace ou redimensionne la fentre active. Ouvre une page d'accs aux donnes en mode Page ou en mode Cration. 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. 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. 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. 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. 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.

Maximize Minimize MoveSize OpenDataAccessPage OpenForm

OpenQuery

OpenReport

OpenTable

OpenView

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). 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. 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. Rend une fentre agrandie ou rduite sa taille prcdente. 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. 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). Slectionne un objet de la base de donnes spcifi. 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. Active ou dsactive les messages systme. 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.

Quit

Requery

Restore RunCommand

Save

SelectObject SetMenuItem

SetWarnings ShowAllRecords

Objet Form

245

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). Importe ou exporte des donnes entre la base de donnes Access (.mdb) active ou le projet Access (.adp) et une autre base de donnes. 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. Importe ou exporte du texte entre la base de donnes Access (.mdb) ou le projet Access (.adp) en cours et un fichier texte.

TransferDatabase

TransferSpreadsheet

TransferText

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

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 Forms!nomformulaire Forms![nom formulaire] Forms("nomformulaire") Forms(index) Exemple Forms!FormulaireCommandes Forms![Formulaire Commandes] Forms("FormulaireCommandes") 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

Objet Form

247

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 AllowAdditions AllowDeletions AllowEdits AutoCenter Identifie le contrle actif. Permet de spcifier si un utilisateur peut ajouter un enregistrement lorsqu'il utilise un formulaire. Permet de spcifier si un utilisateur peut supprimer un enregistrement lorsqu'il utilise un formulaire. Permet de spcifier si un utilisateur peut modifier des enregistrements sauvegards lorsqu'il utilise un formulaire. Permet de spcifier si un formulaire sera centr automatiquement dans la fentre de l'application lors de l'ouverture de ce dernier. Permet de dterminer si une fentre Formulaire doit tre automatiquement dimensionne lors de son ouverture de manire afficher des enregistrements complets. Permet de spcifier si le bouton Fermer d'un formulaire est activ. Permet de spcifier si un formulaire contient un menu Systme en mode Formulaire et en mode Feuille de donnes. Permet de faire rfrence la collection Controls d'un formulaire ou d'un sous-formulaire.

AutoResize

CloseButton ControlBox Controls

248

Chapitre 12. Programmer Access

Tableau 12.4 Principales proprits de lobjet Form


CurrentRecord Cycle Identifie l'enregistrement en cours dans le jeu d'enregistrements affich dans un formulaire. Permet de spcifier ce qui se produit lorsque vous appuyez sur la touche TAB quand le dernier contrle d'un formulaire dpendant est activ. 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. Permet de spcifier le mode d'affichage d'un formulaire lors de son ouverture. Permet de dterminer si l'enregistrement en cours a subi des modifications depuis sa dernire sauvegarde. Spcifie un sous-jeu d'enregistrements afficher lorsqu'un filtre est appliqu un formulaire. Spcifie ou dtermine si la proprit Filtre (Filter) d'un formulaire ou d'un tat est applique. 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. 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. Spcifie si un formulaire comprend des boutons de dplacement et une zone Enr. . Dtermine si l'enregistrement en cours est un nouvel enregistrement. Spcifie de quelle manire les enregistrements doivent tre tris dans un formulaire. Spcifie si le paramtrage de la proprit OrderBy d'un objet est appliqu.

DataEntry

DefaultView Dirty Filter FilterOn FrozenColumns

Modal

NavigationButtons NewRecord OrderBy OrderByOn

Objet Form

249

Tableau 12.4 Principales proprits de lobjet Form


PopUp Properties RowHeight Visible Spcifie si un formulaire doit s'ouvrir en tant que formulaire indpendant. Renvoie une rfrence l'objet de collection Properties d'un contrle. Spcifie la hauteur de toutes les lignes en mode Feuille de donnes. 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 Recalc Refresh Permet d'activer le premier contrle de la page spcifie dans le formulaire actif. Effectue une mise jour immdiate de tous les contrles calculs d'un formulaire. 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. 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. 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. Active le formulaire spcifi, le contrle spcifi du formulaire actif ou le champ spcifi de la feuille de donnes active. 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.

Repaint

Requery

SetFocus Undo

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.

Mise en pratique

251

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 :

252

Chapitre 12. Programmer Access

Le champ limite a t transform en un contrle zone de liste grce la commande Format Remplacer par Zone 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

Mise en pratique

253

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-

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.

Mise en pratique

255

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

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.

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.

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 Outils Rfrences. 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

Objets dADO

259

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

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 Connection Description 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. Utilis pour dfinir une commande spcifique, comme une requte SQL, qui est excute sur la source de donnes. 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). 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. 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. Reprsente un paramtre ou un argument associ un objet Command bas sur une requte paramtre ou une procdure stocke. Reprsente une colonne de donnes dun type de donnes courant. Chaque objet Field correspond une colonne dun objet Recordset. 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. Contient les dtails des erreurs daccs aux donnes qui dpendent dune seule opration impliquant la source de donnes.

Command Recordset

Record

Stream

Parameter Field Property

Error

Objet Connection

261

Tableau 13.1 Collections et objets dADO


Objet Fields Properties Parameters Errors Description Contient tous les objets Field dun objet Recordset ou Record. Contient tous les objets Property dune instance spcifique dun objet. Contient tous les objets Parameter dun objet Command. 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

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.

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

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 :

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 :

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

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.

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.

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

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

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.

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

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

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

Mise en pratique

275

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

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

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.

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

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

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

Mise en pratique

281

' 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-

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.

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.

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.

Objet MailItem

285

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 Attachments BCC Body BodyFormat Description Renvoie une collection qui reprsente les pices jointes dun message. Contient la liste des destinataires en BCC (Blind Carbon Copy ou CCI pour Copie Carbone Invisible). Contient le texte du message lectronique. 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 Contient la liste des destinataires en CC (Carbon Copy ou Copie Carbone). Renvoie une valeur de type Date qui indique l'heure de cration du message. Renvoie ou dfinit une constante OlImportance qui indique le niveau d'importance du message parmi les trois choix suivants : olImportanceHigh, olImportanceLow et olImportanceNormal. Renvoie ou dfinit une valeur de type Date qui indique la date et l'heure de rception du message. Renvoie une collection Recipients qui reprsente tous les destinataires du message. Renvoie une valeur de type String qui indique le nom complet de l'expditeur du message.

CC CreationTime Importance

ReceivedTime Recipients SenderName

286

Chapitre 14. Programmer Outlook

Tableau 14.1 Principales proprits dun objet MailItem


Proprit Size Subject To Description Renvoie une valeur de type Long qui indique la taille (en octets) du message. Renvoie ou dfinit une valeur de type String qui indique l'objet (sujet) du message. 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 Copy Delete Display Forward Move PrintOut Reply Description Cre une copie dun message. Supprime un message. Affiche un message. Transfre un message. Dplace un message dans un dossier. Imprime un message. Cre, partir du message d'origine, une rponse pradresse l'expditeur d'origine et renvoie la rponse sous la forme d'un objet MailItem. 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. Envoie un message.

ReplyAll

Send

Pour envoyer un courrier lectronique par programmation, on utilise un code similaire celui-ci :
Dim courriel As MailItem Dim destinataire As Recipient

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 :

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

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.

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 programmes Microsoft Office Outils Microsoft Office Certificat numrique pour les projets VBA Excutez cet utilitaire et attribuez un nom votre certificat (figure 14.4).

Mise en pratique

291

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.

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)

Mise en pratique

293

' 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

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-

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.

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

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.

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

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.

Objet Application

301

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 ActivePresentation ActivePrinter ActiveWindow Build Caption CommandBars FileDialog OperatingSystem Presentations ShowStartupDialog SlideShowWindows Version Windows WindowState Spcifie si la fentre est active. Renvoie un objet Presentation qui reprsente la prsentation ouverte dans la fentre active. Renvoie le nom de limprimante active. Renvoie un objet DocumentWindow qui reprsente la fentre de document active. Renvoie le numro de build de PowerPoint. Affiche le titre dune fentre. Renvoie une collection CommandBars reprsentant les barres de commandes de PowerPoint. Permet douvrir la bote de dialogue Fichier pour ouvrir ou enregistrer des fichiers. Renvoie le nom du systme dexploitation. Renvoie une collection Presentations qui reprsente toutes les prsentations ouvertes. Permet dactiver ou de dsactiver laffichage du volet Office. Renvoie une collection SlideShowWindows qui reprsente toutes les fentres de diaporama ouvertes. Renvoie le numro de version de PowerPoint. Renvoie une collection DocumentWindows reprsentant l'intgralit des fentres de document ouvertes. Gre ltat de la fentre spcifie.

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 Affichage Fentre 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.

Collection Presentations

303

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. Renvoie une collection ColorSchemes qui reprsente les jeux de couleurs de la prsentation. Renvoie une collection Fonts qui reprsente toutes les polices utilises dans la prsentation. Renvoie le nom de la prsentation avec le chemin d'accs complet. Renvoie un objet Master qui reprsente le masque du document. Renvoie le nom de la prsentation avec son extension, mais pas le chemin. Renvoie un objet Master qui reprsente le masque de commentaires. Renvoie un objet PageSetup dont les proprits contrlent les attributs de mise en page des diapositives de la prsentation. Renvoie le chemin daccs de la prsentation. Renvoie un objet PrintOptions qui reprsente les options d'impression enregistres avec la prsentation. Dtermine si des modifications ont t apportes la prsentation depuis son dernier enregistrement.

ColorSchemes

Fonts FullName HandoutMaster Name NotesMaster PageSetup

Path PrintOptions

Saved

304

Chapitre 15. Programmer PowerPoint

Tableau 15.2 Principales proprits de lobjet Presentation


SlideMaster Slides SlideShowSettings Renvoie un objet Master qui reprsente le masque des diapositives. Renvoie une collection Slides qui reprsente toutes les diapositives de la prsentation. Renvoie un objet SlideShowSettings qui reprsente les paramtres du diaporama de la prsentation spcifie. Renvoie un objet SlideShowWindow qui reprsente la fentre du diaporama dans laquelle la prsentation est en cours d'excution. Renvoie le nom du modle de prsentation associ la prsentation. Renvoie une collection DocumentWindows qui reprsente toutes les fentres de document associes la prsentation.

SlideShowWindow

TemplateName Windows

Le tableau 15.3 liste les principales mthodes de lobjet Presentation.


Tableau 15.3 Principales mthodes de lobjet Presentation
ApplyTemplate Close Export Applique un modle de conception la prsentation en cours. Ferme la fentre ouverte d'une prsentation. Exporte chaque diapositive de la prsentation l'aide du filtre graphique spcifi et enregistre les fichiers exports dans le dossier spcifi. Fusionne une prsentation au sein d'une autre prsentation. Imprime la prsentation. Enregistre la prsentation.

Merge PrintOut Save

Collection Presentations

305

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. Enregistre une copie de la prsentation spcifie dans un fichier sans modifier l'original. Affiche un aperu de la prsentation dans le navigateur Web actif.

SaveCopyAs

WebPagePreview

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.

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.

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

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.

Collection Presentations

309

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

310

Chapitre 15. Programmer PowerPoint

Ne vous posez pas de question mtaphysique et choisissez la commande Excution Rinitialiser 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.

Collection Slides

311

Tableau 15.4 Principales proprits de lobjet Slide


Background ColorScheme Renvoie un objet ShapeRange qui reprsente l'arrire-plan de la diapositive. Renvoie ou dfinit un objet ColorScheme reprsentant les couleurs du jeu de la diapositive, du groupe de diapositives ou du masque de diapositive spcifi. Renvoie un objet Design reprsentant une conception. Dtermine si la diapositive ou plage de diapositives spcifie affiche les objets d'arrire-plan sur le masque des diapositives. Dtermine si l'arrire-plan de la diapositive ou de la plage de diapositives spcifie est identique celui du masque des diapositives. Renvoie ou dfinit une constante PpSlideLayout qui reprsente la mise en page de la diapositive. Renvoie un objet Master qui reprsente le masque des diapositives. Renvoie le nom de la diapositive qui est gal Slide suivi dun numro qui nest pas forcment squentiel. 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. Renvoie un numro d'identification unique pour la diapositive spcifie. Renvoie le numro d'index de la diapositive spcifie au sein de la collection Slides. Numro qui s'affiche dans le coin infrieur droit de la diapositive lorsque vous affichez les numros de diapositive. Renvoie un objet SlideShowTransition qui reprsente les effets spciaux pour la transition spcifie entre les diapositives. Renvoie un objet TimeLine reprsentant la chronologie d'animation de la diapositive.

Design DisplayMasterShapes

FollowMasterBackground

Layout Master Name Shapes

SlideID SlideIndex SlideNumber

SlideShowTransition

TimeLine

312

Chapitre 15. Programmer PowerPoint

Le tableau 15.5 liste les mthodes de lobjet Slide.


Tableau 15.5 Mthodes de lobjet Slide ApplyTemplate Copy Cut Delete Applique un modle de conception la prsentation en cours. Copie l'objet spcifi dans le Presse-papiers. Supprime l'objet spcifi et le place dans le Pressepapiers. Supprime l'objet spcifi. 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. Exporte une diapositive l'aide du filtre graphique spcifi et enregistre le fichier export sous le nom de fichier spcifi. Dplace l'objet Slide un emplacement prcis au sein de la mme collection et renumrote en consquence tous les autres lments de la collection. Slectionne l'objet spcifi.

Duplicate

Export

MoveTo

Select

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

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.

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-

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,

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

Collection Shapes

317

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. Renvoie un objet AnimationSettings qui reprsente tous les effets spciaux que vous pouvez appliquer l'animation de la forme spcifie. 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. Renvoie un objet FillFormat qui contient les proprits de mise en forme du remplissage pour la forme spcifie. Renvoie ou dfinit, en points, la hauteur de l'objet spcifi. Renvoie une valeur de type Long identifiant la forme. 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. Renvoie un objet LineFormat qui contient les proprits de mise en forme des traits pour la forme spcifie. Dtermine si la forme spcifie conserve ses proportions d'origine lorsque vous la redimensionnez. Renvoie le nom de la forme spcifie. Renvoie un objet PictureFormat qui contient les proprits de mise en forme d'images pour la forme spcifie. Renvoie un objet Table qui reprsente un tableau contenu dans une forme ou dans une plage de formes. Renvoie un objet TextFrame qui contient les proprits d'alignement et d'ancrage pour la forme spcifie ou le style du texte du masque.

AnimationSettings

AutoShapeType

Fill Height Id Left

Line

LockAspectRatio Name PictureFormat Table TextFrame

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. Renvoie une constante MsoShapeType reprsentant le type d'une forme. Renvoie ou dfinit la visibilit de l'objet spcifi ou la mise en forme applique l'objet spcifi. Renvoie ou dfinit en points la largeur de l'objet spcifi.

Type Visible Width

Le tableau 15.7 liste les principales mthodes de lobjet Shape.


Tableau 15.7 Principales mthodes de lobjet Shape
Apply Copy Cut Delete Applique la forme spcifie la mise en forme qui a t copie l'aide de la mthode PickUp. Copie l'objet spcifi dans le Presse-papiers. Supprime l'objet spcifi et le place dans le Presse-papiers. Supprime l'objet spcifi. 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. Copie la mise en forme de la forme spcifie. Met l'chelle la hauteur de la forme selon un facteur spcifi. Met l'chelle la largeur de la forme selon un facteur spcifi. Slectionne l'objet spcifi. Applique le formatage de la forme spcifie la forme par dfaut.

Duplicate

PickUp ScaleHeight ScaleWidth Select SetShapesDefaultProperties

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

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.

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

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-

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 ;

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

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

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

Mise en pratique

327

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.

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.

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

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.

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.

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.

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 :

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

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.

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.

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 ;

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.

XML en action

339

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.

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>

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

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>

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

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

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

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.

PARTIE 4

Programmation VBA avance

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.

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.

Exemple de UserForm pas pas

351

Faites un clic droit sur le nom du projet, Project (Document1), et choisissez la commande Insertion UserForm :

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

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.

Exemple de UserForm pas pas

353

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 Slectionner des objets Nom du contrle 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. Label Permet d'insrer une chane de texte non modifiable par l'utilisateur, comme la lgende d'une image. Contient du texte insrable ou modifiable par l'utilisateur. 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. 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. Cre une case que l'utilisateur peut facilement slectionner pour activer ou dsactiver un lment ou slectionner plusieurs options parmi des choix multiples. Permet d'afficher plusieurs choix, l'utilisateur ne pouvant en slectionner qu'un seul.

Intitul

Zone de texte Zone de liste modifiable

TextBox ComboBox

Zone de liste

ListBox

Case cocher

CheckBox

Bouton doption

OptionButton

354

Chapitre 17. Crer des formulaires

Tableau 17.1 Contrles standard de la bote outils


Nom de loutil Bouton bascule Cadre Nom du contrle ToggleButton Frame Description Cre un bouton basculant entre deux positions. 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. Cre un bouton que l'utilisateur peut slectionner pour excuter une commande. Permet de dfinir plusieurs pages pour la mme zone d'une fentre ou d'une bote de dialogue de votre application. Prsente en un mme ensemble plusieurs crans d'informations. 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. 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. 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.

Bouton de commande Contrle Onglet

CommandButton

TabStrip

Multipage Dfilement

MultiPage ScrollBar

Toupie

SpinButton

Image

Image

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.

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

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

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 :

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 Formulaire UserForm Contrle ComboBox Contrle CommandButton Contrle Zone de texte Document Word Feuille Excel vnements associs Activation, initialisation, fermeture. Clic, activation, sortie. Clic, double-clic. Modification, entre, sortie. Cration, fermeture, ouverture. 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.

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

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 :

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

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

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"

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.

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

366

Chapitre 17. Crer des formulaires

N mensualit 1 2 3 4

Mensualit 1 436,77 1 436,77 1 436,77 1 436,77

Capital 1 086,77 1 093,11 1 099,49 1 105,9

Intrt 350 343,66 337,28 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

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.

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.

Mise en pratique

369

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"

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

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

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

Mise en pratique

373

' 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

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.

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

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 CopyFile CreateFolder CreateTextFile Description Copie un fichier dun emplacement vers un autre. Cre un dossier Cre un nom de fichier et renvoie un objet TextStream pouvant tre utilis pour lire ou crire dans le fichier.

Objet TextStream

377

Tableau 18.1 Principales mthodes de lobjet FileSystemObject


Mthode DeleteFile FileExists MoveFile OpenTextFile Supprime un fichier Renvoie la valeur True si un fichier spcifi existe, False dans le cas contraire. Dplace un fichier dun emplacement vers un autre. Ouvre un fichier et renvoie un objet TextStream pouvant tre utilis pour lire un fichier ou y effectuer un ajout. Description

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 AtEndOfLine Description 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. 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. Proprit en lecture seule qui renvoie le numro de colonne de la position du caractre en cours dans un objet TextStream. Proprit en lecture seule qui renvoie le numro de ligne en cours dans un objet TextStream.

AtEndOfStream

Column Line

378

Chapitre 18. Grer des fichiers texte

Tableau 18.3 Mthodes de lobjet TextStream


Mthode Close Read ReadAll ReadLine Skip SkipLine Write WriteBlankLines WriteLine Description Ferme un fichier texte TextStream. Lit un nombre spcifi de caractres dans un fichier TextStream et renvoie la chane rsultante. Lit la totalit d'un fichier TextStream et renvoie la chane rsultante. Lit toute une ligne (moins le caractre nouvelle ligne ) d'un fichier TextStream et renvoie la chane rsultante. Omet un nombre spcifi de caractres lors de la lecture d'un fichier TextStream. Omet la ligne suivante lors de la lecture d'un fichier TextStream. crit une chane spcifie dans un fichier TextStream. crit un nombre spcifi de caractres nouvelle ligne dans un fichier TextStream. 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-

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

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.

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,

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

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

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

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

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

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.

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

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

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 :

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

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( _

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.

394

Chapitre 19. Programmer les API

Tableau 19.1 Principales constantes de la fonction GetSystemMetrics


Constante SM_CXSCREEN SM_CYSCREEN SM_CXFULLSCREEN SM_CYFULLSCREEN SM_CYMENU SM_CYCAPTION SM_CXFRAME SM_CYFRAME SM_CXHSCROLL SM_CYHSCROLL SM_CXVSCROLL SM_CYVSCROLL SM_CXSIZE SM_CYSIZE SM_CXCURSOR SM_CYCURSOR SM_CXBORDER SM_CYBORDER SM_CXDOUBLECLICK SM_CYDOUBLECLICK Valeur 0 1 16 17 15 4 32 33 21 3 2 20 30 31 13 14 5 6 36 37 Signification Largeur de lcran Hauteur de lcran Largeur de la zone cliente de lcran Hauteur de la zone cliente de lcran Hauteur de menu Hauteur du titre de la fentre Largeur du cadre de la fentre Hauteur du cadre de la fentre Largeur de la flche dune barre de dfilement horizontal Hauteur de la flche dune barre de dfilement horizontal Largeur de la flche dune barre de dfilement vertical Hauteur de la flche dune barre de dfilement vertical Largeur de la barre de titre Hauteur de la barre de titre Largeur du curseur Hauteur du curseur Largeur de bordure non redimensionnable Hauteur de bordure non redimensionnable Largeur de la zone du double-clic Hauteur de la zone du double-clic

Mise en pratique

395

Tableau 19.1 Principales constantes de la fonction GetSystemMetrics


Constante SM_CXDLGFRAME SM_CYDLGFRAME SM_CXICON SM_CYICON SM_CXICONSPACING SM_CYICONSPACING SM_CXMIN SM_CYMIN SM_CXMINTRACK SM_CYMINTRACK SM_CXHTHUMB SM_CYVTHUMB SM_MOUSEPRESENT SM_SWAPBUTTON Valeur 7 8 11 12 38 39 28 29 34 35 10 9 19 23 Signification Largeur des botes de dialogue Hauteur des botes de dialogue Largeur de licne Hauteur de licne Largeur de lespace entre les icnes du Bureau Hauteur de lespace entre les icnes du Bureau Largeur minimale dune fentre Hauteur minimale dune fentre Largeur minimale de tracking dune fentre Hauteur minimale de tracking dune fentre Largeur de la bote de dfilement dune barre de dfilement horizontal Hauteur de la bote de dfilement dune barre de dfilement horizontal Retourne une valeur diffrente de zro si une souris est prsente 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.

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.

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

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

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.

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-

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.

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 Outils Options 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

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.

Erreurs de programmation

405

Tableau 20.1 Liste des erreurs dexcution


Numro 3 5 6 7 9 10 11 13 14 16 17 18 20 28 35 47 48 49 51 52 53 54 55 57 Return sans GoSub. Appel de procdure incorrect. Dpassement de capacit. Mmoire insuffisante. Indice en dehors de la plage. Ce tableau est fixe ou temporairement verrouill. Division par zro. Type incompatible. Espace de chane insuffisant. Expression trop complexe. Impossible d'excuter l'opration requise. Interruption par l'utilisateur. Reprise sans erreur. Espace pile insuffisant. Sub, Function ou Property non dfinie. Trop de clients d'application pour la DLL. Erreur de chargement de la DLL. Convention d'appel de DLL incorrecte. Erreur interne. Nom ou numro de fichier incorrect. Fichier introuvable. Mode d'accs au fichier incorrect. Fichier dj ouvert. Erreur d'entre/sortie de priphrique. Description

406

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro 58 59 61 62 63 67 68 70 71 74 75 76 91 92 93 94 97 98 298 320 321 322 Ce fichier existe dj. Longueur d'enregistrement incorrecte. Disque plein. L'entre dpasse la fin de fichier. Numro d'enregistrement incorrect. Trop de fichiers. Priphrique non disponible. Permission refuse. Disque non prt. Impossible de renommer avec un lecteur diffrent. Erreur dans le chemin d'accs. Chemin d'accs introuvable. Variable objet ou variable bloc With non dfinie. Boucle For non initialise. Format de chane incorrect. Utilisation incorrecte de Null. Impossible d'appeler une procdure Friend sur un objet qui nest pas une instance de classe de dfintion. 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. Impossible de charger la DLL systme Impossible d'utiliser des noms de priphriques de caractres dans les noms de fichiers spcifis. Format de fichier incorrect. Impossible de crer le fichier temporaire ncessaire. Description

Erreurs de programmation

407

Tableau 20.1 Liste des erreurs dexcution


Numro 325 327 328 335 336 337 338 360 361 363 364 365 368 371 380 381 382 383 385 387 393 394 Description Format incorrect dans le fichier ressource. La valeur de l'objet de donnes nomm est introuvable. Paramtre incorrect. Impossible d'crire des tableaux. Impossible d'accder au registre systme. Le composant n'est pas correctement enregistr. Composant introuvable. Excution incorrecte du composant. Objet dj charg. Impossible de charger ou de dcharger cet objet. Le contrle spcifi est introuvable. L'objet tait dcharg. Impossible de dcharger dans ce contexte. Le fichier spcifi est prim. Ce programme requiert une version plus rcente. L'objet spcifi ne peut tre utilis come propritaire de la feuille pour la mthode Show. Valeur de proprit incorrecte. Index du tableau de proprits incorrect. Property Set ne peut pas tre excute en mode excution. Property Set ne peut tre utilise avec une proprit en lecture seule. Index de table de proprit requis. Property Set non autorise. Property Get ne peut pas tre excute en mode excution. Property Get ne peut pas tre excute sur une proprit en criture seule.

408

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro 400 402 419 422 423 424 425 429 430 432 438 440 442 443 445 446 447 448 449 450 451 452 Description Feuille dj affiche; affichage modal impossible. Le code doit d'abord fermer la feuille modale de premier plan. Autorisation d'utiliser l'objet refuse. Proprit introuvable. Proprit ou mthode introuvable. Objet requis. Utilisation d'objet incorrecte. Un composant ne peut pas crer l'objet ou fournir une rfrence cet objet. Cette classe ne gre pas Automation. Nom de fichier ou de classe non trouv pendant une opration Automation. Cet objet ne gre pas cette proprit ou mthode. Erreur Automation. La connexion la bibliothque de types ou d'objets pour un processus distant a t perdue. L'objet Automation n'a pas de valeur par dfaut. L'objet ne gre pas cette action. L'objet ne gre pas les arguments nomms. L'objet ne gre pas les paramtres rgionaux en cours. Argument nomm introuvable. Argument non facultatif ou affectation de proprit incorrecte. Nombre d'arguments incorrect ou affectation de proprit non valide. Cet objet n'est pas une collection. Numro incorrect.

Erreurs de programmation

409

Tableau 20.1 Liste des erreurs dexcution


Numro 453 454 455 457 458 459 460 461 462 463 480 481 482 483 484 Description Fonction DLL spcifie introuvable. Ressource de code introuvable. Erreur de verrouillage de ressource de code. Cette cl est dj associe un lment de cette collection. Cette variable utilise un type non gr par Visual Basic. Ce composant ne gre pas le jeu d'vnements. Format de Presse-papiers incorrect. Mthode ou membre de donnes introuvable. Le serveur distant n'existe pas ou n'est pas disponible. La classe n'est pas enregistre sur la machine locale. Impossible de crer une image en mode AutoRedraw. Image incorrecte. Erreur d'imprimante. Le gestionnaire d'imprimante ne gre pas la proprit spcifie. Problme pour obtenir des informations du gestionnaire d'imprimante du systme. Assurez-vous que le gestionnaire d'imprimante est install correctement. Type d'image incorrect. Impossible d'imprimer l'image de feuille sur ce type d'imprimante. Impossible de vider le Presse-papiers. Impossible d'ouvrir le Presse-papiers. Impossible d'enregistrer le fichier dans un rpertoire TEMP. Le texte recherch est introuvable. Remplacements trop longs. Mmoire insuffisante.

485 486 520 521 735 744 746 31001

410

Chapitre 20. Dboguer un programme

Tableau 20.1 Liste des erreurs dexcution


Numro 31004 31018 31027 31032 31036 31037 Pas d'objet. Classe non dfinie. Impossible d'activer l'objet. Impossible de crer un objet incorpor. Erreur l'enregistrement dans le fichier. Erreur de chargement partir du fichier. Description

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

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

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.

Dbogueur

413

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

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

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

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 Affichage Barres doutils Dbogage.

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.

Dbogueur

417

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

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-

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

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

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.

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

Gestion des erreurs

423

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.

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

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 Outils Proprits 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

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.

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,

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.

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

Se documenter

431

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/

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.

Se documenter

433

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.

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

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.

Index
A
Abs 151 Access collections 238 formulaire 245 objets 239 pilotage partir de Word 211 projet 257 AccessObject 239 AccessObjectProperties 238 AccessObjectProperty 240 ActionSettings 317 Activate 198, 224, 226, 230, 361 ActivateMicrosoftApp 222 ActiveCell 218 ActiveControl 247 ActiveDocument 177, 192 ActivePresentation 301 ActivePrinter 192, 301 ActiveSheet 218, 223 ActiveWindow 218, 301 ActiveWindow.View 194 ActiveWorkbook 218 ActiveX Data Objects Voir ADO AddCustomList 222 Additem 357 AddNew 264 Address 229 AddressLocal 229 ADO 257 Connection 261 installation 258 objets 259 Recordset 263 ADP 257 affectation symbole 134 aide dcompilation 176 format HXS 176 aide en ligne 48, 114 VBA 174 algorithme 9, 277 rcursif 288 Alias 390 AllDataAccessPages 238 AllDatabaseDiagrams 238 AllForms 238 AllMacros 238 AllModules 238 AllowAdditions 247 AllowDeletions 247

438

Formation VBA

AllowEdits 247 AllQueries 238 AllReports 238 AllStoredProcedures 239 AllTables 239 AllViews 239 amortissement 364 analyse 9 AnimationSettings 317 API appel de fonction 390 programmation 387 Application 176, 218, 240 mthodes 195 Word 192 application multilingue 194 pilotage partir dune autre application 211 Application Programming Interface Voir API Apply 318 ApplyFilter 242 ApplyNames 230 ApplyTemplate 304, 312 argument 127 nomm 133 Array 158 arrondi 370 Asc 145, 204 ASCII 104, 137 AscW 204

AtEndOfLine 377 AtEndOfStream 377, 378, 379 Atn 151 AutoCenter 247 AutoComplete 230 AutoFill 230 AutoFit 230 AutoFitBehavior 181, 184 AutoFormat 231 AutoResize 247 autorit de certification 38 AutoShapeType 317

B
Background 311 base de donnes interrogation avec ADO 274 moteur 259 Beep 242 bibliothque dobjets 186, 320 rfrence 211 bissextile 98 bote outils 351 bote de dialogue 193 boutons 139 modale 140 Bote de rception sous-dossier 289 Boolean 74, 156 boucle 103 sortie 109

Index

439

boucle infinie 108, 113, 119 arrt 109 bouton bascule 353 doption 353 de commande 354 boutons bote de dialogue 139 Build 192, 218, 301 BuiltInDocumentProperties 303, 306 Buttons 139 Byte 74, 156 ByVal 390

Case Else 100 CBool 156 CByte 156 CCur 156 CDate 156 CDbl 156 CDec 156 Cells 218, 225, 229 cellule dsignation 227 saisie 227 Centre de gestion de la confidentialit 39 certificat numrique 38 chane fonctions 145 vide 119 Charts 223 CheckBox 353 Choose 154 Chr 105, 145, 204, 308 CInt 156 classe 187 classeur de macros personnelles 33 Clear 231 ClearContents 231 ClearFormats 231 Click 360, 361 CLng 156 Close 224, 242, 304, 378, 379 CloseButton 247

C
cadre 354 Calculate 222, 226, 231 CalculateFull 222 Calculation 218 CalculationVersion 218 CallByName 159 CancelEvent 242 Caption 218, 301, 357 proprit 352 caractre de continuit de ligne 104 de contrle 137 Carriage Return 137 Cascading Style Sheet Voir CSS Case 99 case cocher 353

440

Formation VBA

codage en dur 63 code coupure des lignes 104 dboguer 401 formulaire 359 gnrateur 308 modification 37 optimisation 210 SQL 275 stockage 300 suppression de lignes 49 code source dfinition 7 CodeData 240 collection 176, 196 Documents 196 indice 207 parcourir 197 ColorScheme 311 ColorSchemes 303 Column 229, 377 ColumnDifferences 231 Columns 218, 225, 229 ColumnWidth 229 COM 321 ComboBox 353 ajouter lment 357 initialisation 361 valeur 362 Command 157, 260, 267 CommandBars 301 CommandButton 354

commande 70 CommandText 267 commentaire 45 ajout 49 compatibilit 380 compilateur 57, 403 ComputeStatistics 202 concatnation 83 condition logique 92 ordre 96 Connection 260, 261 ConnectionString 261, 262 Consolidate 231 constante 63, 130, 137 boutons 139 VB 65 contact exportation dans une BD 296 Control 240 ControlBox 247 contrle 351, 352 contrle ActiveX 353 contrle Onglet 354 Controls 239, 248 conversion 155 ConvertFormula 222 Copy 226, 231, 312, 318 CopyFile 376 CopyObject 242 Cos 151 Count 196, 229

Index

441

Country 195 courrier lectronique 285 envoi 286 CR 137 CreateFolder 376 CreateNames 231 CreateObject 159, 378 CreateTextFile 376, 379 CSng 156 CSS 338 CStr 156 CurDir 153 Currency 75, 156 CurrentData 240 CurrentProject 240, 246 CurrentProjetConnection 266 CurrentRecord 248 curseur 201, 264 dplacement 204 CursorType 264 Cut 231, 312, 318 CVar 156 CVErr 159 Cycle 248

date fonction DateSerial 379 fonctions 149 format par dfaut 79 Date1904 223 DateAdd 149 DateDiff 149 DatePart 149 DateSerial 98, 149 fonction 379 DateValue 149 Day 149 DDB 152 dbogage 309, 401, 410 arrt 310 mode pas pas 418 dbogueur 413 excution 413 fonctionnement 414 Debug.Print 247, 308 Decimal 75, 156 Dclarations section 86 Declare 389

D
DAO 257 Data Source 263 DataEntry 248 DataEntryMode 219 DataSeries 231 Date 75, 76, 149, 156

ddoublonnage 210 DefaultFilePath 219 DefaultSaveFormat 219 DefaultTableBehavior 181 DefaultView 248 DefaultWebOptions 240 dfilement 354

442

Formation VBA

dfinition du type de document Voir DTD Delete 226, 231, 312, 318 DeleteFile 377 DeleteObject 242 Design 311 Dialogs 193, 219, 221 diapositive modle de conception 312 numro 311 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 DocumentProperty 310 Documents 178 Add 198 Close 198 Open 198

Save 198 DoEvents 157 dossier crer 376 Outlook 287 Double 75, 156 Drives 376 DSSSL 338 DTD 332 Duplicate 312, 318

E
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 End Sub 46 End With 194 EndKey 205 enregistrement ajout 264

Index

443

comptage 266 mise jour 265 verrouillage 265 enregistreur de macros 14, 194 limitations 29 EntireColumn 229 EntireRow 229 Enum 193 numration 193, 205, 319 Environ 157 environnement de dveloppement intgr Voir EDI EOF 153, 267 Err 421 erreur dexcution 404 de logique 410 de syntaxe 402 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 exemples 358 gestionnaire 250, 358 ordre 360

Excel Application 217 Range 227 Exit Do 120 Exit For 109 Exit Sub 233 Exp 151 Expand 201 Explorateur dobjets 186 recherche 187 Explorateur de projets 42 Export 304, 312 expression 83 caractre 84 date 84 logique 85 numrique 84 Extend 206 Extensible Style Language Voir XSL

F
False 85, 92 Faux 92 fentre Excution 221, 247, 302, 308 feuille 350 de proprits 352 fichier 193 cration 376 fonctions de gestion 153 supprimer 377

444

Formation VBA

fichier batch 384 fichier Office format propritaire 329 fichier texte conversion 377 gestion 375 objet TextStream 377 Fields 264 FileAttr 153 FileDateTime 153 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 Find 232 FindFile 222 FindNext 232, 242 FindPrevious 232 FindRecord 242 Fix 151 FixedDecimal 219 FixedDecimalPlaces 219

focus 192 Folders 288, 289 FollowMasterBackground 311 fonction aide 128 appel 127 arguments 164 catgories 145 choix du nom 166 conversion 155 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 mathmatiques 151 paramtres facultatifs 166 sans argument 131 syntaxe 127 systme 157 tableau 158 valeur de retour 127, 130, 164 Visual Basic 145

Index

445

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 FormatDateTime 160 FormatNumber 160 FormatPercent 160 Forms 239 Formula 229 formulaire 245, 349 afficher 364 code 359 contrles 352 excuter 357 lgende 352 proprits 352 Frame 354 FreeFile 154 FrozenColumns 248 FullName 303 FV 152 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 GoToControl 242 GoToPage 242, 249 GoToRecord 242 guillemet 275, 308

H
HandoutMaster 303 HasFormula 229 Height 317 Hex 151 Hide 364 HomeKey 206 HorizontalResolution 195 Hour 150 Hourglass 243 HTML avantages 335 DTD SGML 334

446

Formation VBA

inconvnients 335 HTML Help Workshop 176 HXS 176 Hyperlink 240 HyTime 339

Intellisense 177, 182, 190, 319 Interactive 219 interface utilisateur 349 International 219 interprteur 57 Intersect 222

I
Id 317 identificateur 68 If Then Else 92 Iif 154 image 354 IMEStatus 158 impression 161 incrment 107 indentation 98, 114 index affichage des entres 197 suppression des entres 197 indice 207 initialisation 78 Initialize 361 Input 154 InputBox 131, 160, 274 conversion 160 Insert 232 instance 187 InStr 145 InStrRev 145 instruction 47, 70 Int 151 Integer 75, 156

intitul 353 IPmt 152 IRR 152 IsArray 158 IsDate 154 IsEmpty 119, 154 IsError 154 IsMissing 154 IsNull 118, 155 IsNumeric 155 ISO 10744 339 ISO 8879 331 IsObject 155 Items 283 itration 105

J
jeu programmation 276 Join 158

L
Label 353 Language 194 LanguageDesignation 195 LanguageSettings 219

Index

447

langue 194 Layout 311 LBound 159 LCase 145 lecteur de disque 376 Left 145, 317 Left$ 147 lgende formulaire 352 Len 145 LF 137 ligne logique 174 ligne de code continuit 104 Line 317, 377 Line Feed 137 lisibilit 168 ListBox 353 liste programmation 251 ListIndex 362 ListNames 232 littral 78 Loc 154 LockAspectRatio 317 LockType 265 LOF 154 Log 151 Long 75, 156 LTrim 146 MacID 158 Macintosh 380 macro 13 arrt 109

arrt enregistrement 17 assignation un raccourci clavier 21 association une icne 23 choix du nom 27 enregistrement 15, 26 enregistrement avec Excel 32 enregistreur 14 excution 17 gnration de code 308 lieu de stockage 18 modification du code 37 opportunit 14 scurit 40 visualiser le code 38 macro-commande 5 MacScript 158 MailItem 285 MAPI 284 MAPIFolder 287 Master 311 Maximize 243 MDAC 258 membre objet 187 Merge 304

448

Formation VBA

message analyse 293 envoi partir dune BD 292 exportation dans une BD 294 mthode 47, 172 Mid 128, 146 Mid$ 147 Minimize 243 Minute 150 MIRR 152 mise jour 265 Modal 248 modal 139, 140 modle 20, 198 dobjet 47 de conception diapositive 312 modularit 168 Module 240 module 44 de classe 126 insertion 125 Modules 239 modulo 233 Month 150 MonthName 150 mot cl 68 rserv 69 moulinette 375 Move 226 MoveFile 377 MoveFirst 267

MoveLeft 206 MoveNext 267 MoveRight 204 MoveSize 243 MoveTo 312 MsgBox 132, 160 Buttons 139 dbogage 411 gnrateur 144 Prompt 135 MSO.DLL 323 MsoAnimEffect 320 MsoAutoShapeType 323 MsoLanguageID 194 MSPPT.OLB 321 multilingue 194 multipage 354

N
Name 225, 317 diapositive 311 prsentation 303 Names 219, 223, 225 namespace 284 NavigationButtons 248 NetworkTemplatesPath 220 NewMacros 44 NewRecord 248 Next 226 Normal.dot 19 Normal.dotm 19

Index

449

norme SGML 331 notation hongroise 428 NotesMaster 303 Now 98, 150 Nper 152 NPV 152 Null 117

pack de compatibilit 329 scurit 39 Office Open XML 343 Offset 230 OLB 320 OLE 321 Oleview 321 On Error Resume Next 422 onglet 354 onglet Dveloppeur Office 2007 16 OpenDataAccessPage 243 OpenForm 243 OpenQuery 243 OpenReport 243 OpenTable 243 OpenTextFile 377, 379 OpenView 243 oprateur 65 priorit 66 logique 96 OperatingSystem 195, 220, 301 optimisation 210 Optional 166 OptionButton 353 Options 194 proprit 195 OrderBy 248 OrderByOn 249 Outlook 283 dossier 287 scurit 289

O
Object 75 objet 171 Application 176 arborescence 176 bibliothque 186 classe 187 collection 176 dfinition 172 explorateur 186 fonction 185 hirarchie 174 instance 187 membres 187 mthodes 177 proprits 177 Oct 151 Office bibliothque dobjets 323 modle dobjets 376 Office 2007 format des fichiers 343 onglet Dveloppeur 16

450

Formation VBA

sous-dossier 289 OutputTo 244

PrecisionAsDisplayed 224 Presentation objet 303 prsentation PowerPoint 303 Presentations 301 collection 303 Preserve 90 Prt 364 Previous 226 PRINT#. 380 PrintOptions 303 PrintOut 224, 227, 232, 304 PrintPreview 224, 227, 232 Private 360 procdure 126 appel 127 vnementielle 360 production 10 programmation dfinition 3 erreur 401 vnementielle 250 inter-applications 211, 325 jeu 276 langages 6 niveaux 5 phases de conception 8 VBA 173 programmation oriente objets 171

P
Page 240 Pages 239 PageSetup 226, 303 paramtre 127 facultatif 129, 131 passage par rfrence 390 passage par valeur 390 valeur par dfaut 167 Parse 232 Partition 151 Pas pas sortant 420 Paste 226 PasteSpecial 227, 232 Path 303 PickUp 318 PictureFormat 317 Pmt 152, 365 point dinsertion 201 dplacement 29, 204 pointeur dinsertion 183 POO 171 PopUp 249 porte 85, 426 PowerPoint Application 301 pilotage partir de Word 325 stockage du code 300 PPmt 152, 365

Index

451

programme arrt 109 dbogage 309 dboguer 401 diteur 41 modification 47 suppression de lignes 49 projet 43, 125 Prompt 135 Properties 239, 249 proprit 172, 352 globale 192 Visible 252 Protect 227 ProtectContents 226 ProtectionMode 226 Provider 263 Public 87 publipostage 292 Publisher 189 PV 153

Rate 153 Read 378 ReadAll 378 ReadLine 378, 379 ReadOnly 224 Recalc 249 RecentFiles 220 recherche-remplacement 395 RecordCount 266 Recordset 260, 263 Fields 264 rcursivit 288 Redim 90 Reference 240 rfrence 258 ajout 212 References 239 ReferenceStyle 220 Refresh 249 RefreshAll 224 Repaint 249 Replace 146, 232 Report 240 Reports 239 Requery 244, 249 requte SQL 267, 275 Resize 230 Restore 244 RGB 158 Right 146 Rnd 151

Q
QBColor 158 Qualificateur dobjet 218 Quit 195, 223, 244

R
raccourci clavier 21 Range 182, 199, 226, 227 document entier 200 extension 201

452

Formation VBA

Round 151 Row 230 RowDifferences 232 RowHeight 230, 249 Rows 220, 226, 230 RTrim 146 RunCommand 244

SetMenuItem 244 SetShapesDefaultProperties 318 SetWarnings 244 SGML 330 document 332 norme 331 objectif 333 Sgn 151 Shape objet 315 Shapes collection 311, 315 Sheets 220, 224 Shell 158 Show 364 ShowAllRecords 244 ShowStartupDialog 301 ShowToolbar 245 ShowToolTips 220 Sin 151 Single 75, 156 Skip 378 SkipLine 378 Slide objet 310 SlideID 311 SlideIndex 311 SlideMaster 304 SlideNumber 311 SlideRange collection 310 Slides 304

S
Save 224, 244, 304 SaveAs 224, 227, 305 SaveCopyAs 225, 305 Saved 224, 303 SaveLinkValues 224 ScaleHeight 318 ScaleWidth 318 scope Voir porte Screen 240 Scripting.FileSystemObject 378 ScrollBar 354 Second 150 scurit 38, 289 Seek 154 Select 227, 232, 312, 318 Select Case 99 plage de valeurs 100 Selection 203, 220 slection 203, 206 SelectObject 244 SendKeys 223 Set 378 SetFocus 249

Index

453

collection 310 SlideShowSettings 304 SlideShowTransition 311 SlideShowWindow 304 SlideShowWindows 301 SLN 153 source des donnes 263 Voir code source Space 146 Spc 161 SpecialCells 232 SpinButton 354 Split 159 SQL code 275 requte 267 SQL Server 257, 259 Sqr 151 standardisation documents Office 343 Step 107 Str 146 StrComp 146 StrConv 146 stream 260 String 75, 79, 146, 156 StrReverse 146 Styles 224 Sub 44 Switch 155 SYD 153

SYLK 386 symbole daffectation 134 syntaxe 7, 115 System 195

T
Tab 161 Table 233, 317 tableau 88 dclaration 89 dplacement 29 dynamique 90 lments 89 insertion 181 slection 29 Tables 179 TabStrip 354 Tan 151 TemplateName 304 TemplatesPath 220 Terminate 361 test 10 conditionnel 91 de performance 147 plage de valeurs 95 tests conditionnel imbrication 97 TextBox 353 TextFrame 317 TextStream 377 TextToColumns 233 ThisDocument 44

454

Formation VBA

ThisOutlookSession 293 ThisWorkbook 220 Time 150 TimeLine 311 Timer 148, 150 TimeSerial 150 TimeValue 150 title 143 Top 318 toupie 354 TransferDatabase 245 TransferSpreadsheet 245 TransferText 245 tri dichotomique 209 Trim 146 True 85, 92 twip 161 Type 318 type erreur 155 type de donnes 73, 158 caractre 79 conversion 155 date 76 numrique 80 objet 375 Variant 82 TypeName 158

Undo 250 Unicode 204 Unprotect 225, 227 Until 116 diffrence avec While 121 Update 265 UserForm 245, 349 UserName 220

V
Val 151 Validation 230 Value 230, 362 Value2 230 variable 58 affectation 60 caractre 79 conversion 155 date 76 dclaration 60, 86 dclaration explicite 61 dclaration implicite 60 nom 59 numrique 80 objet 375 type de donnes 73 Variant 82 visibilit 85 Variant 75, 82, 147, 156 Null 117 VarType 158

U
UBound 159 UCase 146

Index

455

VBA 55 aide en ligne 174 histoire 55 programmation 173 syntaxe 57 VbaProject.OTM 293 Vcard 381 verrouillage 265 Version 192, 220, 301 VerticalResolution 195 virus 38 visibilit 85 Visible 220, 226, 249, 318 Visual Basic aide en ligne 48 objet 376 Visual Basic Editor 41 Vrai 92

Width 318 Win32 387 WIN32API.TXT 389 Windows 220, 301 prsentation 304 WindowState 301 With 194 Word Application 192 Document 196 pilotage dAccess 211 pilotage de PowerPoint 325 point dinsertion 201 Range 199 Selection 203 slection 206 statistiques 202 Workbook 223 Workbooks 220 Worksheet 225, 230 Worksheets 220, 224 Write 378 WriteBlankLines 378 WriteLine 378, 380 WriteReserved 224

W
Wait 223 wdStory 206 WebOptions 240 WebPagePreview 305 Weekday 150 WeekdayName 150 Wend 112 While 112 diffrence avec Until 121 imbrication 113 sortie 114 While Wend 111

X
xlBuiltInDialog 221 XLink 339 XML 329, 337 exemple 339

456

Formation VBA

format des documents Office 343 objectifs 337 XML Linking Language Voir XLink XSL 338

Y-Z
Year 98, 150 zone de liste 353 zone de liste modifiable 353 zone de texte 353

050872 - (I) - (5) - OSB 80 - ARC - NGT Imprimerie CHIRAT - 42540 Saint-Just-la-Pendue Dpt lgal : Fvrier 2007 N 3952

Imprim en France

Dominique Maniez

FORMATION

VBA
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.

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.

Tlchargez tous les exemples de code sur www.dunod.com

6637326
ISBN 978-2-10-050872-3

www.dunod.com

You might also like