Professional Documents
Culture Documents
MANIEZ
Formation
Dominique Maniez
VBA
6637326
ISBN 978-2-10-050872-3
www.dunod.com
DOMINIQUE MANIEZ
a crit et traduit une
cinquantaine douvrages
dont la plupart traitent
des technologies
Microsoft.
Dveloppeur, journaliste
et universitaire,
il prne une conception
de linformatique proche
de lutilisateur, bannit
le jargon technique et
milite pour que la chose
informatique ne soit pas
la proprit exclusive
des informaticiens.
VBA
Formation
FORMATION
Dominique Maniez
VBA
Visual Basic pour Applications
pour Word, Excel,
PowerPoint, Access et Outlook
FORMATION
VBA
07
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
XIII
Partie 1
Apprendre programmer
Chapitre 1 Quest-ce que programmer ? . . . . . . . .
La syntaxe . . . . . . . . . . . . . . . . . . . . . . .
programme
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
9
10
10
10
13
Lenregistreur de macros . . . . . . . . . . . . . . . .
Quand devez-vous enregistrer une macro ? . . . .
Enregistrement de votre premire macro . . . . . .
14
14
15
17
18
21
23
26
VI
Formation VBA
27
29
32
37
38
47
. . . . . . . . . . . . .
Partie 2
Le langage VBA
Chapitre 4 Syntaxe de VBA
. . . . . . . . . . . . .
55
Historique de VBA . . . . . . . . . . . . . . . . . . .
55
56
Syntaxe de VBA . . . . . . . . . . . . . . . . . . . .
57
Variables . . . . . . . . . . . . . . . . . . . . . . . .
58
Constantes . . . . . . . . . . . . . . . . . . . . . . .
63
Oprateurs . . . . . . . . . . . . . . . . . . . . . . .
65
Mots cls . . . . . . . . . . . . . . . . . . . . . . . .
Instructions . . . . . . . . . . . . . . . . . . . .
68
70
73
Types de donnes . . . . . . . .
Les dates . . . . . . . . .
Les caractres . . . . . . .
Les nombres . . . . . . . .
Le type de donnes Variant
Les erreurs de type . . . . .
Les expressions . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
73
76
79
80
82
82
83
85
Tableaux . . . . . . . . . . . . . . . . . . . . . . . .
88
VII
. . . . . .
. . . . . .
. . . . . .
. . . . .
91
92
94
96
97
Select Case . . . . . . . . . . . . . . . . . . . . . . .
99
Chapitre 7 Boucles . . . . . . . . . . . . . . . . . .
103
For Next . . . . . . . . . . . . . . . . . . . . . . . .
Sortir de la boucle . . . . . . . . . . . . . . . . .
103
109
While Wend . . . . . . . . . . . . . . . . . . . . . .
111
Do Loop . . . . . . .
Expression logique
Null . . . . . . .
Empty . . . . . .
.
.
.
.
114
116
117
118
119
121
125
Procdures et fonctions
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
91
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
126
.
.
.
.
.
127
132
145
161
166
Chapitre 9 Objets . . . . . . . . . . . . . . . . . . .
171
172
Partie 3
Modles dobjets
VIII
Formation VBA
173
Un objet en situation . . . . . . . . . . . . . . . . .
174
185
Lexplorateur dobjets
. . . . . . . . . . . . . . . . .
186
188
191
Objet Application . . . . . . . . . . . . . . . . . . .
192
Objet Document . . . . . . . . . . . . . . . . . . . .
196
Objet Range . . . . . . . . . . . . . . . . . . . . . .
199
Objet Selection . . . . . . . . . . . . . . . . . . . . .
203
Mise en pratique . . . . . . . . . . . . . . . . . . . .
207
211
217
Objet Application . . . . . . . . . . . . . . . . . . .
217
Objet Workbook . . . . . . . . . . . . . . . . . . . .
223
Objet Worksheet . . . . . . . . . . . . . . . . . . . .
225
Objet Range . . . . . . . . . . . . . . . . . . . . . .
227
Mise en pratique . . . . . . . . . . . . . . . . . . . .
233
237
Collections dAccess . . . . . . . . . . . . . . . . . .
238
Objets dAccess . . . . . . . . . . . . . . . . . . . . .
239
Objet DoCmd . . . . . . . . . . . . . . . . . . . . .
241
Objet Form . . . . . . . . . . . . . . . . . . . . . . .
245
Mise en pratique . . . . . . . . . . . . . . . . . . . .
Apparition et remplissage dune liste
par programmation . . . . . . . . . . . . . . . .
Remplir un champ automatiquement . . . . . . . .
250
251
255
IX
Chapitre 13 ADO
. . . . . . . . . . . . . . . . . .
257
Installation dADO . . . . . . . . . . . . . . . . . . .
258
Objets dADO . . . . . . . . . . . . . . . . . . . . .
259
Objet Connection . . . . . . . . . . . . . . . . . . .
261
Objet Recordset . . . . . . . . . . . . . . . . . . . .
263
Mise en pratique . . . . . . . . . . . . . .
Exemples Access . . . . . . . . . . . .
Exemple Word . . . . . . . . . . . . .
Exemple Excel . . . . . . . . . . . . .
Exemples dutilisation dun fichier MDB
sans Access . . . . . . . . . . . . . .
.
.
.
.
265
265
269
272
. . . . . .
274
. . . . . . . . . .
283
Modle dobjets . . . . . . . . . . . . . . . . . . . . .
283
Objet MailItem . . . . . . . . . . . . . . . . . . . . .
285
Objet MAPIFolder . . . . . . . . . . . . . . . . . . .
Accs un sous-dossier partir
de la Bote de rception . . . . . . . . . . . . . .
287
289
Mise en pratique . . . . . . . . . . . . . .
Envoyer un message partir dune BD
Analyser tous les messages entrants . .
Exporter les messages dans une BD . .
Exporter les contacts dans une BD . .
.
.
.
.
.
291
292
293
294
296
299
Objet Application . . . . . . . . . . . . . . . . . . .
301
Collection Presentations . . . . . . . . . . . . . . . .
303
Collection Slides . . . . . . . . . . . . . . . . . . . .
310
Collection Shapes . . . . . . . . . . . . . . . . . . .
315
Numros et numrations . . . . . . . . . . . . . . .
319
Mise en pratique . . . . . . . . . . . . . . . . . . . .
324
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Formation VBA
Chapitre 16 XML . . . . . . . . . . . . . . . . . . .
329
Introduction . . . . . . . . . . . . . . . . . . . . . .
329
.
.
.
.
.
.
.
330
331
332
333
334
337
337
XML en action . . . . . . . . . . . . . . . . . . . . .
339
343
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Partie 4
Programmation VBA avance
Chapitre 17 Crer des formulaires . . . . . . . . . .
349
350
Mise en pratique . . . . . . . . . . . . . . . . . . . .
Cration du UserForm . . . . . . . . . . . . . .
364
368
. . . . . . . . .
375
Objet FileSystemObject . . . . . . . . . . . . . . . .
376
Objet TextStream . . . . . . . . . . . . . . . . . . .
377
Mise en pratique . . . . . . . . . . . . . . . . . . . .
Conversion de fichiers au format Vcard . . . . . .
Crateur de fichiers batch . . . . . . . . . . . . .
381
381
384
387
Concept dAPI . . . . . . . . . . . . . . . . . . . . .
388
Declare . . . . . . . . . . . . . . . . . . . . . . . . .
389
390
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
Erreurs de programmation
Erreurs de syntaxe . .
Erreurs dexcution .
Erreurs de logique . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
401
402
404
410
Dbogage . . . . . . . . . . . . . . . . . . . . . . . .
410
Dbogueur . . . . . . . . . . . . . . . . . . .
Lancement du dbogueur . . . . . . . . .
Fonctionnement du dbogueur . . . . . . .
Visualisation des variables dans le dbogueur
.
.
.
.
413
413
414
420
421
425
425
. . . . . . . . . . . . .
427
Se documenter . . . . . . . . . . . . . . . . . . . . .
430
Index . . . . . . . . . . . . . . . . . . . . . . . . . .
437
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
Avant-propos
XV
XVI
Formation VBA
XVII
Avant-propos
XVIII
Formation VBA
Avant-propos
XIX
XX
Formation VBA
Numro de version
Office 2000
Office XP
10
Office 2003
11
Office 2007
12
Office 2007 introduit quelques diffrences notables entre les prcdentes versions dOffice du point de vue de la programmation. Ces
diffrences sont signales dans cet ouvrage par des encadrs labelliss
Nouveaut Office 2007.
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.
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
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
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.
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
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.
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
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.
15
Lenregistreur de macros
16
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.
17
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.
Notre macro est pour linstant modeste, mais nous allons lamliorer au fil de ces pages.
18
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.
19
20
21
22
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.
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
23
24
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 :
25
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
27
28
29
CTRL+GAUCHE
CTRL+DROITE
30
CTRL+HAUT
CTRL+BAS
En haut de la fentre
ALT+CTRL+PG.PRC
En bas de la fentre
ALT+CTRL+PG.SUIV
CTRL+PG.SUIV
CTRL+PG.PRC
CTRL+FIN
CTRL+ORIGINE
MAJ+F5
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
Au dbut du document
CTRL+MAJ+ORIGINE
31
CTRL+MAJ+FIN
ALT+CTRL+MAJ+PG.SUIV
CTRL+A
F8+touches de direction ;
appuyez sur ECHAP pour annuler
le mode de slection
TABULATION
MAJ+TABULATION
ALT+ORIGINE
ALT+FIN
ALT+PG.PRC
ALT+PG.SUIV
la ligne prcdente
HAUT
la ligne suivante
BAS
TABULATION
MAJ+TABULATION
32
33
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.
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
contenu de ce fichier, il suffit de choisir la commande FentreAfficher... et de faire un double-clic sur Perso.
Il peut tre utile de visualiser ce fichier si vous souhaitez y stocker autre
chose que des macros personnelles, par exemple des donnes. Pour
supprimer laffichage de ce classeur, choisissez la commande FentreMasquer.
Si vous enregistrez des macros dans le classeur de macros personnelles, noubliez pas de sauvegarder ce fichier quand vous quittez Excel.
La bote de dialogue illustre la figure 2.22 vous le rappellera.
35
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 :
36
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
38
39
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
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
41
42
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.
44
45
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
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.
48
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.
49
50
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
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
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
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.
Syntaxe de VBA
57
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
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
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
au lieu de :
Dim Euro
Euro = 6.55957
61
Variables
62
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
Taux de TVA
Bornes infrieure et suprieure dune plage de valeurs
Constantes mathmatiques (Pi, par exemple)
Dates de dbut et de clture dexercice fiscal
64
Visual Basic lui-mme comprend un trs grand nombre de constantes et la plupart des fonctions qui acceptent des paramtres numriques possdent galement des constantes quil vaut mieux utiliser
pour des raisons videntes de lisibilit. Les constantes peuvent remplacer les valeurs relles partout dans votre code.
Par exemple, la fonction Weekday qui renvoie le jour de la semaine
dune date communique cette information sous la forme dun numro
de 1 7. Visual Basic dfinit automatiquement des constantes pour
chacun des jours de la semaine et pour peu que lon connaisse les
noms des jours de la semaine en anglais, vous avouerez que vbThursday est un nom un peu plus parlant que 5. Le tableau suivant illustre
les constantes des jours de la semaine dfinies par Visual Basic.
Tableau 4.1 Constantes des jours de la semaine
Constante
Valeur
Description
vbSunday
Dimanche
vbMonday
Lundi
vbTuesday
Mardi
vbWednesday
Mercredi
vbThursday
Jeudi
vbFriday
Vendredi
vbSaturday
Samedi
65
Oprateurs
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
&
<
<=
66
Signification
>
>=
<>
And
Like
Mod
Not
Or
Xor
Comparaison
Logique
galit (=)
Not
Ngation ()
Ingalit (<>)
And
67
Oprateurs
Comparaison
Logique
Infriorit (<)
Or
Supriorit (>)
Xor
Like
68
MOTS CLS
Les mots cls sont les mots ou les symboles qui sont dfinis dans le
langage Visual Basic. Il sagit en quelque sorte du vocabulaire de
base de VBA. Parmi les catgories de mots cls, on peut citer les instructions, les fonctions ou les oprateurs. Quand vous choisissez le
nom dune variable (on appelle cela un identificateur, cest--dire
un nom qui identifie), il est prfrable que ce nom ne soit pas celui
dun mot cl. Mme si cela nest pas interdit, il vaut mieux, pour des
raisons de lisibilit, ne pas appeler une variable par le nom dune
fonction. Ainsi, linstruction suivante est syntaxiquement valide,
mais peu recommande (SQR est le nom dune fonction qui calcule
la racine carre) :
Dim Sqr As Double
Cest pour cette raison quil est prfrable de connatre la liste des
mots cls du langage, mme si on en ignore la signification exacte.
Vous trouverez ci-dessous la liste de mots cls particuliers de Visual
Basic ; ces mots cls sont classs part dans la documentation de
Visual Basic car soit ils appartiennent plusieurs catgories et peuvent tre employs dans plusieurs contextes (cest le cas, par exemple,
de Date qui peut tre un type de donnes, une fonction ou une instruction) soit ils reprsentent une valeur particulire (cest le cas de
True, False, Null et Empty).
Tableau 4.4 Mots cls particuliers de Visual Basic
As
Len
Private
Binary
Let
Property
ByRef
Lock
Public
ByVal
Me
Resume
Date
Mid
Seek
Else
New
Set
Empty
Next
Static
69
Mots cls
Nothing
Step
False
Null
String
For
On
Then
Friend
Option
Time
Get
Optional
To
Input
ParamArray
True
Is
WithEvents
Exit
Option
Any
False
PsetOr
As
For
Private
Boolean
Function
Public
Byte
Get
ReDim
ByVal
Global
Rem
Call
GoSub
Resume
Case
GoTo
Return
Close
If
RSet
Const
Imp
Set
Currency
Integer
Single
Date
Let
Static
70
Like
Stop
Double
Local
String
Debug
Long
Sub
Declare
Loop
To
Dim
Lset
True
Do
Me
Type
Each
New
Typeof
Else
Next
Until
Elseif
Not
Variant
End
Nothing
Wend
Endif
Null
While
Erase
On
With
Eqv
Open
Xor
Instructions
Visual Basic compte un peu moins de 80 instructions (ou commandes). Nous avons dj tudi la commande Dim qui permet de dclarer une variable. Nous examinerons au fil de cet ouvrage les
commandes les plus importantes et vous vous apercevrez bien vite
quelles nexcdent pas la vingtaine. Il faut pourtant connatre le
nom de toutes les commandes, ne serait-ce que pour viter de les
employer comme nom de variable. Le tableau 4.6 inventorie toutes
les commandes de Visual Basic.
Tableau 4.6 Commandes de VBA
AppActivate
If...Then...Else
Public
Beep
Implements
Put
71
Mots cls
Input #
RaiseEvent
ChDir
Kill
Randomize
ChDrive
Let
ReDim
Close
Line Input #
Rem
Const
Load
Reset
Date
Lock
Resume
Declare
LSet
RmDir
Deftype
Mid
RSet
DeleteSetting
MidB
SaveSetting
Dim
MkDir
Seek
Do...Loop
Name
Select Case
End
On Error
SendKeys
Enum
On...GoSub
Set
Erase
On...GoTo
SetAttr
Error
Open
Static
Event
Option Base
Stop
Exit
Option Compare
Sub
FileCopy
Option Explicit
Time
For Each...Next
Option Private
Type
For...Next
Print #
Unload
Function
Private
While...Wend
Get
Property Get
Width #
GoSub...Return
Property Let
With
GoTo
Property Set
Write #
72
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
74
Le message est assez clair et il signifie que lon ne doit pas additionner un prnom et un ge ; le programme ne sait pas ajouter le nombre
20 au prnom Dominique et cela na aucun sens pour lui. Ce message
derreur attire notre attention sur la notion de type de donnes. Nous
avons dit prcdemment quun programme manipulait des informations, mais il faut reconnatre que la notion dinformation est trs
vague. Pourtant, chacun fait spontanment des diffrences entre certains types dinformations. Ainsi, la distinction entre donnes textuelles et donnes numriques est communment admise car les types
de traitement auxquels on peut soumettre ces donnes ne sont pas
identiques. On peut diviser deux nombres et mettre un texte en
majuscules, mais pas linverse. Afin de faciliter le traitement des donnes, les langages de programmation instituent des catgories dinformation que lon appelle types de donnes. Un type de donnes
subdivise donc linformation en diffrentes catgories et il convient,
chaque fois que lon souhaite dclarer lexistence dune variable, de
prciser galement son type de donnes. Le nombre de types de donnes pris en charge varie dun langage de programmation lautre.
Le tableau 5.1 indique les types de donnes grs par Visual Basic
ainsi que la plage dinformations gre par chaque type :
Tableau 5.1 Types de donnes en Visual Basic
Type de donnes
Plage
Boolean
True et False
Byte
75
Types de donnes
Plage
Currency
Date
Decimal
Double
Integer
Long
Object
Single
String
Variant
76
Parmi les types de donnes que nous venons de lister, certains types
sont trs souvent employs et nous allons nous y attarder. En fait, si
lon examine ces types de donnes, on saperoit quil existe un type
pour grer les dates, un type pour grer les caractres, huit types pour
grer les nombres et un type fourre-tout. Nous laissons de ct, pour
linstant, le type Object, sur lequel nous reviendrons longuement.
Comment excuter les programmes ?
Au fur et mesure de lapprentissage de VBA, vous allez tre amen
excuter les programmes que vous aurez crits. Nous avons dj vu
comment associer un raccourci clavier ou une icne une macro
(chapitre 2). Vous pouvez aussi, quand vous travaillez avec Word, Excel
ou PowerPoint, utiliser la commande OutilsMacroMacros pour faire
afficher la liste des macros disponibles ; dans cette bote de dialogue,
slectionnez la macro dont vous voulez lancer lexcution et cliquez sur
le bouton Excuter.
Bien souvent, vous voudrez galement tester un petit programme de
quelques lignes pour voir son comportement (vous voulez, par exemple, recopier un exemple de cet ouvrage et tudier la manire dont il
fonctionne). Il suffit alors de vous placer dans lditeur Visual Basic et
dafficher la fentre de code. Saisissez ensuite votre programme en
noubliant pas de le dlimiter par les mots cls Sub et End Sub. Pour
excuter votre programme, il suffit de placer le curseur lintrieur du
code et dappuyer sur la touche de fonction F5.
Les dates
Les dates sont gres en Visual Basic comme dans Excel, cest--dire
quelles sont stockes en mmoire sous la forme de nombres. Pour
77
Types de donnes
Vous verrez que la bote de dialogue affiche la date systme augmente de 90 jours.
78
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
Types de donnes
79
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
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,
81
Types de donnes
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
82
type Byte dfinit une plage de valeurs de 0 255 ; 256 tant en dehors
de cette plage, il se produit une erreur.
Types de donnes
83
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
7
159.45
123 + 45
Sqr (25)
Int((99 * Rnd) + 1)
"Dominique"
"Dominique" & " " & "MANIEZ"
Mid("1721171094076", 4, 2)
"00" + Right(Str(Val(Chr(Asc("7")))), 1)
85
Date
Date + 30
DateSerial(2002, 1, 1)
CDate("15/05/1987") + 10
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).
86
prenom = "Dominique"
End Sub
Sub Macro2()
Dim nom
nom = "Maniez"
MsgBox (prenom + " " + nom)
End Sub
87
llment (Dclaration). Dans la fentre de code, saisissez linstruction Dim suivie du nom de la variable (figure 5.4).
88
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"
Tableaux
89
90
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
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.
92
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
93
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
2
3
4
5
6
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
Rsultat
< 10
chec
>= 10 et < 12
Mention passable
>= 12 et < 14
>= 14 et < 16
Mention bien
>= 16
96
97
98
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
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
Select Case
99
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
100
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
104
Chapitre 7. Boucles
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
For Next
105
106
Chapitre 7. Boucles
For Next
107
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
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
109
For Next
Selection.TypeText Text:=francs
Selection.MoveRight Unit:=wdCell
Selection.TypeText Text:=francs / 6.55957
Selection.MoveRight Unit:=wdCell
francs = francs - 1
Next francs
End Sub
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
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
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 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
While Wend
113
While x
Beep
Wend
End Sub
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
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
115
Do Loop
que bien souvent laide en ligne naide pas beaucoup. En effet, la terminologie qui y est employe est souvent absconse et le principal
reproche que lui font les dbutants est quils ny comprennent pas
grand-chose. Nous allons donc tenter, dans les pages qui suivent, de
dbroussailler cette phrasologie car vous allez forcment, un
moment ou un autre, tre dans lobligation dappuyer sur la
touche F1 qui invoque le systme daide. Vous devez ce sujet savoir
que laide en ligne est contextuelle ce qui signifie que quand vous tes
en train de taper un programme dans lditeur, il suffit que vous slectionniez le mot cl Loop et que vous appuyiez sur la touche F1 pour
voir apparatre les informations suivantes :
Do...Loop, instruction : rpte un bloc dinstructions aussi longtemps quune condition est vraie (True) ou jusqu ce quune condition devienne vraie (True).
Syntaxe
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
Description
condition
statements
116
Chapitre 7. Boucles
Do [Until condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop
Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [While condition]
Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [Until condition]
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-
117
Do Loop
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
118
Chapitre 7. Boucles
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
Empty
Mais sil est important de savoir si une variable contient des donnes valides, il est aussi frquent de vouloir dterminer si une varia-
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
120
Chapitre 7. Boucles
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.
Do [Until condition]
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop
Sub until1()
i=1
Do Until i > 3
MsgBox (i)
i=i+1
Loop
End Sub
122
Chapitre 7. Boucles
tre fausse, linverse tant vrai pour sortir de la boucle. Il existe des cas
o une boucle Do While paratra plus naturelle quune boucle Do Until,
mais il faut bien se rendre compte quon peut transformer nimporte
quelle boucle Do While en boucle Do Until (et vice versa) en jouant
sur la formulation de la condition.
Lautre variante de ces boucles propose que la condition soit value la fin de la boucle, ce qui donne :
Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [While condition]
Do
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Loop [Until condition]
Faire
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Boucler tant que la condition est
vraie
Faire
[bloc dinstructions]
[Exit Do]
[bloc dinstructions]
Boucler jusqu ce que la condition soit
vraie
Sub until2()
i=1
Do
MsgBox (i)
i=i+1
Loop Until i < 3
End Sub
123
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
126
PROCDURES ET FONCTIONS
Si vous avez bien suivi, vous savez quun programmeur crit son
code dans un module qui est stock lintrieur dun projet. Dans un
module, le code scrit dans une procdure. Il existe deux sortes de
procdures : les procdures Sub et les procdures Function. Les procdures Sub, parfois appeles sous-routines, commencent par le mot cl
Sub et se terminent par End Sub. Les macros que nous avons dj
cres grce lenregistreur taient toutes des procdures Sub.
Les fonctions commencent par le mot cl Function et se terminent
par End Function. Par souci de simplification, bon nombre dauteurs
parlent de procdure pour dsigner une procdure Sub et de fonction
pour dsigner une procdure Function. Nous adopterons galement
cette dnomination dans la suite de cet ouvrage.
La grande diffrence entre les procdures et les fonctions est que les
procdures ne renvoient pas de rsultat. En gnral, les procdures
nont pas de paramtres et si vous souhaitez crer une procdure qui
possde des arguments, nous vous conseillons de la transformer en
fonction.
Les procdures peuvent tre excutes partir du menu
OutilsMacrosMacro, dune icne, dun raccourci clavier, dun
127
128
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
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.
130
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")
Il serait dailleurs beaucoup plus logique et lisible dcrire cette instruction comme ceci :
MsgBox (Date())
132
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])
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)).
133
lment
Description
buttons
title
helpfile
context
134
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)
136
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)
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.")
137
quivalent
Description
VbCrLf
Chr(13) + Chr(10)
VbCr
Chr(13)
VbLf
Chr(10)
VbNewLine
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
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)
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
Valeur
Description
VbOKOnly
vbOKCancel
vbAbortRetryIgnore
vbYesNoCancel
VbYesNo
vbRetryCancel
vbCritical
16
vbQuestion
32
vbExclamation
48
vbInformation
64
vbDefaultButton1
vbDefaultButton2
256
vbDefaultButton3
512
vbDefaultButton4
768
vbApplicationModal
vbMsgBoxHelpButton
16384
140
141
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 :
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
Valeur
Description
VbOK
OK
vbCancel
Annuler
vbAbort
Abandonner
vbRetry
Ressayer
vbIgnore
Ignorer
VbYes
Oui
VbNo
Non
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
144
145
Chr
InStr
InStrRev
LCase
Left
Len
146
LTrim
Mid
Replace
Right
RTrim
Space
Str
StrComp
StrConv
String
StrReverse
Trim
UCase
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
Variant
String
Diffrence en %
x = Mid(chaine, 26, 7)
1.54
1.14
35 %
x = Left(chaine, 20)
1.30
.92
41 %
x = Right(chaine, 20)
1.30
.92
41 %
149
Fonction
Variant
String
Diffrence en %
x = LTrim(chaine)
1.30
.99
31 %
x = RTrim(chaine)
1.26
.98
29 %
x = Trim(chaine)
1.38
1.10
25 %
x = LCase(chaine)
12.14
11.87
2%
x = UCase(chaine)
11.32
10.93
4%
Mme sil faut prendre ces mesures avec des pincettes, elles sont
suffisamment significatives sur certaines fonctions pour que cela
puisse avoir un impact dans des programmes qui font un usage intensif
du traitement des chanes de caractres. Ces deux petits programmes
ont surtout un but pdagogique : ils vous montrent quil est ais
dcrire une macro pour tester deux versions diffrentes dun mme
programme. De plus, ils vous enseignent que la facilit fait finalement
perdre du temps et quon a toujours intrt tre le plus explicite possible dans un programme car on gagne en temps et en lisibilit.
Les fonctions de date
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
150
Hour
Minute
Month
MonthName
Now
Second
Time
Timer
TimeSerial
TimeValue
Weekday
WeekdayName
Year
151
Atn
Cos
Exp
Fix
Hex
Int
Log
Oct
Partition
Rnd
Round
Sgn
Sin
Sqr
Tan
Val
152
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
DDB
FV
VC
IPmt
INTPER
IRR
TRI
MIRR
TRIM
Nper
NPM
NPV
VAN
Pmt
VPM
PPmt
PRINCPER
153
PV
VA
Rate
TAUX
SLN
AMORLIN
SYD
SYD
Dir
EOF
FileAttr
FileDateTime
FileLen
154
FreeFile
GetAttr
Input
Loc
LOF
Seek
Iif
IsDate
IsEmpty
IsError
IsMissing
155
IsNull
IsNumeric
IsObject
Switch
156
Type renvoy
CBool
Boolean
CByte
Byte
0 255.
CCur
Currency
CDate
Date
CDbl
Double
-1.79769313486231E308
-4,94065645841247E-324 pour les valeurs
ngatives ; 4,94065645841247E-324
1,79769313486232E308 pour les valeurs
positives.
CDec
Decimal
+/-79 228 162 514 264 337 593 543 950 335
pour les nombres sans dcimales. La plage de
valeurs des nombres 28 dcimales est
+/-7,9228162514264337593543950335. Le
plus petit nombre diffrent de zro est
0,0000000000000000000000000001.
CInt
Integer
CLng
Long
CSng
Single
CStr
String
CVar
Variant
157
DoEvents
Environ
GetAllSettings
GetSetting
158
IMEStatus
MacID
MacScript
QBColor
RGB
Shell
TypeName
VarType
Filter
IsArray
Join
159
LBound
Split
UBound
CreateObject
GetObject
Error
160
FormatCurrency
FormatDateTime
FormatNumber
FormatPercent
Affiche une invite dans une bote de dialogue, attend que l'utilisateur
tape du texte ou clique sur un bouton, puis renvoie le contenu de la
zone de texte sous la forme d'une valeur de type String.
MsgBox
161
xpos
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
162
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)))
163
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
165
166
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
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
168
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.
173
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
175
Un objet en situation
Version 2000
Version XP
Version 2003
Version 2007
Word
VBAWRD9.CHM
VBAWD10.CHM
VBAWD10.CHM
WINWORD.DEV.HXS
Excel
VBAXL9.CHM
VBAXL10.CHM
VBAXL10.CHM
EXCEL.DEV.HXS
Access
ACMAIN9.CHM
VBAAC10.CHM
VBAAC10.CHM
MSACCESS.DEV.HXS
Outlook
VBAOUTL9.CHM
VBAOL10.CHM
VBAOL11.CHM
OUTLOOK.DEV.HXS
PowerPoint
VBAPP9.CHM
VBAPP10.CHM
VBAPP10.CHM
POWERPNT.DEV.HXS
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.
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
178
Chapitre 9. Objets
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).
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).
180
Chapitre 9. Objets
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)
182
Chapitre 9. Objets
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)
184
Chapitre 9. Objets
Les deux paramtres suivants sont trs simples et indiquent le nombre de lignes et de colonnes du tableau :
NumRows:=6, _
NumColumns:=7, _
Si le paramtre DefaultTableBehavior est bien dcrit dans la documentation, les constantes de AutoFitBehavior, en revanche, ne sont
pas explicites. Ceci peut se comprendre par le fait que ces constantes
sont parlantes pour un anglophone. Ces trois constantes correspondent en fait aux options de la commande TableauAjustement automatique :
wdAutoFitContent correspond Ajuster au contenu,
wdAutoFitFixed correspond Largeur de colonne fixe,
wdAutoFitWindow correspond Ajuster la fentre.
Ainsi sachve lexplication dune seule ligne de code gnre
laide de lenregistreur de macros lorsque vous insrez un tableau. Tout
ceci a pu vous paratre laborieux, mais il faut reconnatre que pntrer
les modles dobjets dOffice nest pas chose facile. Il faut parfois parcourir la documentation en tous sens pour arriver ses fins et les dbutants sont souvent apeurs devant le nombre dobjets, proprits et
mthodes. Il ne faut pas cependant tre effray car le nombre des
objets que vous allez rellement utiliser est assez restreint ; en effet, de
la mme manire que vous utilisez Word 30 % de ses possibilits
(dans le meilleur des cas), vous emploierez une faible quantit
185
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 AffichageExplorateur
dobjets (ou bien en appuyant sur F2), affiche les objets, les proprits,
les mthodes et les constantes du modle dobjets de lapplication en
cours. Par exemple, si vous travaillez sous Excel, lappui sur les touches
ALT + F11 puis F2 fera apparatre la fentre suivante :
Lexplorateur dobjets
187
188
Chapitre 9. Objets
Graph
VBAGR10.CHM
VBAOF11.CHM
VBAOWS10.CHM
Publisher
VBAPB10.CHM
FrontPage
VBAFPD10.CHM et VBAFPW10.CHM
189
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
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.
193
Objet Application
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
194
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
Objet Application
195
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
196
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
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
198
champ.Delete
End If
Next
End Sub
Objet Range
199
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
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)
Objet Range
201
ou bien :
Set plage = ActiveDocument.Range
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
202
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 pouvez afficher des statistiques dans Word (grce la commande FichierProprits), mais cette fonctionnalit ne sapplique
quau document entier.
Vous avez pu remarquer que nous avons utilis dans ce dernier programme un objet Selection : nous allons prsent tudier cet objet
qui est galement trs important et qui complte lobjet Range.
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
204
Sub affiche_code_car()
MsgBox Asc(Selection)
End Sub
205
Objet Selection
ment, peut tre exprim laide dune numration qui peut prendre
les valeurs suivantes :
wdCharacter = 1
wdWord = 2
wdSentence = 3
wdParagraph = 4
wdLine = 5
wdStory = 6
wdScreen = 7
wdSection = 8
wdColumn = 9
wdRow = 10
wdWindow = 11
wdCell = 12
wdCharacterFormatting = 13
wdParagraphFormatting = 14
wdTable = 15
wdItem = 16
Commande
Dun caractre
Dun mot
Dune phrase
Dun paragraphe
la fin de la ligne
sel.Selection.EndKey unit:=wdLine
Dune ligne
la fin du document
206
Commande
Dun caractre
Dun mot
Dune phrase
Dun paragraphe
Au dbut de la ligne
sel.Selection.HomeKey unit:=wdLine
Dune ligne
Au dbut du document
sel.Selection.HomeKey Unit:=wdStory
Mise en pratique
207
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
Mise en pratique
209
210
Else
Exit Do
End If
Loop Until max < min
Indexpara2 = moyen
End Function
211
212
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.
213
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
214
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
215
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
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
ActiveSheet
ActiveWindow
ActiveWorkbook
Application
Build
Calculation
CalculationVersion
Caption
Cells
Columns
DataEntryMode
219
Objet Application
DefaultSaveFormat
Dialogs
DisplayFullScreen
EditDirectlyInCell
FileSearch
FixedDecimal
FixedDecimalPlaces
Interactive
International
LanguageSettings
Names
220
OperatingSystem
RecentFiles
ReferenceStyle
Rows
Selection
Sheets
ShowToolTips
TemplatesPath
ThisWorkbook
UserName
Version
Visible
Windows
Workbooks
Worksheets
221
Objet Application
Pour vous familiariser avec ces proprits, le plus simple est de les
tester dans lditeur de programmes en faisant afficher leur valeur
laide de la fonction MsgBox. Vous pouvez soit crer une procdure
soit saisir directement linstruction dans la fentre Excution. Si la
fentre Excution nest pas affiche dans lditeur, excutez la commande AffichageFentre Excution. Dans cette fentre, vous pouvez saisir une instruction et lexcuter immdiatement en appuyant
sur la touche Entre. La figure 11.1 illustre la saisie dune instruction
dans la fentre Excution.
222
AddCustomList
Calculate
CalculateFull
ConvertFormula
Evaluate
FindFile
Intersect
223
Objet Workbook
Quitte Excel.
SendKeys
Wait
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
Charts
Date1904
Names
224
ReadOnly
Saved
SaveLinkValues
Sheets
Styles
Worksheets
WriteReserved
Close
Ferme le classeur.
PrintOut
Imprime le classeur.
PrintPreview
RefreshAll
Save
SaveAs
225
Objet Worksheet
Unprotect
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
Columns
EnableCalculation
Name
Names
226
PageSetup
Previous
ProtectContents
ProtectionMode
Range
Rows
Visible
Calculate
Copy
Delete
Supprime un objet.
Evaluate
Move
Paste
227
Objet Range
Colle dans la feuille les donnes provenant du Pressepapiers en respectant le format spcifi. Utilisez cette
mthode pour coller des donnes provenant d'autres
applications ou pour coller des donnes en respectant
un format particulier.
PrintOut
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"
228
Workbooks("Tableau d'amortissement.XLS").Worksheets("Feuil2"). _
Range("A1").Value = "Tableau"
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
229
Objet Range
AddressLocal
Cells
Column
Columns
ColumnWidth
Count
End
EntireColumn
EntireRow
Formula
HasFormula
230
Resize
Row
RowHeight
Rows
Validation
Value
Value2
Worksheet
ApplyNames
AutoComplete
AutoFill
AutoFit
231
Objet Range
Calculate
Clear
ClearContents
ClearFormats
ColumnDifferences
Consolidate
Copy
CreateNames
Cut
DataSeries
Delete
FillDown
FillLeft
FillRight
232
Find
FindNext
FindPrevious
Insert
ListNames
Parse
PasteSpecial
PrintOut
PrintPreview
Replace
RowDifferences
Select
SpecialCells
233
Mise en pratique
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
End If
Next compteur
End Sub
235
Mise en pratique
Next cellule
End Sub
236
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
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")
AllDataAccessPages
AllDatabaseDiagrams
AllForms
AllMacros
AllModules
AllQueries
AllReports
239
Objets dAccess
AllTables
AllViews
Controls
FormatConditions
Forms
Modules
Pages
Properties
References
Reports
OBJETS DACCESS
Le tableau 12.2 liste les principaux objets dAccess.
Tableau 12.2 Objets dAccess
AccessObject
240
Application
CodeData
Control
CurrentData
CurrentProject
DefaultWebOptions
DoCmd
Form
Formulaire Access.
FormatCondition
Hyperlink
Module
Page
Reference
Report
Rapport.
Screen
WebOptions
241
Objet DoCmd
OBJET DOCMD
Lobjet DoCmd est un objet un peu part car il ne possde aucune
proprit ; la raison en est que cet objet ne sert en fait qu excuter
des actions qui sont normalement effectues en mode interactif,
comme louverture dun formulaire. Voici la syntaxe dutilisation de
lobjet DoCmd :
[application.]DoCmd.mthode [arg1, arg2, ...]
Lobjet DoCmd possde les arguments suivants :
arg1,
arg2...
Argument
Description
Application
Facultatif. L'objet
Application
Mthode
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 :
242
Beep
CancelEvent
Close
CopyObject
DeleteObject
FindNext
FindRecord
GoToControl
GoToPage
GoToRecord
243
Objet DoCmd
Maximize
Minimize
MoveSize
OpenDataAccessPage
OpenForm
OpenQuery
OpenReport
OpenTable
OpenView
244
Quit
Requery
Restore
RunCommand
Save
SelectObject
SetMenuItem
SetWarnings
ShowAllRecords
245
Objet Form
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
Exemple
Forms!nomformulaire
Forms!FormulaireCommandes
Forms![nom formulaire]
Forms![Formulaire Commandes]
Forms("nomformulaire")
Forms("FormulaireCommandes")
Forms(index)
Forms(0)
Si vous souhaitez connatre par programme le nom de tous vos formulaires, vous pouvez utiliser le code suivant :
Dim formulaire As Object
For Each formulaire In Application.CurrentProject.AllForms
MsgBox formulaire.Name
Next
247
Objet Form
Les deux exemples suivants vous montrent comment faire rfrence un contrle intitul NouvDonnes dans un sous-formulaire
ctlSousForm contenu dans le formulaire appel Commandes :
Forms!Commandes.ctlSousForm.Form!Controls.NouvDonnes
Forms!Commandes.ctlSousForm!NouvDonnes
Vous pouvez, grce la commande For Each, numrer tous les contrles dun formulaire. Le programme suivant se contente de lister leur
nom dans la fentre Excution de lditeur de programmes (commande
Debug.Print) mais on peut trs bien imaginer de modifier leur taille :
Dim controle As Control
For Each controle In Application.Forms(0).Controls
Debug.Print controle.Name
Next
Le tableau 12.4 liste les proprits les plus importantes de lobjet Form.
Tableau 12.4 Principales proprits de lobjet Form
ActiveControl
AllowAdditions
AllowDeletions
AllowEdits
AutoCenter
AutoResize
CloseButton
ControlBox
Controls
248
Cycle
DataEntry
DefaultView
Dirty
Filter
FilterOn
FrozenColumns
Modal
NavigationButtons
NewRecord
OrderBy
OrderByOn
249
Objet Form
Properties
RowHeight
Visible
Recalc
Refresh
Repaint
Requery
SetFocus
Undo
250
MISE EN PRATIQUE
Pour illustrer notre propos, nous allons vous prsenter plusieurs
macros qui illustrent la programmation des formulaires.
251
Mise en pratique
252
253
Mise en pratique
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
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).
255
Mise en pratique
Si vous saisissez un DVD qui nest pas pour tout public, une liste
droulante apparat quand vous sortez de la case cocher.
DLookup("[LOCALITE]", _
_
= '" & [code] & "'")
= varville
256
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
INSTALLATION DADO
Pour bnficier dADO, il faut que cette technologie daccs aux donnes
soit installe sur votre ordinateur. ADO est install avec de nombreux
logiciels (Access, par exemple), mais il peut tre absent de votre machine.
Pour vrifier sa prsence, il suffit de regarder sil existe un dossier ADO
dans le chemin \Program Files\Fichiers communs\System\. Si ADO
nest pas prsent sur votre machine, il faut installer MDAC (Microsoft
Data Access Components). MDAC, comme son nom lindique, est une
suite de composants qui permettent laccs aux donnes. Tlchargeable
gratuitement sur le site Web de Microsoft (http://msdn.microsoft.com/
data/), MDAC contient entre autres ADO, ce qui signifie quen installant MDAC vous allez installer ADO sur votre ordinateur.
Afin de vous assurer quADO est bien prsent sur votre systme,
ouvrez lditeur Visual Basic (dans nimporte quelle application
dOffice) et excutez la commande OutilsRfrences.
Dans la liste des rfrences disponibles, vous devez voir la rfrence
la bibliothque dobjets Microsoft ActiveX Data Objects 2.X
Library (figure 13.1). X reprsente le numro de version de la bibliothque installe et il est parfaitement possible davoir plusieurs versions installes sur un mme ordinateur.
259
Objets dADO
OBJETS DADO
ADO se compose de neuf objets et de quatre collections. La
figure 13.2 illustre le diagramme de ce modle dobjets.
260
Description
Connection
Command
Recordset
Record
Stream
Parameter
Field
Property
Reprsente une caractristique dun objet ADO qui est dfini par la
source de donnes. Les objets ADO ont deux types de proprits :
les proprits intgres et les proprits dynamiques. Les proprits
intgres sont les proprits implmentes dans ADO et
immdiatement disponibles dans tout nouvel objet. Lobjet Property
est un conteneur pour les proprits dynamiques qui sont dfinies
par la source de donnes sous-jacente.
Error
Contient les dtails des erreurs daccs aux donnes qui dpendent
dune seule opration impliquant la source de donnes.
261
Objet Connection
Description
Fields
Properties
Contient tous les objets Property dune instance spcifique dun objet.
Parameters
Errors
Contient tous les objets Error crs la suite dune erreur daccs
aux donnes.
OBJET CONNECTION
Lobjet Connection est le premier objet auquel on est confront quand
on travaille avec ADO car cest celui qui fait le trait dunion entre la
source de donnes et le programmeur. Afin de pouvoir manipuler des
donnes, vous devez dabord crer un objet Connection qui dfinit la
source des donnes que vous allez utiliser. Lemploi de cet objet peut se
rvler assez complexe si vous souhaitez vous connecter une source de
donnes un peu exotique, mais si vous voulez travailler avec une base
Access, la syntaxe est extrmement simple utiliser. En effet, la proprit CurrentProject.Connection dAccess permet dinitialiser directement et simplement un objet Connection ADO.
Pour initialiser un objet Connection sous Access, il suffit dutiliser
le code suivant :
Dim connex As ADODB.Connection
Set connex = CurrentProject.Connection
262
Le rsultat est illustr la figure 13.3 et vous pouvez voir que les informations listes par la proprit ConnectionString sont nombreuses.
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
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
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
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
Mise en pratique
267
268
Mise en pratique
269
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).
270
Mise en pratique
271
rst.Close
conn.Close ' on ferme la connexion
End Sub
272
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
274
275
Mise en pratique
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
Mise en pratique
277
lettres5
lettres6
lettres7
lettres8
lettres9
lettres10
278
Mise en pratique
279
280
281
Mise en pratique
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
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
285
Objet MailItem
OBJET MAILITEM
Lobjet MailItem reprsente un courrier lectronique. On utilise cet
objet pour crer un message lectronique et lenvoyer. On emploie
galement cet objet quand on souhaite manipuler les courriers qui
sont stocks dans la Bote de rception.
Le tableau 14.1 liste les principales proprits dun objet MailItem.
Tableau 14.1 Principales proprits dun objet MailItem
Proprit
Description
Attachments
BCC
Body
BodyFormat
CC
CreationTime
Importance
ReceivedTime
Recipients
SenderName
286
Description
Size
Subject
To
Description
Copy
Delete
Supprime un message.
Display
Affiche un message.
Forward
Transfre un message.
Move
PrintOut
Imprime un message.
Reply
ReplyAll
Send
Envoie un message.
Pour envoyer un courrier lectronique par programmation, on utilise un code similaire celui-ci :
Dim courriel As MailItem
Dim destinataire As Recipient
Objet MAPIFolder
287
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)
288
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
290
291
Mise en pratique
MISE EN PRATIQUE
Afin dillustrer notre propos, nous allons vous prsenter plusieurs
macros qui montrent comment utiliser le modle dobjets dOutlook.
292
293
Mise en pratique
294
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
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
296
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.
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
301
Objet Application
OBJET APPLICATION
Comme pour Word et Excel, lobjet Application reprsente lapplication PowerPoint elle-mme et se situe au sommet de la hirarchie
du modle dobjets. Une dizaine de proprits sont globales et vous
navez donc pas les prfixer avec le nom dobjet Application.
Le tableau 15.1 liste les principales proprits de lobjet Application (les proprits en gris sont globales).
Tableau 15.1 Principales proprits de lobjet Application
Active
ActivePresentation
ActivePrinter
ActiveWindow
Build
Caption
CommandBars
FileDialog
OperatingSystem
Presentations
ShowStartupDialog
SlideShowWindows
Version
Windows
WindowState
302
Pour vous familiariser avec ces proprits, le plus simple est de les
tester dans lditeur de programmes en faisant afficher leur valeur
laide de la fonction MsgBox. Vous pouvez, par exemple saisir directement linstruction dans la fentre Excution. Si la fentre Excution
nest pas affiche dans lditeur, excutez la commande AffichageFentre Excution. Dans cette fentre, vous pouvez saisir une
instruction et lexcuter immdiatement en appuyant sur la touche
Entre.
La figure 15.2 illustre le test dune proprit dans la fentre Excution. Comme vous pouvez le constater, la technologie Intellisense
fonctionne galement dans la fentre Excution.
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
303
Collection Presentations
COLLECTION PRESENTATIONS
La collection Presentations regroupe des objets Presentation qui,
comme leur nom lindique, dsignent une prsentation PowerPoint.
Le tableau 15.2 liste les principales proprits de lobjet Presentation.
Tableau 15.2 Principales proprits de lobjet Presentation
BuiltInDocumentProperties
ColorSchemes
Fonts
FullName
HandoutMaster
Name
NotesMaster
PageSetup
Path
PrintOptions
Saved
304
Slides
SlideShowSettings
SlideShowWindow
TemplateName
Windows
Close
Export
Merge
PrintOut
Imprime la prsentation.
Save
Enregistre la prsentation.
305
Collection Presentations
SaveCopyAs
WebPagePreview
306
Collection Presentations
307
308
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
309
Collection Presentations
310
Ne vous posez pas de question mtaphysique et choisissez la commande ExcutionRinitialiser qui a pour effet darrter le dbogage.
Puis mettez une apostrophe devant la ligne de code surligne en
jaune, ce qui en fait un commentaire et empche donc son excution.
Relancez le programme et vous constaterez que lerreur dj rencontre se produit nouveau cinq fois. Appliquez le mme remde en
transformant en commentaires les lignes qui posent problme. Au
final, vous testez dans la fentre Excution une bonne vingtaine de
proprits dune prsentation PowerPoint et vous navez pas eu la
peine dcrire tout ce code.
Vous vous demandez sans doute pourquoi certaines proprits ne
fonctionnent pas. La raison est donne dans laide en ligne. En fait,
lobjet DocumentProperty ne fait pas partie du modle dobjets de
PowerPoint, mais du modle dobjets dOffice et, comme son nom
lindique, il sagit dun objet gnrique qui liste les proprits des
documents Office. Si vous consultez la documentation de lobjet
DocumentProperty qui est disponible dans la rubrique Rfrence
Visual Basic Microsoft Office, vous pourrez lire la remarque suivante :
Les applications conteneur ne dfinissent pas ncessairement une
valeur pour chaque proprit de document prdfinie. Si une application donne ne dfinit pas une valeur pour une des proprits de
document prdfinies, renvoyer la proprit Value pour cette proprit de document provoque une erreur.
COLLECTION SLIDES
Les adeptes du franglais savent que la collection Slides renferme les
diapositives dune prsentation. Un objet Slide dsigne une des diapositives dune prsentation. Il existe galement une collection baptise SlideRange qui reprsente une page de commentaires ou un
ensemble de diapositives ; cet ensemble peut tre form de plusieurs
diapositives, voire de la totalit des diapositives de la prsentation.
Les collections Slides et SlideRange partagent de nombreuses proprits et mthodes.
Le tableau 15.4 liste les principales proprits de lobjet Slide.
311
Collection Slides
ColorScheme
Design
DisplayMasterShapes
FollowMasterBackground
Layout
Master
Name
Shapes
SlideID
SlideIndex
SlideNumber
SlideShowTransition
TimeLine
312
Copy
Cut
Delete
Duplicate
Export
MoveTo
Select
Collection Slides
313
314
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
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
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
317
Collection Shapes
AnimationSettings
AutoShapeType
Fill
Height
Id
Left
Line
LockAspectRatio
Name
PictureFormat
Table
TextFrame
318
Type
Visible
Width
Copy
Cut
Delete
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.
320
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
322
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.
Numros et numrations
323
324
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.
Mise en pratique
325
326
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
327
Mise en pratique
Next num_para
End Sub
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
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
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.
331
332
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.
333
Objectif de SGML
Lobjectif de SGML est de fournir une syntaxe cohrente et non
ambigu qui comprend :
334
335
336
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
339
XML en action
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.
340
XML en action
341
342
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>
343
344
345
346
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
351
Ceci a pour effet dafficher une nouvelle fentre qui contient une
grille ainsi quune 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
droit sur le formulaire et choisissez Proprits. Une autre fentre apparat dans lditeur :
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.
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
Nom du contrle
Slectionner des
objets
Description
L'outil Slectionner des objets est le seul
lment de la bote outils qui ne trace
pas un contrle. Une fois slectionn, il
permet de dplacer ou de
redimensionner un contrle
prcdemment trac sur un formulaire.
Intitul
Label
Zone de texte
TextBox
Zone de liste
modifiable
ComboBox
Zone de liste
ListBox
Case cocher
CheckBox
Bouton doption
OptionButton
354
Nom du contrle
Description
Bouton bascule
ToggleButton
Cadre
Frame
Bouton de
commande
CommandButton
Contrle Onglet
TabStrip
Multipage
MultiPage
Dfilement
ScrollBar
Toupie
SpinButton
Image
Image
355
TextBox
ListBox
ComboBox
OptionButton
ScrollBar
356
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).
358
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
mois.AddItem
("Janvier")
("Fvrier")
("Mars")
("Avril")
("Mai")
("Juin")
("Juillet")
("Aot")
("Septembre")
("Octobre")
("Novembre")
("Dcembre")
Le vritable problme rside dans le fait quon ne sait pas trs bien
pour linstant o placer ce code pour quil soit excut au bon endroit.
Nous avons dj voqu au chapitre 12 le rle des vnements dans
les formulaires Access ; les vnements sont bien sr trs importants
dans la programmation des UserForm.
Le plus simple pour apprhender la notion dvnement est de
donner quelques exemples. Voici un tableau listant quelques objets et
des vnements auxquels ils sont susceptibles de ragir :
Objet
vnements associs
Formulaire UserForm
Contrle ComboBox
Contrle CommandButton
Clic, double-clic.
Document Word
Feuille Excel
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.
359
360
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 :
361
362
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
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
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
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
N mensualit
Mensualit
Capital
Intrt
1 436,77
1 086,77
350
1 436,77
1 093,11
343,66
1 436,77
1 099,49
337,28
1 436,77
1 105,9
330,87
Mise en pratique
367
368
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.
369
Mise en pratique
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
cannuites.AddItem "18"
cannuites.AddItem "19"
cannuites.AddItem "20"
End Sub
Mise en pratique
371
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
373
Mise en pratique
374
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
un objet de Visual Basic qui permet de traiter des fichiers, lobjet FileSystemObject. Cet objet est intressant parce quil donne accs au systme de fichiers de lordinateur et permet toute une srie doprations
sur les fichiers telles que la copie, la cration, la lecture, etc. Dans la
mesure o il sagit dun objet Visual Basic, vous trouverez des informations sur cet objet dans laide en ligne en consultant la rubrique intitule Visual Basic Manuel de rfrence du langage .
Il existe galement un modle dobjets pour les objets communs
toutes les applications Office. Dans ce modle, on trouve des objets
comme les assistants, les barres de menus, les barres doutils, etc.
Pour connatre la liste de ces objets et leur syntaxe dutilisation,
localisez sur votre disque dur le fichier daide VBAOFX.CHM, X
reprsentant le numro de votre version dOffice (9, 10 ou 11).
OBJET FILESYSTEMOBJECT
Lobjet FileSystemObject permet daccder au systme de fichiers de
lordinateur. Grce cet objet, vous allez pouvoir crer des fichiers, les
supprimer et les dplacer. Vous pourrez galement grer des rpertoires. Dans le cadre de cet ouvrage, nous allons surtout nous intresser
la facult qua lobjet FileSystemObject de crer des fichiers.
Cet objet ne possde quune proprit, Drives, qui renvoie la collection de tous les lecteurs de lordinateur.
En revanche lobjet FileSystemObject possde de nombreuses
mthodes dont le tableau 18.1 liste les principales.
Tableau 18.1 Principales mthodes de lobjet FileSystemObject
Mthode
Description
CopyFile
CreateFolder
Cre un dossier
CreateTextFile
377
Objet TextStream
Description
DeleteFile
Supprime un fichier
FileExists
MoveFile
OpenTextFile
OBJET TEXTSTREAM
Lobjet TextStream vous procure un contrle total sur les fichiers
aussi bien en lecture quen criture. Il ouvre ainsi la voie toute une
srie dapplications qui sont extrmement intressantes comme les
programmes de conversion de fichiers. Avant de rentrer dans le vif
du sujet, examiner les proprits et les mthodes dobjet TextStream
(tableaux 18.2 et 18.3).
Tableau 18.2 Proprits de lobjet TextStream
Proprit
Description
AtEndOfLine
AtEndOfStream
Column
Line
378
Description
Close
Read
ReadAll
ReadLine
Skip
SkipLine
Write
WriteBlankLines
WriteLine
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
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
380
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.
382
Mise en pratique
383
384
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.
Mise en pratique
385
386
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
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
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
390
Mise en pratique
391
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.
392
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
394
Valeur
Signification
SM_CXSCREEN
Largeur de lcran
SM_CYSCREEN
Hauteur de lcran
SM_CXFULLSCREEN
16
SM_CYFULLSCREEN
17
SM_CYMENU
15
Hauteur de menu
SM_CYCAPTION
SM_CXFRAME
32
SM_CYFRAME
33
SM_CXHSCROLL
21
SM_CYHSCROLL
SM_CXVSCROLL
SM_CYVSCROLL
20
SM_CXSIZE
30
SM_CYSIZE
31
SM_CXCURSOR
13
Largeur du curseur
SM_CYCURSOR
14
Hauteur du curseur
SM_CXBORDER
SM_CYBORDER
SM_CXDOUBLECLICK
36
SM_CYDOUBLECLICK
37
395
Mise en pratique
Valeur
Signification
SM_CXDLGFRAME
SM_CYDLGFRAME
SM_CXICON
11
Largeur de licne
SM_CYICON
12
Hauteur de licne
SM_CXICONSPACING
38
SM_CYICONSPACING
39
SM_CXMIN
28
SM_CYMIN
29
SM_CXMINTRACK
34
SM_CYMINTRACK
35
SM_CXHTHUMB
10
SM_CYVTHUMB
SM_MOUSEPRESENT
19
SM_SWAPBUTTON
23
396
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
398
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
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
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
Erreurs de programmation
403
La bote de dialogue indique quil sagit dune erreur de compilation. Cela signifie que lerreur a t dtecte avant que le programme
ne soit excut. Quand vous lancez lexcution dune macro, le compilateur de VBA analyse le code source du programme et sil ny a pas
derreur, le programme est transform en code machine afin dtre
excut. Sil y a une erreur, le compilateur la signale grce une bote
de dialogue. En fait, le compilateur, avant toute chose, sassure de la
grammaticalit de votre programme. Il joue un peu le rle dun correcteur dorthographe et sassure que vous navez pas oubli de mot ou
bien mal orthographi une variable. Quand une erreur de syntaxe est
signale, le message derreur est en gnral suffisamment explicite
pour quelle soit rapidement dtecte puis rpare. Il suffit ensuite de
sauvegarder le programme et de relancer son excution. Sil y a
dautres erreurs de syntaxe, le compilateur les signalera nouveau
jusqu ce que vous les ayez toutes corriges. Cela signifie que
lorsquun programme sexcute il ne comporte aucune erreur de syntaxe ; cela est une premire garantie, mais vous ntes pas pour autant
assur que le programme fonctionne correctement
De plus, si vous avez coch la case Vrification automatique de la
syntaxe dans la bote de dialogue des Options (accessible via
OutilsOptions dans lditeur), lerreur sera signale lors de la saisie
du code dans lditeur. Ainsi, lerreur sera dtecte avant lexcution
du code.
404
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.
405
Erreurs de programmation
Description
Dpassement de capacit.
Mmoire insuffisante.
10
11
13
Type incompatible.
14
16
17
18
20
28
35
47
48
49
51
Erreur interne.
52
53
Fichier introuvable.
54
55
Fichier dj ouvert.
57
406
Description
58
59
61
Disque plein.
62
63
67
Trop de fichiers.
68
70
Permission refuse.
71
74
75
76
91
92
93
94
97
Impossible d'appeler une procdure Friend sur un objet qui nest pas
une instance de classe de dfintion.
98
298
320
321
322
407
Erreurs de programmation
Description
325
327
328
335
336
337
Composant introuvable.
338
360
Objet dj charg.
361
363
364
365
368
371
380
381
382
383
Property Set ne peut tre utilise avec une proprit en lecture seule.
385
387
393
394
Property Get ne peut pas tre excute sur une proprit en criture
seule.
408
Description
400
402
419
422
Proprit introuvable.
423
424
Objet requis.
425
429
430
432
438
440
Erreur Automation.
442
443
445
446
447
448
449
450
451
452
Numro incorrect.
409
Erreurs de programmation
Description
453
454
455
457
458
459
460
461
462
463
480
481
Image incorrecte.
482
Erreur d'imprimante.
483
484
485
486
520
521
735
744
746
31001
Mmoire insuffisante.
410
Description
31004
Pas d'objet.
31018
31027
31032
31036
31037
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
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.
413
Dbogueur
DBOGUEUR
Le dbogueur est un logiciel dans lequel vous allez pouvoir excuter
votre programme. Votre code sexcutera sous le contrle du dbogueur et vous pourrez tout moment en arrter lexcution pour
scruter le contenu dune variable ou bien encore tester la valeur
dune expression. Lditeur de Visual Basic possde une fonctionnalit de dbogage si bien que vous navez pas besoin dun autre logiciel pour dboguer vos macros VBA.
Lancement du dbogueur
Il y a plusieurs manires de dclencher lexcution du dbogueur de
lditeur Visual Basic. La premire mthode consiste cliquer sur le
bouton Dbogage de la bote de dialogue qui signale une erreur et
propose un dbogage. Vous pouvez galement lancer lexcution de
votre programme en mode pas pas, ce qui signifie que vous excutez une seule ligne de votre code la fois. Vous pouvez galement
placer un point darrt dans votre programme ; quand le programme
rencontre le point darrt, il stoppe son excution et passe la main
au dbogueur. Vous pouvez enfin inclure linstruction Stop dans
votre programme. la lecture de cette instruction, le programme
sarrte et passe en mode dbogage.
414
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.
Dbogueur
415
416
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.
417
Dbogueur
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.
418
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.
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
420
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
421
422
423
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.
426
427
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.
428
du nom du programme,
du nom du programmeur,
de la date de cration,
de la date de dernire modification,
de lobjet du programme.
429
430
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 :
431
Se documenter
chiffrent en millions de pages. Ce site Web entirement gratuit renferme une masse dinformations forte valeur ajoute.
Il est disponible en franais, mais aussi en anglais ladresse suivante :
http://msdn2.microsoft.com/en-us/library/default.aspx
Si vous matrisez langlais, nous vous conseillons de consulter cette
version car elle est beaucoup plus complte. De plus, vous tes certain
dy trouver une documentation parfaitement jour.
432
433
Se documenter
434
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
AddNew 264
Address 229
AddressLocal 229
ADO 257
Connection 261
objets 239
installation 258
objets 259
projet 257
Recordset 263
AccessObject 239
ADP 257
AccessObjectProperties 238
affectation
AccessObjectProperty 240
ActionSettings 317
symbole 134
aide
dcompilation 176
ActivateMicrosoftApp 222
ActiveCell 218
ActiveControl 247
ActiveDocument 177, 192
ActivePresentation 301
Alias 390
AllDataAccessPages 238
AllDatabaseDiagrams 238
ActiveWindow.View 194
AllForms 238
ActiveWorkbook 218
AllMacros 238
AllModules 238
AddCustomList 222
AllowAdditions 247
Additem 357
AllowDeletions 247
438
Formation VBA
AllowEdits 247
AtEndOfLine 377
AllQueries 238
AllReports 238
Atn 151
AllStoredProcedures 239
AutoCenter 247
AllTables 239
AutoComplete 230
AllViews 239
AutoFill 230
amortissement 364
AutoFit 230
analyse 9
AnimationSettings 317
AutoFormat 231
API
AutoResize 247
autorit de certification 38
programmation 387
AutoShapeType 317
mthodes 195
Word 192
application
multilingue 194
pilotage partir dune autre
application 211
Application Programming
Interface Voir API
Apply 318
Background 311
base de donnes
interrogation avec ADO 274
moteur 259
Beep 242
bibliothque dobjets 186, 320
rfrence 211
ApplyFilter 242
bissextile 98
ApplyNames 230
argument 127
nomm 133
Array 158
arrondi 370
boutons 139
modale 140
Bote de rception
sous-dossier 289
boucle 103
AscW 204
sortie 109
439
Index
bouton
CByte 156
bascule 353
CCur 156
doption 353
CDate 156
de commande 354
CDbl 156
boutons
CDec 156
Centre de gestion de la
confidentialit 39
ByVal 390
certificat numrique 38
C
cadre 354
chane
fonctions 145
vide 119
Charts 223
CalculateFull 222
CheckBox 353
Calculation 218
Choose 154
CalculationVersion 218
CallByName 159
CInt 156
CancelEvent 242
classe 187
proprit 352
caractre
Clear 231
ClearContents 231
de contrle 137
ClearFormats 231
CLng 156
Case 99
CloseButton 247
440
Formation VBA
codage en dur 63
commande 70
code
CommandText 267
commentaire 45
ajout 49
formulaire 359
compatibilit 380
gnrateur 308
modification 37
ComputeStatistics 202
optimisation 210
concatnation 83
SQL 275
condition
stockage 300
logique 92
suppression de lignes 49
ordre 96
code source
dfinition 7
CodeData 240
Consolidate 231
Documents 196
indice 207
parcourir 197
ColorScheme 311
boutons 139
VB 65
contact
exportation dans une BD 296
ColorSchemes 303
Control 240
ControlBox 247
ColumnDifferences 231
ColumnWidth 229
COM 321
ComboBox 353
conversion 155
ConvertFormula 222
initialisation 361
valeur 362
CopyFile 376
CopyObject 242
CommandBars 301
Cos 151
CommandButton 354
441
Index
Country 195
date
CR 137
CreateFolder 376
Date1904 223
CreateNames 231
DateAdd 149
DateDiff 149
DatePart 149
CSng 156
CSS 338
fonction 379
CStr 156
DateValue 149
CurDir 153
Currency 75, 156
CurrentData 240
CurrentProject 240, 246
CurrentProjetConnection 266
CurrentRecord 248
curseur 201, 264
dplacement 204
CursorType 264
Day 149
DDB 152
dbogage 309, 401, 410
arrt 310
mode pas pas 418
dbogueur 413
excution 413
fonctionnement 414
CVar 156
CVErr 159
Dclarations
section 86
Cycle 248
Declare 389
ddoublonnage 210
DAO 257
DefaultFilePath 219
DefaultSaveFormat 219
DataEntry 248
DefaultTableBehavior 181
DataEntryMode 219
DefaultView 248
DataSeries 231
DefaultWebOptions 240
dfilement 354
442
Formation VBA
Save 198
DoEvents 157
dossier
DeleteFile 377
crer 376
DeleteObject 242
Outlook 287
Design 311
Drives 376
diapositive
DSSSL 338
DTD 332
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
ECMA 343
EDI 42
EditDirectlyInCell 219
diteur
voir les constantes 141
diteur Visual Basic
ouverture 41
lment facultatif 116
Else 93
ElseIf 94
Empty 119
EnableCalculation 225
encodage 10
End 229
End If 93
DocumentProperty 310
End Sub 46
Documents 178
Add 198
EndKey 205
Close 198
enregistrement
Open 198
ajout 264
443
Index
comptage 266
Excel
Application 217
verrouillage 265
Range 227
Exit Do 120
limitations 29
EntireColumn 229
EntireRow 229
Exp 151
Enum 193
numration 193, 205, 319
Environ 157
environnement de
dveloppement intgr Voir
EDI
Expand 201
Explorateur dobjets 186
recherche 187
Explorateur de projets 42
Export 304, 312
expression 83
caractre 84
Err 421
date 84
erreur
logique 85
dexcution 404
numrique 84
de logique 410
Extend 206
de syntaxe 402
dpassement de capacit 82
gestion 421
programmation 401
Error 159
espace de noms 284
tude pralable 8
Evaluate 222, 226
vnement 250, 358
False 85, 92
Faux 92
fentre
Excution 221, 247, 302, 308
feuille 350
de proprits 352
fichier 193
exemples 358
cration 376
ordre 360
supprimer 377
444
Formation VBA
focus 192
fichier Office
FollowMasterBackground 311
fonction
conversion 377
aide 128
gestion 375
appel 127
arguments 164
Fields 264
catgories 145
FileAttr 153
FileDateTime 153
conversion 155
FileDialog 301
FileExists 377
FileLen 153
FileSearch 193, 219
FileSystemObject 154, 376
Fill 317
FillDown 231
FillLeft 231
FillRight 231
FillUp 232
Filter 158, 248
FilterOn 248
finance
fonctions 152
de chane 145
de date 149
dfinition 127
criture 161
financires 152
formatage 159
gestion derreur 159
gestion dobjets 159
gestion de fichiers 153
imbrication 131
Info paramtres 128
info-bulle 128
logiques 154
Find 232
mathmatiques 151
FindFile 222
FindPrevious 232
syntaxe 127
FindRecord 242
systme 157
Fix 151
tableau 158
FixedDecimal 219
FixedDecimalPlaces 219
445
Index
Fonts
PowerPoint 303
For Each 197, 234, 247
For Next 103
Step 107
valeur compteur 111
Form 240, 245
Format 159
formatage 159
FormatCondition 240
FormatConditions 239
FormatCurrency 160
gnrateur
code 308
gestion de fichiers 193
gestionnaire
derreur 423
dvnement 250, 358
GetAllSettings 157
GetAttr 154
GetDefaultFolder 287
GetObject 159
GetSetting 157
GetSystemMetrics 393
FormatDateTime 160
GoToControl 242
FormatNumber 160
FormatPercent 160
GoToRecord 242
Forms 239
Formula 229
HandoutMaster 303
code 359
HasFormula 229
contrles 352
Height 317
excuter 357
lgende 352
proprits 352
Frame 354
Hex 151
Hide 364
HomeKey 206
HorizontalResolution 195
Hour 150
FreeFile 154
Hourglass 243
FrozenColumns 248
HTML
FullName 303
avantages 335
FV 152
446
Formation VBA
inconvnients 335
Interactive 219
HXS 176
Hyperlink 240
International 219
HyTime 339
interprteur 57
Intersect 222
intitul 353
Id 317
IPmt 152
identificateur 68
IRR 152
If Then Else 92
IsArray 158
Iif 154
IsDate 154
image 354
IMEStatus 158
IsError 154
impression 161
IsMissing 154
incrment 107
IsNumeric 155
index
IsObject 155
indice 207
Items 283
initialisation 78
itration 105
Initialize 361
Input 154
InputBox 131, 160, 274
conversion 160
Insert 232
jeu
programmation 276
Join 158
instance 187
InStr 145
InStrRev 145
Label 353
instruction 47, 70
Language 194
Int 151
LanguageDesignation 195
LanguageSettings 219
447
Index
langue 194
Layout 311
LBound 159
LCase 145
lecteur de disque 376
Left 145, 317
Left$ 147
lgende
formulaire 352
MacID 158
Macintosh 380
macro 13
arrt 109
arrt enregistrement 17
assignation un raccourci
clavier 21
association une icne 23
Len 145
choix du nom 27
LF 137
enregistrement 15, 26
ligne
logique 174
ligne de code
continuit 104
enregistreur 14
excution 17
gnration de code 308
lieu de stockage 18
modification du code 37
lisibilit 168
opportunit 14
ListBox 353
scurit 40
liste
visualiser le code 38
programmation 251
macro-commande 5
ListIndex 362
MacScript 158
ListNames 232
MailItem 285
littral 78
MAPI 284
Loc 154
MAPIFolder 287
LockAspectRatio 317
Master 311
LockType 265
Maximize 243
LOF 154
MDAC 258
Log 151
membre
objet 187
Merge 304
448
message
Formation VBA
MoveLeft 206
analyse 293
MoveNext 267
MoveRight 204
MoveSize 243
MoveTo 312
Mid$ 147
Buttons 139
Minimize 243
dbogage 411
Minute 150
gnrateur 144
MIRR 152
Prompt 135
MSO.DLL 323
Modal 248
MsoAnimEffect 320
MsoAutoShapeType 323
MsoLanguageID 194
MSPPT.OLB 321
multilingue 194
multipage 354
module 44
de classe 126
insertion 125
Modules 239
diapositive 311
modulo 233
prsentation 303
Month 150
MonthName 150
namespace 284
mot
NavigationButtons 248
cl 68
NetworkTemplatesPath 220
rserv 69
NewMacros 44
moulinette 375
NewRecord 248
Move 226
Next 226
MoveFile 377
Normal.dot 19
MoveFirst 267
Normal.dotm 19
449
Index
norme
SGML 331
scurit 39
NotesMaster 303
Offset 230
OLB 320
Nper 152
OLE 321
NPV 152
Oleview 321
Null 117
O
Object 75
objet 171
onglet 354
onglet Dveloppeur
Office 2007 16
OpenDataAccessPage 243
Application 176
OpenForm 243
arborescence 176
OpenQuery 243
bibliothque 186
OpenReport 243
classe 187
OpenTable 243
collection 176
dfinition 172
OpenView 243
explorateur 186
oprateur 65
fonction 185
priorit 66
hirarchie 174
logique 96
instance 187
membres 187
optimisation 210
mthodes 177
Optional 166
proprits 177
OptionButton 353
Oct 151
Office
Options 194
proprit 195
OrderBy 248
OrderByOn 249
Office 2007
Outlook 283
dossier 287
onglet Dveloppeur 16
scurit 289
450
Formation VBA
sous-dossier 289
OutputTo 244
PrecisionAsDisplayed 224
Presentation
P
Page 240
Pages 239
PageSetup 226, 303
paramtre 127
objet 303
prsentation
PowerPoint 303
Presentations 301
collection 303
Preserve 90
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
PictureFormat 317
production 10
programmation
dfinition 3
erreur 401
vnementielle 250
POO 171
PopUp 249
jeu 276
langages 6
PowerPoint
niveaux 5
Application 301
phases de conception 8
VBA 173
451
Index
programme
Rate 153
arrt 109
Read 378
dbogage 309
ReadAll 378
dboguer 401
diteur 41
ReadOnly 224
modification 47
Recalc 249
suppression de lignes 49
RecentFiles 220
recherche-remplacement 395
Prompt 135
RecordCount 266
Fields 264
globale 192
rcursivit 288
Visible 252
Redim 90
Protect 227
Reference 240
ProtectContents 226
rfrence 258
ProtectionMode 226
ajout 212
Provider 263
References 239
Public 87
ReferenceStyle 220
publipostage 292
Refresh 249
Publisher 189
RefreshAll 224
PV 153
Repaint 249
QBColor 158
Reports 239
requte
raccourci clavier 21
Restore 244
RGB 158
Right 146
extension 201
Rnd 151
452
Formation VBA
Round 151
SetMenuItem 244
Row 230
SetShapesDefaultProperties 318
RowDifferences 232
SetWarnings 244
SGML 330
document 332
RTrim 146
norme 331
RunCommand 244
S
Save 224, 244, 304
SaveAs 224, 227, 305
SaveCopyAs 225, 305
objectif 333
Sgn 151
Shape
objet 315
Shapes
collection 311, 315
SaveLinkValues 224
Shell 158
ScaleHeight 318
Show 364
ScaleWidth 318
ShowAllRecords 244
ShowStartupDialog 301
Screen 240
ShowToolbar 245
Scripting.FileSystemObject 378
ShowToolTips 220
ScrollBar 354
Sin 151
Second 150
Skip 378
Seek 154
SkipLine 378
Slide
Select Case 99
plage de valeurs 100
objet 310
SlideID 311
SlideIndex 311
SlideMaster 304
SelectObject 244
SlideNumber 311
SendKeys 223
SlideRange
Set 378
SetFocus 249
collection 310
Slides 304
453
Index
collection 310
SYLK 386
SlideShowSettings 304
SlideShowTransition 311
syntaxe 7, 115
SlideShowWindow 304
System 195
SlideShowWindows 301
SLN 153
source
Tab 161
tableau 88
Space 146
dclaration 89
Spc 161
dplacement 29
SpecialCells 232
dynamique 90
SpinButton 354
lments 89
Split 159
insertion 181
SQL
slection 29
code 275
Tables 179
requte 267
TabStrip 354
Tan 151
Sqr 151
TemplateName 304
standardisation
TemplatesPath 220
Terminate 361
test 10
Str 146
conditionnel 91
StrComp 146
de performance 147
StrConv 146
plage de valeurs 95
stream 260
String 75, 79, 146, 156
tests conditionnel
imbrication 97
StrReverse 146
TextBox 353
Styles 224
TextFrame 317
Sub 44
TextStream 377
Switch 155
TextToColumns 233
SYD 153
ThisDocument 44
454
Formation VBA
ThisOutlookSession 293
Undo 250
ThisWorkbook 220
Unicode 204
Time 150
TimeLine 311
Until 116
TimeSerial 150
Update 265
TimeValue 150
title 143
UserName 220
Top 318
toupie 354
TransferDatabase 245
TransferSpreadsheet 245
TransferText 245
tri dichotomique 209
Trim 146
Val 151
Validation 230
Value 230, 362
Value2 230
variable 58
True 85, 92
affectation 60
twip 161
Type 318
caractre 79
type
conversion 155
date 76
erreur 155
type de donnes 73, 158
dclaration 60, 86
caractre 79
dclaration explicite 61
conversion 155
dclaration implicite 60
date 76
nom 59
numrique 80
numrique 80
objet 375
objet 375
Variant 82
type de donnes 73
TypeName 158
Variant 82
U
UBound 159
UCase 146
visibilit 85
Variant 75, 82, 147, 156
Null 117
VarType 158
455
Index
VBA 55
Width 318
Win32 387
histoire 55
WIN32API.TXT 389
programmation 173
syntaxe 57
prsentation 304
VbaProject.OTM 293
WindowState 301
Vcard 381
With 194
verrouillage 265
Word
Application 192
VerticalResolution 195
Document 196
virus 38
visibilit 85
Visible 220, 226, 249, 318
Visual Basic
aide en ligne 48
objet 376
Visual Basic Editor 41
Vrai 92
W
Wait 223
wdStory 206
WebOptions 240
WebPagePreview 305
Weekday 150
WeekdayName 150
Workbooks 220
Worksheet 225, 230
Worksheets 220, 224
Write 378
WriteBlankLines 378
WriteLine 378, 380
WriteReserved 224
Wend 112
While 112
diffrence avec Until 121
xlBuiltInDialog 221
imbrication 113
XLink 339
sortie 114
exemple 339
456
Formation VBA
Y-Z
Year 98, 150
zone de liste 353
zone de liste modifiable 353
zone de texte 353
3952_P_457_460
8/02/07
8:27
Page 460
Imprim en France
D. MANIEZ
Formation
Dominique Maniez
VBA
6637326
ISBN 978-2-10-050872-3
www.dunod.com
DOMINIQUE MANIEZ
a crit et traduit une
cinquantaine douvrages
dont la plupart traitent
des technologies
Microsoft.
Dveloppeur, journaliste
et universitaire,
il prne une conception
de linformatique proche
de lutilisateur, bannit
le jargon technique et
milite pour que la chose
informatique ne soit pas
la proprit exclusive
des informaticiens.
VBA
Formation
FORMATION
Dominique Maniez
VBA
Visual Basic pour Applications
pour Word, Excel,
PowerPoint, Access et Outlook