You are on page 1of 646

Microsoft®

EXCEL 2003
VBA
Curtis Frye
Wayne S. Freeze
et Felicia K. Buckingham

Adapté de l’anglais par :


Véronique Campillo
Véronique Warion
et Emmanuelle Burr
Les programmes figurant dans ce livre, et éventuellement sur la disquette ou le CD-ROM
d’accompagnement, sont fournis gracieusement sous forme de code source, à titre d’illustration.
Ils sont fournis en l’état sans garantie aucune quant à leur fonctionnement une fois compilés,
assemblés ou interprétés dans le cadre d’une utilisation professionnelle ou commerciale. Ils
peuvent nécessiter des adaptations et modifications dépendant de la configuration utilisée.
Microsoft Press ne pourra en aucun cas être tenu responsable des préjudices ou dommages de
quelque nature que ce soit pouvant résulter de l’utilisation de ces programmes.
Tous les efforts ont été faits pour fournir dans ce livre une information complète et exacte à la
date de la parution. Néanmoins, Microsoft Press n’assume de responsabilités ni pour son
utilisation, ni pour les contrefaçons de brevets ou atteintes aux droits de tierces personnes qui
pourraient résulter de cette utilisation.

Microsoft Internet Explorer, Windows et Excel sont soit des marques déposées, soit des
marques de Microsoft Corporation aux États-Unis ou/et d’autres pays.

Copyright 2005 by Microsoft Corporation.

Original English language edition Copyright © 2004 by Curtis Frye, Wayne S. Freeze and Felicia
K. Buckingham. All rights published by arrangement with the original publisher, Microsoft
Press, a division of Microsoft Corporation, Redmond, Washington, U.S.A.

Titre U.S. : MICROSOFT OFFICE EXCEL 2003 PROGRAMMING, INSIDE OUT


ISBN U.S. : 0 7356 1985 9

Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l’auteur


ou de ses ayants droit ou ayants cause est illicite selon le Code de la propriété intellectuelle
(Art L 122-4) et constitue une contrefaçon réprimée par le Code pénal. • Seules sont autorisées (Art
L 122-5) les copies ou reproductions strictement réservées à l’usage privé du copiste et non destinées
à une utilisation collective, ainsi que les analyses et courtes citations justifiées par le caractère
critique, pédagogique ou d’information de l’œuvre à laquelle elles sont incorporées, sous réserve,
toutefois, du respect des dispositions des articles L 122-10 à L 122-12 du même Code,
relatives à la reproduction par reprographie.

Édition et diffusion : Dunod


Distribution : Interforum
Traduction : Véronique Campillo, Véronique Warion, Emmanuelle Burr
Mise en page : IID
ISBN : 978 2 10 055217 7
Sommaire
À propos de ce livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .i
Exigences d’équipement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .i
Support technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .i
Conventions et signalétique de ce livre . . . . . . . . . . . . . . . . . . . . . .iii
Conventions de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
Conventions visuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii

Partie 1
Préliminaires
Chapitre 1
Les nouveautés d’Excel 2003 3
Utilisation des fonctions statistiques optimisées . . . . . . . . . . . . 3
Création de documents intelligents . . . . . . . . . . . . . . . . . . . . . . 6
Création d’espaces de travail intelligents . . . . . . . . . . . . . . . . . . 7
Mise en œuvre de la gestion des droits
relatifs à l’information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Comparaison de classeurs côte à côte . . . . . . . . . . . . . . . . . . . 8
Utilisation du volet Recherche . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Exploitation des fonctionnalités XML étendues . . . . . . . . . . . . . 10
Créer des listes Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Mapper des données Excel avec des schémas XML . . . . . 12
Publier des feuilles de calcul avec
les Compléments Office 2003 . . . . . . . . . . . . . . . . . . . . . 13
Chapitre 2
Tour d’horizon 15
Classeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Feuilles de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Cellules et plages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
L’interface Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Partie 2
Visual Basic pour Applications
Chapitre 3
Exploration de Visual Basic
pour Applications 29
Tour d’horizon de la programmation
orientée objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

i
Sommaire
Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Événements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Le travail avec les macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Enregistrer et afficher des macros . . . . . . . . . . . . . . . . . . 33
Exécuter une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Déboguer une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Mettre en œuvre la sécurité des macros
et des signatures numériques . . . . . . . . . . . . . . . . . . . . . 40
Chapitre 4
Démarrage de la programmation VBA 47
Introduction à Visual Basic Editor . . . . . . . . . . . . . . . . . . . . . . 47
Ouvrir Visual Basic Editor . . . . . . . . . . . . . . . . . . . . . . . . 47
Tour d’horizon de Visual Basic Editor . . . . . . . . . . . . . . . . 48
Personnaliser Visual Basic Editor . . . . . . . . . . . . . . . . . . 55
Gestion des fenêtres Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Gérer les fenêtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Ajouter du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Notes sur le style de programmation
et la lisibilité du code . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Développement de projets avec l’Explorateur de projets . . . . . . 62
Créer des modules VBA . . . . . . . . . . . . . . . . . . . . . . . . . 62
Supprimer des modules VBA . . . . . . . . . . . . . . . . . . . . . . 63
Copier des modules entre projets . . . . . . . . . . . . . . . . . . 64
Déclaration des variables, constantes et types de données . . . . 64
Déclarer des variables . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Définir les types de données . . . . . . . . . . . . . . . . . . . . . . 65
Définir les constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Gérer les chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Gérer les dates et les heures . . . . . . . . . . . . . . . . . . . . . 67
Gérer les variables Variant et convertir
des types de données . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Portée et durée de vie des variables . . . . . . . . . . . . . . . . 69
Assignation de valeurs aux variables . . . . . . . . . . . . . . . . . . . . 71
Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Créer un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Créer des tableaux multidimensionnels . . . . . . . . . . . . . . 73
Création de tableaux dynamiques . . . . . . . . . . . . . . . . . . . . . . 73
Écriture à l’écran et acceptation des entrées utilisateur . . . . . . 74
Créer une boîte de message . . . . . . . . . . . . . . . . . . . . . . 75
Créer une boîte de saisie . . . . . . . . . . . . . . . . . . . . . . . . 79
Définition de variables objet . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Création de types de données personnalisés . . . . . . . . . . . . . . 81
Commande With…End With . . . . . . . . . . . . . . . . . . . . . . 82
Contrôle de la progression du programme . . . . . . . . . . . . . . . . 82
Instructions de sélection. . . . . . . . . . . . . . . . . . . . . . . . . 82

ii
Sommaire
Boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Instruction GoTo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Chapitre 5
Création de procédures Sub et Function 95
Définition de procédures Sub . . . . . . . . . . . . . . . . . . . . . . . . . 95
Définir la portée d’une procédure Sub . . . . . . . . . . . . . . 101
Exécuter une procédure Sub à partir
d’une autre procédure . . . . . . . . . . . . . . . . . . . . . . . . . 103
Conserver les valeurs entre les appels de procédure . . . 108
Définition de procédures Function . . . . . . . . . . . . . . . . . . . . . 109
Créer une procédure Function . . . . . . . . . . . . . . . . . . . . 110
Exécuter des procédures Function . . . . . . . . . . . . . . . . . 111
Passer des arguments aux procédures. . . . . . . . . . . . . . 112
Passer des arguments nommés . . . . . . . . . . . . . . . . . . 114
Organisez votre réussite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Partie 3
Le modèle d’objet Excel
Chapitre 6
L’objet Application 119
Introduction à l’objet Application . . . . . . . . . . . . . . . . . . . . . . 120
Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Chapitre 7
Classeurs et feuilles de calcul 143
La collection Workbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Créer de nouveaux classeurs . . . . . . . . . . . . . . . . . . . . 143
Ouvrir des classeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Enregistrer des classeurs . . . . . . . . . . . . . . . . . . . . . . . 149
Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Imprimer et prévisualiser les classeurs . . . . . . . . . . . . . 162
Les collections Sheets et Worksheets . . . . . . . . . . . . . . . . . . 164
Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Méthodes des feuilles de calcul . . . . . . . . . . . . . . . . . . 172
Chapitre 8
Plages et cellules 179
Manipulations de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Localiser la plage active . . . . . . . . . . . . . . . . . . . . . . . . 179
Sélectionner une plage . . . . . . . . . . . . . . . . . . . . . . . . . 180

iii
Sommaire
Référencement des plages . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Référencer les plages de la feuille de calcul active . . . . . 184
Référencer les plages d’une feuille de calcul inactive . . . 185
Référencer les cellules d’une plage . . . . . . . . . . . . . . . . 185
Référencer des cellules avec la propriété Offset . . . . . . . 185
Définir une plage avec la propriété Cells. . . . . . . . . . . . . 189
Référencer des colonnes et des lignes. . . . . . . . . . . . . . 190
Référencer des groupes de cellules non contiguës . . . . . 190
Manipulation de groupes de cellules . . . . . . . . . . . . . . . . . . . 190
Dimensionner les cellules par programmation . . . . . . . . 190
Lier de deux plages . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Détecter les cellules vides . . . . . . . . . . . . . . . . . . . . . . 192
Plages nommées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Définir une plage nommée . . . . . . . . . . . . . . . . . . . . . . 194
Styles de notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Noms de plages réservés . . . . . . . . . . . . . . . . . . . . . . . 199
Copier des données entre des plages
et des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Validation des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

Partie 4
Fonctions VBA avancées
Chapitre 9
Manipulation des données avec VBA 211
Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Déterminer si la valeur d’une cellule est du texte . . . . . . 212
Préparer les données de chaîne pour le traitement . . . . . 214
Déterminer le nombre de caractères d’une chaîne . . . . . 215
Concaténer le texte de plusieurs cellules
ou variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Retourner le premier ou le dernier
caractère d’une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . 219
Retourner des caractères arbitraires d’une chaîne . . . . . 221
Retrouver une chaîne au sein d’une autre chaîne . . . . . . 221
Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Analyse des données . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Calculs financiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Dates et heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Numéros de série des dates et des heures . . . . . . . . . . 233
Fonctions de date et d’heure. . . . . . . . . . . . . . . . . . . . . 234
Chapitre 10
Mise en forme d’objets Excel 239
Constantes et palette de couleurs Excel . . . . . . . . . . . . . . . . 239
Palette de couleur Excel standard . . . . . . . . . . . . . . . . . 244
La palette de couleurs Excel et le web . . . . . . . . . . . . . . 247

iv
Sommaire
Éléments de la feuille de calcul . . . . . . . . . . . . . . . . . . . . . . . 250
Polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Cellules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Bordures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Chapitre 11
Création de macros complémentaires et de
compléments COM 259
Présentation des macros complémentaires . . . . . . . . . . . . . . 259
Boîte de dialogue Macro complémentaire. . . . . . . . . . . . . . . . 260
Installer une macro complémentaire . . . . . . . . . . . . . . . 261
Décharger une macro complémentaire . . . . . . . . . . . . . . 261
Création de macros complémentaires Excel . . . . . . . . . . . . . . 262
Créer une macro complémentaire . . . . . . . . . . . . . . . . . 262
Enregistrer la macro complémentaire . . . . . . . . . . . . . . . 263
Installer la macro complémentaire . . . . . . . . . . . . . . . . . 263
Collection AddIns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Tour d’horizon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
L’objet AddIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Création de compléments d’automatisation et COM . . . . . . . . 267
Interface IDTExtensibility2 . . . . . . . . . . . . . . . . . . . . . . . 268
Clés du registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Construction d’un complément d’automatisation
avec Visual Basic 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Concevoir le complément . . . . . . . . . . . . . . . . . . . . . . . 271
Entrées du registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Génération d’un complément COM
avec Visual Basic .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Exécuter l’assistant du complément partagé . . . . . . . . . 277
Modifier le modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Installer le complément . . . . . . . . . . . . . . . . . . . . . . . . 281
Chapitre 12
Événements 285
Activation et désactivation des événements . . . . . . . . . . . . . . 286
Événements Workbook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Événement Open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Événement Activate . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Événement Newsheet . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Événement BeforeSave . . . . . . . . . . . . . . . . . . . . . . . . . 291
Événement Deactivate . . . . . . . . . . . . . . . . . . . . . . . . . 292
Événement BeforePrint . . . . . . . . . . . . . . . . . . . . . . . . . 292
Événement BeforeClose . . . . . . . . . . . . . . . . . . . . . . . . 293
Événements Worksheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Événement Change. . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Événement SelectionChange . . . . . . . . . . . . . . . . . . . . . 297
Événement BeforeRightClick . . . . . . . . . . . . . . . . . . . . . 297

v
Sommaire
Événements Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Affiner la surveillance de l’événement Application . . . . . . 299
Détecter si un classeur est ouvert . . . . . . . . . . . . . . . . . 300
Chapitre 13
Manipulation des fichiers 303
Localisation des fichiers externes . . . . . . . . . . . . . . . . . . . . . 303
Retourner tous les fichiers . . . . . . . . . . . . . . . . . . . . . . 304
Limiter la recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Retrouver des fichiers avec la boîte
de dialogue FileDialog. . . . . . . . . . . . . . . . . . . . . . . . . . 314
Écriture dans un fichier externe . . . . . . . . . . . . . . . . . . . . . . . 317
Lecture dans un fichier externe . . . . . . . . . . . . . . . . . . . . . . . 319
Recherche d’une valeur dans un fichier . . . . . . . . . . . . . . . . . 320
Chapitre 14
Développement de modules de classes 323
Qu’est-ce qu’un objet ?. . . . . . . . . . . . . . . . . . . . . . . . . 323
Qu’est-ce qu’une classe ?. . . . . . . . . . . . . . . . . . . . . . . 323
Que sont les propriétés ? . . . . . . . . . . . . . . . . . . . . . . . 324
Que sont les méthodes ? . . . . . . . . . . . . . . . . . . . . . . . 324
Que sont les événements ? . . . . . . . . . . . . . . . . . . . . . 324
Introduction aux modules de classe. . . . . . . . . . . . . . . . . . . . 325
Accéder aux objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Déclarer des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Objets et Nothing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Objets avec plusieurs variables objet . . . . . . . . . . . . . . . 327
Propriétés, méthodes et événements. . . . . . . . . . . . . . . . . . . 328
Propriétés, méthodes et événements :
Public ou Private ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Événements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Construction d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Créer un module de classe . . . . . . . . . . . . . . . . . . . . . . 329
Définir les propriétés simples . . . . . . . . . . . . . . . . . . . . 330
Définir les routines de propriété . . . . . . . . . . . . . . . . . . 331
Définir des méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Définir des événements . . . . . . . . . . . . . . . . . . . . . . . . 334
Définir des variables, sous-routines
et fonctions privées . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Événements spéciaux pour les classes . . . . . . . . . . . . . 335
Résoudre des références . . . . . . . . . . . . . . . . . . . . . . . 336
Conception pratique d’une classe . . . . . . . . . . . . . . . . . . . . . 336
Une classe simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Étendre une classe simple . . . . . . . . . . . . . . . . . . . . . . 337

vi
Sommaire
Une classe de collection . . . . . . . . . . . . . . . . . . . . . . . . 338
Une classe avec des règles de métier . . . . . . . . . . . . . . 341

Partie 5
Manipulation des objets Excel
Chapitre 15
Graphiques 345
Tour d’horizon des graphiques . . . . . . . . . . . . . . . . . . . . . . . . 345
Créer des graphiques incorporés ou
des feuilles de graphique . . . . . . . . . . . . . . . . . . . . . . . 346
Définition du modèle d'objet Chart. . . . . . . . . . . . . . . . . 350
Manipulation des graphiques . . . . . . . . . . . . . . . . . . . . . . . . 351
Activer un graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Désactiver un graphique . . . . . . . . . . . . . . . . . . . . . . . . 354
Modifier une série de données . . . . . . . . . . . . . . . . . . . 355
Modifier un graphique pour utiliser
les données d’un tableau . . . . . . . . . . . . . . . . . . . . . . . 358
Définir les étiquettes du graphique . . . . . . . . . . . . . . . . 359
Mettre un graphique en forme . . . . . . . . . . . . . . . . . . . . 361
Modifier tous les graphiques d’un classeur . . . . . . . . . . 363
Imprimer des graphiques . . . . . . . . . . . . . . . . . . . . . . . 363
Réflexions sur la programmation des graphiques . . . . . . . . . . 364
Chapitre 16
Tableaux et graphiques croisés dynamiques 367
Tableaux et graphiques croisés dynamiques . . . . . . . . . . . . . . 367
Introduction aux tableaux croisés dynamiques . . . . . . . . 367
Créer un tableau croisé dynamique avec
l’Assistant Tableau et graphique croisés dynamiques . . . 370
Introduction aux graphiques croisés dynamiques . . . . . . 371
Créer un graphique croisé dynamique avec
l’Assistant Tableau et graphique croisés dynamiques . . . 372
Bases de données OLAP. . . . . . . . . . . . . . . . . . . . . . . . 373
Objets des tableaux croisés dynamiques . . . . . . . . . . . . . . . . 374
Collection PivotTables . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Objet PivotTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Collection PivotCaches . . . . . . . . . . . . . . . . . . . . . . . . . 378
Objet PivotCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Objets PivotField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Objet PivotItem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Programmation de tableaux croisés dynamiques. . . . . . . . . . . 384
Créer un tableau croisé dynamique . . . . . . . . . . . . . . . . 384
Créer un graphique croisé dynamique . . . . . . . . . . . . . . 386
Manipulation par programmation des tableaux
croisés dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Faire pivoter un tableau croisé dynamique . . . . . . . . . . . 387

vii
Sommaire
Réinitialiser la position d’origine . . . . . . . . . . . . . . . . . . 389
Enregistrer et restaurer des positions . . . . . . . . . . . . . . 389
Chapitre 17
Barres de commandes 393
Identification des différentes parties
du système de menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Collection CommandBars . . . . . . . . . . . . . . . . . . . . . . . 394
Objets CommandBar. . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Lister les objets CommandBar. . . . . . . . . . . . . . . . . . . . 398
Ajouter une barre de commandes flottante . . . . . . . . . . . 399
Supprimer une barre de commandes . . . . . . . . . . . . . . . 400
Contrôles des barres de commandes. . . . . . . . . . . . . . . . . . . 400
Collection CommandBarControls . . . . . . . . . . . . . . . . . . 400
Objet CommandBarControl . . . . . . . . . . . . . . . . . . . . . . 402
Contrôles de boutons . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Créer des barres d'outils . . . . . . . . . . . . . . . . . . . . . . . 406
Contrôles de zone de liste modifiable . . . . . . . . . . . . . . 407
Utiliser une zone de liste modifiable . . . . . . . . . . . . . . . 408
Contrôles de menu contextuel . . . . . . . . . . . . . . . . . . . . 409
Afficher un menu contextuel . . . . . . . . . . . . . . . . . . . . . 409
Ajouter des éléments à un menu existant. . . . . . . . . . . . 411
Chapitre 18
Personnalisation des boîtes de dialogue 413
Affichage des boîtes de dialogue existantes . . . . . . . . . . . . . . 414
Modification des boîtes de dialogue existantes. . . . . . . . . . . . 418
Explorer la collection Dialogs. . . . . . . . . . . . . . . . . . . . . 419
Passer des arguments aux boîtes
de dialogue existantes . . . . . . . . . . . . . . . . . . . . . . . . . 423
Planification avec des boîtes de dialogue . . . . . . . . . . . . . . . . 424
Chapitre 19
Création de feuilles UserForm 425
Création d’une feuille UserForm . . . . . . . . . . . . . . . . . . . . . . 425
Ajouter un objet UserForm. . . . . . . . . . . . . . . . . . . . . . . 425
Concevoir un objet UserForm. . . . . . . . . . . . . . . . . . . . . 426
Modifier un objet UserForm . . . . . . . . . . . . . . . . . . . . . . 427
Propriétés d’un objet UserForm . . . . . . . . . . . . . . . . . . . 428
Afficher un objet UserForm . . . . . . . . . . . . . . . . . . . . . . 429
Contrôles UserForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Programmer les contrôles . . . . . . . . . . . . . . . . . . . . . . . 431
Propriétés, méthodes et événements. . . . . . . . . . . . . . . 432
Contrôle Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Contrôle CommandButton . . . . . . . . . . . . . . . . . . . . . . . 435
Contrôle TextBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Contrôle CheckBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

viii
Sommaire
Contrôle ToggleButton. . . . . . . . . . . . . . . . . . . . . . . . . . 438
Contrôle SpinButton . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Contrôle Frame. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Contrôle OptionButton . . . . . . . . . . . . . . . . . . . . . . . . . 440
Contrôle Image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Contrôle ScrollBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Contrôle ListBox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Contrôle ComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Contrôle RefEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Contrôle TabStrip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Contrôle Multipage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Chapitre 20
Création de feuilles UserForm avancées 449
Récupération de l’information . . . . . . . . . . . . . . . . . . . . . . . . 449
Tour d’horizon de l’application . . . . . . . . . . . . . . . . . . . . 449
Concevoir une feuille . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Afficher les données . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Parcourir la feuille de calcul . . . . . . . . . . . . . . . . . . . . . 456
Modifier les données . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Ajouter des données. . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Valider les données . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Afficher la feuille UserForm . . . . . . . . . . . . . . . . . . . . . . 462
Conception d’un assistant à plusieurs étapes . . . . . . . . . . . . 463
Tour d’horizon de l’application . . . . . . . . . . . . . . . . . . . . 463
Gérer les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Construire la feuille UserForm . . . . . . . . . . . . . . . . . . . . 466
Parcourir les pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Collecter les options de l’assistant . . . . . . . . . . . . . . . . 469
Synthétiser les options . . . . . . . . . . . . . . . . . . . . . . . . . 472
Exécuter l’assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

Partie 6
Excel et le monde extérieur :
une collaboration simplifiée
Chapitre 21
Excel et les autres applications Office 477
Démarrage d’une autre application . . . . . . . . . . . . . . . . . . . . 477
Activation d’une autre application . . . . . . . . . . . . . . . . . . . . . 481
Liaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Liaison dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Liaison statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Interaction avec d’autres applications Office. . . . . . . . . . . . . . 487
Ouvrir un document dans Word . . . . . . . . . . . . . . . . . . . 490
Accéder à un document Word actif. . . . . . . . . . . . . . . . . 492

ix
Sommaire
Créer un nouveau document Word . . . . . . . . . . . . . . . . . 493
Contrôler Excel à partir d’autres applications Office . . . . 495
Conjugaison des talents . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Chapitre 22
Excel et SQL 499
Comparaison des tableurs et des bases de données . . . . . . . 499
Concepts essentiels des bases de données. . . . . . . . . . 500
Clés de base de données . . . . . . . . . . . . . . . . . . . . . . . 501
Accéder aux bases de données à partir d’Excel . . . . . . . 502
Manipulation des bases de données avec SQL . . . . . . . . . . . . 503
L’instruction Select. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Instructions Select simples . . . . . . . . . . . . . . . . . . . . . . 504
Extraire des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Trier les lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Utilisation de plusieurs tables . . . . . . . . . . . . . . . . . . . . 508
Fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
L’instruction Insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Utiliser l’instruction Insert. . . . . . . . . . . . . . . . . . . . . . . 511
L’instruction Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
L’instruction Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Chapitre 23
Introduction à ADO 515
Le modèle d'objet ADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Utiliser le modèle d'objet ADO. . . . . . . . . . . . . . . . . . . . 516
L’objet Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Principales propriétés et méthodes
de l’objet Connection . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Se connecter à différents systèmes
de gestion de base de données . . . . . . . . . . . . . . . . . . 519
Utiliser la collection Errors . . . . . . . . . . . . . . . . . . . . . . 520
Utiliser l’objet Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
L’objet Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Principales propriétés et méthodes de l’objet Command . 522
Utiliser la collection Parameters . . . . . . . . . . . . . . . . . . 523
Utiliser l’objet Parameter . . . . . . . . . . . . . . . . . . . . . . . 524
L’objet Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Principales propriétés et méthodes de l’objet Recordset . 525
Utiliser la collection Fields . . . . . . . . . . . . . . . . . . . . . . 529
Utiliser l’objet Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Chapitre 24
Programme Excel Query 531
Tour d’horizon du programme Excel Query . . . . . . . . . . . 531
Configurer le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
Initialiser le programme . . . . . . . . . . . . . . . . . . . . . . . . 533

x
Sommaire
Terminer le programme . . . . . . . . . . . . . . . . . . . . . . . . . 535
Connexion à une base de données . . . . . . . . . . . . . . . . . . . . 535
Initialiser la feuille DBInfo . . . . . . . . . . . . . . . . . . . . . . . 537
Changer les fournisseurs de la base de données . . . . . . 538
Sélectionner l’authentification Windows . . . . . . . . . . . . . 538
Enregistrer les informations . . . . . . . . . . . . . . . . . . . . . 539
Édition d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Exécution d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Récupérer les informations . . . . . . . . . . . . . . . . . . . . . . 542
Construire une chaîne de connexion . . . . . . . . . . . . . . . 543
Récupérer la requête . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Exécuter une requête . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Copier des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Utilisation du programme Excel Query . . . . . . . . . . . . . . . . . . 550
Configurer les informations de connexion . . . . . . . . . . . . 550
Saisir une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Exécuter la requête . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Chapitre 25
Excel et le web 553
HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Enregistrer une feuille de calcul en tant
que page web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Publier une feuille de calcul sur le web. . . . . . . . . . . . . . 557
Des pages web interactives. . . . . . . . . . . . . . . . . . . . . . 560
Exploitation de l'Internet comme source de données . . . . . . . 562
Ouvrir des pages web en tant que classeurs . . . . . . . . . 563
Utiliser les requêtes Web . . . . . . . . . . . . . . . . . . . . . . . 564
Analyser les pages web à la recherche
d’informations spécifiques . . . . . . . . . . . . . . . . . . . . . . 567
Exploitation de l'Internet pour publier des résultats . . . . . . . . 568
Configurer un serveur web. . . . . . . . . . . . . . . . . . . . . . . 568
Enregistrer des feuilles de calcul
en tant que pages web . . . . . . . . . . . . . . . . . . . . . . . . . 569
Ajouter l’interactivité avec les composants Web . . . . . . . 570
Communiquer avec un serveur web . . . . . . . . . . . . . . . . 572
Exploitation des solutions Internet avec Excel. . . . . . . . . . . . . 573
Chapitre 26
Excel et XML 575
Introduction aux listes de données . . . . . . . . . . . . . . . . . . . . 575
Créer des listes de données par programmation. . . . . . . 577
Création de schémas XML . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Création de fichiers de données XML . . . . . . . . . . . . . . . . . . . 585
Ajout manuel de XML à un classeur . . . . . . . . . . . . . . . . . . . . 587
Importer manuellement des données XML . . . . . . . . . . . 589
Ajout de XML à une feuille de calcul par programmation . . . . . 590

xi
Sommaire
Mapper un schéma sur une feuille de calcul
par programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Mapper des éléments de schéma sur des cellules
avec XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594

Index 601

xii
À propos de ce livre

Les exemples ayant servi à la réalisation de ce livre ont été publiés en ligne sur le
site web de Dunod, que vous trouverez à l’adresse www.dunod.fr. Lancez une
recherche sur le titre du présent ouvrage (Excel 2003 VBA) pour accéder à ces
contenus.

Exigences d’équipement
Voici les exigences minimales d’équipement informatique pour exécuter les
exercices de ce livre :
● Microsoft Windows XP ou version ultérieure, ou Windows 2000 Professio-
nal avec le service pack 3 ou version ultérieure
● Processeur 266 MHz ou plus, compatible Pentium
● RAM 64 Mo (mégaoctets)
● Lecteur de CD-ROM 8X ou vitesse supérieure
● Carte son et haut-parleurs compatibles Microsoft Windows
● Microsoft Internet Explorer 5.01 ou version ultérieure
● Souris Microsoft ou autre périphérique de pointage compatible

Remarque Ces exigences sont des minima. Pour exploiter certains complé-
ments mis à disposition sur le site web en accompagnement de ce livre, vous
devrez pouvoir disposer d’un matériel plus performant. Prenez connaissance
des pré-requis indiqués pour chaque complément ou outil dans la page de télé-
chargement.

Support technique
Malgré tous les soins apportés à la réalisation de cet ouvrage et de son contenu
d’accompagnement, il se peut que des erreurs nous aient échappées et nous vous
invitons à nous en faire part (en anglais) à l’adresse www.microsoft.com/mspress/
support/.
Pour vous relier directement à la Base de connaissances Microsoft afin d’y poser
une question précise, rendez-vous sur le site www.microsoft.com/mspress/sup-
port/search.asp.
Pour de plus amples informations concernant Windows XP, consultez le Support
technique Microsoft sur le web à l’adresse support.microsoft.com/.

i
Conventions et signalétique
de ce livre
Dans ce livre, nous avons adopté un certain nombre de conventions de texte et de
mise en forme destinées à faciliter la prise de connaissance des informations qu’il
contient.

Conventions de texte
Convention Signification
Commandes de menu abrégées Pour des raisons pratiques, ce livre décrit les procédures
de manière abrégée. Par exemple, « Cliquez sur Outils,
Suivi des modifications, Afficher les modifications »
signifie que vous devez cliquer sur le menu Outils, puis
pointer sur Suivi des modifications et cliquer sur la
commande Afficher les modifications.
Caractères gras Les caractères gras sont employés pour indiquer le texte
à saisir au clavier.
Capitalisation Les premières lettres des noms de menus, boîtes de
dialogue, options et commandes sont en majuscules.
Exemple : la boîte de dialogue Enregistrer sous.
Caractères en italique Les italiques sont utilisés pour les termes nouveaux.
Signe plus (+) dans le texte Les raccourcis clavier sont indiqués par un signe plus (+)
séparant deux noms de touches. Par exemple,
CTRL+ALT+SUPPR signifie que vous devez appuyer
simultanément sur les touches CTRL, ALT et SUPPR.

Conventions visuelles
Au Quotidien
Cet encadré vous donne un exemple du type de contenu que vous serez sus-
ceptible d’y rencontrer à la lecture de cet ouvrage.

Nous vous livrons ici des informations approfondies sur ce qui se passe au
niveau du logiciel, comment fonctionne une caractéristique et ce qu’elle fait.
Vous y trouverez des astuces et des solutions pratiques pour gérer les problè-
mes logiciels.

iii
Microsoft Excel 2003 VBA

Astuce Les astuces contiennent des informations utiles, permettant de


gagner du temps, ou des procédures alternatives liées à la tâche décrite par
ailleurs.

Dépannage
Cet encadré vous donne un exemple type de dépannage.

Recherchez ces encadrés pour trouver des solutions à des problèmes couram-
ment rencontrés. Ils sont placés à proximité des descriptions ou procédures
susceptibles de nécessiter un dépannage.

Des références croisées vous renvoient à d’autres parties du livre pour des informations
supplémentaires concernant les sujets abordés.

Attention Ces rubriques identifient les problèmes auxquels vous devez être
attentif pendant la réalisation d’une tâche ou que vous devez résoudre avant
de l’accomplir

Remarque Les remarques contiennent un complément d’information quant à


la tâche en cours de description.

Encadré
Ces encadrés simples vous donnent des informations annexes sur le sujet
abordé. Vous en apprendrez plus en matière de technologie ou de fonctionna-
lité.

iv
Partie 1
Préliminaires
1 Les nouveautés d’Excel 2003 3

2 Tour d’horizon 15

1
Partie 1 : Préliminaires

Chapitre 1
Les nouveautés
d’Excel 2003
Utilisation des fonctions Mise en œuvre de la gestion des
statistiques optimisées . . . . . . . . . 3 droits relatifs à l’information. . . . . 7
Création de documents Comparaison de classeurs
intelligents . . . . . . . . . . . . . . . . . . . 6 côte à côte . . . . . . . . . . . . . . . . . . 8
Création d’espaces de travail Utilisation du volet Recherche . . . 8
intelligents . . . . . . . . . . . . . . . . . . . 7 Exploitation des fonctionnalités
XML étendues . . . . . . . . . . . . . . . 10

Microsoft Excel existe depuis 1985, il n’est donc pas étonnant que les éléments de
base des feuilles de calculs du programme soient restés similaires. Ceci dit, il est
toujours possible d’améliorer un produit et Microsoft Office Excel 2003 bénéfice
d’une palette de fonctionnalités nouvelles qui rendent la collecte et le transfert
des données, ainsi que la collaboration, bien plus efficaces que dans les versions
antérieures. L’essentiel des améliorations apportées à Excel 2003 repose sur l’uti-
lisation de XML (Extensible Markup Language), un système de balisage textuel
souple qui permet de décrire le contenu d’une feuille de calcul de façon que les
données qu’elle contient puissent être gérées automatiquement et non pas
manuellement. Cela vous permet de gagner du temps et d’éviter les inévitables
erreurs associées à la saisie ou aux copies multiples de données. Excel 2003 inclut
également une suite de fonctions statistiques améliorées, qui sont beaucoup plus
précises que dans les versions antérieures du programme.

Utilisation des fonctions statistiques


optimisées
La plupart des utilisateurs d’Excel n’iront jamais au-delà de quelques formules
relativement simples, associées à des mises en forme standards, pour présenter
des informations commerciales et financières. Mais les scientifiques, les univer-
sitaires et certains experts travaillant en entreprise ont besoin de ces fonctions
statistiques avancées et de fonctions leur apportant une grande précision.
L’équipe des programmeurs Excel a modifié la manière dont le programme cal-
cule les résultats et ce, pour un grand nombre de fonctions statistiques. Cela a
permis d’optimiser la précision des résultats et de les rendre nettement plus inté-
ressants pour les utilisateurs avancés. Le tableau 1.1 vous donne la liste de ces
fonctions optimisées et les décrit une à une.

3
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA

Tableau 1-1. Fonctions statistiques améliorées


Chapitre 1

LOI.BINOMIALE Détermine la probabilité qu’un nombre défini de tentatives


vrai/faux, où chaque tentative a une chance égale de
générer un résultat vrai ou faux, donne exactement un
nombre spécifié de réussites (par exemple, exactement cinq
lancers de pièce sur dix vont donner un résultat de cinq
faces).
KHIDEUX.INVERSE Trouve la valeur qui se rapproche le plus du résultat d’une
distribution khi-deux.
INTERVALLE.CONFIANCE Retourne une valeur que vous pouvez employer pour
construire un intervalle de confiance pour une moyenne de
population.
CRITERE.LOI.BINOMIALE Détermine à quel moment le nombre d’échecs dans une
série de tentatives vrai/faux excède un critère (par exemple,
plus de 5 pour cent d’ampoules fabriquées ne fonctionnent
pas).
BDECARTYPE Estime l’écart-type des valeurs d’une colonne en ne prenant
en considération que les valeurs correspondant à un critère.
BDECARTYPEP Calcule l’écart-type des valeurs d’une colonne à partir de
toutes les valeurs présentes dans la colonne.
BDVAR Estime la variance des valeurs d’une colonne ou d’une liste
en ne prenant en considération que les valeurs
correspondant à un critère.
BDVARP Calcule la variance des valeurs d’une colonne à partir de
toutes les valeurs présentes dans la colonne.
INVERSE.LOI.F Retourne la valeur qui générerait un résultat cible à partir
d’un test F (test de variabilité entre deux jeux de données).
PREVISION Calcule les valeurs futures en fonction d’une série de
valeurs temporelles existantes.
LOI.GAMMA.INVERSE Retourne la valeur que générerait un résultat donné à
l’issue d’un jeu de données présentant une distribution
gamma (c’est-à-dire biaisée).
CROISSANCE Prédit la croissance exponentielle d’une série de données.
LOI.HYPERGEOMETRIQUE Retourne la probabilité de sélectionner un nombre exact
d’un type donné d’éléments à partir d’un jeu d’objets
mélangé. Par exemple, il y a 20 billes dans une boîte, dont
6 sont rouges. Si vous choisissez trois billes, quelle est
votre probabilité de récupérer exactement une bille rouge ?
ORDONNEE.ORIGINE Calcule le point auquel une droite va entrer en intersection
avec l’axe des y.

4
Partie 1 : Préliminaires

Les nouveautés d’Excel 2003

Tableau 1-1. Fonctions statistiques améliorées (Suite)

Chapitre 1
DROITEREG Génère une ligne qui correspond au plus près à un jeu de
données en générant un tableau de valeurs bidimensionnel
pour décrire la ligne.
LOGREG Génère une courbe qui correspond au plus près à un jeu de
données en générant un tableau de valeurs bidimensionnel
pour décrire la courbe.
LOI.LOGNORMALE.INVERSE Retourne le logarithme inverse d’une valeur dans une
distribution.
LOI.LOGNORMALE Retourne le nombre d’écarts-types duquel une valeur
s’éloigne de la moyenne dans une distribution logarithmique
normale.
LOI.BINOMIALE.NEGATIVE Retourne la probabilité qu’un nombre donné d’échecs se
produise avant un nombre donné de réussites dans une
distribution binomiale.
LOI.NORMALE Retourne le nombre d’écarts-types duquel une valeur
s’éloigne de la moyenne dans une distribution normale.
LOI.NORMALE.INVERSE Retourne une valeur reflétant la probabilité qu’une valeur
aléatoirement choisie dans une distribution se situe au
dessus de ladite valeur dans la distribution.
LOI.NORMALE.STANDARD Retourne une distribution normale standard, avec une
moyenne de 0 et un écart-type de 1.
LOI.NORMALE.STANDARD.IN Retourne une valeur reflétant la probabilité qu’une valeur
VERSE aléatoirement choisie dans une distribution normale
standard se situe au dessus de ladite valeur dans la
distribution.
PEARSON Retourne une valeur reflétant la force de la relation linéaire
entre deux jeux de données.
POISSON Retourne la probabilité de survenue d’un certain nombre
d’événements, compte tenu d’une distribution Poisson.
ALEA Génère une valeur aléatoire.
COEFFICIENT.DETERMINATIO Retourne le carré du coefficient Pearson de deux jeux de
N valeurs.
PENTE Retourne l’inclinaison d’une ligne.
ECARTYPE Évalue l’écart-type d’un jeu de données numériques à partir
d’un échantillon des données.
STDEVA Évalue l’écart-type d’un jeu de données (qui peut inclure du
texte et des valeurs vrai/faux) à partir d’un échantillon des
données.
ECARTYPEP Calcule l’étart-type d’un jeu de données numériques.
STDEVPA Calcule l’écart-type d’un jeu de données (qui peut inclure du
texte et des valeurs vrai/faux).

5
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA

Tableau 1-1. Fonctions statistiques améliorées (Suite)


Chapitre 1

ERREUR.TYPE.XY Retourne l’erreur-type prévisible pour la valeur y pour


chaque valeur x d’une régression.
LOI.STUDENT.INVERSE Retourne une valeur T en fonction d’une probabilité établie
et de degrés de liberté.
TENDANCE Retourne des valeurs ventilées sur une ligne de tendance.
VAR Évalue la variance d’un échantillon de données.
VAR.P Calcule la variance d’une population de données.
VARPA Calcule la variance d’une population de données, qui peut
inclure du texte et des valeurs vrai/faux.
TEST.Z Retourne la probabilité que la moyenne d’un échantillon de
données soit supérieure à la moyenne observée des don-
nées du jeu.

Création de documents intelligents


Les classeurs Excel ont toujours été doués d’interaction avec les autres docu-
ments Office, mais ces interactions sont restées quelque peu limitées. Si la créa-
tion de liens avec des données du web ou d’autres documents Office sont des
aptitudes intéressantes, le classeur Excel n’en était pas moins un bloc de données
isolé. Avec Office 2003, les documents intelligents sont des documents Office qui
possèdent des métadonnées (des données qui informent le document sur ce qu’il
est). Les métadonnées sont des informations qui indiquent comment les données
s’insèrent dans un processus métier, permettant au document d’effectuer des
actions programmées en fonction du contexte.
Prenons un exemple. Vous travaillez dans une société de services techniques qui
utilise un modèle Excel pour suivre le temps passé sur chaque projet. Vous allez
sans doute créer un nouveau classeur (avec une feuille de calcul) en début de
semaine, l’enregistrer avec vos informations d’identification, et le compléter avec
le temps travaillé à la fin de chaque journée. Ensuite, arrivé à la fin de la semaine,
vous enregistrez le classeur dans un dossier en réseau ou l’envoyez par courriel à
votre responsable administratif. Par différence, les documents intelligents con-
tiennent du code capable de compléter les informations relatives à votre « carte
de pointage » et à la façon dont votre temps de travail s’ajuste au processus de
l’activité. Lorsque vous créez un nouveau classeur « carte de pointage », Excel
vous reconnaît et complète vos informations personnelles (nom, numéro
d’employé, projets, etc.). Puis lorsque vous avez terminé votre travail de la
semaine, le document intelligent affiche un bouton qui vous permet d’envoyer le
classeur à la prochaine étape du processus. Et en ce qui vous concerne, peu
importe le mécanisme employé pour relayer les données. Celles-ci peuvent aller
se placer dans une base de données, être enregistrées dans une feuille de calcul
quelque part sur le réseau, être incorporées aux données d’un serveur BizTalk
chargé du suivi des flux d’activité, ou être envoyées en pièce jointe d’un message
Outlook adressé à votre responsable administratif.

6
Partie 1 : Préliminaires

Les nouveautés d’Excel 2003

Création d’espaces de travail intelligents

Chapitre 1
Le nombre de documents nécessitant l’intervention de plusieurs personnes aug-
mente jour après jour. Par exemple, lorsque vous estimez le coût d’un important
projet, vous avez besoin d’informations de tous les membres de votre équipe
pour déterminer les produits et les composants à prendre en considération. Sans
parler de la somme des tâches administratives qu’il vous faut fournir pour gérer
le projet en interne. Le partage et la fusion de classeurs permettent de récupérer
les informations éparses, mais ce sont des tâches épineuses. Il suffit que l’un de
vos collaborateurs ajoute ou modifie son mot de passe sur son exemplaire du
classeur pour que vous ne puissiez plus inclure ses modifications dans la fusion.
Or si vous exploitez Excel 2003 en conjonction avec Microsoft Windows Share-
Point Services, vous pouvez optimiser le processus de coopération, de modifica-
tion et de vérification des classeurs en créant un espace de travail intelligent. Un
espace de travail intelligent est un espace de travail virtuel créé sur un site Share-
Point. Il permet aux personnes munies du droit d’accès au classeur de travailler
sur une copie de celui-ci sur le serveur SharePoint ou sur une copie locale
qu’elles peuvent actualiser en ajoutant les changements survenus au niveau de
l’exemplaire principal stocké dans l’espace de travail. Une fois que vous avez créé
l’espace de travail et donné à chacun des membres de votre équipe l’accès à cette
portion du site, ceux-ci pourront travailler sur le même exemplaire du classeur.
Toute modification enregistrée dans un exemplaire quelconque du document
devient disponible pour chaque membre de l’équipe. Si les modifications créent
des conflits, vous-même, en tant qu’administrateur, pouvez trancher quant aux
changements à valider. Vous pouvez également vous servir du volet Espace de
travail partagé pour créer et administrer l’espace de travail intelligent.

Remarque On peut utiliser les espaces de travail intelligents avec Microsoft


Office Word 2003, Excel 2003, PowerPoint 2003 et Visio 2003.

Mise en œuvre de la gestion des droits


relatifs à l’information
Dans le domaine du numérique, l’un des problèmes les plus difficiles à résoudre
est celui de la surveillance de l’accès aux informations. Les mots de passe, les
comptes et autres restrictions d’accès permettent de décider des personnes habi-
litées à lire les fichiers d’un ordinateur ou d’un réseau, mais une fois qu’un fichier
non protégé a quitté son périmètre de sécurité, n’importe qui peut le copier et le
diffuser à sa guise. Les nouvelles fonctionnalités IRM (Information Rights Mana-
gement, gestion des droits relatifs à l’information) d’Office 2003 permettent de
préserver la confidentialité de vos informations en limitant les personnes habili-
tées à voir et modifier vos fichiers. Par ailleurs, les administrateurs réseau peu-
vent créer des stratégies qui vous permettent de définir des permissions au
niveau des utilisateurs pour limiter l’accès aux contenus. Ainsi, les utilisateurs
qui d’une manière ou d’une autre, parviennent à mettre la main sur des copies

7
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


non autorisées de vos fichiers ne parviendront pas pour autant à jeter un œil sur
votre budget prévisionnel de l’année prochaine. Les utilisateurs autorisés mais
Chapitre 1

qui ne disposent pas encore d’Office 2003 ou version ultérieure sur leur ordina-
teur pourront exploiter les visionneuses de fichiers pour lire les documents, mais
ils ne pourront pas les modifier.

Remarque IRM (Information Rights Management) n’est disponible que dans


Microsoft Office Professional Edition 2003, Word 2003, Excel 2003 et Power-
Point 2003.

Comparaison de classeurs côte à côte


Une autre fonctionnalité intéressante d’Excel 2003 consiste à pouvoir faire défi-
ler deux fenêtres simultanément de manière à pouvoir en comparer les contenus.
À mesure que vous faites défiler les cellules de données, des motifs apparaissent
qui vous permettent souvent de relever des différences à l’œil nu. Ces différences
deviennent encore plus visibles lorsque vous utilisez les formats conditionnels
ou le suivi des modifications pour afficher les cellules de données dans un format
différent de celui du reste des données. Pour activer cette nouvelle fonction, il
vous suffit d’ouvrir deux classeurs à comparer et de cliquer sur Fenêtre, Compa-
rer en côte à côte avec.

Utilisation du volet Recherche


Excel 2003 comporte également plusieurs outils supplémentaires de recherche
qui vous aident à trouver des informations en provenance de nombreuses sour-
ces différentes. Affichez le volet Recherche en cliquant sur Affichage, Volet Office
et si nécessaire, en cliquant sur Autres volets Office (en haut du volet des tâches)
puis sur Rechercher. Une fois que vous avez affiché le volet Recherche, vous pou-
vez taper un mot ou un groupe de mots dans la zone Rechercher. Il est également
possible de sélectionner des ouvrages de référence. Ensuite, cliquez sur le bouton
Démarrer la recherche (la flèche verte à droite de la zone de recherche) pour affi-
cher les informations trouvées. La figure 1.1 présente le volet Recherche avec une
sélection d’ouvrages de référence que vous pouvez consulter.

8
Partie 1 : Préliminaires

Les nouveautés d’Excel 2003

Chapitre 1
f01pr01.eps

Figure 1-1. Vous pouvez rechercher des synonymes, des mots dans une
encyclopédie et traduire des mots en langues étrangères à l’aide des outils du
volet Recherche.

Astuce Rechercher le contenu d’une cellule


Pour lancer une recherche sur le contenu d’une cellule dans les ouvrages de
référence du volet Recherche, maintenez enfoncée la touche ALT et cliquez sur
la cellule contenant le texte voulu.

Au bas du volet Recherche, cliquez sur les liens pour actualiser les outils de
recherche installés sur votre ordinateur, comme les thésaurus et les dictionnaires.
Vous disposez également d’un lien vers Office Marketplace. Office Marketplace
est une ressource du site web de Microsoft qui recense tous les services par abon-
nement vers lesquels vous pouvez vous tourner lorsque les informations du volet
Recherche ne vous apportent pas ce dont vous avez besoin. Parmi ces ressources,
vous trouverez la eLibrary, qui vous donne accès à 13 millions de documents
multimédias, dont des photographies et des cartes, qui sont collectées dans les
journaux publiés à travers le monde entier, ainsi que plus de 450 000 profils
d’entreprise extraits de la collection Thomson Company Profiles. Y sont recen-
sées 300 000 sociétés nord-américaines. Vous y trouverez également des compa-
ratifs par secteur d’activité, des informations concernant les parts de marché, les
classements, ainsi que des actualités extraites de plus de 2 500 périodiques diffé-
rents.

9
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA

Exploitation des fonctionnalités XML


Chapitre 1

étendues
Le changement le plus notable d’Excel 2003 est sans doute la prise en charge
optimisée de XML (Extensible Markup Language). À la différence du langage
HTML (Hypertext Markup Language), qui permet de décrire l’apparence des
données sur le web, XML permet de décrire la structure des données. Par exem-
ple, un tableau HTML contenant les résultats des ventes d’une société est parfai-
tement compréhensible par toute personne qui l’observerait avec attention. Mais
le serveur qui présente ces données et le client qui les réceptionne pour le compte
de son utilisateur sont des machines qui n’ont pas la moindre idée du type de
données transmis. Or avec un fichier XML, les machines deviennent capables de
reconnaître qu’elles transportent des données de ventes et partant de là, les
gèrent de la manière appropriée. XML est pris en charge depuis Excel 2002, mais
on ne pouvait qu’ouvrir et enregistrer des classeurs au format Feuille de calcul
XML. C’était intéressant, mais loin de constituer une aptitude pleine et entière.

Remarque Toutes les fonctionnalités nouvelles décrites dans cette section


sont disponibles uniquement dans Microsoft Office 2003 Édition Profession-
nelle. Les utilisateurs des autres éditions peuvent seulement enregistrer et
ouvrir des classeurs XML, comme c’était déjà le cas dans Excel 2002.

Créer des listes Excel


De nombreux outils avancés d’Excel fonctionnent sur des listes, qui sont des pla-
ges de cellules étalées sur une ou plusieurs colonnes et dans lesquelles chaque
colonne prend un intitulé. Dans Excel 2002 et versions antérieures, les listes
étaient un peu hasardeuses lorsqu’il s’agissait de générer des tableaux croisés
dynamiques, de trier des données ou de créer un filtre automatique. Vous cli-
quiez sur une cellule quelconque de la plage et choisissiez l’élément de menu cor-
respondant à ce que vous vouliez faire. Si Excel ne parvenait pas à déterminer des
limites de plage, qu’il n’identifiait pas un intitulé dans l’une ou l’autre colonne, le
résultat était bancal. Avec Excel 2003, les listes sont devenues des entités bien
définies que vous créez en choisissant Données, Liste, Créer une liste. Les com-
mandes de la boîte de dialogue Créer une liste vous permettent de définir la zone
occupée par la liste.

Remarque Si vous sélectionnez les cellules de votre liste avant d’effectuer


cette opération, la plage apparaît automatiquement dans la boîte de dialogue.

Lorsque vous créez une liste, il se passe plusieurs choses.


● Une bordure apparaît autour de la liste. Vous pouvez faire glisser cette bor-
dure pour redimensionner la liste.

10
Partie 1 : Préliminaires

Les nouveautés d’Excel 2003


● Les contrôles de filtrage automatique apparaissent dans les cellules
d’intitulé ; vous pouvez vous en servir pour sélectionner les modalités

Chapitre 1
d’affichage des données dans la liste.
● Une ligne d’insertion apparaît, matérialisée par un astérisque. Comme
dans une table Access ou un formulaire de saisie Excel, vous pouvez com-
pléter la ligne d’insertion et appuyer sur ENTRÉE pour ajouter les données
au reste de la liste et générer une nouvelle ligne d’insertion.
● La barre d’outils Liste apparaît ; elle contient des boutons utiles pour la
gestion des listes.
● Vous avez la possibilité d’afficher une ligne de total au bas de la liste en cli-
quant sur le bouton Afficher/Masquer la ligne Total dans la barre d’outils
Liste. L’opération par défaut effectuée dans la ligne de total consiste à faire
la somme du contenu de la colonne, mais vous pouvez cliquer dans
n’importe quelle cellule de la ligne de total pour lui appliquer d’autres opé-
rations.
Une fois la liste créée (comme dans l’exemple de la figure 1.2), vous pouvez tra-
vailler sur la liste en tant qu’entité propre au sein de votre feuille de calcul. Par
exemple, vous pouvez filtrer les données, créer un tableau croisé dynamique ou
ajouter de nouvelles lignes à la liste. Quelle que soit la tâche choisie, Excel décale
le contenu de la feuille de calcul situé autour de la liste afin de faire de la place à
la nouvelle entrée (comme par exemple en ajoutant une ligne vierge après la sai-
sie d’une nouvelle ligne). Si vous travaillez en réseau avec SharePoint Services,
vous pouvez publier la liste sur le serveur, actualiser les données de la liste en uti-
lisant l’exemplaire publié sur le site SharePoint ou modifier un exemplaire de la
liste sur un ordinateur non connecté au réseau et intégrer les modifications lors
de la reconnexion. Les outils de validation des données plus avancés de Share-
Point sont également à votre disposition pour limiter les types de données que
vous –ou vos collaborateurs– pouvez saisir dans les listes publiées. Dans Excel,
vous pouvez obliger les utilisateurs à saisir des données numériques, mais sur un
serveur SharePoint, vous pouvez être encore plus spécifique quant aux types de
données, en obligeant les utilisateurs à ne saisir, par exemple, que des valeurs
entières.

11
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


Chapitre 1

Figure 1-2. Les listes de données optimisent votre capacité à créer et afficher
des collections de données dans Excel 2003.

Mapper des données Excel avec des schémas XML


Les structures de données XML sont définies dans un schéma, qui est stocké dans
Excel dans un fichier .xsd. Le code XML qui suit montre comment vous pouvez
construire un schéma partiel pour stocker des données d’article.

Ce code XML n’est pas une macro que vous pouvez exécuter avec l’Éditeur Microsoft
Visual Basic. Il se contente de décrire un produit possédant trois attributs.

<xs:complexType name="productType">
<xs:sequence>
<xs:element name="productId" type="xs:string" />
<xs:element name="productName" type="xs:string" />
<xs:element name="priceEach" type="xs:decimal" />
</xs:sequence>
</xs:complexType>

Ce schéma indique à Excel d’identifier trois éléments de données pour une struc-
ture de données appelée productType : productId, productName et priceEach. La
déclaration complexType nomme la structure de données, tandis que les déclara-
tions de définition des éléments vous donnent le nom des éléments et le type de
données attendu (dans ce cas, il s’agit d’une chaîne ou d’une valeur décimale).
En outre, la déclaration <xs:sequence> indique à Excel d’identifier les éléments
exactement dans cet ordre à chaque fois.

12
Partie 1 : Préliminaires

Les nouveautés d’Excel 2003

Publier des feuilles de calcul avec les Compléments


Office 2003

Chapitre 1
Techniquement, les Compléments Office 2003 font partie de la suite Office et pas
seulement d’Excel 2003. Ils incluent plusieurs composants permettant de publier
des pages web capables de se comporter comme des feuilles de calcul. Ils permet-
tent de publier sur le web des feuilles de calcul, des graphiques et des bases de
données. Un autre composant, le Data Access Component, présente des fonctions
d’accès à des bases de données pour les listes.

13
Partie 1 : Préliminaires

Chapitre 2
Tour d’horizon
Classeurs . . . . . . . . . . . . . . . . . . . 15 L’interface Excel . . . . . . . . . . . . . 20
Feuilles de calcul . . . . . . . . . . . . . 16 Formules . . . . . . . . . . . . . . . . . . . 24
Cellules et plages. . . . . . . . . . . . . 18

Si la programmation dans Microsoft Office Excel 2003 vous intéresse, vous maî-
trisez probablement la disposition de base d’un classeur Excel et manipulez avec
aisance les classeurs, feuilles de calcul, données et formules.
Mais, si la création de scénarios n’a plus de secret pour vous, si vous connaissez
le nombre de couleurs utilisables dans un classeur Excel et si vous savez com-
ment Excel vous assiste dans la création des formules, n’hésitez pas à lire directe-
ment le chapitre suivant.

Classeurs
Le classeur constitue l’unité de base de l’organisation dans Excel. Dans la hiérar-
chie Microsoft Office, un classeur Excel est l’équivalent d’un document Word,
d’une base de données Access ou d’une présentation PowerPoint. À l’instar des
sections dans les documents, des tables dans les bases de données et des diapora-
mas dans les présentations, les classeurs Excel hébergent un ensemble de feuilles
qui contiennent des données ainsi que d’autres objets Excel. Excel 2003 supporte
les quatre types de feuilles suivants, mais vous exploiterez essentiellement les
deux premiers :
● Feuilles de calcul ;
● Feuilles de graphique ;

● Feuilles de macros Excel 4.0 (également appelées fichiers XML) ;

● Feuilles de dialogue Excel 5.0 (une méthode pour créer une boîte de dialo-
gue personnalisée).
Il n’est plus possible de créer des fichiers XML ou des feuilles de dialogue, mais
Excel 2003 permet d’ouvrir des fichiers Excel 4.0 ou 5.0 sans aucune perte de
fonctionnalité. Si vous travaillez dans une entreprise qui exploite les mêmes clas-
seurs de base depuis longtemps, la capacité de Excel 2003 à travailler avec
d’anciens fichiers atténue la transition entre les anciens et les nouveaux classeurs.
Les nouveaux classeurs Excel contiennent par défaut trois feuilles de calcul. Pour
modifier cette valeur, dans le menu Outils, choisissez Options, cliquez sur

15
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


l’onglet Général et tapez une valeur dans la zone Nombre de feuilles de calcul par
nouveau classeur.

Astuce Limitez le nombre de feuilles de calcul à une.


Si vous prévoyez de créer un nombre important de modèles (un modèle étant
un classeur contenant une seule feuille de calcul), optez pour une feuille de
calcul par classeur par défaut jusqu’à ce que vous ayez terminé la création des
modèles.

Pour parcourir les feuilles de calcul d’un classeur, servez-vous des commandes
Chapitre 2

de la barre d’onglets qui se trouve dans l’angle inférieur gauche de la fenêtre


Excel. Chaque feuille de calcul possède son propre onglet (intitulés Feuil1, Feuil2
et Feuil3, par défaut). Cliquez sur un onglet pour afficher la feuille correspon-
dante. Si vous cliquez droit sur un onglet, vous affichez un menu contextuel
hébergeant les commandes pour insérer une nouvelle feuille, renommer ou sup-
primer la feuille sélectionnée, déplacer ou copier des feuilles ou modifier la cou-
leur de l’onglet de la feuille sélectionnée. La possibilité de modifier la couleur de
l’onglet, introduite dans Excel 2002, offre un moyen pratique pour désigner une
feuille à laquelle vous avez apporté des modifications, mettre en évidence une
feuille par rapport à une autre (pour une feuille récapitulative, par exemple) et
simplifier la navigation au sein du classeur.

Important Excel vous impose toutefois une limite de 56 couleurs par clas-
seur. Cette limite ne comprend pas les couleurs utilisées dans les graphiques
incorporés ou liés à un classeur : si vous devez afficher un graphique com-
plexe, comprenant plus de 56 couleurs, commencez par créer le graphique,
puis exportez-le avec sa légende dans un programme dédié et modifiez-le ainsi
que sa légende. Ensuite, affichez le graphique et sa légende dans des fichiers
graphiques séparés ou incorporez le nouveau fichier dans le classeur.

Feuilles de calcul
Des quatre types de base de feuilles présents dans Excel, les feuilles de calcul sont
de loin les plus couramment exploitées. Elles contiennent des cellules, organisées
en lignes et colonnes, où vous stockez les données et créez des formules pour
synthétiser ces données. Comme le montre le tableau 2.1, les feuilles de calcul
Excel possèdent au maximum 256 colonnes et 65 536 lignes. Si vous travaillez
avec des jeux de données plus importants, comme ceux générés par des expé-
riences scientifiques ou un système de suivi des transactions dans une entreprise
de vente intensive, vous serez contraint d’écrire les données dans un fichier texte
que vous diviserez en sections gérables ou d’utiliser une application plus puis-
sante, adaptée aux besoins de l’entreprise pour analyser les données.

16
Partie 1 : Préliminaires

Tour d’horizon

Tableau 2-1. Les feuilles de calcul Excel peuvent contenir


nombre de données, mais elles possèdent leurs limites
Attribut Limite
Nombre maximum de lignes 65 536
Nombre maximum de colonnes 256
Largeur de colonne 255 caractères
Hauteur de ligne 409 points
Nombre maximum de sauts de page 1000

Chapitre 2
Nombre maximum de scénarios Pas de maximum, mais le récapitulatif
des scénarios en affiche 251 au
maximum
Nombre maximum de changements de 32
cellule dans un scénario
Nombre maximum de changements de 200
cellule dans le Solveur

Le scénario, qui permet de définir des jeux de données alternatifs dans une feuille
de calcul, est sans nul doute l’une des fonctionnalités les moins exploitées dans
Excel. Comme vous avez pu le noter dans le tableau 2.1, chaque scénario peut
contenir jusqu’à 32 changements. Les scénarios possèdent plusieurs avantages :
ils sont rapides à définir (cliquez sur Outils, Gestionnaire de scénarios et servez-
vous des commandes de la boîte de dialogue illustrée par la figure 2.1) et permet-
tent de basculer entre différents jeux de données sans qu’il soit nécessaire de
créer une nouvelle feuille de calcul contenant les données théoriques. Si vous
créez une nouvelle feuille de calcul contenant 12 valeurs, dont trois changent, les
scénarios ne vous feront guère économiser de temps. En revanche, si vous tra-
vaillez sur une grande plage de valeurs (ou des combinaisons de valeurs) chan-
geantes et que vous ne voulez pas créer une feuille de calcul différente pour
chaque combinaison possible, vous pouvez créer un scénario pour chaque com-
binaison et basculer de l’un à l’autre au sein de la même feuille de calcul.

Figure 2-1. La boîte de dialogue Gestionnaire de scénarios permet de gérer et


de présente des jeux de données alternatifs.

17
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA

Si vous devez créer un scénario contenant plus de 32 changements, vous devrez créer un
nouveau classeur pour héberger les données.

Cellules et plages
Dans Excel, la cellule, formée par l’intersection d’une colonne et d’une ligne dans
une feuille de calcul, constitue le bas de la hiérarchie organisationnelle. Une cel-
lule contient une valeur ou une formule. Par défaut, Excel affiche le résultat de la
formule. Pour modifier ce paramètre, dans le menu Outils, cliquez sur Options
Chapitre 2

puis sur l’onglet Affichage et cochez la case Formules. Remarquez que la formule
s’affiche toujours dans la barre des formules, que les formules soient ou non affi-
chées dans les cellules. Optez pour l’un ou l’autre affichage en fonction de la pré-
sentation souhaitée.

Remarque Si vous optez pour l’affichage des formules en lieu et place de


leurs résultats, la barre d’outils Audit de formules s’affiche. Elle présente des
boutons qui permettent d’identifier les cellules utilisées dans les formules, de
visualiser les changements de valeurs dans les cellules spécifiques et de par-
courir les formules calcul après calcul pour éliminer toute erreur.

Une fois les données saisies, vous définissez leur mise en forme. La barre d’outils
Mise en forme, affichée par défaut, accueille une palette de boutons qui permet-
tent de modifier l’apparence de base des données, comme afficher le contenu de
la cellule en gras ou dans une police différence. Toutefois, pour bénéficier d’un
contrôle plus précis sur l’apparence des données, dans le menu Format, choisis-
sez Cellule pour afficher la boîte de dialogue de la figure 2.2. Dans la boîte de dia-
logue Format de cellule, vous modifiez l’orientation du texte dans la cellule,
ajustez la taille de la cellule au contenu existant sans déborder ou ajoutez des
bordures. Il est toutefois facile d’abuser de la mise en forme. Rappelez-vous tou-
jours que l’objectif d’une feuille de calcul Excel est de simplifier la lecture des
données et non de créer une œuvre d’art.

18
Partie 1 : Préliminaires

Tour d’horizon

Chapitre 2
Figure 2-2. Servez-vous des commandes de la boîte de dialogue Format de
cellule pour présenter vos données.

Vous pouvez traiter les cellules individuellement ou en groupes. Pour modifier la


mise en forme d’un groupe de cellules, il vous suffit de sélectionner les cellules et
d’effectuer les modifications. Pour utiliser les valeurs d’un groupe de cellules
dans une formule, vous procédez de manière similaire. Par exemple, vous tapez
la formule =SOMME() dans une cellule, placez le point d’insertion entre les
parenthèses puis sélectionnez les cellules à employer dans la formule. À mesure
que vous sélectionnez les cellules, les références des cellules sont insérées dans la
formule. Selon cet exemple, si vous sélectionnez les cellules C3 à C24, vous obte-
nez la formule =SOMME(C3:C24). En outre, à l’instar de Excel 2002, vous pou-
vez sélectionner un groupe de cellules non contiguës en maintenant enfoncée la
touche CTRL. Par exemple, si vous tapez =SOMME() dans une cellule, placez le
point d’insertion entre les parenthèses, sélectionnez les cellules C3 à C24, main-
tenez la touche CTRL enfoncée en sélectionnant la cellule C26, vous obtenez la
formule suivante =SOMME(C3:C24, C26).

Important Lorsque vous créez une formule, si vous appuyez sur la touche
ENTRÉE avant d’avoir terminer la formule, vous obtenez une erreur. Tapez
=SOMME( puis sélectionnez les cellules à inclure avant de taper la paren-
thèse fermante.

Lorsque vous travaillez avec un grand nombre de feuilles de calcul et de formules


ou si vous devez transmettre un classeur que vous avez créé à un collègue, il n’est
guère pratique d’utiliser les références de cellule pour désigner les valeurs
employées dans une formule. Au lieu de ces obscures références, créez des plages
nommées (souvent appelées simplement noms) pour simplifier la lecture des for-
mules. Par exemple, sur une feuille de calcul hébergeant les ventes de plusieurs
catégories de produits, vous pouvez créer une plage nommée par catégorie et
créer une formule comme =SOMME(Machines,Logiciel,Consultation) au lieu
de =SOMME(C3:C24,D3:D24,E3:E24).
La méthode la plus rapide pour créer une plage nommée consiste à sélectionner
les cellules de la plage, à cliquer sur la zone Nom, qui se trouve à l’extrémité gau-

19
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


che de la barre de formule et à taper le nom de la plage (la zone Nom est la zone
de la barre de formule qui affiche l’adresse de la cellule sélectionnée).

Pour utiliser des plages existantes, dans le menu Insertion, choisissez Nom, Défi-
nir pour afficher la boîte de dialogue Définir un nom (voir figure 2.3), dans
laquelle vous pouvez ajouter ou supprimer des plages.
Chapitre 2

Figure 2-3. Utilisez la boîte de dialogue Définir un nom pour gérer vos plages
nommées.

Pour connaître les cellules qu’englobe la plage nommée, cliquez sur la flèche
orientée vers le bas qui se trouve à l’extrémité droite de la zone Nom et cliquez
sur le nom de la plage.

L’interface Excel
Un excellent tableur n’est d’aucune utilité si l’on ne trouve pas ce que l’on cher-
che. Les concepteurs d’Excel ont développé l’organisation et l’apparence de
l’interface Excel pour permettre aux utilisateurs de tirer profit au mieux de leurs
classeurs. La figure 2.4 montre la fenêtre Excel présentant les éléments clés de
l’interface Excel.

Au Quotidien
Au démarrage, Excel exploite le système de menus adaptatifs qui affiche uni-
quement les commandes les plus employées, ce qui vous oblige à survoler le
bas du menu avec le pointeur de la souris pour le développer dans son intégra-
lité. En théorie, l’idée est intéressante, mais pour la majorité des utilisateurs
qui ne maîtrisent pas le programme elle constitue plutôt un obstacle. Vous
pouvez, et devriez, désactiver le système de menus adaptatifs. Pour ce faire,
dans le menu Outils, choisissez Personnaliser et sur l’onglet Options, cochez
la case Toujours afficher les menus dans leur intégralité.

20
Partie 1 : Préliminaires

Tour d’horizon

Chapitre 2
Figure 2-4. L’interface Excel permet d’accéder rapidement aux diverses
fonctionnalités du programme.

Barre de titre. La barre de titre se trouve dans la partie supérieure de la fenêtre


Excel et présente le nom du programme (Microsoft Excel) suivi éventuel-
lement du nom du classeur actif. Si des restrictions d’accès s’appliquent au
classeur actif ou s’il est partagé, son nom est suivi d’une désignation entre
crochets. Si vous avez ouvert plusieurs copies du même classeur, le premier
nom est suivi de 1, le deuxième de 2 et ainsi de suite.
Bouton Sélectionner tout. Le bouton Sélectionner tout constitue l’outil de base
par excellence et se trouve à gauche de l’en-tête de la Colonne A et au-des-
sus de l’en-tête de la Ligne 1. Cliquez dessus pour sélectionner toutes les
cellules de la feuille de calcul.
Barres de commandes. Les barres de menus et les barres d’outils sont différen-
tes, mais elles fonctionnent de la même manière. Choisir la commande
Enregistrer du menu Fichier revient à cliquer sur le bouton Enregistrer de
la barre d’outils, alors pourquoi deux systèmes, en plus du raccourci cla-
vier CTRL+S ? Parce que chaque utilisateur a sa méthode favorite.
Barre de formule. Excel présente la formule de la cellule active dans la barre de
formule, la longue bande blanche qui se trouve au-dessus des en-têtes de
colonnes de la feuille de calcul. Si la cellule active ne contient pas de for-
mule, la barre de formule contient sa valeur. Pour masquer la barre de for-
mule, dans le menu Affichage, choisissez Barre de formule. Il s’agit d’une
commande bascule, autrement dit, vous cliquez pour l’activer et cliquez à
nouveau pour la désactiver.
Zone Nom. La zone Nom représente l’élément le plus polyvalent de l’interface
Excel. Si vous avez créé une plage nommée, comme nous l’avons décrit

21
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


plus tôt dans ce chapitre, vous pouvez sélectionner une plage en cliquant
sur la flèche pointant vers le bas, qui se trouve à droite de la zone Nom et
cliquer sur le nom de votre choix pour la sélectionner (cette action encadre
les cellules de la plage nommée). Si vous n’avez pas sélectionné de plage
nommée, la zone Nom contient la référence de la cellule active (par exem-
ple, A1) ou la zone sélectionnée par glisser-déplacer. Par exemple, si vous
sélectionnez une zone de trois lignes par dix colonnes, la zone Nom affiche
3L × 10C jusqu’à ce que vous relâchiez le bouton de la souris, puis elle
indique la référence de la cellule qui se trouve dans l’angle supérieur gau-
che de la plage sélectionnée.
Chapitre 2

Remarque Il est intéressant de connaître les dimensions exactes de la zone


sélectionnée si vous devez coller un groupe de cellules provenant d’une autre
feuille de calcul dans la feuille de calcul actuelle.

Commandes de la fenêtre du programme. Les commandes de programme Win-


dows standard se trouvent dans la partie supérieure droite de la fenêtre
Excel : le bouton Réduire, le bouton Restaurer la fenêtre, le bouton Agran-
dir (qui s’affiche lorsque la fenêtre a été redimensionnée) et le bouton Fer-
mer.
Commandes de la fenêtre du classeur. Ces boutons fonctionnent exactement de
la même manière que les commandes de la fenêtre du programme, excep-
tés qu’ils affectent le classeur actif (la fenêtre Excel conserve la taille qu’elle
avait au moment où on a cliqué sur les boutons).
Zone Tapez une question. Cette zone constitue la méthode la plus rapide pour
rechercher des rubriques dans le système d’aide Excel. Tapez un mot ou
une phrase dans la zone Tapez une question et appuyez sur Entrée pour
afficher une liste de rubriques d’aide dans le volet Résultats de la recherche
qui se trouve à droite du classeur. Cliquez sur le nom d’une rubrique pour
l’afficher.
Volets Office. Introduits dans Excel 2002, les volets Office sont des interfaces
équipées de liens permettant d’effectuer les tâches courantes dans un cer-
tain nombre de domaines. Les volets Office s’affichent sur le bord droit de
la fenêtre Excel lorsque vous effectuez certaines tâches (par exemple, si
vous cliquez sur Fichier, Nouveau, vous affichez le volet Nouveau clas-
seur). Vous pouvez également afficher les volets Office par le biais du menu
Affichage en choisissant Volet Office. Voici les volets Office disponibles
dans Excel 2003 :
■ Image clipart. Ce volet propose des liens pour rechercher des clips
dans la Bibliothèque multimédia, permet d’organiser les clips enre-
gistrés et d’obtenir de l’aide sur des rubriques relatives aux clips.
■ Presse-papiers. Le volet Office Presse-papiers constitue le nouvel
emplacement du Presse-papiers Office. Il peut contenir jusqu’à
24 éléments copiés ou coupés.

22
Partie 1 : Préliminaires

Tour d’horizon
■ Récupération de document. Si Excel subit une défaillance alors
qu’un classeur est ouvert, le volet Office Récupération de document
s’affiche lorsque vous ouvrez à nouveau Excel. Vous pourrez choisir
entre récupérer les versions les plus récentes du classeur ou récupé-
rer le classeur avec la dernière Récupération automatique du fichier.
■ Mises à jour du document. Exploité avec les services SharePoint, ce
volet permet de gérer les modifications apportées aux classeurs pla-
cés dans un espace de travail partagé.
■ Accueil. Le volet Office Accueil héberge les liens permettant

Chapitre 2
d’ouvrir un fichier récemment employé, de créer un nouveau clas-
seur ou de se connecter au site web Microsoft Office Online.
■ Aide. Le volet Office Aide contient des liens vers les communautés
du support Microsoft, des informations d’aide, des formations
Microsoft Office et les nouveautés d’Excel 2003.
■ Nouveau classeur. Le volet Office Nouveau classeur permet d’utili-
ser les modèles pour créer un nouveau classeur, de rechercher des
modèles de classeurs sur votre ordinateur ou sur le site Microsoft
Office Online et de créer un classeur vide.
■ Rechercher. Le volet Office Rechercher contient des liens vers une
gamme d’outils de recherche permettant de localiser des mots et des
phrases. Il existe des dictionnaires et des dictionnaires de synony-
mes dans plusieurs langues, ainsi qu’un utilitaire de « traduction »
qui permet de trouver des termes correspondants en anglais, portu-
gais et italien entre autres.
■ Résultats de la recherche. Le volet Résultats de la recherche permet
d’effectuer une recherche dans le système d’aide, sur Micro-
soft.com, sur le site de support Office ou d’exploiter des outils de
recherche avec un mot ou une phrase que vous saisissez.
■ Espace de travail partagé. Le volet Office Espace de travail partagé,
qui fait également partie du nouveau support Excel 2003 pour les
services SharePoint, contient un ensemble de liens hypertexte que
vous pouvez exploiter pour créer et gérer des espaces de travail au
sein desquels vous et vos collègues pouvez collaborer sur un docu-
ment partagé.
■ Source XML. Le volet Office Source XML contient un ensemble
d’outils qui permettent d’assigner une structure XML à une feuille
de calcul pour que vous puissiez échanger des données XML avec
vos collègues et clients.
Barre d’onglets. La barre d’onglets contient un onglet par feuille de calcul. Pour
naviguer de feuille en feuille, servez-vous des flèches de la barre d’onglets ;
pour afficher une feuille en particulier ou modifier la couleur de l’onglet,
cliquez sur l’onglet.
Barre d’état. Comme l’indique son nom, la barre d’état Excel présente l’état du
programme. Elle indique si une sauvegarde ou une sauvegarde automati-

23
Partie 1 : Préliminaires

Microsoft Excel 2003 VBA


que est en cours, elle affiche le total en cours des valeurs des cellules sélec-
tionnées et vous indique, entre autres choses, si les majuscules sont
verrouillées, si le défilement est verrouillé et/ou si la touche VERR NUM est
active sur votre clavier.

Au Quotidien
La fonction opération récapitulative est quelque peu méconnue mais elle offre
une méthode fort pratique d’additionner rapidement quelques cellules de don-
nées dans Excel. Si vous sélectionnez plusieurs cellules, la barre d’état pré-
Chapitre 2

sente la somme des données dans une zone qui se trouve à gauche de
l’indicateur du verrouillage du pavé numérique. L’addition constitue l’opération
récapitulative par défaut. Pour changer ce paramètre, cliquez droit dans la
zone qui contient le résultat et, dans le menu contextuel, choisissez Moyenne,
Compteur, Chiffres (autrement dit, le nom de cellules dans la sélection qui con-
tiennent une valeur numérique), Maximum, Minimum ou Somme. Pour désac-
tiver la fonctionnalité, cliquez sur Aucun. Pour l’activer à nouveau, cliquez droit
dans la zone de la barre d’état et sélectionnez la nouvelle opération.

Formules
Excel est un programme de stockage des données extrêmement puissant, mais
son principal atout réside dans la synthèse des données. Il permet de créer des
formules qui exploitent et récapitulent les valeurs contenues dans les classeurs.
Les formules peuvent être simples, par exemple, afficher la valeur d’une cellule
dans une autre cellule (par exemple, =A1 affiche la valeur de la cellule A1 dans la
cellule qui héberge la formule) ou extrêmement complexes et contenir des don-
nées provenant de plusieurs milliers de cellules.
Dans Excel 2003, lorsque vous saisissez une formule dans une cellule, Excel
reconnaît la fonction et affiche les paramètres attendus sous la forme d’une info-
bulle d’argument. Par exemple, si vous saisissez =RECHERCHEV(, Excel affiche
une info-bulle d’argument contenant RECHERCHEV(valeur_cherchée;
table_matrice; no_index_col; [valeur_proche]). Le premier paramètre à saisir, la
désignation de la cellule ou la valeur de valeur_cherchée, apparaît en gras jusqu’à
ce que vous saisissiez le paramètre, suivi d’un point-virgule. Après avoir tapé le
point-virgule, qui indique que vous avez terminé de saisir la valeur du paramè-
tre, le nom du paramètre suivant s’affiche en gras.

Astuce Dans l’info-bulle d’argument qui s’affiche lorsque vous tapez une for-
mule, vous pouvez cliquer sur le nom d’un paramètre pour lequel vous avez
déjà saisi une valeur pour la modifier.

L’aide à la création de formules ne se limite toutefois pas aux info-bulles d’argu-


ment. Si vous n’êtes pas sûr de la fonction à employer pour générer un résultat,
dans le menu Insertion, choisissez fonction ou cliquez sur le bouton Insérer une

24
Partie 1 : Préliminaires

Tour d’horizon
fonction qui se trouve à l’extrême droite de la barre de formule pour afficher la
boîte de dialogue Insérer une fonction (voir figure 2.5). Cette boîte de dialogue
liste toutes les fonctions disponibles par catégorie et, si vous cliquez sur une
fonction, vous affichez une description de son action ainsi que les arguments
attendus. Si vous double-cliquez sur le nom de la formule, une boîte de dialogue
secondaire s’affiche pour vous aider à créer la formule pas à pas.

Chapitre 2
Figure 2-5. La boîte de dialogue Insérer une fonction permet de trouver une
fonction et vous guide dans le processus de création.

25
Partie 2
Visual Basic pour
Applications
3 Exploration de Visual Basic
pour Applications 29

4 Démarrage de
la programmation VBA 47

5 Création de procédures
Sub et Function 95

27
Partie 2 : Visual Basic pour Applications

Chapitre 3
Exploration de Visual Basic
pour Applications
Tour d’horizon de la Le travail avec les macros. . . . . . 33
programmation orientée objet. . . 29

Ce chapitre vous montre comment fonctionnent les macros dans le contexte de


Microsoft Office Excel 2003. La seconde partie de ce chapitre explique comment
enregistrer les macros, mais commençons par le commencement : que se passe-
t-il lorsque vous créez une macro ? Pour rester brefs, disons que VBA (Visual
Basic pour Applications) voit Excel comme une série d’objets qui ont des attri-
buts descriptifs et des actions qu’ils savent exécuter. Dans le chapitre 1, « Les
nouveautés d’Excel 2003 », vous avez découvert quelques éléments de base que
vous retrouverez lors de l’utilisation et la programmation d’Excel ; ce chapitre
poursuit l’analyse en vous montrant de quelle manière les langages de program-
mation orientés objet exposent leurs éléments, et comment manipuler ces objets
avec l’enregistreur de macros.

Tour d’horizon de la programmation


orientée objet
À la base, un programme informatique n’est autre qu’un jeu d’instructions
qu’un ordinateur exécute dans un ordre spécifié. Dans Excel, cet ordre peut
changer en fonction du contenu de la feuille de calcul sur laquelle travaille le pro-
gramme, mais il subsiste un principe fondamental des langages de
programmation : si vous alimentez un programme avec un même jeu de don-
nées, vous obtenez toujours le même résultat.
Les langages de programmation de première génération étaient procéduraux ; les
programmeurs concevaient un algorithme, ou procédure, que le programme
devait suivre, et définissaient des variables (sortes de conteneurs de valeurs) au
fur et à mesure de leur travail. À mesure que les programmes gagnaient en com-
plexité, il devenait de plus en plus important de pouvoir nommer les variables de
manière descriptive. S’il est aisé de créer une variable nommée prix pour stocker
le prix d’un produit mis en vente dans un magasin, il est difficile d’écrire un pro-
gramme extensible capable de conserver la trace de tous les prix dans le cadre
d’un stock en perpétuel changement. Car il faudrait créer une nouvelle variable
chaque fois que l’on veut commercialiser un nouveau produit. Or ce n’est pas
bien compliqué si cela se produit une ou deux fois par jour, mais si vous dévelop-

29
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


pez beaucoup de programmes et que vous voulez gagner du temps en créant du
code réutilisable, il vous faut organiser le code autour des éléments constitutifs de
votre environnement. Les programmeurs utilisant les langages procéduraux ten-
taient de résoudre le problème en représentant les éléments de leurs environne-
ments par des types de données abstraits. Ces derniers sont des ensembles de
caractéristiques et opérations qui reflètent les valeurs et les actions associées à
quelque chose que vous avez besoin de représenter dans un programme (un pro-
duit, par exemple). Par exemple, une jardinerie peut avoir un rayon couvert et
une pépinière et il est possible d’associer les produits commercialisés à l’empla-
cement qui leur correspond. Le type de donnée abstrait produit peut prendre des
valeurs reflétant son nom, sa catégorie, son prix, son fournisseur, une descrip-
tion et ainsi de suite. Il est cependant important de savoir que le fait de définir un
type de donnée abstrait pour représenter un produit ne crée pas d’emplacement
où conserver ses valeurs et les actions qui lui sont associées. Il vous faut en effet
créer une instance du type de donnée abstrait pour y stocker les données et les
actions associées à la nouvelle marque d’engrais que vous venez de mettre en
vente dans la partie couverte de votre jardinerie. Cette instance doit avoir un
identifiant unique au sein du système, comme par exemple produit001, et le pro-
Chapitre 3

gramme est censé savoir que le nom du produit, sa catégorie, son prix, sa des-
cription et son fournisseur sont autant d’éléments liés à ce produit spécifique.
Les types de données sont pratiques pour définir des jeux de variables dans un
programme, mais la structure sous-jacente des langages de programmation qui
travaillent avec des types de données abstraits reste procédurale car il peut exister
des routines résidant à l’extérieur des types abstraits. Avec un langage orienté
objet, tous les aspects de votre code sont basés sur les éléments de votre environ-
nement. Ces « éléments », on ne s’étonnera point qu’ils soient représentés par
des objets, et que toutes les actions et données soient encapsulées dans ces fameux
objets. Dans Excel, ces objets peuvent être des classeurs, des feuilles de calcul, des
plages de cellules, ou des fichiers externes. En règle générale, vous pouvez déve-
lopper un programme en vous penchant sur quatre aspects qui caractérisent les
objets :
● les propriétés ;
● les méthodes ;
● les événements ;
● les collections.

Propriétés
En un mot comme en cent, les propriétés sont des variables qui décrivent un
aspect de l’objet dans lequel elles se trouvent. Pour les objets Excel, le Nom
(Name) est une propriété courante ; elle détient la valeur d’identification que
vous ou Excel avez assigné aux classeurs, feuilles de calcul, plages de cellules, ou
objets autres. Si vous modifiez le nom d’une feuille de calcul, que ce soit par le
biais de code VBA ou en cliquant droit sur l’onglet de la feuille de calcul, puis en
cliquant sur Renommer, avant de modifier la valeur, vous apportez un change-

30
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


ment à la valeur stockée dans la propriété Name. Il est des propriétés que vous
pouvez modifier directement (c’est le cas de Name). Mais pour d’autres proprié-
tés de classeur, vous devez entreprendre une action par le biais de l’interface
Excel (par exemple, protéger une plage de cellules) ou par le biais d’une méthode
(voir plus loin dans ce chapitre).
Dans VBA, on référence les propriétés dans un programme par une notation avec
point, où le nom de l’objet apparaît en première position, le nom de la propriété
vient ensuite et les deux composants sont séparés par un point. Par exemple,
pour modifier le nom d’une feuille de calcul, vous allez employer la propriété
Worksheet.Name. En modifiant le nom d’une feuille de calcul après avoir modifié
ou actualisé des cellules, vous faites en sorte que vous-même et vos collègues
sachent que les données sont désormais différentes et qu’elles nécessitent une
vérification avant que la feuille de calcul puisse rejoindre un ensemble de docu-
ments finalisés.

Méthodes

Chapitre 3
Une méthode est une action qu’un objet sait réaliser. Par exemple, vous savez sans
doute que la feuille de calcul affichée dans la fenêtre Excel est qualifiée de fenêtre
active. Dans Excel VBA, vous pouvez modifier la feuille de calcul sur laquelle
vous travaillez en invoquant la méthode Activate de la feuille de calcul cible. Une
fois que Activate s’exécute, la feuille de calcul concernée vient se placer au pre-
mier plan des feuilles de calcul actives de la fenêtre Excel et elle devient disponi-
ble pour être modifiée. Comme pour les propriétés, les méthodes sont désignées
au moyen d’une notation avec point. Pour recalculer toutes les formules d’une
feuille de calcul, par exemple, vous appellerez la méthode Worksheet.Calculate.

Événements
Tout comme une propriété est un attribut quantifiable d’un objet et une
méthode est une action qu’un objet sait entreprendre, un événement est une
action qu’un objet reconnaît comme ayant eu lieu. Voici quelques exemples
d’événements reconnus par Excel 2003 :
● Ouverture ou fermeture d’un classeur.
● Activation ou désactivation d’un classeur.
● Enregistrement d’un classeur.
● Sélection d’un graphique.
● Activation d’une touche du clavier (ou d’une combinaison de touches).
● Saisie d’une donnée dans une cellule.
● Recalcul d’une formule dans une feuille de calcul.
● Activation d’un lien hypertexte.

Excel est livré avec un certain nombre de gestionnaires d’événements, ou routi-


nes de code qui surveillent la survenue de certaines actions. Lorsque l’une de ces

31
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


actions a lieu et que vous avez indiqué à Excel ce que vous voulez qu’il fasse lors
de la survenue de l’événement correspondant, Excel exécute le code dans votre
gestionnaire d’événements. Par exemple, si après avoir créé un nouveau classeur,
vous souhaitez qu’Excel affiche tous les classeurs ouverts en cascade, vous pouvez
créer le gestionnaire d’événements suivant :

Private Sub App_NewWorkbook(ByVal Wb As Workbook)


Application.Windows.Arrange xlArrangeStyleCascade
End Sub

Ne vous souciez pas de savoir ce que fait chaque élément de la routine ; pour le
moment, voyez la deuxième ligne de code, qui indique à l’application Excel
d’organiser ses fenêtres en cascade. Le résultat est le même que si vous aviez cli-
qué sur Fenêtre, Réorganiser, Cascade dans l’interface Excel. Mais si vous souhai-
tez que l’action se reproduise chaque fois qu’un événement précis a lieu, vous
pouvez vous servir de VBA pour que cela se fasse sans intervention de votre part.

Collections
Chapitre 3

Le dernier élément de la programmation orientée objet que vous devez connaître


est la collection. Comme son nom l’indique, une collection est un groupe d’objets
du même type qui se trouvent à l’intérieur d’un autre objet. Par exemple, un
classeur contient une collection d’une ou plusieurs feuilles de calcul. Pour appli-
quer un changement à toutes les feuilles de calcul de votre classeur, vous pouvez
passer de l’une à l’autre pour les modifier par voie de programmation.
Si vous avez déjà fait de la programmation, vous connaissez déjà probablement
la boucle For…Next, qui permet de répéter un jeu d’instructions plusieurs fois
via du code semblable à la séquence qui suit et qui ajoute le chemin de dossier du
classeur actif à la section de droite du pied de page sur la première des trois
feuilles de calcul :

For i = 1 to 3
Worksheets(i).PageSetup.RightFooter = Path
Next i

Le problème de ce codage « en dur » (c’est-à-dire le fait s’assigner une valeur


définie) de la limite supérieure de la boucle For…Next est que cela vous oblige à
modifier le code chaque fois que vous ajoutez ou supprimez une feuille de calcul.
Ce n’est pas bien gênant si vous le faites une fois de temps en temps, mais si vous
gérez de grosses quantités de code, vous finirez inévitablement par oublier cette
modification, ce qui entraînera des erreurs qu’il vous faudra rectifier. Pire
encore, vous risquez de ne rien remarquer tant que votre correcteur n’aura pas
découvert que les 500 premiers exemplaires de votre rapport annuel sont mal
formatées. Imaginez qu’il vous appelle juste au moment où vous vous apprêtiez
à éteindre votre téléphone portable pour partir tranquille à la plage… Bien sûr,
vous pouvez écrire quelques lignes de code pour savoir combien de feuilles de
calcul se trouvent dans votre classeur, mais il y a plus simple : utiliser une boucle
For Each…Next. La boucle trouve le nombre d’objets d’une collection (le nom-

32
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


bre d’objets d’un classeur), et passe d’une occurrence à l’autre. Dans cet exemple,
le code précédent serait écrit de la manière suivante.

For Each Wksht in Worksheets


Wksht.PageSetup.RightFooter = Path
Next Wksht

Au lieu d’incrémenter la valeur comme dans une boucle For…Next standard, on


se contente de rechercher le prochain membre de la collection Worksheets et
d’arrêter de boucler lorsqu’on n’en trouve plus.

Pour plus d’informations sur les boucles For…Next et For Each…Next, voir « Contrôle de
la progression du programme » dans le chapitre 4 « Démarrage de la programmation
VBA ».

Le travail avec les macros


L’avantage le plus évident des macros Excel est d’automatiser ainsi les tâches
répétitives. Les macros et Visual Basic pour Applications ne se réduisent pas à la

Chapitre 3
possibilité de répéter des actions sans intervention humaine, mais commençons
par là. Dans cette section, nous allons voir comment enregistrer des macros, les
exécuter selon la méthode la plus aisée pour vous, et exploiter les fonctionnalités
intégrées de sécurité des macros pour vous protéger des virus.

Enregistrer et afficher des macros


Rien de plus facile que d’enregistrer une macro dans Excel 2003 : vous cliquez
sur Outils, Macro, Nouvelle macro pour afficher la boîte de dialogue Enregistrer
une macro (voir figure 3.1).

Figure 3-1. La boîte de dialogue Enregistrer une macro présente une interface
de gestion des macros dans votre classeur.

Tapez le nom que vous voulez donner à la macro dans la zone Nom de la macro
et cliquez sur OK. La boîte de dialogue disparaît et est remplacée par la barre
d’outils Arrêter l’enregistrement.

Vous êtes en train d’enregistrer ! Exécutez les actions à inclure dans la macro, cli-
quez sur le bouton Arrêter l’enregistrement de la barre d’outils et votre macro est
prête à être utilisée. Comme pour tout effort de programmation, vous devez pré-

33
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


voir ce que vous voulez faire aussi efficacement et rapidement que possible.
N’hésitez pas à pratiquer de manière à vous assurer que vos actions génèrent le
résultat voulu.
Une fois l’enregistrement terminé, vous pouvez visualiser le code Excel VBA en
cliquant sur Outils, Macros, <nom_macro>, Modifier. La macro apparaît dans
l’Éditeur Visual Basic, comme dans la figure 3.2.

Remarque Vous en apprendrez plus sur l’Éditeur Visual Basic dans le chapi-
tre 4 « Démarrage de la programmation VBA ».
Chapitre 3

Figure 3-2. Observez le code de vos macros dans l’Éditeur Visual Basic.

Cette macro applique une mise en forme en gras et italique au contenu de la cel-
lule sélectionnée et à celui de la cellule H13. Cette macro présente une autre
particularité : elle était censée fonctionner pour la cellule active et pour celle éloi-
gnée de deux cellules sur la droite, mais en réalité, elle affecte la cellule active et la
cellule H13. Cela est dû au fait que l’enregistreur de macros a utilisé des référen-
ces absolues, qui reflètent les noms des cellules au cours de leur sélection, au lieu
des références relatives, qui reflètent les positions des cellules sélectionnées par
rapport à la cellule active au moment de l’enregistrement de la macro. Pour pas-
ser des références absolues aux références relatives, cliquez sur le bouton Réfé-
rences relatives dans la barre d’outils Arrêter l’enregistrement. La figure 3.3 vous
montre la même macro enregistrée avec des références relatives.

34
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications

Figure 3-3. Est enregistrée ici une macro plus souple, qui fonctionne sur
n’importe quel jeu de cellules sélectionnées au moment de l’enregistrement de
la macro.

Pour plus d’informations concernant la création de références relatives via la propriété


Offset, lisez la section « Référencement des plages » dans le chapitre 8 « Plages et

Chapitre 3
cellules ».

Exécuter une macro


Une fois que vous avez créé votre macro, vous pouvez l’exécuter à tout moment
en cliquant sur Outils, Macro, Macros, <nom_macro>, puis sur Exécuter. En
outre, dans la boîte de dialogue Macro, vous pouvez afficher les macros des
autres classeurs en cliquant sur la flèche adjacente à la zone Macros dans, et en
sélectionnant un classeur par son nom ou en choisissant l’option Tous les clas-
seurs ouverts, ce qui affiche toutes les macros des classeurs ouverts. Dans les
deux cas, les noms des macros affichés incluent le nom du classeur dans lequel la
macro est stockée.

Astuce Exécuter automatiquement des macros


Si vous souhaitez que la macro s’exécute chaque fois qu’un classeur donné
est ouvert, nommez-la Auto_Open.

Il existe plusieurs autres manières d’exécuter une macro dans Excel, mais elles
nécessitent l’assignation de la macro à une action que l’utilisateur puisse exécu-
ter. Voici ces actions :
● Appuyer sur une séquence de touches.
● Lier une macro à un bouton de barre d’outils.
● Lier une macro à un élément de menu.

Affecter une macro à une séquence clavier


Les utilisateurs qui préfèrent travailler avec les raccourcis clavier dans Excel
(comme par exemple CTRL+C pour copier) affecteront leurs macros à des

35
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


séquences effectuées au clavier. Il est important de savoir que si vous assignez
une macro à une séquence clavier déjà employée par ailleurs (par exemple
CTRL+S pour enregistrer un classeur), la nouvelle assignation prend la pré-
séance sur le comportement par défaut dans le classeur concerné.
Voici comment assigner une séquence clavier à une macro :
1 Cliquez sur Outils, Macro, Macros.
2 Dans la zone Nom de la macro, sélectionnez le nom de la macro à laquelle
assigner un raccourci clavier.
3 Cliquez sur Options.
4 Tapez une lettre dans la zone Touche de raccourci. Si vous tapez une lettre
minuscule, votre raccourci sera CTRL+lettre ; si vous tapez une majus-
cule, votre raccourci sera CTRL+MAJ+lettre.

Remarque La touche de raccourci doit être une lettre ; il n’est pas possible
de choisir un chiffre ou un caractère spécial comme le signe dollar ($) ou
l’esperluette (&).
Chapitre 3

5 Tapez une description de votre macro dans la zone Description.


6 Cliquez sur OK.
7 Cliquez sur Annuler.

Affecter une macro à un bouton de barre d’outils


Exécuter une macro à partir de la boîte de dialogue Macros est la manière
« intégrée » la plus aisée de procéder, mais lorsque vous vous déplacez tous azi-
muts dans une feuille de calcul, vous n’avez aucune envie de plonger dans le sys-
tème de menus pour ouvrir une boîte de dialogue, vous souvenir du nom de la
macro à exécuter, puis la lancer. Il est beaucoup plus simple d’assigner la macro
à un bouton de barre d’outils de manière à l’exécuter d’un simple clic de souris.
Il est possible d’ajouter un bouton à une barre d’outils existante, mais il est plus
judicieux de créer une nouvelle barre d’outils pour y accueillir les boutons de vos
macros. Si votre écran est réglé sur une résolution relativement basse afin de
réduire la fatigue oculaire, par exemple, il ne vous restera pas beaucoup de place
dans les barres d’outils existantes. Par ailleurs, si vous placez plusieurs boutons
de macros, vous risquez d’avoir du mal à sélectionner le bon bouton dans une
barre d’outils fortement « peuplée ». Si vous placez vos boutons dans une barre
d’outils de macros clairement nommée, vous gagnerez du temps et vous sou-
viendrez plus facilement des boutons de chaque macro.
Voici comment créer une nouvelle barre d’outils, y ajouter un bouton et assigner
une macro au bouton :
1 Cliquez sur Outils, Personnaliser. Puis, si nécessaire, cliquez sur l’onglet
Barres d’outils.

36
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


2 Cliquez sur Nouvelle. Dans la zone Nom de la barre d’outils, tapez le nom
voulu et cliquez sur OK.

3 Dans la boîte de dialogue Personnaliser, cliquez sur l’onglet Commandes.


4 Dans la liste Catégories, cliquez sur Macros.
5 Faites glisser le bouton Bouton personnalisé vers la barre d’outils.
6 Dans la nouvelle barre d’outils, cliquez droit sur le bouton que vous venez
d’ajouter, cliquez dans la zone Nom, tapez le nom du bouton et appuyez
sur ENTRÉE.
7 Dans la nouvelle barre d’outils, cliquez droit sur le nouveau bouton et cli-
quez sur Affecter une macro.

Chapitre 3
8 Sélectionnez la macro à affecter au bouton et cliquez sur OK.
9 Dans la boîte de dialogue Personnaliser, cliquez sur Fermer.

Affecter une macro à un élément de menu


De même que vous pouvez créer des barres d’outils pour accueillir les boutons
d’exécution de vos macros, vous pouvez créer des menus personnalisés pour ser-
vir le même objectif. Du point de vue fonctionnel, les deux solutions sont équi-
valentes. Mais il existe deux arguments en faveur des menus : il reste
généralement assez de place dans la barre de menus pour y ajouter un élément.
De plus, comme les menus ne s’affichent que si vous les ouvrez, ils n’occupent
pas d’espace à l’écran comme c’est le cas des barres d’outils. Voici comment assi-
gner un élément de menu à une macro :
1 Cliquez sur Outils, Personnaliser. Si nécessaire, cliquez sur l’onglet Com-
mandes.
2 Dans la liste Catégories, cliquez sur Nouveau menu et faites-en glisser la
boîte vers l’extrémité droite de la barre de menus principale.
3 Cliquez droit sur le nouveau menu, puis sur Nom. Tapez le nom du nou-
veau menu et appuyez sur ENTRÉE.

37
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


4 Dans le volet Catégories de la boîte de dialogue Personnaliser, cliquez sur
Macros.
5 Dans la liste Commandes, faites glisser la commande Élément de menu
personnalisé vers l’en-tête du nouveau menu. Relâchez le bouton de la
souris une fois que vous avez placé le nouvel élément de menu dans la
boîte qui s’affiche sous l’intitulé de menu.
6 Dans le nouveau menu, cliquez droit sur Élement de menu personnalisé
et cliquez dans la zone Nom.
7 Tapez le nom voulu pour le menu et appuyez sur ENTRÉE.
8 Dans le nouveau menu, cliquez droit sur l’élément de menu que vous
venez de renommer et choisissez la commande Affecter une macro. Puis,
dans la boîte de dialogue du même nom, cliquez sur la macro à assigner à
l’élément de menu avant de cliquer sur OK.
9 Cliquez sur Fermer.

Déboguer une macro


Chapitre 3

La création et l’enregistrement de macros entraîne leur débogage, à savoir le pro-


cessus qui consiste à découvrir pourquoi votre code VBA ne fonctionne pas
comme il devrait. L’Éditeur Visual Basic vous donne quelques outils permettant
de tester vos macros. Le fait de vérifier le code instruction par instruction cons-
titue une option de débogage particulièrement intéressante.
1 Pour lancer le processus, cliquez sur Outils, Macro, Macros
<nom_macro>, Pas à pas détaillé dans Visual Basic Editor.
2 Dans la fenêtre de l’éditeur, appuyez sur F8 pour exécuter la prochaine
instruction de la macro. Comme le montre la figure 3.4, une flèche appa-
raît à côté de la prochaine instruction à exécuter et celle-ci se met en sur-
brillance.

38
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications

Figure 3-4. L’Éditeur Visual Basic la prochaine ligne de code qui sera
exécutée.

Chapitre 3
Par la suite, chaque fois que vous appuyez sur F8, vous exécutez l’étape en sur-
brillance de la macro et mettez en surbrillance la prochaine étape, le cas échéant.
Il existe d’autres méthodes pour vérifier l’exécution des macros. Le tableau 3.1
vous donne la liste de ces raccourcis clavier et décrit brièvement sa fonction.
Tableau 3-1. Raccourcis clavier pour exécuter des instructions
de macros dans Visual Basic Editor
Séquence Résultat
F5 Exécute le code de la macro.
F8 Exécute l’étape en surbrillance et déplace la surbrillance
vers la prochaine étape du code.
MAJ+F8 Saute l’étape en surbrillance et déplace la surbrillance vers
la prochaine étape du code.
CTRL+MAJ+F8 Arrête l’exécution du code de la macro.
CTRL+F8 Place le curseur dans le code de la macro ; appuyez sur
CTRL+F8 pour que l’éditeur exécute le code jusqu’à
l’emplacement du curseur.
MAJ+F9 Active un espion express pour suivre la valeur d’une variable
sélectionnée dans le code.
F9 Insère un point d’arrêt au niveau du curseur, ce qui permet
au code de s’exécuter jusqu’à ce point et de s’arrêter là.
CTRL+MAJ+F9 Supprime tous les points d’arrêt.
CTRL+F9 Identifie l’instruction sélectionnée comme prochaine
instruction à exécuter.

39
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Si votre macro s’exécute, mais qu’elle ne produit pas le résultat escompté, il est
particulièrement utile de placer le code de la macro dans une fenêtre et la feuille
de calcul dans une autre, et d’effectuer un débogage pas à pas du code, ligne par
ligne, en utilisant la touche F8. En sautant des étapes avec la combinaison
MAJ+F8, vous pouvez passer outre des instructions dont vous savez qu’elles ne
fonctionnent pas correctement. Si rien ne fonctionne et que vous voulez tout
arrêter avant la catastrophe, la combinaison CTRL+MAJ+F8 vous permet
d’arrêter l’exécution immédiatement. Ce faisant, vous n’annulez pas les étapes
qui se sont exécutées avant d’effectuer la combinaison, mais vous empêchez
l’exécution du restant du code.

Attention Lorsque vous exécutez une macro à plusieurs reprises, n’oubliez


pas d’annuler les changements que celle-ci a apportés à votre feuille de cal-
cul. Dans le cas contraire, vous ne verriez pas l’effet produit lors de la pro-
chaine exécution.

Par différence, un point d’arrêt est un point défini qui détermine la fin de la par-
tie de code à exécuter. Pour poursuivre au-delà du point d’arrêt, appuyez sur F5.
Chapitre 3

Comme le montre la figure 3.5, Visual Basic Editor indique la présence d’un
point d’arrêt en plaçant un point dans la barre verticale située le long de la bor-
dure gauche de la fenêtre de code et en affichant ce dernier en vidéo inverse.

Figure 3-5. Les points d’arrêt permettent d’exécuter le code jusqu’à un point
spécifique avant de poursuivre ligne par ligne.

Mettre en œuvre la sécurité des macros et des signatures


numériques
Les virus et autres formes de logiciels préjudiciables existent et vous ne devez pas
les ignorer lorsque vous travaillez avec des langages aussi puissants et souples que
VBA. Vous devez disposer d’un logiciel antivirus (ou deux) sur chacun de vos
ordinateurs ; il s’agit de votre première ligne de défense contre les virus macro

40
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


(des virus écrits dans un langage de programmation de macros). Mais de nou-
veaux virus apparaissent régulièrement et il se peut que vos programmes de
détection ne reconnaissent pas les nouvelles menaces. Votre deuxième ligne de
défense, naturellement, dépend de votre méfiance quant aux fichiers que vous
recevez, attendus ou pas. Mais vous disposez d’une troisième ligne de défense, à
savoir les paramètres de sécurité des macros Excel.

Astuce Empêcher l’exécution automatique des macros


Si vous souhaitez qu’Excel démarre sans démarrer une macro à lancement
automatique, maintenez enfoncée la touche MAJ au démarrage du pro-
gramme.

Les paramètres de sécurité des macros d’Excel déterminent le niveau d’autorisa-


tion que vous souhaitez accorder aux macros s’exécutant sur votre ordinateur. Il
existe quatre réglages de sécurité pour les macros : Très élevée, Niveau de sécurité
élevée, Niveau de sécurité moyen, Niveau de sécurité faible, auxquels vous accé-
dez en cliquant sur Outils, Options, Sécurité, Sécurité des macros pour afficher

Chapitre 3
la boîte de dialogue Sécurité.
Le dernier niveau est à rayer de votre liste, même si vous avez installé sur votre
ordinateur un antivirus « blindé ». Un seul virus macro pénétrant dans votre sys-
tème, c’est déjà trop. Aucun logiciel ne peut savoir quels fichiers vous attendez ;
vous ne pouvez donc vous passer d’une intervention humaine active dans le pro-
cessus de sécurisation de votre ordinateur. Et l’humain, c’est vous.

Lorsque vous activez le niveau de sécurité moyen, Excel affiche une boîte de dia-
logue qui vous demande si vous voulez activer les macros chaque fois que vous
ouvrez un classeur qui en contient. En cliquant sur Activer les macros, vous
ouvrez le classeur et permettez l’exécution des macros dans le classeur. Cliquez
sur Désactiver les macros pour ouvrir le classeur sans autoriser l’exécution des
macros et cliquez sur Annuler pour ne pas ouvrir le classeur. Si vous travaillez
beaucoup sur les macros, que vous êtes la seule personne à utiliser votre ordina-
teur et que vous êtes certain de ne pas oublier de désactiver l’ouverture des
macros en cas de réception d’un fichier suspect, le réglage sur le niveau de sécu-

41
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


rité moyen convient. Si vous partagez votre ordinateur, ou que vous partez en
vacances et que vous ne voulez pas que l’on fasse n’importe quoi sur la machine,
alors n’oubliez pas de définir un niveau de sécurité élevé. Vous pourrez toujours
revenir à une sécurité moyenne à votre retour au bureau.

Introduction aux signatures numériques


Le mécanisme associé au niveau de sécurité élevé repose en partie sur l’usage des
signatures numériques, qui permettent de vérifier l’origine du code VBA associé à
un classeur. Une signature numérique est le résultat d’une opération basée sur les
techniques de cryptage à clé publique. Elle constitue une combinaison unique du
document ainsi signé et d’un fichier connu de vous seul, mais vous pouvez véri-
fier que vous êtes bel et bien à l’origine de la signature. L’aspect mathématique de
l’opération est complexe et repose sur des théories que seule une poignée de
chercheurs maîtrise vraiment. Mais voici un aperçu de ce qui se passe au cours
d’une opération de cryptage.
La première étape consiste à générer une clé qui sera employée pour crypter les
données en ajoutant les valeurs contenues dans la clé à celles qui constituent le
Chapitre 3

texte. Prenons un exemple simple : la clé est la lettre a et le mot à crypter est
kazoo. Si vous ajoutez « a », ou plutôt sa position en tant que première lettre de
l’alphabet, à chaque lettre du mot kazoo, vous décalez chaque lettre en lui subs-
tituant la suivante. Cela vous donne le mot crypté lbapp. La clé que vous générez,
en réalité, est beaucoup plus longue, et elle est découpée en deux portions : une
moitié publique et une moitié privée. La seconde, également appelée clé privée,
doit être gardée secrète. Vous n’avez à la partager avec personne et quiconque
vous demandant de la lui fournir serait à soupçonner d’avoir de mauvaises
intentions à votre égard. En revanche, vous devez diffuser la clé publique, en la
donnant à toute personne avec laquelle vous vous apprêtez à échanger des
fichiers signés numériquement. Avec le cryptage à clé publique, l’astuce est que
toute personne disposant d’une copie de votre clé publique peut vérifier qu’un
document que vous avez signé avec votre clé privée provient bien de vous et qu’il
n’a pas été modifié depuis que vous l’avez signé.
En fonction du logiciel de cryptage employé, vous aurez la possibilité d’utiliser
votre paire de clés publique-privée pour apposer votre signature numérique aux
classeurs et au code des macros que vous diffuserez sur le réseau interne. Le pro-
blème des clés qui ne sont pas distribuées à l’extérieur de votre organisation est
que toute personne se trouvant à l’extérieur de votre réseau ne pourra pas savoir
si votre signature est valide ou pas. Si vous avez besoin de travailler avec des par-
tenaires extérieurs à votre réseau d’entreprise, vous pouvez vous procurer un
certificat numérique auprès d’une société spécialisée. Un certificat numérique
est un fichier électronique qui vous identifie et contient des informations comme
le nom de votre organisation, l’autorité émettrice du certificat, votre adresse
courriel et votre pays, ainsi que la date d’expiration du certificat. Il détient une
copie de votre clé publique. Après avoir signé un document avec un certificat
numérique, toute personne désireuse de vérifier que le certificat employé pour
signer le document vous appartient bien, peut s’adresser au serveur de clés main-

42
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


tenu par l’autorité de certification et vérifier la correspondance de la signature
avec votre clé publique.

Au Quotidien
Certificats numériques : vous pouvez même créer le vôtre

Vers la fin des années 1990, la concurrence était forte sur le marché de la cer-
tification numérique. Plusieurs sociétés se faisaient la guerre pour s’emparer
de la plus grosse part du gâteau. Début 2000, deux compagnies sont sorties
du lot : VeriSign et Thawte Consulting. En décembre 1999, VeriSign a mis fin à
toute concurrence en rachetant Thawte et désormais, les deux plus gros four-
nisseurs de certificats numériques se trouvent réunis dans une même corpo-
ration. V isitez les sites web http://www.verisign.com/ et http://
www.thawte.com/ pour vous faire une idée des produits et services qu’offrent
ces entreprises.

Thawte et VeriSign sont les leaders du marché, mais que cela ne vous empê-
che pas de prêter attention aux clauses de réserve qu’ils incluent dans leur

Chapitre 3
contrat standard. En effet, ces sociétés font de leur mieux pour procéder à la
vérification de l’identité des individus et des entreprises qui leur achètent des
certificats numériques. Mais en aucun cas elle ne garantissent que leurs
méthodes sont infaillibles et en fait, vous ne pourrez pas les attaquer si
quelqu’un parvient à contourner leurs procédures de vérification et à s’empa-
rer d’une fausse identité numérique.

Signature numérique des classeurs et des macros


Une fois muni de votre certificat numérique, vous pouvez signer un classeur en
cliquant sur Outils, Options, Sécurité, Signatures numériques, Ajouter, <nom-
certificat>, OK. Une fois que vous avez cliqué sur Ajouter, la boîte de dialogue
Sélectionner un certificat (voir figure 3.6) s’affiche, avec une liste des certificats
existants sur votre ordinateur. Vous pouvez alors cliquer sur le nom du certificat
avec lequel vous voulez signer le classeur (ou cliquer sur Afficher le certificat
pour voir les détails au cas où plusieurs de vos certificats auraient le même nom).
Cliquez sur OK pour signer votre classeur.

43
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Figure 3-6. La boîte de dialogue Sélectionner un certificat affiche les certificats


disponibles pour la signature numérique de vos classeurs.

Dans Visual Basic Editor, le processus est pratiquement le même. Pour signer le
code VBA associé à un classeur, cliquez sur Outils, Macro, Visual Basic Editor.
Dans l’éditeur, cliquez sur Outils, Signature électronique, Choisir,
<nom_certificat> et cliquez sur OK. À la différence de la boîte de dialogue Sélec-
tionner un certificat qui s’affiche lorsque vous voulez signer un classeur, la boîte
de dialogue Signature numérique qui s’affiche lorsque vous voulez signer du
Chapitre 3

code VBA vous permet d’utiliser un certificat qui a déjà expiré. Le fait d’afficher
les certificats arrivés à expiration n’est pas très judicieux. En effet, comme vous le
verrez dans la prochaine section, signer une macro avec un certificat périmé
équivaut à ne pas la signer du tout.

Remarque En testant cette fonctionnalité d’Excel, nous nous sommes aper-


çus que lorsque l’on affectait un certificat périmé à une macro, un avertisse-
ment s’affichait quelque deux minutes plus tard, indiquant qu’il y avait un
problème de certificat numérique et que la signature n’avait pas pu être accep-
tée. Il aurait été plus simple de ne pas afficher les certificats périmés, mais le
fait que le logiciel arrive à détecter la présence d’un problème avant que l’on
puisse diffuser le code constitue tout de même une solution acceptable.

Signatures numériques et réglage sur le niveau


de sécurité élevé
La section précédente nous conduit naturellement à aborder la question du
Niveau de sécurité élevé. Lorsqu’il est activé, Excel devient particulièrement
méfiant quant à l’exécution des macros. Si le logiciel ne reconnaît pas la source
qui a signé les macros dans le classeur que vous vous apprêtez à ouvrir, la routine
de sécurité vous demande si vous êtes d’accord pour faire confiance à la source
signataire de la macro ou désactive automatiquement les macros.
Vous pouvez ajouter une source approuvée à Excel en ouvrant le fichier qui con-
tient les macros signées numériquement en provenance du développeur que
vous voulez ajouter à la liste. Une boîte de dialogue d’avertissement de sécurité
s’affiche alors, indiquant que l’émetteur ne se trouve pas dans la liste approuvée.
Pour ajouter cet émetteur à la liste des sources approuvées, cochez la case Tou-

44
Partie 2 : Visual Basic pour Applications

Exploration de Visual Basic pour Applications


jours faire confiance aux macros provenant de cet éditeur et cliquez sur Activer
les macros.

Remarque Votre administrateur réseau a la possibilité d’empêcher les utili-


sateurs d’ajouter des sources à la liste des sources approuvées. Vous serez
peut-être obligé de le consulter avant de pouvoir ajouter des développeurs à
votre liste.

Dans un certain nombre de cas de figure, les signatures numériques et les macros
interagissent avec Excel lorsque le niveau de sécurité est défini à un niveau élevé.
Le tableau 3.2 reprend ces différentes situations et l’effet correspondant du
réglage Niveau de sécurité élevé.
Tableau 3-2. Comment Excel réagit à différents scénarios de
signature numérique avec un niveau de sécurité défini à élevé
Circonstance Réaction
La macro n’a pas de signature Excel désactive les macros et ouvre le

Chapitre 3
numérique. classeur.
La macro a une signature valide Excel active les macros et ouvre le
provenant d’une source classeur.
approuvée.
La macro a une signature valide Excel affiche les informations relatives au
provenant d’une source inconnue. certificat et si cette fonction n’a pas été
désactivée par l’administrateur réseau, il
vous demande si vous souhaitez approuver
la source et l’autorité de certification.
La macro a une signature non Excel désactive les macros et vous avertit
valide, indiquant que le fichier a de la présente éventuelle d’un virus.
peut-être été endommagé par un
virus.
La signature ne peut être vérifiée Excel désactive les macros et indique qu’il
car la clé publique est manquante n’a pas pu vérifier la signature.
ou ne peut être localisée sur un
serveur de clés.
La macro a été signée avec un Excel désactive les macros et indique que
certificat qui a expiré ou qui a été le certificat est non valide.
révoqué.

45
Partie 2 : Visual Basic pour Applications

Chapitre 4
Démarrage de la
programmation VBA
Introduction à Visual Création de tableaux
Basic Editor . . . . . . . . . . . . . . . . . 47 dynamiques. . . . . . . . . . . . . . . . . 73
Gestion des fenêtres Code . . . . . . 59 Écriture à l’écran et acceptation
Développement de projets avec des entrées utilisateur . . . . . . . . 74
l’Explorateur de projets . . . . . . . . 62 Définition de variables objet . . . . 81
Déclaration des variables, Création de types de données
constantes et types de données . 64 personnalisés . . . . . . . . . . . . . . . 81
Assignation de valeurs Contrôle de la progression du
aux variables . . . . . . . . . . . . . . . . 71 programme . . . . . . . . . . . . . . . . . 82
Tableaux . . . . . . . . . . . . . . . . . . . . 72 Gestion des erreurs . . . . . . . . . . . 91

Introduction à Visual Basic Editor


Visual Basic Editor est un outil puissant qui étend les capacités et la polyvalence
des macros bien au-delà du simple enregistrement d’actions. Pour comprendre
le fonctionnement de Visual Basic Editor, ce chapitre en examine toutes les
facettes : les différents composants, leur action et leur utilisation. Pour commen-
cer, nous allons étudier le langage Visual Basic pour Applications (VBA),
employé pour programmer toutes les macros.
Si vous n’avez jamais utilisé Visual Basic Editor auparavant, suivez ce chapitre du
début à la fin. En revanche, si vous connaissez déjà Visual Basic Editor, passez
directement aux sections qui vous intéressent.

Ouvrir Visual Basic Editor


À l’instar de la majorité des applications Windows, il existe plusieurs méthodes
pour ouvrir Visual Basic Editor. Dans le menu Outils, choisissez Macros, Visual
Basic Editor ou appuyez sur ALT+F11. Pour modifier ou afficher une macro spé-
cifique, dans le menu Outils, choisissez Macro, Macros pour afficher la boîte de
dialogue Macro. Dans cette boîte de dialogue, sélectionnez la macro de votre
choix et cliquez sur le bouton Modifier. Vous pouvez également ouvrir la boîte de
dialogue Macro en appuyant sur ALT+F8.

47
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tour d’horizon de Visual Basic Editor


Lorsque vous ouvrez Visual Basic Editor, vous utilisez la fenêtre Explorateur de
projets pour travailler directement sur la macro de votre choix. Cette fenêtre pré-
sente tous les projets (groupes de code) et les macros qu’ils contiennent dans une
arborescence dont le fonctionnement est similaire à celui de l’arborescence de
l’Explorateur Windows. Le classeur sur lequel vous travaillez, ainsi que tout
autre classeur ou composant externe ouvert, constitue l’objet racine, ou objet de
base, de l’arborescence.
Les principaux éléments employés par les projets VBA sont stockés dans des dos-
siers séparés au sein du projet. Parmi ces éléments, on trouve des objets, que
nous avons étudiés au chapitre 3, des modules, qui contiennent le code de macro
associé à la feuille de calcul, des modules de classe, qui définissent les objets créés
pour le classeur (nous les détaillerons au chapitre 14) et des feuilles, que nous
étudierons au chapitre 19.
Dans l’exemple de la figure 4.1, le classeur est libellé VBAProject (Manipula-
tionsDateHeure.xls). Les trois feuilles de calcul qu’il contient (Feuil1, Feuil2 et
Feuil3), ainsi que le classeur (ThisWorkbook), se trouvent dans le dossier Micro-
soft Excel Objets. Toutes les macros programmées en VBA ou enregistrées se
trouvent également dans le dossier Modules. Les modules de classe et les feuilles
s’affichent respectivement dans un dossier Modules de classe ou Feuilles.
Chapitre 4

Figure 4-1. Visual Basic Editor organise les éléments de programmation pour
en simplifier la gestion.

Sous la fenêtre Explorateur de projets se trouve la fenêtre Propriétés qui sert à


examiner et à modifier les différentes propriétés relatives à l’objet sélectionné.
Dans les modules et les feuilles de calcul, la propriété Name est la seule disponi-

48
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


ble, bien que les feuilles de calcul possèdent d’autres propriétés, que l’on modifie
généralement dans les feuilles.

Attention La valeur de la propriété Name d’une feuille de calcul ou d’un clas-


seur n’est pas nécessairement la même que le nom du même objet au sein
d’Excel. Bien que les deux noms puissent sembler similaires en raison des
règles de nommage appliquées par défaut par Visual Basic Editor, il se peut
qu’ils soient différents en raison de la liaison qui les unit en interne pour assu-
rer que l’objet approprié est référencé. Les noms d’objets sont plus restrictifs.
Ils doivent, en effet, suivre les règles de nommage de Visual Basic pour Appli-
cations (pas d’espace, commencer par une lettre, pas de mot réservé et pas
plus de 31 caractères de long).

La fenêtre Code constitue la plus grande fenêtre de Visual Basic Editor. Sa partie
supérieure présente deux listes déroulantes (voir figure 4.2). La liste de gauche,
intitulée Objet, sert à sélectionner l’objet utilisé. Si vous travaillez uniquement
sur du code, la liste affiche l’objet par défaut Général. Dans la deuxième liste
déroulante, intitulée Procédure, vous sélectionnez des macros au sein du
module. À mesure que vous ajoutez et supprimez des macros du module, elles
sont également ajoutées et supprimées de la liste Procédure.

Chapitre 4

Figure 4-2. La fenêtre Code de Visual Basic Editor permet de choisir des objets
et des procédures.

Pour atteindre et sélectionner une macro, vous pouvez également parcourir la


liste déroulante Procédure avec les flèches Bas et Haut. En outre, la liste dérou-
lante Procédure s’actualise à mesure que vous vous déplacez au sein de la fenêtre
Code et place le point d’insertion dans la macro affichée.

49
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Dans le menu Insertion, cliquez sur UserForm pour remplacer la fenêtre Code
par la fenêtre UserForm (voir figure 4.3).

Pour plus d’informations sur l’utilisation des feuilles, reportez-vous au


chapitre 19 « Création de feuilles UserForm ».

Figure 4-3. L’éditeur de feuilles Visual Basic Editor s’affiche lorsque vous
Chapitre 4

passez de l’écriture de code VBA à la création de feuilles.

À l’instar de toute autre application Windows, Visual Basic Editor possède une
barre de menus et une barre d’outils donnant accès à de nombres fonctionnali-
tés. La majorité des options disponibles dans les menus Fichier, Édition, Fenêtre
et Aide sont similaires à celles des autres applications Windows. Le reste des
menus, cependant, contient des fonctionnalités dans Visual Basic Editor.

Menu Affichage
Le menu Affichage permet d’ouvrir et/ou d’atteindre une fenêtre spécifique au
sein de Visual Basic Editor. À partir de la fenêtre Visual Basic Editor, vous pouvez
ouvrir des fenêtres ou retourner à la fenêtre Excel. Le tableau 4.1 récapitule les
éléments du menu Affichage.

Tableau 4-1. Éléments de menu disponibles dans le menu


Affichage de Visual Basic Editor
Élément Description
Code Affiche ou active la fenêtre Code pour l’élément
sélectionné dans l’Explorateur de projets.

50
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Tableau 4-1. Éléments de menu disponibles dans le menu


Affichage de Visual Basic Editor (Suite)
Élément Description
Objet Affiche ou active l’objet sélectionné dans l’Explorateur de
projets.
Définition Affiche ou active la fenêtre Explorateur d’objets et affiche
l’entrée de l’élément sélectionné dans la fenêtre Code. Si
l’élément est une procédure ou une fonction, il affiche en
affiche le code.
Dernière position Renvoie le curseur au début de la dernière ligne de code
éditée.
Explorateur Affiche ou active la fenêtre Explorateur d’objets.
d’objets
Fenêtre Exécution Affiche ou active la fenêtre Exécution.
Fenêtre Variables Affiche ou active la fenêtre Variables locales.
locales
Fenêtre Espions Affiche ou active la fenêtre Espions.
Pile des appels Affiche ou active la boîte de dialogue Pile des appels.
Explorateur de Affiche ou active la fenêtre Explorateur de projets.
projets
Fenêtre Propriétés Affiche ou active la fenêtre Propriétés.
Boîte à outils Affiche ou active la Boîte à outils qui contient des objets
employés pour créer des formulaires utilisateur.

Chapitre 4
Ordre de tabulation Affiche ou active la boîte de dialogue Ordre de tabulation.
Barres d’outils Permet d’activer ou de désactiver les différentes barres
d’outils disponibles au sein de Visual Basic Editor, ainsi
que de les personnaliser.
Microsoft Excel Bascule dans le classeur actif et restaure l’affichage s’il a
été réduit.

Menu Insertion
Le menu Insertion permet d’insérer de nouvelles procédures, des modules ou
des feuilles au sein du projet. Le tableau 4.2 récapitule les éléments disponibles
dans le menu Insertion de Visual Basic Editor.
Tableau 4-2. Éléments de menu disponibles dans le menu
Insertion de Visual Basic Editor
Élément Description
Procédure Affiche la boîte de dialogue Ajouter une procédure qui
permet de construire l’instruction de déclaration d’une
nouvelle procédure au sein du module actif.
UserForm Insère une nouvelle feuille dans le projet en cours.

51
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 4-2. Éléments de menu disponibles dans le menu


Insertion de Visual Basic Editor (Suite)
Élément Description
Module Insère un nouveau module dans le projet en cours.
Module de classe Insère un nouveau module de classe dans le projet en
cours.
Fichier Affiche la boîte de dialogue Insérer un fichier pour vous
permettre d’importer un ficher texte (*.txt), un fichier
Basic (*.bas) ou un fichier classe (*.cls). Les fichiers
texte sont insérés dans la fenêtre Code, alors que les
fichiers Basic ou classe sont insérés dans le projet en
cours sous forme de modules ou de modules de classe
séparés.

Menu Format
Le menu Format contient les commandes de placement et de mise en forme des
objets dans les feuilles. Le tableau 4.3 récapitule les éléments du menu Format.
Tableau 4-3. Éléments de menu disponibles dans le menu
Format de Visual Basic Editor
Élément Description
Aligner Affiche le sous-menu Aligner qui permet d’aligner
plusieurs objets sur un bord commun.
Uniformiser la taille Affiche le sous-menu Uniformiser la taille qui permet de
Chapitre 4

donner la même largeur et/ou hauteur à deux objets.


Ajuster à la taille Redimensionne la hauteur et la largeur d’un objet de
sorte à l’adapter exactement.
Ajuster à la grille Redimensionne la hauteur et la largeur d’un objet de
sorte que ses bords se basent sur les lignes de la grille
les plus proches.
Espacement Affiche le sous-menu Espacement horizontal qui permet
horizontal d’ajuster l’espacement horizontal entre plusieurs objets.
Espacement vertical Affiche le sous-menu Espacement vertical qui permet
d’ajuster l’espacement vertical entre plusieurs objets.
Centrer sur la feuille Affiche le sous-menu Centrer sur la feuille qui permet de
centrer un objet horizontalement ou verticalement sur
une feuille.
Réorganiser les Affiche le sous-menu Réorganiser les boutons qui
boutons permet d’organiser les objets boutons de manière
régulière sur la partie inférieure ou le bord droit de la
feuille.
Grouper Crée un groupe avec les objets sélectionnés pour vous
permettre de les manipuler simultanément.

52
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Tableau 4-3. Éléments de menu disponibles dans le menu


Format de Visual Basic Editor (Suite)
Élément Description
Dissocier Dissocie des objets groupés.
Plan Affiche le sous-menu Plan qui permet d’organiser l’ordre
d’empilement des objets sur la feuille utilisateur.

Menu Débogage
Le menu Débogage propose plusieurs outils permettant de déboguer (tester)
l’exécution des procédures. Le tableau 4.4 récapitule les éléments du menu
Débogage.
Tableau 4-4. Éléments de menu disponibles dans le menu
Débogage de Visual Basic Editor
Élément Description
Compiler Compile le code du projet sélectionné. Identifié dans le
menu par Compiler <NomProjet>.
Pas à pas détaillé Permet de parcourir le code ligne par ligne. Chaque
ligne est mise en surbrillance avant d’être exécutée.
Pas à pas principal Permet d’exécuter une procédure complète. Cette
commande est intéressante si la procédure en cours
appelle une deuxième procédure : inutile de localiser la
deuxième procédure.

Chapitre 4
Pas à pas sortant Permet d’exécuter tout le code restant dans la
procédure en cours. Cette commande s’arrête lorsque
toutes les lignes ont été exécutées.
Exécuter jusqu’au Permet d’exécuter le code jusqu’à la ligne où se trouve
curseur le curseur.
Ajouter un espion Affiche la boîte de dialogue Ajouter un espion dans
laquelle vous ajoutez les variables ou les expressions à
surveiller.
Modifier un espion Affiche la boîte de dialogue Modifier un espion qui sert
à modifier les variables ou les expressions que vous
surveillez.
Espion express Affiche la boîte de dialogue Espion express qui contient
la valeur de la variable ou de l’expression sélectionnée
dans la fenêtre Code. Vous pouvez également survoler
la variable ou l’expression avec la souris pour afficher
la valeur dans une info-bulle d’argument.

53
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 4-4. Éléments de menu disponibles dans le menu


Débogage de Visual Basic Editor (Suite)
Élément Description
Basculer le point Permet de créer un point d’arrêt sur la ligne de code en
d’arrêt cours. L’exécution est suspendue dès qu’elle rencontre
un point d’arrêt. Si la ligne en cours contient déjà un
point d’arrêt, cette commande l’annule. Voici une
alternative pour créer des points d’arrêt : placez la
souris sur le bord à gauche du code (de sorte que le
pointeur prenne la forme d’une flèche pointant vers
l’angle supérieur gauche) et double-cliquez.
Effacer tous les Permet d’effacer tous les points d’arrêt au sein du
points d’arrêt module de code.
Définir l’instruction Permet de définir la prochaine ligne de code à exécuter.
suivante
Afficher l’instruction Permet de passer rapidement à la ligne de code à
suivante exécuter suivante. Cette commande est intéressante si
vous parcourez le code et souhaitez revenir rapidement
à ligne de code exécutable suivante.

Menu Exécution
Le menu Exécution contient plusieurs commandes qui permettent d’exécuter le
code et d’afficher les feuilles. Le tableau 4.5 récapitule les éléments du menu Exé-
cution.
Chapitre 4

Tableau 4-5. Éléments de menu disponibles dans le menu


Exécution de Visual Basic Editor
Élément Description
Exécuter Sub/ Commence l’exécution de la procédure ou de la feuille en
UserForm cours. Si rien n’est sélectionné, la boîte de dialogue Macros
s’affiche pour vous permettre de sélectionner la procédure à
exécuter. Lorsqu’une procédure se trouve en mode Arrêt,
cette commande est remplacée par Continuer pour vous
permettre d’en poursuivre l’exécution normale.
Arrêt Permet d’arrêter l’exécution de la procédure et place le code
en mode Arrêt.
Réinitialiser Permet de réinitialiser toutes les variables du modules et de
vider la Pile des appels.
Mode Création Permet d’activer et de désactiver le mode Création pour la
procédure.

54
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Menu Outils
Le menu Outils propose des commandes permettant d’exécuter des procédures,
d’ajouter des références à des procédures externes, de définir les options de
Visual Basic Editor, de définir les propriétés du projet en cours et de signer
numériquement le projet. Le tableau 4.6 récapitule les éléments du menu Outils.
Tableau 4-6. Éléments de menu disponibles dans le menu Outils
de Visual Basic Editor
Élément Description
Références Affiche la boîte de dialogue Références du projet en cours
qui permet de spécifier les bibliothèques d’objets et autres
projets VBA auxquels le projet doit pouvoir accéder.
Contrôles Affiche la boîte de dialogue Contrôles supplémentaires qui
supplémentaires permet d’ajouter des contrôles à la Boîte à outils.
Macros Affiche la boîte de dialogue Macros qui permet de
sélectionner et d’exécuter rapidement une macro se trouvant
dans l’un des projets ouverts.
Options Affiche la boîte de dialogue Options qui permet de définir
différentes options Visual Basic Editor.
Propriétés Affiche la boîte de dialogue Propriétés du projet qui permet
de définir plusieurs propriétés pour le projet en cours. Celui-
ci est identifié dans le menu Propriétés sous la forme
Propriétés de <NomProjet>.
Signature Affiche la boîte de dialogue Signature numérique qui permet

Chapitre 4
électronique de signer numériquement le code à l’aide de n’importe
quelle signature numérique installée sur le PC.

Personnaliser Visual Basic Editor


Vous pouvez entièrement personnaliser Visual Basic Editor et le configurer pour
l’adapter à votre méthode de travail. Vous pouvez détacher les fenêtres de leurs
positions par défaut et les placer où bon vous semble à l’écran, y compris sur les
divers bords de la fenêtre. En outre, comme nous l’avons étudié au chapitre 3,
vous pouvez déplacer, masquer et afficher n’importe quelle barre d’outils, ainsi
que les boutons qu’elle héberge.
Toutes les fenêtres secondaires de Visual Basic Editor possèdent un emplacement
d’ancrage par défaut. Pour déplacer une fenêtre, placez le pointeur de la souris
sur la barre de titre de la fenêtre et faites glisser vers l’emplacement de votre
choix. Le contour de la boîte s’affiche pour vous indiquer où la fenêtre sera pla-
cée lorsque vous relâcherez le bouton de la souris (voir figure 4.4).

55
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Figure 4-4. Voici les emplacements par défaut des fenêtres de Visual Basic
Editor, mais rien ne vous empêche de les positionner à votre guise pour
optimiser votre environnement de travail.

Astuce Voici une méthode rapide pour basculer entre une fenêtre ancrée et
sa dernière position détachée : double-cliquez sur la barre de titre de la fenê-
tre. Cette astuce est intéressante pour revenir à la position ancrée. Il peut, en
Chapitre 4

effet, s’avérer complexe de faire admettre à Visual Basic Editor que vous sou-
haitez ancrer à nouveau une fenêtre.

Les procédures de personnalisation des barres d’outils sont similaires à celles


employées dans les autres applications Windows. Pour déplacer une barre
d’outils, cliquez dans une zone vide de la barre d’outils et faites-la glisser vers
l’emplacement de votre choix. Cliquez sur le bouton Options de barre d’outils
(qui se trouve dans l’angle inférieur droit de la barre d’outils) ou cliquez droit
dans une zone vide de la barre d’outils et choisissez Personnaliser pour afficher la
boîte de dialogue Personnalisation qui permet d’ajouter ou de supprimer des
boutons sur les barres d’outils visibles. Si vous cliquez droit sur une barre
d’outils, vous pouvez également afficher ou masquer les barres d’outils.
La boîte de dialogue Options de Visual Basic Editor propose plusieurs options
qui affectent son environnement. Les commandes de la boîte de dialogue
Options sont réparties sur quatre onglets : Éditeur, Format de l’éditeur, Général
et Ancrage.
L’onglet Éditeur (voir figure 4.5) est divisé en deux jeux d’options. Le premier
jeu, Paramètres du code, contrôle l’affichage des info-bulle d’argument Intelli-
Sense, la mise en forme du code, la déclaration des variables et les erreurs de syn-
taxe. L’option Info express automatique fournit des informations ou des

56
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


fonctions et leurs paramètres à mesure que vous les saisissez, ainsi que les cons-
tantes intrinsèques applicables pendant le mode Création. En mode Exécuter,
l’option Info-bulles automatiques indique la valeur de la variable survolée par la
souris. Parmi les options de mise en forme du code, on trouve Retrait automati-
que qui indente les nouvelles lignes avec le même retrait que la ligne au-dessus et
Largeur de la tabulation qui définit le nombre d’espaces par tabulation. En
cochant la case Déclaration des variables obligatoire, vous éliminez la possibilité
d’utiliser une valeur dans une variable qui n’est pas encore définie. L’option
Vérification automatique de la syntaxe examine chaque ligne de code à la recher-
che d’erreurs de syntaxe. Pour finir, si vous cochez la case Complément automa-
tique des instructions, Visual Basic Editor affiche des informations servant à
compléter l’instruction que vous saisissez.

Figure 4-5. Les outils de l’onglet Éditeur de la boîte de dialogue Options

Chapitre 4
permettent de modifier l’affichage du code, des erreurs et des astuces dans
Visual Basic Editor.

Au Quotidien
Évitez les erreurs dans les déclarations

L’obligation de définir une variable avant de l’utiliser peut vous sembler


gênant, mais cela évite l’une des erreurs de programmation les plus
mystérieuse : l’erreur de la division par zéro. Voici un exemple simple de cette
erreur : vous voulez découvrir la température moyenne de la semaine. Si vous
tentez de diviser la somme des températures par une nouvelle variable intitu-
lée intNbreJours à laquelle vous n’avez pas encore assigné de valeur, le pro-
gramme suppose que la valeur est zéro et génère une erreur.

Le deuxième ensemble d’options, Paramètres de la fenêtre, contrôle l’affichage


de plusieurs procédures dans la fenêtre Code et détermine le déplacement du
code avec la souris. En cochant la case Édition du texte par glisser-déplacer, vous
pouvez glisser-déplacer des éléments au sein du code et de la fenêtre Code vers
ou depuis la fenêtre Exécution et/ou la Fenêtre Espions. L’option Affichage du
module complet par défaut définit l’affichage de la fenêtre du nouveau module :

57
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


une fenêtre avec barres de défilement ou l’affichage d’une seule procédure.
L’option Séparation des procédures trace une ligne séparant les procédures.
Les commandes de l’onglet Format de l’éditeur de la boîte de dialogue Options
(voir figure 4.6) contrôlent le style de police employé pour afficher le code. La
fenêtre Code peut être entièrement personnalisée pour répondre à des besoins
particuliers : couleur des différents éléments de code (clavier, commentaires,
erreurs de syntaxe, éléments sélectionnés et ainsi de suite), style et taille de la
police. Vous pouvez activer ou non l’option Barre des indicateurs en marge, bien
qu’il soit préférable de cocher cette case car elle permet d’activer rapidement les
points d’arrêt.

Figure 4-6. L’onglet Format de l’éditeur permet de choisir la mise en forme des
éléments du programme.
Chapitre 4

Au Quotidien
L’onglet Général (voir figure 4.7) propose un certain nombre d’options allant
des Paramètres de la grille de la feuille à l’affichage des info-bulles, en pas-
sant par la fermeture automatique des fenêtres Feuille et Module, l’avertisse-
ment avant la réinitialisation des variables, le suivi des erreurs et la
compilation du code. Dans la section Paramètres de la grille de la feuille, vous
activez et désactivez les points de la grille pendant la création des feuilles,
modifiez la distance horizontale et verticale entre les points de la grille et choi-
sissez d’aligner les nouveaux contrôles sur la grille. Vous pouvez également
activer ou désactiver les info-bulles qui expliquent l’action des boutons de la
barre d’outils.

58
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Figure 4-7. L’onglet Général de la boîte de dialogue Options regroupe les


commandes qui n’entrent pas dans les autres onglets.

Si vous cochez la case Réduire le proj. masque les fenêtres, les fenêtres du module
et de la feuille se ferment automatiquement lorsque vous réduisez le projet dans
la fenêtre Explorateur de projets. Si vous cochez la case Avertir avant la perte
d’état vous serez averti si vous effectuez une action spécifique qui réinitialise tou-
tes les variables.
La section Récupération d’erreur regroupe trois options. Si vous sélectionnez
l’option Arrêt sur toutes les erreurs, vous obligez Visual Basic Editor à basculer
en mode Arrêt pour toutes les erreurs, que la récupération d’erreur soit ou non
active dans les procédures en cours d’exécution. Si vous sélectionnez l’option
Arrêt dans le module de classe, Visual Basic Editor bascule en mode Arrêt uni-
quement sur les erreurs non récupérées et met en surbrillance la ligne de code

Chapitre 4
impliquée. Si vous optez pour Arrêt sur les erreurs non gérées, Visual Basic Edi-
tor bascule en mode Arrêt uniquement si aucun gestionnaire d’erreur n’est actif.
En présence d’une erreur non récupérée dans un module de classe, Visual Basic
Editor surligne la ligne de code dans la procédure appelante et non dans le
module de classe.
Les deux dernières options de l’onglet Général concernent la compilation des
procédures. Pour accélérer l’exécution, cochez les deux options Compilation sur
demande et Compilation en arrière-plan. La première option permet d’exécuter
plus rapidement l’application en compilant le code à la volée et non en une fois
et la deuxième permet d’utiliser le temps d’inactivité pour terminer la compila-
tion du projet en mode Exécuter.
Le quatrième et dernier onglet de la boîte de dialogue Options permet de spéci-
fier si les fenêtres auxiliaires de Visual Basic Editor sont ancrables. Par défaut,
toutes les fenêtres le sont à l’exception de la fenêtre Explorateur d’objets.

Gestion des fenêtres Code


Il est tout aussi important d’organiser le code d’un projet Excel que les fichiers de
votre disque dur. Heureusement, l’Explorateur de projets de Visual Basic Editor

59
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


présente les éléments d’un projet sous la forme d’une arborescence similaire à
celle de l’Explorateur Windows. L’Explorateur de projets n’est pas aussi souple
que l’Explorateur Windows, mais il regroupe les différents éléments d’un projet
dans un dossier commun. Cette organisation classique simplifie la localisation
des modules, modules de classe, feuilles ou de tout autre objet Excel.

Gérer les fenêtres


Chaque module, module de classe ou feuille s’affiche dans sa propre fenêtre
Code. Autrement dit, à mesure que vous ajoutez des modules, le nombre de fenê-
tres sur lesquelles vous travaillez augmente. Quel que soit le nombre de modules
d’un projet, il est inutile de les ouvrir tous pour travailler sur le projet : ouvrez
uniquement le module ou la feuille à modifier.
Pour simplifier la navigation au sein des diverses fenêtres, Visual Basic Editor
propose quelques outils pour ouvrir, basculer entre et fermer les fenêtres. Pour
ouvrir un module, double-cliquez dessus dans la fenêtre Explorateur de projets.
Vous pouvez également vous servir de cette méthode pour basculer vers un autre
module s’il est ouvert.
Pour basculer entre les différentes fenêtres ouvertes, utilisez le menu Fenêtre
pour sélectionner une fenêtre. Vous pouvez également faire défiler les fenêtres
vers l’avant en appuyant sur CTRL +F6 ou vers l’arrière en appuyant sur
MAJ + CTRL +F6. Pour fermer une fenêtre, cliquez sur le bouton Fermer ou
appuyez sur CTRL+F4.
Il est également possible de réduire ou de redimensionner les fenêtres pour affi-
Chapitre 4

cher simultanément plusieurs modules. Le menu Fenêtre contient des comman-


des pour créer une mosaïque horizontale ou verticale des fenêtres ou les placer
en cascade. Pour afficher deux sections différentes d’un même module, servez-
vous de la poignée de fractionnement de la fenêtre du module ou de la com-
mande Fractionner du menu Fenêtre.

Ajouter du code
Il existe plusieurs manières d’ajouter du code à un projet, mais avant de com-
mencer, vous devez choisir le conteneur du code : module, module de classe ou
feuille. Le choix du conteneur dépend des tâches effectuées par le code que vous
y insérer. Bien qu’il soit possible de placer tout le code au sein d’un unique
module, il est préférable de le diviser en plusieurs modules, groupés par tâche.
Pour ajouter un nouveau module, sélectionnez un type (module, module de
classe ou feuille) dans le menu Insertion ou avec le bouton Ajouter de la barre
d’outils Standard.
Pour ajouter une nouvelle procédure à un module ou à un module de classe, sai-
sissez-la directement dans la fenêtre Code du module. ou dans le menu Inser-
tion, choisissez Procédure pour ouvrir la boîte de dialogue Ajouter une
procédure (voir figure 4.8) qui vous invite à saisir le minimum d’informations
nécessaires à la création d’une procédure.

60
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Figure 4-8. La boîte de dialogue Ajouter une procédure permet de déterminer le


cadre général d’une procédure.

Remarque Nous détaillerons les options de la boîte de dialogue Ajouter une


procédure plus loin dans ce chapitre.

Notes sur le style de programmation et la lisibilité du code


Les programmeurs sont issus de formations diverses, chacune possédant son
propre style d’écriture du code. Ceux qui travaillent ou ont travaillé dans de
grandes sociétés de création de logiciels suivent un schéma strict, spécifié par
l’entreprise, alors que les programmeurs solitaires ne suivent souvent aucun for-
mat prédéfini. Quel que soit votre cas, il est indispensable que vous écriviez du
code facile à lire et à comprendre. Même si vous comprenez aujourd’hui le code
que vous écrivez, vous ou un autre programmeur pourriez être obligé de le

Chapitre 4
modifier à l’avenir. À moins de posséder une mémoire photographique, vous
pourriez éprouver quelques difficultés à comprendre la logique employée et à
effectuer des modifications.
Voici quelques règles à suivre pour écrire un code lisible.
● Écrivez des procédures aussi courtes que possible. Si vous devez créer un
macro qui ouvre un classeur, demandez les informations à l’utilisateur,
effectuez les changements, puis enregistrez et fermez le classeur. Divisez
ensuite la macro en plusieurs procédures : une par tâche. Créez ensuite
une procédure principale qui appelle les autres procédures. Ce format de
construction en une série de sous-procédures appelées par la procédure
principale simplifie également la localisation et la correction des erreurs
(débogage).
● Si une ligne de code est trop longue pour s’afficher dans sa totalité dans la
fenêtre Code, saisissez un espace suivi d’un caractère de soulignement
pour indiquer que le code de la ligne suivante constitue la suite de la ligne
en cours. La procédure PermissionLoop, que nous verrons en détails dans la
section « Boucles logiques », plus loin dans ce chapitre, est la première
d’une longue liste de procédures qui exploitent cette convention.

61
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


● Choisissez une convention de nommage et tenez-vous y. Projet, procédu-
res, variables et autres éléments de programmation doivent être libellés
avec un nom significatif qui décrit l’emploi de l’élément. Il existe un grand
nombre de conventions de nommage, la majorité constituant une forme
de la notation hongroise.

Remarque La notation hongroise porte le nom du pays d’origine du Dr Char-


les Simonyi, l’inventeur de ce style de nommage. Le Dr Simonyi était maître
d’œuvre chez Microsoft lorsqu’il a conçu cette convention. Le chapitre d’ori-
gine de la programmation Windows qui décrit comment l’employer se trouve à
l’adresse http://msdn.microsoft.com/ en tapant Simonyi Hungarian Notation
dans la zone de recherche.

● Choisissez des noms concis. Le nom doit être descriptif mais il ne doit pas
dépasser 10 à 15 caractères. Servez-vous d’abréviations logiques. Rappe-
lez-vous : plus le nom est long, plus vous augmentez le risque d’erreur de
frappe.

Développement de projets avec l’Explorateur


de projets
L’Explorateur de projets permet de gérer les projets et modules. Vous y créez de
nouveaux modules, les supprimez et les copiez d’un projet à un autre. La seule
action que vous ne pouvez pas entreprendre dans l’Explorateur de projets est
créer un projet (pour cela, vous devez créer un nouveau classeur).
Chapitre 4

Créer des modules VBA


Toutes les macros et procédures sont stockées dans un module VBA. Un projet
peut héberger plusieurs modules, ce qui peut s’avérer indispensable selon la
complexité de votre projet.
Pour créer un nouveau module, dans le menu Insertion, choisissez Module,
Module de classe ou UserForm, selon le type de module à créer. La figure 4.9
montre un nouveau module vide. Une fois le module créé, vous ajoutez des pro-
cédures ou constituez la feuille. En alternative, vous pouvez importer un module
à partir d’un fichier texte. Dans le menu Fichier, choisissez Importer un fichier et
sélectionnez un fichier texte qui contient le code à utiliser dans un module ou
une feuille. Visual Basic Editor crée un nouveau module. En conséquence, sauf si
le code importé constitue une procédure complète, il ne s’exécute pas tant que
vous n’avez pas ajouté la notation Sub…End Sub.

62
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Figure 4-9. Création d’un nouveau module.

Supprimer des modules VBA


Pour supprimer un module devenu inutile, sélectionnez-le dans l’Explorateur de
projets et dans le menu Fichier, choisissez Supprimer <NomModule>, <NomMo-
dule> étant le nom du module à supprimer. Avant de supprimer un module,

Chapitre 4
Visual Basic Editor vous demande si vous souhaitez l’exporter dans un fichier
texte (voir figure 4.10), ce qui permet de le sauvegarder avant de le supprimer
définitivement.

Figure 4-10. Il peut être intéressant de sauvegarder le code dans un fichier


texte, pour le cas où.

Pour exporter un module, dans le menu Fichier, choisissez Exporter un fichier.

63
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Copier des modules entre projets


L’Explorateur de projets permet de copier des modules d’un projet à un autre.
Pour ce faire, ouvrez le projet source et le projet de destination puis, dans la fenê-
tre Explorateur de projets, cliquez sur le module à copier et faites-le glisser vers le
module de destination. Une fois que le pointeur de la souris se trouve dans le
projet de destination, il change de forme : d’un cercle barré il se transforme en
flèche équipée d’une boîte et d’un signe plus (voir figure 4.11).
Chapitre 4

Figure 4-11. Le pointeur de la souris change d’apparence pour indiquer un


point de dépose valide.

Si vous copiez un module dans un projet qui contient un module portant le


même nom, Visual Basic Editor renomme le module copié en faisant suivre son
nom d’un nombre en commençant à 1. En outre, si le projet de destination ne
contient aucun module du type de celui copié, Visual Basic Editor crée un
module et le dossier approprié pour l’héberger.

Déclaration des variables, constantes et


types de données
Pour la majorité des procédures, vous devrez disposer d’une zone de stockage
temporaire pour manipuler les données et les conserver pour un usage ultérieur.
VBA stocke ces données en mémoire dans une variable. Il est également possible
de stocker en mémoire une valeur qui ne changera pas. Une telle valeur se
nomme une constante. Les variables contiennent des valeurs de différents types
de données, spécifiés lorsque l’on nomme, ou déclare, la variable. Pour éviter les

64
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


bogues et répartir correctement l’espace de stockage nécessaire, déclarez tou-
jours les variables.

Déclarer des variables


Pour déclarer les variables dans une procédure, on utilise l’instruction Dim,
pour dimension, dont le principale usage est le suivant

Dim varname as type

Cette instruction déclare explicitement une variable nommée varname comme


variable type. Pour déclarer plusieurs variables sur une ligne, séparez-les avec
une virgule :

Dim varname1 as type, varname2 as type, ...

Définir les types de données


Déclarez toujours les variables avec un type de données spécifiques. Ce type de
données détermine les valeurs que l’on peut stocker dans la variable ainsi que la
quantité de mémoire nécessaire pour stocker la valeur. VBA propose différents
types de données pour gérer les nombres, les chaînes, les dates et les heures, les
valeurs booléennes et les objets. Vous pouvez, en outre, déclarer votre propre
type de données, si nécessaire.
La majorité des types de données disponibles dans VBA sont des types numéri-
ques, chacun gérant une plage différente de valeurs avec une précision variable.

Chapitre 4
Le tableau 4.7 liste les types de données numériques ainsi que leurs spécifica-
tions.
Tableau 4-7. Types de données numériques
Stockage
Type Plage Description nécessaire
Byte 0 à 255 Nombre entier non 1 octet
signé
Currency –922 337 203 685 477,5808 à Nombre signé en virgule 8 octets
922 337 203 685 477,5807 fixe comprenant
15 chiffres à gauche du
séparateur décimal et 4
chiffres à droite, utilisé
dans les calculs
financiers ou les calculs
nécessitant une
précision élevée.

65
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 4-7. Types de données numériques (Suite)


Stockage
Type Plage Description nécessaire
Decimal 79 228 162 514 264 337 593 543 950 335 Ne peut être déclaré 12 octets
sans séparateur décimal et directement dans VBA.
±7,9228162514264337593543950335 Nécessite l’emploi d’un
avec 28 chiffres après le séparateur décimal. type de données
Variant.
Double Valeurs négatives : Nombre signé à virgule 8 octets
–1,79769313486231E308 à – flottante en double
4,94065645841247E-324 précision
Valeurs positives :
4,94065645841247E–324 à
1,79769313486231E308
Integer –32 768 à 32 767 Nombre entier signé 2 octets
Long -2 147 483 648 à 2 147 483 647 Nombre entier signé 4 octets
Single Valeurs négatives : Nombre signé à virgule 4 octets
–3,402823E38 à –1,401298E–45 flottante en double
Valeurs positives : précision
1,401298E–45 à 3,402823E38

Définir les constantes


Pour certaines procédures, vous devez référencer une valeur particulière qui
Chapitre 4

change rarement, voire jamais. Au lieu de saisir la même valeur de manière répé-
titive, vous pouvez créer une référence, appelée constante, pour cette valeur.
Dans la définition de la constante, vous spécifiez la valeur réelle une seule fois
pour l’ensemble du code, puis vous y faites référence.
VBA s’accompagne d’un certain nombre de constantes prédéfinies, appelés cons-
tantes intrinsèques, qui simplifient votre utilisation des nombreuses fonctions
disponibles. Par exemple, dans une procédure qui crée un graphique en courbes,
vous pouvez utiliser la constante intrinsèque xlDot pour créer une ligne en poin-
tillés.

Remarque Pour afficher la liste des constantes intrinsèques, saisissez cons-


tantes intrinsèques dans la zone Aide de Visual Basic Editor.

Pour spécifier vos propres constantes, servez-vous de l’instruction Const, dont le


fonctionnement est similaire à celui de l’instruction Dim, excepté que vous devez
fournir la valeur de la constante et que vous ne pouvez déclarer qu’une constante
par ligne. Les lignes suivantes déclarent deux constantes, la première est une
valeur Byte comprenant le nombre de jours au mois de décembre et la deuxième
est une variable Single comprenant une valeur acceptée de pi.

Const conJoursDec as Byte = 31

66
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


Const conPi as Single = 3,1415929

Gérer les chaînes


Les types de données ne sont pas nécessairement numériques. Avec le type de
données String, les variables peuvent également contenir des valeurs textuelles.
Les chaînes de texte sont de longueur variable ou fixe. Les premières peuvent
contenir environ 2 milliards (2^31) de caractères, en fonction de la mémoire
disponible, et les deuxièmes jusqu’à 65 000 caractères (2^16).
On déclare les deux types de chaînes de manière similaire avec une instruction
Dim, comme pour les valeurs numériques. Les chaînes de longueur fixe ajoutent
du code qui précise la longueur de la chaîne. La première ligne du fragment de
code ci-après spécifie une chaîne de longueur variable et le deuxième ligne spé-
cifie une chaîne de longueur fixe de 25 caractères.

Dim MaChaine as String


Dim MaChaineFixe as String * 25

Les chaînes déclarées auxquelles aucune valeur n’a encore été assignée sont dites
chaînes vides. Pour assigner une valeur à une variable String, placez-la entre
guillemets doubles. Les lignes suivantes sont des exemples d’assignation de
valeurs à des chaînes :

MaChaine = "Hello world."


MaChaineFixe = "Ceci est une chaîne fixe."
MaChaineVide = ""

Chapitre 4
Remarque La longueur des chaînes fixes doit être exactement de
25 caractères. En conséquence, Visual Basic Editor ajoute des espaces ou
tronque la chaîne à la longueur correcte.

Gérer les dates et les heures


On stocke les dates et les heures dans le type de données Date. La plage de dates
que vous pouvez stocker débute le 1 e r janv ier 100 et se termine le
31 décembre 9999 pour toutes les heures de 0:00:00 à 23:59:59. Bien qu’une
variable Date puisse contenir la date et l’heure, si un seul de ces éléments vous est
utile, omettez l’autre.
Pour assigner des valeurs à une variable Date, délimitez une chaîne littérale
reconnaissable par le signe dièse (#). VBA reconnaît les dates et les heures quel
que soit leur format, mais il est préférable de rester aussi explicite que possible
pour s’assurer de l’utilisation de la valeur correcte. Voici quelques exemple de
dates et d’heures reconnus par VBA.

MaDate = #15 Juillet 2004#


DateDepart = #Avril 8, 2001#

67
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


MonHeure = #8:47 PM#
DateHeureDepart = #05/07/1992 15:56#

Visual Basic Editor peut modifier les dates et heures que vous saisissez pour reflé-
ter les paramètres de date et d’heure définis sur votre ordinateur. Par exemple,
#15 juillet 2004# peut devenir #15/7/2004#.

Remarque Lorsque vous saisissez des dates, VBA reconnaît l’année sur
deux chiffres et se sert de 2029 comme année pivot. Toutes les années sur
deux chiffres entre 00 et 29 sont reconnues comme faisant partie des années
2000. Les années restantes, 30 à 99, sont considérées comme faisant partie
des années 1900. Il est préférable de préciser les quatre chiffres de l’année
pour éliminer toute ambiguïté.

Gérer les variables Variant et convertir des types de


données
Les variables Variant constituent le fourre-tout des types de données dans VBA.
Si vous avez déclaré une variable que vous n’avez pas encore saisie, elle est rangée
dans le type de données Variant. Les variables Variant peuvent héberger tout
type de données à l’exception des chaînes de longueur fixe et sont imposées pour
certains types de données, comme Currency.
Si vous utilisez les variables Variant, VBA recherche le type de données le plus
adapté aux données stockées dans la variable, mais son choix n’est pas toujours le
bon. Si vous assignez une valeur de 64 * 1024 à une variable Variant, vous obte-
Chapitre 4

nez un message d’erreur. En effet, VBA considère les deux opérandes, 64 et 1024,
comme des types de données Integer et il tente de stocker le résultat comme
Integer. Le résultat réel, 65536, est trop grand pour un type de données Integer et
produit un message d’erreur.
Pour éviter que VBA n’opte pour un type de données erroné, vous pouvez con-
vertir les valeurs en un type de données spécifique. Dans l’exemple précédent, si
l’on convertit explicitement une des valeurs en type de données Long, VBA place
le résultat comme Long évitant ainsi l’erreur.
VBA propose des fonctions pour convertir les valeurs en n’importe quel type de
données numériques. À l’heure de convertir deux types de données, tenez
compte du niveau de précision employé par chaque type et des limites de chaque
type. Par exemple, en convertissant une variable Single, qui possède un compo-
sant décimal, en Long, qui n’en possède pas, on perd la partie décimale de la
valeur. En outre, la conversion inverse, autrement dit, reconvertir la variable en
Single, ne restaure pas la partie décimale de la valeur d’origine.

lngOffset = CLong(sngOffset)

Le tableau 4.8 fournit une liste des fonctions de conversion ainsi que le type de
données retourné et les règles d’arrondi. L’argument expression fourni aux fonc-

68
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


tions peut être n’importe quelle expression numérique ou expression de chaîne.
Le format des expressions de chaîne doit être reconnu comme valeur numérique,
mais e format spécifique varie en fonction de la situation géographique.
Tableau 4-8. Fonctions de conversion des types de données
Fonction Résultat Remarques
CBool(expression) True/False (–1/0) Toute expression différente de zéro est
True (–1).
CByte(expression) Byte ,5 est arrondi à l’entier le plus proche.
CCur(expression) Currency Arrondi de quatre chiffres après le
séparateur décimal. Non documenté à
partir de cinq décimales. Éventuels
résultats inattendus.
CDate(expression) Date/Time Les expressions numériques
retournent une date correspondant au
nombre de jours écoulés depuis le 1er
janvier 100. Les expressions de chaîne
retournent une date interprétée.
CDbl(expression) Double Arrondi au nombre à virgule flottante le
plus proche dans la plage.
CDec(expression) Decimal Arrondi à un nombre variable de
décimales en fonction de la taille du
nombre.
CInt(expression) Integer ,5 est arrondi à l’entier le plus proche.

Chapitre 4
CLng(expression) Long Integer ,5 est arrondi à l’entier le plus proche.
CSng(expression) Single Arrondi au nombre à virgule flottante le
plus proche dans la plage.
CVar(expression) Variant Les expressions numériques sont
converties en Variant Double. Les
expressions délimitées par # sont
converties en Variant Date. Toutes les
autres sont converties en chaîne.

Portée et durée de vie des variables


Au sein des modules et des procédures, les variables possèdent une durée de vie
et une visibilité définies. La durée de vie d’une variable débute au moment de sa
déclaration et se termine lorsque l’exécution de la procédure ou du module qui
a déclaré la variable est terminée. Si une procédure appelle une deuxième procé-
dure, les variables de la première procédure restent en vie et conservent leurs
valeurs durant l’exécution de la deuxième procédure.

69
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Remarque Si l’on utilise exclusivement le terme variable dans cette section


dans le cadre de la Portée et de la Durée de vie, ces règles s’appliquent éga-
lement aux constantes.

Si une variable est déclarée avec le mot clé Static, sa durée de vie est illimitée. Les
variables statiques d’une procédure conservent leurs valeurs entre les appels de
procédure tant que le module qui contient la procédure n’a pas été arrêté ou réi-
nitialisé. La syntaxe pour déclarer les variables statiques est similaire à celle des
variables normales, excepté que l’on remplace Dim par Static.
Outre leur durée de vie, les variables possèdent une visibilité. Les variables décla-
rées dans une procédure servent uniquement dans cette procédure : les autres
procédures du même module ne les voient pas. Cela signifie que deux procédu-
res au sein d’un même module peuvent chacune déclarer une variable portant le
même nom, ces deux variables constituant des entités séparées et uniquement
visibles par la procédure qui les a déclarées. Prenons l’exemple de code suivant :

Sub Procedure1()
Dim intCounter as Integer, intResult as Integer
intCounter = 87
intResult = intCounter * 74
End Sub

Sub Procedure2()
Dim intCounter as Integer, intResult
intResult = intCounter * 74
End Sub
Chapitre 4

Dans ces procédures, Procedure1 et Procedure2 ont déclaré une variable intitu-
lée intCounter. Dans Procedure1, intCounter est positionnée à 87, ce qui signifie
que intResult prend la valeur 6438 lorsque la troisième ligne s’exécute. Dans
Procedure2, la valeur de intCounter n’a pas été définie, elle conserve donc la
valeur initialisée pour Integer, soit 0. Lorsque la deuxième ligne s’exécute, intRe-
sult prend la également valeur 0 (0 * 74 = 0).
Pour employer une variable dans plusieurs procédures, vous devez la déclarer au
niveau du module. Les variables déclarées au niveau du module peuvent être
exploitées par n’importe quelle procédure de ce module. Pour déclarer une
variable de module, saisissez l’instruction de déclaration de la variable dans la
section Déclarations du module (après les instructions Option et avant toute pro-
cédure), comme le montre la figure 4.12.

70
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Figure 4-12. Pour mettre une variable à la disposition de toutes les procédures
d’un module, vous devez la déclarer dans la section Déclarations des modules.

Pour exposer les variables de module aux autres modules servez-vous de l’ins-
truction Public. Une variable déclarée Public est visible par tous les autres modu-
les et pas uniquement par le module dans lequel elle est déclarée.
Toutes les variables de module sont privées par défaut, mais, à des fins de clarté,

Chapitre 4
il est préférable de les déclarer avec Private au lieu de Dim. Les deux déclarations
suivantes illustrent la différence entre une déclaration Public et Private :

Private intCeModuleUniquement as Integer


Public intTousLesModules as Integer

Assignation de valeurs aux variables


Une variable n’est d’aucune utilité si vous ne lui assignez pas de valeur. Pour assi-
gner une valeur à une variable, on utilise le signe égal (=), également appelé opé-
rateur d’assignation. On commence par donner le nom de la variable, suivi de
l’opérateur d’assignation, puis de l’expression de la valeur à assigner. L’expres-
sion de la valeur peut être une valeur littérale ou une valeur plus complexe, telle
qu’une équation mathématique.

monNombre = 23
votreNombre = 16 + 85
maChaine = "Voici ma chaîne littérale"
deuxChaines = "Voici la première partie" + "Voici la deuxième partie"
maDate = #09/10/2004#

71
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Vous pouvez également assigner la valeur d’une variable à une autre ou référen-
cer la variable à laquelle vous assignez une valeur. Par exemple, si vous conservez
le total en cours des heures travaillées, vous pouvez actualiser le total des heures
travaillées en ajoutant le nombre d’heures travaillées pendant la journée en
cours.

ToursTotaux = TourCompteur
TotalHeuresTravaillees = TotalHeuresTravaillees +
HeuresTravailleesAujourdhui

Tableaux
Un tableau est un ensemble de valeurs du même type de données. Bien que le
tableau contienne plusieurs valeurs, VBA le considère comme une seule variable,
ce qui offre une certaine souplesse. Vous pouvez exploiter le tableau entier ou
uniquement un élément du tableau. Pour utiliser un élément individuel d’un
tableau, vous spécifiez son index, qui représente sa position dans le tableau,
autrement dit la position de l’élément dans la liste.
Les tableaux possèdent deux limites, une limite supérieure et une limite infé-
rieure. La limite inférieure par défaut est 0, ce qui peut entraîner quelque confu-
sion. L’index commençant à 0, le premier élément de la liste se trouve à la
position 0, autrement dit, on travaille toujours avec un index inférieur de 1 par
rapport à la position réelle dans de l’élément dans le tableau.
Si vous préférez commencer à 1, modifiez la limite inférieure du tableau avec
l’instruction Option Base. L’instruction Option Base doit être placée dans la sec-
Chapitre 4

tion des déclarations du module avant de définir des tableaux et avant toute pro-
cédure. L’instruction Option Base prend un seul argument, 0 ou 1, comme le
montre l’exemple suivant :

Option Base 1

Créer un tableau
Pour créer un tableau, on se sert de la même procédure que pour définir une
variable : on crée une instruction Dim, Private, Public ou Static, suivie du nom
du tableau et du type de données stockées dans le tableau. La définition d’une
limite supérieure dans la déclaration du tableau constitue le seule différence
entre la création d’un tableau et celle d’une variable (vous pouvez également spé-
cifier une limite inférieure, comme nous venons de le voir). Pour créer un
tableau de chaîne contenant les noms des 12 mois, par exemple, utilisez l’ins-
truction suivante :

Dim strMois(11) as String

Souvenez-vous : sauf spécification contraire, les tableaux commencent avec une


limite inférieure de 0. Ainsi, pour contenir 12 mois, on définit une limite supé-
rieure de 11 (0 à 11 donne douze éléments). Si vous aviez inclus l’instruction

72
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


Option Base 1 dans la section des déclarations, vous auriez déclaré le tableau de la
manière suivante :

Dim strMois(12) as String

Outre l’instruction Option Base, vous pouvez positionner la limite inférieure


d’un tableau sur une valeur autre que 0 ou 1 en la déclarant explicitement à la
création du tableau avec une clause To. Par exemple, pour déclarer un tableau qui
contient uniquement les trois mois d’été, utilisez l’instruction suivante :

Dim strMoisEte (6 To 8) as String

Créer des tableaux multidimensionnels


Tous les tableaux que nous avons étudiés jusqu’ici étaient de simples tableaux
unidimensionnels. Vous pouvez créer des tableaux multidimensionnels compre-
nant jusqu’à 60 dimensions, quoi qu’il soit rare de trouver une raison d’exploiter
plus de 3 ou 4 dimensions.
Pour déclarer un tableau multidimensionnel, on sépare les limites de chaque
dimension par des virgules. Un tableau bidimensionnel qui contiendrait une
valeur pour chaque mois sur 10 ans peut être déclaré avec l’instruction suivante :

Dim intTableauDecennie(9, 11) as Integer

Rien de plus simple que de visualiser un tableau multidimensionnel. Prenons


l’exemple d’un tableau bidimensionnel où la première dimension représente les
lignes du tableau et la deuxième dimension représente les colonnes, comme dans

Chapitre 4
une feuille de calcul Excel. Pour notre exemple, la troisième dimension sert à sui-
vre plusieurs tableaux ou feuilles de calcul. Par exemple, pour un magasin de
matériel de jardinage ouvert 16 heures par jour, on peut créer le tableau suivant :

Dim curVentesHoraires (12, 31, 16) as Currency

Création de tableaux dynamiques


Dans les exemples de déclaration précédentes, les tableaux étaient tous fixes,
autrement dit chaque tableau possède une taille fixe qui ne peut être modifiée.
Les tableaux dynamiques peuvent changer de taille à la demande. Cette expan-
sion n’est pas automatique : elle est la conséquence de commandes que l’on
ajoute aux procédures.
Pour déclarer un tableau dynamique, on omet la limite dans l’instruction de
déclaration. Par exemple, pour créer un tableau dynamique test, servez-vous de
l’instruction suivante :

Dim intTableauTest() as Integer

73
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Avant d’exploiter un tableau dynamique, vous devez définir le nombre d’élé-
ments qu’il contiendra avec l’instruction ReDim. ReDim permet de redéfinir, ou
redimensionner, un tableau le nombre d’éléments selon les besoins. L’instruction
ReDim vous devez uniquement fournir le nom du tableau et le nombre d’élé-
ments qu’il peut à présent contenir, comme dans la commande suivante :

ReDim intTableauTest(365)

L’instruction ReDim réinitialiser le tableau, ce qui entraîne la perte de toutes les


données contenues dans ses éléments. Pour augmenter le nombre d’éléments
que peut contenir un tableau sans perdre les données qu’il contient, vous devez
ajouter le mot-clé Preserve à la commande, ce qui donne :

ReDim Preserve intTableauTest(730)

Attention Il n’existe aucun moyen de réduire la taille d’un tableau sans per-
dre les données qu’il contient.

Vous pouvez stocker des données dans un tableau en spécifiant l’index de l’élé-
ment auquel vous voulez assigner la valeur. Les fragments de code suivants
créent un tableau qui contient les noms des quatre principales zones horaires du
continent américain et assignent ces noms au tableau :

Option Base 1
Dim strZonesHorairesUS(4) as String
strZonesHorairesUS(1) = "Eastern"
strZonesHorairesUS(2) = "Central"
Chapitre 4

strZonesHorairesUS(3) = "Moutain"
strZonesHorairesUS(4) = "Pacific"

Pour retrouver une valeur dans un tableau, on procède de manière similaire : on


spécifie l’index de l’élément à employer. L’instruction suivante retrouve le qua-
trième élément de la troisième dimension d’un tableau bidimensionnel :

intValeur = intMonTableau(3,4)

Écriture à l’écran et acceptation des entrées


utilisateur
L’acceptation d’entrées de la part des utilisateurs et l’écriture de messages d’état
constituent des tâches classiques que vous exploiterez dans nombre de procédu-
res. Dans VBA, on utilise deux méthodes classiques de Windows pour afficher et
demander des informations à un utilisateur, ce qui simplifie l’utilisation des
macros puisqu’elles présentent une interface familière à l’utilisateur.

74
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Créer une boîte de message


Servez-vous de la fonction MsgBox (message box, boîte de message) pour afficher
de petits messages informationnels ou poser des questions simples. Les boîtes de
message sont intéressantes à plusieurs titres. Outre le fait qu’elles constituent un
élément commun à toute application Windows, elles sont extrêmement simples
à employer. Voici une liste des tâches classiques pour lesquelles vous pouvez
employer des boîtes de message.
● Informer l’utilisateur d’une action qui va avoir lieu et éventuellement lui
permettre d’annuler l’action ou de choisir une action différente.
● Informer l’utilisateur d’une condition d’erreur qui s’est produite et lui
permettre d’entreprendre une action corrective.
● Informer l’utilisateur qu’une tâche particulière est terminée avec succès ou
non. Une boîte de message peut informer l’utilisateur du déroulement
exact de la tâche.
L’un des principaux avantages des boîtes de message est qu’elles permettent de
présenter un message à l’utilisateur que celui-ci ne peut ignorer. Il est même pos-
sible d’obliger l’utilisateur à réagir à la boîte de message en ne l’autorisant pas à
basculer vers ou ouvrir toute autre application.
Quelle que soit l’utilité des boîtes de message, elles possèdent néanmoins quel-
ques limites :
● Une boîte de message ne peut accueillir que un, deux ou trois boutons
parmi lesquels l’utilisateur doit opérer un choix, ce qui limite le nombre
d’options offertes.

Chapitre 4
● Les boutons existent uniquement sous forme prédéfinie : vous ne pouvez
pas ajouter de bouton personnalisé à une boîte de message.
● Aucune autre fonctionnalité n’est disponible dans une boîte de message.
Vous ne pouvez pas ajouter d’autres commandes pour présenter plus
d’options/d’informations à l’utilisateur.
Malgré ces limites, la boîte de message reste un outil particulièrement pratique
pour le programmeur. Voici la syntaxe d’une boîte de message.

prompt[, buttons] [, title][, helpfile, context]) as Integer


MsgBox (p

● prompt Un argument indispensable de la fonction MsgBox qui contient le


texte affiché dans la boîte de message. La longueur maximale du texte est
de 1024 caractères, selon la largeur des caractères employés. Si le texte
s’étend sur plusieurs lignes, spécifiez les retours à la ligne en insérant un
retour chariot avec la constante vbCr, (Chr$(13)), un saut de ligne avec la
constante vbLf, (Chr$(10)) ou une combinaison retour chariot/saut de
ligne avec la constante vbCrLf.

75
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Remarque S’il est plus simple de servir des constantes intrinsèques pour le
retour chariot et le saut de ligne, vous pouvez rencontrer (Chr$(13)) pour un
retour chariot, (Chr$(10)) pour un saut de ligne et (Chr$(13) & Chr$(10)) pour
les deux.

● buttons Argument numérique optionnel qui sert à spécifier les boutons et


l’icône affichée dans la boîte de message. En additionnant la valeur des
options sélectionnée, vous indiquez les boutons et l’icône affichés, l’iden-
tité du bouton par défaut et la modalité de la boîte de message. Vous pou-
vez utiliser les constantes intrinsèques de Visual Basic pour spécifier les
options. Le tableau 4.9 donne une liste complète des options disponibles.
Le bouton par défaut est sélectionné si l’utilisateur appuie sur la touche
Entrée. Si cette option est omise, la valeur 0 est employée par défaut.
● title Expression de chaîne optionnelle qui sert à indiquer le texte affiché
dans la barre de tire des boîtes de message. Si elle est omise, le texte affiché
est « Microsoft Excel ».
● helpfile Argument de chaîne optionnel qui sert à désigner le fichier d’aide
employé pour l’aide contextuelle sur la boîte de message. Si helpfile est
défini, l’argument context doit également l’être.
● context Cet argument numérique optionnel indique le numéro de con-
texte attribué à la rubrique d’aide appropriée. Si context est défini, l’argu-
ment helpfile doit également l’être.
La fonction MsgBox retourne une valeur entière qui indique le bouton cliqué par
l’utilisateur. Le tableau 4.10 liste ces valeurs.
Chapitre 4

Tableau 4-9. Options des boutons de boîtes de message


Constante intrinsèque Valeur Description
Boutons
vbOkOnly 0 Affiche uniquement un bouton OK.
vbOkCancel 1 Affiche un bouton OK et un bouton
Annuler.
vbAbortRetryIgnore 2 Affiche les trois boutons intitulés
Abandonner, Réessayer et Ignorer.
vbYesNoCancel 3 Affiche les trois boutons libellés Oui,
Non et Annuler.
vbYesNo 4 Affiche les boutons libellés Oui et Non.
vbRetryCancel 5 Affiche les boutons libellés Réessayer et
Annuler.
Icônes
vbCritical 16 Affiche un cercle plein rouge barré
d’une croix blanche.

76
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Tableau 4-9. Options des boutons de boîtes de message (Suite)


Constante intrinsèque Valeur Description
vbQuestion 32 Affiche une bulle contenant un point
d’interrogation.
vbExclamation 48 Affiche un triangle jaune contenant un
point d’exclamation.
vbInformation 64 Affiche une bulle contenant une lettre i
en minuscule.
Bouton par défaut
vbDefaultButton1 0 Définit le premier bouton comme
bouton par défaut.
vbDefaultButton2 256 Définit le deuxième bouton comme
bouton par défaut.
vbDefaultButton3 512 Définit le troisième bouton comme
bouton par défaut.
vbDefaultButton4 768 Définit le quatrième bouton (bouton
d’aide, par exemple) comme bouton par
défaut.
Modalité
vbApplicationModal 0 Marque la boîte de message comme
modale. L’utilisateur doit répondre au
message avant de pouvoir continuer
sont travail dans l’application en cours.

Chapitre 4
N’interfère pas avec les autres
applications.
vbSystemModal 4096 Marque la boîte de message comme
modale système. Elle s’affiche toujours
au-dessus des autres fenêtres
ouvertes, quelle que soit l’application
dans laquelle l’utilisateur bascule.
vbMsgBoxHelpButton 16384 Ajoute un bouton Aide à la boîte de
message.
vbMsgBoxSetForeground 65536 Affiche la boîte de message au premier
plan.
vbMsgBoxRight 524288 Aligne le texte de la boîte de message à
droite.
vbMsgBoxRtlReading 1048576 Affiche le texte de droite à gauche sur
les systèmes en langues arabe et
hébraïque.

77
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 4-10. Valeurs retournées par une boîte de message


Constante intrinsèque Valeur
vbOk 1
vbCancel 2
vbAbort 3
vbRetry 4
vbIgnore 5
vbYes 6
vbNo 7

Si la boîte de message contient un bouton Annuler, appuyer sur la touche Echap


produit le même résultat que cliquer sur ce bouton. Sélectionnez exactement
une option par groupe. Si vous sélectionnez plusieurs options, Excel utilise celle
dont la valeur est la plus élevée.
Pour afficher la boîte de message, il suffit d’indiquer l’argument title.

Sub Bienvenue()
MsgBox "Bienvenue dans Excel."
End Sub

Cette procédure produit une boîte de message simple, contenant uniquement le


texte et un bouton OK. L’instruction ne contenant pas de valeur pour le titre de
la boîte de message, celui-ci prend la valeur pas défaut, autrement dit le nom de
l’application (voir figure 4.13).
Chapitre 4

Figure 4-13. Rien de plus simple que de créer des boîtes de message
contenant un bref message de bienvenue ou d’information.

Outre les chaînes littérales, vous pouvez afficher des messages avec des variables
de chaîne. Le fragment de code suivant affiche une boîte de message contenant
deux lignes de texte, une icône d’information et un titre dans la barre de titre,
dont la figure 4.14 montre le résultat.

Sub Voyage()
strPrompt = "Bienvenue !" & vbCrLf & "Saisissez les données de
votre voyage ci-après."
MsgBox strPrompt, vbInformation, "Enregistrements des coupons de
voyage"
End Sub

78
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA

Figure 4-14. Il n’est guère plus compliqué de créer une boîte de message
contenant deux lignes de texte.

À l’heure de choisir l’icône à afficher dans la boîte de message, servez-vous des


directives suivantes issues des directives de l’interface utilisateur Windows de
Microsoft :
● Utilisez l’icône d’information pour fournir à l’utilisateur le résultat d’une
commande précédemment émise. Ne proposez aucun choix. Seul le bou-
ton OK doit accompagner une icône informative.
● Servez-vous de l’icône d’exclamation pour avertir l’utilisateur d’un pro-
blème ou d’une situation qui nécessite une décision de sa part avant de
continuer, par exemple, lorsque les données risquent d’être définitivement
modifiées ou supprimées.
● Employez l’icône de message critique pour informer l’utilisateur d’une
erreur ou d’un problème critique qui doit être corrigé avant de poursuivre
le traitement.
● N’utilisez pas l’icône d’interrogation. Elle n’existe qu’à des fins de rétro-
compatibilité.

Créer une boîte de saisie

Chapitre 4
Une boîte de saisie est similaire à une boîte de message en ce qu’elle affiche du
texte, mais elle présente une fonctionnalité supplémentaire : elle accepte des
réponses textuelles de la part des utilisateurs. Au lieu de présenter quelques bou-
tons sur lesquels l’utilisateur clique pour répondre aux messages affichés, les boî-
tes de saisie contiennent une zone de texte dans laquelle l’utilisateur peut saisir
une réponse. À l’instar d’une boîte de message, la boîte de saisie présente une
invite et un titre, mais aucune icône ne s’affiche et les boutons OK et Annuler
sont toujours présents. La figure 4.15 montre une boîte de saisie qui demande le
nom de l’utilisateur.

Figure 4-15. Dans une boîte de saisie, les utilisateurs peuvent saisir des
informations personnelles, telles que leur nom.

Voici la syntaxe d’une boîte de saisie.

79
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


prompt [, title][, default][, xpos][, ypos][, helpfile,
InputBox (p
context]) as String

● prompt Argument obligatoire de la fonction InputBox qui contient le


texte affiché dans la boîte de saisie. La longueur maximale du texte est de
1024 caractères, selon la largeur des caractères employés. Si le texte se com-
pose de plusieurs lignes, spécifiez les retours à la ligne en insérant un
retour chariot avec la constante vbCr, un saut de ligne avec la constante
vbLf ou une combinaison retour chariot/saut de ligne avec la constante
vbCrLf. Vous pouvez également utiliser les constantes intrinsèques
Visual Basic, vbCr, vbLf et vbCrLf pour représenter les caractères.
● title Expression de chaîne optionnelle qui indique le texte affiché dans la
barre de tire des boîtes de saisie. Si elle est omise, le texte affiché est
« Microsoft Excel ».
● default Valeur de chaîne optionnelle qui s’affiche dans la zone de texte
comme valeur par défaut si aucune autre information n’y est saisie. L’utili-
sateur peut effacer ou modifier la réponse par défaut.
● xpos Expression numérique optionnelle qui représente le nombre de
twips entre le bord gauche de l’écran et le bord gauche de la boîte de saisie.
Si vous omette xpos, la boîte de saisie est centrée horizontalement.

Remarque Un twip (twentieth of a point, vingtième de point) correspond à 1/


1440ème de pouce soit 1/567ème de centimètre. Ainsi, pour commencer une
boîte de saisie à un demi pouce du bord gauche de l’écran, vous assignez la
valeur 720 à xpos.
Chapitre 4

● ypos Expression numérique optionnelle qui représente le nombre de


twips entre le bord supérieur de l’écran et le bord supérieur de la boîte de
saisie. Si vous omettez ypos, la boîte de saisie est centrée verticalement.
● helpfile Argument de chaîne optionnel qui désigne le fichier d’aide
employé pour l’aide contextuelle sur la boîte de saisie. Si helpfile est défini,
l’argument context doit l’être également.
● context Argument numérique optionnel qui indique le numéro de con-
texte attribué à la rubrique d’aide appropriée. Si context est défini, l’argu-
ment helpfile doit également l’être.
La fonction InputBox retourne une valeur de chaîne. En conséquence, si la zone
de texte est vide ou que l’utilisateur appuie sur le bouton Annuler, la chaîne
retournée est vide.
La valeur retournée par une boîte de saisie est généralement stockée dans une
variable de chaîne de manière à pouvoir être exploitée ultérieurement. La frag-
ment de code suivant affiche une boîte de saisie qui demande sa ville de nais-
sance à l’utilisateur. Tous les paramètres sont saisis sous forme de variables, mais
nous aurions pu employer des littéraux ou des constantes.

80
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


Sub VilleNaissance()
Dim strResponse as String, strPrompt as String, strTitle as String
strResponse = "Strasbourg"
strPrompt = "Veuillez saisir votre ville de naissance."
strTitle = "Ma boîte de saisie"
strResponse = InputBox(strPrompt, strTitle, strResponse)
End Sub

Définition de variables objet


Avec VBA, vous n’êtes pas limité aux variables simples qui contiennent des don-
nées assignées à partir d’une autre variable ou dérivées d’un calcul. En fait, si
vous souhaitez créer une feuille de calcul, un graphique ou tout autre « élément »
Excel représenté par un objet dans le modèle d’objet VBA Excel, il vous suffit de
déclarer une variable objet. Avec l’instruction Dim, vous fournissez le nom de la
variable puis vous indiquez le type d’objet à créer, comme dans le fragment de
code ci-après, qui crée une référence à une feuille de calcul :

Dim monObj as Worksheet

Les variables objet ne s’emploient pas de la même manière que les variables nor-
males, essentiellement parce qu’une variable objet représente un pointeur vers
un objet et non l’objet lui-même. Autrement dit, dans le fragment de code pré-
cédent, nous n’avons pas créer la feuille de calcul, nous avons simplement indi-
qué à VBA que la variable monObj contient un objet Worksheet. Vous devez donc
fournir l’objet à assigner à la variable. Pour ce faire, vous utilisez la commande
Set. La commande suivante définit la variable objet monObj pour qu’elle pointe

Chapitre 4
vers la première feuille de calcul :

Set monObj = Worksheets(1)

Création de types de données personnalisés


VBA propose tous les types de données simples dont vous pouvez avoir l’utilité
dans le cadre de l’écriture de macros Excel. Dans certains cas, toutefois, vous
aurez besoin de types de données plus complexes. Vous pouvez, par exemple,
créer un type de données personnalisé qui contient les coordonnées horizontales
et verticales d’un point sur une carte, au lieu de stocker les valeurs dans des
variables séparées. Avec l’instruction Type, vous définissez un nouveau type de
données qui contiendra les deux coordonnées.

Private Type SituationCarte


sglHorizontal as Single
sglVertical as Single
End Type

Une fois le nouveau type défini, vous pouvez l’utiliser à votre guise dans tout
autre type de variable en vous servant d’un point (.) pour référencer les sous-élé-
ments du nouveau type.

81
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Dim maSituationCarte as SituationCarte
monPointCarte.sglHorizontal = 29,57
monPointCarte.sglVertical = 90

Les types de données personnalisés doivent être définis dans la section Déclara-
tions d’un module. Ils peuvent être Public ou Private.

Commande With…End With


Pour rendre votre code plus lisible et plus court, servez-vous de la commande
With...End With. La commande With...End With définit un objet que le compila-
teur VBA va supposer référencé par chaque propriété, méthode et événement
appelés dans la procédure. Une fois l’objet défini dans la ligne de code With, vous
ajoutez un point, suivi du nom de la propriété à définir. La procédure suivante,
par exemple, positionne les marges supérieure et inférieure d’une feuille de cal-
cul à 2 pouces et change l’orientation de la feuille de calcul de portrait (avec les
en-têtes de colonnes parallèles au bord le plus court du papier) en paysage (avec
les en-têtes de colonnes parallèles au bord le plus long du papier).

Sub ConfigPage()
With ActiveSheet.ConfiPage
.TopMargin = Application.InchesToPoints(2)
.BottomMargin = Application.InchesToPoints(2)
.Orientation = xlLandscape
End With
End Sub

Contrôle de la progression du programme


Chapitre 4

VBA est un langage piloté par l’événement dérivé de Visual Basic. Autrement dit,
le code que vous écrivez est exécuté comme réponse à une action qui s’est pro-
duite, comme un clic sur un bouton ou l’ouverture d’un classeur. L’exécution du
programme progresse de la première ligne de code à la dernière ligne de la pro-
cédure, mais il arrive que l’on doive interrompre l’exécution de cette progression
descendante. VBA propose plusieurs méthodes pour répéter certaines sections
de code, sauter des sections de code et prendre des décisions quant aux sections
à exécuter.

Instructions de sélection
L’une des facettes essentielles de la plupart des applications repose sur la possibi-
lités de prendre des décisions. Cette possibilité permet à l’application de prendre
une décision à partir de l’entrée reçue de l’utilisateur et de toute valeur qui peut
être calculée.

L’instruction If…Then…Else
L’instruction If...Then...Else constitue la forme de prise de décision la plus sim-
ple. Elle étudie une expression pour vérifier si elle est vraie ou non. Si l’expres-

82
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


sion est True, le code effectue l’une des actions définies. Dans le cas contraire, il
effectue un jeu d’actions différent.
Les instructions If...Then...Else prennent deux formes : sur une ligne ou sur plu-
sieurs lignes. Voici la syntaxe de ces deux formes.

If condition Then statements Else elsestatements

ou

If condition Then
[ statements ]
[ ElseIf elseifcondition [ Then ]
[ elseifstatements ] ]
[ Else
[Else elsestatements] ]
End If

● condition Expression obligatoire qui prend la valeur booléenne True ou


False.
● statements Bloc optionnel d’une ou de plusieurs instructions à exécuter si
condition est True.
● elseifcondition Expression obligatoire si ElseIf est présent et qui prend la
valeur booléenne True ou False.
● elseifstatements Bloc optionnel d’une ou de plusieurs instructions à exé-
cuter si elseifcondition est True.
● elsestatements Bloc optionnel d’une ou de plusieurs instructions à exécu-

Chapitre 4
ter si aucune condition ou elseifcondition est True.
● End If Élément obligatoire dans la forme multilignes qui termine le bloc
If…Then.
Avec les instructions If...Then...Else vous devez employer les opérateurs de com-
paraisons pour construire les instructions conditionnelles. Les opérateurs de
comparaison comparent plusieurs valeurs et décident si les valeurs sont égales les
unes par rapport aux autres ou si l’une est supérieure à l’autre. Ils retournent
ensuite une réponse True ou False. Le tableau 4.11 liste les six opérateurs de com-
paraison.
Tableau 4-11. Opérateurs de comparaison
Opérateur Description
= Détermine si deux valeurs sont égales.
< Détermine si la valeur située à gauche de l’opérande est
inférieure à la valeur située à droite.
> Détermine si la valeur située à gauche de l’opérande est
supérieure à la valeur située à droite.
<= Détermine si la valeur située à gauche de l’opérande est
inférieure ou égale à la valeur située à droite.

83
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 4-11. Opérateurs de comparaison (Suite)


Opérateur Description
>= Détermine si la valeur située à gauche de l’opérande est
supérieure ou égale à la valeur située à droite.
<> Détermine si deux valeurs sont différentes.

Les fragments de code suivants montrent des exemples de l’utilisation de l’ins-


truction If...Then...Else pour déterminer si l’âge d’une personne lui permet de
voter :

If intAge >= 18 Then


boolVoteAutorise = True
Else
boolVoteAutorise = False
End If

If boolVoteAutorise Then
[Affiche bulletin et enregistre le vote]
End If

intReturn = MsgBox("Voulez-vous continuer ?", vbYesNo + vbExclamation,


"Mon App")
If intReturn = vbYes Then
[Continue traitement]
Else
[Sortie procédure]
End If
Chapitre 4

Instructions Select Case


Les instructions Select Case permettent de vérifier simultanément plusieurs
valeurs. Supposons que vous deviez calculer différentes valeurs en fonction du
mois. Vous devez écrire onze instructions If...Then...Else pour vérifier les douze
mois. Avec une instruction Select Case, le nombre d’instructions conditionnelles
est ramené à un, ce qui simplifie la lecture et le maintien de votre code.
Voici la syntaxe d’une instruction Select Case.

Select [Case] testcondition


[Case expressionlist
[ statements ]
[Case Else
elsestatements
End Select

● testcondition Expression obligatoire qui doit prendre pour valeur l’un des
types de données de base, comme Boolean, Integer, String et ainsi de suite.
● expressionlist Liste de clauses d’expression représentant les valeurs de tes-
texpression. On sépare les différentes clauses d’expression par des virgules.
Elles peuvent prendre les formes suivantes :

84
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


● Expression1 To Expression2 Utilisé pour représenter une plage de valeurs
allant de Expression1 à Epression2. Expression1 doit être inférieur à
Expression2.
● [Is] comparisonoperator Expression comparisonoperator sert à indiquer
une restriction sur la valeur de Expression.
● Expression Les expressions de expressionlist peuvent être de n’importe
quel type de données à condition qu’elles soient implicitement converti-
bles dans le type de testcondition.
● Statements Une ou plusieurs instructions sont exécutées si testexpression
correspond à l’une des clauses de expressionlist.
● Else statements Une ou plusieurs instructions sont exécutées si testexpres-
sion ne correspond pas à l’une des clauses de expressionlist.
● End Select Obligatoire pour marquer la fin du bloc Select Case.

Le fragment de code suivant expose une utilisation de l’instruction Select Case


pour attribuer à une variable le nombre de jours de chaque mois.

Select Case strMois


Case "Février"

intJours = 28

Case "Avril", "Juin", "Septembre", "Novembre"


intJours = 30

Case "Janvier", "Mars", "Mai", "Juillet", "Août", "Octobre",


"Décembre"

Chapitre 4
intJours = 31

End Select

Ce fragment constitue un exemple simple qui spécifie le nombre de jours dans


un mois, mais qui ne tient pas compte des années bissextiles. Nous devons ajou-
ter davantage de code à la clause « Février » pour configurer correctement le
nombre de jours du mois de février :

Case "Février"
If (intAnnee Mod 100) = 0 Then
If (intAnnee Mod 400) = 0 Then
intJours = 29
Else
intJours = 28
End If
Else
If (intAnnee Mod 4) = 0 Then
intJours = 29
Else
intJours = 28
End If
End If

85
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Cet exemple montre également que l’on peut imbriquer des instructions
If...Then...Else dans une instruction Select Case.

Boucles
Il vous arrivera souvent de devoir répéter une tâche donnée. Pour vous aider,
VBA propose plusieurs méthodes de création de boucles. Les boucles peuvent
être classées dans deux catégories : les boucles itératives et les boucles logiques.

Boucles itératives
Les boucles itératives, qui servent à assurer un certain nombre de répétitions,
possèdent un point de départ et de fin définitifs. Il existe deux boucles itératives,
dont le style et la syntaxe sont similaires.
Le premier type de boucle itérative, la boucle For…Next, sert essentiellement
pour compter et répond aux besoins des tableaux. Voici la syntaxe d’une boucle
For...Next.

For counter = start To end [Step step]


statements]
[s
[Exit For]
statements]
[s
Next counter

● counter Variable numérique obligatoire utilisée comme compteur. Il peut


s’agir d’une valeur Boolean ou d’un membre de tableau.
● start Valeur obligatoire employée comme point de départ du tableau.
Chapitre 4

● end Valeur obligatoire employée comme point final du tableau.


● step Valeur optionnelle qui sert de valeur d’incrémentation du compteur
à chaque itération de la boucle. La valeur de step peut être positive ou
négative. Sa valeur par défaut est 1.
● statements Une ou plusieurs lignes d’instructions optionnelles exécutées
pendant chaque itération de la boucle.
● Exit For Instruction optionnelle employée pour quitter prématurément la
boucle. L’exécution du code s’arrête à la première ligne qui suit l’instruc-
tion Next counter.
● Next counter Instruction obligatoire qui marque la fin de la boucle
For...Next.
Vous pouvez omettre la variable counter dans l’instruction Next, mais ce n’est pas
recommandé. En incluant le compteur, vous vous protégez davantage contre les
erreurs de programmation.
Comme nous l’avons étudié précédemment, la boucle For...Next assure qu’un
nombre donné de répétitions est réalisé. Supposons que vous disposiez d’un
tableau contenant 26 éléments et que vous vouliez définir chaque élément par la
lettre de l’alphabet correspondante. La boucle For...Next constitue le meilleur

86
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


moyen d’y parvenir. Le code suivant crée un tableau de 26 membres, assigne une
lettre de l’alphabet à chaque élément puis construit une boîte de message qui
affiche ces éléments.
Sub TableauAlphabet()
Dim strABC (1 To 26) as String
Dim intCounter as Integer
Dim strPrompt as String
For intCounter = 1 to 26
strABC(intCounter) = Chr$(intCounter + 64)
Next intCounter
strPrompt = "Le tableau strABC contient les valeurs suivantes :" &
vbCrLf
For intCounter = 1 to 26
strPrompt = strPrompt & strABC(intCounter)
Next intCounter
MsgBox strPrompt
End Sub

Les boucles For...Next peuvent être imbriquées les unes dans les autres, ce qui
permet de construire des itérations bien plus complexes. L’exemple suivant
modifie l’exemple précédent en construisant un tableau bidimensionnel et en
affichant les éléments du tableau en sens inverse :

Dim strABC(100 To 101, 1 To 26) As String


Dim intCounter1 As Integer, intCounter2 As Integer
Dim strPrompt as String
For intCounter1 = 100 To 101
For intCounter2 = 1 To 26
strABC(intCounter1, intCounter2) = Chr$(intCounter2 + 64)

Chapitre 4
Next intCounter2
Next intCounter1
strPrompt = "Le tableau strABC contient les valeurs suivantes :"

For intCounter1 = 100 To 101


strPrompt = strPrompt & vbCrLf & "Dimension" & Str$(intCounter1) & ": "
For intCounter2 = 26 To 1 Step -1
strPrompt = strPrompt & strABC(intCounter1, intCounter2)
Next
Next intCounter1
MsgBox strPrompt

L’autre boucle itérative, la boucle For Each...Next, sert dans le cadre des collec-
tions d’objets ou de tableaux, pour assurer que chaque membre du groupe est
concerné. Sa syntaxe est similaire à celle d’une boucle For...Next.

For Each element In group


statements]
[s
[Exit For]
statements]
[s
Next element

87
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


● element Objet ou variable Variant obligatoire utilisé pour pointer vers
chaque membre du groupe. Pour les boucles d’un tableau, il peut unique-
ment s’agir d’une variable de type Variant, quel que soit le type de données
du tableau.
● group Collection d’objets ou tableau obligatoires contenant les éléments
affectés par la boucle.
● statements Une ou plusieurs lignes d’instructions optionnelles exécutées
pendant chaque itération de la boucle.
● Exit For Instruction optionnelle employée pour quitter prématurément la
boucle. L’exécution du code s’arrête à la première ligne qui suit l’instruc-
tion Next element.
● Next element Instruction obligatoire qui marque la fin de la boucle
For...Next.
La boucle For Each...Next représente une méthode pratique pour effectuer la
même action sur une collection d’objets (nous détaillerons les collections
d’objets et leur utilisation aux chapitres 6, 7 et 8). Par exemple, pour renommer
toutes les feuilles de calcul d’un classeur, vous pouvez utiliser une boucle For
Each...Next pour demander à l’utilisateur le nom de chaque feuille de calcul, la
renommer et continuer avec la suivante jusqu’à ce que toutes les feuilles de calcul
soient renommées.

Sub RenommerFeuillesCalcul()
Dim maFeuilleCalcul As Worksheet
Dim strPrompt As String, strResult As String
Dim intCounter as Integer
Chapitre 4

intCounter = 0
strPrompt = "Veuillez saisir le nouveau nom de la feuille de calcul "
For Each maFeuilleCalcul In Application.Worksheets
strResult = InputBox(strPrompt & maFeuilleCalcul.Name)
maFeuilleCalcul.Name = strResult
intCounter = intCounter + 1
Next maFeuilleCalcul
strPrompt = "Nombre total de feuilles de calcul renommées =" &
Str$(intCounter)
MsgBox strPrompt
End Sub

Boucles logiques
Les boucles logiques ne possèdent pas de nombre prédéterminé d’itérations.
Elles se basent sur une expression logique qui teste une condition particulière
puis répètent la boucle jusqu’à ce que la condition soit rencontrée ou annulée,
selon le type de boucle.
Il existe quatre formes de boucles logiques, mais on peut les simplifier en deux
catégories : celles qui testent la condition avant d’effectuer une action et celles
qui testent la condition après avoir effectué une action. Dans chaque catégorie,

88
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


les deux boucles diffèrent en ce que l’une boucle lorsque la condition est vraie et
l’autre lorsque la condition est fausse.
Les boucles Do While…Loop et Do Until…Loop testent la condition avant
d’effectuer l’action de la boucle. La différence entre les deux boucles est que la
boucle Do While effectue l’action si la condition est vraie et Do Until effectue
l’action si la condition est fausse. Pour choisir celle à employer, vous devez trou-
ver la manière la plus simple d’exprimer la condition puis choisir la boucle qui
lui correspond au mieux.
Comme le montre le code suivant, la syntaxe des deux boucles est simple :

Do While condition
statement]
[s
[Exit Do]
statement]
[s
Loop
et
Do Until condition
statement]
[s
[Exit Do]
statement]
[s
Loop

● condition Expression numérique ou expression de chaîne obligatoire


dont la valeur est True ou False.
● statement Une ou plusieurs lignes d’instructions exécutées pendant la
boucle.
● Exit Do Instruction optionnelle employée pour quitter prématurément la

Chapitre 4
boucle.
● Loop Instruction obligatoire qui marque la fin du bloc d’instruction.

La boucle Do While teste d’abord la condition, puis entre dans la boucle et s’exé-
cute tant que condition est True. Cet exemple effectue une simple boucle de
comptage, similaire à l’instruction For…Next :
Dim intCounter as Integer
intCounter = 1
Do While intCounter <= 10
intCounter = intCounter + 1
Loop

La boucle Do Until suivante effectue les mêmes actions que la boucle Do While,
mais notez le changement dans l’expression de la condition :

Dim intCounter as Integer


intCounter = 1
Do Until intCounter = 11
intCounter = intCounter + 1
Loop

89
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Ces deux exemples exécutent une boucle de comptage simple de 1 à 10. De ces
deux exemples, il est plus simple de comprendre que la boucle Do While compte
de 1 à 10. La boucle Do Until semble compter jusqu’à 11. En fait, l’action ne
s’effectue pas lorsque le compteur atteint 11 : elle s’effectue pour la dernière fois
avec la valeur 10.
À l’instar des boucles Do While et Do Until, les boucles Do…Loop While et
Do…Loop Until sont similaires. Elles vérifient une expression conditionnelle à la
fin de la boucle, garantissant au moins un passage dans la boucle. La boucle
Do...Loop While boucle si la condition est vraie et la boucle Do...Loop Until bou-
cle si la condition est fausse. Voici les déclarations de leur syntaxe :

Do
statement]
[s
[Exit Do]
statement]
[s
Loop While condition
et
Do
statement]
[s
[Exit Do]
statement]
[s
Loop Until condition

● condition Expression obligatoire qui prend la valeur True ou False.


● statement Une ou plusieurs lignes d’instructions exécutées pendant la
boucle.
● Exit Do Instruction optionnelle employée pour quitter prématurément la
Chapitre 4

boucle.
● Loop Instruction obligatoire qui marque la fin du bloc d’instruction Do
While ou Do Until.
L’exemple suivant incrémente un compteur à chaque passage dans la boucle et
utilise une boîte de message pour demander à l’utilisateur s’il souhaite
continuer :
Sub PermissionLoop()
Dim intCounter As Integer, strPrompt As String
Dim intResult as Integer

intCounter = 0
Do
intCounter = intCounter + 1
strPrompt = "Vous avez bouclé" & Str$(intCounter) & " fois." _
& vbCrLf & "Voulez-vous continuer ?"
intResult = MsgBox(strPrompt, vbYesNo + vbExclamation)
Loop While intResult = vbYes
End Sub

Voici le même exemple avec une instruction Do…Loop Until.

Sub PermissionLoop2()

90
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


Dim intCounter As Integer, strPrompt As String
Dim intResult as Integer

intCounter = 0
Do
intCounter = intCounter + 1
strPrompt = "Vous avez bouclé" & Str$(intCounter) & " fois." _
& vbCrLf & "Voulez-vous continuer ?"
intResult = MsgBox(strPrompt, vbYesNo + vbExclamation)
Loop Until intResult = vbNo
End Sub

Instruction GoTo
L’instruction GoTo oblige la procédure à passer immédiatement à une autre sec-
tion de la procédure et ce sans condition. La section de code à atteindre doit être
marquée par un numéro de ligne ou une étiquette de ligne pour permettre au
programme d’avancer ou de reculer dans la procédure. L’utilisation de l’instruc-
tion GoTo est déconseillé car elle complexifie le débogage et la compréhension
des procédures.
Voici la syntaxe de l’instruction GoTo :

GoTo line

Dans le code précédent, line représente une étiquette de ligne obligatoire


(numéro de ligne ou étiquette de ligne) définie au sein de la même procédure.
Les numéros de ligne peuvent être n’importe quelle série de chiffres commen-
çant à la première colonne. Les étiquettes de ligne peuvent se composer de toute

Chapitre 4
série de caractères qui commence par une lettre et se termine par deux points (:).
Les étiquettes de ligne ne sont pas sensibles à la casse et doivent commencer dans
la première colonne.
Dans la mesure où les instructions GoTo risquent de déstructurer le code, leur
utilisation est fortement déconseillée. Toutefois, exploitées avec parcimonie, elles
peuvent être extrêmement utiles. La prochaine section, consacrée à la gestion des
erreurs, explique quand et comment utiliser l’instruction GoTo et les étiquettes
de ligne.

Gestion des erreurs


Chaque procédure doit s’accompagner d’une forme de gestion des erreurs,
même si elle se contente d’informer l’utilisateur de la cause de l’erreur avant de
quitter. Les procédures qui sont appelées par d’autres procédures et pas nécessai-
rement invoquées par l’utilisateur, par exemple, doivent retourner à la procédure
appelante une indication quant à la réussite de leur exécution.
Prenons l’exemple de l’instruction Select Case que nous avons étudiée plus tôt
dans ce chapitre pour calculer le nombre de jours dans un mois. Elle vérifiait si la

91
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


variable intMois correspondait à l’une des clauses attendues. Si intMois contient
une valeur hors de la plage de 1 à 12, l’instruction Select Case retourne –1.
En retournant une valeur qui se trouve en-dehors de la plage de valeurs atten-
dues, elle permet à toute instruction qui dépend de la valeur de intMois de con-
firmer la légitimité de la valeur.
Outre l’ajout de code de validation des données pour vérifier votre code, VBA
vous permet de récupérer les erreurs qu’il détecte. En récupérant les erreurs que
VBA détecte, votre procédure peut éventuellement les corriger et continuer son
exécution.
Pour récupérer les erreurs VBA, servez-vous de la commande On Error. Elle
prend la forme de base

On Error Goto line label

Dans cette ligne de code, line label spécifie la section de code que vous avez écrite
pour gérer les erreurs.
Le fragment de code suivant montre comment récupérer les erreurs et brancher
le code sur une étiquette libellée ErrorHandler :

On Error GoTo ErrorHandler


[statements]
ErrorHandler:
[error handler statements]

Pour démarrer la récupération des erreurs le plus rapidement possible, placez


Chapitre 4

l’instruction On Error au début de la procédure. Vous n’êtes pas limité à un ges-


tionnaire d’erreur par procédure. Vous pouvez désigner différents gestionnaires
d’erreurs à mesure que la procédure progresse, et même revenir à des gestionnai-
res d’erreurs antérieurs. Le fragment de code suivant illustre une méthode de
construction d’une série de routines de gestion d’erreurs :

On Error GoTo ErrorHandler1


[statements]
On Error GoTo ErrorHandler2
[statements]
On Error GoTo ErrorHandler1
[statements]
ErrorHandler1:
[errorhandler1 statements]
ErrorHandler2:
[errorhandler2 statements]

VBA exécute une procédure complète avant d’atteindre la fin. En conséquence,


vous devez inclure des instructions pour que VBA ignore tous les gestionnaires
d’erreurs que vous avez écrits si aucune erreur n’est récupérée. Pour empêcher
VBA d’exécuter le code de gestion des erreurs, on le place généralement à la fin
d’une procédure, puis dans la ligne immédiatement avant le gestionnaire

92
Partie 2 : Visual Basic pour Applications

Démarrage de la programmation VBA


d’erreurs, on insère une instruction Exit Sub ou Exit Function pour quitter la
procédure.

Pour plus d’informations sur les deux types de procédures (les procédures Sub et les pro-
cédures Function), reportez-vous au chapitre 5, « Création de procédures Sub et
Function ».

Une fois une erreur récupérée, comment savoir de quelle erreur il s’agit et quelle
action corrective a été entreprise ? Pour décrire l’erreur, VBA propose diverses
propriétés de l’objet Err. Deux de ces propriétés, Number et Description, fournis-
sent respectivement un code d’erreur numérique et une chaîne descriptive de
l’erreur. Le code permet de reconnaître et de corriger les erreurs communes et
attendues.
Les gestionnaires d’erreurs fonctionnent uniquement pour la procédure dans
laquelle ils apparaissent. Une fois la procédure terminée, la récupération
d’erreurs est désactivée. Pour désactiver vous-même le gestionnaire d’erreurs,
servez-vous de l’instruction suivante :

On Error GoTo 0

Si le gestionnaire d’erreurs parvient à résoudre le problème qui a produit


l’erreur, vous voudrez reprendre l’exécution de la procédure. Pour ce faire, ser-
vez-vous de la commande Resume. Placez à l’intérieur d’un gestionnaire
d’erreurs, elle reprend l’exécution au niveau de l’instruction qui a généré
l’erreur.
Quelquefois, le gestionnaire d’erreurs ne parvient pas à corriger le problème,

Chapitre 4
mais si l’erreur n’est pas fatale à l’exécution, elle ne fait pas échouer le reste de la
procédure. Si tel est le cas, vous pouvez reprendre l’exécution de la procédure
avec l’instruction Resume Next. L’exécution se poursuit avec l’instruction qui
suit immédiatement celle qui a provoqué l’erreur. Vous pouvez également spéci-
fier la reprise de l’exécution à une instruction spécifique avec l’instruction
Resume line. L’exécution continue au niveau de l’instruction désignée par line.
Le fragment de code suivant illustre une méthode classique d’utilisation des ges-
tionnaires d’erreurs :

On Error GoTo ErrorHandler


[statements]
FinishedSub:
Exit Sub
ErrorHandler:
MsgBox(str$(Err) & ": " & Err.Description, vbInformation, _
"Error Handler")
Resume FinishedSub

Ce chapitre plutôt long, mais espérons-le complet, a exploré toutes les techni-
ques de base dont vous avez besoin pour créer des macros VBA. Vous avez appris
à définir et à assigner des valeurs aux variables, à contrôler la progression des
programmes avec des boucles et des tests et à gérer les erreurs qui les accompa-

93
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


gnent. Au chapitre 5, vous allez apprendre à créer et à exploiter les procédures
qui contiennent le code VBA.
Chapitre 4

94
Partie 2 : Visual Basic pour Applications

Chapitre 5
Création de procédures
Sub et Function
Définition de procédures Sub. . . . 95 Organisez votre réussite . . . . . . 115
Définition de procédures
Function . . . . . . . . . . . . . . . . . . . 109

Dans les premiers chapitres de ce livre, et plus particulièrement dans le


chapitre 4, nous avons exploité des exemples de procédures pour illustrer l’utili-
sation de Visual Basic pour Applications (VBA) avec Microsoft Excel. Le
chapitre 4 a introduit les constructs de programmation que vous pouvez
employer pour créer et contrôler le fonctionnement du code VBA : répéter un
extrait de code un certain nombre de fois dans une boucle For...Next, influencer
chaque membre d’une collection dans une boucle For Each...Next ou répéter le
code jusqu’à satisfaire une condition. Il à est présent temps d’entrer dans les
détails.
Dans ce chapitre, vous apprendrez à ajouter des procédures Sub et Function à vos
modules de code, à déterminer si les procédures doivent être à la disposition des
autres classeurs, à contrôler si Excel se rappelle les valeurs générées par une pro-
cédure jusqu’à la fermeture du programme et à transférer des valeurs vers et à
partir de procédures de sorte que vous puissiez utiliser les résultats ailleurs dans
vos programmes.

Définition de procédures Sub


Vous pouvez créer deux types de procédures dans Excel VBA : une procédure Sub
ou une procédure Function. Quelle est la différence entre les deux types de
procédures ? Il s’agit de définir si la procédure retourne une valeur que l’on peut
ou non employer ailleurs dans le programme. Par exemple, une procédure Sub
configurée pour vérifier qu’un achat va entraîner un dépassement du crédit
autorisé pour un client peut prendre la forme suivante :

Private Sub VérifierLimiteCrédit()


If ActiveCell.Value + Range ("C3").Value > Range ("C2").Value Then
MsgBox("Cet achat excède la limite de crédit du client.")
End If
End Sub

95
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


En parcourant la procédure, vous remarquerez qu’aucune instruction n’envoie
de valeur à une procédure externe. Comme nous l’avons étudié au chapitre 4, la
boîte de message sert uniquement à envoyer une sortie à l’écran : aucune valeur
n’est passée aux autres procédures.

Pour plus d’informations sur le passage de valeurs entre procédures, reportez-vous à la


section « Passer des arguments aux procédures », plus loin dans ce chapitre.

Ce rapide tour d’horizon terminé, nous pouvons maintenant passer à une des-
cription plus formelle de ce qui constitue une procédure Sub.

Private | Public] [S
[P Static] Sub name [(arglist)]
statements]
[s
Exit Sub]
[E
statements]
[s
End Sub

Le tableau 5.1 décrit les éléments d’une procédure Sub.


Tableau 5-1. Éléments d’une procédure Sub
Élément Description
Public Élément optionnel qui indique que la procédure Sub est
accessible à toutes les procédures de tous les modules. S’il
est employé dans un module qui contient une instruction
Option Private, la procédure n’est pas disponible en-dehors
du projet.
Private Élément optionnel qui indique que la procédure Sub est
uniquement accessible aux autres procédures du module
dans lequel elle est déclarée.
Static Élément optionnel qui indique que les variables locales de la
procédure Sub sont préservées entre les appels. L’attribut
Static n’affecte pas le variables déclarées en-dehors de la
procédure Sub, même si elles sont exploitées dans la
procédure.
name Élément obligatoire qui indique le nom de l’élément Sub (par
Chapitre 5

exemple, Sub CreditDisponible). Il n’est pas nécessaire que


le nom suive les conventions de nommage standard.
arglist Liste optionnelle de variables représentant les arguments
passés à la procédure Sub lorsqu’elle est appelée. Les
différentes variables sont séparées par des virgules.
statements Groupe optionnel d’instructions à exécuter au sein de la
procédure Sub.

Pour ajouter une procédure à un module de code, procédez comme suit :


1 Cliquez sur Outils, Macro, Visual Basic Editor pour afficher ce dernier.

96
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


2 Si nécessaire, cliquez sur Insertion, Module pour créer un nouveau
module de code (ou si vous souhaitez créer un nouveau module pour des
raisons organisationnelles).
3 Cliquez sur Insertion, Procédure pour afficher la boîte de dialogue Ajou-
ter une procédure.

4 Saisissez le nom de la procédure dans la zone Nom.


5 Sélectionnez l’option Sub.
6 Cliquez sur OK.

Remarque La boîte de dialogue Ajouter une procédure propose d’autres


options. Nous les étudierons plus loin dans ce chapitre.

Ceci fait, l’esquisse d’une procédure apparaît dans le module de code actif,
comme le montre la figure 5.1.

Chapitre 5

97
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Figure 5-1. Dès que vous cliquez sur OK dans la boîte de dialogue Ajouter une
procédure, le squelette d’une nouvelle procédure s’affiche dans le module de
code actif.

Complétez les détails de la procédure en vous servant de l’Explorateur d’objets


de Visual Basic Editor pour choisir les objets, les fonctions prédéfinies, les pro-
priétés, les événements et ainsi de suite. Le listing de code suivant contient une
procédure qui vérifie le contenu de la cellule active et, si la valeur correspond à
l’une de celles du test de l’instruction If…Then, remplace la couleur de police de
la cellule par la couleur spécifiée.

Sub CreditDisponible()
With ActiveCell
If .Value = "" Then Exit Sub
If .Value <= 1000 Then .Font.Color = vbRed
If .Value > 1000 Then .Font.Color = vbBlack
Chapitre 5

If .Value > 4999 Then .Font.Color = vbBlue


If .Value > 9999 Then .Font.Color = vbGreen
End With
End Sub

Les couleurs listées dans le code précédent sont représentées par des constantes VBA,
mais il existe des millions de couleurs spécifiques. Pour plus d’informations sur l’utilisa-
tion des couleurs dans le cadre de la mise en forme du contenu des éléments de votre
classeur, reportez-vous au chapitre 10, « Mise en forme d’objets Excel ».

Il est intéressant de noter que la procédure suivante, bien qu’apparemment équi-


valente, utilise une instruction Select Case pour tester les valeurs de la cellule
active, génère un résultat incorrect.

Sub CreditDisponibleCase()

98
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


Solde = ActiveCell.Value
Select Case Solde
Case ""
Exit Sub
Case Is >= 10000
ActiveCell.Font.Color = vbGreen
Case Is <= 9999
ActiveCell.Font.Color = vbBlue
Case Is <= 4999
ActiveCell.Font.Color = vbBlack
Case Is <= 1000
ActiveCell.Font.Color = vbRed
End Select
End Sub

Au Quotidien
Les pièges des instructions Case et des mises en formes conditionnelles

Si on compare les versions If…Then et Select Case des routines CreditDispo-


nible, on remarque que les instructions If…Then vérifient les valeurs supérieu-
res à une autre valeur (par exemple, If .Value > 5000 Then .Font.Color =
vbBlue), alors que toutes les instructions Case hormis la dernière vérifient les
valeurs d’une plage définie. Dans une instruction Select Case, vous devez
employer des règles définitives. En effet, dès l’instant qu’Excel trouve un cas
vrai, il quitte l’instruction Select Case. En conséquence, si vous évaluez une
valeur de cellule de 5500 avec l’instruction If…Then de l’exemple précédent,
la procédure passe par les étapes suivantes :

1 Est-ce que la cellule est vide ? Non, donc n’entreprendre aucune action.
2 La valeur est-elle inférieure à 1000 ? Non, donc n’entreprendre aucune
action.
3 La valeur est-elle supérieure à 1000 ? Oui, donc remplacer la couleur de
police par du noir.
4 La valeur est-elle supérieure à 5000 ? Oui, donc remplacer la couleur de
police par du bleu.
Chapitre 5

5 La valeur est-elle supérieure à 10 000 ? Non, donc n’entreprendre


aucune action.

La routine change la couleur de la police une fois de trop (d’abord en noir, puis
en bleu), mais le résultat obtenu est correct et l’étape supplémentaire ne pose
pas de problème pour un programme simple sur un ordinateur qui peut effec-
tuer de millions de calculs à la seconde. En revanche, les règles de l’instruc-
tion Select Case étant construites selon le même ordre, le contenu de la cellule
s’affiche en noir et non en bleu.

Select Case Solde


Case ""
Exit Sub
Case Is < 1000

99
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

ActiveCell.Font.Color = vbRed
Case Is >= 1000
ActiveCell.Font.Color = vbBlack
Case Is >= 5000
ActiveCell.Font.Color = vbBlue
Case Is >= 10000
ActiveCell.Font.Color = vbGreen
End Select

Le résultat est faux. En effet, la routine quitte lorsqu’elle trouve que la valeur
de la cellule est inférieure ou égale à 9999. Vous rencontrerez le même pro-
blème si vous créez des mises en forme conditionnelles en passant par le
menu Format, Mise en forme conditionnelle pour créer des règles. Les règles
du graphique suivant correspondent à l’ordre incorrect que nous avez noté pré-
cédemment et génèrent le même résultat erroné d’une valeur de cellule mal
formatée.

Astuce La mise en forme conditionnelle est limitée à trois conditions


La mise en forme conditionnelle de la figure met en évidence l’un des avan-
tages de VBA : Vous ne pouvez utiliser que trois conditions dans la boîte de
dialogue Mise en forme conditionnelle.

Bien sûr, si vous inversez l’ordre des instructions Case (ignorant le premier
cas, qui vérifie si la cellule est vide), le cas le plus restrictif serait placer un
Chapitre 5

premier, le deuxième cas en deuxième, etc. Voilà l’astuce qui permet de créer
des instructions Select Case et If...Then efficaces : après avoir vérifié si la cel-
lule est vide, vérifiez toujours le jeu de valeurs le plus restrictif. Rappelez-vous
également que l’opérateur de comparaison et l’instruction employés détermi-
nent l’ordre dans lequel les jeux deviennent plus ou moins restrictifs. Dans
une instruction Select Case, pour vérifier si des valeurs sont supérieures à
d’autres valeurs, commencez par les valeurs les plus élevées (demandez, par
exemple, « la valeur est-elle supérieure à 10 000 ? » avant de demander « la
valeur est-elle supérieure à 5 000 ? » ; pour vérifier si des valeurs sont infé-
rieures à d’autres, commencez par les valeurs les moins élevées (demandez,
par exemple, « la valeur est-elle inférieure à 1 000? » avant de demander « la
valeur est-elle inférieure à 5 000 ? »).

100
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function

Définir la portée d’une procédure Sub


Le premier élément d’une procédure Sub, la déclaration Public ou Private, déter-
mine sa portée. Autrement dit, une procédure dont la portée est Private peut
uniquement être référencée par les procédures du même module, alors qu’une
procédure dont la portée est Public peut être référencée par n’importe quelle
procédure de n’importe quel module.

Remarque Sauf déclaration contraire, chaque procédure est Public.

Prenons comme exemple le module de code de la feuille InfosCredit.xls (voir


Figure 5.2) qui contient une procédure Private et une procédure Public.

Figure 5-2. L’utilisation des mots-clés Public et Private permet de limiter la


disponibilité des macros.
Chapitre 5

Si vous cliquez sur Outils, Macro, Macros pour ouvrir la boîte de dialogue Macro
à partir de n’importe quel classeur, vous pourrez uniquement afficher, exécuter
ou modifier la procédure CreditDisponibleCase. Vous pouvez, toutefois, exécuter
la procédure CreditDisponible à partir d’une autre procédure du même module
de code (mais pas à partir d’une procédure se trouvant dans un autre module,
même si ce module est lié au même classeur).

Remarque Nous verrons comment exécuter des procédures à partir d’autres


procédures plus loin dans ce chapitre.

Si vous écrivez un ensemble de macros dont vous ne voulez pas qu’elles soient
vues (ou exécutées) par toute personne sachant ouvrir la boîte de dialogue

101
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


Macro, vous pouvez ajouter une instruction Option Private Module dans la sec-
tion des déclarations, dans la partie supérieure du module de code pour rendre
privée toute procédure, y compris celles qui utilisent le mot-clé Public. Les
macros restent cependant disponibles dans le module de code.
Par exemple, l’une des procédures de la figure 5.3 contient le mot-clé Public dans
l’instruction Sub, mais la ligne Option Private Module de la section des déclara-
tions, dans la partie supérieure du module, est prioritaire.

Figure 5-3. Si vous ajoutez une ligne Option Private Module dans la section des
déclarations d’un module, vous masquez toutes les procédures du module.

Pour afficher la section des déclarations d’un module de code, cliquez sur la flè-
che de la liste déroulante Procédures et cliquez sur Déclarations : une nouvelle
section délimitée par une ligne, apparaît dans le module de code.
Chapitre 5

Saisissez ensuite la déclaration Option Private Module dans la section appropriée.

Astuce Servez-vous du clavier pour saisir la section des déclarations


Pour saisir la section des déclarations du module de code au clavier, placez le
point d’insertion à gauche de la première ligne de code du module, appuyez
sur ENTRÉE et revenez sur la nouvelle ligne vide. Ce faisant, la valeur de la
liste Procédure est remplacée par Déclarations et vous pouvez saisir la décla-
ration. Vous pouvez également saisir la déclaration dans la première position
de la première ligne du module et appuyer sur ENTRÉE. Lorsque Visual Basic
Editor reconnaît que vous avez saisi une déclaration sur la première ligne, il
crée une section Déclarations et insère une ligne marquant la fin de la section.

102
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function

Au Quotidien
Le lien n’est pas rompu

Il peut arriver que vous souhaitiez changer la portée d’une procédure de Public
à Private : vous avez terminé de tester la procédure et n’avez plus besoin de
l’afficher dans la boîte de dialogue Macro, par exemple. Voici une autre situa-
tion dans laquelle vous voudrez rendre une procédure privée : vous avez lié la
macro à un bouton de la barre d’outils ou à un élément de menu ; vous voulez
que vos collègues puissent exécuter la macro à partir du bouton ou de l’élé-
ment de menu personnalisé, mais vous ne voulez pas qu’une personne
sachant utiliser la boîte de dialogue Personnalisation assigne la macro à un
autre bouton, ou pire, la modifie dans Visual Basic Editor. Si une personne est
déterminée à entrer dans le code et que vous n’avez pas protégé le classeur
Chapitre 5

par un mot de passe, vous ne pourrez pas réellement l’arrêter, mais vous pou-
vez lui compliquer la tâche en rendant la procédure privée. Et, comme l’indique
le titre de cet encart, une procédure Public convertie en Private ne rompt pas
le lien avec le bouton de la barre d’outils, l’élément de menu ou l’objet auquel
vous avez assigné la macro. Si on clique sur le déclencheur de la macro, quel
qu’il soit, la macro s’exécute.

Exécuter une procédure Sub à partir d’une autre procédure


Après avoir créé une procédure Sub, vous voudrez l’exécuter. Comme nous
l’avons déjà mentionné, vous pouvez exécuter la procédure en liant la macro à
un déclencheur, mais il est également possible de l’exécuter à partir d’une autre

103
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


macro. Par exemple, vous pouvez exécuter une procédure existante, comme
NOW, qui retourne la date et l’heure actuelles.

Sub AfficherDateHeure
MsgBox (NOW())
End Sub

Ce mécanisme fonctionne pour une procédure Sub.


Pour appeler une procédure Sub à partir d’une autre procédure, tapez le nom de
la procédure et ajoutez les valeurs des arguments nécessaires. L’instruction Call
n’est pas indispensable, mais si vous l’employez, placez les arguments entre
parenthèses.
Examinons la procédure Sub suivante, qui convertit une somme en euros en cou-
ronnes suédoises au taux actuel et stockée dans la cellule C35.

Sub Couronnes()
sngInCouronnes = ActiveCell.Value * Range("C35").Value
MsgBox("La valeur ¤" & ActiveCell.Value & " correspond à " _
& sngInCouronnes & " couronnes suédoises.")
End Sub

Vous trouverez les cotations monétaires sur le site Web http://forum.money.msn.fr/cur-


rency/fr/convertisseur_devises.html. Pour plus d’informations sur les moyens de récupé-
rer des informations provenant du web dans vos feuilles de calcul Excel, reportez-vous au
chapitre 24, « Excel et le web ».

Pour exécuter cette procédure Sub à partir d’une autre procédure, vous pouvez
utiliser l’une des trois techniques suivantes :
● Saisissez le nom de la procédure et de tout argument qu’elle prend. (en
l’absence d’argument, tapez un paire de parenthèses vide).
● Saisissez le mot-clé Call et tapez le nom de la procédure et de tout argu-
ment qu’elle prend. (en l’absence d’argument, tapez un paire de parenthè-
ses vide).
● Utilisez la méthode Run de l’objet Application pour exécuter la macro.
Cette méthode est intéressante si vous exploitez le code VBA pour déter-
Chapitre 5

miner la macro à exécuter et pour assigner le nom de la macro de votre


choix à une variable.
Vous avez déjà observé la première technique en action, mais elle est en réalité
similaire à la deuxième. Lorsqu’Excel rencontre un mot qu’il ne connaît pas,
suivi d’une paire de parenthèses ouvrante et fermante, il parcourt les modules
disponibles à la recherche de procédure Public du même nom. Jusqu’à présent, il
fallait obligatoirement placer le mot-clé Call avant le nom de la procédure, mais
ce n’est plus le cas. Malgré tout, certains programmeurs choisissent de placer le
mot-clé Call devant les procédures qu’ils créent pour se souvenir ultérieurement
(ainsi que toute personne qui examinerait le code du module) que la procédure
ne fait pas partie de la bibliothèque standard d’Excel.

104
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


En matière d’appel de procédures, vous n’êtes pas limité au code du module, ni
au même classeur. Rien ne vous empêche d’atteindre les procédures des autres
modules. En fait, si le moteur Excel VBA ne trouve pas la procédure que vous
appelez dans le module de la procédure appelant, il la recherche dans les autres
modules du classeur actif et, s’il ne l’a toujours pas trouvée, il consulte les autres
classeurs ouverts.
Si vous connaissez le nom du module qui contient la procédure à exécuter et que
vous savez qu’il se trouve dans le classeur actif, placez le nom du module devant
le nom de la procédure avec la notation par point, comme dans la brève procé-
dure Sub suivante :

Sub Appel()
Call ModuleDevise.Couronnes()
End Sub

Lorsque vous créez un nouveau module de code, Visual Basic Editor lui attribue
le nom Module1, Module2, et ainsi de suite. Il est vivement conseillé de lui attri-
buer un nom plus descriptif.
Pour renommer un module, procédez de la manière suivante :
1 Ouvrez le classeur auquel le module est lié et cliquez sur Outils, Macro,
Visual Basic Editor.
2 Dans la fenêtre Projet, cliquez sur le nom du module à renommer.
3 Dans la fenêtre Propriétés, sélectionnez le nom du module existant en
regard de la propriété Name, tapez le nouveau nom du module et appuyez
sur ENTRÉE.

Attention Si les procédures de plusieurs classeurs portent des noms identi-


ques, vous allez au devant de problèmes. Il n’est pas possible d’attribuer le
même nom à deux procédures d’un même module, mais par le biais de la nota-
tion par point, vous pouvez spécifier la procédure de module à appeler et éviter
ainsi tout problème. Ceci dit, si plusieurs procédures portent le même nom
dans différents modules et que vous tentez d’en appeler une sans spécifier le Chapitre 5
module qui l’héberge (par exemple, ModuleDevise.Couronnes), Visual Basic
Editor affiche l’erreur « Nom ambigu détecté » et arrête l’exécution du code qui
appelle la procédure.

Si vous savez que la procédure à exécuter se trouve dans un module lié à un autre
classeur et que, pour un raison ou une autre, vous ne voulez pas copier le code
dans le classeur actuel, vous pouvez appeler la procédure de deux manières : en
vous servant de la méthode Application.Run et en spécifiant le nom du classeur
ou en créant une référence au classeur qui contient la procédure.
Si vous faites appel à la méthode Application.Run pour exécuter une procédure
qui se trouve dans un autre classeur, il vous suffit de nommer le classeur et la
procédure à exécuter. Pour ce faire, vous utilisez une syntaxe qui ressemble à la

105
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


référence que vous créez pour lier une cellule de feuille de calcul à une cellule
d’un autre classeur.

Pour appeler la procédure ConvertirEnCouronnes du classeur TauxChange.xls,


faites appel à l’instruction suivante :

Application.Run "'TauxChange.xls'!ConvertirEnCouronnes"

La méthode Application.Run possède toutefois une limite : le classeur qui con-


tient la procédure appelée doit être ouvert pour permettre à Excel de vérifier les
procédures disponibles. Cette exigence constitue la raison pour laquelle la boîte
de dialogue Macros présente les macros du classeur en cours, de n’importe quel
autre classeur ouvert ou de tous les classeurs ouverts : les concepteurs du pro-
gramme ont choisit de ne pas autoriser Excel à atteindre les autres classeurs, sauf
s’ils sont ouverts et prêts à être exploités.
Il est cependant possible d’appeler des procédures dans n’importe quel classeur,
ouvert ou non, en créant une référence à la procédure. Le mécanisme qui crée
une référence à une procédure d’un autre classeur est similaire à celui qui permet
de lier ou d’incorporer un fichier externe dans un classeur Excel. Au lieu d’utili-
ser la boîte de dialogue Objet du menu Insertion d’Excel, on se sert de la boîte de
dialogue Références du menu Outils de Visual Basic Editor (voir figure 5.4).
Chapitre 5

Figure 5-4. La boîte de dialogue Références liste toutes les ressources


disponibles auxquelles vous pouvez lier et ultérieurement appeler des
procédures.

106
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


Au premier affichage, la boîte de dialogue Références ne présente pas les projets
disponibles dans les classeurs Excel présents sur votre ordinateur (ou sur tout
lecteur du réseau auquel vous avez accès), mais vous pouvez les rechercher par le
biais de la boîte de dialogue Ajouter une référence.
Pour ajouter un classeur Excel à la liste de la boîte de dialogue Références, procé-
dez comme suit :
1 Dans le menu Outils, choisissez Références.
2 Cliquez sur Parcourir.
3 Cliquez sur la flèche de la liste déroulante Fichiers de type et sélectionnez
Microsoft Office Excel Files (*.xls, *.xla).
4 Localisez le répertoire qui contient le classeur, cliquez sur le classeur puis
sur Ouvrir.
Après avoir créé la référence, le nom du projet du classeur que vous venez de
sélectionner s’affiche dans la boîte de dialogue Références. Le point à relever
dans ce processus de création est que la plupart des projets sont intitulés VBA-
Projet (par défaut). À l’instar des modules de code, vous pouvez modifier le nom
de vos projets pour les rendre plus significatifs. Vous pouvez, par exemple, don-
ner au projet le même nom (ou presque) que le classeur. Si vous ne le faites pas,
la boîte de dialogue Références présente une liste de projets intitulés VBAProject
et vous ne saurez pas lequel choisir. Pour renommer un projet, dans la fenêtre
Projet, cliquez sur le nom du projet et modifiez sa propriété Name dans la fenêtre
Propriétés.

Au Quotidien
Récursivité et utilisation de Public : deux pièges procéduraux

Lorsque vous appelez une procédure à partir de cette même procédure, celle-
ci est dite récursive. Par exemple, dans le domaine des probabilités et des sta-
tistiques, la fonction FACT trouve la factorielle d’un nombre (par exemple, 3! =
3 * 2 * 1 = 6, 5! = 5 * 4 * 3 * 2 * 1 = 120, etc.). Le programmeur qui a écrit
la fonction FACT a créé un test qui s’assure que la procédure ne continue pas
Chapitre 5

à s’appeler après qu’elle a atteint 1, et c’est tant mieux. Si la procédure ne


vérifiait pas sa progression, elle continuerait ces multiplications avec 0, -1, -2,
et ainsi de suite, jusqu’à ce que la mémoire de l’ordinateur soit dépassée et
tombe en panne. Pour éviter toute sorte de boucle infinie, si vous devez écrire
une procédure qui s’appelle, ajoutez un texte logique dans une boucle
If…Then ou Do…While .

107
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Les procédures présentent un autre piège que l’on rencontre si on utilise le


mot-clé Static pour conserver des valeurs de variables dans une procédure
entre des appels. Supposons que vous travailliez avec une feuille de calcul qui
regroupe les ventes journalières et que le classeur contienne la macro, décrite
précédemment dans ce chapitre, qui conserve un cumul des ventes. Que se
passe-t-il si l’un de vos collègues examine un autre classeur qui appelle la
même procédure ? Supposons, par exemple, que vous ayez donner à votre col-
lègue l’un des classeurs du mois précédent pour qu’il apprenne comment vous
gérez le bureau avant que vous partiez pour des vacances bien méritées, loin
des courriels et des téléphones portables. Si ce collègue étudie le classeur,
voit ce que fait le code de la macro, tape un chiffre négatif important dans une
cellule et exécute la procédure, la prochaine actualisation de votre ordinateur
ne reflètera pas les vraies valeurs des ventes. Notons que les conséquences
de ce type d’erreur sont minimales si vous vous contentez de surveiller des
valeurs pour vous tenir informé. En outre, si le total des ventes est inférieur à
celui de votre souvenir, vous réaliserez rapidement qu’un chiffre négatif dans
votre copie de la feuille de calcul indique un problème dans une autre copie du
classeur.

Ceci dit, si vous vous servez d’un cumul ou d’autres variables statistiques
dans le fonctionnement de votre entreprise, placez les procédures de mise à
jour dans un module avec Option Private Module bien en évidence dans sa par-
tie supérieure.

Conserver les valeurs entre les appels de procédure


Le deuxième élément optionnel d’une déclaration de procédure concerne les
valeurs générées par ses exécutions antérieures : faut-il ou non les conserver ? On
peut prendre pour exemple une procédure qui écrit le cumul des ventes journa-
lières dans une feuille de calcul. Vous pourriez, bien entendu, écrire les valeurs
d’une journée dans un fichier ou un tableau et additionner les totaux, mais il est
beaucoup plus simple d’afficher le cumul du jour en s’assurant que la procédure
se rappelle les valeurs antérieures.
Chapitre 5

Comme vous l’aurez probablement deviné, le mot-clé employé dans ce cas est
Static. Prenons l’exemple de la procédure suivante, qui conserve un cumul des
ventes journalières dans la variable intTotal :

Sub Cumul()
intTotal = intTotal + ActiveCell.Value
Range("B10").Value = intTotal
End Sub

Si elle fonctionnait, cette procédure présenterait l’avantage d’éviter l’exécution


d’une requête ou d’une quelconque formule d’addition actualisable dans la cel-
lule B10 pour mettre à jour le total des ventes. Mais, telle qu’elle est écrite, cette
procédure génère toujours la même réponse : la valeur de la cellule active. En
effet, la variable intTotal est recréée chaque fois que vous exécutez la procédure :

108
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


sa valeur est chaque fois positionnée sur 0. Comment corriger la procédure pour
quelle conserve le cumul réel ? En ajoutant le mot-clé Static devant l’instruction
Sub, de la manière suivante :

Static Sub Cumul()


intTotal = intTotal + ActiveCell.Value
Range("B10").Value = intTotal
End Sub

Lorsqu’on ajoute le mot-clé Static à une instruction Sub, Excel sait créer un
espace de stockage durable pour chaque variable et conserver cet espace et son
contenu jusqu’à ce que l’on ferme le classeur.

Remarque Pour réinitialiser la valeur des variables d’une procédure statique,


affichez-la dans Visual Basic Editor et cliquez sur Exécution, Réinitialiser.

Définition de procédures Function


La procédure Function est similaire à la procédure Sub, excepté qu’elle peut éga-
lement retourner une valeur. Une procédure Function peut prendre des argu-
ments, comme des constantes, des variables ou des expressions qui lui sont
passés par une procédure appelante. Prenons l’exemple de la fonction SOMME
que vous utilisez couramment dans les formules d’une feuille de calcul Excel. La
formule suivante calcule la somme des valeurs des cellules C14 à H14, J14 et
ajoute 100 :
=SOMME(C14:H14; J14; 100)
La fonction SOMME additionne tout ce qui se trouve dans l’instruction qui
l’appelle ; si elle ne comprend pas l’entrée, comme lorsqu’elle tente d’addition-
ner une valeur non numérique, elle retourne un message d’erreur et affiche le
code de l’erreur. Si une procédure Function ne comporte pas d’arguments, son
instruction Function doit contenir paire de parenthèses vide.

Private | Public] [S
[P Static] Function name [(arglist)] [As type]
[statements]
Chapitre 5

[name = expression]
Exit Function]
[E
[statements]
[name = expression]
End Function
Le tableau 5.2 décrit les éléments d’une procédure Function, dont la plupart sont
similaires à ceux de la procédure Sub.

109
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Tableau 5-2. Éléments d’une procédure Function


Élément Description
Public Élément optionnel qui indique que la procédure Function est
accessible à toutes les procédures de tous les modules. S’il
est employé dans un module qui contient une instruction
Option Private, la procédure n’est pas disponible en-dehors
du projet.
Private Élément optionnel qui indique que la procédure Function est
uniquement accessible aux autres procédures du module
dans lequel elle est déclarée.
Static Élément optionnel qui indique que les variables locales de la
procédure Function sont préservées entre les appels.
L’attribut Static n’affecte pas le variables déclarées en-
dehors de la procédure Function, même si elles sont
exploitées dans la procédure.
name Élément obligatoire qui indique le nom de l’élément Function
(par exemple, Function IntérêtsDus). Il n’est pas nécessaire
que le nom suive les conventions de nommage standard.
arglist Liste optionnelle de variables représentant les arguments
passés à la procédure Function lorsqu’elle est appelée. Les
différentes variables sont séparées par des virgules.
type Instruction optionnelle qui spécifie le type de données du
résultat retourné par la procédure Function. Par exemple, une
fonction qui retourne une valeur entière contient As Integer
dans cet espace.
statements Groupe optionnel d’instructions à exécuter au sein de la
procédure Function.

Créer une procédure Function


Pour créer une procédure Function dans un module de code existant, ouvrez le
module dans Visual Basic Editor et saisissez :
Chapitre 5

Function nom()

End Function

Vous devez nommer la fonction et placer des instructions au centre, à la place


des points de suspension, mais vous procéderez plus rapidement en vous servant
de la boîte de dialogue Ajouter une procédure.
Pour ajouter une procédure Function à un module de code, procédez comme
suit :
1 Cliquez sur Outils, Macro, Visual Basic Editor pour afficher ce dernier.

110
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function


2 Si nécessaire, cliquez sur Insertion, Module pour créer un nouveau
module de code (ou si vous souhaitez créer un nouveau module pour des
raisons organisationnelles).
3 Cliquez sur Insertion, Procédure pour afficher la boîte de dialogue Ajou-
ter une procédure.
4 Saisissez le nom de la procédure dans la zone Nom.
5 Sélectionnez l’option Function.

6 Cliquez sur OK.

Remarque À l’instar des procédures Sub, vous pouvez mettre les procédures
Function à la disposition des procédures présentes dans les autres classeurs
en plaçant le mot-clé Public devant la déclaration. Le mot-clé Public est ajouté
par défaut si vous vous servez de la boîte de dialogue Ajouter une procédure.

Exécuter des procédures Function


Pour exécuter une procédure Function, servez-vous de l’une des méthodes
suivantes :
● Utilisez la procédure Function dans une formule.
● Appelez la procédure Function à partir d’une autre procédure.
● Appelez la procédure Function à partir d’une cellule dans une feuille de
Chapitre 5

calcul.

Important Les procédures Function n’apparaissent pas dans la boîte de dia-


logue Macros.

Vous avez déjà étudié plusieurs fois la première technique dans les deux précé-
dents chapitres et vous avez sans doute déjà employé souvent des fonctions dans
vos feuilles de calcul. Vous avez, par exemple, sans doute déjà employé la fonc-
tion =MAINTENANT(), qui retourne la date et l’heure actuelles. La troisième
méthode d’exécution d’une procédure Function consiste à l’appeler à partir
d’une cellule dans une feuille de calcul. Pour ce faire, vous l’appelez en procédant

111
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA


de la même manière que pour toute autre fonction (par exemple, =Amor-
tir(ActiveCell.Value)).
Quand faut-il utiliser une procédure Function au lieu d’une procédure Sub pour
intervenir sur une valeur ? Dans deux cas : si vous voulez utiliser le résultat de la
fonction dans une expression du code VBA ou dans une formule dans l’une de
vos feuilles de calcul. Par exemple, la société Mon Jardin a reconditionné le ter-
reau en sacs de 10 kg par sacs de 2,5 kg. Vous pouvez créer une fonction qui mul-
tiplie le nombre de sacs de 10 kg par quatre pour générer le nombre total de
petits sacs. Vous créez ensuite une fonction similaire à celle-ci :

Function PetitsSacs(intGrandsSacs as Integer) as Integer


PetitsSacs = intGrandsSacs * 4
End Function

Une fois la fonction créée, vous pouvez l’appeler à partir d’une cellule avec la for-
mule =PetitsSacs(C16) pour convertir le nombre de grands sacs de terreau dans
une commande, stockée dans la cellule C16, en nombre de petits sacs de terreau
que produit la commande.

Passer des arguments aux procédures


Dans ce chapitre, nous avons pour l’instant étudié les procédures qui traitent des
valeurs fixes, comme le contenu d’une cellule, et des procédures qui n’intervien-
nent sur aucune valeur, comme la fonction NOW. Lorsque vous écrivez une pro-
cédure qui intervient sur la valeur d’une cellule en appelant cette valeur à partir
de la procédure avec la propr iété Act iveCell.Value ou la propr iété
Range(<cell>).Value, vous n’avez pas à vous soucier de valeurs passées par des
variables. Malheureusement, la situation n’est pas toujours aussi simple. Si vous
devez intervenir sur une valeur stockée dans une variable d’une procédure, et
non dans une cellule de feuille de calcul, vous devez indiquer à la procédure les
valeurs concernées. On appelle ces valeurs des arguments.
Vous avez probablement remarqué que la première ligne de la fonction Petits-
Sacs est différente des autres procédures que nous avons employées dans ce cha-
pitre. La fonction suivante, qui recommande un prix au détail correspondant à
Chapitre 5

180 pour cent du prix de gros de l’article, prend un argument :

Function Marge(curPrixArticle as Currency) as Currency


Marge = curPrixArticle * 1,8
End Function

Prenons un moment pour étudier chaque élément de la fonction. Le mot-clé


Function est usuel, au même titre que le nom de la fonction qui le suit, mais les
deux éléments suivants sont nouveaux. L’élément entre parenthèses, curPrix-
Artcile as Currency, représente le nom et le type de données de la variable pas-
sée à la fonction. Autrement dit, quelle que soit la manière dont la fonction
récupère la variable, elle sait traiter la valeur reçue en tant que variable du type
Currency.

112
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function

Attention À l’instar des autres fonctions, si les données que reçoit la fonc-
tion ne sont pas du type correct, la fonction retourne le message d’erreur
#VALEUR! dans la cellule où on a appelé la fonction.

Le dernier élément de la première instruction de la procédure Function est une


deuxième occurrence de as Currency. Cet élément indique à la fonction le type
de données de la valeur retournée à la formule ou à la procédure qui l’a appelée.
En général, le type données de la valeur retournée et le même que celui de la
valeur passée à la procédure, mais on peut diviser une valeur à virgule flottante
en simple précision (single) par une valeur entière (integer) et retourner une
valeur entière, par exemple, si vous voulez savoir combien de sacs de 5 kg vous
obtenez à partir de 22,3 kg de terreau.
Où la valeur calculée par la procédure est-elle stockée ? Elle est stockée dans une
variable portant le même nom que la procédure Function. Dans le code précé-
dent, la deuxième ligne exécute le calcul arithmétique.

Marge = curPrixArticle * 1,8

La variable Marge est créée à partir du type de données nommé à la fin de la pre-
mière instruction de la procédure.
Si vous devez passer plusieurs arguments à la procédure, séparez-les par des vir-
gules, comme dans l’exemple suivant :
Function ConversionMultiple (sngCouronnes as Single, sngEuro as
Single) as Single

Au Quotidien
Protéger les données d’origine

En programmation, on court le risque de modifier accidentellement les valeurs


d’origine de la feuille de calcul. Par exemple, si vous créez une procédure Sub
qui assigne une valeur à la cellule active, vous détruisez les données d’origine.
Chapitre 5

Ainsi, outre le fait de conserver une copie de sauvegarde de toutes vos don-
nées, envisagez de faire appel au mot-clé ByVal. Avec ce mot-clé, la procédure
utilise une copie des données et non la valeur de la cellule d’origine (ou du
tableau, ou de l’objet, ou de quoi que ce soit d’autre). La procédure Sub ser-
vant à calculer le nombre de petits sacs de terreau créés à partir d’un certain
nombre de grands sac s’écrit de la façon suivante :

Sub PetitsSacs(byVal intGrandsSacs)


MsgBox("Le nombre de grands est de " & intPetitsSacs * 4).
End Sub

113
Partie 2 : Visual Basic pour Applications

Microsoft Excel 2003 VBA

Passer des arguments nommés


Toutes les procédures de ce chapitre qui appellent une procédure passent les
arguments dont la procédure a besoin selon l’ordre attendu. Par exemple, si vous
tapez MsgBox au début d’une instruction pour créer une boîte de message,
Visual Basic Editor affiche une info-bulle pour indiquer les arguments attendus
(voir figure 5.5).

Figure 5-5. Visual Basic Editor vous aide à créer des procédures en listant les
arguments attendus.

Pour simplifier la lecture des arguments passés à une procédure, servez-vous des
arguments nommés. Un argument nommé se compose du nom de l’argument
suivi d’un double point et du signe égal (:=), puis de la valeur assignée à l’argu-
ment. Voici, par exemple, la syntaxe de la procédure MsgBox :
Chapitre 5

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Pour créer une boîte de message accompagnée d’un titre et d’un message spéci-
fiques (deux des arguments listés), utilisez l’instruction suivante :

MsgBox Title:="Rapport Périodique", Prompt:="Commande acceptée"

Pour plus d’informations sur la création de boîtes de message, reportez-vous au


chapitre 4, « Démarrage de la programmation ».

114
Partie 2 : Visual Basic pour Applications

Création de procédures Sub et Function

Organisez votre réussite


Vous serez peut-être tenté de placer chaque fragment de code nécessaire à l’achè-
vement d’une série de tâches dans une même procédure. Nous vous conseillons
toutefois d’écrire une procédure par tâche puis d’appeler chaque tâche depuis
une même procédure principale. Voici un exemple de code permettant de créer
un programme qui écrit le contenu d’une feuille de calcul des ventes journalières
dans une base de données, enregistre le fichier sous un nouveau nom basé sur la
date, supprime le contenu de la feuille de calcul des ventes puis enregistre et
ferme tous les fichiers ouverts :

Sub Principale()
Call ActualisationSQL()
Call RéenregistrerClasseur()
Call SupprimerDonnées()
Call EnregistrerEtFermer()
End Sub
Le contenu des procédures individuelles ne concerne pas la procédure Principale.
En fait, vous pouvez les modifier quand bon vous semble sans avoir à vous sou-
cier du code de la procédure Principale. Ce type de routine constitue une cachet
de qualité en matière de programmation depuis de longues années et nous vous
conseillons vivement de l’adopter.
Dans ce chapitre, vous avez appris à créer des procédures Sub et Function, les
conteneurs du code VBA. Rappelez-vous leur principale différence : les procédu-
res Sub ne retournent aucun résultat au programme principal, contrairement
aux procédures Function. Maintenant que vous savez créer ces conteneurs, vous
êtes prêts à affecter les classeurs Excel avec votre code. Dans le chapitre 6, vous
allez commencer par faire la connaissance de l’objet Application.

Chapitre 5

115
Partie 3
Le modèle d’objet
Excel
6 L’objet Application 119

7 Classeurs et feuilles
de calcul 143

8 Plages et cellules 179

117
Partie 3 : Le modèle d’objet Excel

Chapitre 6
L’objet Application
Introduction à l’objet
Application . . . . . . . . . . . . . . . . . 120

Visual Basic pour Applications (VBA) se sert des objets pour contrôler Microsoft
Excel. Que vous travailliez dans une application Excel (objet Application), des
classeurs (objet Workbook) ou des cellules individuelles (objet Cell), toutes vos
actions se concentrent sur la manipulation des objets. Tous les objets contien-
nent d’autres objets font partie d’un objet plus important. Par exemple, l’objet
Workbook contient des objets Worksheet, qui à leur tour contiennent des objets
Cell.
Les objets permettent de réaliser diverses actions : définir ou lire une propriété,
effectuer une action, appeler une méthode. Pour sélectionner une feuille de cal-
cul intitulée Feuil2 dans le classeur actif, vous utilisez la méthode Select de l’objet
Worksheet, Worksheets("Feuil2").Select.
Le modèle d’objet (voir figure 6.1) décrit les relations entre chaque objet d’Excel
et les autres objets. Dans le modèle d’objet, vous visualisez les objets contenus
dans l’objet, les objets contenus dans ces objets et ainsi de suite. Un objet peut
contenir plusieurs objets du même type. Par exemple, un classeur peut contenir
plusieurs feuilles de calcul.

119
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Figure 6-1. Le Modèle d’objet Microsoft Excel constitue le magasin de tout le


savoir d’Excel.

Un objet qui contient plusieurs objets du même type constitue une collection et
chaque objet de la collection en est membre. Pour se référer à un membre parti-
culier d’une collection, on utilise son numéro d’index ou son nom. Dans l’exem-
ple précédent, nous avons utilisé la collection Worksheets fait référence à une
feuille de calcul spécifique intitulée Feuil2.

Introduction à l’objet Application


L’objet Application constitue l’objet le plus élevé dans le modèle d’objet Micro-
soft Excel. L’objet Application héberge toutes les propriétés et méthodes pour
manipuler l’application Excel, ainsi que les objets qui représentent des classeurs
individuels et les données qu’ils contiennent.
Compte tenu de sa position dans la hiérarchie du modèle d’objet, on débute tou-
tes les références par l’objet Application. Pour faire référence à la première cellule
d’une feuille de calcul (A1), on commence par l’objet Application, suivi de l’objet
Worksheet avant de désigner l’objet Cell. Pour attribuer la valeur 100 à la pre-
mière cellule, le code VBA est le suivant :

Application.Workbooks(1).Worksheets(1).Cells(1,1) = 100
Chapitre 6

Les longues séquences en notation par point sont complexes à utiliser. En consé-
quence, les programmeurs Excel exposent directement les objets les plus cou-
rants, comme les classeurs, les feuilles de calcul et les cellules, sans obliger le code
à parcourir l’objet Application. Veillez toutefois à sélectionner le classeur et la
feuille de calcul appropriés, particulièrement si vous travaillez directement avec

120
Partie 3 : Le modèle d’objet Excel

L’objet Application
les cellules. Si vous êtes sûr d’avoir sélectionné le classeur et la feuille de calcul
appropriés, en vous servant par exemple de la méthode Activate de l’objet
Worksheet décrite dans la prochaine section de ce chapitre, vous pouvez abréger
la commande précédente en Cells(1,1) = 100.

Propriétés
L’utilisation de l’objet Application implique généralement de lire ou de définir
l’une de ses nombreuses propriétés, plus de 170, qui contrôlent chaque aspect de
l’application Excel. Des classeurs et des feuilles de calcul aux colonnes et aux
lignes, l’objet Application donne accès à pratiquement chaque élément d’Excel et
des classeurs Excel.
Avec ce nombre impressionnant de propriétés, il est impossible de connaître
chaque propriété disponible et ce n’est pas indispensable. Voici une liste des
10 propriétés les plus courantes que vous devez connaître pour exploiter Excel et
VBA. Vous ferez connaissance avec les autres propriétés à mesure que vous les
utiliserez. Le seul point important consiste à connaître leur existence pour les
applications à venir.
Voici les propriétés de l’objet Application les plus importantes :
● ActiveCell
● ActiveChart
● ActiveSheet
● ActiveWindow
● ActiveWorkbook
● RangeSelection
● Selection
● ScreenUpdating
● StatusBar
● ThisWorkbook

Vous trouverez des informations sur chaque élément du modèle d’objet Excel dans l’aide
de Visual Basic Editor en tapant excel dans la zone Poser une question et en affichant la
rubrique d’aide Modèle objet Microsoft Excel.

Cette courte liste des propriétés de l’objet Application récapitule les principaux
objets employés avec Excel. La plupart ont été directement présentés par l’équipe
de programmation Excel de sorte qu’une référence explicite à l’objet Application
est inutile. Ces propriétés sont décrites dans les prochaines sections par ordre
alphabétique.
Chapitre 6

Propriété ActiveCell
La propriété ActiveCell est une référence à la cellule actuellement active dans la
feuille de calcul active du classeur actif. Lorsqu’elle est appelée, la propriété Acti-

121
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


veCell retourne un objet Range qui définit la valeur ou la formule de la cellule
ainsi que toute modification de la mise en forme de votre choix (style de police,
bordures, formats des nombres, etc.).
L’exemple suivant exploite la procédure CellBorder pour examiner la valeur
d’une cellule et modifier la bordure qui l’entoure si cette valeur se situe entre 500
et 1000. La procédure ApplyBorders boucle dans toutes les cellules de données
spécifiées du classeur Y2001ByMonth.xls (voir figure 6.2), puis appelle la procé-
dure CellBorder pour chaque cellule.

Sub ApplyBorders()
Dim MyCell As Range
For Each MyCell In _
ActiveSheet.Range(D6:O36").Cells
MyCell.Select
If ActiveCell > 500 And ActiveCell < 1000 Then
With ActiveCell.Borders
.Weight = xlThick
.Color = vbBlue
End With
End If
Next MyCell
End Sub

Figure 6-2. La propriété ActiveCell permet de modifier la cellule active sans


référencer de cellule ou de plage spécifiques.
Chapitre 6

Rappelez-vous que la valeur de la propriété ActiveCell diffère de la valeur de la


propriété Selection. Une Selection peut retourner une plage de plusieurs cellules,
mais une seule cellule de la sélection peut être active. Lorsque l’on examine une
feuille de calcul dans laquelle plusieurs cellules sont sélectionnées, la cellule

122
Partie 3 : Le modèle d’objet Excel

L’objet Application
active est encadrée et sans surbrillance. Les autres cellules de la sélection sont
mises en évidence (la couleur de mise en évidence est un bleu grisé).

Propriété ActiveChart
La propriété ActiveChart permet de manipuler le graphique sélectionné, qu’il
soit incorporé ou placé sur une feuille séparée. Toutes les propriétés du graphi-
que sont disponibles, ce qui signifie que vous pouvez modifier les points de don-
nées du graphique, son format et tout autre attribut.
L’exemple suivant construit automatiquement un histogramme 3D dans le clas-
seur SalesByCategory.xls en utilisant les données existantes et le positionne sous
la source des données (voir figure 6.3).

Sub BuildChart()
Charts.Add 'Ajoute un nouvel objet graphique
ActiveChart.ChartType = xl3DColumn 'Positionne le type Chart à
3D Column
ActiveChart.SetSourceData _
Source:=Sheets("ByCategory").Range("C1:G13"), _
PlotBy:=xlColumns 'Définit la source des données
ActiveChart.Location Where:=xlLocationAsObject, Name:="ByCategory"
With ActiveChart 'Met le graphique en forme
.HasTitle = True
.ChartTitle.Characters.Text = "Monthly Sales by Category"
Chapitre 6

.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Characters.Text = "Month"
.Axes(xlSeries).HasTitle = True
.Axes(xlSeries).AxisTitle.Characters.Text = "Category"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Characters.Text = "Sales"

123
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


End With
ActiveSheet.Shapes(1).IncrementLeft -133.5 'Positionne le
graphique
ActiveSheet.Shapes(1).IncrementTop 214.5
ActiveSheet.Shapes(1).ScaleWidth 1.77, msoFalse,
msoScaleFromTopLeft
ActiveSheet.Shapes(1).ScaleHeight 1.35, msoFalse,
msoScaleFromTopLeft
End Sub

Pour plus d’informations sur les graphiques et leur modification par programmation,
reportez-vous au chapitre 15, « Graphiques ».

Figure 6-3. La propriété ActiveChart permet de rationaliser la création et la


manipulation d’un graphique.

Propriété ActiveSheet
La propriété ActiveSheet retourne un objet Worksheet qui représente la feuille de
calcul sélectionnée. Cet objet permet de réaliser toutes les manipulations relati-
ves à une feuille de calcul. Par exemple, dans un classeur où chaque feuille de cal-
cul récapitule les chiffres des ventes horaires pour chaque jour du mois, vous
pouvez écrire une macro qui crée une nouvelle feuille portant le nom du mois
suivant et le jour de la semaine correct en regard de la date. La figure 6.4 montre
le résultat de cette macro, qui utilise la feuille de calcul January du classeur
Chapitre 6

Y2004ByMonth.xls comme modèle.

Sub CopySheet()

Sheets("January").Select 'Sélectionne la feuille à copier

124
Partie 3 : Le modèle d’objet Excel

L’objet Application
ActiveSheet.Copy After:=Sheets(Sheets.Count) 'Copie la feuille
vers la dernière position
Sheets(Sheets.Count).Select 'Sélectionne une nouvelle feuille
ActiveSheet.Name = Format(Str$(Sheets.Count) & "/01/03", "MMMM")
'Attribue le nom du dernier mois
Range("D6:O36").Select 'Sélectionne les cellules de données et
les efface
Selection.ClearContents
Range("C6").Select 'Commence au premier jour, définit le jour
de la semaine pour les 3 premiers jours
ActiveCell.FormulaR1C1 = Format(Str$(Sheets.Count) & "/01/" & _
Str$(Year(Now())), "ddd")
Range("C7").Select
ActiveCell.FormulaR1C1 = Format(Str$(Sheets.Count) & "/02/" & _
Str$(Year(Now())), "ddd")
Range("C8").Select
ActiveCell.FormulaR1C1 = Format(Str$(Sheets.Count) & "/03/" & _
Str$(Year(Now())), "ddd")
Range("C6:C8").Select
Selection.AutoFill Destination:=Range("C6:C36"),
Type:=xlFillDefault
'Remplit automatiquement les jours restants
Range("C6:C36").Select 'Corrige les bordures
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
Range("C36").Select
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
End With

End Sub

Chapitre 6

125
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Figure 6-4. Cette macro crée une nouvelle feuille de calcul en se basant sur un
modèle existant et ajoute le jour et la date corrects pour le mois suivant en
conservant les en-têtes de colonnes.

Propriété ActiveWindow
La propriété ActiveWindow retourne un objet Window qui représente la fenêtre
sélectionnée dans l’application Excel. La fenêtre active est toujours celle qui se
trouve au premier plan dans une application.
La propriété Caption d’un objet Window est un doublon de la propriété Name.
Lorsque vous assignez une valeur à la propriété Caption, vous permettez que l’on
fasse référence à une fenêtre particulière dans la collection Windows en se servant
de la valeur Caption à la place du numéro d’index. Le fragment de code suivant
assigne la chaîne "My Window" à la propriété Caption de la fenêtre active puis
invoque la méthode Calculate de l’objet ActiveSheet pour recalculer toutes les
formules de la feuille active dans My Window.

ActiveWindow.Caption = "My Window"


Application.Windows("My Window").ActiveSheet.Calculate

L’objet ActiveWindow sert essentiellement à contrôler le niveau de zoom de la


fenêtre ou à déplacer la fenêtre pour afficher une cellule spécifique. Les proprié-
tés ScrollRow et ScrollColumn renvoient le numéro de la cellule qui apparaît dans
l’angle supérieur gauche.
Chapitre 6

L’exemple suivant illustre l’utilisation des propriétés ScrollColumn, ScrollRow et


Zoom. Dans l’exemple, le code saisit du texte dans la cellule H18 avec une taille
de police de 4 points, trop petite pour être lue avec un facteur de zoom inférieur
à 200%. La macro augmente ensuite le niveau de zoom à son maximum (400%)

126
Partie 3 : Le modèle d’objet Excel

L’objet Application
et positionne la fenêtre de sorte que la cellule H18 se trouve dans l’angle supé-
rieur gauche.

Sub ZoomScrollSample()
Range("H18").Select
ActiveCell.Font.Size = 4
ActiveCell.Value = "Ce texte est très petit et difficile à lire."
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollRow = 16
ActiveWindow.Zoom = 100
MsgBox "Cliquez sur OK pour zoomer", vbOKOnly + vbInformation, _
"Excel 2003 VBA Au Quotidien"
ActiveWindow.Zoom = 400
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollRow = 18
End Sub

Le deux macros suivantes peuvent être assignées à des boutons pour agrandir ou
réduire le facteur de zoom d’un clic.

Sub ZoomIn()
Dim intZoom As Integer

intZoom = ActiveWindow.Zoom + 50
If intZoom > 400 Then intZoom = 400
ActiveWindow.Zoom = intZoom
End Sub
Chapitre 6

Sub ZoomOut()
Dim intZoom As Integer

intZoom = ActiveWindow.Zoom -50


If intZoom < 50 Then intZoom = 50

127
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


ActiveWindow.Zoom = intZoom
End Sub

Propriété ActiveWorkbook
La propriété ActiveWorkbook retourne un objet Workbook qui référence le clas-
seur sélectionné. Si la fenêtre du presse-papier est active, la propriété Acti-
veWorkbook retourne Nothing.

Remarque La propriété ActiveWorkbook retourne également Nothing si le


seul classeur ouvert est masqué.

L’exemple suivant construit un nouveau classeur trimestriel en extrayant les


feuilles appropriées du classeur annuel.

Sub ExtractQuarterlyFigures()
Dim szMyName As String, szQuarter As String, intCount As Integer
Dim szSheetName As String, szName As String

szMyName = ActiveWorkbook.Name
szQuarter = InputBox("Quel trimestre faut-il extraire (1,2,3 ou
4) ?", _
"Excel 2003 VBA Au Quotidien", "1")
Application.Workbooks.Add
Select Case szQuarter
Case 1: szName = "1st Quarter.xls"
Case 2: szName = "2nd Quarter.xls"
Case 3: szName = "3rd Quarter.xls"
Case 4: szName = "4th Quarter.xls"
Case Else
MsgBox "Entrée non valide ('" & szQuarter & "').",
vbOKOnly + _
vbInformation, "Excel 2003 VBA Au Quotidien"
Exit Sub
End Select
Workbooks(Workbooks.Count).SaveAs szName
For intCount = 1 to 3
Workbooks(szMyName).Activate
ActiveWorkbook.Sheets(intCount * Val(szQuarter)).Activate
Range("A1", ActiveCell.SpecialCells(xlLastCell)).Select
szSheetName = ActiveSheet.Name
Selection.Copy
Workbooks(szName).Activate
Sheets(intCount).Select
ActiveSheet.Paste
ActiveSheet.Name = szSheetName
Next intCount
End Sub
Chapitre 6

Propriété DisplayAlerts
La propriété DisplayAlerts détermine si Microsoft Excel affiche les alertes pen-
dant l’exécution d’une macro. Si on lui attribue la valeur False, Excel choisit la

128
Partie 3 : Le modèle d’objet Excel

L’objet Application
réponse par défaut pour toutes les alertes affichées. La seule exception est la
méthode SaveAs pour les classeurs. Si la propriété DisplayAlerts est positionnée à
True, l’alerte OverWrite prend la valeur par défaut Yes, mais Excel utilise No si la
propriété DisplayAlerts est positionnée à False.
Excel réinitialise la propriété DisplayAlerts à sa valeur par défaut True lorsque la
macro est terminée.
La macro suivante, qui supprime toutes les feuilles de calcul non utilisées d’un
classeur, positionne la propriété DisplayAlerts à False de sorte que l’utilisateur ne
soit pas averti chaque fois que la macro supprime une feuille de calcul.

Attention Vous devez exécuter cette macro dans un classeur qui contient
des données. Si vous l’exécuter dans un nouveau classeur contenant unique-
ment des feuilles vides, vous obtenez une erreur d’exécution '1004' : La
méthode Delete de la classe Worksheet a échoué.

Sub RemoveEmptySheets()
Dim intCount As Integer

Application.DisplayAlerts = False
For intCount = Sheets.Count To 1 Step -1
Sheets(intCount).Select
Range("A1", ActiveCell.SpecialCells(xlLastCell)).Select
If Selection.Address() = "$A$1" And ActiveCell = "" Then
Sheets(intCount).Delete
intCount = Sheets.Count + 1
End If
Next intCount

End Sub

Propriété RangeSelection
La propriété RangeSelection retourne un objet Range qui représente les cellules
sélectionnées sur le classeur sélectionné. Même si un objet graphique est sélec-
tionné, la propriété RangeSelection retourne une plage de cellules : les dernières
sélectionnées.
Lorsque des cellules sont sélectionnées, la propriété RangeSelection et l’objet
Selection représentent les mêmes cellules. Lorsqu’un objet graphique est sélec-
tionné, la propriété RangeSelection retourne les dernières cellules sélectionnées.
L’exemple suivant affiche l’adresse des cellules sélectionnées :
MsgBox ActiveWindow.RangeSelection.Address
Chapitre 6

Propriété Selection
La propriété Selection retourne un type d’objet quelle que soit la sélection en
cours. Pour les cellules, elle retourne un objet Range et pour les graphiques, elle
retourne un objet Chart.

129
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


En supposant que la sélection en cours soit une plage de cellules, cet exemple
efface toutes les valeurs et formules.
Selection.Clear

Propriété StatusBar
La propriété StatusBar permet de modifier le message actuellement affiché dans
la barre d’état, dans la partie inférieure de la fenêtre Excel. Ce message permet,
par exemple, d’informer l’utilisateur si l’exécution complète d’une procédure
doit prendre du temps. Pour désactiver les messages placés sur la barre d’état,
positionnez la propriété StatusBar sur False.
Cet exemple constitue une version modifiée de la procédure BuilChart que nous
avons utilisée précédemment pour illustrer la propriété ActiveChart. Plusieurs
lignes de code ont été ajoutées pour afficher des messages relatifs à l’activité de la
macro à l’attention de l’utilisateur dans la barre d’état.

Au Quotidien
Mettre un macro en pause

L’une des fonctionnalités d’Excel est d’extraire des données de sources exter-
nes. Supposons qu’un fleuriste décide de se développer et qu’il acquiert plu-
sieurs magasins. En tant que propriétaire, il décide de constituer un rapport
qui étudie chaque jour les données des ventes de chaque magasin. Cepen-
dant, la macro qui construit le rapport prend du temps pour compiler toutes les
informations et les présenter correctement. Il décide donc de l’exécuter pen-
dant la nuit de sorte que le rapport soit prêt au matin.

Au lieu d’attendre que tous les magasins aient soumis leurs données au ser-
veur principal pour exécuter la macro, il utilise la méthode Wait pour la mettre
en pause jusqu’à une heure donnée. Avec le code Application.Wait
"20:00:00", la macro doit attendre 20 heures avant de continuer à s’exécuter.
Pour mettre une macro en pause pendant un intervalle donné et non jusqu’à
une heure donnée, il suffit d’ajouter l’intervalle à l’heure en cours.

Testez attentivement la macro avant de définir un intervalle de pause trop


important : la méthode Wait arrête toute activité d’Excel et peut également
vous empêcher d’utiliser toute autre application de votre ordinateur.

Propriété ScreenUpdating
Les macros VBA s’exécutent très rapidement, en particulier si on les compare à
Chapitre 6

un humain effectuant les mêmes tâches. L’écran reflète les différentes actions
programmées dans la macro à mesure qu’Excel les effectue. Les actions s’effec-
tuent souvent si rapidement que l’écran ne s’actualise pas suffisamment vite
pour les refléter et semble clignoter. Les rafraîchissements de l’écran réclament
également du temps de traitement, ce qui ralentit l’exécution de la macro.

130
Partie 3 : Le modèle d’objet Excel

L’objet Application
Pour réduire le clignotement de l’écran et éventuellement gagner quelques
secondes sur le temps de traitement, en particulier dans le cadre des macros
gourmandes de temps de traitement, vous pouvez désactiver le rafraîchissement
de l’écran avec la propriété ScreenUpdating.
En positionnant la propriété ScreenUpdating sur False au début de la macro, vous
indiquez à Excel de ne pas actualiser l’écran pendant l’exécution jusqu’à ce que la
propriété soit à nouveau positionnée sur True. Il est très important de déboguer
entièrement une macro et d’insérer du code de récupération des erreurs si vous
désactivez le rafraîchissement de l’écran. En effet, une simple condition d’erreur
qui ne s’est pas affichée pourrait faire croire à l’utilisateur à un échec de la macro
ou à une panne d’Excel. Il est également important de positionner la propriété
ScreenUpdating sur True, sa valeur par défaut, une fois que la procédure a été
exécutée pour éviter que toute autre procédure qui l’aurait appelée n’ait été con-
cernée par la propriété ScreenUpdating.
La procédure suivante crée un nouveau graphique à partir des données du clas-
seur SalesByCategory.xls puis attend trois secondes avant de terminer la procé-
dure.

Sub BuildChart()
Application.StatusBar = "Ajout d’un nouveau graphique..."
Application.Wait (Now + TimeValue("0:00:03"))
Application.ScreenUpdating = False
Charts.Add 'Ajoute un nouvel objet graphique
ActiveChart.ChartType = xl3DColumn 'Définit le type de
graphique sur Histogramme 3D
ActiveChart.SetSourceData
Source:=Sheets("ByCategory").Range("C1:G13"), _
PlotBy:=xlColumns 'Définit la source des données
ActiveChart.Location Where:=xlLocationAsObject, Name:="ByCategory"
Application.StatusBar = "Configuration du nouveau graphique..."
With ActiveChart 'Met le graphique en forme
.HasTitle = True
.ChartTitle.Characters.Text = "Monthly Sales by Category"
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Characters.Text = "Month"
.Axes(xlSeries).HasTitle = True
.Axes(xlSeries).AxisTitle.Characters.Text = "Category"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Characters.Text = "Sales"
End With
ActiveSheet.Shapes(1).IncrementLeft -133.5 'Positionne le
graphique
ActiveSheet.Shapes(1).IncrementTop 214.5
ActiveSheet.Shapes(1).ScaleWidth 1.77, msoFalse,
msoScaleFromTopLeft
ActiveSheet.Shapes(1).ScaleHeight 1.35, msoFalse,
Chapitre 6

msoScaleFromTopLeft
Application.Wait (Now + TimeValue("0:00:03"))
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub

131
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Propriété ThisWorkbook
La propriété ThisWorkbook retourne un objet Workbook qui se réfère au classeur
contenant la macro en cours d’exécution. Cette propriété permet aux compo-
sants externes de se référer au classeur qui contient le code. La propriété Acti-
veWorkbook ne fonctionne pas, puisqu’elle se réfère au classeur actif et non au
classeur qui contient le code exécuté.
L’exemple suivant illustre la propriété ThisWorkbook en affichant une boîte de
message libellée avec le nom du classeur active et le nom du classeur à partir
duquel s’exécute la macro :

Sub TestThisWorkbook()
Dim strMessage as String

strMessage = "Classeur actif = " & ActiveWorkbook.Name & vbCrLf


strMessage = strMessage & "Ce classeur = " & ThisWorkbook.Name

MsgBox strMessage, vbOKOnly + vbInformation, _


"Excel 2003 VBA Au Quotidien"

End Sub

Méthodes
Les méthodes sont des actions que les objets effectuent. Elles permettent de trai-
ter le contenu d’un conteneur d’objets. On peut les comparer à un mixeur de
cuisine. Le mixeur est un conteneur d’objets. La nourriture placée dans le mixeur
représente son contenu. Chaque bouton qui mélange, tranche, liquéfie, et ainsi
de suite, correspond à une méthode différente.

Méthode Calculate
La méthode Calculate oblige tous les classeurs ouverts à recalculer les cellules qui
contiennent de nouvelles données, des données modifiées ou changeantes, ainsi
que les cellules dépendantes. Cette méthode produit le même résultat que si l’on
appuie sur la touche F9. Elle oblige Excel à recalculer un classeur lorsqu’on a
sélectionné l’option Calcul Sur ordre dans la boîte de dialogue Options d’Excel.
Cet exemple recalcule tous les classeurs ouverts si l’option Calcul n’est pas posi-
tionnée sur Automatique.
Chapitre 6

Sub RecalcAll()
If Application.Calculation <> xlCalculationAutomatic Then
Calculate
End If
End Sub

132
Partie 3 : Le modèle d’objet Excel

L’objet Application

Au Quotidien
Limiter les calculs

Vous pouvez également employer la méthode Calculate avec les objets


Worksheet et Range. Elle permet, en outre, de limiter le nombre de calculs
effectués. Avec un objet Worksheet, la méthode Calculate effectue tous les cal-
culs nécessaires sur la feuille de calcul spécifiée. L’exemple suivant calcul la
feuille active :

Sub RecalcSheet()
If Application.Calculation <> xlCalculationAutomatic Then
ActiveSheet.Calculate
End If
End Sub

Pour calculer un nombre limité de cellules, servez-vous de l’objet Range pour


spécifier les cellules à recalculer. Cet exemple recalcule les formules de toutes
les cellules dans la plage C1:G13 :

Sub Recalc()
ActiveSheet.Range("C1:G13").Cells.Calculate
End Sub

Méthode CalculateFull
La méthode CalculateFull oblige tous les classeurs ouverts à recalculer toutes les
cellules quel que soit leur contenu. L’exemple suivant recalcule tous les classeurs
ouverts :

Sub ReCalcFull()
Application.CalculateFull
End Sub

Méthode FindFile
La méthode FindFile affiche la boîte de dialogue Ouvrir et ouvre le fichier sélec-
tionné par l’utilisateur. Elle retourne une valeur True si le fichier a été correcte-
ment ouvert ou False si l’utilisateur a cliqué sur le bouton Annuler. L’exemple
suivant invite l’utilisateur à localiser le fichier ProductList.xls :

Sub FindProductList()
Dim bReturn As Boolean, strPrompt As String

strPrompt = "Veuillez localiser le fichier ProductList.xls."


Chapitre 6

MsgBox strPrompt, vbOKOnly + vbInformation, "Excel 2003 VBA Au


Quotidien"

bReturn = Application.FindFile
If Not bReturn Then
strPrompt = "Le fichier n'a pas été ouvert."

133
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


MsgBox strPrompt, vbOKOnly + vbInformation, "Excel 2003 VBA Au
Quotidien"
End If

End Sub

Méthode InputBox
La méthode InputBox est similaire à la fonction InputBox en ce qu’elles affichent
toutes deux une boîte de dialogue simple qui permet à l’utilisateur de saisir des
informations exploitables dans la macro. La différence entre les deux réside dans
le fait que la méthode InputBox peut effectuer une validation sélective de l’entrée
de l’utilisateur et qu’elle peut être employée avec d’autres objets Excel, valeurs
d’erreurs et formules. La fonction InputBox, en revanche, se contente de retour-
ner une valeur exploitable dans la macro.

Pour plus d’informations sur la création de boîtes de saisie, reportez-vous au chapitre 4,


« Démarrage de la programmation VBA ».

À l’instar de la fonction InputBox, vous pouvez indiquer à l’utilisateur le type de


valeur demandée, afficher un titre dans la barre de titre de la boîte de dialogue,
présenter une valeur par défaut, choisir la position de la boîte de dialogue à
l’écran et la lier à un fichier d’aide. Vous pouvez, en outre, préciser le type de
valeur accepté par InputBox. Le tableau 6.1 récapitule les différents choix et com-
mente leur utilisation. Il est également possible d’additionner les données pour
spécifier plusieurs types. Par exemple, si vous additionnez la valeur pour les
nombres (1) et la valeur pour le texte (2) et vous servir de leur somme (3) pour
que la méthode InputBox accepte les nombres et le texte. Si vous ne précisez pas
de type, elle utilise la valeur par défaut, le texte.
La syntaxe complète de la méthode InputBox est la suivante :
expression.InputBox(Prompt, Title, Default, Left, Top, HelpFile,
HelpContextID, Type)

Expression, un objet Application, et Prompt, une valeur de chaîne, sont des élé-
ments obligatoires pour appeler la méthode InputBox. Les autres paramètres
sont optionnels, mais vous devez employer des paramètres fictifs si vous appelez
la méthode dans sa forme standard. Pour éviter l’emploi de paramètres fictifs,
nommez les paramètres fournis, comme dans l’exemple suivant :
Chapitre 6

Application.InputBox(Prompt:="My Prompt", Type:=8)

La méthode InputBox permet à l’utilisateur de se servir de sa souris pour sélec-


tionner une cellule ou une plage de cellules dans tout classeur ouvert. Utilisez
l’instruction Set pour assigner les cellules sélectionnées à un objet Range. Si vous

134
Partie 3 : Le modèle d’objet Excel

L’objet Application
ne le faites pas, la méthode InputBox utilise la valeur des cellules sélectionnées.
Servez-vous d’une instruction Set chaque fois que vous voulez assigner une ins-
tance spécifique d’un objet à une variable. Par exemple, vous pouvez créer une
variable qui pointe vers un objet Worksheet avec l’instruction suivante :
Dim wksNewSheet As Worksheet

Il reste une étape, toutefois. En effet, en créant une variable qui pointe vers un
objet, vous n’avez pas créé le nouvel objet ni fait pointer la variable vers une ins-
tance existante de l’objet. Pour que la variable wksNewSheet pointe vers une
feuille de calcul intitulée January, vous devez utiliser l’instruction suivante :
Set wksNewSheet = Worksheets("January")

À présent que la variable wksNewSheet est assignée à la feuille de calcul January,


vous pouvez utiliser le nom de la variable comme pointeur vers la feuille de cal-
cul January. Ces deux lignes de code sont équivalentes.

wksNewSheet.Name = "January2"
Worksheets("January").Name = "January2"

L’exemple suivant utilise la méthode InputBox pour demander à l’utilisateur de


spécifier une plage de cellules dans laquelle insérer les totaux mensuels, puis lui
demande les valeurs nécessaires :

Sub InputMonthlyTotals()
Dim strPrompt As String, rgeMonth As Range, sglTotal As Single
Dim intColumn as Integer

strPrompt = "Veuillez sélectionner les cellules dans lesquelles


placer les totaux mensuels."
Set rgeMonth = Application.InputBox(Prompt:=strPrompt,
Title:="Excel _
2003 VBA Au Quotidien", Type:=8)
strPrompt = "Veuillez saisir le total des ventes."
For intColumn = 1 To rgeMonth.Columns.Count
sglTotal = Application.InputBox(Prompt:=strPrompt,
Title:="Excel _
2003 VBA Au Quotidien", Type:=1)
rgeMonth(1, intColumn) = sglTotal
Next intColumn

End Sub
Chapitre 6

135
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 6-1. Valeurs de la méthode InputBox


Valeur Signification Commentaires
0 Une formule Toute formule Excel valide est retournée
sous forme de chaîne de texte. Servez-
vous de la propriété FormulaLocal pour
assigner la formule à un objet Range. Les
références des cellules sont retournées
dans le style A1 et exploitent la fonction
ConvertFormula pour passer au style
L1C1, si nécessaire.
1 Un nombre Calcule également une formule, si elle a
été saisie, pour retourner un nombre. Par
exemple, si on saisit =8*8, InputBox
retourne 64.
2 Texte Accepte une valeur textuelle (chaîne).
4 Une valeur logique (True/ Accepte toute variable Variant qui peut
False) être convertie en valeur logique.
8 Une référence de cellule, Utilisez l’instruction Set pour assigner le
comme un objet Range résultat à un objet Range.
16 Une valeur d’erreur, Retourne une valeur de chaîne composée
comme #NULL! du mot « Erreur » et du numéro d’erreur
Chapitre 6

associé à la valeur d’erreur (voir tableau


6.2 pour une liste des valeurs d’erreurs).
Toute valeur saisie qui ne correspond pas
à une erreur retourne « Erreur 2015 ».
64 Un tableau de valeurs Accepte une liste de valeurs.

136
Partie 3 : Le modèle d’objet Excel

L’objet Application

Au Quotidien
La propriété FormulaLocal et les paramètres locaux

La propriété FormulaLocal retourne ou définit une formule dans la langue spé-


cifiée par les paramètres régionaux de l’utilisateur. Par exemple, si un utilisa-
teur saisit la formule =SUM(B3:B15) dans une boîte de saisie (SUM étant la
version anglaise de SOMME), vous pouvez assigner la formule à la cellule B16
de la première feuille de calcul de votre classeur en vous servant de l’instruc-
tion suivante :
Range(B16).FormulaLocal = InputBox("Saisissez une formule.")

Tableau 6-2. Valeurs d’erreur de cellule


Valeur d’erreur Retourne
##### Erreur 2015
#DIV/0! Erreur 2007
#N/A Erreur 2042
#NAME? Erreur 2029
#NULL! Erreur 2000
#NUM! Erreur 2036
#REF! Erreur 2023
#VALUE! Erreur 2015

Méthode Intersect
La méthode Intersect compare plusieurs plages pour déterminer si elles se che-
vauchent ou partagent des cellules communes. La figure 6.5 montre une plage
délimitée en B3:E6 et une autre plage délimitée en D5:G8. L’intersection des
deux correspond à la page D5:E6, comme le montre l’exemple suivant :

Sub DisplayIntersection()
Range("B3:E6").BorderAround Color:=vbBlack, Weight:=xlThick
Range("B3:E6").Select
Set rge1 = Selection
Range("D5:E8").BorderAround Color:=vbYellow, Weight:=xlThick
Range("D5:E8").Select
Set rge2 = Selection
Set myRange = Application.Intersect(rge1, rge2)
Range(myRange.Address).Select
Selection.Interior.Color = vbBlue
Chapitre 6

End Sub

137
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Figure 6-5. La méthode Intersect retrouve les cellules représentant


l’intersection de deux plages.

La méthode Intersect sert souvent à déterminer si une cellule sélectionnée par


l’utilisateur se trouve dans une plage donnée. La procédure TestPlants invite
l’utilisateur à sélectionner le total mensuel le plus élevé pour Plants dans le
fichier SalesByCategory.xls et affiche un message d’erreur si la cellule sélection-
née ne se trouve pas dans les totaux mensuels des plantes.

Sub TestPlants()
Dim strPrompt As String, rgePlants As Range, rgeIntersect As Range

strPrompt = "Veuillez sélectionner le total mensuel le plus élevé


pour Plants."
Set rgePlants = Application.InputBox(Prompt:=strPrompt, Title:="
Excel _
2003 VBA Au Quotidien", Type:=8)
Set rgeIntersect = Application.Intersect(Range("G2:G13"),
rgePlants)
If rgeIntersect Is Nothing Then
strPrompt = "Vous n’avez pas sélectionné une valeur Plant."
MsgBox strPrompt, vbOKOnly + vbInformation
End If

End Sub
Chapitre 6

Méthode OnKey
La méthode OnKey permet de créer des raccourcis clavier qui, lorsqu’on les com-
posent, exécutent une routine donnée ou bloque le comportement normal
d’Excel. Voici la syntaxe de la méthode OnKey :

138
Partie 3 : Le modèle d’objet Excel

L’objet Application
Application.OnKey(Key, Prodecure)

Key est une valeur de chaîne représentant la combinaison de touches à assigner.


Le tableau 6.3 liste les codes de touches.
Procedure est la valeur de chaîne qui représente le nom de la procédure à invo-
quer. Si Procedure est vide (autrement dit, si on positionne le paramètre sur une
chaîne vide en lui assignant la valeur " "), la combinaison de touches n’effectue
aucune action, même si Excel réagit normalement à cette combinaison. Si on
omet entièrement l’argument Procedure (autrement dit, s’il n’y a rien après la
virgule), les actions normales par défaut de la combinaison de touches sont réi-
nitialisées.
Vous pouvez combiner une touche avec un ou plusieurs modificateurs de tou-
ches (Maj, Ctrl et/ou Alt) pour créer à votre guise des combinaisons de touches.
L’exemple suivant exécute une procédure si on appuie sur Alt+H :

Application.OnKey "%h", "MyProcedure"

L’exemple suivant utilise la combinaison de touches qui ouvre normalement la


boîte de dialogue Rechercher et remplacer (Ctrl+H) pour invoquer une procé-
dure personnalisée :

Application.OnKey "^h", "MyProcedure"

Cet exemple arrête l’exécution du code si on appuie sur Ctrl+H :

Application.OnKey "^h", ""

Ce dernier exemple réinitialise l’action par défaut de Ctrl+H dans Excel (Recher-
cher et remplacer) :

Application.OnKey "^h"

La méthode OnKey sert essentiellement à définir des raccourcis clavier lorsqu’un


classeur est ouvert ou fermé. On peut ainsi utiliser des raccourcis clavier spécifi-
ques au classeur et réinitialiser leurs valeurs par défaut lorsqu’il est fermé. Les
deux procédures suivantes, placées dans le fichier Y2001ByMonth.xls, assignent
le raccourci clavier Alt+C à la procédure CopySheet qui ajoute une nouvelle
feuille de calcul au classeur :

Sub Auto_Open()
Application.OnKey "%c", "CopySheet"
End Sub

Sub Auto_Exit()
Chapitre 6

Application.OnKey "%c"
End Sub

139
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 6-3. Codes des touches


Touche Code de la touche
Ret. Arr {Backspace} ou {BS}
Pause {Break}
Verr. Maj {CapsLock}
Effacement {Clear}
Supprimer ou Supp. {Delete} ou {Del}
Flèche Bas {Down}
Fin {End}
Entrée ~ (Tilde)
Entrée (pavé numérique) {Enter}
F1 à F15 {F1} à {F15}
Aide {Help}
Début {Home}
Ins {Insert}
Flèche Gauche {Left}
Verr. Num {NumLock}
Pg. Suiv {PGDN}
Pg. Préc {PGUP}
Retour {Return}
Flèche Droite {Right}
Arrêt Défil. {ScrollLock}
Tabulation {Tab}
Flèche Haut {Up}
Modificateur de touche Code de la touche
Maj + (signe plus)
Ctrl ^ (signe d’insertion)
Alt % (signe de pourcentage)

Méthode SendKeys
La méthode SendKeys envoie des frappes de touches vers le tampon du clavier
pour vous permettre d’envoyer les frappes de touches à l’application en cours.
Elle est particulièrement intéressante si l’on sait que la procédure ouvre une
boîte de dialogue et qu’il n’existe aucune méthode pour l’empêcher de s’ouvrir et
Chapitre 6

d’attendre une entrée de l’utilisateur.


Voici la syntaxe de la méthode SendKeys :

expression.SendKeys (K
Keys, Wait)

140
Partie 3 : Le modèle d’objet Excel

L’objet Application
● expression Expression optionnelle qui retourne un objet Application.
● Keys Expression Variant obligatoire, généralement exprimée sous forme
de chaîne, qui contient les codes de touches à envoyer (voir tableau 6.3
pour la liste des codes de touches des touches spéciales).
● Wait Expression Variant optionnelle, généralement exprimée avec la
valeur booléenne True ou False qui indique si la procédure doit arrêter
l’exécution jusqu’à ce que les touches ont été traitées. Si l’expression est
True, la procédure s’interrompt jusqu’à ce que toutes les touches envoyées
ont été traitées. Si l’expression est False ou omise, la procédure continue
l’exécution sans tenir compte du traitement des touches.
Les touches sont d’abord placées dans un tampon de touche en attendant que
l’application les appelle. Elles doivent donc être placées dans le tampon avant
que la procédure appelle une méthode qui demande les frappes de touches.
Cet exemple parcourt une liste de clients et génère un courriel personnalisé pour
chacun. La méthode SendKeys sert à passer une frappe de touches Alt+S au pro-
gramme de messagerie par défaut pour envoyer le courriel. La méthode Wait
laisse au programme de messagerie le temps de générer le courriel avant de
l’envoyer.

Sub SendEmail()
Dim strLink As String, rgeEmail As Range
Dim strMsg As String

strMsg = "%0A%0ACe mois-ci, économisez €10 sur toute commande


supérieure à €100.%0A "
strMsg = strMsg & "Chez Jardin vous trouverez tout l’équipement du
jardinage."
For Each rgeEmail In Range(Cells(2, 1), Cells(7, 1))
strLink = "Mailto:" & rgeEmail.Offset(0, 1).Value &
"?subject="
strLink = strLink & "Monthly Special%0A&body="
strLink = strLink & "Cher " & rgeEmail.Value & ",%0A"
strLink = strLink & strMsg
ActiveWorkbook.FollowHyperlink (strLink)
Application.Wait (Now + TimeValue("00:00:02"))
SendKeys "%s", True
Next rgeEmail

End Sub

Ce chapitre a présenté l’objet Application, qui contient un grand nombre de pro-


priétés et de méthodes affectant le fonctionnement d’Excel au plus haut niveau.
Vous pouvez assigner de nouvelles procédures pour contrôler les combinaisons
de touches, empêcher l’écran de clignoter pendant qu’une procédure modifie le
Chapitre 6

classeur et travailler dans la fenêtre, le classeur, le graphique, la feuille ou la cel-


lule actifs avec les propriétés ActiveWindow, ActiveWorkbook, ActiveChart, Acti-
veSheet et ActiveCell Le chapitre 7 entre davantage dans les détails et examine les
objets Workbook et Worksheet.

141
Partie 3 : Le modèle d’objet Excel

Chapitre 7
Classeurs et feuilles de
calcul
La collection Workbooks . . . . . . 143 Les collections Sheets
et Worksheets . . . . . . . . . . . . . . 164

Le classeur constitue le niveau le plus élevé de l’organisation Microsoft Excel.


Vous pensez peut-être que les actions que vous pouvez entreprendre au niveau
du classeur se limitent à créer des nouveaux classeurs, enregistrer les change-
ments, fermer les classeurs ou supprimer les classeurs devenus inutiles. S’il est
exact que la plupart des manipulations de « classeurs » se produisent essentielle-
ment au niveau de la feuille de calcul et de la cellule, les classeurs ne sont pas en
reste. Ce chapitre traite également des feuilles de calcul, à la fois comme feuilles
et comme membres de la collection Sheets. Vous y trouverez ainsi les ressources
nécessaires pour créer des classeurs, les configurer à votre guise (en terme de
protection par mot de passe, nombre de feuilles de calcul et noms de ces feuilles)
avant de commencer à manipuler les valeurs qu’ils contiennent.

La collection Workbooks
La collection Workbooks contient les références à chaque classeur ouvert dans
votre copie d’Excel. Pour modifier chaque classeur ouvert, vous pouvez faire
appel à une boucle For Each...Next qui parcourt la collection et effectue les modi-
fications. La collection Workbooks contient un certain nombre d’autres métho-
des intéressantes que vous pouvez exploiter pour manipuler les classeurs
existants, celle de base étant la création : vous devez pouvoir créer un nouveau
classeur avant de savoir le manipuler.

Créer de nouveaux classeurs


La création d’un nouveau classeur représente l’une des tâches de base du pro-
gramme Excel. Les nouveaux classeurs constituent le dépôt de nouvelles infor-
mations ou la cible de feuilles de calcul copiées à partir de classeurs existants.
Quel que soit l’usage que vous en faites, vous créez un nouveau classeur de la
manière suivante :

Workbooks.Add

143
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


Pour créer une copie d’un classeur existant, définissez le paramètre Template de
la méthode Add de la manière suivante :
Chapitre 7

Sub AjouterNouveauClasseur()
Dim NewWbk As Workbook
Set NewWbk =
Workbooks.Add(Template:="C:\ExcelProg\VentesMensuelles.xls")
End Sub

Ouvrir des classeurs


Après avoir créé un ou plusieurs classeurs, vous voudrez sans doute les ouvrir.
Pour ce faire, vous utilisez la méthode Open de la collection Workbooks qui, dans
sa forme la plus simple, se présente comme suit :

Workbooks.Open (FileName:="VentesMensuelles.xls")

Il existe un grand nombre d’autres options permettant d’ouvrir un classeur.


Voici la syntaxe de la méthode Open :

FileName, UpdateLinks, ReadOnly, Format, Password,


expression.Open(F
WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter,
Editable, Notify, Converter, AddToMru, Local, CorruptLoad)

Le tableau 7.1 décrit les paramètres de la méthode Workbooks.Open. Les paramè-


tres intéressants sont ReadOnly, qui exige de l’utilisateur exécutant la macro qu’il
ouvre le classeur en lecture seule, Password, qui doit être défini pour protéger le
classeur avec un mot de passe et Delimiter, qui spécifie le caractère employé pour
séparer les champs si l’utilisateur ouvre un fichier texte.

Remarque Nous étudierons l’ouverture de fichiers texte plus loin dans cette
section.

Tableau 7-1. Paramètres associés à la méthode Workbooks.Open


Paramètre Description
FileName Chaîne obligatoire qui spécifie le nom et le chemin d’accès du
fichier à ouvrir.
UpdateLinks Indique à Excel comment gérer les liens entre le classeur et les
autres classeurs. 0 ne met pas les références à jour, 1 met à
jour les références externes, 2 met à jour les références
distantes et 3 met à jour les références externes et distantes.
ReadOnly Positionné sur True, ce paramètre ouvre le classeur en mode
lecture seule.

144
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Tableau 7-1. Paramètres associés à la méthode Workbooks.Open (Suite)

Chapitre 7
Paramètre Description
Password Chaîne qui contient le mot de passe requis pour ouvrir le
classeur. Si vous omettez cet argument, la routine de protection
par mot de passe Excel classique s’applique.
WriteResPassword Chaîne qui contient le mot de passe requis pour écrire dans un
classeur protégé en écriture. Si vous omettez cet argument, la
routine de protection par mot de passe Excel classique
s’applique.
IgnoreReadOnly Si le classeur a été enregistré avec l’option Read-Only
Recommended Recommended activée, en positionnant ce paramètre sur True,
Excel n’affiche pas le message de recommandation d’ouverture
en lecture seule si on ouvre le classeur.
Origin Indique le système d’exploitation employé pour créer le fichier.
Les trois constantes sont xlWindows, xlMacintosh et xlMSDOS.
Si ce paramètre n’est pas spécifié, Excel utilise le système
d’exploitation actuel.
Format Spécifie le caractère employé pour séparer une valeur de cellule
de la suivante. 1 représente les tabulations, 2 les virgules, 3
les espaces, 4 les points-virgules, 5 rien et 6 un caractère
personnalisé spécifié dans le paramètre Delimiter.
Delimiter Contient le caractère utilisé comme séparateur si l’argument
Format est positionné sur 6.
Editable Si le fichier est un complément Microsoft Excel 4.0, positionner
cet argument sur True ouvre la macro complémentaire dans une
fenêtre visible. Si l’argument est positionné sur False ou est
omis, le complément est ouvert mais masqué et ne peut pas
être visible. Cette option ne s’applique pas aux macros
complémentaires créées dans Excel 5.0 ou version ultérieure.
Si le fichier est un modèle Excel (fichier *.xlt), positionner
l’argument sur True ouvre le modèle pour le modifier ; s’il est
positionné sur False ou omis, il crée un nouveau classeur basé
sur le modèle.
Notify Si le fichier est en cours d’utilisation, lorsque ce paramètre est
positionné sur True Excel ouvre le fichier en lecture seule, vérifie
la disponibilité du fichier et informe l’utilisateur lorsque le fichier
peut être ouvert un mode lecture-écriture.
Converter Constante Excel qui indique le premier convertisseur à essayer
lorsque le fichier est ouvert. Les convertisseurs sont des
fichiers supplémentaires qui permettent de convertir au format
Excel des fichiers qu’Excel ne sait pas encore comment ouvrir.
Vous devrez généralement obtenir le convertisseur auprès du
distributeur du logiciel, mais certains convertisseurs sont
disponibles sur le site web de Microsoft.

145
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 7-1. Paramètres associés à la méthode Workbooks.Open (Suite)


Chapitre 7

Paramètre Description
AddToMru Positionné sur True ce paramètre ajouter le classeur à la liste
des fichiers récemment utilisés.
Local Variable booléenne qui indique s’il faut employer la langue Excel
locale ou le langage défini dans VBA (s’il est différent).
CorruptLoad S’il est positionné sur xlNormalLoad, ce paramètre ouvre le
fichier normalement. S’il est positionné sur xlRepairFile, il tente
de réparer le fichier. S’il est positionné sur xlExtractData, il tente
d’extraire les données dans un fichier de récupération.

Le format texte constitue l’un des formats de fichiers les plus utiles et les plus
polyvalents. Quel que soit le programme employé pour créer un tableur ou une
table de base de données, vous pouvez l’enregistrer au format texte et l’ouvrir
dans Excel. Par exemple, si vous travaillez avec un collègue d’une autre entreprise
qui utilise un tableur ou un programme de base de données qui ne lit pas ou ne
crée pas de fichiers compatibles avec Excel, vous pouvez écrire les données dans
un fichier texte et les lire ensuite dans Excel. Vous perdrez la mise en forme et les
formules du fichier d’origine, mais la possibilité de déplacer ainsi les données
mérite qu’on s’y intéresse.
L’essentiel, lorsque vous créez un fichier texte pour représenter les données d’un
tableau, est de créer une division claire entre les cellules. De nombreux program-
mes se servent des virgules comme séparateurs, ou d’un caractère qui représente
une limite entre deux cellules. Par exemple, la figure 7.1 présente une feuille de
calcul sous forme d’un tableau composé de trois lignes de données et de trois cel-
lules par ligne.

10345,5738,6029
24082,7459,3108
5119,8003,14972

Figure 7-1. Vous pouvez ouvrir un fichier contenant des données séparées par
des virgules directement dans Excel.

Il serait cependant incorrecte d’écrire les données dans un fichier texte avec des
virgules de séparation et des virgules comme séparateur décimal (en Europe) ou
séparateur des milliers (aux Etats-Unis). La figure 7.2 montre ce qui se produit
avec la même liste de données si les virgules servent de séparateurs décimaux et
de délimiteurs.

10,345,5,738,6,029
24,082,7,459,3,108
5,119,8,003,14,972

146
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


À la place des trois lignes de trois cellules, les données ci-dessus produisent une
feuille de calcul composée de trois lignes de six cellules.

Chapitre 7
Figure 7-2. Lorsque les séparateurs ne se trouvent pas à l’emplacement
prévu, il s’en suit un véritable chaos.

Vous pouvez faire appel à d’autres caractères que les virgules pour délimiter les
données. Dans l’Assistant Importation de texte, vous pouvez sélectionner une
option pour indiquer le délimiteur utilisé dans le fichier (virgule, espace, tabula-
tion, point-virgule, ou tout autre caractère que vous précisez). Vous disposez du
même choix dans Visual Basic pour Applications (VBA) en définissant les para-
mètres de la méthode Workbooks.OpenText. Voici la syntaxe de la méthode
OpenText :

FileName, Origin, StartRow, DataType,


expression.OpenText(F
TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space,
Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator,
ThousandsSeparator, TrailingMinusNumbers, Local)

Le tableau 7.2 décrit les paramètres disponibles.


Tableau 7-2. Paramètres de la méthode Workbooks.OpenText
Paramètre Description
FileName Chaîne obligatoire qui spécifie le nom et le chemin d’accès du
fichier.
Origin Indique le système d’exploitation employé pour créer le fichier.
Les trois constantes sont xlWindows, xlMacintosh et xlMSDOS.
Si ce paramètre n’est pas spécifié, Excel utilise le système
d’exploitation actuel.
StartRow Numéro de la ligne à partir de laquelle Excel doit commencer à
lire les données dans la feuille de calcul.
DataType Spécifie le format de la colonne de données dans le fichier. Il
peut s’agir de l’une des constantes XlTextParsingType
suivantes : xlDelimited qui indique la présence d’un caractère
délimiteur ou xlFixedWidth qui indique que la longueur de
chaque champ est fixe. Si vous ne spécifiez pas cet argument,
Excel tente de déterminer le format de la colonne lorsqu’il
ouvre le fichier.

147
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 7-2. Paramètres de la méthode Workbooks.OpenText (Suite)


Chapitre 7

Paramètre Description
TextQualifier Utilise une constante XlTextQualifier pour spécifier le caractère
employé pour indiquer qu’un champ contient une valeur
textuelle. Les constantes possibles sont
xlTextQualifierDoubleQuote (guillemets doubles, par défaut),
xlTextQualifierNone (aucun caractère n’indique qu’il s’agit d’un
champ texte) et xlTextQualifierSingleQuote (guillemets
simples).
ConsecutiveDelimiter Affectez-lui la valeur True pour que plusieurs séparateurs
consécutifs soient considérés comme un seul séparateur.
Tab, Semicolon, Positionnez ces paramètres sur True si le caractère nommé
Comma, Space représente le délimiteur employé dans le fichier texte.
FieldInfo Table contenant les informations de distribution pour les
colonnes de données individuelles. Lorsque les données sont
séparées, cet argument est une table de tableaux à deux
éléments, qui indiquent les options de conversion pour une
colonne particulière. Le premier élément représente le numéro
de la colonne (base 1) et le deuxième élément est l’une des
constantes xlColumnDataType indiquant comment la colonne
est distribuée. Les constantes sont xlGeneralFormat
(Général), xlTextFormat (Texte), xlMDYFormat (Format de date
Mois-Jour-Année), xlDMYFormat (Format de date Jour-Mois-
Année), xlYMDFormat (Format de date Année-Jour-Mois),
xlMYDFormat (Format de date Mois-Année-Jour), xlDYMFormat
(Format de date Jour-Année-Mois), xlYDMFormat (Format de
date Année-Jour-Mois), xlEMDFormat (Date EMD) et
xlSkipColumn (colonne non distribuée). Vous pouvez
uniquement employer la constante xlEMDFormat si vous avez
installé et sélectionné la prise en charge du chinois (Taïwan).
La constante xlEMDFormat spécifie que les dates d’ères
chinoises (Taïwan) sont utilisés.
TextVisualLayout Variante qui contrôle la mise en page visuelle du texte dans
l’interface Excel.
Other Positionnez ce paramètre sur True si vous utilisez OtherChar
pour définir un séparateur non standard.
OtherChar Le caractère employé comme séparateur dans le fichier à
ouvrir. Si la chaîne contient plusieurs caractères, Excel utilise
le premier caractère.
DecimalSeparator, Les caractères assignés à ces deux arguments indiquent le
ThousandsSeparator séparateur décimal et le séparateur des milliers.

148
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Tableau 7-2. Paramètres de la méthode Workbooks.OpenText (Suite)

Chapitre 7
Paramètre Description
TrailingMinusNumbers Valeur qui indique si un nombre est précédé du signe moins
(True, valeur par défaut) ou si le signe moins suit un nombre
négatif (False, presque jamais utilisé). À moins d’avoir une
raison spécifique de positionner ce paramètre sur False, ne
l’incluez jamais dans l’appel de la méthode OpenText.
Local Variable booléenne qui indique s’il faut employer la langue
Excel locale ou le langage défini dans VBA (s’il est différent).

Voici une routine ouvrant un fichier texte intitulé VentesExport.txt, dont les
données sont séparées par des doubles points :

Sub ImporterTexte()
Workbooks.OpenText Filename:="VentesExport.txt", Semicolon:=True
End Sub

Lorsque vous écrivez un programme qui modifie d’autres fichiers, souvenez-


vous que vous supposez disposer du contrôle total sur ces fichiers et qu’ils ne
sont pas ouverts. Le code le mieux écrit n’a aucune valeur si à l’heure d’ouvrir un
fichier, vous récupérez une copie en lecture seule du fichier parce que l’un de vos
collègues l’a ouvert pour compléter quelques chiffres.
La procédure suivante permet d’éviter ce type de problème en vérifiant qu’un
classeur spécifique est ouvert :

Sub VérifAvantOuverture()
Dim Wkbk As Workbook
Dim Filename As String
Filename = InputBox("Tapez le nom du fichier à consulter.")
For Each Wkbk in Application.Workbooks
If Wkbk.Name = Filename Then
MsgBox (Filename & " est ouvert ; tout changement peut
engendrer une erreur.")
End If
Next Wkbk
End Sub

Attention Rappelez-vous que le nom du fichier est sensible à la casse et


inclut l’extension du fichier, généralement .xls pour les fichiers Excel. Si on
saisi RécapVentes ou récapventes.xls dans la zone de saisie de cette procé-
dure, on ne sait pas si le fichier RécapVentes.xls est ouvert.

Enregistrer des classeurs


À l’instar de vos classeurs que vous enregistrez après toute modification, il est
indispensable d’enregistrer les classeurs après avoir apporter des changements
significatifs avec VBA. Imaginons, par exemple, que vous importiez des données
dans un classeur et le fermiez avant d’enregistrer les nouvelles données. Si le

149
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


fichier source se trouve sur un autre ordinateur et que vous ne parvenez pas à
rétablir la connexion, vous vous retrouvez au point de départ.
Chapitre 7

L’objet Application propose une propriété intéressante pour enregistrer le clas-


seur qui contient le code de la macro : la propriété ThisWorkbook, qui retourne
un objet Workbook représentant le classeur qui contient le code VBA exécuté. Ce
nouvel objet Workbook en main, vous appelez la méthode Save pour enregistrer
une copie du classeur.
Voici le code qui enregistre le classeur contenant le code :

ThisWorkbook.Save

Remarque Si vous vous servez de la méthode ThisWorkbook.Save pour enre-


gistrer le classeur la première fois, Excel essaie d’enregistrer le classeur en
utilisant son nom actuel. S’il s’agit du premier classeur enregistré au cours de
cette session Excel, son nom sera Classeur1. Si un autre classeur du même
répertoire porte le même nom, une boîte de message s’affiche pour vous per-
mettre d’écraser le fichier existant en cliquant sur Oui ou d’annuler l’opération
en cliquant sur Non ou Annuler. Si vous choisissez de ne pas écraser le fichier
existant, une boîte de message d’erreur d’exécution Microsoft Visual Basic
s’affiche, indiquant que la méthode à échoué (erreur 1004).

Pour enregistrer le classeur sous un nouveau nom ou dans un nouvel emplace-


ment, servez-vous de la méthode SaveAs de la propriété ThisWorkbook. À l’instar
du bouton Enregistrer de la barre d’outils qui représente une méthode moins
compliquée que de cliquer sur Fichier, Enregistrer sous pour ouvrir la boîte de
dialogue Enregistrer sous et ses options, la méthode ThisWorkbook.Save est bien
moins compliquée que la méthode ThisWorkbook.SaveAs. Mais, à vrai dire, la
méthode ThisWorkbook.SaveAs est simple d’emploi. Voici la syntaxe complète de
la méthode SaveAs :

FileName, FileFormat, Password, WriteResPassword,


expression.SaveAs(F
ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution,
AddToMru, TextCodePage, TextVisualLayout, Local)

Le tableau 7.3 liste les paramètres de cette méthode.


Tableau 7-3. Paramètres de la méthode ThisWorkbook.SaveAs
Paramètre Description
FileName Le nom et le chemin d’accès du fichier à enregistrer.
FileFormat La constante Excel qui représente le format de fichier dans
lequel enregistrer le fichier. Il existe 44 constantes de forme de
fichiers Excel, que vous trouverez dans l’aide de Visual Basic
Editor en tapant xlFileFormat dans la zone Poser une question.
Password Définit un mot de passe pour le fichier. Le mot de passe doit
se composer au maximum de 15 caractères.

150
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Tableau 7-3. Paramètres de la méthode ThisWorkbook.SaveAs (Suite)

Chapitre 7
Paramètre Description
WriteResPassword Définit un mot de passe pour restreindre le nombre de
personnes habilitées à modifier le fichier, tout en autorisant
l’ouverture du fichier en lecture seule.
ReadOnlyRecommended Positionné sur True, ce paramètre affiche une boîte de dialogue
qui recommande à l’utilisateur d’ouvrir le fichier en mode
lecture seule.
CreateBackup Positionné sur True, ce paramètre crée une copie de
sauvegarde du classeur.
AccessMode Indique si le fichier est enregistré en mode exclusif
(xlExclusive), en mode sans changement (xlNoChange) ou
comme fichier partagé (xlShared). En mode exclusif, un seul
utilisateur à la fois peut ouvrir le classeur et y apporter des
modifications. Si vous enregistrez le classeur sans
changement, le mode d’accès reste inchangé et si vous optez
pour un fichier partagé, plusieurs utilisateurs peuvent
simultanément accéder au fichier en lecture/écriture.
ConflictResolution Indique comment Excel doit gérer les changements conflictuels
dans un classeur partagé en positionnant le paramètre
ConflictResolution sur l’une des constantes
XlSaveConflictResolution suivantes : xlUserResolution, par
défaut, qui affiche la boîte de dialogue de résolution des
conflits, xlLocalSessionChanges, qui accepte automatiquement
les changements de l’utilisateur local, ou
xlOtherSessionChanges, qui accpete d’autres changements à la
place des changements de l’utilisateur local.
AddToMru Positionné sur True, ce paramètre ajoute le nom du fichier à la
liste des fichiers récemment utilisés dans le menu Fichier.
TextCodePage Variante, non utilisée dans la version française de Microsoft
Excel, qui contrôle l’interprétation et l’affichage des caractères
dans un classeur.
TextVisualLayout Variante, non utilisée dans la version française d’Excel, qui
contrôle la mise en page visuelle du texte dans l’interface
Excel.
Local Variable booléenne qui indique s’il faut employer la langue
Excel locale ou le langage défini dans VBA (s’il est différent).

Les propriétés que vous exploiterez le plus souvent sont FileName et AddToMru¸
avec FileFormat et Password se battant pour la troisième place. La propriété Add-
ToMru, qui place le fichier dans la liste des fichiers récemment utilisés du menu
Fichier, peut sembler un choix étrange, mais elle permet de vous souvenir des
classeurs sur lesquels vous devez travailler la prochaine fois que vous ouvrirez
Excel. Par exemple, si vous avez écrit une macro qui actualise les valeurs d’une

151
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


série de classeurs que le président de votre société doit étudier ultérieurement, si
vous ajoutez les noms des classeurs actualisés à la liste des fichiers récemment
Chapitre 7

utilisés, il lui sera plus simple de trouver les fichiers à examiner.


Pour enregistrer chaque classeur ouvert, écrivez un macro contenant une boucle
For Each...Next, comme dans la procédure suivante :

Sub ToutEnregistrer()
Dim Wkbk as Workbook
For Each Wkbk in Workbooks
If Wkbk.Path <> "" Then Wkbk.Save
Next Wkbk
End Sub

L’instruction If...Then de la boucle For Each...Next vérifie si le chemin d’accès du


classeur est non défini, ce qui signifie qu’il n’a jamais été enregistré. Cette vérifi-
cation est importante si vous voulez que la procédure s’exécute sans intervention
humaine. Si une personne doit être présente pendant l’enregistrement des clas-
seurs, autant le faire manuellement.
La méthode SaveAsCopy est une méthode apparentée qui enregistre une copie du
classeur en cours sous un nouveau nom. La méthode SaveAsCopy permet de faire
des copies de sauvegarde d’un classeur durant une longue procédure pour éviter
la perte de données. Vous pouvez en outre l’intégrer à une stratégie de mainte-
nance de fichiers et de sauvegarde plus générale. Voici la syntaxe de cette
procédure :

ThisWorkbook.SaveCopyAs "cheminaccès\nomfichier.xls"

Attention Si vous utilisez la méthode SaveAsCopy pour enregistrer un fichier


avec un nom de fichier existant, la macro écrase ce dernier sans demander la
permission.

Activer les classeurs


Dans notre étude des propriétés Save et SaveAs, vous aurez remarqué que le code
utilise l’objet ThisWorkbook, qui se réfère au classeur auquel le code VBA est lié.
L’objet ActiveWorkbook est apparenté à l’objet ThisWorkbook en ce qu’il se réfère
à un classeur (manifestement), mais il fait référence au classeur sur lequel vous
avez choisi d’agir et non sur celui auquel le code est lié. Pour modifier le classeur
actif, on appelle la méthode Activate de la collection Workbooks, comme dans le
code suivant :

Workbooks("2004T3Ventes.xls").Activate

Fermer les classeurs


Lorsque vous avez terminé de modifier le classeur, il est préférable de le fermer ;
d’une part pour économiser les ressources du système et d’autre part pour
réduire le risque qu’il se produise quelque chose alors que le classeur est ouvert.

152
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


Il suffit parfois d’une frappe de touche accidentelle pour que les données se
transforment en chaos total. À l’instar des techniques Save et SaveAs que nous

Chapitre 7
avons étudiées précédemment dans cette section, vous pouvez exploiter la pro-
priété ThisWorkbook de l’objet Application pour invoquer la méthode Close,
comme dans l’instruction suivante :

ThisWorkbook.Close

Pour fermer un autre classeur à partir de la procédure, servez-vous d’une ins-


truction de ce type :

Workbooks("nom").Close

Pour faire le ménage et fermer chaque classeur ouvert à la fin de la macro, servez-
vous de la procédure suivante :

Sub ToutFermer()
Dim Wkbk As Workbook
For Each Wkbk in Workbooks
If Wkbk.Name <> ThisWorkbook.Name Then
Wkbk.Close SaveChanges:=True
End If
Next Wkbk
ThisWorkbook.Close SaveChanges:=True
End Sub

Cette procédure vérifie chaque classeur pour s’assurer qu’il ne s’agit pas du clas-
seur contenant le code VBA. Si le code fermait son propre classeur avant d’avoir
fermer tous les autres classeurs ouverts, ces derniers ne seraient pas affectés puis-
que le code ne s’exécuterait plus.

Attention La procédure affiche la boîte de dialogue Enregistrer sous si l’un


des classeurs est nouveau.

Propriétés
Même si les classeurs constituent le point central d’Excel, on passe moins de
temps à manipuler les classeurs qu’à travailler dans les feuilles de calcul et les pla-
ges de cellules. Malgré tout, il existe un certain nombre de propriétés des clas-
seurs qui peuvent vous aider à travailler plus efficacement dans Excel.

Propriété ActiveChart
Les graphiques permettent de récapituler visuellement les données, mais si vous
devez afficher un graphique dans une zone relativement étroite et que vous ne
disposez pas de la place suffisante pour inclure une légende ou d’autres informa-
tions, vous pouvez faire appel aux boîtes de message pour afficher les informa-
tions sur le graphique sélectionné. La macro suivante peut être liée à un bouton

153
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


de commande dans une feuille de calcul qui présente des informations complé-
mentaires sur le graphique actif.
Chapitre 7

Sub AideGraphique()
ChartChosen = ActiveChart.Name
Select Case ChartChosen
Case "": Exit Sub
Case "Feuil1 Graphique 1": MsgBox "Ce graphique présente les
ventes pour la période 2000-2004."
Case "Feuil1 Graphique 2": MsgBox "Ce graphique présente les
bénéfices pour la période 2000-2004."
End Select
End Sub

Pour plus d’informations sur la création et la manipulation des graphiques dans VBA,
reportez-vous au chapitre 15, « Graphiques ».

Afficher des formes


Les classeurs contiennent une quantité de données et quelle que soit la manière
dont vous structurez les données, il n’est pas toujours simple d’appréhender
l’ensemble du projet. Les formes, comme les zones de texte et les flèches, permet-
tent d’appeler des fonctionnalités spéciales des feuilles de calcul et d’offrir des
informations utiles aux utilisateurs. Si vous vous servez des formes et autres
objets de dessin pour proposer des informations, vous pouvez également choisir
de les masquer ou de les afficher à volonté avec la méthode DisplayDrawingOb-
jects. Le code suivant suppose que vous disposez d’une série de formes qui dissi-
mulent les données si on les laisse sur la feuille de calcul, mais qui expliquent les
tenants et les aboutissants si l’utilisateur peut les activer ou les désactiver à sa
guise. La figure 7.3 présente la boîte de message produite par la procédure : en
cliquant sur OK, l’utilisateur masque les formes, alors qu’en cliquant sur Annu-
ler, les objets restent visibles.

Public Sub AfficherFormes()


ThisWorkbook.DisplayDrawingObjects = xlDisplayShapes
Answer = MsgBox(Prompt:="Cliquez sur OK pour masquer la forme.", _
Buttons:=vbOKCancel + vbQuestion)
If Answer = vbCancel Then
Exit Sub
Else
ThisWorkbook.DisplayDrawingObjects = xlHide
End If
End Sub

154
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Chapitre 7
Figure 7-3. Vous pouvez créer des procédures qui laissent les utilisateurs
décider de masquer les formes ou de les afficher.

La propriété DisplayDrawingObjects propose trois constantes Excel que l’on peut


employer comme valeurs : xlDisplayShapes, qui affiche toutes les formes, xlHide,
qui masque toutes les formes, et xlPlaceHolders, avec laquelle Excel imprime uni-
quement les objets de la feuille de calcul.

Gérer les paramètres des fichiers


Vous pouvez exploiter deux aspects des informations de fichiers pour manipuler
le classeur : le chemin d’accès du fichier et le son nom complet. Le chemin
d’accès représente le listing complet des répertoires d’un fichier, comme
C:\Excel\Données, alors que le nom complet du classeur inclut le nom de fichier
du classeur, comme C:\Excel\Données\T12004.xls. Pour faire référence à ces
propriétés dans le classeur qui héberge le code de la macro, servez-vous de ces
deux méthodes :

ThisWorkbook.Path
ThisWorkbook.FullName

Pour ajouter le nom complet ou le chemin d’accès du classeur auquel vous ajou-
tez le code dans Visual Basic Editor, cliquez sur Affichage, Fenêtre Exécution
pour l’ouvrir et tapez MsgBox (ThisWorkbook.FullName) ou MsgBox
(ThisWorkbook.Path) pour trouver les informations de répertoire et de nom de
fichier pour vos procédures. Ces informations n’ont pas grande importance si
vous ne prévoyez pas de transférer votre code en-dehors du classeur, mais si vous
devez faire référence à ce classeur particulier depuis un autre emplacement, vous
devrez employer le nom complet du fichier. En outre, même si vous pouvez obte-

155
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


nir les mêmes informations en essayant d’enregistrer le fichier et en cliquant sur
la flèche de la liste déroulante Enregistrer sous pour trouver le dossier dans
Chapitre 7

lequel le classeur est stocké, avec la fenêtre Exécution vous n’êtes pas obligé de
quitter Visual Basic Editor, ce qui fluidifie votre travail.

Remarque Le nom complet d’un fichier comprend un chemin d’accès, mais


celui-ci peut être vide si le fichier n’a pas encore été enregistré.

Précédemment dans ce chapitre, nous avons utilisé les méthodes Save et SaveAs
de la propriété ThisWorkbook pour enregistrer des fichiers modifiés avec VBA.
Excel vérifie la présence de changements non enregistrés, ce qui trouve son inté-
rêt si vous voulez consulter le classeur et l’enregistrer chaque fois que vous exé-
cutez une procédure qui affecte son contenu ou si vous voulez fermer le classeur
sans enregistrer les modifications effectuées (si vous exécutez un série de routi-
nes de mise en forme pour mettre en évidence différents aspects de vos données,
mais préférez tout réinitialiser avant de terminer, par exemple). Avec le fragment
de code suivant, Excel ferme le classeur actif sans enregistrer les changement non
sauvegardés :

ThisWorkbook.Saved = True
ThisWorkbook.Close

L’enregistrement des valeurs d’un classeur présente un autre aspect relatif à


l’intensité de l’utilisation des liens vers des sources de données externes. Par
exemple, si vous appartenez à une entreprise qui réalise un nombre important de
ventes individuelles que vous suivez dans une base de données Microsoft Access,
il peut être intéressant de créer des liens entre chaque cellule du classeur et la cel-
lule correspondante dans la table de la base de données. Si Excel poursuit son
comportement par défaut qui consiste à recalculer le classeur en vérifiant les
valeurs dans la table de la base de données, vous risquez d’attendre un long
moment chaque fois que vous ouvrez le classeur.
Voici le code employé pour enregistrer les valeurs liées :

ThisWorkbook.SaveLinkValues = True

En positionnant la propriété SaveLinkValues sur False, Excel revérifie les valeurs


chaque fois que l’on ouvre le classeur et si les valeurs ne sont pas disponibles, il
génère une erreur.

Demander un mot de passe à l’ouverture d’un classeur


Maintenir l’intégrité des données dans un environnement d’entreprise constitue
l’une des parts les plus importantes du travail au sein de l’industrie de l’informa-
tion. Si vous devez protéger vos données contre les personnes externes venant
fureter dans votre système ou les utilisateurs internes ayant obtenu des privilèges
supplémentaires et qui parcourent l’intranet, vous pouvez également choisir de
restreindre l’accès à l’un de vos classeurs en demandant aux utilisateurs habilités

156
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


de fournir un mot de passe correct lorsqu’ils enregistrent toute modification du
classeur.

Chapitre 7
Le code suivant permet à un utilisateur de définir un mot de passe qu’il devra
fournir pour ouvrir le classeur. Une fois que la personne a ouvert le classeur, elle
sera en mesure de le modifier à sa guise, mais uniquement si elle connaît le mot
de passe !

Sub MotDePasseLecture()
Dim strPassword1 As String
Dim strPassword2 As String
strPassword1 = InputBox ("Tapez un mot de passe pour le classeur.")
strPassword2 = InputBox ("Tapez à nouveau le mot de passe.")
If strPassword1 <> strPassword2 Then
MsgBox ("Le mot de passe ne correspond pas. Essayez à
nouveau.")
Else
ThisWorkbook.Password = strPassword1
MsgBox ("Le mot de passe est défini.")
End If
End Sub

Important Vous avez probablement remarqué que la procédure DéfinirMotDe-


Passe demande à l’utilisateur de taper deux fois le même mot de passe pour
le définir. Lorsque vous créez des routines qui limitent l’accès aux données,
vérifiez toujours que le mot de passe saisi par l’utilisateur est bien celui qu’il
avait prévu. Rappelez-vous que si les données sont suffisamment importantes
pour être protégées, il est préférable d’ajouter des mesures supplémentaires
pour surveiller le mot de passe.

Pour protéger votre classeur, vous pouvez également empêcher les utilisateurs
d’enregistrer les modifications sauf s’ils connaissent le mot de passe qui protège
le classeur. Lorsqu’un classeur est protégé en écriture, la propriété WriteReserved
est positionnée sur True. Ne commencez pas par écrire à la volée le code qui
change un mot de passe protégé en écriture. En effet, l’utilisateur doit saisir le
mot de passe actuel avant d’en définir un nouveau. En conséquence, la routine
suivante vérifie que le classeur actif n’est pas protégé en écriture avant d’autoriser
l’utilisateur à définir un mot de passe qu’il devra saisir pour être habilité à enre-
gistrer les changements.

Sub MotDePasseÉcriture()
Dim strPassword1 As String
Dim strPassword2 As String
strPassword1 = InputBox ("Tapez un mot de passe pour enregistrer les
changements.")
strPassword2 = InputBox ("Tapez à nouveau le mot de passe.")
If strPassword1 <> strPassword2 Then
MsgBox ("Le mot de passe ne correspond pas. Essayez à
nouveau.")
Else
If ActiveWorkbook.WriteReserved = False Then

157
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


ActiveWorkbook.WritePassword = strPassword1
Else MsgBox ("Le classeur est déjà protégé en écriture.")
Chapitre 7

End If
MsgBox ("Le mot de passe est défini.")
End If
End Sub

Protéger les classeurs contre les modifications


Lorsque vous utilisez la méthode WritePassword pour protéger votre classeur,
vous demandez aux utilisateurs de connaître le mot de passe qui leur permet
d’ouvrir le classeur. Une fois le classeur ouvert, ils peuvent effectuer les modifi-
cations de leur choix. Pour ajouter une deuxième couche de protection, vous
pouvez définir un autre mot de passe que les utilisateurs doivent saisir avant de
pouvoir modifier le classeur. Avec la méthode Protect, vous empêchez les utilisa-
teurs d’ajouter des feuilles de calcul, de supprimer des feuilles de calcul, d’affi-
cher des feuilles de calcul masquées (autrement dit, de modifier la structure du
classeur) et également de changer la taille ou la position des fenêtres du classeur
(changer les fenêtres du classeur).

Remarque Si vous utilisez la méthode Protect avec un objet Workbook, les


protections s’appliquent à l’ensemble du classeur.

Voici la syntaxe de la méthode Protect de l’objet Workbook :

Password], [S
Protect[P Structure], [W
Windows]

Pas besoin de tableau cette fois ! Le paramètre Password représente le mot de


passe (obligatoire), les paramètres Structure et Windows sont optionnels. Par
défaut, ils sont positionnés sur False, mais si vous les positionnez sur True,
comme dans l’exemple de code suivant, la structure et la disposition des fenêtres
du classeur seront protégées.

Sub DéfinirProtection()
Dim strPassword1 As String
Dim strPassword2 As String
'D'abord, vérifiez que le classeur n'est pas déjà protégé.
If (ActiveWorkbook.ProtectStructure <> True And _
ActiveWorkbook.ProtectWindows <> True) Then
strPassword1 = InputBox ("Tapez un mot de passe pour
protéger le classeur.")
strPassword2 = InputBox ("Tapez à nouveau le mot de passe.")
'Vérifiez ensuite que les mots de passe sont identiques
If strPassword1 <> strPassword2 Then
MsgBox ("Le mot de passe ne correspond pas. Essayez à
nouveau.")
Else
ActiveWorkbook.Protect Password:=strPassword1,
Structure:=True, _
Windows:=True
MsgBox ("Le mot de passe est défini.")

158
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


End If
'De retour dans la partie de la routine qui vérifie la protection.

Chapitre 7
Else
MsgBox ("Le classeur est déjà protégé en écriture.")
End If
End Sub

Au Quotidien
Quand une erreur n’en est pas une

Il est intéressant de noter que les tentatives pour protéger un classeur déjà
protégé ne génèrent pas de message d’erreur : elles se contentent d’échouer.
Une ancienne version de la procédure Sub DéfinirProtection que nous venons
de voir vérifiait les erreurs et, au lieu s’arrêter quand la procédure s’exécutait
dans un classeur protégé, la routine continuait tranquillement jusqu’à la fin
sans informer l’utilisateur d’un quelconque problème. La seule manière fiable
de vérifier la présence d’une protection consiste à interroger les propriétés
ProtectStructure et ProtectWindows.

Pour supprimer la protection du classeur, servez-vous de la méthode Unprotect.


Elle prend un unique paramètre, le mot de passe requis pour supprimer la pro-
tection.

ActiveWorkbook.Unprotect Password:=password

La procédure suivante permet à l’utilisateur de supprimer la protection d’un


classeur :

Sub SupprProtectionClasseur()
Dim strPassword As String
If (ActiveWorkbook.ProtectStructure = True Or _
ActiveWorkbook.ProtectWindows = True) Then
strPassword = InputBox ("Tapez le mot de passe pour supprimer
la protection de _
ce classeur.")
ActiveWorkbook.Unprotect Password:=strPassword
Else
MsgBox ("Le classeur n'est pas protégé.")
End If
End Sub

La procédure SupprProtectionClasseur vérifie si l’une des propriétés ProtectStruc-


ture ou ProtectWindows est positionnée sur True puisqu’il est possible de proté-
ger l’un des aspects du classeur sans protéger l’autre.

159
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


Chapitre 7

Au Quotidien
Créer des mots de passe valables

Les meilleurs mots de passe sont des chaînes aléatoires de caractères, mais
ce type de chaîne est difficile à retenir. Pour créer des mots de passe difficiles
à deviner, combinez des éléments de deux mots entre lesquels vous insérez
un nombre. Par exemple, votre mot de passe peut ressembler à
prog#2003exce, que l’on peut lire « programmation de la version 2003
d’Excel ». Quoi qu’il en soit, évitez les mots du dictionnaire en français ou dans
toute autre langue. Ils sont en effet faciles à découvrir par le biais de program-
mes spécialisés disponibles sur l’Internet. L’algorithme de cryptage d’Excel
est suffisamment fort pour obliger un attaquant à passer quelques 30 jours en
moyenne pour découvrir la clé qui déverrouille un classeur, mais les données
financières sensibles possèdent une durée de vie significativement plus lon-
gue. Ainsi si vos données sont réellement sensibles et que vous voulez les
protéger contre le vol ou une divulgation accidentelle, servez-vous d’un pro-
gramme de cryptage commercial plus puissant.

Méthodes
Le classeur constitue le document de base dans Excel. Il n’est donc pas surpre-
nant qu’il existe un nombre important de méthodes que vous pouvez invoquer
pour agir dans vos classeurs. Vous pouvez ajouter une classeur à la liste de vos
fichiers et URL favoris, activer le classeur pour l’exploiter sans le nommer dans
chaque commande ou prévisualiser le classeur avant de l’imprimer.

Méthode Activate
Lorsque vous commencez à écrire des macros, vous travaillez presque exclusive-
ment sur un seul classeur. Les macros les plus simples, destinées à des tâches
comme manipuler les valeurs d’une feuille de calcul ou sauvegarder un classeur
en faisant une copie du fichier avec la méthode SaveCopyAs, exploitent toutes des
propriétés et des méthodes du classeur actif. Lorsque l’on commence à travailler
sur plusieurs classeurs à partir d’une même macro, cependant, il faut informer le
moteur VBA que l’on passe à la vitesse supérieure. Pour ce faire, vous faites appel
à la méthode Activate de l’objet Workbook. Prenons pour exemple l’extrait de
code suivant : il fait du classeur T42004Ventes.xls le classeur actif.

160
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


Workbooks("T42003Ventes.xls").Activate

Chapitre 7
Attention Il est important de se rappeler que la propriété ThisWorkbook et la
propriété ActiveWorkbook peut faire référence à des classeurs différents. La
première se réfère toujours au classeur qui contient le module du code exé-
cuté, mais le fichier auquel se réfère la propriété ActiveWorkbook peut être dif-
férent.

Une fois que vous avez changé de classeur actif, chaque méthode que vous appe-
lez avec la propriété ActiveWorkbook l’affecte. Par exemple, si vous travaillez sur
cinq classeurs mais que vous n’en avez modifié que deux, vous pouvez les activer
tour à tour, les enregistrer et revenir au classeur d’origine, comme dans la procé-
dure suivante :

Sub EnregistrerAprèsChangement()
Workbooks("T4RécapVentes.xls").Activate
ActiveWorkbook.Save
Workbooks("2004RécapVentes.xls").Activate
ActiveWorkbook.Save
Workbooks("T42004Ventes.xls").Activate
End Sub

Méthode AddToFavorites
Précédemment dans ce chapitre, nous avons étudié comment ajouter le nom
d’un fichier enregistré à la liste des fichiers récemment utilisés du menu Fichier
avec la propriété AddToMru. Vous pouvez également ajouter le fichier à la liste
Favoris qui s’affiche dans Internet Explorer, le Poste de travail (voir Figure 7.4)
ou la barre d’outils Web d’Excel.

Figure 7-4. La liste Favoris contient les liens vers des fichiers et des liens
hypertexte auxquels vous voulez accéder rapidement.

Astuce Retrouvez facilement vos favoris


Vous pouvez, bien sûr, ajouter le bouton Favoris à n’importe quelle barre
d’outils. Pour ce faire, dans le menu Outils, choisissez Personnaliser et cliquez
sur l’onglet Commandes de la boîte de dialogue Personnalisation. Dans le
volet Catégories, cliquez sur Web et faites glisser Favoris depuis le volet Com-
mandes jusqu’à la barre d’outils de votre choix.

Pour invoquer la méthode AddToFavorites et ajouter un classeur à la liste des


favoris, servez-vous de n’importe quelle méthode liée à un objet qui référence un
objet classeur, comme dans les deux fragments de code suivants :

161
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


ActiveWorkbook.AddToFavorites
ThisWorkbook.AddToFavorites
Chapitre 7

Méthode FollowHyperlink
Pour créer des fichiers d’aide et d’informations dans les applications Excel que
vous créez, enregistrez-les en tant que pages web. Vous pouvez ainsi configurer
une série de liens hypertexte sur lesquels les utilisateurs cliquent pour obtenir de
l’aide sur une feuille ou tout autre objet. Le code suivant présente la syntaxe de
base de la méthode FollowHyperlink et le tableau 7.4 détaille les paramètres les
plus employés.

Address, SubAddress, NewWindow, ExtraInfo,


expression.FollowHyperlink(A
Method, HeaderInfo)

Tableau 7-4. Paramètres de la méthode FollowHyperlink


Paramètre Type Description
Expression Obligatoire Expression qui retourne un objet Workbook.
Address String, Adresse du document cible.
obligatoire
SubAddress Variant, Emplacement au sein du document cible. La
optionnel valeur par défaut est une chaîne vide.
NewWindow Variant, True pour afficher l’application cible dans une
optionnel nouvelle fenêtre. La valeur par défaut est False.

Vous ne définirez que rarement la plupart de ces paramètres. Toutefois, le para-


mètre NewWindow est pratique si vous voulez vous assurer que le document que
vous ouvrez s’afficher dans une fenêtre séparée et qu’il n’écrase pas des informa-
tions existantes. Les paramètres listés dans le code que l’on ne retrouve pas dans
le tableau servent uniquement lorsque l’on doit appeler la page web par le biais
d’instructions HTTP (Hypertext Transfer Protocol) spécifiques. Consultez votre
administrateur réseau pour connaître les paramètres appropriés.
L’exemple suivant affiche la page web qui se trouve à l’adresse http://exem-
ple.microsoft.com dans une nouvelle fenêtre.

ActiveWorkbook.FollowHyperlink Address:="http://
exemple.microsoft.com", NewWindow:=True

Pour plus d’informations sur l’utilisation des liens hypertexte et du web, reportez-vous au
chapitre 25, « Excel et le web ».

Imprimer et prévisualiser les classeurs


Avec l’impression, vous pouvez communiquer vos données sous une forme défi-
nie indépendante de l’ordinateur. Le vénérable matériel dans lequel vous lisez ces
mots (un livre) est une mise en œuvre de ce concept. Pour permettre à vos collè-
gues d’imprimer un exemplaire de classeur, vous utilisez la méthode PrintOut.

162
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


From, To, Copies, Preview, ActivePrinter,
expression.PrintOut(F
PrintToFile, Collate, PrToFileName)

Chapitre 7
Remarque La méthode PrintOut existe également pour les feuilles, les gra-
phiques, les objets et les plages de cellules.

Les paramètres de la méthode PrintOut correspondent aux commandes de la


boîte de dialogue Imprimer (voir figure 7.5). Les seules exceptions sont le bou-
ton Propriétés, qui affiche les commandes de l’imprimante en cours, et le bouton
Rechercher une imprimante, qui se sert du service d’annuaire (s’il est disponi-
ble) pour afficher la liste des imprimantes disponibles sur le réseau, mais aucune
de ces fonctionnalités n’est vitale à l’impression d’un classeur dans une configu-
ration réseau connue.

Figure 7-5. La méthode PrintOut contient toutes les commandes importantes


de la boîte de dialogue Imprimer.

Remarque Prévoyez une routine de gestion d’erreurs pour informer l’utilisa-


teur d’un échec d’impression. Si possible, écrivez également une routine pour
imprimer le classeur sur une autre imprimante et, dans ce cas, informer l’utili-
sateur de l’imprimante utilisée par la procédure pour imprimer le classeur.

Le tableau 7.5 décrit les paramètres de la méthode PrintOut. Les paramètres et


descriptions sont simples à une exception près. Lorsque vous positionnez le
paramètre Preview sur True, Excel affiche le classeur en mode Aperçu avant
impression dans lequel l’utilisateur doit cliquer sur le bouton Imprimer pour
commencer l’impression.

163
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 7-5. Paramètres de la méthode PrintOut


Chapitre 7

Paramètre Type Description


Expression Obligatoire Expression qui fait référence à un classeur,
une feuille de calcul, un graphique, un objet ou
une plage de cellules.
From Variant Numéro de la page à laquelle débute
optionnel l’impression. Si on omet cet argument,
l’impression commence au début du
document.
To Variant Numéro de la dernière page à imprimer. Si on
optionnel omet cet argument, l’impression se termine à
la dernière page.
Copies Variant Nombre de copies à imprimer. Si cet argument
optionnel est omis, une copie est imprimée.
Preview Variant True pour qu’Excel invoque l’aperçu avant
optionnel impression avant d’imprimer l’objet. False (ou
omis) pour imprimer l’objet immédiatement.
ActivePrinter Variant Définit le nom de l’imprimante active.
optionnel
PrintToFile Variant True pour imprimer dans un fichier. Si on ne
optionnel spécifie pas PrToFileName, Excel invite
l’utilisateur à saisir le nom du fichier de sortie.
Collate Variant True pour assembler plusieurs copies.
optionnel
PrToFileName Variant Si PrintToFile est positionné sur True, cet
optionnel argument spécifie le nom du fichier dans
lequel imprimer.

Pour amener directement l’utilisateur en mode Aperçu avant impression, servez-


vous de la méthode PrintPreview. Cette méthode, qui s’applique également aux
feuilles, graphiques, objets et plages de cellules, prend un unique paramètre :
EnableChanges. Lorsque ce paramètre est positionné sur True (par défaut), l’uti-
lisateur peut modifier la mise en page du classeur et les paramètres de marge
avant l’impression. Lorsqu’il est positionné sur False, les boutons Page et Marges
sont désactivés, mais l’utilisateur peut toujours choisir d’imprimer (en cliquant
sur le bouton Imprimer) ou non (en cliquant sur le bouton Fermer).

Les collections Sheets et Worksheets


La plupart des utilisateurs qui entendent « feuille » dans un classeur, pensent à
une feuille de calcul, avec des lignes, des colonnes, des cellules et des formules. Il
existe cependant plusieurs types de feuilles dans un classeur. Il y a évidemment la
feuille de calcul, mais également la feuille de graphique. Voilà qui est quelque peu

164
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


confus. En effet, une feuille de calcul peut héberger un graphique, mais si vous
utilisez l’Assistant Graphique, vous avez la possibilité de placer le graphique sur

Chapitre 7
une feuille de graphique séparée. Les deux autres types de feuilles gèrent les
macros Excel 4 : une pour les macros américaines et une autre pour les macros
internationales.

Propriétés
Les collections Sheets et Worksheets ont en commune un grand nombre de pro-
priétés, mais vous devez prêter attention à quelques points importants lorsque
vous exploitez les feuilles d’un classeur, et plus particulièrement à la propriété
Count, qui sera la première que nous traiterons dans cette section.

Propriété Count
La propriété Count de la collection Worksheets parcourt le classeur nommé et
compte le nombre de feuilles de calcul qu’il contient, alors que la propriété
Count de la collection Sheets reflète le nombre combiné de feuilles de graphique
et de feuilles de calcul du classeur. Vous pouvez utiliser la propriété Count des
collections Sheets et Worksheets pour examiner la structure du classeur avec de la
passer à une autre procédure pour continuer le traitement.

Sub VérifClasseur()
Do While Worksheets.Count < 12
ThisWorkbook.Sheets.Add
Loop
End Sub

Le reste de cette procédure se trouve après la section relative à la méthode Add de


l’objet Workbook.

Propriété Name
Le nom fait partie de la face publique de la feuille. Il l’identifie dans la barre
d’onglets et permet de l’identifier dans le code VBA. Pour modifier le nom d’une
feuille de calcul, vous définissez sa propriété Name. Par exemple, pour copier les
ventes hebdomadaires totales dans une feuille de calcul à la fin d’un classeur,
vous remplacez le nom de cette feuille de calcul par Récapitulatif avec la procé-
dure suivante :

Sub ChangerNom()
Dim strWkshtName As String
strWkshtName = "Récapitulatif"
Sheets(Sheets.Count).Name = strWkshtName
End Sub

165
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Propriété Visible
Chapitre 7

La propriété Visible constitue l’autre propriété fréquemment employée dans les


collections Worksheets et Sheets. Elle indique si une feuille particulière est affi-
chée dans la barre d’onglets d’un classeur. Elle peut prendre trois valeurs : les
constantes Excel xlSheetVisible, xlSheetHidden et xlSheetVeryHidden. Si la pro-
priété Visible est positionnée sur xlSheetVisible la feuille apparaît dans la barre
d’onglets et peut être directement modifiée par l’utilisateur. Si elle est position-
née sur xlSheetHidden, la feuille n’est pas représentée dans la barre d’onglets,
mais l’utilisateur peut l’afficher en cliquant sur Format, Feuille, Afficher avant de
cliquer sur le nom de la feuille dans la boîte de dialogue Afficher.

Si la propriété Visible prend la valeur xlSheetVeryHidden, la feuille masquée


n’apparaît pas dans boîte de dialogue Afficher et ne peut être rendue accessible
que par le biais du code VBA en modifiant la valeur de la propriété Visible.

Méthodes
La collection Sheets héberge un grande variété de méthodes qui permettent
d’ajouter, de supprimer, de déplacer, de copier et de définir les options de mise
en page (marges, en-têtes, pieds de page, etc.).

Méthode Add
Lorsque vous incorporez des données à partir d’un fichier externe, il est préféra-
ble de stocker les données importées dans une nouvelle feuille de calcul. Pour
créer une nouvelle feuille de calcul dans un classeur existant, on utilise la
méthode Add, dont la syntaxe est la suivante :

Before, After, Count, Type)


Sheets.Add(B

Les paramètres Before et After sont mutuellement exclusifs : celui que vous
employez dépend de l’emplacement de la nouvelle feuille dans le classeur. Les
paramètres Before et After peuvent prendre une valeur d’index qui reflète la posi-
tion de la feuille dans le classeur, un nom de feuille ou la feuille active (en utili-
sant la propriété ActiveSheet comme valeur du paramètre).
Par exemple, pour placer la feuille de calcul ajoutée en première page du classeur,
on utilise le paramètre Before et l’une des instructions suivantes :

ThisWorkbook.Sheets.Add Before:=Worksheets(1)
ThisWorkbook.Sheets.Add Before:=Feuil1

166
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


ThisWorkbook.Sheets.Add Before:=ActiveSheet

Chapitre 7
La dernière instruction présume que la feuille active est la Feuil1.

Remarque Contrairement aux tables classiques, qui comment par une valeur
d’index de 0 par défaut, les collections Sheets et Worksheets commencent par
une valeur d’index de 1.

Pour ajouter plusieurs feuilles de calcul à un classeur, le système d’aide de Visual


Basic Editor indique que l’on peut positionner le paramètre Count sur le nombre
de pages à ajouter. Par exemple, pour ajouter trois feuilles après la feuille intitu-
lée Mars, on utilise la commande suivante :

ThisWorkbook.Sheets.Add After:=Mars, Count:=3

Type est le dernier paramètre que vous pouvez employer avec la méthode Add. Il
détermine le type de la feuille ajoutée au classeur avec l’une des quatre constantes
suivantes :
● xlWorksheet, qui ajoute une feuille de calcul (par défaut) ;
● xlChart, qui ajoute une feuille de graphique ;
● xlExcel4MacroSheet, qui ajoute une feuille de macro Excel 4 ;
● xlExcel4IntMacroSheet, qui ajoute une feuille de macro Excel 4 internatio-
nale.
Les constantes xlExcel4MacroSheet et xlExcel4IntMacroSheet assurent la rétro-
compatibilité d’Excel 2003 avec Excel 4.
Vous aurez remarqué qu’il n’existe pas de méthode directe pour ajouter une
feuille à la fin d’un classeur. Vous pouvez néanmoins vous servir de la propriété
Count de la collection Sheets ou (si votre classeur ne comporte pas d’autre type
de feuille) la collection Worksheets pour déterminer le nombre de feuilles dans le
classeur et ajouter la feuille après. Le code suivant représente l’une de méthode
pour y parvenir :

ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)

Astuce Commencer avec le nombre de feuilles correct


Si vous connaissez le nombre total de feuilles dont vous aurez besoin dans un
classeur donné, créez le classeur avec le nombre approprié au lieu d’ajouter
des feuilles ultérieurement. Vous éviterez ainsi tout problème d’accès au
classeur : un utilisateur qui aurait ouvert le classeur ou un problème réseau au
moment où vous modifier un classeur qui se trouve sur un autre ordinateur.

Méthode Delete
La méthode Delete est complémentaire de la méthode Add : au lieu d’ajouter des
feuilles, elle en supprime. Avec la méthode Delete de la collection Sheets, vous

167
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


pouvez supprimer n’importe quelle feuille du classeur. En revanche, avec la
méthode Delete de la collection Worksheets, vous ne pourrez pas supprimer acci-
Chapitre 7

dentellement une feuille de graphique (ce qui est également vrai si vous essayez
de supprimer une feuille de calcul avec la méthode Delete de la collection
Charts).
La syntaxe pour supprimer une feuille suit le schéma classique : nommer la col-
lection dont vous voulez supprimer une feuille, nommer la feuille soit par son
nom ou soit par sa position dans la collection, et invoquer la méthode Delete. Par
exemple, n’importe laquelle des lignes de code suivantes supprime la feuille de
calcul intitulé Récapitulatif, en admettant qu’il s’agit de la quatrième feuille d’un
classeur :

Worksheets("Récapitulatif").Delete
Sheets("Récapitulatif").Delete
Worksheets(4).Delete
Sheets(4).Delete

Vous pouvez également supprimer la feuille active avec la propriété ActiveSheet


dans l’instruction suivante :

ActiveSheet.Delete

Il est important de noter, toutefois, que la dernière des quatre lignes de code de
l’exemple précédent ne supprime pas la feuille correcte si l’une des quatre pre-
mières feuilles est une feuille de graphique. Prenons pour exemple un classeur
créé pour la société Mon Jardin et qui contient cinq feuilles, la quatrième étant
une feuille de graphique. Dans ce classeur, le quatrième membre de la collection
Worksheets est la feuille Récapitulatif, mais le quatrième membre de la collection
Sheets est la feuille T1Ventes.

Astuce Supprimez le nom, pas la position


Dans la mesure du possible, référez-vous toujours aux feuilles par leur nom,
pour être sûr de supprimer la page appropriée. L’exception à cette règle est le
cas dans lequel vous voulez supprimer toutes les feuilles sauf une et que vous
en connaissez la position ou le nom (par exemple, vous l’avez placé en pre-
mière ou en dernière position dans le classeur ou lui avez donné un nom spé-
cifique codé en dur dans la procédure). Dans ce cas, vous pouvez vous servir
d’une boucle For Each...Next pour supprimer toutes les feuilles excepté la pre-
mière ou la dernière ou ignorer la feuille portant un nom spécifique. Testez le
code sur des classeurs factices avant de l’exploiter sur des données réelles.

Lorsque vous invoquez la méthode Delete, Excel affiche une alerte pour vous
demander si vous êtes sûr de vouloir supprimer la feuille. Ce n’est évidemment
pas le comportement attendu dans une procédure automatisée. Pour désactiver
les alertes, faites appel à la propriété DisplayAlerts de l’objet Application. Il est
cependant préférable de les réactiver de sorte que, si un problème inattendu se
produit, la procédure ne se poursuive pas sans que vous ou un collègue n’ayez pu

168
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


vérifier qu’aucun problème ne s’en suivra.

Chapitre 7
Sub SupprimerFeuille()
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
End Sub

Méthodes Move et Copy


Le code VBA permet de changer la position des feuilles d’un classeur ou de
déplacer ou de copier une feuille vers un nouveau classeur. On peut prendre
pour exemple un classeur employé dans un rapport annuel ou un autre type de
présentation. Ce type de rapport suit souvent des directives de mise en forme
strictes. Il peut également être intéressant de déplacer ou de copier une feuille
d’un classeur à un classeur récapitulatif. Par exemple, si un directeur de projet
récapitule des dépenses en main d’œuvre et en équipement sur une feuille dont
il connaît le nom, vous pouvez la copier dans un classeur cible et utiliser la copie,
et non l’originale, pour y effectuer tout traitement nécessaire.
Le choix de déplacer ou de copier la feuille dépend du fait que vous souhaitiez ou
non conserver la feuille d’origine. La copie est une opération non destructive en
ce que la feuille copiée n’est pas supprimée. En revanche, si vous la déplacez, elle
sera supprimée de son emplacement d’origine.
Les méthodes Move et Copy permettent de définir une position cible pour la
feuille déplacée ou copiée avec les paramètres Before et After (si pour une quel-
conque raison vous tentez d’utiliser les deux, vous obtiendrez une erreur
« Attendu : fin d’instruction »). Par exemple, la procédure suivante compte le
nombre de pages dans le classeur existant et déplace la page Récapitulatif à la fin
du classeur :

Sub ALaFin()
Sheets("Récapitulatif").Move After:=Sheets(Sheets.Count)
End Sub

Pour déplacer ou copier plusieurs feuilles au sein d’un classeur, spécifiez une
table dans la collection Sheets. La procédure suivante, par exemple, place les
feuilles Récapitulatif et TableauCroisé au début du classeur.

Sheets(Array("Récapitulatif", "TableauCroisé")).Move Before:=Sheets(1)

Si vous déplacez ou copiez une feuille sans préciser le paramètre Before ou After,
Excel crée un nouveau classeur dans lequel la feuille copiée est la seule du clas-
seur, quel que soit le nombre de feuilles de calcul par défaut des nouveaux clas-
seurs.

169
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Objet PageSetup
Chapitre 7

Que vous exploitiez Excel par le biais de l’interface utilisateur ou du code VBA,
n’oubliez pas que les données des classeurs constituent l’élément fondamental.
Une fois que vous êtes sûr que les données sont correctement saisies et résumées,
vous pouvez vous concentrer sur leur apparence. Nous étudierons la mise en
forme des données de manière plus détaillée au chapitre 10, « Mise en forme
d’objets Excel », mais il est logique de voir comment modifier la disposition des
feuilles de calcul avec la propriété PageSetup de l’objet Worksheet.
Cette propriété retourne un objet PageSetup, qui contient une série de propriétés
reflétant la position, l’orientation, les marges et le niveau de détail de l’affichage
d’une feuille de calcul. Le tableau 7.6 liste les propriétés les plus importantes de
l’objet PageSetup, mais vous en trouverez une liste complète dans l’aide de Visual
Basic Editor.
Tableau 7-6. Propriétés sélectionnées de l’objet PageSetup
Propriété Description
BlackAndWhite Positionnée sur True, cette propriété imprime une feuille en noir et
blanc.
BottomMargin Détermine la distance, en points, entre la partie supérieure du pied de
page et la partie inférieure de la feuille de calcul.
CenterHorizontally Positionnée sur True, cette propriété centre la feuille de calcul
horizontalement sur la page imprimée.
CenterVertically Positionnée sur True, cette propriété centre la feuille de calcul
verticalement sur la page imprimée.
FirstPageNumber Définit le numéro de page assigné à la première page imprimée.
FitToPagesTall Définit le nombre de hauteurs de page en fonction duquel la feuille de
calcul doit être mise à l’échelle lors de son impression. Pratique pour
rétrécir une feuille de calcul trop grande à un nombre spécifique de
pages.
FitToPagesWide Définit le nombre de largeurs de page en fonction duquel la feuille de
calcul doit être mise à l’échelle lors de son impression. Pratique pour
rétrécir une feuille de calcul trop grande à un nombre spécifique de
pages.
FooterMargin Détermine la distance, en points, entre la partie supérieure du pied de
page et la partie inférieure de la page imprimée.
HeaderMargin Détermine la distance, en points, entre la partie inférieure de l’en-tête
de page et la partie supérieure de la page imprimée.
LeftMargin Détermine la quantité d’espace blanc restant entre le bord de la page
et l’élément le plus à gauche de la feuille de calcul.
Orientation Détermine l’orientation du mode d’impression : paysage (xlLandscape)
ou portrait (xlPortrait).

170
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Tableau 7-6. Propriétés sélectionnées de l’objet PageSetup (Suite)

Chapitre 7
Propriété Description
RightMargin Détermine la quantité d’espace blanc restant entre le bord de la page
et l’élément le plus à droite de la feuille de calcul.
TopMargin Détermine la quantité d’espace blanc restant entre la partie inférieure
de l’en-tête et l’élément le plus haut de la feuille de calcul.
Zoom Détermine le facteur de zoom pour l’affichage de la feuille de calcul
(entre 10 et 400 pour cent).

Notez que les valeurs des paramètres de marge s’expriment en points (un point
est égal à 1/72e de pouce, soit environ 1/28e de centimètre). Si vous ne voulez pas
garder ces nombres en mémoire et passer votre temps à effectuer des conver-
sions, servez-vous de la méthode Application.InchesToPoints qui fait la conver-
sion à votre place. Il suffit d’indiquer le nombre de pouces dans les parenthèses
de la méthode et d’assigner cette valeur à la propriété appropriée. Par exemple,
vous pouvez positionner la marge du haut à trois quart de pouce avec le code
suivant :

ActiveSheet.PageSetup.TopMargin = Application.InchesToPoints(0,75)

L’emplacement des sauts de page constitue un autre aspect important relatif à


l’impression de la feuille de calcul. Le saut de page représente la dernière ligne ou
colonne imprimée sur une page. Dans la majorité des cas, vous pouvez laisser
Excel le définir automatiquement et déplacer une ligne ou une colonne manuel-
lement sur la page suivante lorsqu’elle empiète sur la marge. Si vous préférez spé-
cifier l’emplacement des sauts de page, vous pouvez indiquer la colonne à droite
ou la ligne qui se trouve au-dessous du saut de page.

Remarque Nous détaillerons le référencement des lignes et des colonnes au


chapitre 8, « Plages et cellules ».

Voici la syntaxe qui définit un saut de page manuel au-dessus de la ligne 30 de la


Feuil2 :

Worksheets("Feuil2").Rows(30).PageBreak = xlPageBreakManual

Pour définir un saut de page manuel à gauche de la colonne D de la Feuil1, utili-


sez le code suivant :

Worksheets("Feuil1").Columns("D").PageBreak = xlPageBreakManual

Pour supprimer un saut de page, on positionne la propriété PageBreak sur l’une


des constantes Excel xlPageBreakNone ou xlNone, comme dans les exemples
suivants :

Worksheets("Feuil2").Rows(30).PageBreak = xlPageBreakNone

171
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


Worksheets("Feuil1").Columns("D").PageBreak = xlNone
Chapitre 7

Pour supprimer tous les sauts de page d’une feuille de calcul, servez-vous de la
méthode ResetAllPageBreaks :

Worksheets("Feuil1").ResetAllPageBreaks

Astuce Imprimez selon votre spécification


Rappelez-vous que vous obligez une feuille de calcul à s’imprimer sur un nom-
bre défini de pages en définissant les propriétés FitToPagesTall et FitToPa-
gesWide de l’objet PageSetup de la feuille de calcul.

Méthodes des feuilles de calcul


Les feuilles de calcul constituent l’élément vital d’un classeur et VBA propose un
grand nombre de méthodes permettant de retirer le maximum de vos feuilles de
calcul. Certaines de ces méthodes sont similaires à celles disponibles pour les
classeurs, mais avec des différences subtiles. Dans cette section, vous allez décou-
vrir les méthodes suivantes :
● Calculate qui recalcule les résultats de toutes les formules d’une feuille de
calcul ;
● Protect qui permet de demander un mot de passe aux utilisateurs pour
modifier les éléments spécifiés d’une feuille de calcul ;
● SaveAs qui enregistre une feuille de calcul en tant que nouveau classeur ;
● Select qui permet de travailler simultanément avec plusieurs feuilles de cal-
cul.

Méthode Calculate
La méthode Calculate de l’objet Worksheet sert à recalculer toutes les formules
d’une feuille de calcul. Elle est particulièrement pratique si ces formules
extraient des données qui peuvent avoir changer depuis la dernière ouverture du
classeur les héberge. La syntaxe de la méthode Calculate est simple : il suffit de
nommer la feuille de calcul à calculer et d’ajouter la méthode Calculate, comme
dans les exemples suivants :

Worksheets(1).Calculate
Worksheets("Récapitulatif").Calculate

Pour actualiser le résultat de chaque formule de chaque classeur ouvert, vous


pouvez ajouter la méthode Calculate seule (raccourci pour Application.Calcu-
late) au code VBA.
Normalement, Excel recalcule les formules chaque fois que vous effectuez une
modification, mais vous pouvez choisir quand Excel recalcule vos formules. Ce
choix constitue une science inexacte : si les valeurs affichées doivent toujours
représenter les résultats les plus récents alors que ceux-ci changent en perma-

172
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


nence, il est préférable qu’Excel recalcule les formules à chaque changement. Une
autre approche consiste à placer un bouton de commande dans une feuille de

Chapitre 7
calcul sur lequel les utilisateurs cliquent pour recalculer les formules lorsqu’ils
ont besoin de valeurs actualisées pour prendre une décision. Cette approche pré-
sente toutefois une difficulté avec une feuille de calcul importante qui récupère
les données à partir de plusieurs autres sources. Si votre réseau est actif ou si vous
devez actualiser des centaines de formules, il peut être plus intéressant de créer
un processus qui met les formules à jour pendant la nuit. Dans ce cas, pensez à
actualiser d’abord chaque feuille de calcul source pour éviter toute incohérence.
Pour modifier le moment où Excel recalcule une feuille de calcul, vous position-
nez la propriété Calculate de l’objet Application (et oui, c’est le même nom) sur
l’une des constantes xlCalculate :
● xlCalculationAutomatic, la valeur par défaut, avec laquelle Excel recalcule
les formules à chaque changement.
● xlCalculationManual, avec laquelle l’utilisateur doit appuyer sur MAJ+F9
pour recalculer les formules de la feuille de calcul active.
● xlCalculationSemiautomatic, qui recalcule toutes les formules d’une feuille
de calcul, excepté celles qui se trouvent dans un tableau.
Pour calculer les formules juste avant d’enregistrer le classeur, optez pour un
recalcul manuel puis positionnez la propriété CalculateBeforeSave de l’objet
Application sur True, comme dans le code suivant :

Application.Calculation = xlCalculationManual
Application.CalculateBeforeSave = True

Méthode Protect
La première ligne de défense contre les changements dans une feuille de calcul
commence par un mot de passe que les utilisateurs doivent fournir avant d’être
habilités à ouvrir le classeur. La méthode Protect de l’objet Workbook est quelque
peu limitée, mais elle protège votre classeur contre les accès non autorisés, les
changements dans la structure du classeur ou les modifications de taille et de
placement des fenêtres du classeur. Au niveau de la feuille de calcul, vous dispo-
sez de quelques mesures supplémentaires et les méthodes Protect des objets Sheet
et Worksheet proposent davantage d’options.

Password, DrawingObjects, Contents, Scenarios,


expression.Protect(P
UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns,
AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows,
AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows,
AllowSorting, AllowFiltering, AllowUsingPivotTables)

173
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


Le tableau 7.7 présente les valeurs par défaut de chacun de ces paramètres et
décrit ce qui est ou n’est pas autorisé lorsque ces options sont positionnées sur
Chapitre 7

True ou False.
Tableau 7-7. Paramètres de la méthode Worksheet.Protect
Valeur par
Paramètre défaut Description
Expression n/a Expression obligatoire qui retourne un objet
Worksheet.
Password n/a Chaîne qui spécifie un mot de passe sensible
à la casse pour la feuille de calcul ou le
classeur. Si on omet cet argument, on ne
peut pas supprimer la protection de la feuille
de calcul ou du classeur sans utiliser de mot
de passe.
DrawingObjects False Positionné sur True, ce paramètre protège les
formes contre le changement.
Contents True Si ce paramètre est positionné sur True, en
protégeant le contenu d’une feuille de calcul
on protège toute cellule verrouillée.
Scenarios True La valeur True empêche l’utilisateur de
modifier les scénarios.
UserInterfaceOnly False La valeur True protège l’interface utilisateur,
mais celui-ci peut éditer des macros. Si on le
laisse vide ou qu’on le positionne sur False,
l’interface utilisateur et les macros sont
protégées.
AllowFormattingCells False La valeur True permet aux utilisateurs de
formater n’importe quelle cellule d’une feuille
de calcul protégée.
AllowFormattingColumns False La valeur True permet aux utilisateurs de
formater n’importe quelle colonne d’une
feuille de calcul protégée.
AllowFormattingRows False La valeur True permet aux utilisateurs de
formater n’importe quelle ligne d’une feuille
de calcul protégée.
AllowInsertingColumns False La valeur True permet aux utilisateurs
d’insérer des colonnes dans une feuille de
calcul protégée.
AllowInsertingRows False La valeur True permet aux utilisateurs
d’insérer des lignes dans une feuille de calcul
protégée.

174
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul

Tableau 7-7. Paramètres de la méthode Worksheet.Protect (Suite)

Chapitre 7
Valeur par
Paramètre défaut Description
AllowInsertingHyperlinks False La valeur True permet aux utilisateurs
d’ajouter des liens hypertexte dans une
feuille de calcul protégée.
AllowDeletingColumns False La valeur True permet aux utilisateurs de
supprimer des colonnes sur la feuille de
calcul protégée, à condition que chaque
cellule de la colonne à supprimer soit
déverrouillée.
AllowDeletingRows False La valeur True permet aux utilisateurs de
supprimer des lignes sur la feuille de calcul
protégée, à condition que chaque cellule de
la ligne à supprimer soit déverrouillée.
AllowSorting False La valeur True permet aux utilisateurs de trier
les données d’une feuille de calcul protégée,
à condition que chaque cellule de la plage
triée soit déverrouillée ou non protégée.
AllowFiltering False La valeur True permet aux utilisateurs de
définir des filtres sur une feuille de calcul
protégée et de modifier les critères de
filtrage, mais ils ne peuvent pas activer ou
désactiver le filtre automatique.
AllowUsingPivotTables False La valeur True permet aux utilisateurs
d’exploiter des tableaux croisés dynamiques
dans une feuille de calcul protégée.

Pour étendre la protection de la feuille de calcul, vous pouvez également limiter


les cellules que l’utilisateur peut sélectionner en assignant une valeur à la pro-
priété EnableSelection. Une fois la feuille de calcul protégée, vous pouvez posi-
tionner la propriété EnableSelection sur l’une des constantes Excel suivantes :
● xlNoSelection empêche l’utilisateur de sélectionner une cellule de la
feuille ;
● xlUnlockedCells permet à l’utilisateur de sélectionner uniquement les cel-
lules dont la propriété Locked prend la valeur False ;
● xlNoRestrictions, la valeur par défaut, permet à l’utilisateur de sélectionner
n’importe quelle valeur.
L’extrait de code suivant empêche les utilisateurs de sélectionner une cellule dans
la feuille de calcul protégée intitulée Janvier :

Worksheets("Janvier").EnableSelection = xlNoSelection

175
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Important La propriété EnableSelection prend uniquement effet si la feuille


de calcul est protégée.
Chapitre 7

À l’instar des classeurs, vous pouvez autoriser un utilisateur à supprimer la pro-


tection d’une feuille de calcul en lui demandant un mot de passe. La ligne de
code employée dans ce cas est la suivante :

ActiveWorksheet. Unprotect

Excel affiche une boîte de saisie pour accepter le mot de passe : inutile d’écrire
une quelconque ligne de code supplémentaire pour gérer l’entrée.

Méthode SaveAs
À l’instar des classeurs, vous pouvez enregistrer une feuille de calcul individuelle
en tant que fichier séparé avec la méthode SaveAs de la méthode Worksheet.

FileName, FileFormat, Password, WriteResPassword,


expression.SaveAs(F
ReadOnlyRecommended, CreateBackup, AddToMru, TextCodepage,
TextVisualLayout, Local)

La méthode SaveAs de l’objet Worksheet est très similaire à celle de l’objet


Workbook ; en conséquence, vous pouvez vous reportez au tableau 7.3 pour con-
naître les détails de la plupart des paramètres.

Méthode Select
Au premier coup d’œil, la méthode Select semble identique à la méthode Acti-
vate. La différence entre les deux méthodes repose sur le fait que la méthode Acti-
vate fonctionne sur une feuille de calcul à la fois, alors que la méthode Select
permet d’intervenir simultanément sur plusieurs feuilles de calcul. Prenons un
exemple dans l’interface utilisateur : vous pouvez déplacer simultanément deux
feuilles de calcul en cliquant sur l’onglet de la première, en cliquant sur l’onglet
de la deuxième tout en maintenant la touche MAJ enfoncée et en faisant glisser
les deux feuilles vers leur nouvelle position dans le classeur.

Remarque Dans le cas que nous venons de mentionner, la première feuille


de calcul sur laquelle vous cliquez est considérée comme la feuille active.

L’extrait de code suivant sélectionne la feuille de calcul intitulée Feuil1 :

Worksheets("Feuil1").Select

Pour sélectionner simultanément plusieurs feuilles de calcul, utilisez une table


comme argument de la méthode Select, comme dans l’exemple suivant :

Worksheets (Array ("Feuil1", "Feuil2")).Select

176
Partie 3 : Le modèle d’objet Excel

Classeurs et feuilles de calcul


Dans ce chapitre, vous avez fait la connaissance des propriétés et méthodes les
plus importantes dans le cadre de la manipulation des feuilles de calcul et des

Chapitre 7
classeurs Excel. Vous êtes entièrement libre de choisir le comportement que vous
souhaitez obtenir de vos classeurs et feuilles de calcul en matière d’enregistre-
ment par programmation, de recalcul des formules ou de protection par un mot
de passe que les utilisateurs doivent fournir avant d’être habiliter à y accéder.
Dans le chapitre 8, vous allez apprendre à réaliser des tâches similaires au niveau
des plages et des cellules.

177
Partie 3 : Le modèle d’objet Excel

Chapitre 8
Plages et cellules
Manipulations de base. . . . . . . . 179 Plages nommées . . . . . . . . . . . 194
Référencement des plages . . . . 183 Validation des données . . . . . . . 204
Manipulation de groupes
de cellules . . . . . . . . . . . . . . . . . 190

Avant d’exploiter les informations contenues dans un classeur, vous devez y


accéder. Nous avons déjà vu comment accéder à des divers éléments du modèle
d’objet Excel : l’application Excel elle-même, les classeurs et les feuilles de calcul.
Dans ce chapitre, nous allons nous concentrer sur les cellules et les plages de cel-
lules.

Manipulations de base
Si la cellule constitue l’unité de travail de base d’une feuille de calcul Excel, au
sein du modèle d’objet Excel, l’unité de travail de base est l’objet Range. Il permet
de manipuler des groupes de cellules et des cellules individuelles.

Localiser la plage active


L’objet PlageActive n’existe pas, mais il existe d’autres moyens pour exploiter la
plage sélectionnée. La méthode classique consiste à employer l’objet Selection. Ce
dernier retourne tout objet sélectionné : plage de cellules, cellule, graphique, etc.
Il contrôle les actions au sein d’une cellule de la même manière que si vous les
effectuiez étape par étape avec le clavier ou la souris. Vous pouvez, par exemple,
utiliser le code suivant pour afficher les valeurs des cellules sélectionnées en
caractères gras :

Selection.Font.Bold = True

Remarque Rappelez-vous qu’« actif » n’est pas un synonyme de


« sélectionné ». Vous pouvez sélectionner toutes les cellules de la feuille de
calcul en appuyant sur CTRL+A, mais une seule cellule est active (généralement
A1, si on utilise CTRL+A).

179
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Sélectionner une plage


La méthode Select d’un objet Range propose diverses manières de sélectionner
une plage de cellules. La plupart de ces procédures sont similaires à une sélection
par le biais du clavier, ce qui en simplifie l’émulation.
L’exemple suivant utilise la propriété CurrentRegion de l’objet ActiveCell pour
sélectionner la plage de cellules utilisées dans la feuille de calcul. La procédure
InsertNewSheet copie la plage dans le presse-papier, la colle dans une nouvelle
feuille de calcul, lui applique la mise en forme appropriée et, pour finir, efface le
contenu, laissant des cellules vides pour une nouvelle année d’informations dans
Chapitre 8

le classeur SalesByCategory.xls.

Sub InsertNewSheet()

Range("C1").Activate
ActiveCell.CurrentRegion.Select
Selection.Copy
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "Nouvelle année"
Sheets("Nouvelle année").Select
Range("C1").Activate
ActiveSheet.Paste
Columns("C:H").EntireColumn.AutoFit
Range("D2:G13").Select
Selection.ClearContents

End Sub

Outre la propriété CurrentRegion de l’objet ActiveCell, vous pouvez faire appel à


la méthode End pour étendre la plage au-delà de l’objet ActiveCell. Si vous utili-

180
Partie 3 : Le modèle d’objet Excel

Plages et cellules
sez l’une des valeurs du tableau 8.1, Excel étend la plage en exploitant les mêmes
règles que celles de la touche Fin combinée avec l’une des touches de direction
pour se déplacer à la fin d’une ligne ou d’une colonne.
L’exemple suivant parcourt toutes les entrées d’heures d’un mois dans le classeur
Y2001ByMonth.xls pour trouver celle qui contient la valeur la plus élevée. Une
fois l’entrée trouvée, Excel étend la plage vers le haut et le bas pour inclure toutes
les entrées de cette plage horaire et remplace la couleur de remplissage des cellu-
les par du bleu.

Chapitre 8
Sub HighLightTimeFrame()
Dim MyCell As Range, strAddress As String
Dim sngMaximum As Single

sngMaximum = 0
For Each MyCell In Range("D6:O36").Cells
If MyCell > sngMaximum Then
sngMaximum = MyCell
strAddress = MyCell.Address
End If
Next MyCell

Range(strAddress).Activate
Range(ActiveCell.End(xlUp), ActiveCell.End(xlDown)).Select
Selection.Cells.Interior.ColorIndex = 41
End Sub

Le tableau 8.1 liste les méthodes de l’objet Range et décrit comment elles affec-
tent les cellules sélectionnées.

181
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 8-1. Méthodes de sélection de plages


Méthode Action
.End(xlDown) Étend la plage vers le bas.
.End(xlUp) Étend la plage vers le haut.
.End(xlToRight) Étend la plage vers la droite.
.End(xlToLeft) Étend la plage vers la gauche.
.SpecialCells(xlCellTypeAllFormatConditions) Étend la plage pour inclure les
cellules dont on a modifié la
Chapitre 8

mise en forme. Excel


commence la recherche à la
cellule A1 et non à partir de la
cellule active.
.SpecialCells(xlCellTypeAllValidation) Étend la plage jusqu’à la
première cellule contenant des
règles de validation.
.SpecialCells(xlCellTypeBlanks) Étend la plage jusqu’à la
première cellule vide.
.SpecialCells(xlCellTypeComments) Étend la plage jusqu’à la
première cellule contenant un
commentaire.
.SpecialCells(xlCellTypeConstants) Étend la plage jusqu’à la
première cellule contenant une
constante.
.SpecialCells(xlCellTypeFormulas) Étend la plage jusqu’à la
première cellule contenant une
formule.
.SpecialCells(xlCellTypeLastCell) Étend la plage vers la gauche
et vers le bas jusqu’à la
dernière cellule utilisée.
.SpecialCells(xlCellTypeSameFormatConditions) Étend la plage jusqu’à la
première cellule contenant les
mêmes conditions de mise en
forme.
.SpecialCells(xlCellTypeSameValidtion) Étend la plage jusqu’à la
première cellule contenant les
mêmes règles de validation.
.SpecialCells(xlCellTypeVisible) Étend la plage à toutes les
cellules visibles.
.EntireColumn Étend la plage à l’ensemble de
la colonne.
.EntireRow Étend la plage à l’ensemble de
la ligne.

182
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Au Quotidien
Comment Excel étend-il la plage ?

Pour localiser une cellule qui correspond à l’un des types spéciaux du
tableau 8.1, Excel commence la recherche à la cellule active. À partir de ce
point, il effectue une recherche minutieuse vers la droite et vers le bas et il
sélectionne autant de cellules que nécessaire pour atteindre la cellule la plus
éloignée qui réponde aux critères. S’il ne trouve pas de cellule répondant aux
critères, Excel modifie le sens de la recherche, passe à une recherche plus

Chapitre 8
« paresseuse » et retourne la première cellule qui correspond.

Excel continue la recherche vers la droite et vers le haut. S’il ne trouve aucune
correspondance, il continue la recherche vers la gauche. Puis à nouveau vers
le bas et ensuite vers le haut.

Pour connaître les cellules qu’Excel sélectionne, rappelez-vous les règles


suivantes :

● Droite en premier, gauche en deuxième ;


● Vers le bas en premier, vers le haut en deuxième ;
● À droite et vers le bas, la recherche est minutieuse. Toutes les autres
sont paresseuses.

Recherche 4 Recherche 2

Recherche 1
Recherche 3

Référencement des plages


La polyvalence des plages se manifeste dans le nombre de méthodes qui permet-
tent de s’y référer : directement par l’adresse de la cellule, sous forme d’un déca-

183
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


lage par rapport à une autre cellule, par nom ou par la sélection en cours. La
propriété Range permet de référencer une cellule de plusieurs manières. Voici la
syntaxe de la méthode Range :

expression.Range(Cell1, Cell2)

expression Élément obligatoire qui retourne un objet Application, Range ou


Worksheet. Si on omet expression, ActiveSheet est implicite.
Cell1 Variable Variant obligatoire qui référence avec la notation A1 une cellule
ou une plage de cellules. Si vous utilisez le paramètre Cell1 pour faire référence à
Chapitre 8

une plage de cellules, la variable Variant peut contenir l’opérateur de plage (un
double point), l’opérateur d’intersection (un espace) ou l’opérateur d’union
(une virgule). Vous pouvez insérer des signes dollar ($), mais ils sont ignorés. Il
est également possible de fournir un nom définit localement.
Cell2 Variable Variant qui, associée à Cell1, indique la cellule qui se trouve dans
l’angle inférieur droit de la plage.
Comme le démontre la description de la propriété, les manières de spécifier les
cellules de la plage sont légion. Pour employer des références absolues, servez-
vous de l’objet ActiveSheet comme objet de base (expression) ou faites appel à
des références relatives avec l’objet ActiveCell ou tout autre objet de plage comme
objet de base. Pour définir une plage, vous pouvez désigner une cellule unique,
un groupe de cellules contiguës, un groupe de cellules non contiguës, des lignes
ou des colonnes.

Référencer les plages de la feuille de calcul active


Dans VBA, le référencement d’une plage sur la feuille de calcul active est sans
aucun doute le plus exploité. Pour faire référence à une plage sur l’objet Acti-
veSheet, il vous suffit d’utiliser la propriété Range. Par exemple, pour faire réfé-
rence à la cellule D6 sur la feuille de calcul active, utilisez le code suivant :

Range("D6").Select

Au Quotidien
Évitez Select
Bien que la tendance soit de commencer par sélectionner une plage, ce n’est
pas indispensable, sans compter que cette action ralentit les performances de
la procédure (voir la section « Copie de données entre des plages et des
tableaux », plus loin dans ce chapitre, pour plus d’informations). Pour une sim-
ple commande de mise en forme, spécifiez la plage et la mise en forme en une
seule ligne, au lieu de sélectionner d’abord la plage puis d’appliquer la mise
en forme.

184
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Par exemple, pour mettre en évidence la liste complète des entrées de 6:00
dans le classeur Y2001ByMonth.xls et appliquer une couleur bleue à la police,
utilisez la commande suivante :

Range("M6:M36").Font.ColorIndex = 41

Référencer les plages d’une feuille de calcul inactive


Le nombre de feuilles de calcul dans un classeur Excel est limité uniquement par
la quantité de mémoire disponible et les informations peuvent être réparties de

Chapitre 8
nombreuses feuilles de calcul et pas uniquement sur la feuille de calcul active.
Pour faire référence à une plage sur une feuille de calcul inactive, vous devez
indiquer la feuille de calcul qui contient la plage.
Sur une feuille de calcul inactive, on utilise la propriété Range de la même
manière que sur la feuille de calcul active. Si l’objet Worksheet n’est pas spécifié,
la feuille de calcul active est implicite. Revenons à l’exemple précédent qui faisait
référence à la cellule D6. Sur une feuille de calcul inactive, on s’y réfère avec le
code suivant :

Worksheets(2).Range("D6").Select.

Il est possible de référencer une plage sur une feuille de calcul inactive sans spé-
cifier la feuille de calcul, mais uniquement si la plage est nommée (voir la section
« Plages nommées », plus loin dans ce chapitre). Avec l’instruction Range("Fre-
quency").Select, on sélectionne la plage nommée Frequency, qu’elle se trouve
ou non sur la feuille de calcul active.

Référencer les cellules d’une plage


Pour référencer une cellule individuelle au sein d’une plage, on procède comme
pour une cellule dans un classeur. La cellule qui se trouve dans l’angle supérieur
gauche porte l’adresse « A1 ». La cellule qui se trouve trois lignes plus bas et qua-
tre colonnes vers la droite a pour adresse « D3 ». Par exemple, dans le classeur
Y2001ByMonth.xls, on peut assigner la plage D6:O36 à un objet Range. Ensuite,
pour référencer l’entrée 9:00 A.M. du premier jour (la cellule D6 dans la feuille
de calcul), vous pouvez utiliser la cellule A1 de l’objet Range. De même, l’entrée
7:00 P.M. du seizième jour (la cellule N21 dans la feuille de calcul) est la cellule
K16 de l’objet Range.

Référencer des cellules avec la propriété Offset


Si les informations dont vous avez besoin se trouvent à un emplacement donné
par rapport à une cellule connue, vous pouvez utiliser la propriété Offset pour
référencer la cellule, en indiquant le nombre de lignes et de colonnes à partir
d’un emplacement défini. Le principe est similaire à celui utiliser pour orienter
une personne à partir d’un lieu précis. La personne que vous renseignez doit se

185
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


rendre au point de départ et une fois sur place, elle peut suivre les directions
indiquées pour atteindre sa destination finale.
La propriété Offset fonctionne en se déplaçant du nombre de lignes et de colon-
nes spécifiés. Les nombres positifs désignent un déplacement vers le bas et vers la
droite, alors que les nombres négatifs indiquent un déplacement vers le haut et
vers la gauche. Zéro conserve la ligne ou la colonne en cours. La routine
Table_Calcul (voir figure 8.1) utilise la propriété Offset pour définir la formule
des colonnes Valeur actuelle et Intérêts payés.
Chapitre 8

Figure 8-1. Cet exemple de feuille de calcul permet de calculer les composants
d’un prêt hypothécaire.

Sub Table_Calcul()
Dim counter As Integer, Paiements As Integer, Frequence As Integer
Dim Temp As String, intRow As Integer, intColumn As Integer
Dim intOffset As Integer, strR1C1Address As String, strA1Address As
String

ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
Sheets(Sheets.Count).Select
ActiveSheet.Name = Range("Nom")
Paiements = Range("Paiements")
Frequence = 12
'Définit les en-têtes de colonnes
Range("A5") = "Paiement"
Range("B5") = "Capital"
Range("C5") = "Intérêts"
Range("D5") = "Valeur actuelle"
Range("E5") = "Intérêts payés"

186
Partie 3 : Le modèle d’objet Excel

Plages et cellules
'Boucle dans un certain nombre de paiements et de formules
d'intérêt
'Utilise différentes méthodes pour référencer une plage
For counter = 1 To Paiements
intRow = 5 + counter
intColumn = 1
strR1C1Address = "R" & Format(intRow, "#0") & "C" & _
Format(intColumn, "#0")
strA1Address = Application.ConvertFormula(strR1C1Address, _
xlR1C1, xlA1)
Range(strA1Address) = "Paiement :" + Str$(counter)
Range(strA1Address).Range("B1") = "=PPMT(TIA/" & _

Chapitre 8
Str$(Frequence) & "," & Str$(counter) & _
",Paiements,Capital,Valeur_capitalisée)"
Range(strA1Address).Select
Selection.Range("C1") = "=IPMT(TIA/" & Str$(Frequence) _
& "," & Str$(counter) & ",Paiements,Capital," _
& "Valeur_capitalisée)"
Selection.Offset(0, 3) = "=R[-1]C+RC[-2]"
Selection.Offset(0, 4) = "=RC[-2]+r[-1]c"
Next counter

'Réinitialise les formules "Valeur actuelle" et "Intérêts payés"


'pour le premier paiement
Range("D6").Formula = "=Capital+B6"
Range("E6").Formula = "=C6"

'Dimensionne automatiquement les colonnes à la largeur adaptée


Columns("A:E").Select
Columns.EntireColumn.AutoFit

'Définit les titres


Range("A1").Value = ActiveSheet.Name
Range("A1:E1").Select
Selection.Merge
Range("A2").Value = "Tableau d'amortissement"
Range("A2:E2").Merge
With Range("A1")
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With
With Range("A2")
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With

End Sub

Construire un classeur de calcul de prêt


Le fonctionnement de la macro Table_Calcul se base sur plusieurs fonctionna-
lités Excel, comme les pages nommées (que nous étudierons plus loin dans ce
chapitre), les contrôles de formulaire et les boutons de commande. Pour cons-
truire le classeur, procédez de la manière suivante :

187
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

1 Ouvrez un classeur vide en cliquant sur le bouton Nouveau de la barre


d’outils Standard ou en choisissant Nouveau classeur Excel dans le
Volet Office du même nom.
2 Dans la colonne A, tapez les descriptions suivantes, ligne par ligne. Ser-
vez-vous de la figure 8.2 comme référence :
■ Nom de la banque
■ Capital
■ Valeur capitalisée
Chapitre 8

■ Taux d’intérêt annuel


■ Nombre d’années du prêt
■ Montant du paiement
■ Taux effectif
■ Nombre de paiements

Figure 8-2. Le calculateur de prêt demande un certain nombre d’entrées


spécifiques dont voici la description.

3 Dans la colonne B, assignez un nom aux cellules situées en regard des


descriptifs. Faites correspondre le nom de chaque cellule de la
colonne B avec la description de la colonne A : Nom, Capital,
Valeur_capitalisée, TIA, Années, Paiement. Ignorez la cellule du taux
effectif et nommez la dernière cellule Paiements.
4 Sélectionnez la cellule Paiement et tapez la formule suivante :
=VPM(TIA/12;Paiements;Capital;Valeur_capitalisée)

Remarque Lorsque vous saisissez ces valeurs la première fois, une erreur
#DIV/0 s’affiche puisque les cellules employées dans la formule ne con-
tiennent aucune valeur. Une fois les valeurs saisies, l’erreur disparaîtra.

5 Sélectionnez la cellule adjacente à Taux effectif et tapez la formule


suivante : =TAUX.EFFECTIF(TIA;12).

Remarque Lorsque vous saisissez cette formule la première fois, une


erreur #NOMBRE! s’affiche dans la cellule puisque la cellule Années ne con-
tient aucune valeur. Une fois une valeur saisie, l’erreur disparaîtra.

188
Partie 3 : Le modèle d’objet Excel

Plages et cellules

6 Sélectionnez la cellule Paiements et tapez la formule suivante :


=Années*12.
7 Après avoir recopié la macro Table_Calcul, dans la barre d’outils Formu-
laires de l’interface Excel, sélectionnez le bouton Bouton et tracez un
bouton sur la feuille de calcul (voir figure 8.3). La boîte de dialogue
Affecter une macro s’affiche pour vous permettre de sélectionner la
macro Table_Calcul.
8 Sélectionnez le texte du bouton et saisissez : Tracer le tableau d’amor-
tissement.

Chapitre 8
Figure 8-3. Ajout d’un bouton sur le formulaire.

Après avoir saisi des informations dans les champs, cliquez sur le bouton Tra-
cer le tableau d’amortissement pour exécuter la macro Table_Calcul. Pour exé-
cuter à nouveau la macro, modifiez le nom de la banque, qui sert à nommer la
nouvelle feuille de calcul. Si vous tentez de créer une feuille de calcul avec un
nom en double, la macro génère une erreur.

Définir une plage avec la propriété Cells


Pour référencer une plage de cellules, il est également possible de la désigner avec
la méthode Cells. Pour ce faire, vous devez spécifier les numéros de ligne et de
colonne des cellules qui se trouvent dans les angles opposés de la plage. Pour une
cellule individuelle, vous désignez deux fois la même cellule, puisqu’il s’agit bien
de la même cellule dans les deux angles opposés. Par exemple, pour sélectionner
la cellule D6, on utilise le code suivant :

Range(Cells(4,6), Cells(4,6)).Select

189
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Référencer des colonnes et des lignes


Pour référencer une ou plusieurs colonne(s) ou ligne(s), on fait appel aux pro-
priétés Columns ou Rows. Cet extrait de code de la routine Table_Calcul sélec-
tionne les colonnes A à E et les redimensionne pour les adapter au contenu des
cellules.

Columns("A:E").Select
Columns.EntireColumn.AutoFit
Chapitre 8

Référencer des groupes de cellules non contiguës


Les plages de cellules dont vous avez besoin ne sont pas nécessairement conti-
guës. Pour désigner des cellules non contiguës, on sépare les plages avec des vir-
gules. Par exemple, pour sélectionner toutes les données des ventes des lundis du
mois de janvier dans le classeur Y2001ByMonth.xls, on se sert du code suivant :

Range("D6:O6, D13:O13, D20:O20, D27:O27, D34:O34").Select.

Manipulation de groupes de cellules


On se sert de plages de cellules pour appliquer une action collective : les redi-
mensionner, ajouter des bordures ou modifier le format de leur contenu. Il est
même possible de travailler conjointement avec deux groupes de cellules pour
générer une union de deux groupes ou trouver leur intersection.

Dimensionner les cellules par programmation


La taille par défaut de chaque cellule est 10,71 points (80 pixels) de large sur
12,75 points (17 pixels de haut). Ces paramètres sont entièrement adaptés à
l’exploitation classique d’une feuille de calcul non partagée. Si vous devez parta-
ger la feuille de calcul ou que celle-ci contient une grande quantité de données,
vous devrez probablement la redimensionner.
Pour commencer, il n’est pas possible de redimensionner une cellule en particu-
lier. Toute modification de la largeur affecte l’ensemble de la colonne et toute
modification de la hauteur affecte l’ensemble de la ligne. En conséquence, pour
toute modification réalisée avec une macro, servez-vous de la propriété Width de
l’objet Column ou de la propriété Height de l’objet Row. Vous pouvez définir les
propriétés Width et Height explicitement, si la taille à employer est prédétermi-
née. Vous pouvez également demander à Excel de calculer la taille appropriée en
vous servant de la méthode AutoFit.

Lier de deux plages


Il n’est pas toujours souhaitable de créer une plage de cellules non contiguës, par
exemple, si vous devez maintenir la séparation à des fins de suivi. Dans le clas-
seur Y2001ByMonth.xls, les valeurs sont stockées par dates, mais il peut être

190
Partie 3 : Le modèle d’objet Excel

Plages et cellules
nécessaire d’effectuer certaines analyses en fonction du jour de la semaine. Natu-
rellement, chaque jour de la semaine est séparé de ses homologues par d’autres
jours de la semaine. Pour créer les plages des jours de semaine identiques, on
peut faire appel à la méthode Union de l’objet Application.

Pour plus d’informations sur l’objet Application, reportez-vous au chapitre 6, « L’objet


Application ».

La méthode Union prend plusieurs plages et les combine en une seule. Sa syntaxe
est la suivante :

Chapitre 8
expression.Union(A
Arg1 as Range, Arg2 as Range, …)

● expression Objet Application optionnel.

● Arg1, Arg2, … Plages d’objets dont au minimum deux doivent être spéci-
fiées.
La procédure suivante calcule les ventes horaires moyennes de chaque jour de la
semaine.

Sub CalcWeeklyAverages()
Dim intDayOfWeek As Integer, intWeeks As Integer, intHours As Integer
Dim rgeWeek As Range, rgeMonth As Range, rgeDay As Range
Dim sglTotal As Single
Dim strRow As String, intWeek As Integer

'Boucle dans chaque jour de la semaine


For intDayOfWeek = 1 To 7

'Trouve le premier jour du mois


Set rgeDay = Range("D6", Range("D6").End(xlDown))
Set rgeMonth = Nothing
intWeeks = 0

'Boucle dans chaque semaine


For intWeek = intDayOfWeek To _
rgeDay.Cells(rgeDay.Cells.count, -1) Step 7

'Calcule le numéro de ligne


strRow = Format(intWeek + 5, "#0")
Set rgeWeek = Range("D" & strRow & ":O" & strRow)
If intWeek = intDayOfWeek Then 'Ajuste la première semaine
Set rgeMonth = rgeWeek
Else
Set rgeMonth = Union(rgeMonth, rgeWeek)
End If

'Compte le nombre d’occurrences du jour de la semaine


intWeeks = intWeeks + 1
Next intWeek

'Calcule le numéro de ligne


strRow = Format(intDayOfWeek + 41, "00")

191
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


'Définit le titre de la colonne
With Range("C" & strRow)
.Formula = rgeDay(intDayOfWeek, 0)
.Interior.ColorIndex = 36
.Font.Italic = True
End With

'Boucle dans chaque période horaire


For intHours = 1 To 12
sglTotal = 0
For intWeek = 1 To intWeeks
sglTotal = sglTotal + rgeMonth(intWeek, intHours)
Chapitre 8

Next intWeek

'Définit la moyenne et le format


With Range(Chr$(Asc("C") + intHours) & strRow)
.Formula = sglTotal / intWeeks
.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00)"
End With
Next intHours

'Ajoute le total des moyennes du jour de la semaine


With rgeMonth(1, 1).Offset(36, 13)
.Formula = "=Sum(R[0]C[-13]:R[0]C[-2])"
.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00)"
End With
Next intDayOfWeek

End Sub

Détecter les cellules vides


Si on fournit des données erronées à une procédure, le résultat généré sera
erroné. Pour éviter ce type de problème, vous devez vérifier l’intégrité des don-
nées.
Avant de vous fier aux totaux du classeur Y2001ByMonth.xls, vérifiez que toutes
les valeurs ont été saisies. Pour ce faire, vous pouvez rechercher les cellules vides
et demander à l’utilisateur les valeurs manquantes. Pour localiser les cellules
vides, on fait appel à la méthode SpecialCells de l’objet Range. Voici la syntaxe de
la méthode SpecialCells:

expression.SpecialCells(T
Type, Value)

● expression Objet Range obligatoire.


● Type Valeur obligatoire qui doit correspondre à l’une des constantes
xlCellType listées dans le tableau 8.1.
● Value Variable Variant optionnelle. Si Type prend la valeur xlCellType-
Constants ou xlCellTypeFormulas, Value sert à déterminer le type de cellu-
les à inclure dans le résultat. Les valeurs numériques qui correspondent
aux constantes xlSpecialCellsValues, listées dans le tableau 8.2, peuvent être
additionnées pour retourner plusieurs types de cellules spéciales.

192
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Tableau 8-2. Constantes xlSpecialCellsValues


Valeur
Constante Description numérique
xlErrors Retourne les cellules qui contiennent des erreurs 16
xlLogical Retourne les cellules qui contiennent une valeur 4
logique (autrement dit, booléenne)
xlNumbers Retourne les cellules qui contiennent des 1
valeurs numériques.

Chapitre 8
xlTextValues Retourne les cellules qui contiennent du texte 2

La procédure FindEmptyCells recherche les cellules vident des zones de données


dans Y2001ByMonth.xls et invite l’utilisateur à saisir une valeur dans chaque cel-
lule vide trouvée.
Sub FindEmptyCells()
Dim rgeSearch As Range, rgeEmpties As Range, rgeCurrent As Range
Dim strPrompt As String, strTitle As String, strReturn As String
Dim strRow As String, strAddress As String, strColumn As String

strTitle = "Excel 2003 VBA Au Quotidien"

'Sélectionne la plage appropriée en fonction des jours du mois


Set rgeSearch = Range("D6", Range("D6").End(xlDown))
Set rgeSearch = Range(rgeSearch, rgeSearch.End(xlToRight))

'Localise les cellules vides - Termine si elle n'en trouve pas


'Récupération d'erreur si elle ne trouve pas de cellule vide
On Error Résume Next
Set rgeEmpties = rgeSearch.SpecialCells(xlCellTypeBlanks)
If Err.Number = 1004 Then
strPrompt = "Pas de cellule vide trouvée !"
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle
Exit Sub
Else
strPrompt = "Erreur inattendue - " & Str$(Err.Number) & _
vbCrLf & Err.Description
MsgBox strPrompt, vbOKOnly + vbExclamation, strTitle
End If

'Réinitialise le gestionnaire d’erreurs


On Error GoTo 0

'Boucle dans les entrées vides pour demander des valeurs


For Each rgeCurrent In rgeEmpties

'Calculer l'heure
strAddress = "R5C" & Format(rgeCurrent.Column, "#0")
strAddress = Application.ConvertFormula(strAddress, xlR1C1,
xlA1)
strPrompt = "Il manque la valeur de " &
Format(Range(strAddress), _
"h:mm AM/PM")

193
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


'Calcule le jour
strAddress = "R" & Format(rgeCurrent.Row, "#0") & "C2"
strAddress = Application.ConvertFormula(strAddress, xlR1C1,
xlA1)
strPrompt = strPrompt & " le " & ActiveSheet.Name & " " & _
Range(strAddress)
strReturn = InputBox(strPrompt, strTitle)
rgeCurrent = CSng(strReturn)
Next rgeCurrent
End Sub
Chapitre 8

Plages nommées
Vous savez déjà qu’il est possible de sélectionner une plage de cellules dans une
feuille de calcul et de lui attribuer un nom en le saisissant dans la zone Nom.
Vous pouvez ensuite sélectionner rapidement la plage en sélectionnant son nom
dans la liste déroulante de la zone Nom. Ces noms sont également à la disposi-
tion des macros. Au lieu d’indiquer les coordonnées d’une plage, vous pouvez
vous servir de son nom.

Définir une plage nommée


Excel stocke les noms des plages nommées dans la collection Names, une pro-
priété de l’objet Workbook. Avec la méthode Add, vous pouvez créer une plage
nommée dans le classeur en indiquant le nom à utiliser et la plage vers laquelle il
pointe.
Po u r a n a l y s e r l e s ve n t e s d e c h a q u e p é r i o d e h o r a i r e d u c l a s s e u r
Y2001ByQuarter.xls, il est plus simple de lire les formules si chaque période
horaire constitue une plage. Au lieu de sélectionner manuellement la plage et de
taper son nom, servez-vous d’une macro. La routine CreateNames créer une
plage nommée pour chaque période horaire de la feuille de calcul en cours et la
nomme en fonction du nom de la feuille de calcul et de la période horaire. La
syntaxe de base est la suivante :

expression.Add(N
Name, RefersTo, Visible, MacroType, ShortcutKey,
Category, NameLocal, RefersToLocal, CategoryLocal, RefersToR1C1,
RefersToR1C1Local)

Des différents paramètres passés à la méthode, seuls quatre sont importants.


● Name Valeur Variant qui indique le nom attribué à la plage.
● RefersTo Valeur Variant qui indique les cellules à inclure dans la plage
avec la notation A1. Obligatoire si on n’utilise pas RefersToR1C1.
● RefersToR1C1 Valeur Variant qui indique les cellules à inclure dans la
plage avec la notation R1C1. Obligatoire si on n’utilise pas RefersTo.
● Visible Valeur Variant qui détermine si Name est visible ou non. En posi-
tionnant la propriété sur True (valeur par défaut), Name s’affiche dans les
boîtes de dialogue Définir un nom, Coller un nom et Atteindre. Si cette

194
Partie 3 : Le modèle d’objet Excel

Plages et cellules
propriété est positionnée sur False, Name n’apparaît pas dans ces trois boî-
tes de dialogue (bien que vous puissiez toujours faire référence à Name
dans les formules et le code VBA).

Au Quotidien
Nommer les plages

À l’heure de nommer une plage, tenez compte des directives suivantes :

● Le nom doit commencer par une lettre ou un caractère de soulignement

Chapitre 8
(_). Le reste du nom peut contenir toute combinaison de lettres, chiffres,
virgules (,) ou caractères de soulignement.
● Le nom ne doit pas être identique à une référence de cellule existante
(B22, CB76, R2C20 et ainsi de suite).
● Le nom ne peut pas contenir d’espace ou d’autres caractères spéciaux,
accolades, crochets ou parenthèses.
● Le nom ne doit pas excéder 255 caractères. En outre, les noms de plus
de 253 caractères ne sont pas sélectionnables dans la liste déroulante.
● Les noms ne sont pas sensibles à la casse. MaPlage équivaut à
maplage.
● Le nom doit être unique au sein du classeur. Vous ne pouvez pas utiliser
le même nom pour faire référence à des plages situées sur différentes
feuilles de calcul.

La macro suivante, CreateNames, fonctionne en bouclant dans chaque colonne


qui contient des entrées fondées sur l’heure. À chaque passage de la boucle, le
nom de la feuille de calcul en cours et l’intitulé de la colonne marquée servent à
générer le nom de la plage au format MoisHeure (voir figure 8.6) : les entrées
1:00 P.M. de la feuille de calcul February sont intitulées February1.

Sub CreateNames()
Dim strRangeName As String, strWorksheetName As String
Dim intCounter As Integer, strRangeFormula As String
Dim strColumn As String, strR1C1Formula As String
Dim strA1Formula As String

For intCounter = 1 To 12
strWorksheetName = ActiveSheet.Name

'Calcul le nom de la colonne(D-O) en convertissant


'la notation L1C1 en notation A1
strR1C1Formula = "R5C" & Format(intCounter + 3, "#0")
strA1Formula = Application.ConvertFormula
(Formula:=strR1C1Formula, _
FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlA1)
strRangeName = strWorksheetName & Format(Range(strA1Formula),
"h")

195
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


'Formate la portion colonne de la formule de plage
strColumn = "C" & Format(intCounter + 3, "#0")
strRangeFormula = "=" & strWorksheetName & "!R6" & _
strColumn & ":R36" & strColumn

'Ajoute une nouvelle plage et continue


ActiveWorkbook.Names.Add Name:=strRangeName, _
RefersToR1C1:=strRangeFormula
Next intCounter
End Sub
Chapitre 8

Figure 8-4. Cette procédure crée des noms dans le classeur


Y2001ByQuarter.xls.

Styles de notation
La routine CreateNames se sert de la méthode ConvertFormula de l’objet Appli-
cation pour simplifier l’utilisation d’un compteur qui indique la colonne réfé-
rencée. L’utilisation d’un compteur ou d’une variable numérique pour pointer
vers une colonne spécifique simplifie le déplacement vers la gauche ou la droite
au sein des colonnes : si la valeur 4 pointe vers la colonne D, en ajoutant 6, on
pointe vers la colonne J et en soustrayant 2, on pointe vers la colonne B.
Toutefois, pour les pointeurs de cellules, l’objet Range utilise uniquement la
notation A1 ou la méthode Cells. Dans la procédure on a substitué la méthode
ConvertFormula à la méthode Cells pour construire une référence de style L1C1
et la convertir en notation A1.
La méthode ConvertFormula permet également de convertir la notation A1 en
notation L1C1 et de remplacer un type de référence de formule d’absolu en rela-
tif et vice versa.
Dans la routine CreateNames, la méthode ConvertFormula convertir une adresse
de cellule d’un type de référence à l’autre. Rien ne vous empêche cependant de
passer une formule plus complexe, comme dans l’exemple suivant, qui calcule la
moyenne journalière des deux premiers lundis de janvier dans le classeur
Y2001ByQuarters.xls.

strA1Formula = Application.ConvertFormula( _
Formula:=" =AVERAGE(R5C2:R5C13, _
R12C2:R12C13), fromReferenceStyle:=xlR1C1, _
toReferenceStyle:=xlA1)

196
Partie 3 : Le modèle d’objet Excel

Plages et cellules
Voici la syntaxe de la méthode ConvertFormula :

expression.ConvertFormula(F
Formula, FromReferenceStyle,
ToReferenceStyle, ToAbsolute, RelativeTo)

● Expression Expression obligatoire qui retourne un objet Application.


● Formula Variable Variant obligatoire qui fournit la formule à convertir
sous forme de chaîne.
● FromReferenceStyle Entier obligatoire qui correspond à l’une des deux
constantes xlReferenceStyle.

Chapitre 8
● ToReferenceStyle Entier optionnel qui correspond à l’une des deux cons-
tantes xlReferenceStyle. S’il n’est pas fourni, le style de référence ne change
pas.
● ToAbsolute Entier optionnel qui correspond à l’une constantes xlReferen-
ceType. S’il n’est pas fourni, le style de référence ne change pas.
● RelativeTo Variable Variant qui retourne un objet Range pointant vers
une cellule unique. Les références relatives se réfèrent à cette cellule.
Le tableau 8.3 liste les constantes xlReferenceStyle et xlReferenceType disponibles
que l’on peut utiliser avec la méthode ConvertFormula.
Tableau 8-3. Constantes employées avec la méthode
ConvertFormula
Constante Entier
xlReferenceStyle
xlA1 1
xlR1C1 –4150
xlReferenceType
alAbsolute 1
xlAbsRowRelColumn 2
xlRelRowAbsColumn 3
xlRelative 4

197
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Au Quotidien
Noms et formules

Excel stocke les noms des plages sous forme de formules. Cette gestion peut
vous être profitable pour optimiser les raccourcis employés dans les feuilles
de calcul. D’ordinaire, il est impossible d’exploiter plusieurs fois un même
nom dans un même classeur, mais comment procéder si votre classeur com-
por te plusieurs feuilles similaires, comme dans le classeur
Y2001ByMonth.xls ? Il serait intéressant de pouvoir utiliser le même nom pour
Chapitre 8

faire référence à la même zone d’une feuille de calcul sans tenir compte de la
feuille sur laquelle elle se trouve. Pour ce faire, il vous suffit de créer un nom
spécifique à la feuille de calcul qui ne soit pas disponible dans tout le classeur.

Sélectionnez les cellules à nommer comme à l’accoutumée, cliquez dans la


zone Nom et saisissez le nom. Cette fois, au lieu de simplement taper le nom,
faites-le précéder du nom du classeur, suivi d’un point d'exclamation (!) et du
nom de la plage (appliquez les règles de nommage normales après le point
d'exclamation).

Le point d’exclamation sert de séparateur entre le nom de la feuille et le nom


de la plage. Lorsqu’Excel voit un nom de plage, il sait que ce nom est spécifi-
que à la feuille de calcul.

Il est également possible de développer davantage les noms en faisant appel


aux références relatives. Les noms utilisent par défaut une référence absolue,
mais si vous saisissez manuellement la plage à laquelle se réfère le nom en
cliquant sur Insertion, Nom, Définir, vous pouvez employer une référence rela-
tive. Ouvrez par exemple le classeur Y2001ByMonth.xls, affichez la feuille de
calcul January et procédez de la manière suivante :

1 Sélectionnez l’une des cellules de la colonne A.


2 Dans le menu Insertion, choisissez Nom, Définir.
3 Dans la zone Noms du classeur, tapez ValeursJournalières.
4 Dans la zone Fait référence à, tapez =D$6:D$36.
5 Cliquez sur le bouton Ajouter puis sur le bouton OK.
6 Sélectionnez la cellule D38.
7 Tapez =Somme(ValeursJournalières) et appuyez sur Entrée.

198
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Chapitre 8
Le total qui s’affiche dans la cellule doit être identique, $5 571,00. Examinez
la définition du nom ValeursJournalières. Revenez à la boîte de dialogue Définir
un nom et sélectionnez ValeursJournalières dans la zone de liste. La zone Fait
référence à contient la valeur =January!D$6:D$36. Les noms de colonnes
sont relatifs, mais les lignes sont absolues. Vous pouvez utiliser le nom Valeur-
sJournalières dans une formule si vous devez référencer toute la plage de
valeurs de cette colonne, des lignes 6 à 36.

Attention Vous pouvez utiliser les noms que vous avez créés dans
n’importe quelle ligne à l’exception des lignes incluses dans la plage nom-
mée. Si vous vous servez des noms dans une formule dans ces lignes,
vous créez une référence circulaire qui invalide la formule.

Noms de plages réservés


Il existe quelques noms réservés qu’Excel exploite en interne et que vous ne pou-
vez pas employer dans la définition des plages. Dans le cadre des macros, il est
toutefois intéressant de savoir comment ils sont exploités et comment les appli-
q u e r. L e s n o m s r é s e r v é s s o n t Z o n e _ d e _ co n s o l i d a t i o n , C r i t è re s ,
Base_de_données, Extraction, Zone_d_impression, Impression_des_titres et
une collection d’autres qui commencent par le préfixe Auto_.
Le nom Zone_d_impression est sans doute le plus utile. Il permet de définir la
plage de cellules imprimées. Bien que cette tâche puisse également être réalisée
avec la propriété PrintArea de l’objet Worksheet.PageSetup, la plage
Zone_d_impression est plus souple. La propriété PrintArea permet uniquement

199
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


de définir la plage de cellules à imprimer avec la notation A1 ou des noms de pla-
ges. En outre, si l’on examine la propriété, on obtient son nom en notation A1,
même si on a utilisé son nom.
La plage Zone_d_impression permet de définir la plage de cellules avec au choix
la notation A1, la notation L1C1 ou les noms de plages. Si on étudie les proprié-
tés de la plage Zone_d_impression, on obtient la plage dans le style employé
pour la définir.
Chapitre 8

La routine SelectPrint permet à l’utilisateur de choisir entre imprimer l’ensem-


ble de la feuille ou juste les valeurs du soir dans le classeur Y2001ByMonth.xls. La
plage Zone_d_impression sert à informer Excel des valeurs à imprimer.
Sub SelectPrint()
Dim intReturn As Integer, strPrompt As String, strTitle As String
Dim strRange As String, objName As Name, intCounter As Integer

'Appelle la sous-routine CreateNames pour être sûr que les plages


'nommées correctes sont disponibles
CreateNames

'Demande les valeurs à imprimer


strPrompt = "Cliquez sur Oui pour imprimer uniquement les valeurs
du soir " _
& "et cliquez sur Non pour imprimer toutes les valeurs."
strTitle = "Excel 2003 VBA Au Quotidien"
intReturn = MsgBox(strPrompt, vbYesNoCancel, strTitle)

'Vérifie la réponse de l'utilisateur


Select Case intReturn
Case vbNo 'Imprime la totalité du tableau
strRange = "=" & ActiveSheet.Name & "!" & _
ActiveSheet.Name & "AllValues"
Case vbYes 'Imprime uniquement les valeurs du soir
strRange = "=" & ActiveSheet.Name & "!" & _
ActiveSheet.Name & "1PM:" & _
ActiveSheet.Name & "8PM"
Case vbCancel 'Annule complètement
Exit Sub
End Select

'Boucle dans la collection Names. Delete Zone_d_impression or


'Impression_des_titres si trouvé.
intCounter = ActiveSheet.Names.count

200
Partie 3 : Le modèle d’objet Excel

Plages et cellules
While (intCounter > 0)
If ActiveSheet.Names(intCounter).Name = ActiveSheet.Name _
& "!Zone_d_impression" Then
ActiveSheet.Names(intCounter).Delete
intCounter = ActiveSheet.Names.count
ElseIf ActiveSheet.Names(intCounter).Name = ActiveSheet.Name _
& "!Impression_des_titres" Then
ActiveSheet.Names(intCounter).Delete
intCounter = ActiveSheet.Names.count
End If
intCounter = intCounter -1
Wend

Chapitre 8
'Définit la zone d'impression
ActiveWorkbook.Names.Add Name:=ActiveSheet.Name & _
"!Zone_d_impression", RefersTo:=strRange
'Définit les titres si nécessaire
If vbYes Then
ActiveSheet.PageSetup.PrintTitleColumns = _
ActiveSheet.Columns("B:C").Address
ActiveSheet.PageSetup.PrintTitleRows = _
ActiveSheet.Rows("5:5").Address
End If
'Imprime la feuille de calcul
ActiveWorkbook.PrintPreview
End Sub

201
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Copier des données entre des plages et des tableaux


Toutes les informations d’un classeur sont simples à exploiter avec une macro
VBA. Pourquoi copier ces informations ailleurs avant de les exploiter ? La vitesse.
L’écriture et la lecture d’informations dans une feuille de calcul sont des proces-
sus extrêmement gourmands de temps. En réduisant le nombre de fois que VBA
lit et écrit dans une feuille de calcul, vous réduisez le délai nécessaire au fonction-
nement de votre procédure.
Comment réduire le nombre de lectures et d’écritures ? En lisant et en écrivant
des plages de cellules en une fois. En effet, la plus grand part du temps nécessaire
Chapitre 8

est employée par la configuration dont VBA a besoin pour accéder à la feuille de
calcul. Malheureusement, VBA exécute le même processus de configuration cha-
que fois qu’il doit lire ou écrire une autre plage, que celle-ci se compose d’une
cellule ou de plusieurs centaines de cellules.

Attention Comme souvent, il existe un point de rendement décroissant ou de


panne globale. VBA ne peut pas transférer plus de 3000 cellules en une fois.
Tant que vous restez sous ce nombre, vous ne devriez pas rencontrer de pro-
blème.

La question à présent est de savoir comment lire ou écrire simultanément plu-


sieurs cellules ? Pour transférer plusieurs cellules entre un classeur et VBA, on
utilise des tableaux de variables Variant. Le type de données Variant peut conte-
nir n’importe quel autre type de données, y compris des tableaux. Plus impor-
tant encore, il est inutile de déclarer la variable Variant comme tableau pour
qu’elle puisse contenir un tableau. En fait, dans le cadre de la copie de données
vers et depuis une feuille de calcul, la variable Variant ne peut pas être déclarée
comme tableau. Elle doit être déclarée comme simple type Variant, comme dans
l’exemple suivant.

Dim varA As Variant

Pour lire les données qui se trouvent dans une variable Variant, on se sert d’une
instruction d’affectation, autrement dit, varA = Range("January1PM") ou varA =
Range("H6:H36"). Ces deux exemple lisent la même plage dans la variable varA et
accèdent aux cellules individuelles comme à un élément unique d’un tableau.
Une fois les valeurs assignées à la variable Variant, vous pouvez l’utiliser pour
référencer la plage. Par exemple, on peut utiliser ce code pour afficher une boîte
de message contenant la somme des valeurs des cellules E12:E15.

Sub VariantSum()
Dim varA As Variant, intSum As Integer
varA = Range("E12:E15")
intSum = WorksheetFunction.Sum(varA)
MsgBox (intSum)
End Sub

202
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Remarque Une plage retourne toujours un tableau multidimensionnel, en


général bidimensionnel, quel que soit le nombre de colonnes. Le deuxième
dimension contient au moins un élément, mais peut en héberger davantage
selon le nombre de colonnes qui se trouvent dans la plage.

Pour déterminer la taille d’un tableau, vous pouvez faire appel aux fonctions
LBound et UBound qui récupèrent les limites inférieure et supérieure du tableau.
LBound(var) retourne la limite inférieure, généralement 0 ou 1, alors que
UBound(var) retourne la limite supérieure.

Chapitre 8
Pour déterminer les limites des toutes les dimensions dans un tableau multidi-
mensionnel, indiquez la dimension dont vous voulez récupérer la limite. Par
exemple, dans le classeur Y2001ByMonth.xls, l’instruction varA = Range("Janu-
aryAllValues") lit toutes les cellules de B3:Q38. Pour obtenir le nombre de
lignes, servez-vous de UBound(varA, 1) ou simplement de UBound(varA). Pour
retrouver le nombre de colonnes, utilisez la commande UBound(varA, 2).
Lorsque vous lisez les valeurs d’une plage nommée, vous pouvez également
réduire ou augmenter le nombre de cellules lues avec la méthode Resize. Par
exemple, pour lire uniquement les sept premières lignes de données, sur une
p é r i o d e d e t ro i s h e u re s à co m p te r d e 1 : 0 0 P. M . d a n s l e c l a s s e u r
Y2001ByQuarter.xls, vous pouvez utiliser l’instruction suivante :

varA = Range("January1").Resize(7, 3)

Pour écrire des informations dans la plage, il suffit d’inverser l’instruction :


Range("January1PM") = varA . Vous devez toutefois être attentifs à l’heure
d’écrire des informations dans des cellules. Assurez-vous que la taille de plage et
celle du tableau sont identiques pour éviter d’écraser d’autres cellules. Pour pré-
server l’intégrité des données, il suffit de combiner la fonction UBound et la
méthode Resize de la manière suivante :

Range("January1").Resize(UBound(varA, 1), UBound(varA, 2)) = varA.

Il existe une méthode encore plus simple pour garantir l’intégrité des données :
peupler d’abord le tableau avec les valeurs de la plage. Cette méthode sert deux
objectifs : elle dimensionne le tableau à la taille de la plage et elle le remplit avec
les valeurs actuellement contenues dans la plage de sorte que lorsque les données
sont écrites en retour, Excel conserve les valeurs qui n’ont pas été modifiées au
cours de la procédure.
La procédure suivante illustre la différence des temps de traitement entre l’accès
direct aux cellules et leur copie initiale dans un tableau (chaque méthode est
répétée 50 fois de sorte que le temps nécessaire aux lectures soit notable).

Sub ProcessTime()
Dim rgeCells As Range, intCount As Integer
Dim strPrompt As String, strTitle As String
Dim sglStart As Single, sglEnd As Single
Dim rgeCell As Range, varCells As Variant

203
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA


Dim intRows As Integer, intColumns As Integer
Dim intLoop As Integer

intCount = 0
strTitle = "Excel 2003 VBA Au Quotidien"
sglStart = Timer
Debug.Print sglStart
For intLoop = 1 To 50
For Each rgeCell In Range("JanuaryAllValues")
intCount = intCount + 1
Next rgeCell
Next intLoop
Chapitre 8

sglEnd = Timer
Debug.Print sglEnd
strPrompt = "Temps de traitement de la méthode Range : " & _
Format(sglEnd - sglStart, "#0.00000") & _
" Cellules totales :" & Str$(intCount) & vbCrLf

sglStart = Timer
intCount = 0
For intLoop = 1 To 50
varCells = Range("JanuaryAllValues")
For intRows = 1 To UBound(varCells)
For intColumns = 1 To UBound(varCells, 2)
intCount = intCount + 1
Next intColumns
Next intRows
Next intLoop
sglEnd = Timer

strPrompt = "Temps de traitement de la méthode tableau : " & _


Format(sglEnd - sglStart, "#0.00000") & _
" Cellules totales :" & Str$(intCount)
MsgBox strPrompt, vbOKOnly + vbInformation, strTitle

End Sub

Validation des données


La saisie des données dans une feuille de calcul ou un formulaire constitue l’une
des activités les plus ennuyeuses qui existent. Si vous aviez saisi des numéros
ISBN dans une base de données huit heures par jour, cinq jours par semaine
pendant deux mois, vous commenceriez à apprécier le travail des opérateurs de
saisie. Des colonnes de nombres se transposent devant vos yeux, des livres saisis
s’égarent dans votre pile « à faire » et vous passer d’une main à l’autre pour éviter
les désordres nerveux. Ajoutez le risque d’erreurs de saisie et vous comprendrez
pourquoi les collections de données électroniques sont notoirement inexacts.
Pour éviter les erreurs de saisie à la source, vous pouvez créer des règles de vali-
dation sur les cellules de vos feuilles de calcul. Comme l’indique son nom, une
règle de validation est un critère auquel doivent répondre les données pour assu-
rer la cohérence de informations saisies. Vous choisissez s’il est possible de saisir
des données non valides ou si l’utilisateur doit saisir à nouveau les données avant

204
Partie 3 : Le modèle d’objet Excel

Plages et cellules
de pouvoir passer à la cellule suivante. Vous pouvez également décider si l’utili-
sateur qui saisit les données peut laisser des cellules vides.
Pour créer des règles de validation, on se sert de la propriété Validation de l’objet
Range. La propriété Validation, qui retourne un objet Validation, permet de défi-
nir les règles de validation et les styles de notification des plages de cellules. Le
tableau 8.4 liste les propriétés et méthodes de l’objet Validation.
Tableau 8-4. Propriétés et méthodes de l’objet Validation
Attribut Description

Chapitre 8
Propriétés
AlertStyle Cette propriété peut être positionnée à l’une des trois
constantes Excel suivantes : xlValidAlertInformation (qui
affiche une boîte d’informations), xlValidAlertStop (qui
affiche une boîte d’arrêt) et xlValidAlertWarning (qui affiche
une boîte d’avertissement).
ErrorMessage Cette propriété contient le message défini par l’utilisateur
qui s’affiche dans la boîte d’alerte après que l’utilisateur a
saisi des données non valides.
ErrorTitle Cette propriété contient la valeur définie par l’utilisateur
apparaissant dans la barre de titre de la boîte d’alerte qui
s’affiche après que l’utilisateur a saisi des données non
valides.
Formula1 Cette propriété contient la première (et éventuellement la
seule) valeur utilisée dans un critère (par exemple, entre 5
et 10 ou inférieur à 10).
Formula2 Cette propriété contient la deuxième valeur utilisée dans
un critère (par exemple, entre 5 et 10).
IgnoreBlank Si cette propriété booléenne est positionnée à True,
l’utilisateur peut laisser la cellule vide.
InCellDropdown Cette propriété détermine si la cellule contient une flèche
descendante et une liste de valeurs parmi lesquelles
l’utilisateur doit faire un choix.
InputMessage Cette propriété contient le message qui s’affiche dans la
boîte de saisie dans laquelle l’utilisateur saisit les
données.
InputTitle Cette propriété contient la valeur qui s’affiche dans la
barre de titre de la boîte de saisie dans laquelle
l’utilisateur saisit les données.
Operator Cette propriété contient l’opérateur d’un critère, qui peut
être l’une des constantes Excel suivantes : xlBetween,
xlEqual, xlGreater, xlGreaterEqual, xlLess, xlLessEqual,
xlNotBetween et xlNotEqual.

205
Partie 3 : Le modèle d’objet Excel

Microsoft Excel 2003 VBA

Tableau 8-4. Propriétés et méthodes de l’objet Validation (Suite)


Attribut Description
Propriétés
ShowError Si cette propriété booléenne est positionnée à True, Excel
affiche un message pour informer l’utilisateur qu’il a saisi
des données non valides.
ShowInput Si cette propriété booléenne est positionnée à True, Excel
affiche le contenu de la propriété InputMessage lorsque la
cellule est activée.
Chapitre 8

Type Une propriété qui détermine le type des valeurs validées.


Les types disponibles sont : xlValidateCustom,
xlValidateDate, xlValidateDecimal, xlValidateInputOnly,
xlValidateList, xlValidateTextLength, xlValidateTime et
xlValidateWholeNumber.
Value Cette propriété booléenne est positionnée à True si toutes
les règles de validation sont satisfaites ou à False si au
moins l’une des règles n’est pas satisfaite.
Méthodes
Add Une méthode pour créer une règle de validation pour une
plage de cellules. Le tableau 8.5 détaille les paramètres à
définir.
Delete Une méthode qui supprime un objet Validation.
Modify Une méthode qui change les règles de validation pour une
plage de cellules. La méthode Modify utilise les règles de
paramètres listées dans le tableau 8.5.

Les paramètres des méthodes Add et Modify employées dépendent du type de


valeur à valider. Le tableau 8.5 liste les valeurs correspondant à chaque type de
validation.
Tableau 8-5. Liste des paramètres utilisés dans une instruction
Add ou Modify
Type de validation Paramètres
xlValidateCustom Formula1 est obligatoire, alors que Formula2
n’est jamais employé (toute valeur assignée à
Formula2 est ignorée). Formula1 doit contenir
une expression qui prend la valeur True si
l’entrée est valide et False si les données
saisies ne sont pas valides.
xlInputOnly On utilise AlertStyle, Formula1 ou Formula2.

206
Partie 3 : Le modèle d’objet Excel

Plages et cellules

Tableau 8-5. Liste des paramètres utilisés dans une instruction


Add ou Modify (Suite)
Type de validation Paramètres
xlValidateList Formula1 est obligatoire, alors que Formula2
n’est jamais employé (toute valeur assignée à
Formula2 est ignorée). Formula1 doit contenir
soit une liste de valeurs délimitées par des
virgules, soit une référence de feuille de calcul
à la liste.

Chapitre 8
xlValidateWholeNumber, Formula1 et/ou Formula2 doivent être
xlValidateDate, spécifiés.
xlValidateDecimal,
xlValidateTextLength ou
xlValidateTime

Pour définir le critère de validation pour 600 cellules dans la colonne H d’une
feuille de calcul, vous pouvez vous servir du code suivant :

With Range("H6, H606").Validation


.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
Operator:=xlLessEqual, Formula1:="5000"
.InputTitle = "Limite de crédit"
.ErrorTitle = "Limite de crédit trop élevée"
.InputMessage = "Saisissez la limite de crédit du client."
.ErrorMessage = "La limite de crédit doit être inférieur à
€5 000."
End With

Dans ce chapitre, vous avez appris à référencer et à manipuler les plages de cellu-
les et les cellules individuelles au sein des feuilles de calcul. Le concept fonda-
mental est le suivant : pour appeler une cellule, que celle-ci se trouve dans une
plage ou non, on utilise l’objet Range (par exemple Range("A16"). Une fois que
vous avez défini une plage, vous pouvez exploiter ses valeurs dans des formules,
lui attribuer un nom pour la référencer de manière plus conviviale et plus ration-
nelle et valider les données saisies dans cette plage.

207
Partie 4
Fonctions VBA
avancées
9 Manipulation des données
avec VBA 211

10 Mise en forme
d’objets Excel 239

11 Création de macros
complémentaires et de
compléments COM 259

12 Événements 285

13 Manipulation des fichiers 303

14 Développement de modules
de classes 323

209
Partie 4 : Fonctions VBA avancées

Chapitre 9
Manipulation des données
avec VBA
Texte. . . . . . . . . . . . . . . . . . . . . . 211 Dates et heures . . . . . . . . . . . . . 233
Nombres. . . . . . . . . . . . . . . . . . . 225

Lorsque vous recevez un classeur de données, votre premier objectif consiste à


analyser ces données. Quel est le total des ventes de la journée ? Ou du mois ? Ou
de l’année ? Quel est le délai qui sépare deux commandes d’un client ? Le format
utilisé pour écrire les données dans un fichier texte peut-il être lu dans une base
de données ? Pour répondre à ces questions, et à bien d’autres, vous faites appel
aux fonctions de texte, de nombres et de dates et d’heures.
Dans ce chapitre, vous allez apprendre à :
● Concaténer, localiser et modifier des chaînes ;
● Effectuer des calculs analytiques sur des données numériques ;
● Prendre des décisions financières avec les calculs Excel ;
● Exploiter les dates et les heures dans Excel.

Note du traducteur Il n’est pas toujours évident de faire son choix entre le
libellé anglais et le libellé français des fonctions. En effet, si les fonctions ont
été traduites dans l’interface Excel, vous comprendrez qu’elles ne l’ont pas
été dans l’interface VBA. Chaque fois que le cas se présente, dans le texte et
les tableaux, nous avons mis en correspondance le terme anglais et le terme
français (entre parenthèses). À vous de les utiliser à bon escient.

Texte
Même si de prime abord on envisage Excel comme une application de traitement
de données financières, ces capacités sont plutôt polyvalentes puisqu’il permet
également de gérer le texte qui accompagne les données. Que ce soit pour affi-
cher un simple message de bienvenue après qu’un utilisateur a ouvert un classeur
ou pour importer des données à partir d’un fichier texte, vous exploitez les pro-
cédures de gestion de texte proposées dans Excel VBA ou dans les formules des
feuilles de calcul.

211
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Déterminer si la valeur d’une cellule est du texte


Pour manipuler du texte sans générer d’erreur, vous devez d’abord déterminer si
la variable ou la valeur de la cellule à utiliser est, en fait, une valeur de texte. Pour
ce faire, vous traitez la chaîne avec la fonction ISTEXT (ESTTEXTE). Par exem-
ple, vous pouvez utiliser la fonction ISTEXT pour vous prémunir contre les
erreurs de saisie des données, comme lorsqu’un utilisateur saisit des données
incorrectes dans une cellule ou une feuille. Ce type de problème se présente sou-
vent après que l’on a changé une procédure ou créer un nouveau formulaire : les
personnes qui saisissent des données sont tellement habituées à saisir le code
client en premier, qu’elles oublient qu’elles doivent maintenant commencer par
le nom de la société.

La fonction ISTEXT (ESTTEXTE) est écrite en majuscules parce qu’elle constitue l’une des
nombreuses fonctions de feuille de calcul que l’on peut appeler avec du code VBA. Pour
plus d’informations sur l’appel des fonctions de feuille de calcul comme ISTEXT dans le
code VBA, reportez-vous à la section « Cette fonction existe-t-elle dans VBA ? », plus loin
dans ce chapitre.
Chapitre 9

La fonction ISTEXT sert également à assurer que les données importées depuis
une source externe sont correctement formatées avant que vous n’exécutiez un
ensemble de procédures. Si vous avez déjà exécuté une routine de traitement de
texte sur des données autres que textuelles, vous savez précisément le chaos
qu’une petite vérification permet d’éviter. Vous pouvez également utiliser
ISTEXT comme fonction de base si vous n’êtes pas absolument sûr du type des
données textuelles reçues. En revanche, si vous êtes sûr qu’il s’agit de texte, vous
pouvez écrire une procédure pour parcourir les cellules non vides de la feuille de
calcul et effectuer ne serait-ce qu’une vérification rudimentaire.
Que faire si les données à exploiter sous forme de chaîne sont en réalité un
nombre ? Dans ce cas, servez-vous de la fonction STR (CTXT) pour représenter
le nombre par une chaîne. La syntaxe de la fonction STR est minime : STR(num-
ber) [CTXT(nombre)], où nombre représente le nom de la variable ou l’adresse
de la cellule qui contient le nombre à convertir en texte.

Pour plus d’informations sur la validation des données, reportez-vous à la section


« Validation des données », au chapitre 8.

ISTEXT n’est pas la seule fonction de la famille IS (EST). Le tableau 9.1 liste les
fonctions de feuille de calcul que vous pouvez employer pour déterminer si une
valeur correspond à une catégorie donnée.
Tableau 9-1. Les fonctions de la famille IS (EST)
Fonction Fonction
Excel VBA Retourne True si
ESTVIDE ISBLANK La valeur fait référence à une cellule vide.
ESTERR ISERR La valeur fait référence à n’importe quelle valeur
d’erreur, à l’exception de #N/A (valeur non
disponible).

212
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Tableau 9-1. Les fonctions de la famille IS (EST) (Suite)


Fonction Fonction
Excel VBA Retourne True si
ESTERREUR ISERROR La valeur fait référence à n’importe quelle valeur
d’erreur (#N/A, #VALUE!, #REF!, #DIV/0!,
#NUM!, #NAME? ou #NULL!).
ESTLOGIQUE ISLOGICAL La valeur fait référence à une valeur logique.
ESTNA ISNA La valeur fait référence à la valeur d’erreur #N/A
(valeur non disponible).
ESTNONTEXTE ISNONTEXT La valeur fait référence à tout élément qui n’est
pas du texte (notez que cette fonction retourne
True si la valeur fait référence à une cellule
vide).
ESTNUM ISNUMBER La valeur fait référence à un nombre.
ESTREF ISREF La valeur fait référence à une référence.
ESTTEXTE ISTEXT La valeur fait référence à du texte.

Chapitre 9
À l’heure d’écrire les données dans une cellule, vérifiez que la cellule a été prépa-
rée pour accepter des données de texte. Par exemple, si les cellules sont formatées
avec le format de nombre Standard (par défaut) et que vous essayez d’écrire une
chaîne qui se trouve être un nombre (comme, 0000097239) dans la cellule, les
zéros de tête seront supprimés. Pour vous assurez qu’Excel traite votre entrée
comme du texte, remplacez le format de nombre par Texte. Pour ce faire, dans le
menu Format de l’interface Excel, choisissez Cellule, cliquez sur l’onglet Nombre
et sélectionnez Texte dans la liste Catégorie. Vous obtiendrez le même résultat
avec la propriété NumberFormat de l’objet Range.
Par exemple, pour appliquer le format de nombre Texte à la cellule active (qui est
considérée comme une plage dans ce contexte), servez-vous de la ligne de code
suivante :

ActiveCell.NumberFormat = "@"

Vous pouvez appliquer n’importe quel format de nombre proposé dans la liste
Personnalisée de la boîte de dialogue Format de cellule (voir figure 9.1). Si vous
n’êtes pas sûr du format à employer, appliquez-le par le biais de la boîte de dia-
logue Format de cellule et cliquez sur Personnalisée pour visualiser le code.
Attention ! Placez le code entre guillemets.

213
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Figure 9-1. Vous pouvez appliquer à votre guise un format de la liste


Personnalisée à votre cellule.

Préparer les données de chaîne pour le traitement


Chapitre 9

Une fois que vous avez déterminé que les données sur lesquelles vous voulez
effectuer des opérations de texte sont de fait du texte, vous pouvez continuer et
vous occuper de leur aspect. Pour traiter les données, vous disposez de deux
fonctions : CLEAN (EPURAGE) et TRIM (SUPPRESPACE). La fonction
CLEAN supprime tous les caractères non imprimables d’une chaîne. Les carac-
tères non imprimables sont également appelés caractères de contrôle, puisqu’ils
sont généralement saisis en appuyant sur la touche Ctrl associée à une séquence
de touches. Les caractères non imprimables n’apparaissent souvent pas dans le
fichiers texte ou les feuilles de calcul, mais si vous importez les données à partir
d’un autre programme, ils peuvent être interprétés comme une mise en forme
ou des instructions relatives à la structure des données qui n’étaient pas visibles
lorsque les données d’origines ont été enregistrées.

Au Quotidien
Cette fonction existe-t-elle dans VBA ?

Rappelez-vous que le comportement par défaut de Visual Basic Editor est


d’afficher les arguments nécessaires à une fonction ainsi que les propriétés,
méthodes et événements disponibles pour un objet après que l’on a saisi son
nom et le point de suite. Pour savoir si vous devez utiliser l’objet Applica-
tion.WorksheetFunction, il suffit de saisir la fonction sans l’objet : si néces-
saire, une info-bulle liste les arguments indispensables. Si l’info-bulle
s’affiche, vous pouvez utiliser la fonction comme telle. Dans le cas contraire,
saisissez Application.WorksheetFunction. (il y a un point après WorksheetFunc-
tion) et voyez si la fonction que vous souhaitez employer se trouve dans la liste
des propriétés disponibles pour l’objet.

214
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Chapitre 9
Remarque La ligne ci-après est uniquement constituée de caractères non
imprimables :

La fonction TRIM (SUPPRESPACE)est similaire à la fonction CLEAN en ce que


les deux fonctions suppriment des caractères indésirables, mais la fonction
TRIM élimine les espaces blancs (espaces, tabulations, retours chariot, renvois à
la ligne, et ainsi de suite) qui précèdent le premier et suivent le dernier caractère
alphanumérique de la chaîne. La fonction TRIM élimine également tous les
espaces excepté un entre les mots. Ces caractères correspondent, par exemple, à
des espaces que le programme d’origine a ajoutés aux champs de longueur fixe
pour compléter la chaîne. Pour appeler les fonctions CLEAN et TRIM, ainsi
qu’une foule d’autres fonctions de texte et de données pratiques, ajoutez le nom
de la fonction comme propriété de l’objet Application.WorksheetFunction.

ActiveCell.Value =
Application.WorksheetFunction.Clean(ActiveCell.Value)
ActiveCell.Value =
Application.WorksheetFunction.Trim(ActiveCell.Value)

Déterminer le nombre de caractères d’une chaîne


Avec la fonction LEN (NBCAR) de VBA, vous pouvez déterminer le nombre de
caractères qui composent une chaîne. À l’instar de la fonction ISTEXT qui valide
les données, la fonction LEN assure que la longueur des données saisies, impor-

215
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


tées ou exportées est correcte. Prenons l’exemple des numéros ISBN (Internatio-
nal Standard Book Numbers) qui identifient les livres. La longueur de chaque
ISBN est exactement de 10 caractères. Si vous saisissez le titre, les auteurs, l’ISBN
et le prix de chaque livre de la bibliothèque de votre entreprise, vous devez vous
assurer que la longueur des ISBN est correcte. Les ISBN ne sont qu’un exemple
parmi d’autres ; cette fonction peut servir à vérifier la longueur des données dans
une feuille de calcul ou une feuille UserForm : ces applications sont presque infi-
nies. Voici d’autres exemples : au sein de votre entreprise les numéros de com-
mandes ou de clients la longueur définie est de neuf caractères et la longueur des
codes produits est de huit caractères ; vous voulez vous assurer qu’aucun carac-
tère inutile n’a par inadvertance été ajouté à des numéros de téléphones, etc.
Le code suivant vérifie la valeur de la cellule active pour s’assurer le code produit
saisi dans la cellule comporte exactement 10 caractères :

If Len(ActiveCell.Value) <> 10 Then


MsgBox ("La longueur du code produit saisi dans cette cellule est
inexacte.")
ActiveCell.Value = "Erreur"
Chapitre 9

End If

Si vous exploitez d’anciens systèmes de gestion de base de données ou une base


de données dont les longueurs de caractères sont définies pour chaque champ,
ajoutez une règle de validation dans une colonne pour vous assurez que chaque
entrée a été correctement lue. En outre, même si la taille des bases de données est
souvent suffisamment réduite pour que vous puissiez gaspiller un peu de stoc-
kage en allouant plus d’espace qu’il n’est strictement nécessaire, il est préférable
de limiter la taille de chaque champ (à l’exception éventuellement du champ des
commentaires) au minimum de caractères.
La fonction LEN peut également servir à garantir que les mots de passe que vos
collègues assignent aux classeurs et aux feuilles de calcul possèdent une longueur
minimum. Comme nous l’avons étudié au chapitre 7, le plan de protection par
mot de passe dans Excel n’empêche pas la compromission de vos données, mais
vous pouvez compliquer la tâche d’un attaquant en assignant des mots de passe
longs. Excel accepte des mots de passe d’une longueur maximale de
15 caractères, mais une longueur de 8 caractères constitue un bon compromis.

Pour plus d’informations sur l’utilisation de la fonction LEN pour vérifier qu’un mot de
passe contient au moins un caractère non alphanumérique, reportez-vous à la section
« Retourner des caractères arbitraires d’une chaîne », plus loin dans ce chapitre.

216
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Au Quotidien
Validation ou instruction If…Then ?

Plusieurs méthodes sont à votre disposition pour fixer la longueur des valeurs
saisies. Au chapitre 8, nous avons appris à utiliser la propriété Validation de
l’objet Range pour établir un critère que doit satisfaire la valeur d’une cellule
pour être acceptée. En positionnant le paramètre Type de objet Validation sur
xlValidateTextLength, Excel vérifie que la valeur d’une cellule possède la lon-
gueur appropriée. Vous obtiendrez le même résultat avec une règle If…Then.
Alors pourquoi utiliser une méthode au lieu de l’autre ?

● Servez-vous de la propriété Validation de l’objet Range pour :


● Créer une règle unique facile à exprimée avec les paramètres de la pro-
priété Validation.
● Assigner un titre spécifique à la boîte de saisie et la soumettre à des
règles de validation.

Chapitre 9
● Afficher un type de boîte de message spécifique (information, avertisse-
ment ou arrêt) et programmer son comportement (passage à la cellule
suivante ou non) dans le cadre du type de boîte de message.
● Stocker tous les critères au sein d’un unique objet.
● Servez-vous d’une instruction If...Then...Else pour :
● Définir plusieurs critères et trouver des constructions If…Then…Else
plus simples à exploiter que la méthode Modify de l’objet Validation.
● Modifier le critère conditionnel selon certaines circonstances. Par exem-
ple, la limite de crédit maximale qu’un employé peut accorder à un client
peut varier d’un employé à l’autre.

Concaténer le texte de plusieurs cellules ou variables


Certaines des procédures que vous avez étudiées dans ce livre génèrent des boîtes
de message qui affichent du texte issu de plusieurs variables ou cellules. Les
auteurs de ce livre admettent avoir été un peu trop rapides et s’être perdus dans
l’ordre des rubriques. Il est à présent temps de vous montrer comment ajouter
du texte issu d’une cellule, d’une variable ou d’un littéral : on utilise l’opérateur
&.
Attention, ne confondez pas l’esperluette (ou et commercial), &, avec le mot
« et ». En outre, si vous possédez une expérience en programmation, vous avez
sans doute déjà employé l’opérateur & pour indiquer un « et » logique dans des
expressions comme

If ((Range("C5").Value >= 1000) & (Range("D5")<=10)) Then…

217
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Ne tombez pas dans ce piège ! L’opérateur de concaténation VBA & est différent
de l’opérateur logique ET : ce dernier s’orthographie comme le mot « et ». L’ins-
truction If précédente s’écrit correctement de la manière suivante :

If ((Range("C5").Value >= 1000) And (Range("D5")<=10)) Then…

L’utilisation de l’opérateur de concaténation est simple. Par exemple, vous pou-


vez l’employer conjointement à la fonction LEN, décrite précédemment, pour
indiquer pourquoi les données saisies dans une cellule ne sont pas valides.

Public Sub VerifyLength()


If Len(ActiveCell.Value) <> 10 Then
MsgBox ("La longueur du code produit saisi est de " &
LEN(ActiveCell.Value) & _ " caractères et non de 10.")
ActiveCell.Value = ""
End If
End Sub

La fonction LEN et l’opérateur & permettent également d’ajouter des caractères


à la valeur d’une cellule ou à une variable pour obtenir la longueur appropriée
Chapitre 9

avant d’exporter les données dans un programme où la longueur des données est
fixe. Pour ajouter des caractères au début ou à la fin d’une chaîne, servez-vous de
la fonction REPT (REPT) combinée à l’opérateur &. Voici la syntaxe de la fonc-
tion REPT :

texte, no_fois)
Application.WorksheetFunction.Rept(t

Le paramètre texte représente le texte à répéter et no_fois indique le nombre de


fois que le texte doit être répété. Par exemple, dans une entreprise en pleine
expansion qui utilise des codes de commande de longueur variable, vous pouvez
remplacer le code sur 5 caractères par un code sur 10 caractères. Cela ne pose
aucun problème dans Excel, il suffit de répéter un zéro devant chaque code de
commande pour obtenir une longueur de 10 caractères. La procédure suivante
vérifie la longueur de la chaîne du code de commande dans les cellules identifiées
par l’utilisateur et ajoute suffisamment de x pour obtenir une chaîne de
10 caractères.

Public Sub MakeTen()

Dim strFirst, strLast, strAllCells, strPadding, strContents As String


Dim intPadding As Integer

strFirst = InputBox("Saisissez l'adresse de la première cellule.")


strLast = InputBox("Saisissez l'adresse de la dernière cellule.")
strAllCells = strFirst & ":" & strLast

For Each MyCell In Range(strAllCells).Cells

If Len(MyCell.Value) < 10 Then


Range(MyCell.Address).Select
strContents = MyCell.Value

218
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


intPadding = 10 - Len(MyCell.Value)
strPadding = Application.WorksheetFunction.Rept("0", intPadding)
MyCell.NumberFormat = "@"
MyCell.Value = strPadding & strContents
End If

MyCell.NumberFormat = "@"

Next MyCell

End Sub

Attention Vérifiez que le code de commande que vous modifiez est stocké en
tant que chaîne et non comme un nombre. Si vous ajoutez une chaîne de zéro
au début d’une cellule qu’Excel convertit en nombre (ce qui inclut les cellules
auxquelles on a appliqué le format Standard), Excel élimine les zéros qu’il con-
sidère inutiles. Dans la feuille de calcul, appliquez le format Texte.

Retourner le premier ou le dernier caractère d’une chaîne

Chapitre 9
Les données d’un tableur forment souvent des modèles que vous avez éventuel-
lement programmés. Même si tous les caractères d’une chaîne ont leur impor-
tance, les premiers ou les derniers caractères d’une chaîne peuvent vous être
utiles pour dériver des informations relatives à une tâche spécifique. Par exem-
ple, si les cinq premiers chiffres de l’ISBN d’un livre désignent l’éditeur (c’est le
cas), vous pouvez lire ces chiffres en mémoire, rechercher l’identité de l’éditeur
dans une base de données ou le tableau d’une feuille de calcul et programmer
l’écriture des données résultantes dans une autre cellule.
Pour retourner les premiers ou derniers caractères d’une chaîne, on fait appel à
la fonction LEFT (GAUCHE), qui retourne les premiers caractères d’une chaîne
ou la fonction RIGHT (DROITE), qui retourne les derniers caractères d’une
chaîne. La syntaxe des deux fonctions, à l’exception de leurs noms, est identique :

string, length)
LEFT(s
GAUCHE(ttexte; nbre_car)
RIGHT(sstring, length)
DROITE(ttexte; nbre_car)

Dans ces fonctions, string (texte) représente la variable ou la plage qui contient la
chaîne à traiter et length (nbre_car) correspond au nombre de caractères à
retourner. Prenons l’exemple d’une feuille de calcul dans laquelle chaque ligne
représente les articles des commandes passées à la société Garden.

219
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Chapitre 9

La société Garden se sert d’un système de nommage logique pour ses produits. Il
est ainsi possible de créer une procédure qui détermine la catégorie de chaque
produit commandé. Dans ce système de nommage, les deux premiers caractères
du code d’identification d’un article représentent la catégorie à laquelle il appar-
tient (OU pour outillage, PL pour plantes et AC pour accessoires). Au lieu de
demander à l’utilisateur de saisir la catégorie, on peut créer une procédure pour
cette action.

Remarque Les données de la feuille de calcul sont toutes en majuscules. En


conséquence, les entrées de l’instruction Case de la procédure recherche uni-
quement des codes de catégories en majuscules.

Public Sub NoteCategory()

Dim MyCell As Range


Dim strFirst, strLast, strAllCells, strCategory As String

strFirst = InputBox("Saisissez l'adresse de la première cellule dans


la colonne Article.")
strLast = InputBox("Saisissez l'adresse de la dernière cellule dans la
colonne Article.")
strAllCells = strFirst & ":" & strLast

For Each MyCell In Range(strAllCells).Cells

Range(MyCell.Address).Select
strCategory = Left(MyCell.Value, 2)

Select Case strCategory


Case "OU"

220
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


ActiveCell.Offset(0, 1).Value = "Outillage"
Case "PL"
ActiveCell.Offset(0, 1).Value = "Plantes"
Case "AC"
ActiveCell.Offset(0, 1).Value = "Accessoires"
Case Else
ActiveCell.Offset(0, 1).Value = "Erreur"
End Select

Next MyCell

End Sub

Pour plus d’informations sur la recherche de valeurs dans des listes existantes, y compris
celles stockées dans des bases de données, reportez-vous au chapitre 22, « Introduction
à ADO », qui présente également un exemple pratique.

Retourner des caractères arbitraires d’une chaîne


Des données bien organisés en abondance, provenant de sources externes, cons-
tituent l’une des petites joies des programmeurs Excel : il suffit d’atteindre les

Chapitre 9
chaînes pour en extraire ce dont on a besoin. Le système d’immatriculation des
véhicules aux États-Unis en est un exemple. Les numéros d’immatriculation ont
une longueur de 17 caractères chacun codant des informations pertinentes rela-
tives au véhicule : marque, modèle, couleur, année de fabrication, usine de fabri-
cation et ainsi de suite. Lorsqu’on connaît la structure des données, on peut faire
appel à la fonction MID (STXT) pour extraire les caractères nécessaires à la pro-
cédure.
Contrairement aux fonctions LEFT et RIGHT, qui récupèrent les données au
début et la fin d’une chaîne, la fonction MID extrait un certain nombre de carac-
tères dans le corps de la chaîne. La syntaxe de la fonction MID (STXT) est simi-
laire à celles des fonctions LEFT et RIGHT, à la différence que l’on définit la
position du premier caractère à retourner et le nombre de caractères retournés.

string, start, length)


MID(s
STXT(ttexte;d
début;n
nbre_car)

Pour récupérer les caractères des positions 4 à 8 (soit 5 caractères au total) de la


valeur de la cellule D5, servez-vous du code suivant (en supposant que vous avez
créé les variables strCode et strDetails précédemment :

strCode = Range("D5").Value
strDetails = Mid(strCode, 4, 5)

Retrouver une chaîne au sein d’une autre chaîne


Vous vous demandez peut-être pour quelle raison on voudrait récupérer une
chaîne au sein d’une autre chaîne. Dans le domaine de la génétique, on peut
rechercher une séquence de protéine spécifique pour localiser un chromosome,
mais si tel est votre domaine d’activité, il est peut probable que vous utilisiez

221
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Excel pour trouver une sous-chaîne. Supposons plutôt que vous ayez reçu des
lignes de données qui, indépendamment de votre volonté, ont été importées
dans Excel sous la forme d’une cellule par ligne. Pire encore : les champs de don-
nées ne sont pas de longueur fixe et vous ne pouvez donc pas utiliser la fonction
MID sans un minimum de peaufinage. Mais si, pour votre malheur, les données
de chaque cellule ressemblent à NC1800230AR7801CL486EXFX2J, il existe une
solution à votre problème.
En réalité, les données se répartissent de la manière suivante : NoCde
NC1800230, Article AR7801, Client CL486, Expédition FedEx Deuxième jour.
Comment le découvrir ? Cette méthode repose autant sur l’intelligence que sur
les compétences. L’intelligence permet de déterminer que le début de chaque
champ représente un code distinct. Dans notre exemple, les sept premiers carac-
tères représente le numéro de commande NC1800230. Le champ NoCde com-
mence par les lettres NC, qui dans notre exemple, ne se retrouvent nulle part
ailleurs dans la chaîne. On a employé la même technique de marquage pour
libeller l’article (AR), le client (CL) et la méthode d’expédition (EX).
Chapitre 9

Remarque Pour vous préserver contre toute occurrence errante des repères,
placez chaque repère entre crochets, comme <NC> ou <AR>. Ce système de
balisage est similaire à celui des langages HTML (Hypertext Markup Language)
et XML (Extensible Markup Language). Il fonctionne avec d’autres systèmes
qui ne doivent pas encoder les crochets comme des valeurs.

À l’heure de localiser des chaînes au sein d’autres chaînes, la compétence permet


de connaître l’usage des fonctions SEARCH (CHERCHE) et FIND (TROUVE).
Ces deux fonctions retournent un certain nombre de caractères extraits d’une
chaîne dans laquelle se trouve un caractère ou une chaîne de texte spécifique. Les
différences de fonctionnement de ces fonctions sont minimes mais importantes.
Voici leur syntaxe :

find_text, within_text, star_num)


SEARCH(f
CHERCHE(ttexte_cherché; texte; no_départ)
find_text; within_text; star_num)
FIND(f
texte_cherché; texte; no_départ)
TROUVE(t

find_text (texte_cherché) représente le texte à trouver. Avec la fonction SEARCH,


vous pouvez employer des caractères génériques, un point d’interrogation (?) et
un astérisque (*) dans find_text. Le point d’interrogation représente n’importe
quel caractère, alors que l’astérisque correspond à une suite de caractères. Pour
localiser un vrai point d’interrogation ou astérisque, saisissez un tilde (~) avant
le caractère. La fonction SEARCH n’est pas sensible à la casse, autrement dit si
vous cherchez un « e » la fonction récupère également les « E ». La fonction
FIND est sensible à la casse et n’autorise pas l’utilisation des caractères généri-
ques. En fait, on peut la considérer comme une version plus précise de la fonc-
tion SEARCH. Avec la fonction FIND, si vous cherchez « e », vous ne récupèrerez
pas « E ».

222
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


● within_text (texte) représente le texte dans lequel vous recherchez
texte_cherché.
● star_num (no_départ) représente le numéro du caractère dans texte à par-
tir duquel la recherche débute. Si vous ignorez ce paramètre, la recherche
commence au début de la chaîne (soit no_départ = 1).
L’avantage des fonctions SEARCH et FIND prend toute sa valeur lorsqu’on les
combine avec la fonction MID. Après avoir localisé le début de deux champs
consécutifs avec la fonction SEARCH ou la fonction FIND, servez-vous de la
fonction MID pour extraire la partie souhaitée de la chaîne. Vous devez néan-
moins être au fait de l’une ou l’autre subtilité. Bien que la fonction MID fasse
partie du package VBA standard, ce n’est pas le cas des fonctions SEARCH et
FIND. Vous devez donc utiliser l’objet Application.WorksheetFunction pour
appeler ces fonctions, comme dans l’exemple suivant :

Application.WorksheetFunction.Search("AR", ActiveCell.Value)

Remarque La fonction VBA INSTR (CAR) retourne également la position du

Chapitre 9
caractère dans une chaîne qui commence par une autre chaîne, mais cette
fonction est équivalente à la fonction FIND en ce qu’elle est sensible à la
casse.

Reprenons notre scénario cauchemardesque dans lequel les enregistrements des


commandes ont été incorrectement importés. Nous allons utiliser les fonctions
SEARCH et MID pour localiser le début et la fin des valeurs de chaque champ,
puis écrire ces valeurs dans une cellule, comme dans la procédure suivante :

Public Sub SeparateValues()

Dim MyCell As Range


Dim intAR, intCL, intEX As Integer
Dim strFirst, strLast, strAllCells As String

strFirst = InputBox("Saisissez l'adresse de la première cellule.")


strLast = InputBox("Saisissez l'adresse de la dernière cellule.")
strAllCells = strFirst & ":" & strLast

For Each MyCell In Range(strAllCells).Cells

Range(MyCell.Address).Select

intAR = Application.WorksheetFunction.Search("AR", MyCell.Value)


intCL = Application.WorksheetFunction.Search("CL", MyCell.Value)
intEX = Application.WorksheetFunction.Search("EX", MyCell.Value)

ActiveCell.Offset(0, 2).Value = Mid(MyCell.Value, 1, intAR - 1)


ActiveCell.Offset(0, 3).Value = Mid(MyCell.Value, intAR, intCL -
intAR)
ActiveCell.Offset(0, 4).Value = Mid(MyCell.Value, intCL, intEX -
intCL)
ActiveCell.Offset(0, 5).Value = Mid(MyCell.Value, intEX)

223
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Next MyCell

End Sub

Cette procédure récupère les chaînes des cellules qui se trouvent dans une plage
saisie par l’utilisateur (A2:A21 dans cet exemple) et écrit les valeurs des compo-
sants dans les cellules situées à droite, comme le montre la figure 9.2.
Chapitre 9

Figure 9-2. Les fonctions SEARCH et MID permettent d’extraire les parties
intéressantes de chaînes de texte.

Remarque Si vous connaissez la longueur de chaque champ ou cellule, vous


pouvez vous dispenser de calcul pour déterminer le début de chaque chaîne.

224
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Au Quotidien
Traitement de texte et cookies de navigation

La gestion d’un site web d’entreprise représente une charge de travail impor-
tante pour les administrateurs et, dans la plupart des cas, des dépenses
substantielles pour l’entreprise. Une partie de la tâche des administrateurs
consiste à justifier l’argent et le temps dépensés sur le site. Si la programma-
tion est limitée au sein du site et que vous l’administrez sans programmation,
vous vivez sans doute dans la crainte que l’on vous demande de traiter les
informations stockées dans les cookies que votre serveur web place sur les
ordinateurs des clients. La programmation des cookies sort de la portée de ce
livre, certains se composent d’une unique chaîne qui code les activités de l’uti-
lisateur d’une manière très similaire aux chaînes de commande que nous
av o n s v u e s p l u s t ô t d a n s c e c h a p i t r e : p a r e x e m p l e , l a c h a î n e
UI007589TM37900.77589 pourrait constituer le texte d’un cookie, où
007589 représente le numéro d’identification utilisateur du visiteur et
37900.77589 correspond à la chaîne date/heure indiquant la dernière visite

Chapitre 9
de l’utilisateur (qui, dans ce cas, était le 10/06/2003 à 06:37).

Nombres
Les rubriques que nous allons étudiées dans les prochaines sections font partie
du fonctionnement standard d’une feuille de calcul Excel et non de la program-
mation VBA. Ceci dit, les calculs financiers sont souvent employés dans le cadre
de l’entreprise et nous les avons inclus dans ce livre. Ces fonctions sont traitées
dans le contexte des routines VBA, mais nous examinerons suffisamment
d’exemples d’utilisation des fonctions financières dans les feuilles de calcul pour
vous permettre d’apprendre à les exploiter dans des formules.

Analyse des données


Le tableur Excel propose de nombreuses méthodes pour analyser les données.
Toutefois, il n’est pas toujours évident de connaître leur existence, en particulier
pour des utilisateurs novices. Le tableau 9.2 liste les opérations mathématiques
(et quelques autres opérations) qui permettent d’analyser les données d’une
feuille de calcul.
Tableau 9-2. Calculs d’analyse standards disponibles dans
Excel et Excel VBA
Fonction Excel Fonction VBA Description
MOYENNE AVERAGE Renvoie la moyenne arithmétique
des arguments
NB COUNT Compte le nombre de cellules dans
une plage

225
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 9-2. Calculs d’analyse standards disponibles dans


Excel et Excel VBA (Suite)
Fonction Excel Fonction VBA Description
NBA COUNTA Compte le nombre de cellules non
vides dans une plage
NB.VIDE NBCOUNTBLANK Compte le nombre de cellules vides
dans une plage
NB.SI(plage; critère) COUNTIF(range, Compte le nombre de cellules dans
criteria) une plage qui correspondent au
critère donné
MAX MAX Renvoie la valeur maximale de la
plage
MEDIANE MEDIAN Renvoie la ou les valeur(s)
médiane(s) (la valeur ou la paire de
valeurs le plus près de la moyenne)
de la plage
Chapitre 9

MIN MIN Renvoie la valeur minimale de la


plage
MODE MODE Renvoie la valeur la plus commune
de la plage
ECARTYPE STDEV Renvoie l’écart des valeurs de la
plage
SOMME SUM Renvoie la somme arithmétique des
valeurs de la plage
SOMME.SI(plage; COUNTIF(range, Renvoie la somme arithmétique des
critère) criteria) valeurs de la plage qui répondent au
critère

Maintenant que vous connaissez les fonctions d’analyse de base comment vos
collègues peuvent-ils savoir lesquelles utilisées ? C’est simple : vous le leur indi-
quez en listant les opérations disponibles dans une cellule, un commentaire ou
une zone de texte que vous placez en regard des données.
La procédure suivante est un exemple de la manière de procéder pour permettre
à vos collègues d’identifier les données à analyser et de sélectionner l’opération
appropriée.

Remarque Dans cette version de la procédure, nous avons utilisé une ins-
truction Select Case dans laquelle nous avons inclus le code qui effectue cha-
que calcul. Il est également possible de créer une fonction par opération et
d’appeler cette fonction à partir de l’instruction Case correspondante. On peut
aussi demander à l’utilisateur de saisir un numéro d’opération à effectuer au
lieu de son nom. Pour éviter les erreurs d’orthographe ou de capitalisation, les
valeurs doivent correspondre exactement.

226
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


Public Sub Analyse()
Dim intColNumber As Integer
Dim strOperation, strCriteria As String
Dim sngResult As Single

MsgBox ("Sélectionnez une cellule du tableau à analyser. " _


& "Saisissez le numéro, sans la lettre, représentant la colonne des " _
& "cellules à analyser.")

intColNumber = InputBox("Quelle colonne voulez-vous analyser ?")


strOperation = InputBox("Quelle opération voulez-vous effectuer ?" _
& " Les options sont Somme, SommeSi, Max, Min, Nb, NbVal, NbVide, " _
& "NbSi, Moyenne, Mode, EcartType. (Saisissez-les exactement telles qu’elles
s’affichent.)")
With ActiveCell.CurrentRegion.Columns(intColNumber)
Select Case strOperation
Case "Somme"
sngResult = Application.WorksheetFunction.Sum(.Cells)
MsgBox ("La somme de la colonne est " & sngResult & ".")
Case "SommeSi"
strCriteria = InputBox("Saisissez un critère pour la méthode en " _

Chapitre 9
& "tapant un nombre seul ou précédé d’un des opérateurs " _
& ">, < ou =.")
sngResult = Application.WorksheetFunction.SumIf(.Cells, strCriteria)
MsgBox ("La somme des valeurs est " & sngResult & ".")
Case "Max"
sngResult = Application.WorksheetFunction.Max(Cells)
MsgBox ("La valeur maximale de la colonne est " & sngResult & ".")
Case "Min"
sngResult = Application.WorksheetFunction.Min(.Cells)
MsgBox ("La valeur minimale de la colonne est " & sngResult & ".")
Case "Nb"
sngResult = Application.WorksheetFunction.Count(.Cells)
MsgBox ("Le nombre de cellules dans la colonne est " & sngResult & ".")
Case "NbVal"
sngResult = Application.WorksheetFunction.CountA(Cells)
MsgBox ("Le nombre de cellules non vides est " & sngResult & ".")
Case "NbVide"
sngResult = Application.WorksheetFunction.CountBlank(.Cells)
MsgBox ("Le nombre de cellules vides est " & sngResult & ".")
Case "NbSi"
strCriteria = InputBox("Saisissez un critère pour la méthode en " _
& "tapant un nombre seul ou précédé d’un des opérateurs " _
& ">, < ou =.")
sngResult = Application.WorksheetFunction.CountIf(.Cells, strCriteria)
MsgBox ("Le nombre de cellules qui satisfont au critère est " & sngResult
& ".")
Case "Moyenne"
sngResult = Application.WorksheetFunction.Average(.Cells)
MsgBox ("La moyenne des valeurs est " & sngResult & ".")
Case "Mode"
sngResult = Application.WorksheetFunction.Mode(.Cells)
MsgBox ("La valeur la plus commune est " & sngResult & ".")
Case "EcartType"
sngResult = Application.WorksheetFunction.StDev(.Cells)
MsgBox ("L’écart type des valeurs est " & sngResult & ".")

227
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Case Else
MsgBox ("Opération non reconnue. Recommencez.")
End Select
End With
End Sub

Remarque Vous avez probablement remarqué le travail économisé avec l’ins-


truction With ActiveCell.CurrentRegion. Columns(intColNumber) dans la
procédure Analyse. Sans l’instruction With, le code de référence de la plage
parcourt chaque ligne, ce qui le rend difficile à lire. Recherchez toujours ce
type d’opportunité pour simplifier votre code.

Calculs financiers
L’un montant du remboursement mensuel d’un prêt représente sans doute l’un
des calculs financiers les plus exploités. Pour ce calcul, vous utilisez la fonction
PMT (VPM), dont voici la syntaxe :

rate, nper, pv, fv, type)


Chapitre 9

PMT(r
taux;n
VPM(t npm;v
va;vc;type)

Le tableau 9.3 décrit les cinq arguments utilisés avec la fonction PMT (VPM).
Tableau 9-3. Arguments de la fonction PMT (VPM)
Arguments de Arguments de
la fonction la fonction
PMT VPM Description
rate taux Taux d’intérêts, à diviser par 12 pour
obtenir le montant mensuel des
paiements
nper npm Nombre total de paiements du prêt
pv va Montant global emprunté (pv (va)
représente la valeur actuel ou principal)
fv vc Solde à obtenir après avoir effectué le
dernier paiement (généralement vide, ce
qui indique 0)
type type 0 ou 1. Indique si les paiements sont
effectués en début ou en fin de mois
(généralement vide, ce qui indique 0, soit
la fin du mois)

Pour emprunter €20 000 avec un taux d’intérêts de 8% et un remboursement en


24 mois, écrivez la formule suivante dans une cellule de votre feuille de calcul :
=VPM(8%/12; 24; 20000), ce qui donne un paiement mensuel de €904,55. Dans
VBA, vous pouvez utiliser l’objet Application.WorksheetFunction pour appeler la
fonction PMT dans une procédure VBA. L’exemple ci-après suppose que le taux

228
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


se trouve dans la cellule B2, le nombre de mensualités dans la cellule B3, la
somme empruntée dans la cellule B4, le solde après le dernier paiement du prêt
(toujours 0) dans la cellule B5 et l’échéance du paiement (laissée vide pour utili-
ser la valeur par défaut) dans la cellule B6.

Public Function MonthlyPayment(rate, nper, pv, fv, when) As Currency


With Application.WorksheetFunction
MonthlyPayment = .Pmt(rate / 12, nper, pv, fv, when)
End With
End Function

Public Sub Payment()


MsgBox (MonthlyPayment(Range("B2"), Range("B3"), Range("B4"), _
Range("B5"), Range("B6")))
End Sub

Attention Remarquez que dans la fonction MonthlyPayment l’argument type


est remplacé par when. En effet, type est un mot réservé dans VBA et Excel
génère une erreur au moment de la compilation.

Chapitre 9
Certaines fonctions de feuille de calcul Excel permettent de déterminer la partie
d’un paiement dédiée aux intérêts et celle dédiée au principal du prêt. Ces calculs
sont importants dans le cadre de la déclaration d’impôts. Par exemple, si les inté-
rêts du prêt de votre maison sont déductibles des impôts, il peut être intéressant
de connaître exactement la part des intérêts et la part du principal dans vos men-
sualités. La fonction de feuille de calcul IPMT (INTPER) permet de calculer la
part dédiée aux intérêts. Sa syntaxe est similaire à celle de la fonction PMT, à
quelques différentes près :

rate, per, nper, pv, fv, type)


IPMT(r
taux;p
INTPER(t pér;n
npm;v
va;vc;type)

Les arguments rate (taux), pv (va), fv (vc) et type (type) ont la même signification
que dans la fonction PMT, mais il y a un nouvel argument : per (pér) qui repré-
sente la période pour laquelle vous voulez calculer les intérêts. La valeur doit être
comprise entre 1 et nper (npm). Par exemple, pour déterminer la part mensuelle
dédiée aux intérêts, servez-vous de la procédure suivante, qui place le résultat
dans la cellule active :

Public Sub DetermineInterest()


Dim intRate, intPer, intNper As Integer
Dim curPv, curInterest As Currency

intRate = InputBox("Quel est le taux d’intérêt (sous forme


d’entier) ?")
intPer = InputBox("Pour quel mois souhaitez-vous connaître les
intérêts ?")
intNper = InputBox("En combien de paiements voulez-vous rembourser
le prêt ?")
curPv = InputBox("Quelle somme avez-vous empruntée ?")

229
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


With Application.WorksheetFunction
curInterest = -1 *(.IPmt(intRate / 1200, intPer, intNper,
curPv))
End With

ActiveCell.Value = curInterest
End Sub

Remarque Cette procédure multiplie curInterest par –1 pour produire un


résultat positif. Il est vrai que le montant est négatif, mais on préfère généra-
lement voir les paiements en nombres positifs.

Pour lister la contribution de chaque paiement aux intérêts, ajoutez une boucle
For...Next autour du calcul de l’intérêt périodique, ce qui place les résultats dans
une colonne commençant à la cellule active.

Public Sub DetermineAllInterest()


Dim intRate, intPer, intNper, intPayment As Integer
Dim curPv, curInterest As Currency
Chapitre 9

intRate = InputBox("Quel est le taux d’intérêt (nombre entier


uniquement) ?")
intNper = InputBox("Combien de paiements allez-vous faire sur le
prêt ?")
curPv = InputBox("Quelle somme avez-vous empruntée ?")

For intPer = 1 To intNper


With Application.WorksheetFunction
curInterest = -1 * (.IPmt(intRate / 1200, intPer, intNper,
curPv))
'Divise par 1200 pour obtenir un pourcentage mensuel (12 mois
* 100 pour cent)
End With

ActiveCell.Value = curInterest
ActiveCell.Offset(1, 0).Activate
Next intPer

End Sub

PPMT (PRINCPER) représente la fonction complémentaire de la fonction


IPMT. Elle détermine la part de remboursement du principal sur un paiement.
La syntaxe de la fonction PPMT est exactement identique à celle de la fonction
IPMT, mais le résultat représente la part du paiement dédiée au principal.
Maintenant que nous avons étudié les fonctions employées pour déterminer les
paiements, et leur répartition entre intérêts et principal, voyons comment inver-
ser le processus et déduire le taux d’intérêts d’un planning de paiements.
D’accord, il n’est pas coutume de rechercher le taux d’intérêt d’un prêt immobi-
lier (puisqu’il est rare qu’on l’oublie et qu’il est écrit sur les formulaires de prêt),
mais pour le cas où vous en auriez besoin, voici comment procéder.

230
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


La syntaxe de la fonction RATE (TAUX) est similaire à celle des fonctions de la
famille PMT.

nper, pmt, pv, fv, type, guess)


RATE(n

npm;v
TAUX(n vpm;v
va;vc;type;estimation)

Il existe quelques différences entre RATE et les autres fonctions PMT. Le


tableau 9.4 récapitule les arguments de la fonction RATE (TAUX).
Tableau 9-4. Arguments de la fonction RATE (TAUX)
Arguments de Arguments de
la fonction la fonction
RATE TAUX Description
nper npm Nombre total de périodes de
remboursement en une annuité.
pmt vpm Montant du remboursement pour chaque
période. Cette valeur peut changer

Chapitre 9
pendant la durée de vie de l’annuité. Si
on omet pmt (vpm), l’argument fv (vc) est
obligatoire.
pv va Valeur actuelle de l’annuité, autrement
dit la valeur que représente à la date
d’aujourd’hui une série de
remboursements ultérieurs.
fv vc Valeur capitalisée, autrement dit le
montant résultant après le dernier
paiement. Si on omet fv (vc), la valeur
par défaut est 0 (par exemple, la valeur
capitalisée d’un emprunt est égale à 0).
type type Nombre 0 ou 1 qui indique quand les
paiements doivent être effectués (0 est
la valeur par défaut, ce qui signifie que
les paiements sont dus à la fin du mois).
guess estimation Votre estimation quant à la valeur du
taux. Si l’argument est omis, la valeur
par défaut est de 10%. Si les résultats
de la fonction RATE (TAUX) ne convergent
pas, essayez différentes valeurs pour
l’argument guess (estimation).
Normalement les résultats de RATE
(TAUX) convergent si guess (estimation)
se situe entre 0 et 1.

231
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Ainsi, pour découvrir le taux d’intérêt d’un prêt immobilier de €150 000 pour
lequel vous remboursez €1 186,19 par mois pendant 15 ans, la formule suivante
détermine le pourcentage annuel du taux de prêt :

=TAUX(180,-1186.19,150000)*12

Il est important de saisir la mensualité (le deuxième paramètre) sous forme d’un
nombre négatif. Pour vous en souvenir, pensez au fait que l’argent quitte votre
compte en banque.

Déterminer la valeur actuelle d’un investissement


La fonction PV (VA), pour present value (valeur actuelle), retourne la valeur
actuelle d’un investissement ce qui, du point de vue financier, correspond à la
somme totale que représente aujourd’hui un ensemble de remboursements
futurs. Lorsque vous faites un emprunt, le montant de l’emprunt représente la
valeur actuelle pour le prêteur. Par exemple, pour calculer la valeur actuelle d’un
prêt de €150 000 à un taux d’intérêt de 5% que vous remboursez mensuelle-
ment pendant 15 ans, utilisez la formule suivante :
Chapitre 9

rate, nper, pmt, fv, type)


PV(r
taux;n
VA(t npm;v
vpm;vc;type)

Dans la formule précédente, rate (taux) représente le taux d’intérêt par période
(généralement un taux annuel divisé par 12), nper (npm) le nombre total de
périodes de paiement (dans ce cas, 12 * 15, soit 180), pmt (vpm) le montant du
remboursement pour chaque période (1 186,19 dans ce cas), fv (vc) la valeur
capitalisée, autrement dit le montant obtenu après le dernier paiement (la valeur
capitalisée d’un prêt est de 0) et type indique si le paiement est du en début ou en
fin de mois (0, la valeur par défaut, signifie que le paiement est du à la fin du
mois et 1 au début). Ainsi, pour le prêt décrit précédemment, on crée la formule
suivante :

=VA(5%/12;180;-1186,19)

La formule précédente génère une valeur actuelle de €150 000, soit le montant
total du prêt. La somme totale des paiements représente €213 514,20, mais la
valeur actuelle du prêt est inférieure puisque, au moment du prêt, les intérêts
n’entrent pas encore en compte. Après 10 ans de paiements, par exemple, le pro-
priétaire du bien immobilier a payé €142 342,80, mais il lui reste 60 paiements à
effectuer !

Déterminer la valeur actuelle nette d’un investissement


NPV (VAN) est une fonction apparentée à PV (VA). Elle calcule la valeur actuelle
nette d’un investissement. La principale différence entre la valeur actuelle et la
valeur actuelle nette réside dans le fait que la première suppose que la valeur de
l’investissement diminue dans le temps en raison de l’inflation ou du taux

232
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA


d’escompte. Cette supposition se reflète dans la syntaxe de la fonction NPV
(VAN) :

rate, value1, value2, value3…)


NPV(r
taux;v
VAN(t valeur1;valeur2;valeur3…)

Une autre différence entre les calculs de la valeur actuelle et de la valeur actuelle
nette est que les valeurs d’une formule NPV (VAN) peuvent varier, alors que
dans un calcul PV (VA) les paiements sont constants sur toute la durée de vie de
l’annuité. Par exemple, vous envisagez peut-être d’investir €5 000 dans un pla-
cement sécuritaire qui vous rapporte €1 000 après la première année, €1 500
après la deuxième, €2 000 après la troisième et €2 500 après la quatrième année.
En supposant que le taux d’inflation soit de 4%, pour évaluer l’investissement,
vous utilisez la formule suivante :

=VAN(4%;-5000;1000;1500;2000;2500)

La formule précédente génère un résultat de €1 214,78. Il n’existe pas de seuil


magique qui détermine si la valeur actuelle nette rend l’investissement rentable.

Chapitre 9
Vous devez comparer le résultat de plusieurs investissements pour déterminer si
vous devez ou non investir votre argent.

Pour plus d’informations sur l’utilisation d’Excel dans des analyses financières, reportez-
vous à l’ouvrage Microsoft Excel pour le business et la finance, par Wayne L. Winston
(Microsoft Press, 2004).

Dates et heures
À l’instar des fonctions de texte et des fonctions numériques décrites précédem-
ment dans ce chapitre, la manipulation des dates et des heures relève davantage
du domaine d’une formule Excel que de VBA. Il est cependant important de
savoir travailler avec des dates et des heures dans le cadre des tâches avancées
d’Excel.

Numéros de série des dates et des heures


Si vous avez déjà saisi une date dans une cellule de feuille de calcul puis lui avez
appliqué le format Standard ou Nombre, vous avez vu la date convertie en nom-
bre. Par exemple, si vous saisissez la date du 6 octobre 2003 dans une cellule et
que vous lui appliquez ensuite le format Standard, la valeur de la cellule devient
37900. En effet, Excel traite les dates et les heures comme des nombres et non
comme des chaînes. Dans Excel, le comportement par défaut du programme
consiste à compter à partir du 1er janvier 1900, autrement dit le 1er janvier 1900
représente le jour 1, le 2 janvier 1900 représente le jour 2, et ainsi de suite. Cette
représentation des dates simplifie le calcul du nombre de jours entre deux événe-
ments. Par exemple, il a fallu 1986 jours à une société fondée le 2 août 1998 qui
est devenue bénéficiaire à compter du 9 janvier 2004 pour atteindre son seuil de
rentabilité.

233
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Important Les dates antérieures au 1er janvier 1900 sont traitées comme
des chaînes. Vous ne pouvez pas les manipuler avec les fonctions de date étu-
diées dans la prochaine section, mais elles sont acceptées comme entrées
valides.

Fonctions de date et d’heure


Les fonctions de date ou d’heure sont utiles dans bien des circonstances. Si vous
vous servez d’Excel pour suivre des commandes passées à votre entreprise, faites
appel au code VBA suivant pour saisir la date et l’heure d’une commande :

ActiveCell.Value = Now

Vous pouvez également saisir la date et l’heure actuelle dans une cellule de feuille
de calcul avec la formule EXCEL =MAINTENANT, mais si vous n’avez pas rem-
placer la formule par sa valeur en cliquant sur le bouton Copier, puis sur la flèche
du bouton Coller pour en afficher les options pour choisir Valeurs, Excel recal-
cule la formule chaque fois que vous ouvrez le classeur et remplace l’heure de la
Chapitre 9

commande par l’heure en cours. Pour éviter ce problème, créez une macro qui
assigne la valeur Maintenant à la cellule active.
NOW (MAINTENANT) n’est pas la seule fonction de date ou d’heure disponi-
ble dans VBA. Le tableau 9.5 liste et décrit les fonctions disponibles.
Tableau 9-5. Fonctions de date et d’heure
Fonction Fonction
Excel VBA Description
Date Date Renvoie la date en cours.
Heure Time Renvoie l’heure en cours.
Maintenant Now Renvoie la date et l’heure en cours.
/ Timer Retourne le nombre de secondes depuis minuit.
DateVal DateValue En fonction d’une chaîne de caractères, comme
« 2 août 2004 », renvoie une date (par exemple,
02/08/2004).
TemspVal TimeValue En fonction d’une chaîne de caractères, comme
« 19:30 », renvoie une heure (par exemple,
19:30:00).
/ DateSerial En fonction d’une année, d’un mois et d’un jour
(year, month, (par exemple, DateSerial(2, 8, 2004), renvoie la
day) date (02/08/2004).
/ TimeSerial En fonction d’une heure, minute et seconde
(hour, minute, (par exemple, TimeSerial(19, 30, 24), renvoie
second) l’heure (19:30:24).

234
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Tableau 9-5. Fonctions de date et d’heure (Suite)


Fonction Fonction
Excel VBA Description
Heure, Hour, Minute, En fonction d’une heure, renvoie le composant
Minute, Second heure, minute ou seconde de cette heure.
Seconde
Année, Mois, Year, Month, En fonction d’une date, renvoie le composant
Jour Day année, mois ou jour de cette date.
JourSem Weekday En fonction d’une date, renvoie le jour de la
semaine (dimanche = 1, lundi = 2, et ainsi de
suite) de cette date.
/ MonthName En fonction d’un entier, renvoie le mois
correspondant à cet entier (par exemple, 8
renvoie août).

À l’exception des fonctions Weekday et MonthName, pour écrire le résultat de

Chapitre 9
l’une des fonctions de date ou d’heure dans une cellule de feuille de calcul, vous
devez lui appliquer le format Date.
VBA propose un certain nombre d’autres fonctions relatives à la date ou à
l’heure que vous pouvez intégrer à votre code. Le plus intéressantes sont
DateAdd et DateDiff. DateAdd permet d’ajouter un intervalle de temps à une
date ou une heure. Pour ajouter trois jours à la date en cours, servez-vous de la
procédure suivante :

Public Sub AddDays()

Dim datFirst, datSecond As Date


datFirst = #1/9/2004#
datSecond = datFirst + 3
MsgBox ("La nouvelle date est : " & datSecond & ".")

End Sub

Mais comment ajouter un mois à datFirst ? Selon le mois, vous devrez ajouter 28,
30 ou 31 jours. La fonction DateAdd permet d’ajouter une variété d’incréments
d’heure une date ou une heure grâce à une syntaxe ingénieuse :

interval", number, date)


DateAdd("i

où interval représente le code (entre guillemets) de l’unité d’heure, number


représente le nombre d’intervalles à ajouter à la date ou à l’heure et date corres-
pond à la date ou à l’heure à laquelle vous voulez ajouter du temps. Le tableau 9.6
liste les unités disponibles et leurs codes correspondants.

235
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 9-6. Codes des intervalles employés dans la fonction


DateAdd
Unité Code
yyyy Année
q Trimestre (trois mois)
m Mois
ww Semaine
y Jour de l’année
d Jour
W Jour de la semaine
h Heure
n Minute
s Secondes

Par exemple, pour afficher la date située à 9 semaines à partir d’aujourd’hui dans
Chapitre 9

une boîte de message, utilisez la fonction suivante :

MsgBox (DateAdd("ww", 9, DATE))

Pour revenir en arrière dans le temps, servez-vous de valeurs négatives. Par


exemple, pour récupérer l’heure située à 8 heures plus tôt de l’heure présente
(calculer à partir de l’heure de l’horloge système), utilisez

DateAdd("h", -8, NOW)

Remarque Vous pouvez également employer des valeurs négatives dans les
fonctions DateSerial et TimeSerial, décrite précédemment, mais la fonction
DateAdd est plus souple puisqu’elle vous permet d’exploiter différentes unités
de temps.

La fonction DateDiff renvoie le nombre d’unités de temps (mois, années, minu-


tes, et ainsi de suite) entre deux dates ou heures. Sa syntaxe est similaire à celle de
la fonction DateAdd, mais au lieu d’utiliser une date de base et un intervalle pour
déterminer une date de fin, la fonction DateDiff utilise deux dates pour détermi-
ner l’intervalle entre les deux.

interval", date1, date2, firstdayofweek, firstweekofyear)


DateDiff ("i

Le tableau 9.7 liste les arguments de la fonction DateDiff.


Tableau 9-7. Arguments de la fonction DateDiff
Argument Description
Interval Intervalle de temps utilisé dans le tableau 9.6.
Date1 Première date à utiliser dans le calcul.

236
Partie 4 : Fonctions VBA avancées

Manipulation des données avec VBA

Tableau 9-7. Arguments de la fonction DateDiff (Suite)


Argument Description
Date2 Deuxième date à utiliser dans le calcul.
Firstdayofweek Constante qui indique le premier jour de la semaine. S’il
n’est pas spécifié, sa valeur par défaut est dimanche. Les
constantes disponibles sont vbUseSystem (utilise le
paramètre système), vbSunday, vbMonday, vbTuesday,
vbWednesday, vbThursday, vbFriday et vbSaturday.
Firstweekofyear Constante qui indique la première semaine de l’année. Les
constantes disponibles sont vbUseSystem (utilise le
paramètre système), vbFirstJan1 (la valeur par défaut, qui
utilise la semaine contenant le 1er janvier), vbFirstFourDays
(utilise la première semaine d’au moins quatre jours dans la
nouvelle année), vbFirstFullWeek (utilise la première
semaine de sept jours dans la nouvelle année).

Par exemple, la fonction suivante renvoie le nombre de jours entre la date

Chapitre 9
actuelle et le 2 août 2005 (rappelez-vous que la date doit être placée entre signes
dièses) :

DateDiff("d", NOW, #8/2/2005#)

Pour soustraire des heures, il est inutile d’employer un opérateur spécial : l’opé-
rateur de soustraction fonctionne, mais vous risquez des problèmes si vous pas-
sez minuit. Par exemple, si vous travaillez de 9:00 à 18:00, vous avez travaillé neuf
heures, mais si vous soustrayez 0,875 (le numéro de série pour 9:00) de 0,25 (le
numéro de série de 6:00) vous obtenez un nombre négatif, ce que vous ne pouvez
pas obtenir avec des numéros de série d’heure. L’astuce consiste à ajouter un jour
à la plus petite des valeurs pour réussir la soustraction. En ajoutant 1 au numéro
de série de 6:00, on obtient l’équation 1,25 – 0,875, ce qui donne 0,375 (neuf
heures ou 9:00). Voici comment mettre cette vérification en œuvre en VBA :

'datTime1 représente l’heure de départ, datTime2 celle de fin


If datTime1 > datTime2 Then
datTime2 = datTime2 + 1
End If
datDifference = datTime2 – datTime 1

237
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Au Quotidien
Quand les heures dépassent 24 heures

Si vous avez déjà essayé d’additionner deux heures dans une feuille de calcul
Excel, vous aurez noté que le programme ne gère pas correctement les résul-
tats supérieurs à 24 heures. En fait, si on additionne 8:00 (8 heures), 7:00
(7 heures) et 10:00 (10 heures), la cellule qui contient le résultat affiche 1:00
(1 heure) ! Autrement dit, Excel ne tient pas compte des 24 premières heures
et affiche uniquement le nombre d’heures qui dépassent 24. Il se produit le
même résultat avec deux instances de 12:00 (12 heures), en fait, même un
total de 49:00 présente 1:00.

Pour contourner ce problème, formatez la cellule qui contient le résultat dans


un des formats personnalisés disponibles dans la boîte de dialogue Format de
cellule (menu Format, Cellule). Dans la boîte de dialogue Format de cellule, cli-
quez sur la catégorie Personnalisée et localisez le format d’heure suivant :
[h]:mm:ss.
Chapitre 9

Les crochets ([]) qui encadrent le symbole de l’heure signifient que la limite
normale des 24 heures ne s’applique pas : la cellule affiche correctement
25:00. Servez-vous de la même méthode pour afficher plus de 60 minutes
([mm]:ss) ou plus de 60 secondes ([ss]) ou créez un format personnalisé en le
saisissant dans la zone Type. Notez que Excel ne permet pas de créer un for-
mat du type [h]:[mm]:ss. En effet, le nombre des minutes n’étant pas limité, le
nombre d’heures resterait à 0. Sachez également qu’il n’est pas possible de
placer un indicateur de jour ou de mois entre crochets.

Dans ce chapitre, vous avez appris à manipuler les données dans les classeurs
Excel. Avec les fonctions de Excel VBA vous analysez vos données, concaténez les
valeurs de plusieurs cellules pour créer des boîtes de message et gérez les dates et
les heures. Si les fonctions n’existent pas dans Excel VBA, vous pouvez les appeler
à partir du programme Excel principal avec la propriété WorksheetFunction de
l’objet Application.

238
Partie 4 : Fonctions VBA avancées

Chapitre 10
Mise en forme d’objets
Excel
Constantes et palette Polices . . . . . . . . . . . . . . . . . . . . 252
de couleurs Excel . . . . . . . . . . . . 239 Cellules . . . . . . . . . . . . . . . . . . . 254
Éléments de la feuille Bordures . . . . . . . . . . . . . . . . . . 256
de calcul. . . . . . . . . . . . . . . . . . . 250

Dans leur forme d’origine, les feuilles de calcul Microsoft Excel sont relativement
ordinaires : texte en noir sur fond blanc, quadrillage gris délimitant les cellules,
une manière très fonctionnelle de présenter des données. On peut également
préciser le fait que toutes les données sont présentées de manière similaires et
que rien ne distingue une cellule d’une autre exceptée la valeur. Si les données
constituent la part la plus importante d’une feuille de calcul, la présentation a
sont importance.
Dans ce chapitre, vous allez apprendre à exploiter les constantes de couleur et la
palette de couleurs Excel, à modifier la palette de couleurs existante, à passer
outre la limite des 56 couleurs d’Excel et à formater des cellules pour modifier
leurs couleurs de remplissage, de police et de bordures.

Constantes et palette de couleurs Excel


Excel propose un grand nombre d’options de mise en forme, mais l’une des
méthode les plus intéressantes d’attirer l’attention sur un élément consiste à en
modifier la couleur. Les couleurs mettent les données en évidence et simplifient
l’emploi des feuilles de calcul : une couleur de texte différente reflète la valeur
d’une cellule, la couleur d’un onglet de feuille de calcul indique qu’on y a
apporté un changement, un arrière-plan jaune désigne la cellule active, etc.
La manière la plus simple pour assigner une couleur à un élément de feuille de
calcul consiste à utiliser les constantes de couleurs Microsoft VBA, qui représen-
tent les huit couleurs de base disponibles sur un ordinateur. Le tableau 10.1 liste
les constantes et les couleurs qu’elles représentent.
Tableau 10-1. Couleurs de base de l’ordinateur et leurs
constantes
Constante Description Constante Description
vbBlack Noir vbRed Rouge
vbGreen Vert vbYellow Jaune

239
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 10-1. Couleurs de base de l’ordinateur et leurs


constantes (Suite)
Constante Description Constante Description
vbBlue Bleu vbMagenta Magenta
vbCyan Cyan vbWhite Blanc

Pourquoi ces couleurs sont-elles les seules assorties de constantes ? La raison est
liée à la manière dont les couleurs sont créées sur un ordinateur. Vous avez sans
doute déjà étudié le cercle chromatique, probablement en classe, et vous avez
appris que l’on peut combiner les pigments rouges, bleus et jaunes pour créer la
couleur de son choix. Si ceci est vrai pour les pigments (peinture ou encre), ce
n’est pas le cas de la lumière. Pour créer des couleurs à partir de la lumière, on se
sert des trois couleurs primaires : rouge, vert et bleu.
La différence entre les pigments et la lumière s’exprime dans le nom de chaque
système de couleurs : la couleur soustractive, qui se réfère aux pigments, et la cou-
leur additive qui se réfère à la lumière. Dans le système soustractif, on commence
par le blanc (la totalité des couleurs) et, par le biais des pigments, on « soustrait »
les couleurs en les bloquant avec de la peinture. Si on mélange une quantité égale
de couleurs primaires (rouge, jaune et bleu), on obtient du noir puisqu’on a
soustrait toutes les couleurs. Dans le système additif, en revanche, on commence
par le noir (l’absence de couleur ou de lumière) et on ajoute les couleurs. Dans ce
système, si on ajoute du rouge, du vert et du bleu en pleine intensité, on obtient
du blanc.
À l’instar des pigments dont on mélange différentes quantités pour obtenir des
Chapitre 10

couleurs uniques (par exemple, en mélangeant des quantités égales de jaune et


de rouge, on obtient de l’orange, alors qu’en mélangeant davantage de rouge que
de jaune, on obtient un rouge orangé), il est possible de mélanger des quantités
de lumière pour créer différentes couleurs sur l’ordinateur. Le système d’exploi-
tation Microsoft Windows reconnaît 256 intensités de chaque couleur primaire
(rouge, vert et bleu). Une intensité de 0 signifie que l’on n’a pas ajouté de lumière
à la couleur d’un pixel (un point sur l’écran) et une intensité de 255 signifie que
l’on a ajouté la quantité maximum de cette couleur.

Remarque Un pixel se compose en réalité de trois points : l’un qui émet de


la lumière rouge, un autre qui émet de la lumière verte et le troisième qui émet
de la lumière bleue.

Pour définir une couleur avec un mélange de lumière rouge, verte et bleue, on
utilise la fonction Visual Basic RGB dont la syntaxe est la suivante :

red, green, blue)


RGB(r

Dans cette fonction, red représente la quantité de lumière rouge utilisée, green
celle de lumière verte et blue celle de lumière bleue (toute valeur supérieure à 255

240
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel


est considérée comme 255). Le tableau 10.2 liste les valeurs RVB des huit cou-
leurs assignées aux constantes de couleur VBA.
Tableau 10-2. Valeurs RVB des constantes de couleurs VBA
Composante Composante Composante
Constante rouge verte bleue
vbBlack 0 0 0
vbRed 255 0 0
vbGreen 0 255 0
vbYellow 255 255 0
vbBlue 0 0 255
vbMagenta 255 0 255
vbCyan 0 255 255
vbWhite 255 255 255

Remarque Il existe 16 777 216 combinaisons possibles des couleurs RVB,


mais seules les huit couleurs du tableau 10.2 possèdent un nom. Elles repré-
sentent en effet les couleurs les plus simples et les huit combinaisons dispo-
nibles lorsque l’intensité de chaque pixel est maximale ou minimale.

Vous pouvez utiliser la fonction RGB pour appliquer directement une couleur à
un élément de la feuille de calcul, mais Excel présente une limite importante : le
programme ne peut afficher simultanément que les 56 couleurs qu’il conserve

Chapitre 10
dans la palette de couleurs. Si vous tentez d’assigner à un élément une couleur
absente de la palette, Excel affiche la couleur de la palette la plus proche.
Le tableau 10.3 liste les valeurs RVB des couleurs assignées à chaque entrée de la
palette de couleurs Excel standard, ainsi que son nom.
Tableau 10-3. Valeurs RVB des couleurs Excel standard
Composante Composante Composante
Nom rouge verte bleue
Noir (couleur 1) 0 0 0
Blanc (couleur 2) 255 255 255
Rouge (couleur 3) 255 0 0
Vert (couleur 4) 0 255 0
Bleu (couleur 5) 0 0 255
Jaune (couleur 6) 255 255 0
Magenta (couleur 7) 255 0 255
Cyan (couleur 8) 0 255 255
Couleur 9 128 0 0
Couleur 10 0 128 0

241
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 10-3. Valeurs RVB des couleurs Excel standard (Suite)


Composante Composante Composante
Nom rouge verte bleue
Couleur 11 0 0 128
Couleur 12 128 128 0
Couleur 13 128 0 128
Couleur 14 0 128 128
Couleur 15 192 192 192
Couleur 16 128 128 128
Couleur 17 153 153 255
Couleur 18 153 51 102
Couleur 19 255 255 204
Couleur 20 204 255 255
Couleur 21 102 0 102
Couleur 22 255 128 128
Couleur 23 0 102 204
Couleur 24 204 204 255
Couleur 25 0 0 128
Couleur 26 255 0 255
Couleur 27 255 255 0
Couleur 28 0 255 255
Chapitre 10

Couleur 29 128 0 128


Couleur 30 128 0 0
Couleur 31 0 128 128
Couleur 32 0 0 255
Couleur 33 0 204 255
Couleur 34 204 255 255
Couleur 35 204 255 204
Couleur 36 255 255 153
Couleur 37 153 204 255
Couleur 38 255 153 204
Couleur 39 204 153 255
Couleur 40 255 204 153
Couleur 41 51 102 255
Couleur 42 51 204 204
Couleur 43 153 204 0
Couleur 44 255 204 0

242
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

Tableau 10-3. Valeurs RVB des couleurs Excel standard (Suite)


Composante Composante Composante
Nom rouge verte bleue
Couleur 45 255 153 0
Couleur 46 255 102 0
Couleur 47 102 102 153
Couleur 48 150 150 150
Couleur 49 0 51 102
Couleur 50 51 153 102
Couleur 51 0 51 0
Couleur 52 51 51 0
Couleur 53 153 51 0
Couleur 54 153 51 102
Couleur 55 51 51 153
Couleur 56 51 51 51

Après les huit couleurs assignées aux constantes Visual Basic, les noms des cou-
leurs reflètent leur position au sein de l’index de la palette. Ce choix est logique,
si l’on sait qu’il est possible (en tant qu’utilisateur du programme principal
Excel) d’assigner de nouvelles valeurs RVB à n’importe quel emplacement de la
palette.

Chapitre 10
Remarque La palette de couleurs à laquelle il est fait référence ici est diffé-
rente de celle affichée dans le programme Excel principal. Elle est uniquement
employée comme représentation interne des couleurs.

Pour assigner une couleur à un élément d’une feuille de calcul, on se réfère à sa


position dans la palette de couleurs Excel. Pour ce faire, on utilise la propriété
Colors de l’objet Workbook, dont voici la syntaxe :

Workbook.Colors (index)

Dans le code précédent, index représente un numéro entre 1 et 56. Dans un gra-
phique en secteurs représentant chacun l’un des 100 produits commercialisés
par votre entreprise, certaines couleurs seront répétées. Ce n’est pas si grave, il
suffit de les éloigner suffisamment dans le graphique de sorte qu’il soit simple de
différencier chaque segment. En alternative, vous pouvez créer un graphique qui
représente la proportion des ventes attribuées aux 50 produits les plus vendus
(avec un segment représentant les 50 autres produits), puis diviser les ventes des
produits restants sur un autre graphique.

243
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Palette de couleur Excel standard


Sachant que vous êtes limité à la palette de couleurs en cours, vous serez proba-
blement intéressés par une procédure qui permet d’afficher les couleurs qu’elle
héberge. C’est le but de la procédure DisplayPalette.

Sub DisplayPalette()
Range("A1").Select
ActiveCell.Formula = "Couleur"
ActiveCell.Offset(0, 1).Formula = "Index"
ActiveCell.Offset(1, 0).Activate
For NumColor = 1 To 56
With ActiveCell.Interior
.ColorIndex = NumColor
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
ActiveCell.Offset(0, 1).Formula = NumColor
ActiveCell.Offset(1, 0).Activate
Next NumColor
End Sub

Attention Une version de cette procédure a été publiée sur la Base de con-
naissances Microsoft à l’adresse http://support.microsoft.com/support/kb/
articles/q149/1/70.asp, mais elle contient une erreur de nommage d’une
variable qui lui fait répéter la même couleur dans les 56 cellules. Pour vous
entraîner au débogage, exécutez le code, voyez le résultat et essayez de loca-
liser le problème (à condition que le problème n’ait pas été corrigé).
Chapitre 10

Que faire si les couleurs proposées dans la palette ne répondent pas à vos
attentes ? Il n’est pas rare qu’une entreprise possède une convention de couleurs
pour ses logos et ses documents officiels. Pour éviter d’employer une couleur
inexacte, vous pouvez remplacer une couleur existante par une couleur person-
nalisée.
Pour assigner une nouvelle couleur à un emplacement de la palette de couleurs
du programme Excel, procédez comme suit :
1 Dans le menu Outils, choisissez Options et cliquez sur l’onglet Couleur.

244
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

2 Cliquez sur la couleur à remplacer puis sur Modifier. Si la couleur qui


convient se trouve dans l’onglet Standard de la boîte de dialogue Cou-
leurs, sélectionnez-la et cliquez sur OK. Dans le cas contraire, cliquez sur
l’onglet Personnalisées.
3 Dans la liste déroulante Palette de couleurs, vérifiez que l’élément RVB est
sélectionné.
4 Saisissez les composants Rouge, Vert et Bleu dans les zones appropriées.
Pour assigner une couleur à une position de la palette de couleurs avec VBA, une
ligne de code suffit.

ActiveWorkbook.Colors (index) = RGB (red, green, blue)

Mais quelles couleurs faut-il remplacer ? L’une de celles que vous n’emploierez

Chapitre 10
pas, bien sûr, mais la palette standard contient quelques doublons. Pourquoi ?
Aucun indice, mais les voici :
● La couleur 32 duplique la couleur 5 (bleu).
● La couleur 27 duplique la couleur 6 (jaune).
● La couleur 26 duplique la couleur 7 (magenta).
● La couleur 28 duplique la couleur 8 (cyan).
● La couleur 30 duplique la couleur 9.
● La couleur 29 duplique la couleur 13.
● La couleur 31 duplique la couleur 14.
● La couleur 54 duplique la couleur 18.
● La couleur 34 duplique la couleur 20.

Commencez par remplacer les couleurs dont le numéro est élevé, en particulier
si vous substituez une couleur désignée par l’une des constantes de couleur VBA.
La procédure suivante ajoute un nouveau jeu de couleurs à la palette du classeur
actif en se servant des couleurs 26, 27, 28, 29 et 30 :

Sub CustomColors()
ActiveWorkbook.Colors(26) = RGB(240, 248, 255)

245
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


ActiveWorkbook.Colors(27) = RGB(138, 43, 226)
ActiveWorkbook.Colors(28) = RGB(165, 42, 42)
ActiveWorkbook.Colors(29) = RGB(255, 250, 205)
ActiveWorkbook.Colors(30) = RGB(199, 21, 133)
End Sub

Si vous exécutez maintenant la procédure DisplayPalette, vous noterez de nou-


velles couleurs aux positions 26, 27, 28, 29 et 30.

Astuce Passer outre la limite des couleurs


Si vous atteignez la limite des 56 couleurs et manquez de couleurs pour le
logo de votre entreprise, insérez-le sous forme d’une image. Les couleurs des
images ne sont pas comptabilisées dans la limite des 56 couleurs.

Il n’est guère compliqué de modifier la palette de couleurs d’un classeur. En


revanche, si vous devez la modifier manuellement pour chaque classeur, vous
préférerez sans doute trouver une autre solution. Vous pouvez, par exemple,
écrire une macro qui copie la palette de couleurs entre une classeur quelconque
et le classeur actif. Pour ce faire, outre les instructions Sub et End Sub standard,
on utilise à la propriété Colors de la collection Workbooks. En supposant que le
classeur contenant la palette souhaitée soit intitulé NosCouleurs.xls, servez-vous
de la procédure suivante pour copier la palette de couleurs :

Sub ObtenirNosCouleurs()
ActiveWorkbook.Colors = Workbooks("NosCouleurs.xls").Colors
End Sub
Chapitre 10

Pour copier une palette de couleurs à partir d’un autre classeur dans l’interface
Excel, procédez de la manière suivante :
1 Ouvrez le classeur dont vous voulez copier la palette de couleurs.
2 Dans le menu Outils du classeur où vous voulez la copier et choisissez
Options.
3 Cliquez sur l’onglet Couleur.
4 Dans la liste déroulante Copier les couleurs de, cliquez sur le nom du clas-
seur qui contient la palette de couleurs à copier. Cliquez sur OK.
Si vous avez modifié la palette de couleurs Excel, vous pouvez revenir aux para-
mètres par défaut en appelant la méthode ResetColors de l’objet Workbook,
comme dans la procédure suivante :

Sub NormalColors()
ActiveWorkbook.ResetColors
End Sub

Pour revenir à la palette par défaut dans l’interface Excel, procédez comme suit :
1 Dans le menu Outils, choisissez Options.
2 Cliquez sur l’onglet Couleur.
3 Cliquez sur Par défaut.

246
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

La palette de couleurs Excel et le web


Si vous utilisez régulièrement le web, vous aurez sans doute remarqué que certai-
nes pages s’affichent parfaitement dans un navigateur alors qu’elles constituent
un réel capharnaüm dans un autre : l’interlignage est désactivé, le texte est plus
grand dans certains paragraphes que dans d’autres, les couleurs sont différentes,
et ainsi de suite. Une partie de la difficulté provient des anciens navigateurs qui
ne comprennent pas les nouveaux langages de balisage. Une autre raison est liée
au fait que certains programmes, comme Microsoft FrontPage, créent du code
parfaitement interprété par Microsoft Internet Explorer, mais moins bien par
d’autres navigateurs. Les couleurs ne sont pas différentes des autres instructions
de mise en forme HTML. Elles sont sources d’erreurs et vous devez savoir les évi-
ter.
Commençons par Internet Explorer 4.0. Voici la liste des couleurs nommées
ainsi que les valeurs de couleur RVB associées que le navigateur sait interpréter.
Les navigateurs ne savent pas tous interpréter les noms des couleurs, mais les
principaux en sont capables. Le tableau 10.4 liste les couleurs HTML standard et
leurs valeurs RVB associées de sorte que vous puissiez les ajouter à la palette de
couleurs Excel pour créer un classeur dont l’aspect est correct à l’impression et
sur le web.

Pour plus d'informations sur l’apparence de ces couleurs à l’écran, reportez-vous à la


table des couleurs sur le site MSDN, Microsoft Developer Network, à l’adresse : http://
msdn.microsoft.com/workshop/author/dhtml/reference/colors/colors.asp.

Chapitre 10
Tableau 10-4. Valeurs RVB des couleurs HTML standard
Composante Composante Composante Composante Composante Composante
Couleur rouge verte bleue Couleur rouge verte bleue
aliceblue 240 248 255 antiquewhite 250 235 215
aqua 0 255 255 aquamarine 127 255 212
azure 240 255 255 beige 245 245 220
bisque 255 228 196 black 0 0 0
blanchedalmond 255 235 205 blue 0 0 255
blueviolet 138 43 226 brown 165 42 42
burlywood 222 184 135 cadetblue 95 158 160
chartreuse 127 255 0 chocolate 210 105 30
coral 255 127 80 cornflowerblue 100 149 237
cornsilk 255 248 220 crimson 220 20 60
cyan 0 255 255 darkblue 0 0 139
darkcyan 0 139 139 darkgoldenrod 184 134 11
darkgray 169 169 169 darkgreen 0 100 0
darkkhaki 189 183 107 darkmagenta 139 0 139

247
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 10-4. Valeurs RVB des couleurs HTML standard (Suite)


Composante Composante Composante Composante Composante Composante
Couleur rouge verte bleue Couleur rouge verte bleue
darkolivegreen 85 107 47 darkorange 255 140 0
darkorchid 153 50 204 darkred 139 0 0
darksalmon 233 150 122 darkseagreen 143 188 139
darkslateblue 72 61 139 darkslategray 47 79 79
darkturquoise 0 206 209 darkviolet 148 0 211
deeppink 255 20 147 deepskyblue 0 191 255
dimgray 105 105 105 dodgerblue 30 144 255
firebrick 178 34 34 floralwhite 255 250 240
forestgreen 34 139 34 fuchsia 255 0 255
gainsboro 220 220 220 ghostwhite 248 248 255
gold 255 215 0 goldenrod 218 165 32
gray 128 128 128 green 0 128 0
greenyellow 173 255 47 honeydew 240 255 240
hotpink 255 105 180 indianred 205 92 92
indigo 75 0 130 ivory 255 255 240
khaki 240 230 140 lavender 230 230 250
lavenderblush 255 240 245 lawngreen 124 252 0
lemonchiffon 255 250 205 lightblue 173 216 230
Chapitre 10

lightcoral 240 128 128 lightcyan 224 255 255


lightgolden 250 250 210 lightgreen 144 238 144
rodyellow
lightgrey 211 211 211 lightpink 255 182 193
lightsalmon 255 160 122 lightseagreen 32 178 170
lightskyblue 135 206 250 lightslategray 119 136 153
lightsteelblue 176 196 222 lightyellow 255 255 224
lime 0 255 0 limegreen 50 205 50
linen 250 240 230 magenta 255 0 255
maroon 128 0 0 mediuma 102 205 170
quamarine
mediumblue 0 0 205 mediumorchid 186 85 211
mediumpurple 147 112 219 medium 60 179 113
seagreen
medium 123 104 238 medium 0 250 154
slateblue springgreen
medium 72 209 204 medium 199 21 133
turquoise violetred

248
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

Tableau 10-4. Valeurs RVB des couleurs HTML standard (Suite)


Composante Composante Composante Composante Composante Composante
Couleur rouge verte bleue Couleur rouge verte bleue
midnightblue 25 25 112 mintcream 245 255 250
mistyrose 255 228 225 moccasin 255 228 181
navajowhite 255 222 173 navy 0 0 128
oldlace 253 245 230 olive 128 128 0
olivedrab 107 142 35 orange 255 165 0
orangered 255 69 0 orchid 218 112 214
palegoldenrod 238 232 170 palegreen 152 251 152
paleturquoise 175 238 238 palevioletred 219 112 147
papayawhip 255 239 213 peachpuff 255 218 185
peru 205 133 63 pink 255 192 203
plum 221 160 221 powderblue 176 224 230
purple 128 0 128 red 255 0 0
rosybrown 188 143 143 royalblue 65 105 225
saddlebrown 139 69 19 salmon 250 128 114
sandybrown 244 164 96 seagreen 46 139 87
seashell 255 245 238 sienna 160 82 45
silver 192 192 192 skyblue 135 206 235
slateblue 106 90 205 slategray 112 128 144

Chapitre 10
snow 255 250 250 springgreen 0 255 127
steelblue 70 130 180 tan 210 180 140
teal 0 128 128 thistle 216 191 216
tomato 255 99 71 turquoise 64 224 208
violet 238 130 238 wheat 245 222 179
white 255 255 255 whitesmoke 245 245 245
yellow 255 255 0 yellowgreen 154 205 50

Pour plus d’informations sur la publication de feuilles de calcul et de classeurs Excel sur
le web, reportez-vous au chapitre 25 « Excel et le web ».

Le tableau 10.5 met en correspondance les couleurs de la palette Excel et les cou-
leurs HTML standards.

249
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Tableau 10-5. Couleurs de la palette Excel correspondant aux couleurs


HTML
Couleur Composante Composante Composante
Couleur Excel HTML rouge verte bleue
Couleur 1 (noir) black 0 0 0
Couleur 2 (blanc) white 255 255 255
Couleur 3 (rouge) red 255 0 0
Couleur 4 (vert) lime 0 255 0
Couleur 5 (bleu) blue 0 0 255
Couleurs 6 et 27 yellow 255 255 0
(jaune)
Couleurs 7 et 26 fuschia 255 0 255
(magenta)
Couleurs 8 et 28 aqua 0 255 255
(cyan)
Couleurs 9 et 30 maroon 128 0 0
Couleur 10 green 0 128 0
Couleurs 11 et 25 navy 0 0 128
Couleur 12 olive 128 128 0
Couleurs 13 et 29 purple 128 0 128
Couleurs 14 et 31 teal 0 128 128
Chapitre 10

Couleur 15 silver 192 192 192


Couleur 16 gray 128 128 128
Couleur 19 lightyellow 255 255 204
Couleur 44 gold 255 204 0
Couleur 45 darkorange 255 153 0

Attention Certaines couleurs de la palette Excel ou HTML de cette liste dif-


fèrent légèrement, mais elles sont presque identiques pour l’œil humain.

Éléments de la feuille de calcul


Maintenant que vous maîtrisez le système des couleurs Excel, vous pouvez modi-
fier l’apparence des éléments de votre fenêtre et de votre feuille de calcul : le qua-
drillage et les onglets. Dans la configuration par défaut du classeur Excel, le
quadrillage est gris. Pour adapter sa couleur à votre convenance, attribuez une
valeur RVB ou une constante de couleur personnalisée à la propriété ActiveWin-
dow.GridlineColor. Pour assigner une couleur de la palette Excel, servez-vous de
la propriété ActiveWindow.GridlineColorIndex. Avec la propriété GridlineColo-

250
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel


rIndex vous pouvez revenir à la couleur par défaut en lui attribuant la valeur de
la constante VBA xlColorIndexAutomatic.
La procédure suivante applique la couleur bleu, puis blanc (ce qui rend le qua-
drillage invisible) et enfin la couleur automatique au quadrillage :

Sub CycleGridlines()
MsgBox ("Appliquer la couleur bleu au quadrillage.")
ActiveWindow.GridlineColorIndex = 5
MsgBox ("Appliquer la couleur blanc au quadrillage.")
ActiveWindow.GridlineColor = RGB (255, 255, 255)
MsgBox ("Appliquer la couleur par défaut au quadrillage.")
ActiveWindow.GridlineColorIndex = xlColorIndexAutomatic
MsgBox ("Fin de la procédure.")
End Sub

Remarque La rubrique d’aide de la propriété GridlineColorIndex présente les


couleurs par défaut de la palette de couleurs Excel.

Vous pouvez également modifier l’apparence de l’onglet d’une feuille. Les


onglets se trouvent dans la barre d’onglets, dans la partie inférieure gauche de la
fenêtre Excel. Les onglets affichent par défaut un texte noir sur fond blanc lors-
que la feuille est active et noir sur fond gris dans le cas contraire. Pour mettre en
évidence l’un ou l’autre onglet, modifiez sa couleur en vous servant des proprié-
tés Worksheet.Tab.ColorIndex ou Worksheet.Tab.Color. Par exemple, pour modi-
fier la couleur d’onglet d’une feuille de calcul dont les données ont été modifiées,
placez la procédure suivante dans le module de code associé à la feuille de calcul
à contrôler :

Chapitre 10
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 5
End Sub

Pour plus d'informations sur les événements Excel en général et les actions qui déclen-
chent ou non l’événement Worksheet_Change en par ticulier, repor tez-vous au
chapitre 12, « Événements ».

La figure 10.1 montre deux feuilles de calcul dont on a modifié les onglets avec la
procédure événementielle Worksheet_Change. La feuille de calcul de gauche est
active : Excel affiche une ligne de la couleur de l’onglet sous le nom de la feuille
de calcul. Notez qu’Excel affiche le nom de la feuille de calcul en noir un fond
blanc pour qu’il soit plus lisible. La feuille inactive à droite présente un onglet
dont l’arrière-plan est bleu et le texte blanc, pour indiquer qu’elle a également été
modifiée.

251
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Figure 10-1. Le nom de la feuille active s’affiche de sorte à optimiser la


lisibilité, alors que la couleur des onglets des feuilles inactives prédomine.

Important Placez toujours le code d’un événement de feuille de calcul,


comme Worksheet_Change, dans un module de code associé à une feuille de
calcul à contrôler.
Chapitre 10

Polices
Si vous programmez Excel avec VBA, n’oubliez pas que les données constituent
la partie la plus importante de votre feuille de calcul. Plus les données sont sim-
ples à appréhender et plus votre présentation est efficace.
La majorité des utilisateurs d’Excel apprennent à utiliser les commandes de la
barre d’outils Mise en forme et de la boîte de dialogue Format de cellule dès leurs
débuts dans Excel. Dans ce même esprit, vous devez faire de l’objet Font votre
répertoire VBA de base. Le tableau 10.6 liste et décrit les propriétés de l’objet
Font.

252
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

Tableau 10-6. Propriétés de l’objet Font


Propriété Description
Background La propriété Background, uniquement employée pour le texte
des graphiques, prend pour valeur l’une des trois constantes
Excel suivantes : xlBackgroundAutomatic (qui attribue le
paramètre par défaut de l’élément du graphique),
xlBackgroundOpaque (qui affiche l’arrière-plan de la zone de
texte au-dessus des éléments du graphique) ou
xlBackgroundTransparent (qui permet à la couleur des autres
éléments du graphique de traverser).
Bold Positionnée à True ou False, cette propriété détermine si une
police est affichée en gras.
Color Utilise la propriété RGB pour renvoyer ou définir la couleur de
la police.
ColorIndex Renvoie ou définit une couleur de la police selon une couleur
de la palette Excel.
FontStyle Contient une chaîne qui sert à renvoyer ou définir le style de
police (par exemple, "Bold Italic" ou "Regular"). Les styles
disponibles varient selon la police.
Italic Positionnée à True ou False, cette propriété détermine si le
texte est affiché en italique.
Name Contient une chaîne qui sert à renvoyer ou définir le nom de la
police dans laquelle est affiché le texte.

Chapitre 10
Size Retourne ou définit la taille de la police en points.
Strikethrough Positionnée à True ou False, cette propriété détermine si le
texte est barré d’une ligne horizontale.
Subscript Positionnée à True ou False, cette propriété détermine si le
texte est affiché en indice.
Superscript Positionnée à True ou False, cette propriété détermine si le
texte est affiché en exposant.
Underline Renvoie ou définit le type de soulignement du texte
sélectionné. Le style du soulignement est représenté par
l’une des constantes Excel suivantes : xlUnderlineStyleNone,
xlUnderlineStyleSingle, xlUnderlineStyleDouble,
xlUnderlineStyleSingleAccounting ou
xlUnderlineStyleDoubleAccounting.

La possibilité de créer des formats conditionnels ou des formats qui reflètent la


valeur des données d’une cellule constitue l’un des principaux avantages d’Excel.
Prenons pour exemple la série d’instructions If…Then présentées au chapitre 5
pour modifier la couleur du contenu de la cellule active en fonction de sa valeur.

Sub AvailableCredit()

253
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


With ActiveCell
If .Value = "" Then Exit Sub
If .Value <= 1000 Then .Font.Color = vbRed
If .Value > 1000 Then .Font.Color = vbBlack
If .Value > 4999 Then .Font.Color = vbBlue
If .Value > 9999 Then .Font.Color = vbGreen
End With
End Sub

Si vous ne voulez pas modifier la couleur de tous le contenu de la cellule, faites


appel à la propriété Characters de l’objet Range pour formater une partie de la
valeur de la cellule. Pour désigner les caractères de la valeurs de la cellule à modi-
fier, servez-vous de la syntaxe de la propriété Characters suivante :

start, length)
Characters (s

L’argument start représente le caractère à partir duquel la mise en forme débute


et length indique le nombre de caractères (y compris le premier) à mettre en
forme. Une fois que vous avez identifié les caractères, utilisez la propriété Font de
l’objet Character pour modifier l’apparence des caractères. Par exemple, si dans
une chaîne de suivi de commande, les caractères qui se trouvent de la quatrième
à la huitième position identifient le commercial, on les affiche en gras de la
manière suivante :

Sub HighlightAgent()
Dim MyCell As Range
Dim strFirst, strLast, strAllCells, strCategory As String

strFirst = InputBox("Saisissez la première cellule.")


Chapitre 10

strFirst = InputBox("Saisissez la dernière cellule.")


strAllCells = strFirst & ":" & strLast

For Each MyCell In Range(strAllCells).Cells


Range(MyCell.Address).Select
MyCell.Characters(4, 5).Font.Bold = True
Next MyCell
End Sub

Pour plus d’informations sur la manipulation des chaînes de texte et autres valeurs de
cellules et sur la manière de vérifier si le début et/ou la fin d’une sous-chaîne répond à un
schéma spécifique, reportez-vous au chapitre 9, « Manipulation des données avec VBA ».

Cellules
Dans le cadre de la mise en forme, on divise les cellules en deux sections : l’inté-
rieur et la bordure. À l’instar du quadrillage et des onglets de feuille, il est possi-
ble de modifier la couleur et le motif de remplissage de l’intérieur d’une cellule.
Par exemple, les couleurs de remplissage jaune ou orange clair mettent en évi-
dence les valeurs des cellules formatées. En fait, comme l’illustre la figure 10.2, la
plupart des formats automatiques proposés par Excel exploitent les couleurs
intérieures pour distinguer les en-têtes des données.

254
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel

Figure 10-2. Le Format automatique met en avant les intitulés pour simplifier la
lecture des données.

Pour modifier la couleur ou le motif de remplissage, on fait appel aux propriétés


de l’objet Interior auquel on se réfère par la propriété Interior d’une cellule. Le
tableau 10.7 récapitule les propriétés de l’objet Interior.
Tableau 10-7. Propriétés de l’objet Interior pour la mise en
forme d’une cellule
Propriété Description
Color Détermine la couleur de remplissage d’une cellule avec
une constante de couleur Excel ou une valeur de la
fonction RGB.

Chapitre 10
ColorIndex Détermine la couleur de remplissage d’une cellule avec
une valeur d’index qui se réfère à la palette de couleurs
Excel.
Pattern Détermine le motif employé pour remplir l’intérieur d’une
cellule avec l’une des constantes Excel XlPattern
suivantes : xlPatternAutomatic, xlPatternChecker,
xlPatternCrissCross, xlPatternDown, xlPatternGray16,
xlPatternGray25, xlPatternGray50, xlPatternGray75,
xlPatternGray8, xlPatternGrid, xlPatternHorizontal,
xlPatternLightDown, xlPatternLightHorizontal,
xlPatternLightUp, xlPatternLightVertical, xlPatternNone,
xlPatternSemiGray75, xlPatternSolid, xlPatternUp ou
xlPatternVertical
PatternColor Détermine la couleur du motif de remplissage d’une
cellule avec une constante de couleur Excel ou une
valeur de la fonction RGB.
PatternColorIndex Détermine la couleur du motif de remplissage d’une
cellule avec une valeur d’index qui se réfère à la palette
de couleurs Excel.

255
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Pour visualiser les motifs disponibles, représentés par les constantes Excel de la
propriété Pattern dans le tableau précédent, dans le menu Format, choisissez
Cellules, cliquez sur l’onglets Motifs et faites défiler la liste déroulante Motif.

Il est important de comprendre que les propriétés Color et ColorIndex affectent


un aspect différent de l’intérieur d’une cellule que les propriétés PatternColor et
PatternColorIndex. La couleur par défaut des propriétés PatternColor et Pattern-
Chapitre 10

ColorIndex est le noir (dont le numéro d’index est 1 dans la propriété PatternCo-
lorIndex), mais vous pouvez en changer.
La procédure suivante applique la couleur de remplissage bleu à la cellule active,
ajoute un motif de lignes horizontales minces et noires et applique la couleur de
remplissage blanc :

Sub ChangePattern()
With ActiveCell
.Interior.ColorIndex = 5
MsgBox ("D’accord pour ajouter le motif horizontal ?")
.Interior.Pattern = xlPatternLightHorizontal
MsgBox ("D’accord pour changer la couleur du motif ?")
.Interior.PatternColorIndex = 2
End With
End Sub

Bordures
Pour affecter l’extérieur d’une cellule, on fait appel à la propriété Borders, qui se
trouve être au pluriel. En effet, chaque cellule possède six (oui, six) bordures.
Pour modifier une bordure, on fait appel à l’une des constantes de XlBordersIn-

256
Partie 4 : Fonctions VBA avancées

Mise en forme d’objets Excel


dex pour identifier l’élément de la bordure : xlDiagonalDown, xlDiagonalUp,
xlEdgeBottom, xlEdgeLeft, xlEdgeRight et xlEdgeTop.

Remarque Les constantes xlDiagonalDown et xlDiagonalUp tracent une ligne


entre l’angle supérieur gauche et l’angle inférieur droit de la cellule (xlDiagonal-
Down) ou entre l’angle supérieur droit et l’angle inférieur gauche de la cellule
(xlDiagonalUp)

Lorsque vous référencez la propriété Borders dans le code VBA, Excel crée un
objet Border, dont le tableau 10.8 liste les propriétés.
Tableau 10-8. Propriétés de l’objet Borders
Propriété Description
Color Définit ou renvoie la couleur d’une bordure en se servant de
la fonction RGB.
ColorIndex Définit ou renvoie la couleur d’une bordure en se servant
d’une référence à une position dans la palette de couleurs
Excel ou de l’une des constantes xlColorIndexAutomatic
(attribue la couleur par défaut) ou xlColorIndexNone
(formate une bordure sans couleur).
LineStyle Définit le style de ligne en se servant de l’une des
constantes de xlLineStyle : xlContinuous, xlDash, xlDashDot,
xlDashDotDot, xlDot, xlDouble, xlLineStyleNone ou
xlSlantDashDot.
Weight Définit le poids de la ligne en se servant de l’une des

Chapitre 10
constantes de xlBorderWeight : xlHairline, xlMedium, xlThick
ou xlThin.

Pour désigner la bordure à définir, placez la constante xlBordersIndex appropriée


entre parenthèses après avoir appelé la propriété Borders. Par exemple, la procé-
dure suivante assigne une bordure bleue fine au bord inférieur des cellules de la
plage A1:D1.

Sub BlueBorder()
With Worksheets("Feuil1").Range("A1:D1").Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.Color = vbBlue
End With
End Sub

L’utilisation de la propriété Borders ne présente pas de difficulté particulière.


Pour ajouter une bordure autour d’une plage de cellules, vous pouvez faire appel
à la méthode BorderAround de l’objet Range. Voici la syntaxe de la méthode
BorderAround :

LineStyle, Weight, ColorIndex, Color)


BorderAround(L

257
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Les objectifs des arguments LineStyle, Weight, ColorIndex et Color sont décrits
dans le tableau 10.8, mais vous devez les appeler comme paramètres. Par exem-
ple, pour tracer une fine bordure rouge en pointillés autour de la plage B1:E1,
servez-vous de la procédure suivante :

Sub RedBorder()
Range("B1:E1").BorderAround LineStyle := xlDash, Weight := xlThin, _
Color := vbRed
End Sub

Dans ce chapitre, nous avons étudié comment Excel gère les couleurs, comment
afficher les couleurs dans la palette de couleurs Excel et comment adapter ces
couleurs à vos besoins. Nous avons également fait connaissance avec les proprié-
tés de mise en forme disponibles qui permettent de présenter les données et d’en
simplifier la lecture. Nous avons également décrit comment mettre en évidence
des feuilles de calcul modifiées depuis leur dernier enregistrement.
Chapitre 10

258
Partie 4 : Fonctions VBA avancées

Chapitre 11
Création de macros
complémentaires et de
compléments COM
Présentation des macros Création de compléments
complémentaires . . . . . . . . . . . . 259 d’automatisation et COM . . . . . 267
Boîte de dialogue Macro Construction d’un complément
complémentaire. . . . . . . . . . . . . 260 d’automatisation avec
Création de macros Visual Basic 6 . . . . . . . . . . . . . . 271
complémentaires Excel . . . . . . . 262 Génération d’un complément
Collection AddIns . . . . . . . . . . . . 264 COM avec Visual Basic .NET . . . 277

Ce chapitre introduit le concept de macros complémentaires. Dans ce chapitre,


vous apprendrez ce qu’est une macro complémentaire et comment les charger et
les décharger dans Microsoft Excel. Vous étudierez également certaines des
macros complémentaires proposées dans Excel et découvrirez comment créer les
vôtres.

Présentation des macros complémentaires


Les macros complémentaires étendent les fonctionnalités et les commandes
d’Excel. On les trouve en divers emplacements, y compris dans des fichiers ins-
tallés avec Excel, le site web Microsoft Office (www.microsoft.com/france/office/
prodinfo/default.asp) et les programmes que vous développez. Une fois installée,
une macro complémentaire fonctionne comme toute autre commande de menu
ou fonction.
Il existe trois principaux types de macros complémentaires : les macros complé-
mentaires Excel, les compléments COM et les compléments d’automatisation.
Les macros complémentaires Excel sont basées sur des macros écrites en Micro-
soft Visual Basic pour Applications (VBA) et stockées dans un type de classeur
spécial, appelé Macro complémentaire Microsoft Office Excel (*.xla). On crée les
compléments d’automatisation et COM avec un langage compilé comme
Visual Basic ou Visual C++.
Les macros complémentaires servent essentiellement deux objectifs. Première-
ment, une macro complémentaire permet de développer facilement les fonc-
tionnalités de sorte que l’utilisateur puisse croire qu’elles sont incluses à l’origine

259
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


dans Excel. Autrement dit, les programmeurs et les développeurs tiers peuvent
fournir des outils simples d’emploi qui améliorent la vie de l’utilisateur moyen.
Deuxièmement, les macros complémentaires n’exploitent aucune ressource sys-
tème tant qu’elles ne sont pas explicitement chargées dans Excel. On optimise
ainsi les performances globales d’Excel pour les utilisateurs qui n’utilisent pas ces
capacités supplémentaires.

Boîte de dialogue Macro complémentaire


Pour utiliser une macro complémentaire, vous devez la charger dans Excel. La
boîte de dialogue Macro complémentaire (à laquelle vous accédez par le menu
Outils, Macros complémentaires) contrôle les macros complémentaires chargées
au démarrage d’Excel (voir figure 11.1).

Figure 11-1. La boîte de dialogue Macro complémentaire contrôle les macros


complémentaires chargées dans Excel.

Par défaut, la boîte de dialogue Macro complémentaire présente les macros com-
plémentaires installées avec Excel. Une coche en regard du nom d’une macro
complémentaire indique que celle-ci est chargée. Le tableau 11.1 présente une
liste des macros complémentaires installées avec Excel.
Chapitre 11

Tableau 11-1. Macros complémentaires fournies avec Excel


Macro complémentaire Description
Utilitaire d’analyse Contient des outils et des fonctions d’analyse
financière, statistique et scientifique.
Utilitaire d’analyse - VBA Contient des outils d’analyse financière, statistique
et scientifique auxquels les programmes Visual Basic
pour Applications ont accès.
Assistant Somme conditionnelle Crée une formule qui calcule la somme des données
répondant au critère spécifié.

260
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Tableau 11-1. Macros complémentaires fournies avec Excel (Suite)


Macro complémentaire Description
Outils pour l’Euro Contient des outils pour formater des valeurs en
euros et ajoute la fonction EUROCONVERT qui
simplifie les conversions monétaires.
VBA pour l’Assistant Internet Contient des outils de développement qui aident à la
publication d’informations entre Excel et l’Internet.
Assistant Recherche Crée une formule qui recherche des données dans
une plage en utilisant une valeur de la plage.
Complément Solveur Contient des outils qui calculent les solutions de
scénarios en exploitant des cellules ajustables et
des contraintes.

Installer une macro complémentaire


Pour installer une macro complémentaire, il suffit de cocher la case en regard de
son nom dans la boîte de dialogue Macro complémentaire et de cliquer sur OK.
La macro complémentaire est immédiatement chargée et prête à l’emploi.

Remarque D’autres produits Microsoft comme MapPoint installent des


macros complémentaires que vous pouvez charger dans Excel.

Si la macro que vous souhaitez employer ne se trouve pas dans le boîte de dialo-
gue Macro complémentaire, cliquez sur le bouton Parcourir pour la localiser. Par
défaut, les macros complémentaires créées par l’utilisateur sont stockées dans le
dossier \Documents and Settings\Utilisateur\Application Data\Micro-
soft\AddIns. Rien ne vous empêche cependant de les stocker dans le dossier de
votre choix.

Remarque Si l’une des macros complémentaires fournies par Excel ne s’affi-


che pas dans la boîte de dialogue Macro complémentaire, servez-vous du dis-
que d’installation pour l’installer.
Chapitre 11

Décharger une macro complémentaire


Une fois la macro chargée, elle le reste jusqu’à ce que vous la déchargiez explici-
tement avec la boîte de dialogue Macro complémentaire. Pour ce faire, suppri-
mez simplement la coche en regard de son nom et appuyez sur OK. Au prochain
démarrage d’Excel, la macro complémentaire ne sera pas chargée.

Remarque Si vous avez supprimé une macro complémentaire, toute formule


qui référence des fonctions de cette macro sera actualisée pour refléter le
nom de fichier du classeur contenant la macro. Si vous rechargez la même
macro, la forme d’origine des formules sera restaurée.

261
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Création de macros complémentaires Excel


Une macro complémentaire Excel est un type spécial de classeur contenant un
jeu de macros et de fonctions qui effectuent les tâches de votre choix.

Créer une macro complémentaire


Supposons que vous disposiez d’une feuille de calcul qui calcule un prix net en
fonction d’un prix et d’une remise. Le code pourrait être le suivant :

Public Function PrixNet(Prix, Remise) As Currency

If Remise <= 1 And Remise >= 0 Then


PrixNet = Prix * (1 - Remise)

Else
PrixNet = 0

End If

End Function

Avant d’enregistrer la macro complémentaire, vous actualisez les propriétés du


classeur (en choisissant Fichier, Propriétés). Saisissez au minimum une informa-
tion significative pour la propriété Titre de l’onglet Résumé (voir figure 11.2).
Cette valeur sert à identifier la macro complémentaire dans la boîte de dialogue
Macro complémentaire. Par défaut, Excel stocke les macros complémentaires
dans le répertoire Application Data\Microsoft\AddIns du répertoire Documents
and Settings de l’utilisateur.
Chapitre 11

Figure 11-2. Spécifiez le titre d’une macro complémentaire ainsi que les autres
propriétés du classeur.

262
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Enregistrer la macro complémentaire


Pour enregistrer le classeur en tant que macro complémentaire, dans le menu
Fichier, choisissez Enregistrer sous pour afficher la boîte de dialogue du même
nom (voir figure 11.3). Choisissez le dossier dans lequel vous voulez enregistrer
le fichier et sélectionnez le type de fichier Macro complémentaire Microsoft
Excel (*.xla). Cliquez sur le bouton Enregistrer pour créer la macro complémen-
taire Excel.

Figure 11-3. Sélectionnez le type de fichier Macro complémentaire Microsoft


Excel (*.xla) pour enregistrer un classeur comme macro complémentaire.

Installer la macro complémentaire


Une fois la macro enregistrée, vous pouvez l’installer par le biais de la boîte de
dialogue Macro complémentaire (dans le menu Outils, choisissez Macros com-
plémentaires). Dans cette boîte de dialogue, cliquez sur le bouton Parcourir pour
localiser la nouvelle macro. Placez une coche en regard de son nom et cliquez sur
OK pour l’inclure au classeur en cours (voir figure 11.4).

Chapitre 11

Figure 11-4. Localisez votre nouvelle macro complémentaire et incluez-la à


votre classeur.

263
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Vous pouvez ensuite utiliser la formule suivante dans une cellule :
=PrixNet(D2, E2)

Collection AddIns
La collection AddIns contient le jeu de macros complémentaires disponibles,
qu’elles aient ou non été installées. Les entrées de cette collection correspondent
aux macros de la boîte de dialogue Macro complémentaire. Cette collection per-
met de parcourir les macros complémentaires disponibles pour Excel, d’ajouter
de nouvelles macros et d’installer ou de supprimer des macros au programme.

Tour d’horizon
La collection AddIns constitue un objet de collection classique possédant les pro-
priétés décrites dans le tableau 11.2.
Tableau 11-2. Propriétés de la collection AddIns
Propriété Type Description
Application Object Retourne l’objet Application représentant la créateur de la
macro complémentaire.
Count Long Retourne le nombre total d’objets AddIns dans la collection.
Creator Long Retourne un entier 32 bits contenant la valeur XCEL binaire.
Item(Index) String Retourne l’objet AddIn associé à Index. Si Index est numérique,
elle se réfère à la position relative de l’objet dans la collection.
Si Index est une chaîne, elle retourne une référence à l’objet
AddIn dont la propriété Name correspond à la valeur de Index.
Parent Object Retourne l’objet parent associé à la macro complémentaire.

La collection AddIns inclut une seule méthode, Add. Celle-ci prend un ou deux
paramètres et retourne une référence d’objet au nouvel objet AddIn. Voici la syn-
taxe de la méthode Add telle qu’elle s’applique à l’objet AddIn :
Chapitre 11

FileName, CopyFile)
expression.Add(F

La paramètre FileName est obligatoire et indique le chemin complet et le nom de


fichier de la macro. Le paramètre CopyFile est optionnel et s’applique unique-
ment lorsque le fichier est stocké sur un lecteur amovible (autrement dit, un lec-
teur de disquettes ou de CD-ROM). Si le deuxième paramètre est True, la macro
complémentaire est copiée sur un disque dur, alors que la valeur False signifie
que le fichier reste sur le lecteur amovible. Si on ne spécifie pas le deuxième para-
mètre et que le fichier réside sur un lecteur amovible, Excel invite l’utilisateur à
décider si le fichier doit ou non être copié.

264
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM


Le fragment de code suivant montre comment exploiter la méthode Add pour
inclure un nouveau classeur de macro complémentaire dans la collection
AddIns :
NewAddIn = Application.AddIns.Add("c:\Chapitre11.xla")

L’objet AddIn
L’objet AddIn représente une macro complémentaire disponible dans Excel. Le
tableau 11.3 donne une liste des propriétés associées à une macro complémen-
taire.
Tableau 11-3. Propriétés de l’objet AddIn
Propriété Type Description
Application Object Retourne l’objet Application représentant le créateur de la
macro complémentaire.
CLSID String Retourne le CLSID de la macro complémentaire.
Creator Long Retourne un entier 32 bits contenant la valeur XCEL binaire.
FullName String Retourne le chemin complet et le nom de fichier du classeur
qui contient la macro complémentaire.
Installed Boolean Si elle est True, cette propriété signifie que la macro
complémentaire est installée.
Name String Retourne le nom de fichier de la macro complémentaire.
Parent Objet Retourne l’objet parent associé à la macro complémentaire.
Path String Retourne le chemin d’accès au répertoire hébergeant la macro
complémentaire.
ProgId String Retourne l’identificateur de programmation associé à l’objet.

Les propriétés Application et Parent simplifient le référencement de l’objet appli-


cation qui a créé la macro complémentaire et son objet parent.
La propriété Creator retourne une valeur Long correspondant aux quatre carac-
tères XCEL. Cette propriété est intéressante pour vérifier que la macro complé-
Chapitre 11

mentaire a été créée pour Excel.


Les propriétés ProgId et CLSID s’appliquent uniquement avec les macros com-
plémentaires d’automatisation et COM. Ces propriétés retournent une chaîne
vide pour les macros complémentaires Excel.
Les propriétés Name, Path et FullName contiennent des informations relatives au
nom de fichier du classeur de la macro. Name contient uniquement le nom de
fichier, alors que Path désigne le répertoire qui contient le fichier de la macro
complémentaire. FullName combine les propriétés Path et Name avec un sépara-
teur de répertoires.
La propriété Installed contrôle si la macro complémentaire est installée ou non
dans Excel. Si elle est positionnée à True, elle installe la macro complémentaire et

265
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


déclenche l’événement Workbook_AddinInstall. Si elle est positionnée à False, elle
supprime la macro complémentaire et déclenche l’événement
Workbook_AddinUninstall.

Routines automatiques
Dans les versions d’Excel antérieures à Excel 97, on appelait des macros spé-
ciales comme Auto_Add et Auto_Remove lors de l’installation ou de la sup-
pression d’une macro complémentaire. Ces macros sont stockées dans un
module associé au classeur au lieu de se trouver dans l’objet ThisWorkbook.
Bien que ces macros continuent de fonctionner dans cette version d’Excel,
préférez les événements Workbook correspondants.

Dans d’anciennes versions d’Excel, vous pouvez rencontrer les routines auto-
matiques Auto_Open et Auto_Close, qui correspondent à Workbook_Open et
Workbook_Close, et Auto_Activate et Auto_Deactivate, qui correspondent à
Workbook_Activate et Workbook_Deactivate.

Pour afficher les valeurs stockées dans l’objet AddIn, écrivez une macro similaire
à celle du listing précédent. Cette macro utilise une instruction For Each pour
boucler dans chaque objet AddIn de la collection AddIns puis insère la valeur
dans la feuille de calcul en cours.

Sub GetAddIns()

Dim a As AddIn
Dim i As Long

i = 1
For Each a In Application.AddIns
i = i + 1
Cells(i, 1) = i - 1
Cells(i, 2) = a.Application.Name
Cells(i, 3) = a.CLSID
Cells(i, 4) = a.Creator
Cells(i, 5) = a.FullName
Chapitre 11

Cells(i, 6) = a.Installed
Cells(i, 7) = a.Name
Cells(i, 8) = a.Parent.Name
Cells(i, 9) = a.Path
Cells(i, 10) = a.progID

Next a

End Sub

Les propriétés Application et Parent retournent les références de l’objet que l’on
peut afficher dans une cellule. En conséquence, la propriété Name associée à cha-
cun de ces objets s’affiche. La figure 11.5 montre la feuille de calcul après exécu-
tion de la macro GetAddIns.

266
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Figure 11-5. La collection AddIns contient des informations relatives à chaque


macro complémentaire connue d’Excel.

Création de compléments d’automatisation


et COM
Il est parfois préférable de ne pas se servir de Visual Basic pour Applications pour
créer une macro complémentaire. Les macros VBA étant interprétées, elles s’exé-
cutent plus lentement que du code compilé, ce qui peut sérieusement affecter les
performances des macros de calcul. En outre, certaines fonctions ne sont pas
simples à mettre en œuvre avec VBA, comme le traitement d’images ou des
applications de réseautique spécialisées.
Pour contourner ce problème, toutes les applications Office, y compris Excel,
peuvent accéder à une macro complémentaire stockée dans un fichier DLL ou
Chapitre 11

EXE externe. Pour accéder aux macros complémentaires externes, il existe deux
méthodes différentes créées avec des techniques de programmation similaires.
Les compléments COM sont essentiellement employés pour répondre à un clic
sur un bouton de commande ou à tout autre événement Excel, comme ouvrir ou
fermer un classeur. Contrairement aux macros complémentaires Excel, vous ne
pouvez pas créer de complément COM à utiliser dans une formule de cellule. Les
compléments d’automatisation sont moins limitatifs : ils servent à répondre à
des événements Excel et proposent des fonctions que vous pouvez exploiter dans
une formule.
Pour définir les compléments COM, vous utilisez la boîte de dialogue Modules
complémentaires COM, accessible depuis la barre d’outils, alors que pour les
compléments d’automatisation, vous pouvez vous servir de la boîte de dialogue

267
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Modules complémentaires COM et/ou de la boîte de dialogue Macro complé-
mentaire.

EXE ou DLL?
Vous pouvez créer les compléments COM dans un fichier DLL ou EXE. Les deux
possèdent des avantages et des inconvénients. En général, un composant DLL
fonctionne mieux qu’un composant EXE. En effet, il s’exécute dans le proces-
sus, ce qui évite la surcharge liée à l’appel d’un composant hors processus.

Toutefois, le composant DLL ne peut pas contenir de programme principal, ce


qui constitue une restriction sérieuse si un utilitaire doit accéder à un pro-
gramme autonome ou une macro complémentaire Office. Le composant EXE
possède, en outre, l’avantage d’isoler l’exécution de la macro complémentaire
de celle de l’application hôte.
En conséquence, sauf si vous avez besoin d’isolation ou d’une fonctionnalité
de programme principal d’un composant EXE, développez votre macro sous
forme d’un composant DLL.

Il existe une autre différence entre un complément d’automatisation et un com-


plément COM : ce dernier doit prendre en charge l’interface IDTExtensibility2,
ce qui n’est pas nécessairement le cas du premier.

Astuce Afficher la boîte de dialogue Modules complémentaires COM


Pour accéder à la boîte de dialogue Modules complémentaires COM, la seule
solution consiste à ajouter le bouton Modules complémentaires COM à une
barre d’outils. Pour ce faire, cliquez droit sur une barre d’outils et choisissez
Personnaliser (au bas de la liste). Cliquez sur l’onglet Commandes. Dans la
liste Catégories, sélectionnez Outils et faites glisser Modules complémentai-
res COM depuis la liste Commandes vers une barre d’outils. Cliquez ensuite
sur le bouton Modules complémentaires COM pour afficher la boîte de dialo-
gue.
Chapitre 11

Interface IDTExtensibility2
L’interface IDTExtensibility2 constitue une interface générale partagée par de
nombreux produits hors Microsoft Office. Cette interface représente une
manière standard pour une application de communiquer avec une macro com-
plémentaire. Tout complément COM doit mettre en œuvre chacune des métho-
des listées dans le tableau 11.4.

268
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Tableau 11-4. Méthodes de l’interface IDTExtensibility2


Méthode Description
OnAddInsUpdate Appelée lorsqu’un changement se produit dans la liste des
compléments et lors du chargement ou du déchargement d’un
complément.
OnBeginShutdown Appelée lorsqu’on ferme une application. Cette méthode est
uniquement appelée si le complément est chargé.
OnConnection Appelée lorsqu’on charge le complément dans l’application, à
partir de la boîte de dialogue Macro complémentaire ou
automatiquement au démarrage de l’application.
OnDisconnection Appelée lorsqu’on décharge le complément de l’application.
OnStartupComplete Appelée lorsque l’application a terminé le processus de
démarrage.

La méthode OnConnection est appelée lorsqu’on charge le complément dans


l’application. Il reçoit des informations relatives à l’environnement dans lequel il
s’exécute par le biais d’un jeu de paramètres. Les deux paramètres essentiels sont
une référence à l’objet application associé à l’application et des informations
relatives à la méthode de démarrage du complément (autrement dit, s’il a été
démarré à partir de la boîte de dialogue Modules complémentaires COM ou au
démarrage de l’application).
Si la méthode OnConnection est retournée avec succès, l’application considère
que le complément est chargé. Si elle retourne un message d’erreur, l’application
détruit l’objet associé au complément.

Astuce Initialiser le module complémentaire


Servez-vous de la méthode OnConnection pour initialiser le complément et
acquérir toute ressource dont il a besoin. Vous pouvez ensuite libérer ces res-
sources avec la méthode OnDisconnection.
Chapitre 11
On appelle la méthode OnDisconnection lorsque l’application décharge elle-
même le complément. L’application informe le complément de la raison pour
laquelle l’application est déchargée (autrement dit, le complément a été déchargé
via la boîte de dialogue Modules complémentaires COM ou l’application se
ferme).
Les méthodes OnStartupComplete et OnBeginShutdown sont appelées juste
avant que l’application soit prête à accepter l’entrée de l’utilisateur et juste après
que l’utilisateur a demandé à l’application de se fermer.

269
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Astuce Apporter des modifications à Excel


Servez-vous de la méthode OnStartupComplete pour modifier l’application,
comme ajouter de nouveaux éléments de menus ou de nouveaux boutons de
barres d’outils. Vous pourrez ensuite annuler ces modifications avec la
méthode OnBeginShutdown.

La méthode OnAddInsUpdate est appelée lorsque la liste des compléments


change.

Attention Soyez extrêmement prudent si vous modifiez Excel lors du charge-


ment d’un complément. En effet, Excel peut dynamiquement charger une
macro complémentaire en mode édition de cellule. Afficher une feuille ou une
boîte de dialogue, modifier la sélection en cours, appeler une propriété ou une
méthode de la collection Windows ou changer certains paramètres Excel sont
autant d’actions qui risquent de provoquer un arrêt inopiné d’Excel.

Clés du registre
Les compléments COM doivent déclarer certaines entrées dans le registre Win-
dows. Toutes les entrées de registre sont stockées dans la clé suivante, où App
représente le nom de l’application Office (comme Excel) et ProgID représente la
valeur ProgID associée à la macro complémentaire. Ces entrées sont générale-
ment créées par le programme d’installation de la macro.
HKEY_CURRENT_USER\Software\Microsoft\Office\App\Addins\ProgID

Attention Il est dangereux de modifier manuellement le registre Windows. Si


vous ne possédez pas l’expérience pour l’éditer, regardez, mais ne touchez
pas. Laissez le programme d’installation de la macro complémentaire effec-
tuer les modifications appropriées. Pour afficher et/ou modifier les entrées du
registre, servez-vous du programme RegEdit (cliquez sur Démarrer, Exécuter,
tapez regedit et cliquez sur OK).
Chapitre 11

Sous la clé spécifiée précédemment, se trouve une série de sous-clés qui contien-
nent des informations spécifiques relatives au complément. La sous-clé LoadBe-
havior est une valeur DWORD qui détermine si l’application Office charge un
complément. Une valeur de 0 signifie que le complément n’est pas chargé, une
valeur de 3 signifie qu’il est chargé au démarrage de l’application, une valeur de
9 signifie qu’il est chargé à la demande de l’utilisateur et une valeur de 16 signifie
qu’il est chargé une fois, au démarrage suivant de l’application.
La sous-clé Description est une valeur String qui s’affiche dans la boîte de dialo-
gue Modules complémentaires COM, alors que la sous-clé FriendlyName est une
valeur String retournée par la propriété Description du complément.
Les compléments qui exploitent l’interface IDTExtensibility2 possèdent égale-
ment une entrée de registre nommée CommandLineSafe. Il s’agit d’une valeur

270
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM


DWORD qui marque le complément comme sûr, utilisable dans des applications
qui ne supportent pas l’interface utilisateur. La valeur 0x00 signifie que le com-
plément a besoin d’une interface utilisateur, alors que la valeur 0x01 signifie qu’il
n’en a pas besoin.

Construction d’un complément


d’automatisation avec Visual Basic 6
Visual Basic 6 contient un modèle qui simplifie la création des compléments
exploitant l’interface IDTExtensibility2, que vous pouvez employer pour créer
un complément d’automatisation mettant en œuvre la même fonction PrixNet
que celle construite pour la macro complémentaire Excel.

Concevoir le complément
Voici le code du complément d’automatisation. Le module commence par défi-
nir une variable publique qui contiendra la référence à l’objet Excel.Application.
Le reste du code met en œuvre les cinq méthodes nécessaires à la gestion de
l’interface IDTExtensibility2, ainsi qu’une fonction supplémentaire qui met en
œuvre la même fonction PrixNet que celle employée dans la macro complémen-
taire Excel, précédemment dans ce chapitre.

Option Explicit

Public ExcelApp As Excel.Application

Private Sub AddinInstance_OnAddInsUpdate(custom() As Variant)

'Appelée lorsqu'on modifie la macro complémentaire

End Sub

Private Sub AddinInstance_OnBeginShutdown(custom() As Variant)

'Appelée lorsqu'Excel se trouve dans le processus de fermeture


Chapitre 11

End Sub

Private Sub AddinInstance_OnConnection(ByVal Application As Object, _


ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)

Set ExcelApp = Application

End Sub

Private Sub AddinInstance_OnDisconnection( _


ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, _
custom() As Variant)

Set ExcelApp = Nothing

271
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


End Sub

Private Sub AddinInstance_OnStartupComplete(custom() As Variant)

'Appelée lorsqu'Excel est prêt à être utilisé

End Sub

Public Function PrixNet(Prix, Remise) As Currency

If Remise <= 1 And Remise >= 0 Then


PrixNet = Prix * (1 - Remise)

Else
PrixNet = 0

End If

End Function

Des cinq méthodes associées à l’interface IDTExtensibility2, seules deux sont


employées dans cet exemple. La méthode AddinInstance_OnConnection enregis-
tre une référence d’objet vers l’application Excel passée avec le paramètre Appli-
cation. Cet objet est indispensable pour permettre au complément d’accéder aux
informations stockées dans l’application Excel.
La méthode AddinInstance_OnDisconnection libère la référence à l’objet Excel.
Outre l’exercice pratique de programmation, la libération de l’objet permet de
s’assurer de la stabilité du complément.
Pour créer un nouveau complément avec Visual Basic 6, procédez comme suit :
1 Démarrez Visual Basic 6. Dans la boîte de dialogue Nouveau projet, choi-
sissez AddIn et cliquez sur le bouton Ouvrir.
Chapitre 11

2 Lorsque Visual Basic 6 démarre, ouvrez la fenêtre Explorateur de projets.


Cliquez droit sur frmAddIn et choisissez Supprimer frmAddIn dans le
menu contextuel. En effet, ce formulaire ne sera pas utile dans ce projet.

272
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM


3 Dans le menu Projet, choisissez Propriétés de MyAddIn pour afficher la
boîte de dialogue MyAddIn - Propriétés du projet. Dans la zone Nom du
projet, remplacez le nom par un nom plus explicite (voir figure 11.6).
4 Dans l’Explorateur de projets, double-cliquez sur l’élément Connect pour
ouvrir la boîte de dialogue AddInDesigner de l’élément. Dans la fenêtre
Propriétés, attribuez un nom plus approprié à l’élément Connect.

Figure 11-6. Choisissez un nom explicite pour votre projet de


complément.

5 Dans l’AddInDesigner (voir figure 11.7), actualisez les champs Nom


d’affichage et Description du complément. Dans la liste déroulante Appli-
cation, choisissez Microsoft Excel et optez pour la version appropriée (si
plusieurs versions d’Excel sont installées sur votre ordinateur). Choisissez
le mode d’initialisation du complément en sélectionnant une entrée dans
la liste déroulante Comportement initial.

Chapitre 11

273
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Figure 11-7. Complétez les informations appropriées relatives au


complément.

6 Dans le menu Projet, choisissez Références et ajoutez la bibliothèque


d’objets Microsoft Excel 11.0 Object Library à la liste des références de
cette application.
Chapitre 11

7 Affichez le code associé au designer en cliquant sur l’icône Code dans


l’Explorateur de projets ou en cliquant droit sur le nom du designer et en
choisissant la commande Code. Le modèle de AddIn est orienté vers le
développement de compléments pour Visual Basic. En conséquence, vous
pouvez supprimer presque tout le code du module (voir Astuce suivante).

274
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Astuce Utiliser Option Explicit


Ne supprimez pas l’instruction Option Explicit qui se trouve au début du code.
Option Explicit vous oblige à définir une variable avec une instruction Dim,
Public ou Private, avant de l’utiliser. Cela vous permet de localiser les variables
mal orthographiées et les variables que vous avez oublié de définir au niveau
du module. Elle vous permet de gagner du temps et je vous recommande vive-
ment d’inclure Option Explicit comme première instruction dans chaque
module Visual Basic que vous écrivez.

8 Ajoutez le code de la section « Concevoir la macro complémentaire ».


Dans le menu Fichier, choisissez Créer NomProjet. Vous créez ainsi le
fichier DLL contenant le complément d’automatisation. Démarrez
ensuite Excel et dans le menu Outils, choisissez Modules complémentaires
pour afficher la boîte de dialogue Macro complémentaire. Cliquez sur le
bouton Automatisation pour afficher la liste des serveurs Automation dis-
ponibles sur le système. Dans la liste, localisez le nom du projet que vous
venez de créer dans la liste. Sélectionnez-le et cliquez sur OK.

9 Créez une feuille de calcul qui exploite la fonction PrixNet, comme celle
de la figure 11.8.
Chapitre 11

275
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Figure 11-8. La fonction PrixNet du complément d'automatisation


fonctionne exactement comme celle créée pour la macro complémentaire
Excel.

Entrées du registre
Même si la création d’une macro complémentaire avec le modèle AddIn de
Visual Basic 6 semble augmenter la charge de travail, AddInDesigner simplifie le
travail nécessaire en créant toutes les entrées appropriées dans le registre Win-
dows à votre place (voir figure 11.9). Vous pouvez vérifier ces entrées en exécu-
tant RegEdit (cliquez sur Démarrer, Exécuter, tapez regedit et cliquez sur OK).
Chapitre 11

Figure 11-9. Vérifiez les entrées créées dans le registre Windows avec
l’utilitaire RegEdit.

276
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Génération d’un complément COM avec


Visual Basic .NET
Le fait que Visual Basic .NET ne contienne pas de support natif pour les complé-
ments COM ne signifie pas qu’il ne vous permet pas de générer des compléments
COM. À l’instar de Visual Basic 6, Visual Basic .NET contient des modèles qui
simplifient la création de compléments.
Le but de ce complément consiste à placer un nouveau bouton dans la barre
d’outils Standard Excel (celle qui héberge les boutons Ouvrir, Enregistrer, Impri-
mer, et ainsi de suite) qui réponde à un clic par une boîte de message.

Exécuter l’assistant du complément partagé


La manière la plus simple de créer un complément consiste à employer l’Assis-
tant Extensibilité du Complément partagé Microsoft Visual Studio .NET. Il per-
met de créer une nouvelle solution qui englobe les pièces nécessaires à
l’exécution de votre complément, y compris la logique qui ajoute automatique-
ment les clés de registre.
La solution se compose de deux projets. Le premier contient le code nécessaire à
l’interaction avec l’application, dont vous pouvez vous servir comme base pour
créer le complément. Le deuxième projet est un projet d’installation, qui installe
le complément y compris les changements dans le registre.
Pour créer une nouvelle solution de complément, procédez comme suit :
1 Créez un nouveau projet dans Visual Studio .NET. Dans l’arborescence
Types de projets, développez le nœud Autres projets et sélectionnez Projets
d’extensibilité, puis sélectionnez Complément partagé dans le volet Modè-
les. Saisissez des valeurs pour les zones Nom et Emplacement. Appuyez sur
OK pour démarrer l’assistant.

Chapitre 11

2 L’assistant vous demande de choisir un langage : Microsoft Visual C#,


Visual Basic ou Visual C++/ATL. Sélectionnez Visual Basic et cliquez sur
Suivant.

277
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


3 Sur la page 2 de l’assistant, choisissez les applications qui hébergeront le
complément.
4 Dans la page 3, l’assistant vous demande de saisir le nom de votre complé-
ment, ainsi que sa description. Ces informations sont présentées aux utili-
sateurs lorsqu’ils sélectionnent le complément dans la boîte de dialogue
Modules complémentaires COM.

5 Dans la page 4, vous décidez si le complément est ou non chargé en même


temps que l’application hôte et s’il doit être accessible à tous les utilisa-
teurs ou uniquement à la personne qui l’a installé. Si vous n’êtes pas sûr
des valeurs à employer, cochez les ceux cases.
6 La dernière étape est un récapitulatif de vos choix. Pour modifier l’un de
ces choix, cliquez sur Précédent jusqu’à atteindre la page appropriée.
Sinon, cliquez sur Terminer pour créer le nouveau projet.
Chapitre 11

278
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Astuce Développer des compléments utilisables dans plusieurs applications


Office

Il est possible de développer un complément qui pourra être utilisé dans plu-
sieurs applications Office. Cette fonctionnalité est intéressante si vous écrivez
un complément d’ordre général comme un navigateur d’images ou un locali-
seur de fichiers. Avec l’objet d’application passé à la méthode OnConnection,
vous pouvez déterminer quelle application a appelé le complément et apporter
les modifications appropriées aux menus ou informations contenues dans
l’application.

Modifier le modèle
Même si vous avez coché Microsoft Excel pendant l’exécution de l’assistant, vous
devez explicitement ajouter une référence à la bibliothèque TypeLib Excel dans le
programme Visual Basic .NET. Pour ce faire, dans le menu projet, choisissez
Ajouter une référence. Dans la boîte de dialogue du même nom, cliquez sur
l’onglet COM et sélectionnez Microsoft Excel 11.0 Object Library. Pour finir, cli-
quez sur le bouton Sélectionner puis sur le bouton OK pour ajouter la référence
à votre projet.

Chapitre 11

Le squelette de code créé par l’assistant construit une interface IDTExtensibility2


minimale. Vous devez donc ajouter votre propre code.
Dans ce cas, nous devons déclarer une variable de module qui contient les infor-
mations relatives au bouton à ajouter à la barre d’outils. L’instruction suivante
définit l’objet MonBouton. Notez que le mot-clé WithEvents est inclus. Lorsque
l’on clique sur le bouton dans Excel, l’événement Click de l’objet MonBouton est
déclenché.
Dim WithEvents MonBouton As CommandBarButton

279
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


La routine OnConnection est appelée par l’application hôte pour initialiser le
complément. Comme nous l’avons étudié précédemment dans ce chapitre, la
seule tâche réelle que demande cette routine est d’enregistrer une référence à
l’objet d’application. Tout le code suivant est automatiquement généré par
l’assistant. La variable applicationObject est également définie par l’assistant en
tant que variable de module. Elle sert à accéder aux ressources appartenant à
l’application qui héberge le complément.

Public Sub OnConnection(ByVal application As Object, _


ByVal connectMode As Extensibility.ext_ConnectMode, _
ByVal addInInst As Object, ByRef custom As System.Array) _
Implements Extensibility.IDTExtensibility2.OnConnection

applicationObject = application
addInInstance = addInInst

End Sub

Remarque Le mot-clé Implements indique que cette routine met en œuvre


une routine qui se trouve dans une interface particulière. Dans ce cas, on peut
noter que la routine IDTExtensibility2.OnConnection est référencée.

La routine OnStartupComplete est appelée après que le complément a été initia-


lisé, mais avant que l’utilisateur puisse utiliser l’application. C’est le meilleur
emplacement pour modifier les menus ou apporter tout changement à Excel.
Pour ajouter un bouton à la barre d’outils, servez-vous du code suivant. Com-
mencez par créer une nouvelle instance de l’objet MonBouton en vous servant
de la méthode Add associée à la collection Controls d’une barre d’outils. Définis-
sez ensuite la propriété Caption pour conserver le nom à afficher sur le bouton et
définissez la propriété Style de sorte que la légende s’affiche sur le bouton et non
sous forme d’icône.

Public Sub OnStartupComplete(ByRef custom As System.Array) _


Implements Extensibility.IDTExtensibility2.OnStartupComplete
Chapitre 11

MonBouton =
applicationObject.CommandBars("Standard").Controls.Add(1)

MonBouton.Caption = "Mon Bouton"


MonBouton.Style = MsoButtonStyle.msoButtonCaption
MonBouton.Tag = "Mon Bouton"
MonBouton.OnAction = "!<MyCOMAddin.Connect>"

MsgBox("Démarrage terminé")

End Sub

Définissez ensuite la propriété Tag pour indiquer le nom du bouton ainsi que la
propriété OnAction pour qu’elle pointe vers ce complément.

280
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Reportez-vous au chapitre 18, « Personnalisation des menus et des barres d’outils », pour
plus d’informations sur la manière de créer et de manipuler les menus et les barres
d’outils.

Avant de fermer l’application, vous devez supprimer correctement le bouton en


vous servant d’un code comme la routine OnBeginShutdown. La méthode Delete
du bouton sert à supprimer le bouton de la barre d’outils. On détruit ensuite les
ressources associées à l’objet bouton en positionnant l’objet MonBouton sur
Nothing.

Public Sub OnBeginShutdown(ByRef custom As System.Array) _


Implements Extensibility.IDTExtensibility2.OnBeginShutdown

MonBouton.Delete()
MonBouton = Nothing

End Sub

Pour finir, on appelle le code associé à l’événement Click du bouton lorsque l’on
clique sur Mon Bouton dans la barre d’outils. Comme le montre cet exemple, la
routine MonBouton_Click se contente d’appeler la routine MsgBox pour afficher
un simple message à l’écran. Cependant, dans une macro complémentaire plus
complexe, les routines gèrent les interactions avec l’utilisateur relatives au com-
plément.
Private Sub MonBouton_Click(ByVal CTRL As _
Microsoft.Office.Core.CommandBarButton, _
ByRef CancelDefault As Boolean) Handles MonBouton.Click

MsgBox("On a cliqué sur Mon Bouton")

End Sub

Installer le complément
Pour installer le complément, vous devez commencer par le générer. Ensuite,
vous créerez le programme d’installation et l’exécuterez. Chapitre 11

1 Dans le menu Visual Studio .NET, choisissez Générer, Générer la solution :


votre complément est compilé.
2 L’étape suivante consiste à générer le programme d’installation. Pour ce
faire, cliquez droit sur le Setup du projet dans l’Explorateur de solutions
et choisissez Générer dans le menu contextuel.

Remarque Le package d’installation créé par l’assistant ne comprend pas


.NET Framework, que vous devez installer avant d’installer votre complément.
Si Visual Studio est déjà installé sur votre ordinateur, vous avez déjà installé
.NET Framework.

281
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


3 Une fois la génération terminée, cliquez droit à nouveau sur le Setup du
projet et choisissez Installer dans le menu contextuel. Cette action
démarre l’Assistant NomSolution, qui va guider l’utilisateur dans les diffé-
rentes phases nécessaires à l’installation du complément sur son ordina-
teur.

Pour vérifier que le complément est correctement installé, démarrez Excel. Lors-
que le complément s’exécute, une boîte de message s’affiche pour vous informer
que l’installation est terminée. Notez la présence du bouton Mon Bouton dans la
barre d’outils Standard.
Chapitre 11

Si vous cliquez sur le bouton Mon Bouton, vous affichez une boîte de message
qui indique qu’on a cliqué sur le bouton Mon Bouton.

282
Partie 4 : Fonctions VBA avancées

Création de macros complémentaires et de compléments COM

Dans ce chapitre, nous avons étudié les macros complémentaires et les complé-
ments et la manière de les intégrer à une application Excel. Nous avons ensuite
expliqué comment utiliser la boîte de dialogue Macro complémentaire pour
incorporer une macro complémentaire dans Excel. Pour finir, vous avez appris
trois techniques différentes pour générer un complément : créer un classeur avec
une série de macros Excel et les enregistrer dans un fichier .xla, créer un complé-
ment d’automatisation avec Visual Basic 6 et créer un complément COM avec
Visual Basic .NET. Chacune de ces techniques possède des avantages et des
inconvénients selon la manière dont vous prévoyez de l’incorporer à l’applica-
tion.

Chapitre 11

283
Partie 4 : Fonctions VBA avancées

Chapitre 12
Événements
Activation et désactivation des Événements Worksheet . . . . . . 294
événements . . . . . . . . . . . . . . . . 286 Événements Application . . . . . . 298
Événements Workbook . . . . . . . 288

Dans Microsoft Excel, toute action qui se produit, comme ouvrir un classeur,
enregistrer le fichier ou recalculer une feuille de calcul constitue un événement.
Certains événements sont déclenchés par l’application et d’autres par l’utilisa-
teur. Quelle que soit la manière dont l’événement s’initie, vous pouvez lui assi-
gner des procédures pour optimiser l’interaction de l’utilisateur avec
l’application Excel.
Au moment du déclenchement, Excel recherche une procédure d’événement
intitulée Objet_NomÉvénement, dans laquelle Objet représente l’objet qui génère
et contient l’événement et NomÉvénement représente le nom du déclencheur.
Par exemple, si un utilisateur change la sélection, soit en cliquant dans une cel-
lule du classeur, soit en se servant des flèches de navigation, Excel génère un évé-
nement SelectionChange et exécute tout code se trouvant dans une procédure
intitulé Objet_SelectionChange. De même, si l’utilisateur modifie la valeur d’une
cellule, en tapant une nouvelle valeur dans une cellule ou en modifiant la pro-
priété Value d’une procédure VBA, Excel déclenche un événement Change et
exécute la procédure d’événement Objet_Change.
Dans ce chapitre, vous allez apprendre à activer et à désactiver les événements,
ainsi qu’à exploiter efficacement les événements Workbook, Worksheet et Applica-
tion.

Pour plus d’informations sur les événements Chart, reportez-vous au chapitre 15,
« Graphiques ». Pour les événements UserForm, repor tez-vous au chapitre 19,
« Formulaires utilisateur ».

Excel contrôle un grand nombre d’événements, groupés dans les catégories


suivantes :
● Événements Workbook Événements qui se produisent pour un classeur
particulier : Open, Activate et NewSheet, par exemple.
● Événements Worksheet Événements qui se produisent pour une feuille de
calcul particulière : Calculate, Change et BeforeRightClick par exemple.
● Événements Chart Événements qui se produisent pour un graphique
particulier : Select, Activate et SeriesChange, par exemple.

285
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


● Événements Application Événements qui se produisent pour l’applica-
tion, Excel : SheetChange, NewWorkbook et WorkbookBeforeClose, par
exemple.
● Événements UserForm Événements qui se produisent pour une feuille
UserForm particulière ou un objet qu’elle contient : Click et Initialize, par
exemple.
Les objets ne définissent pas tous les événements. En général, si un objet possède
un événement, son objet parent le possède également. Par exemple, l’événement
Change est contenu au plus bas niveau par l’objet Worksheet. L’objet Workbook
est le parent de l’objet Worksheet : il possède le même événement, libellé
Workbook_SheetSelectionChange. Le parent de l’objet Workbook, l’objet Applica-
tion, dispose également de l’événement Change. Il est inutile de programmer
l’événement le « plus bas » pour faire parvenir l’événement à un niveau élevé. Par
exemple, l’événement Workbook_SheetChange est déclenché que vous ayez ou
non codé l’événement Worksheet_Change.
À l’heure d’évaluer les résultats à obtenir avec votre procédure d’événement, rap-
pelez-vous du niveau auquel elle doit se produire. On commet souvent l’erreur
de programmer la procédure d’événement au mauvais endroit. La fenêtre de
Visual Basic Editor affiche tous les projets ouverts et organise leurs composants
sous forme de liste que vous pouvez développer ou réduire, comme le montre la
figure 12.1. Avant de programmer votre procédure d’événement, vérifiez que
l’objet correct est actif.

Figure 12-1. Les composants de chaque Projet VBA sont affichés sous forme
d’arborescence.

Activation et désactivation des événements


L’objet Application d’Excel dispose d’une propriété EnableEvents qui sert à acti-
ver et à désactiver les déclencheurs d’événements. Dans la mesure où le code
VBA, y compris les procédures d’événements, peut déclencher des événements, il
est parfois préférable de les désactiver. Par exemple, si vous modifiez la valeur
d’une cellule à partir de VBA, vous déclenchez les événements Change de tous les
niveaux d’objets. Si votre procédure d’événement Worksheet_Change contient du
Chapitre 12

code qui modifie une autre cellule, vous devez désactiver les événements pour
empêcher Worksheet_Change de s’auto-appeler de manière répétitive. Si une
procédure s’appelle elle-même continuellement, elle risque de faire déborder la

286
Partie 4 : Fonctions VBA avancées

Événements
pile des appels (un enregistrement interne des tâches en attente au sein d’Excel)
ou d’épuiser la mémoire.
Par défaut, tous les événements sont activés. Pour désactiver tous les événe-
ments, ajoutez la ligne de code suivante à votre procédure VBA :
Application.EnableEvents = False

Pour activer les événement, servez-vous de la ligne de code suivante :


Application.EnableEvents = True

Remarque Ce paramètre concerne l’ensemble de l’application Excel. Ainsi, si


vous le positionnez sur False, tous les classeurs ouverts sont affectés et pas
uniquement le classeur actif qui contient le code. Rappelez-vous également
qu’Excel ne restaure pas le paramètre à l’achèvement du code. Veillez en con-
séquence à le positionner à nouveau sur True pour réactiver les événements.

On désactive les événements essentiellement pour une raison : éviter les boucles
sans fin d’événements ininterrompus. Supposons, par exemple, que vous avez
développé une fiche horaire et que le nombre maximum d’heures qu’un employé
est autorisé à travailler est de 40 heures par semaine. Vous écrivez la code pour
valider le contenu au moment où les données sont saisies dans la cellule qui con-
tient le nombre total d’heures de chaque employé. Dans cet exemple, vous sur-
veillez l’événement Change de la feuille de calcul par le biais d’une procédure
Worksheet_Change. Votre procédure vérifie l’entrée de l’utilisateur pour s’assurer
qu’elle est inférieure à 40. Si elle est supérieure à 40, la procédure affiche un mes-
sage informant l’utilisateur qu’il a dépassé le nombre d’heures de travail autori-
sées et efface l’entrée de la cellule. Le problème avec ce scénario est le suivant :
lorsque le contenu de la cellule est effacé, le code VBA génère un nouvel événe-
ment Change, qui exécute à nouveau l’événement. Ce n’est pas ce que vous sou-
haitez. Vous devez donc désactiver les événements avant d’effacer la cellule, puis
les réactiver pour contrôler l’entrée de l’utilisateur suivant. L’événement
Worksheet_Change suivant présent le code nécessaire pour valider les entrées des
utilisateurs dans une plage nommée Heures. Dans cet exemple, vous pouvez
remplacer le nom de la plage Heures par l’adresse d’une cellule spécifique pour
tester le code dans n’importe quel classeur. Cette procédure d’événement fait
référence au niveau de la feuille de calcul. En conséquence, vous devez ajouter le
code au module de la feuille de calcul qui doit déclencher l’événement Change.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


Dim VRange As Range
Set VRange = Range("Heures")
If Intersect(Target, VRange).Value > 40 Then
Chapitre 12

MsgBox "Le nombre d'heures hebdomadaires ne doit pas excéder


40."
Application.EnableEvents = False
ActiveCell.Value = ""
Application.EnableEvents = True
End If

287
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


End Sub

Remarque Application.EnableEvents = False affecte tous les classeurs


ouverts. Cependant, elle n’affecte pas les événements qui se trouvent en-
dehors du modèle d’objet Excel. Les événements associés aux contrôles Acti-
veX et aux feuilles UserForm continuent de se produire.

Événements Workbook
Les événements de l’objet Workbook se produisent au sein d’un classeur particu-
lier. Les événements Workbook sont activés par défaut mais, comme nous l’avons
mentionné dans la section précédente, vous pouvez les désactiver en position-
nant la propriété EnableEvents sur False. Pour afficher les procédures d’événe-
ments d’un classeur, commencez par ouvrir Visual Basic Editor. Développez le
projet de votre choix dans la fenêtre Projet et double-cliquez sur l’objet
ThisWorkBook pour l’activer. Toutes les procédures d’événements du classeur
s’affichent dans la fenêtre Code, à droite de l’écran.
Pour créer une nouvelle procédure d’événement Workbook, procédez comme
suit :
1 Double-cliquez sur l’objet ThisWorkbook pour l’activer.
2 Cliquez sur la liste déroulante Objet et sélectionnez l’option Workbook.
3 Cliquez sur la liste déroulante Procédure et sélectionnez l’événement de
votre choix.
Dans la figure 12.2, Visual Basic Editor présente la liste déroulante Procédure
pendant la création d’une nouvelle procédure d’événement Workbook.
Chapitre 12

Figure 12-2. Visual Basic Editor simplifie la création des procédures


d'événements.

288
Partie 4 : Fonctions VBA avancées

Événements
Après avoir créé une nouvelle procédure d’événement, vous remarquerez que les
lignes Private Sub Workbook_Event et End Sub ont été ajoutées dans la fenêtre
Code. Maintenant que vous avez créé le cadre de la procédure d’événement, vous
pouvez ajouter le code à exécuter lorsque l’événement se déclenche. Le
tableau 12.1 décrit les événements habituellement employés avec l’objet Work-
book.
Tableau 12-1. Événements Workbook courants
Événement Workbook Action qui déclenche l’événement
Open Surveille l’événement Open d’un classeur. Cet événement se
déclenche lorsqu’on ouvre un classeur ou une macro
complémentaire. Il exécute la procédure Workbook_Open.
Activate Surveille l’événement Activate d’un classeur. L’événement se
déclenche lorsqu’on active le classeur.
SheetActivate Surveille l’événement SheetActivate d’un classeur.
L’événement se déclenche lorsqu’on active une feuille
quelconque du classeur.
NewSheet Surveille l’événement NewSheet d’un classeur. L’événement se
déclenche lorsqu’on ajoute une nouvelle feuille au classeur.
Celle-ci pouvant être une feuille de calcul ou une feuille de
graphique, cette procédure s’exécute quel que soit le type de
la feuille ajoutée.
BeforeSave Surveille l’événement BeforeSave d’un classeur. L’événement
se déclenche lorsqu’un utilisateur enregistre le classeur et
s’exécute avant l’action enregistrer.
Deactivate Surveille l’événement Deactivate. L’événement se déclenche
lorsqu’on désactive le classeur, en le fermant ou en en ouvrant
un nouveau, par exemple.
BeforePrint Surveille l’événement BeforePrint. L’événement se déclenche
lorsqu’un utilisateur se sert de la fonctionnalité Aperçu avant
impression ou essaie d’imprimer le classeur. L’événement se
produit avant la fenêtre d’aperçu ou l’exécution de la requête
d’impression.
BeforeClose Surveille l’événement BeforeClose d’un classeur. L’événement
se déclenche lorsqu’un utilisateur ferme le classeur mais
s’exécute avant la fermeture du classeur.

Événement Open
L’événement Open est l’un des plus surveillés. Il se déclenche chaque fois qu’on
Chapitre 12

ouvre un classeur ou une macro complémentaire. L’événement Workbook_Open


accomplit une large gamme de tâches, comme générer un fichier journal pour
savoir qui a ouvert le classeur et quand. Vous pouvez créer un formulaire qui
s’ouvre avec cet événement. Dans ce formulaire, vous pouvez demander à l’utili-
sateur de sélectionner son nom dans une liste déroulante et de taper un mot de

289
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


passe avant d’accéder au fichier. Une fois le nom de l’utilisateur et son mot de
passe acceptés, vous pouvez enregistrer le nom de l’utilisateur dans un fichier
journal avec un horodatage. Voici quelques autres applications pratiques de
l’événement Open :
● Activer une feuille de calcul ou une cellule particulières ;
● Positionner l’état de la fenêtre du classeur sur normal, réduit ou agrandi ;
● Ouvrir d’autres classeurs.

Pour créer la nouvelle procédure d’événement, vous pouvez procéder comme


décrit précédemment dans la section « Événements Workbook » ou taper le code
suivant :
Private Sub Workbook_Open()

La procédure d’événement suivante s’assure que la fenêtre de l’application Excel


est agrandie et qu’elle affiche une boîte de message rappelant à l’utilisateur la
date en cours :

Private Sub Workbook_Open()


Application.WindowState = xlMaximized
Msgbox "La date est :" & Date
End Sub

Remarque Si vous maintenez enfoncée la touche MAJ au démarrage d’Excel


ou à l’ouverture d’un classeur, vous empêchez l’exécution de la procédure
Workbook_Open.

Événement Activate
L’événement Activate se déclenche lorsqu’on active le classeur : s’il est déjà
ouvert, si on bascule dans la fenêtre Excel après avoir affiché un autre pro-
gramme ou si on bascule entre deux classeurs, par exemple. Pour vous assurer
que le classeur est agrandi, ajoutez la procédure d’événement suivante à l’objet
ThisWorkbook.

Private Sub Workbook_Activate()


ActiveWindow.WindowState = xlMaximized
End Sub
SheetActivate Event

L’événement SheetActivate s’exécute lorsqu’on active une feuille quelconque du


classeur. L’événement se produit quel que soit le type de feuille activée, Worksheet
ou Chart. Il est important de vérifier le type de feuille activée. Vous pouvez vous
servir d’une instruction If...Then...Else pour déterminer le code qui s’exécute
Chapitre 12

pour chaque type de feuille. Vous pouvez, par exemple, sélectionner la cellule A1
de la feuille de calcul pour aider les utilisateurs qui travaillent dans le fichier. La
procédure d’événement suivante vérifie le type de feuille et active la cellule A1 :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

290
Partie 4 : Fonctions VBA avancées

Événements
If TypeName(Sh) = "Worksheet" Then Range("A1").Select
End Sub

Événement Newsheet
L’événement NewSheet se déclenche lorsqu’on ajoute une nouvelle feuille au
classeur. La feuille est passée à l’événement en tant qu’argument ce qui vous per-
met de la manipuler. La procédure suivante déplace la nouvelle feuille à la fin du
classeur :

Private Sub Workbook_NewSheet(ByVal Sh as Object)


Sh.Move After:=Sheets(Sheets.Count)
End Sub

On utilise souvent la procédure d’événement NewSheet pour aider les utilisateurs


en automatisant leurs tâches. Par exemple, le comptable de la société Mon Jardin
a demandé à son assistant de documenter l’ajout de nouvelles feuilles de calcul
dans le fichier Revenus.xls. Ils ont décidé d’entrer la date de création de la feuille
de calcul dans la cellule A1. Pour s’assurer que la date de création est ajoutée aux
nouvelles feuilles de calcul, ils ont créé la procédure NewSheet suivante :

Private Sub Workbook_NewSheet(ByVal Sh as Object)


If TypeName(Sh) = "Worksheet" Then _
Range("A1") = "Feuille de calcul créée le " & Now()
End Sub

Événement BeforeSave
La procédure d’événement BeforeSave s’exécute avant que le classeur soit enre-
gistré. Cette procédure utilise deux arguments : SaveAsUI et Cancel. L’argument
SaveAsUI sert à identifier si la boîte de dialogue Enregistrer sous s’affiche et
l’argument Cancel permet d’annuler l’opération d’enregistrement. Par exemple,
la procédure d’événement suivante demande aux utilisateurs s’ils souhaitent
enregistrer les modifications qu’ils ont apportées au classeur :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel as


Boolean)
a = MsgBox ("Voulez-vous enregistrer les modifications apportées à
ce classeur ?", vbYesNo)
If a = vbNo Then Cancel = True
End Sub

La procédure Workbook_BeforeSave s’exécute si l’utilisateur enregistre le classeur.


Si l’opération d’enregistrement affiche la boîte de dialogue Enregistrer sous
d’Excel, la variable SaveAsUI est positionnée à True. Si la procédure BeforeSave
Chapitre 12

positionne l’argument Cancel sur True, le fichier n’est pas enregistré.

291
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Événement Deactivate
L’événement Deactivate se produit lorsqu’on désélectionne le classeur. La procé-
dure suivante organise toutes les fenêtres ouvertes lorsqu’on désactive le
classeur :

Private Sub Workbook_Deactivate()


Application.Windows.Arrange xlArrangeStyleTiled
End Sub

Attention L’événement Deactivate se produit lorsqu’on désélectionne un


classeur. Toutefois, il se déclenche également lorsqu’on ouvre un nouveau
classeur ou que l’on ferme un classeur. Utilisez cet événement avec prudence
et testez attentivement votre procédure pour vous assurer que vous obtenez le
résultat attendu.

Événement BeforePrint
L’événement BeforePrint s’exécute lorsqu’un utilisateur tente d’imprimer le clas-
seur ou utilise l’Aperçu avant impression. La requête est transférée à la procédure
d’événement en tant qu’argument Cancel, ce qui peut servir à annuler la requête
d’impression si elle est positionnée sur True. Malheureusement, cette procédure
d’événement possède une limite : elle ne peut pas déterminer s’il s’agit d’une
requête d’impression ou si l’utilisateur souhaite simplement afficher un aperçu
du classeur.
La procédure d’événement suivante recalcule l’ensemble du classeur avant que le
classeur actif soit imprimé :

Private Sub Workbook_BeforePrint(Cancel As Boolean)


For Each wk in Worksheets
wk.Calculate
Next
End Sub

Remarque Lorsque vous testez la procédure d’événement BeforePrint, vous


économiserez du temps et du papier en utilisant l’option Aperçu avant impres-
sion au lieu d’imprimer le classeur.

La procédure d’événement BeforePrint permet également de s’assurer que cer-


tains formats ont été appliqués au classeur. Par exemple, vous pouvez ajuster la
taille des marges, définir la zone d’impression, définir les en-têtes et les colonnes
répétés sur chaque page ou simplement configurer l’impression d’une seule page
Chapitre 12

du classeur. S’il faut appliquer une série de formats à un classeur avant de


l’imprimer, vous pouvez employer une procédure d’événement contenant la dis-
position de page correcte pour éliminer le temps passé à réimprimer des clas-
seurs dont la mise en page est incorrecte.

292
Partie 4 : Fonctions VBA avancées

Événements

Événement BeforeClose
La procédure d’événement BeforeClose s’exécute avant que le classeur soit fermé.
On utilise souvent cet événement conjointement à la procédure d’événement
Wor kbook_Ope n. Vous pouvez, par exemple, créer une procédure
Workbook_Open pour ouvrir un menu personnalisé dans le classeur et une pro-
cédure Workbook_BeforeClose pour fermer ensuite le menu personnalisé. Dans
ce scénario, le menu personnalisé est uniquement visible lorsque le classeur est
ouvert. Les procédures d’événements suivantes montrent comment employer les
événements Workbook_Open et Workbook_BeforeClose pour accomplir l’ouver-
ture et la fermeture du menu personnalisé.

Private Sub Workbook_Open


Call OpenCustomMenu
End Sub

Private Sub Workbook_BeforeClose (Cancel as Boolean)


Call CloseCustomMenu
End Sub

Ce scénario pose toutefois un problème : l’invite Excel « Voulez-vous enregistrer


les modifications apportées à nomclasseur.xls ? » se produit après l’exécution de
la procédure d’événement Workbook_BeforeClose. Si l’utilisateur clique sur
Annuler, le classeur reste ouvert, mais le menu personnalisé a été fermé. Pour
éviter ce problème, ajoutez votre propre code pour inviter l’utilisateur à enregis-
trer le classeur. La procédure d’événement suivante montre les modifications
nécessaires dans la procédure BeforeClose.

Private Sub Workbook_BeforeClose (Cancel as Boolean)


Dim Msg as String
If Me.Saved Then
Call DeleteMenu
Exit Sub
Else
Msg = "Voulez-vous enregistrer les modifications apportées à "
& Me.Name & " ?"
Ans = MsgBox (Msg, vbQuestion + vbYesNoCancel)
Select Case Ans
Case vbYes
Me.Save
Call DeleteMenu
Case vbNo
Me.Save = True
Call DeleteMenu
Case vbCancel
Cancel = True
End Select
Chapitre 12

End If
End Sub

Cette procédure d’événement consulte la propriété Saved de l’objet Workbook


pour déterminer si le classeur a été enregistré. Si tel est le cas, la procédure Dele-

293
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


teMenu s’exécute et le classeur se ferme. En revanche, si le classeur n’a pas été
enregistré, la procédure affiche l’avertissement Excel classique. Si l’utilisateur cli-
que sur Oui, le classeur est enregistré, le menu supprimé et le classeur fermé. Si
l’utilisateur clique sur Non, le classeur n’est pas enregistré, mais la propriété
Saved est positionnée sur True, la procédure supprime le menu et ferme le clas-
seur. Si l’utilisateur clique sur Annuler, l’événement BeforeClose est annulé et la
procédure se termine sans supprimer le menu.

Événements Worksheet
Les événements de l’objet Worksheet sont parmi les événements les plus intéres-
sants à votre disposition dans Microsoft Excel. Comme nous le verrons, les évé-
nements de l’objet Worksheet se produisent lorsqu’on active la feuille de calcul ou
qu’un utilisateur modifie le contenu d’une cellule. Les événements Worksheet
sont également activés par défaut mais, comme nous l’avons mentionné dans la
section « Activation et désactivation d’événements », précédemment dans ce
chapitre, vous pouvez activer et désactiver les événements.
Pour afficher les procédures d’événements d’une feuille de calcul, commencez
par ouvrir Visual Basic Editor. Développez le projet de votre choix dans la fenêtre
Projet et double-cliquez sur la feuille de calcul pour l’activer. Toutes les procédu-
res d’événements associées à la feuille de calcul s’affichent dans la fenêtre Code,
à droite de l’écran.
Pour créer une nouvelle procédure d’événement Worksheet, procédez comme
suit :
1 Double-cliquez sur l’objet Worksheet intitulé Feuil1 (Feuil1) pour l’activer.
2 Cliquez sur la liste déroulante Objet et sélectionnez l’option Worksheet.
3 Cliquez sur la liste déroulante Procédure et sélectionnez l’événement de
votre choix.
La figure 12.3 montre comment créer une nouvelle procédure d’événement
Worksheet.
Chapitre 12

294
Partie 4 : Fonctions VBA avancées

Événements

Figure 12-3. Voici comment créer une nouvelle procédure d'événement


Worksheet.

Après avoir créé une nouvelle procédure d’événement, vous remarquerez que les
lignes Private Sub Worksheet_Event et End Sub ont été ajoutées dans la fenêtre
Code. Le tableau 12.2 décrit les événements Worksheet les plus courants.
Tableau 12-2. Événements Worksheet courants
Événements Worksheet Action qui déclenche l’événement
Change Surveille l’événement Change d’une feuille de calcul.
L’événement se déclenche lorsque l’utilisateur ou un lien
externe modifient les cellules d’une feuille de calcul.
SelectionChange Surveille l’événement SelectionChange d’une feuille de
calcul. L’événement se déclenche lorsque l’utilisateur
choisit une nouvelle sélection dans la feuille de calcul.
BeforeRightClick Surveille l’événement BeforeRightClick d’une feuille de
calcul. L’événement se déclenche lorsque l’utilisateur clique
droit dans la feuille de calcul.

Remarque Pour localiser les procédures d’événements dans une feuille de


calcul, cliquez droit sur l’onglet de la feuille dans la fenêtre Excel et sélection-
nez Visualiser le code.
Chapitre 12

Événement Change
L’événement Change se produit lorsque l’utilisateur, du code VBA ou un lien
externe modifient une cellule de la feuille de calcul. Il ne se déclenche pas si un

295
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


calcul génère une valeur différente pour une formule ou qu’on ajoute un objet à
la feuille de calcul.

Remarque L’événement Change ne se produit pas lorsque des cellules chan-


gent pendant un recalcul. Servez-vous de l’événement Calculate pour capturer
le recalcul de la feuille.

Lorsque la procédure Worksheet_Change s’exécute, elle reçoit un objet Range


comme argument Target. Cet objet Range représente la cellule ou la plage de cel-
lules modifiées ayant déclenché l’événement. La procédure d’événement sui-
vante affiche l’adresse de la plage Target :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


MsgBox "La plage " & Target.Address & " a changé."
End Sub

Au Quotidien
L’étrange événement Change

Pour mieux comprendre ce qui déclenche l’événement Change, tapez la procé-


dure précédente dans un module de code et modifiez la feuille de calcul. Cha-
que fois que l’événement Change se produit, l’adresse de la plage modifiée
s’affiche.

L’événement Change s’accompagne toutefois de quelques bizarreries : des


actions qui devraient le déclencher mais qui ne le font pas ou des actions qui
le déclenchent alors qu’elles ne devraient pas, par exemple. Voici quelques-
unes de ces bizarreries :

● Modifier le format d’une cellule ne déclenche pas l’événement Change,


mais l’utilisation de la commande Annuler Mise en forme du menu Édi-
tion le déclenche.
● Insérer, éditer ou supprimer un commentaire de cellule ne déclenche
pas l’événement Change.
● Appuyer sur les touches SUPPR ou RETOUR ARR. suivies de la touche
ENTRÉE déclenche l’événement Change, même si la cellule est vide.
● Les cellules modifiées avec les commandes Excel déclenchent ou non
l’événement Change. Par exemple, si vous ajoutez de nouveaux enregis-
trements dans un formulaire ou que vous triez les données, vous ne
déclenchez pas l’événement Change. En revanche, si vous avez effectué
des modifications orthographiques dans la feuille de calcul, avec le Véri-
ficateur orthographique ou la fonctionnalité Remplacer, vous déclenchez
Chapitre 12

l’événement Change.

296
Partie 4 : Fonctions VBA avancées

Événements

Comme le montrent les incohérences de cette liste, il est préférable de ne pas


faire confiance à l’événement Change pour détecter tous les changements
apportés aux cellules. Vous pouvez cependant contourner ces problèmes si
vous les connaissez. Par exemple, si vous savez qu’un format ou une valeur
spécifiques doivent s’appliquer au contenu des cellules, servez-vous de la pro-
cédure d’événement BeforeSave pour vérifier que l’événement Change n’a pas
oublié d’entrée non valide.

Événement SelectionChange
La procédure d’événement SelectionChange s’exécute chaque fois que l’utilisa-
teur sélectionne une nouvelle cellule ou plage de cellules dans la feuille de calcul.
Cette procédure sert essentiellement à aider l’utilisateur à naviguer au sein des
fichiers importants. Par exemple, la procédure d’événement peut griser la ligne
et la colonne à l’intersection de la cellule active. Lorsque l’utilisateur effectue une
nouvelle sélection, vous désactivez le grisé en cours et le réappliquez à la nouvelle
intersection de ligne et de colonne.
La procédure d’événement suivante permet aux employés de la société Mon Jar-
din de naviguer dans le fichier ListeProduits.xls. Elle fait défiler la fenêtre du clas-
seur jusqu’à la sélection en cours dans l’angle supérieur gauche de la fenêtre.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


With ActiveWindow
ScrollRow = Target.Row
ScrollColumn = Target.Column
End With
End Sub

Événement BeforeRightClick
L’événement BeforeRightClick se déclenche lorsque l’utilisateur clique droit dans
la feuille de calcul. Pour désactiver le menu contextuel qui s’affiche lorsque l’uti-
lisateur clique droit dans la feuille de calcul, piégez l’événement RightClick et
positionnez l’argument Cancel sur True.

Remarque L’événement BeforeRightClick ne se déclenche pas si le pointeur


se trouve sur une forme, une barre d’outils ou une barre de menus.

La procédure suivante empêche l’utilisateur d’accéder aux menus contextuels


d’une feuille de calcul :
Chapitre 12

Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range,


Cancel _
As Boolean)
Cancel = True
MsgBox "Le menu contextuel n'est pas disponible pour " &
Cells.Worksheet.Name
End Sub

297
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Événements Application
Les événements de l’objet Application se déclenchent lorsque l’on crée, ouvre ou
modifie un classeur. Pour écrire une procédure d’événement au niveau de l’objet
Application, vous devez créer un nouvel objet dans un module de classe. Une fois
le nouveau module de classe créé, vous pouvez associer les macros à une variété
d’événements, comme NewWorkbook, SheetActivate ou WorkbookOpen.
Le tableau 12.3 décrit les événements Application couramment employés que
vous pouvez programmer dans vos classeurs.
Tableau 12-3. Événements couramment surveillés par l’objet Application
Événement Action qui déclenche l’événement
NewWorkbook Surveille l’événement NewWorkbook de l’application Excel.
L’événement se déclenche lorsqu’on crée un nouveau classeur.
SheetActivate Surveille l’événement SheetActivate pour l’ensemble du programme
Excel. L’événement se déclenche lorsqu’on active une feuille
quelconque au sein du programme.
WorkbookOpen Surveille l’événement WorkbookOpen de l’application Excel.
L’événement se déclenche lorsqu’on ouvre un classeur quelconque au
sein de la fenêtre Excel.

Au Quotidien
Localiser les événements avec l’Explorateur d’objets

L’Explorateur d’objets constitue un outil pratique qui vous renseigne sur les
objets, leurs propriétés et leurs méthodes. Il sert également à rechercher les
objets supportés par un événement particulier. Par exemple, disons que vous
vouliez trouver les objets supportés par l’événement Change. Activez Visual
Basic Editor et appuyez sur F2 pour afficher la fenêtre Explorateur d’objets.
Vérifiez que <Toutes bibliothèques> est sélectionné, tapez Change et cliquez
sur l’icône des jumelles.
Chapitre 12

298
Partie 4 : Fonctions VBA avancées

Événements

L’Explorateur d’objets présente une liste des éléments correspondants. Les


événements sont signalés par un petit éclair jaune. Dans cette liste, vous
voyez les objets supportés par l’événement Change.

Notez que la liste est divisée en trois colonnes : Bibliothèque, Class et Mem-
bre. La correspondance recherchée peut se trouver dans n’importe laquelle de
ces trois colonnes. Le nom d’un événement ou d’un terme appartenant à une
bibliothèque ou une classe peut être identique à celui d’un autre appartenant
à une autre bibliothèque ou classe, même s’ils ne partagent sans doute pas la
même fonctionnalité. Pour chaque élément de la liste de l’Explorateur d’objets
sur lequel vous cliquez, la barre d’état, qui se trouve dans la partie inférieure
de la liste, présente la syntaxe. Vous noterez qu’une classe ou une bibliothè-
que traite l’événement différemment d’une autre.

Affiner la surveillance de l’événement Application


Dans les sections précédentes, nous avons vu comment créer des événements
Worksheet et Workbook. Ces événements s’appliquent uniquement à un classeur
particulier. Pour surveiller des événements sur l’ensemble de l’application Excel,
servez-vous des événements de l’objet Application. Pour ce faire, vous devez acti-
ver la surveillance des événements. Procédez de la manière suivante :
1 Créez un nouveau module de classe.
2 Définissez un nom pour ce module dans la zone Name de la fenêtre Pro-
priétés. Par exemple : ClasseÉvénAppli.
3 Dans le module de classe, déclarez un objet Application publique en vous
servant du mot-clé WithEvents. Par exemple :

Public WithEvents Appl As Application

4 Pour tester la procédure d’événement de l’application, saisissez les exem-


ples suivants dans le nouveau module de classe après la variable publique :

Private Sub Appl_NewWorkbook(ByVal Wb As Workbook)


MsgBox "Vous avez créé un nouveau classeur."
End Sub

Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel


As Boolean)
MsgBox "Vous avez fermé le classeur."
End Sub

Private Sub Appl_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel


As Boolean)
Chapitre 12

MsgBox "Vous imprimez le classeur."


End Sub

Private Sub Appl_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal _


SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "Vous avez enregistré le classeur."

299
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


End Sub

Private Sub Appl_WorkbookOpen(ByVal Wb As Workbook)


MsgBox "Vous avez ouvert un classeur."
End Sub

5 Créez une variable que vous pouvez utiliser pour faire référence à l’objet
Application déclaré dans le module de classe. Il peut s’agir d’une variable
objet de module, déclarée dans un module VBA classique ou dans l’objet
ThisWorkbook. Par exemple :

Dim ApplicationClass As New AppEventClass

6 Associez l’objet déclaré et l’objet Application. Pour ce faire, on utilise


généralement une procédure Workbook_Open. Par exemple :

Private Sub Workbook_Open()


Set ApplicationClass.Appl = Application
End Sub

Après avoir enregistré le classeur, fermez-le et rouvrez-le pour déclencher la pro-


cédure d’événement Workbook_Open : les événements associés à l’objet Applica-
tion sont activés.
Pour concevoir vos applications Excel, il est primordial que vous compreniez
comment les événements se déclenchent ainsi que leur séquence d’exécution.
Servez-vous de l’exemple précédent pour tester votre application et la séquence
de déclenchement. Prenez le temps de planifier les différentes étapes des séquen-
ces d’événements : vous économiserez ainsi du temps dans le cadre du dévelop-
pement de vos projets en cours et à venir.

Détecter si un classeur est ouvert


Avec Excel, vous ne pouvez ouvrir qu’une copie d’un classeur à la fois. Il est donc
important de déterminer si le classeur est ouvert ou s’il faut le faire. Si vous ne
vérifiez pas l’état du fichier, vous obtenez une erreur et l’événement s’arrête.
Par exemple, la société Mon Jardin utilise un fichier intitulé Facture.xls dépen-
dant du fichier ListeProduits.xls. Le fichier Facture.xls utilise une recherche pour
entrer le nom de produit correct dans la facture. Il est indispensable que le fichier
ListeProduits.xls soit ouvert pour que le fichier Facture.xls fonctionne correcte-
ment. Pour éviter les erreurs de recherche, on a créé la fonction suivante, intitu-
lée WorkbookOpen, pour tester si le fichier ListeProduits.xls est actuellement
ouvert. La fonction retourne la réponse True si le classeur est ouvert.
Chapitre 12

Function WorkbookOpen(WorkBookName As String) As Boolean


WorkbookOpen = False
On Error GoTo WorkBookNotOpen
If Len(Application.WorkBooks(WorkBookName).Name) > 0 Then
WorkbookOpen = True
Exit Function

300
Partie 4 : Fonctions VBA avancées

Événements
End If
WorkBookNotOpen:
End Function

Une fois que la fonction a été ajoutée à l’objet ThisWorkbook dans le fichier Fac-
ture.xls, vous pouvez l’utiliser pour évaluer si le classeur approprié est ouvert.
L’instruction If…Then…Else suivante, que vous pouvez employer comme sous-
routine au sein d’une procédure englobante, s’assure que le classeur ListePro-
duits.xls s’ouvre lorsque vous devez l’utiliser dans une procédure.

If Not WorkbookOpen("ListeProduits.xls") Then


Workbooks.Open "ListeProduits.xls"
End If

Ce chapitre vous a présenté trois couches d’événements : application, classeur et


feuille de calcul. Si vous devez analyser les besoins de votre classeur, il est impor-
tant de vous rappeler l’objectif final de votre projet. Si vous disposez d’une liste
de procédures obligatoires, l’étape suivante consiste à déterminer leur niveau de
stockage. Rappelez-vous que l’erreur la plus courante dans le cadre de la pro-
grammation des procédures d’événements est de coder les événements pour un
mauvais objet.
Souvenez-vous également que certains déclencheurs engendrent l’exécution de
plusieurs événements. Pour cerner correctement vos procédures d’événements,
n’hésitez pas à les tester. Vous devrez sans doute en passer par plusieurs
brouillons avant de finaliser la configuration de vos gestionnaires d’événements.

Chapitre 12

301
Partie 4 : Fonctions VBA avancées

Chapitre 13
Manipulation des fichiers
Localisation des fichiers Lecture dans un fichier
externes . . . . . . . . . . . . . . . . . . . 303 externe . . . . . . . . . . . . . . . . . . . 319
Écriture dans un fichier Recherche d’une valeur
externe . . . . . . . . . . . . . . . . . . . . 317 dans un fichier. . . . . . . . . . . . . . 320

La majorité des applications que vous développez pour Microsoft Excel vous
obligent à travailler simultanément dans plusieurs fichiers. Vous devrez, par
exemple, récupérer un listing de fichiers dans un répertoire, supprimer ou
renommer des fichiers. Excel permet d’importer et d’exporter plusieurs types de
fichiers texte. Il arrive cependant que le système de gestion des fichiers texte inté-
gré à Excel ne soit pas suffisant. Par exemple, si vous devez importer un fichier
texte qui contient plus de 256 colonnes de données, ce qui représente la limite
d’Excel, ou si le fichier exploite un délimiteur non standard comme la barre obli-
que inverse (\).
Dans ce chapitre, vous allez apprendre à localiser des fichiers externes, ainsi qu’à
les lire et y écrire. Vous découvrirez également comment préciser vos recherches
à l’aide des caractères génériques et à rechercher des valeurs spécifiques dans les
fichiers.

Localisation des fichiers externes


Comme nous l’avons étudié dans les précédents chapitres, toutes les applications
Microsoft Office bénéficient du modèle d’objet Office. Celui-ci contient des
objets employés par toutes les applications Office, comme l’objet CommandBars,
que nous étudierons au chapitre 17. Vous allez apprendre à exploiter deux objets
du modèle d’objet Office pour la recherche de fichiers : FileSearch et FileDialog.
Vous allez également évaluer les objets suivants, associés à chaque objet.
Les fichiers suivants sont associés à l’objet FileSearch :
● FoundFiles
● FileTypes
● SearchScopes
● ScopeFolders
● SearchFolders

Les fichiers suivants sont associés à l’objet FileDialog :


● FileDialogFilters

303
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


● FileDialogSelectedItems
Chapitre 13

L’objet FileSearch permet de rechercher des fichiers en utilisant une large gamme
de critères : type de fichier, taille du fichier, emplacement du fichier et date de la
dernière modification. L’objet FileSearch place les noms des fichiers qu’il trou-
vent dans la collection FoundFiles.
Vous pouvez faire appel à l’objet FileSearch à la place de la fonction VBA Dir
pour effectuer séquence d’opérations sur les fichiers. L’objet FileSearch est utile
dans le cadre de la maintenance des fichiers. Il permet, par exemple, de localiser
des fichiers d’une certaine ancienneté et de les supprimer ou de les déplacer vers
un répertoire d’archive. L’objet FileSearch sert également à retrouver des données
dans un certain nombre de fichiers apparentés. Vous pouvez, par exemple,
retrouver tous les fichiers Excel se trouvant dans un répertoire relatif à la nou-
velle initiative marketing de la société Mon Jardin, avant de consolider les infor-
mations dans un fichier récapitulatif.
L’objet FileDialog a été introduit dans Office XP et amélioré dans Office 2003. Il
permet d’afficher les boîtes de dialogue Ouvrir et Enregistrer sous, ainsi qu’un
navigateur de sous-répertoire. L’objet FileDialog constitue une version plus puis-
sante des méthodes GetOpenFileName et GetSaveAsFileName de l’objet Applica-
tion Excel, disponibles dans les versions précédentes d’Excel, mais qui ne l’étaient
pas pour les autres applications Office. L’objet FileDialog, étant un objet Office,
est à la disposition de toutes les applications Office.

Retourner tous les fichiers


La propriété FileSearch sert à localiser les noms de fichiers en fonction d’un cri-
tère de recherche. Elle place les noms de fichiers retournés par la recherche dans
la collection FoundFiles. Cet objet donne à votre code la fonctionnalité de la
fonction Recherche de fichiers disponible dans l’application Excel. Vous pouvez,
par exemple, effectuer une recherche sur tous les fichiers Excel associés à une
extension ou contenant un texte spécifique. Le tableau 13.1 liste certaines des
propriétés et méthodes utilisées avec l’objet FileSearch.
Tableau 13-1. Liste des propriétés et méthodes
de l’objet FileSearch
Propriété ou méthode Résultat
FileName Recherche le nom du fichier spécifié. Vous pouvez utiliser
des caractères génériques dans le critère de recherche.
FoundFiles Retourne un objet qui contient les noms des fichiers trouvés.
LookIn Spécifie le répertoire à parcourir.
SearchSubFolders Si elle est positionnée sur True, cette propriété effectue la
recherche dans les sous-dossiers ou les ignore si elle est
positionnée sur False.

304
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers

Tableau 13-1. Liste des propriétés et méthodes


de l’objet FileSearch (Suite)

Chapitre 13
Propriété ou méthode Résultat
Execute Commence la recherche.
NewSearch Efface les résultats des précédentes recherches présents
dans l’objet FileSearch.

Prenons l’exemple suivant, dans lequel la variable objet FS est déclarée comme
faisant partie de l’objet Office.FileSearch. Le préfixe Office n’est pas obligatoire,
mais il précise que l’objet FileSearch est un objet de la bibliothèque Office. Dans
le code, la propriété FileSearch de l’objet Application d’Excel retourne une réfé-
rence à l’objet FileSearch et l’assigne à la variable FS. Les valeurs sont ensuite assi-
gnées à un certain nombre de propriétés FileSearch. La propriété LookIn indique
à FileSearch le sous-répertoire à parcourir. La méthode NewSearch efface toutes
les propriétés FileSearch excepté LookIn. Ces propriétés étant maintenues tant
qu’Excel est ouvert, il est préférable d’exécuter la méthode NewSearch chaque
fois que vous utilisez la méthode FileSearch. La propriété SearchSubFolders con-
trôle si la recherche s’effectue dans les sous-répertoires qui se trouvent sous le
sous-répertoire LookIn.

Remarque Veillez à effacer vos paramètres de recherche antérieurs en exé-


cutant la méthode NewSearch chaque fois que vous utilisez la méthode File-
Search. Les propriétés FileSearch sont conservées dans l’application Excel
pendant toute la session Excel en cours.

Sub FindAccountingExcelFiles()
Dim FS As Office.FileSearch
Dim strPath As String
Dim vaFileName As Variant
Dim strMessage as String
Dim i As Long
Dim iCount As Long

Set FS = Application.FileSearch
strPath = "C:\GSC\Accounting"

With FS
.NewSearch
.LookIn = strPath
.SearchSubFolders = True
.FileType = msoFileTypeExcelWorkbooks
.LastModified = msoLastModifiedAnyTime
iCount = .Execute

strMessage = Format(iCount, "0 ""Files Found""")

For Each vaFileName In .FoundFiles


strMessage = strMessage & vbCr & vaFileName
Next vaFileName

305
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


MsgBox strMessage
End With
Chapitre 13

End Sub

La propriété FileType détermine les extensions de fichiers incluses dans le critère


de recherche. La constante msoFileTypeExcelWorkbooks mène la recherche pour
inclure toutes les extensions de fichier Excel : .xls, .xlt, .xlm, .xlc et .xla. Le
tableau 13.2 liste les autres constantes disponibles.
Tableau 13-2. Liste des types de fichiers et leurs valeurs
Constantes msoFileType Valeur
msoFileTypeAllFiles 1
msoFileTypeOfficeFiles 2
msoFileTypeWordDocuments 3
msoFileTypeExcelWorkbooks 4
msoFileTypePowerPointPresentations 5
msoFileTypeBinders 6
msoFileTypeDatabases 7
msoFileTypeTemplates 8
msoFileTypeOutlookItems 9
msoFileTypeMailItem 10
msoFileTypeCalendarItem 11
msoFileTypeContactItem 12
msoFileTypeNoteItem 13
msoFileTypeJournalItem 14
msoFileTypeTaskItem 15
msoFileTypePhotoDrawFiles 16
msoFileTypeDataConnectionFiles 17
msoFileTypePublisherFiles 18
msoFileTypeProjectFiles 19
msoFileTypeDocumentImagingFiles 20
msoFileTypeVisioFiles 21
msoFileTypeDesignerFiles 22
msoFileTypeWebPages 23

La propriété LastModified peut utiliser les constantes listées dans le tableau 13.3.

306
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers

Tableau 13-3. Liste des propriétés LastModified et leurs valeurs

Chapitre 13
Constantes msoLastModified Valeur
msoLastModifiedYesterday 1
msoLastModifiedToday 2
msoLastModifiedLastWeek 3
msoLastModifiedThisWeek 4
msoLastModifiedLastMonth 5
msoLastModifiedThisMonth 6
msoLastModifiedAnyTime 7

Au lieu d’utiliser la propriété FileType, vous pouvez spécifier la propriété File-


Name.

.FileName = "*.xls"

La propriété FileName permet de préciser davantage la recherche que la cons-


tante FileType. Si vous utilisez FileType et FileName, la propriété FileName sur-
passe la propriété FileType. Vous pouvez également rechercher le texte contenu
dans les propriétés d’un fichier ou dans le corps du fichier en assignant le texte à
la propriété TextOrProperty de l’objet FileSearch.
La méthode Execute de l’objet FileSearch effectue la recherche et ajoute un objet
représentant chaque fichier à la collection FoundFiles. Elle retourne également
une valeur qui correspond au nombre de fichiers trouvés.
La collection FoundFiles permet d’accéder aux noms des fichiers trouvés avec
leur chemin d’accès. Le code de l’exemple précédent utilise la boucle For
Each...Next pour traiter la liste, ajoutant chaque nom à strMessage en les séparant
par un retour chariot.

Limiter la recherche
Il peut arriver que vous deviez ouvrir un fichier ancien de plusieurs mois et que
vous ne vous souveniez pas de son emplacement. Nous rencontrons tous ce pro-
blème à un moment ou l’autre. La fonctionnalité Recherche de fichier dans Excel
permet d’accomplir cette tâche. Vous pouvez également faire appel à la collection
PropertyTests dans votre procédure VBA pour automatiser le processus de
recherche.
Par exemple, la société Mon Jardin a décidé de réorganiser ses fichiers histori-
ques. Tous les fichiers créés au cours de l’année précédente sont déplacés dans un
dossier Archive sur le serveur de la société. La procédure suivante recherche les
fichiers modifiés au cours du mois précédent :

Sub FindLastMonthFiles()
Dim FS As Office.FileSearch
Dim vaFileName As Variant

307
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Dim strMessage as String
Dim i As Long
Chapitre 13

Dim iCount As Long

Set FS = Application.FileSearch
strPath = "C:\GSC\Accounting"

With FS
.NewSearch
.LookIn = strPath
.SearchSubFolders = True

With .PropertyTests
For i = .Count To 1 Step -1
.Remove i
Next i

.Add Name:="Types de fichiers", _


Condition:=msoConditionFileTypeExcelWorkbooks
End With

.LastModified = msoLastModifiedLastMonth
iCount = .Execute
")
strMessage = Format(iCount, "0 ""fichier(s) trouvé(s)"""

For Each vaFileName In .FoundFiles


strMessage = strMessage & vbCr & vaFileName
Next vaFileName

MsgBox strMessage
End With
End Sub

La collection PropertyTests fonctionne indépendamment de tout paramètre du


volet Office Recherche de fichiers. Cette collection ne reconnaît pas les condi-
tions du volet Office et n’en modifie pas les paramètres. Si vous ajoutez des tests
à la collection PropertyTests, ils sont conservés jusqu’à l’exécution d’une
méthode NewSearch.
La méthode Add de la collection PropertyTests ajoute de nouveaux tests, que l’on
spécifie en assignant au paramètre Name une chaîne identique à celle qui se
trouve dans la zone de liste déroulante Propriété du volet Office Recherche de
fichiers.
La propriété FileType de l’objet FileSearch peut servir à limiter la recherche à un
ou plusieurs types de fichiers spécifiques. La collection FileTypes permet de pré-
ciser plusieurs types de fichiers. L’exemple suivant retourne tous les fichiers
Microsoft Word et Excel qui se trouvent dans les dossiers spécifiques :

Sub FindWordandExcelFiles()
Dim FS As Office.FileSearch
Dim vaFileName As Variant
Dim stMessage As String
Dim i As Long

308
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers


Dim iCount As Long

Chapitre 13
Set FS = Application.FileSearch
strPath = "C:\GSC\Accounting"

With FS
.NewSearch
.FileType = msoFileTypeExcelWorkbooks
.FileTypes.Add msoFileTypeWordDocuments
.LookIn = strPath
.SearchSubFolders = True
.LastModified = msoLastModifiedAnyTime
iCount = .Execute
stMessage = Format(iCount, "0 ""fichier(s) trouvé(s)""")

For Each vaFileName In .FoundFiles


stMessage = stMessage & vbCr & vaFileName
Next vaFileName

MsgBox strMessage
End With
End Sub

La collection FileTypes est conservée jusqu’à l’exécution d’une méthode New-


Search, qui efface la collection et place la valeur de la constante msoFileTypeOf-
ficeFiles dans la collection. Il n’est cependant pas nécessaire de vider la collection
FileTypes avant d’ajouter de nouvelles entrées. Si vous assignez une entrée au
paramètre FileType, toutes les entrées existantes dans la collection FileTypes sont
détruites et la nouvelle entrée devient la première et la seule entrée de la collec-
tion. Vous pouvez ensuite utiliser la méthode Add de la collection pour ajouter
d’autres entrées. Pour ce faire, servez-vous des constantes listées précédemment
dans le chapitre.
Tout le code que nous avons étudié dans cette section suppose que vous connais-
sez l’organisation des répertoires de l’ordinateur sur lequel vous effectuez la
recherche et que vous pouvez indiquer les sous-répertoires à parcourir. En
revanche, si vous ne connaissez pas la structure et devez la créer, vous devez con-
cevoir un utilitaire pour rechercher les fichiers sur n’importe quel ordinateur.
La collection SearchScopes propose un mécanisme qui permet de réaliser un pro-
cessus de cartographie des répertoires. L’exemple suivant examine chaque mem-
bre de la collection, chaque membre étant un objet SearchScope.

Sub ListSearchScopeOptions()
Dim SS As SearchScope
Dim strMessage as String

For Each SS In Application.FileSearch.SearchScopes


strMessage = strMessage & SS.ScopeFolder.Name & vbTab
strMessage = strMessage & " Type=" & SS.Type & vbCr
Next SS

MsgBox strMessage
End Sub

309
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Les objets SearchScope représentent les structures que vous examinez. La pro-
priété Type identifie la catégorie de chaque structure. La présence de Poste de tra-
Chapitre 13

vail et de Favoris réseau n’est pas une surprise. Le résultat du code devrait être
similaire à celui de la figure 13.1.

Figure 13-1. Résultat de la procédure ListSearchScopeOptions. Votre résultat


sera différent selon la configuration de votre ordinateur.

Il existe quatre constantes SearchIn, listées dans le tableau 13.4.


Tableau 13-4. Liste des propriétés msoSearchIn et leurs valeurs
Constantes msoSearchIn Valeur
msoSearchInMyComputer 0
msoSearchInOutlook 1
msoSearchInMyNetworkPlaces 2
msoSearchInCustom 3

La propriété ScopeFolder est à la disposition de l’objet SearchScope et référence


un objet ScopeFolder. ScopeFolder représente le sommet de la structure de la col-
lection ScopeFolders qui contient d’autres objets ScopeFolder. L’exemple suivant
affiche les propriétés Name et Path de la collection ScopeFolders, le niveau supé-
rieur de l’objet ScopeFolder de chaque structure.

Sub ListScopeFolderObjects()
Dim SS As SearchScope
Dim SF As ScopeFolder
Dim strMessage as String

Application.FileSearch.RefreshScopes

For Each SS In Application.FileSearch.SearchScopes


Select Case SS.Type

Case msoSearchInMyComputer
strMessage = SS.ScopeFolder.Name & vbCr
For Each SF In SS.ScopeFolder.ScopeFolders
strMessage = strMessage & SF.Name & vbTab & vbTab
strMessage = strMessage & "Chemin d'accès = " &
SF.Path & vbCr
Next SF

Case msoSearchInMyNetworkPlaces
strMessage = strMessage & vbCr & SS.ScopeFolder.Name &
vbCr
For Each SF In SS.ScopeFolder.ScopeFolders
strMessage = strMessage & SF.Name & vbTab

310
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers


strMessage = strMessage & "Chemin d'accès = " &
SF.Path & vbCr

Chapitre 13
Next SF

Case msoSearchInOutlook
strMessage = strMessage & vbCr & SS.ScopeFolder.Name &
vbCr
For Each SF In SS.ScopeFolder.ScopeFolders
strMessage = strMessage & SF.Name & vbTab & vbTab
strMessage = strMessage & "Chemin d'accès = " &
SF.Path & vbCr
Next SF

Case Else
strMessage = strMessage & vbCr & "Objet SearchScope
inconnu"

End Select
Next SS

MsgBox strMessage

End Sub

Ce code retourne un résultat similaire à celui de la figure 13.2.

Figure 13-2. Résultat de la procédure ListScopeFolderObjects. Votre résultat


sera différent selon la configuration de votre ordinateur.

Nous avons employé des instructions Select Case pour isoler et examiner chaque
structure de niveau supérieur. Chaque collection ScopeFolders de niveau supé-
rieur contient des objets ScopeFolder qui représentent les répertoires racine des
structures de fichiers disponibles. Chacun de ces objets ScopeFolder contient une
autre collection ScopeFolders qui représente les sous-répertoires se trouvant en
dessous d’elle. Il est ainsi possible de parcourir les arborescences de répertoires.
La collection SearchFolders définit d’autres chemins d’accès de répertoires à par-
courir en ajoutant les objets ScopeFolder à la collection. Elle est différente de la
collection FileTypes recréée lorsque vous assignez une valeur à la propriété
FileType. Elle n’est pas affectée si vous assignez une valeur à la propriété LookIn

311
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


ou si vous exécutez NewSearch. La valeur LookIn vient en supplément des entrées
SearchFolders.
Chapitre 13

La collection SearchFolders est également conservée pendant toute la session


Excel en cours ; pensez à la vider avant d’exécuter une nouvelle recherche. Pour
ce faire, n’oubliez pas de boucler dans chaque objet ScopeFolder et de le suppri-
mer. Revoyons l’exemple précédent pour une meilleure compréhension de la
recherche au sein de tous les sous-répertoires du répertoire racine sur le lecteur
C. Lorsque la procédure trouve un répertoire qui commence par les caractères
Produit, elle ajoute le répertoire à la collection SearchFolders.

Sub SetupSearchFoldersCollection()
Dim FS As FileSearch
Dim SS As SearchScope
Dim SF As ScopeFolder
Dim sfSubFolder As ScopeFolder
Dim strMessage as String
Dim i As Long

Set FS = Application.FileSearch

For i = FS.SearchFolders.Count To 1 Step -1


FS.SearchFolders.Remove i
Next i

For Each SS In FS.SearchScopes


Select Case SS.Type
Case msoSearchInMyComputer
For Each SF In SS.ScopeFolder.ScopeFolders
Select Case SF.Path
Case "C:\"
For Each sfSubFolder In SF.ScopeFolders
If UCase(Left(sfSubFolder.Name, 6)) = _
"PRODUIT" Then
sfSubFolder.AddToSearchFolders
End If
Next sfSubFolder
Exit For
End Select
Next SF
Exit For
End Select
Next SS
Search_SearchFolders
End Sub

Cet exemple vide la collection SearchFolders puis parcourt les collections


SearchScopes et ScopeFolders pour localiser le lecteur C. Le code évalue ensuite la
propriété Name de chaque ScopeFolder du répertoire racine du lecteur C pour
déterminer si le nom commence par Produit. La comparaison de texte étant sen-
sible à la casse, on convertit la propriété Name en majuscules.
L’exemple précédent dépend de la procédure Search_SearchFolders. Lorsque le
code trouve un répertoire correspondant, il utilise la méthode AddToSearchFol-

312
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers


ders de l’objet ScopeFolder pour ajouter l’objet à la collection SearchFolders. Voici
la routine Search_SearchFolders :

Chapitre 13
Sub Search_SearchFolders()
Dim FS As Office.FileSearch
Dim vaFileName As Variant
Dim strMessage as String
Dim iCount As Long

Set FS = Application.FileSearch

With FS
.NewSearch
.LookIn = "c:\"
.SearchSubFolders = True
.Filename = "*.xls"
.LastModified = msoLastModifiedAnyTime
iCount = .Execute
strMessage = Format(iCount, "0 ""fichier(s) trouvé(s)""")
For Each vaFileName In .FoundFiles
strMessage = strMessage & vbCr & vaFileName
Next vaFileName
MsgBox strMessage
End With
End Sub

La collection Search_SearchFolders définit la propriété LookIn de FileSearch sur le


lecteur C pour s’assurer qu’il ne contient pas de références de répertoires prove-
nant des opérations FileSearch antérieures.

Au Quotidien
Déterminer si un fichier existe avec FileSearch

Il peut arriver que la procédure ne parvienne pas à s’exécuter correctement


sans un fichier particulier. Pour déterminer si ce fichier existe, il suffit
d’employer une fonction. Par exemple, la fonction suivante a été écrite pour
vérifier si un fichier et son chemin d’accès sont valides. La fonction retourne
True si le fichier existe et False dans le cas contraire.

Function FileExists(path, fname) As Boolean


With Application.FileSearch
.NewSearch
.filename = fname
.LookIn = path
.Execute
If .FoundFiles.Count = 1 Then
FileExists = True
Else
FileExists = False
End If
End With
End Function

313
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Retrouver des fichiers avec la boîte de dialogue FileDialog


Chapitre 13

L’objet FileDialog permet d’afficher les boîtes de dialogue Ouvrir et Enregistrer


sous par le biais du code VBA. Les méthodes GetOpenFileName et GetSaveAsFi-
leName de l’objet Application donnent des résultats similaires et peuvent servir
dans le cadre de la rétrocompatibilité. Toutefois, l’objet FileDialog est à la dispo-
sition de toutes les applications Office et possède une interface familière aux uti-
lisateurs.
Dans l’exemple suivant, la société Mon Jardin possède une liste d’images qu’elle
utilise dans son catalogue de printemps. On vous a demandé de créer une feuille
de calcul qui permette aux utilisateurs de choisir les images et d’insérer un
aperçu dans la feuille de calcul.

Important Les deux procédures suivantes supposent qu’il existe une feuille
de calcul intitulée AperçuImage dans le classeur actif.

Private Sub cmdGetFile_Click()


Dim FD As FileDialog
Dim FFs As FileDialogFilters
Dim strFileName As String

On Error GoTo Problem

Set FD = Application.FileDialog(msoFileDialogOpen)

With FD
Set FFs = .Filters

With FFs
.Clear
.Add "Pictures", "*.jpg"
End With

If .Show = False Then Exit Sub

Worksheets("AperçuImages").Pictures.Insert (.SelectedItems(1))

End With

Exit Sub

Problem:
MsgBox "Vous n'avez pas sélectionné d'image valide."

End Sub

La propriété FileDialog de l’objet Application retourne une référence à l’objet


Office FileDialogs. Le tableau 13.5 liste les constantes msofileDialogType disponi-
bles pour spécifier le type de la boîte de dialogue.

314
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers

Tableau 13-5. Liste des types de boîtes de dialogue et leurs

Chapitre 13
valeurs
Constantes msoFileDialog Valeur
msoFileDialogOpen 1
msoFileDialogSaveAs 2
msoFileDialogFilePicker 3
msoFileDialogFolderPicker 4

La propriété Filters de l’objet FileDialog retourne une référence à la collection


FileDialogFilters pour FileDialog. Les filtres contrôlent les types de fichiers affi-
chés. Par défaut, il existe 24 filtres prédéfinis que l’utilisateur peut sélectionner
dans une liste déroulante, située dans la partie inférieure de la boîte de dialogue
Ouvrir. La méthode Clear de la collection FileDialogFilters supprime les filtres
présents. Nous ajoutons ensuite notre propre filtre qui affiche uniquement les
fichiers .jpg.
La méthode Show de l’objet FileDialog affiche la boîte de dialogue. Lorsque l’uti-
lisateur clique sur le bouton Ouvrir, la méthode Show retourne une valeur True.
Si l’utilisateur clique sur le bouton Annuler, la méthode Show retourne False et
on quitte la procédure.
La méthode Show n’ouvre pas réellement le fichier sélectionné, mais elle place le
nom du fichier et son chemin d’accès dans la collection FileDialogSelectedItems.
Il est possible de définir cette propriété pour permettre aux utilisateurs de sélec-
tionner plusieurs fichiers. Par défaut, le nom du fichier est retourné par le pre-
mier élément de la collection FileDialogSelectedItems, auquel on se réfère par la
propriété SelectedItems de l’objet FileDialog.
Il y a peu de différences entre les quatre types de boîtes de dialogue possibles, en-
dehors de l’en-tête dans la barre de titre. La barre de titre des types Sélecteur de
fichier et Sélecteur de dossier contient le mot Parcourir et les autres présentent
Ouvrir ou Enregistrer sous, selon le cas. Toutes les boîtes de dialogue présentent
les dossiers et les fichiers, exceptée la boîte de dialogue Sélecteur de dossier, qui
n’affiche que des dossiers.
La méthode Show affiche l’objet FileDialog et les éléments choisis sont placés
dans l’objet FileDialogSelectedItems sans qu’ils soient ouverts ou enregistrés.
L’exemple suivant montre comment employer la méthode Execute avec les boîtes
de dialogue Ouvrir et Enregistrer sous pour réaliser les opérations nécessaires
dès que l’utilisateur clique sur le bouton Ouvrir ou Enregistrer.

With Application.FileDialog(xlDialogOpen)
If .Show Then .Execute
End With

Prenons l’exemple suivant. La procédure cmdShowProductImage_Click a été


modifiée pour permette à l’utilisateur de sélectionner plusieurs fichiers en main-
tenant enfoncée les touches MAJ ou CTRL tout en cliquant sur les noms de

315
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


fichiers. Ces derniers sont ensuite chargés dans une zone de liste intitulée lstLis-
teFichiers, ce qui permet à l’utilisateur d’afficher les fichiers en sélectionnant
Chapitre 13

leurs noms.

Private Sub cmdShowProductImage_Click()


Dim FD As FileDialog
Dim FFs As FileDialogFilters
Dim strFileName As String
Dim vaItem
Dim intCounter as Integer

On Error GoTo Problem

Set FD = Application.FileDialog(msoFileDialogOpen)

With FD
Set FFs = .Filters

With FFs
.Clear
.Add "Pictures", "*.jpg"
End With

.AllowMultiSelect = True

If .Show = False Then Exit Sub

intCounter = 1

For Each vaItem In .SelectedItems


Worksheets("AperçuImages").Pictures.Insert _
(.SelectedItems(intCounter))
intCounter = intCounter + 1
Next vaItem

End With

Exit Sub

Problem:
MsgBox "Vous n'avez pas sélectionné une image valide."

End Sub

La propriété AllowMultiSelect est positionnée sur True, ce qui permet à l’utilisa-


teur de sélectionner plusieurs fichiers. La zone de liste est vidée de toute entrée
antérieure et la boucle For…Each ajoute les éléments dans la collection FileDia-
logSelectedItems. On positionne la propriété ListIndex sur 0 chaque fois que l’uti-
lisateur sélectionne un nouveau fichier puis on exécute la procédure
d’événement Change pour charger la nouvelle image.

316
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers

Au Quotidien

Chapitre 13
Déterminer si un fichier existe avec FileDialog

Précédemment dans ce chapitre, nous avons vu comment déterminer l’exis-


tence d’un fichier avec l’objet FileSearch. Maintenant que nous avons étudié
l’objet FileDialog, examinons la fonction suivante. Elle retourne les mêmes
résultats, mais on utilise une méthode différente pour les obtenir. La fonction
retourne True si le fichier existe et False dans le cas contraire.

Function FileExists2(fname) As Boolean


Set FileSys = CreateObject("Scripting.FileSystemObject")
FileExists2 = FileSys.FileExists(fname)
End Function

La fonction crée une instance de l’objet FileSystemObject. Celui-ci donne


accès au système de fichiers de l’ordinateur. Une fois cet accès autorisé, la
fonction utilise la propriété FileExists de l’objet FileSys pour déterminer si le
fichier existe. Le code est beaucoup plus simple et plus élégant que dans
l’exemple précédent.

Écriture dans un fichier externe


VBA contient un certain nombre d’instructions qui permettent de manipuler les
fichiers. Avec ces instructions d’entrée/sortie, vous disposez d’un meilleur con-
trôle sur les fichiers qu’avec les options d’importation et d’exportation propo-
sées par Excel.
Voici la procédure standard pour écrire dans un fichier texte :
1 Ouvrez ou créez un fichier avec l’instruction Open.
2 Spécifiez la position dans le fichier avec la fonction optionnelle Seek.
3 Écrivez les données dans le fichier avec l’instruction Write # ou Print #.
4 Fermez le fichier avec l’instruction Close.

Remarque Ne confondez pas l’instruction VBA Open et la méthode Open de


l’objet Application. La première sert à ouvrir un fichier pour le lire ou y écrire
alors que la deuxième ouvre réellement le fichier.

Au Quotidien
Ouvrir un fichier texte

Avant de pouvoir lire ou écrire dans un fichier, vous devez l’ouvrir. L’instruction
Open est relativement versatile et sa syntaxe complexe.

Open pathname For mode [Access access] [l


lock] As [#]f
filenumber
reclength]
[Len=r

317
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

● pathname Élément obligatoire qui contient le nom et le chemin d’accès


Chapitre 13

du fichier à ouvrir.
● mode Élément obligatoire qui spécifie le mode utilisé par le fichier :
Append, Input, Output, Binary ou Random.

Remarque Dans le fichier d’aide VBA pour le paramètre mode, il est dit
que ce paramètre est obligatoire, mais si vous l’omettez, Excel suppose
que vous optez pour Random. Nous n’avons pas réussi à résoudre cette
contradiction, notre conseil est donc de toujours définir ce paramètre.

● access Spécifie l’opération de fichier : Read, Write ou Read Write.


● lock Spécifie l’état du fichier : Shared, Lock Read, Lock Write ou Lock
Read Write.
● filenumber Élément obligatoire qui définit le numéro de fichier sur une
valeur entre 1 et 511. La fonction FreeFile peut servir à assigner le pro-
chain numéro disponible.
● reclength Définit la longueur de l’enregistrement pour les fichiers
ouverts en mode Random ou la taille de tampon pour les fichiers
séquentiels.

L’exemple suivant exporte les données d’une plage spécifiée vers un fichier texte
CSV. Notez que la procédure utilise des instructions Write #. La première ins-
truction se termine par un point-virgule, ce qui évite d’écrire la séquence retour
chariot/saut de ligne. Pour la dernière cellule d’une ligne, cependant, la
deuxième instruction Write # n’utilise pas le point-virgule, ce qui a pour consé-
quence de placer la sortie suivante sur une nouvelle ligne.

Sub ExportSelectedRange()
Dim FileName As String
Dim NumRows As Long
Dim NumCols As Integer
Dim r As Long
Dim c As Integer
Dim Data
Dim ExpRng As Range

Set ExpRng = Selection


NumCols = ExpRng.Columns.Count
NumRows = ExpRng.Rows.Count
FileName = "C:\fichiertexte.txt"
Open FileName For Output As #1
For r = 1 To NumRows
For c = 1 To NumCols
Data = ExpRng.Cells(r, c).Value
If IsNumeric(Data) Then Data = Val(Data)
If IsEmpty(ExpRng.Cells(r, c)) Then Data = ""
If c <> NumCols Then

318
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers


Write #1, Data;
Else

Chapitre 13
Write #1, Data
End If
Next c
Next r
Close #1
End Sub

La variable intitulée Data stocke le contenu de chaque cellule. Si la cellule est


numérique, la variable est convertie en valeur. Cette étape garantit que les don-
nées numériques ne sont pas stockées entre guillemets. Si une cellule est vide, sa
propriété Value retourne 0. En conséquence, le code vérifie également les cellules
vides avec la fonction IsEmpty et remplace le zéro par une chaîne vide. Il est éga-
lement important de se rappeler qu’une date est en réalité une valeur formatée
pour apparaître dans un format de date correct. Rappelez-vous que si les infor-
mations qui se trouvent dans la variable Data contiennent une date, la valeur est
celle qui sera réellement stockée dans cette variable.

Lecture dans un fichier externe


La procédure qui consiste à lire un fichier externe est similaire à celle employée
pour écrire dans un fichier externe. Voici les étapes nécessaires pour lire un
fichier texte avec VBA :
1 Ouvrez le fichier avec l’instruction Open.
2 Spécifiez la position dans le fichier avec la fonction optionnelle Seek.
3 Lisez les données du fichier avec l’instruction Input, Input # ou Line
Input #.
4 Fermez le fichier avec l’instruction Close.
L’exemple suivant lit le fichier texte créé dans l’exemple précédent et stocke les
valeurs en commençant par la cellule active. Le code lit chaque caractère et
sépare les lignes de données, ignorant les guillemets et recherchant les virgules
pour délimiter les colonnes.

Sub ImportRange()
Dim ImpRng As Range
Dim FileName As String
Dim r As Long
Dim c As Integer
Dim txt As String
Dim Char As String * 1
Dim Data
Dim i As Integer

Set ImpRng = ActiveCell


On Error Resume Next
FileName = "C:\fichiertexte.txt"
Open FileName For Input As #1
If Err <> 0 Then

319
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


MsgBox "Non trouvé : " & FileName, vbCritical, "ERREUR"
Exit Sub
Chapitre 13

End If
r = 0
c = 0
txt = ""
Do Until EOF(1)
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char = "," Then
ActiveCell.Offset(r, c) = txt
c = c + 1
txt = ""
ElseIf i = Len(Data) Then
If Char <> Chr(34) Then txt = txt & Char
ActiveCell.Offset(r, c) = txt
txt = ""
ElseIf Char <> Chr(34) Then
txt = txt & Char
End If
Next i
c = 0
r = r + 1
Loop
Close #1
End Sub

Remarque Cette procédure constitue un point de départ. Elle ne tient pas


compte de la gestion des données qui contiennent des virgules ou un guille-
met. Vous noterez également que si on importe une date, des signes de nom-
bres l’encadrent.

Recherche d’une valeur dans un fichier


Il n’est pas toujours nécessaire de copier l’ensemble du contenu d’un fichier
texte. Vous pouvez préciser votre recherche pour déterminer le texte recherché.
Lorsque le texte est trouvé, vous pouvez choisir les actions à entreprendre.
La procédure suivante se sert simultanément de deux fichiers texte. La procédure
FilterFile lit le texte de fichiertexte.txt et copie uniquement les lignes qui contien-
nent une chaîne de texte spécifique dans un fichier résultat.txt.

Sub FilterFile()
Open "c:\fichiertexte.txt" For Input As #1
Open "c:\résultat.txt" For Output As #2
TextToFind = "Janvier"
Do Until EOF(1)
Line Input #1, Data
If InStr(1, Data, TextToFind) Then
Print #2, Data
End If
Loop

320
Partie 4 : Fonctions VBA avancées

Manipulation des fichiers


Close
End Sub

Chapitre 13
Les objets FileSearch et FileDialog proposent d’intéressants outils dans le cadre
de la programmation VBA. Ces objets faisant partie du modèle d’objet Office, ils
possèdent l’avantage d’être à la disposition de toutes les applications Office.
L’objet FileSearch sert à localiser les fichiers possédant des caractéristiques com-
munes, comme des noms de fichiers ou des emplacements similaires, de sorte
qu’on puisse les traiter dans le code qui suit. L’objet FileDialog sert à afficher les
boîtes de dialogue Ouvrir et Enregistrer sous pour permettre à l’utilisateur de
naviguer au sein des dossiers. Il constitue un outil plus puissant que les fonctions
GetOpenFileName et GetSaveAsFileName utilisées dans les précédentes versions
d’Excel.
Les capacités de recherche de fichiers étudiées dans ce chapitre permettent
d’optimiser les projets sur lesquels vous travaillez. Limitez vos recherches avec les
critères étudiés, comme une extension de fichier spécifique ou une valeur dans
un fichier. Les techniques de recherche peuvent être incorporées dans vos projets
ultérieurs pour améliorer les résultats obtenus. Une fois les fichiers souhaités
localisés, vous pouvez lire leur contenu puis l’écrire dans de nouveaux fichiers si
nécessaire.

321
Partie 4 : Fonctions VBA avancées

Chapitre 14
Développement de
modules de classes
Introduction aux modules Construction d’une classe . . . . . 329
de classe . . . . . . . . . . . . . . . . . . 325 Conception pratique
Propriétés, méthodes d’une classe . . . . . . . . . . . . . . . 336
et événements . . . . . . . . . . . . . . 328

Ce chapitre introduit le concept de classes. Dans ce chapitre, vous allez étudier


les classes, les objets et en quoi ils sont différents. Vous apprendrez également à
construire des classes dans Microsoft Visual Basic pour Applications (VBA),
ainsi qu’à définir leurs propriétés, méthodes et événements.

Qu’est-ce qu’un objet ?


Un objet est un représentation logique d’une chose. Cette chose peut être une
entité physique comme une personne, une fleur, une machine ou un lieu. Cette
chose peut également représenter une entité logique comme un rapport, une
commande ou une transaction. Elle peut aussi représenter un élément de l’ordi-
nateur comme un bouton, une cellule, une feuille de calcul ou un formulaire.

Qu’est-ce qu’une classe ?


Une classe est un modèle à partir duquel on crée un objet. Ce modèle inclut des
variables et du code regroupés en une entité unique. L’objet représente une ins-
tance de classe que l’on peut manipuler par programmation.
Confus ? Considérez une classe comme un type de donnée, similaire à Integer ou
String. Avant de pouvoir utiliser le type Integer ou String, vous devez déclarer une
variable de ce type. De la même manière que vous pouvez définir plusieurs varia-
bles comme Integer ou String, vous pouvez définir plusieurs variables comme
instances d’une même classe.
On implémente les classes dans Visual Basic pour Applications par le biais du
module de classe. Chaque module de classe contient exactement une classe et
englobe toutes les propriétés, méthodes et événements associés à l’interface de la
classe, ainsi que toute autre variable, fonction ou sous-routine locales nécessaires
au fonctionnement de la classe.

323
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Que sont les propriétés ?


Les propriétés sont des attributs de la chose que représente un objet. Par exem-
ple, une fleur possède des attributs comme un nom, une couleur, une taille et
ainsi de suite. Les attributs d’une personne sont son nom, son adresse, son
numéro d’identification et sa date de naissance.
Un objet peut également contenir des références à d’autres objets. Par exemple,
une commande peut héberger une référence à un client ou un formulaire peut
contenir un bouton. Dans la cadre de cette explication, on peut aussi caractériser
Chapitre 14

ces références d’objets comme des propriétés.


Un objet peut représenter une collection de choses similaires. Par exemple,
l’objet Employés peut contenir une collection d’objets Employé individuels.

Astuce Les adjectifs décrivent le nom


Considérez les objets comme des noms et les propriétés comme des adjec-
tifs. Autrement dit, la fleur rouge ou une grande personne. Ce concept n’est
pas parfait puisque certains attributs sont relativement spécifiques, comme
un camion avec 55 230 km au compteur, mais cette idée peut vous aider à
débuter dans le monde des objets.

Que sont les méthodes ?


Les méthodes sont des actions que les objets effectuent. Par exemple, un objet
rapport peut contenir une méthode imprimer qui envoie le rapport à l’impri-
mante. On peut également envisager les méthodes de la manière suivante : elles
décrivent les opérations effectuées avec les informations contenues dans les pro-
priétés d’un objet.

Astuce Les verbes décrivent les actions


On peut comparer les méthodes à des verbes qui effectuent une opération ou
une tâche avec les propriétés de l’objet.

Que sont les événements ?


Bien qu’ils ne fassent pas strictement partie du modèle de programmation
d’objet, les événements constituent un outil intéressant qui permet à un objet de
communiquer des informations au programme qui a créé l’objet. Plus simple-
ment, un événement est une sous-routine appelée par l’objet et qui réside dans le
programme qui a créé l’objet.
Un événement constitue une technique pratique qui évite à un programme de
constamment surveiller les modifications d’un objet. Au lieu de cela, l’objet
appelle l’événement pour informer le programme appelant d’un changement
dans l’état de l’objet.

324
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

Introduction aux modules de classe


Les modules de classe sont parmi les outils les plus importants proposés au pro-
grammeur VBA. Un module de classe vous permet de créer vos propres objets,
que vous pouvez ensuite manipuler comme les objets fournis dans
Microsoft Excel. En outre, à l’instar de ces derniers, chaque module de classe
possède des propriétés, des méthodes et des événements.

Accéder aux objets

Chapitre 14
Il existe une différence fondamentale entre une simple variable et une variable
objet. Cette dernière n’est autre qu’un pointeur en mémoire. Vous devez explici-
tement créer l’objet et enregistrer son emplacement dans la variable objet. On
appelle ce processus créer une nouvelle instance d’un objet ou instancier un objet.
Les objets étant différents des variables, Visual Basic pour Applications utilise
une instruction spéciale, Set. L’instruction Set prend deux formes. Voici la
première :"

Set ObjectVariable = New ClassName

Dans cette forme, l’instruction Set crée un nouvel objet basé sur ClassName. Cela
signifie que Visual Basic alloue de la mémoire à l’objet et enregistre l’emplace-
ment mémoire dans la classe ObjectVariable.

Set ObjectVariable = ObjectExpression

Dans sa deuxième forme, l’instruction Set fait deux choses. Elle libère d’abord
l’objet vers lequel elle pointait puis elle enregistre un pointeur vers un objet exis-
tant dans la classe ObjectVariable.

Quand les objets sont-ils réellement créés ?


Le mot-clé New d’une instruction Dim, Public ou Private ne crée pas de nou-
velle instance d’un objet. À la place, Visual Basic ajoute du code devant cha-
que référence à l’objet pour voir si une nouvelle instance de la classe a été
créée. Dans le cas contraire, l’objet est automatiquement créé avant d’être uti-
lisé.

En général, peu importe que vous utilisiez une instruction Dim ou Set pour
créer une nouvelle instance de classe. Cependant, l’instruction Set New est
légèrement plus efficace que l’instruction Dim New. En effet, Visual Basic ne
génère pas de code supplémentaire pour vérifier qu’une nouvelle instance de
la classe a été créée.

325
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Si vous employez une instruction Set New à la place d’une instruction Dim
New, vous évitez également des problèmes de débogage. Supposons que vous
vous trouvez dans une situation où vous pensez avoir créé une nouvelle ins-
tance d’une classe, mais que pour une raison quelconque l’objet n’a pas été
créé. Avec l’approche Dim New, l’objet sera automatiquement créé et votre
programme va l’utiliser en supposant qu’il contient quelque information, ce qui
n’est pas le cas puisque l’objet vient d’être créé.

Avec l’instruction Set New, l’objet ne peut pas être créé à la volée et le pro-
gramme devra faire face à une erreur d’exécution s’il tente d’accéder à un
Chapitre 14

objet qui n’est pas encore créé. Bien qu’une erreur d’exécution ne soit pas
agréable, elle vous informe d’un problème dans le code. Sinon, vous ne
l’auriez éventuellement pas remarquée.

Déclarer des objets


Vous déclarez un objet avec une instruction Dim, Public ou Private en utilisant
deux formes différentes. Voici la première :

Dim ObjectVariable As ClassName

Cette instruction se contente de réserver de l’espace pour ObjectVariable et


d’assigner le type ClassName à la variable.

Dim ObjectVariable As New ClassName

Cette deuxième forme réalise les mêmes actions que la première, mais elle crée
automatiquement un nouvel objet la première fois que l’on référence ObjectVa-
riable.

Objets et Nothing
VBA propose une valeur spéciale appelé Nothing, que vous pouvez uniquement
exploiter avec les objets. Nothing est la valeur associée à une variable objet qui ne
pointe actuellement vers aucune instance de classe. Une variable objet déclarée
avec l’instruction Dim est initialement positionnée sur Nothing.
Pour déterminer si une nouvelle instance de classe a été créée, servez-vous de Is
Nothing dans une instruction If :

If ObjectVariable Is Nothing Then

Attention Bien que l’expression ObjectVariable Is Not Nothing peut sembler


logique en anglais, Visual Basic pour Applications ne la comprend pas. Si vous
devez vérifier qu’une variable objet se réfère à une instance d’un objet, utilisez
l’expression Not ObjectVariable Is Nothing.

326
Partie 4 : Fonctions VBA avancées

Développement de modules de classes


Le résultat du test Is Nothing est une valeur booléenne que vous pouvez utiliser
où il est possible d’employer une valeur booléenne.
Pour détruire un objet, servez-vous de l’instruction suivante :

Set ObjectVariable = Nothing

Cette instruction libère la référence à l’objet et positionne la variable objet dans


son état non initialisé. En supposant qu’une seule variable objet pointait vers
l’objet, cette instruction détruit également l’objet et libère toutes les ressources
qui lui sont associées.

Chapitre 14
Toutefois, si plusieurs variables objet pointent vers cet objet, elles doivent toutes
être positionnées sur Nothing avant de détruire l’objet. Par exemple, dans le frag-
ment de code suivant, l’objet créé par MaClasse continue d’exister, même si on a
positionné VariableObjet1 sur Nothing.

Set VariableObjet1 = New MaClasse


Set VariableObjet2 = VariableObjet1
Set VariableObjet1 = Nothing

Objets avec plusieurs variables objet


Il est important de se rappeler qu’un objet et une variable objet sont deux choses
différentes. Par exemple, le code suivant crée un objet vers lequel pointent deux
variables :

Set ObjetA = New MaClasse


Set ObjetB = ObjetA

La première instruction Set crée une nouvelle instance de MaClasse, alors que la
deuxième instruction Set crée uniquement un deuxième pointeur vers le même
objet, créé par la première instruction.
Cela signifie que les instructions suivantes effectuent la même tâche puisque
ObjetA et ObjetB pointent vers le même objet :

ObjetA.Name = "Roses"
ObjetB.Name = "Roses"

En outre, l’exécution de l’instruction suivante ne détruit pas l’objet.

Set ObjetA = Nothing

Puisque ObjetB pointe toujours vers l’objet, il reste en mémoire jusqu’à ce


qu’ObjetB soit également positionné sur Nothing.

327
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Propriétés, méthodes et événements


Chaque objet est associé à une collection de propriétés, de méthodes et d’événe-
ments qui servent à communiquer des informations entre l’objet et la routine
qui l’a créé.

Propriétés, méthodes et événements : Public ou Private ?


Les différentes parties d’une classe peuvent être définies comme Public ou Pri-
vate. Tout ce qui est marqué comme Public est accessible à toutes les procédures,
Chapitre 14

dans l’ensemble des modules de toutes les applications, alors que ce qui est mar-
qué comme Private est uniquement accessible à partir du code de la classe.

Astuce Ne vous fiez pas aux valeurs par défaut


Marquez toujours de manière explicite tout ce que contient une classe avec Pri-
vate ou Public, pour ne pas avoir à vous soucier d’une valeur par défaut.

Propriétés
Un classe contient différents éléments. On définit les variables de classe auxquel-
les on accède à partir de n’importe quel emplacement de la classe. Si une variable
de classe est marquée comme Public, elle est accessible à toutes les procédures qui
exploitent la classe et constitue une propriété de la classe.
Outre les variables de classe publiques, les propriétés peuvent être associées à du
code. Chaque propriété dans laquelle vous voulez utiliser le code est organisée en
deux routines, qui retournent la valeur au programme appelant ou changent la
valeur dans la classe. La routine Get retourne une valeur à l’appelant, alors que la
routine Let ou Set permet à l’appelant d’assigner une valeur à la propriété.
Rappelez-vous que vous pouvez définir une propriété uniquement avec une rou-
tine Get ou une routine Set ou Let. Si vous utilisez uniquement une routine Get,
la propriété est en lecture seule et le programme qui exploite l’objet ne peut pas
modifier sa valeur. De même, si vous incluez uniquement une routine Let ou Set,
la propriété est en écriture seule et le programme appelant ne peut pas afficher sa
valeur.

Méthodes
Outre les variables de classe et les routines de propriétés, une classe peut égale-
ment contenir une série de sous-routines et de fonctions. Si une fonction ou une
sous-routine est marquée comme Public, elle constitue une méthode. Vous pou-
vez invoquer les méthodes à partir du code qui réside dans la classe ou en-
dehors.

328
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

Événements
Les événements sont des sous-routines qui existent en-dehors du code associé à
la classe et qui peuvent être appelés par des instructions résidant dans la classe.
Les événements permettent à une classe d’interrompre le programme qui a créé
une instance de l’objet à partir de la classe et, en conséquence, autorisent le pro-
gramme à réaliser son propre traitement en réponse à une situation rencontrée
par l’objet. Rappelez-vous que le code associé à un événement réside en réalité
en-dehors de la classe. La définition de l’événement, y compris les paramètres
passés au programme externe, constitue la seule information stockée dans la

Chapitre 14
classe.

Remarque Vous devez placer le mot-clé WithEvents dans la déclaration de


l’objet pour les classes contenant des événements. Si la déclaration ne con-
tient pas ce mot-clé, le programme externe ignore tout événement qui se pro-
duit.

L’ensemble des propriétés, méthodes et événements publics d’une classe forment


l’interface de l’objet. Celle-ci isole le code au sein de la classe du code qui exploite
les objets créés à partir de cette classe. Cette isolation est indispensable à plu-
sieurs titres. Premièrement, elle permet de créer la classe indépendamment du
reste de l’application. Une fois que vous jugez la classe stable, elle peut vous ser-
vir de boîte noire. Deuxièmement, elle simplifie la collaboration de plusieurs
personnes sur une même application. Une personne peut se concentrer sur la
classe, alors que les autres travaillent sur le code qui l’exploite. Troisièmement, il
est possible de modifier le code dans la classe sans nécessairement impacter les
applications qui exploitent la classe. Vous pouvez ainsi mettre en œuvre de nou-
veaux algorithmes ou ajouter de nouvelles fonctionnalités à la classe sans modi-
fier les programmes qui l’exploitent.

Construction d’une classe


Le module de classe contient toutes les propriétés, méthodes et événements asso-
ciés à l’interface de la classe, ainsi que les variables, fonctions et sous-routines
locales exploitées par la classe.

Créer un module de classe


Pour ajouter un module de classe à votre programme VBA, dans le menu Inser-
tion de Visual Basic, choisissez Module de classe. Le nom initial de la classe est
formé en ajoutant un numéro unique au mot Classe. Ainsi, la première classe que
vous créez porte le nom Classe1 et la deuxième sera libellée Classe2.
Ce nom n’étant guère descriptif, assignez toujours un nom plus descriptif à vos
classes. Pour ce faire, sélectionnez la classe dans l’Explorateur de projets et dans
la fenêtre Propriétés, modifiez la propriété Name associée à la classe (voir
figure 14.1).

329
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Chapitre 14

Figure 14-1. Servez-vous de la fenêtre Propriétés pour modifier la propriété


Name associée à la classe.

Définir les propriétés simples


Il existe deux types de propriétés : les variables de classe publiques et les routines
de propriété. Les variables de classe doivent être définies avant toute sous-rou-
tine, fonction ou routine de propriété. Dans la pratique, cela signifie que toutes
vos variables de classe doivent se trouver au début du module de classe.
Par exemple, la ligne suivante définit une propriété simple :

Public IDProduit As Long

Attention Vous ne pouvez pas utiliser les propriétés simples pour retourner
un tableau, une chaîne de longueur fixe, une constante ou une structure com-
plexe créée avec une instruction Type. Si votre propriété doit retourner l’un de
ces éléments, créez une variable de classe privée appropriée puis créez une
routine de propriété qui effectue la même action. Vous pouvez, par exemple,
créer une routine de propriété qui accepte une série de paramètres permettant
à la routine de ressembler à un tableau. Vous pouvez, en outre, créer une rou-
tine de propriété qui accepte et retourne des chaînes de longueur fixe ou des
structures complexes.

330
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

Définir les routines de propriété


Il existe trois routines de propriété différentes : Get, Set et Let. La routine Pro-
perty Get retourne toujours une valeur. Voici un exemple qui référence une varia-
ble de classe privée intitulée LeNomDuProduit.

Public Property Get NomProduit As String

NomProduit = LeNomDuProduit

End Property

Chapitre 14
Les routines Property Let et Property Set sont appelées pour enregistrer une
valeur dans la propriété. On utilise l’instruction Property Let lorsque la propriété
est une variable normale et l’instruction Property Set si la propriété représente un
objet.
Voici la routine Property Let correspondant à la propriété NomProduit :

Public Property Let NomProduit(value As String)

LeNomDuProduit = value

End Property

Remarque La seule différence entre une instruction Property Set et une ins-
truction Property Let est que vous utilisez la première pour assigner des objets
et la deuxième pour assigner des valeurs. De même, vous employez l’instruc-
tion Property Let si vous retournez n’importe quelle autre valeur.

Les routines de propriété peuvent posséder des paramètres. Ces derniers servent
essentiellement à simuler un tableau. Par exemple, le fragment de code suivant
déclare une variable de classe privée libellée MesNoms, qui représente un tableau
de 100 String. Le fragment de code contient également deux routines de pro-
priété qui représente la propriété sous forme de tableau.

Private MesNoms (99) As String

Public Property Get NomTableau(index As Long) As String

NomTableau= MesNoms(index)

End Property

Public Property Let NomTableau(index As Long, value as String)

MesNoms = value

End Property

331
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Remarque Vous pouvez spécifier autant de paramètres que vous le souhaitez


dans les routines de propriété. Ils doivent, cependant, être identiques entre
les routines Get et Let/Set, excepté pour le tout dernier paramètre de la rou-
tine Let/Set, qui contient la valeur de la propriété.

Pour exploiter la classe, on accède à la propriété de la manière suivante :

MyObject.NameArray (10) = "Élément 10 du tableau"

Ou de la manière suivante :
Chapitre 14

MyVar = MyObject.NameArray (10)

Astuce Routines de propriété et paramètres


Bien qu’il soit possible de spécifier une liste de paramètres pour une routine
de propriété, limitez leur utilisation à ceux qui représentent la routine de pro-
priété sous forme de tableau. Si vous devez employer d’autres paramètres que
des sous-scripts, envisagez de créer une ou plusieurs méthodes avec les para-
mètres nécessaires.

Utiliser les instructions Property avec les


types définis par l’utilisateur
Si vous avez défini un jeu de routines de propriété pour manipuler une struc-
ture complexe créée avec une instruction Type, vous risquez de rencontrer des
problèmes lorsque vous tenterez d’assigner directement une valeur à l’un des
éléments de la structure en une seule instruction. Supposons que votre classe
contienne les instructions suivantes :

Public Type TypeCoordonnéesCarte


Latitude As Single
Longitude As Single
End Type

Private MesCoordonnéesCarte As TypeCoordonnéesCarte

Public Property Get CoordonnéesCarte As TypeCoordonnéesCarte

CoordonnéesCarte = MesCoordonnéesCarte

End Property

Public Property Let CoordonnéesCarte (value as TypeCoordonnéesCarte)

CoordonnéesCarte = value

End Property

332
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

Supposons maintenant que vous avez instancié la classe par RouteMicrosoft.


Vous pouvez référencer la valeur Latitude de la manière suivante :

TempLatitude = RouteMicrosoft.CoordonnéesCarte.Latitude

Puisque ceci fonctionne, vous serez tenté d’utiliser les instructions suivantes :

RouteMicrosoft.CoordonnéesCarte.Latitude = 47,63
RouteMicrosoft.CoordonnéesCarte.Longitude = 122,13

Chapitre 14
Si vous le faites, vous découvrirez que RouteMicrosoft.CoordonnéesCarte.Lati-
tude est égal à zéro !

Même si cela ressemble à un bogue de Visual Basic, il n’en est rien.


Visual Basic fonctionne correctement. Lorsque vous référencez l’élément Lati-
tude dans la première instruction, Visual Basic crée une variable TypeCoordon-
néesCarte temporaire et définit la valeur Latitude sur 47,63. Puisque la
variable temporaire est remplie de zéros lorsqu’elle est allouée et qu’aucune
valeur n’est explicitement assignée à Longitude, elle contient la valeur zéro. En
conséquence, lorsque la routine CoordonéesCarte Let est appelée, avec la
variable temporaire créé par Visual Basic, l’élément Latitude est positionné
sur 47,63 et l’élément Longitude est positionné sur zéro.

On retrouve la même situation lorsqu’on exécute la deuxième instruction.


Dans la mesure où nous n’avons pas assigné de valeur à Latitude dans la
variable temporaire, la valeur précédente de 47,63 est écrasée par zéro, ce
qui annule le changement effectué dans la première instruction.

Il existe deux solutions pour contourner ce problème. La première, et probable-


ment la meilleure, consiste à créer une classe au lieu d’utiliser une instruction
Type. Toutefois, si vous voulez réellement utiliser l’instruction Type, vous devez
vous-même créer une variable temporaire, assigner les valeurs à la structure
puis la structure à la propriété, en procédant comme suit :

Dim TempVar As TypeCoordonnéesCarte


TempVar.Latitude = 47,63
TempVar.Longitude = 122,13
RouteMicrosoft.CoordonnéesCarte = TempVar

Définir des méthodes


Les méthodes sont de simples fonctions et sous-routines publiques. Elles accep-
tent tout jeu de paramètres et retournent tout type de valeur. Elles accèdent éga-
lement à n’importe quelle variable de classe, publique ou privée, ainsi qu’à toute
routine de propriété.
Supposons, par exemple, que la classe contienne des informations relatives à un
produit particulier de la société Mon Jardin. Vous pouvez créer une fonction qui
calcule le prix net de la manière suivante :

333
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


Public Function PrixNet (Discount As Currency) As Currency

If Remise >= 0 and Remise < 1.0 Then


PrixNet = PrixCatalogue * (1 - Remise)

Else
PrixNet = PrixCatalogue

End If

End Function
Chapitre 14

Cette routine vérifie que le paramètre d’entrée est valide en s’assurant qu’il se
situe entre 0 et 1, puis calcule le prix net en fonction. Si la valeur de la remise
n’est pas valide, le tarif catalogue est retourné.

Astuce Économiser des cycles


Si vous avez le choix entre utiliser une routine de propriété ou une variable de
classe privée dans une méthode, servez-vous de la deuxième. Vous évitez
ainsi les cycles processeur et la mémoire supplémentaires que réclame la rou-
tine de propriété et accélérez votre application.

Définir des événements


Les événements peuvent s’avérer d’une grande utilité dans une classe, mais vous
ne pouvez supposer que toute personne qui exploitera votre classe se servira réel-
lement des événements. En conséquence, si vous décidez d’utiliser les événe-
ments dans votre classe, vous devez vous assurer que la classe continue de
fonctionner si un utilisateur ne répond à aucun événement.
L’instruction Event sert à définir un événement. Pour des raisons pratiques, il
s’agit en fait d’une instruction de sous-routine sans le code. Cette définition est
indispensable, puisqu’elle identifie les paramètres passés à l’événement. Le com-
pilateur Visual Basic utilise cette définition de l’événement pour vérifier que le
nombre de paramètres et leur type correspondent à la définition.

Remarque Bien qu’il soit possible de spécifier presque n’importe quel type
de paramètre utilisable dans une sous-routine, les événements ne peuvent
pas posséder d’arguments nommés, de paramètres optionnels ou d’argu-
ments ParamArray.

Voici un exemple de définition d’événement :

Event ErreurRemise (value As Currency, Msg As String)

Au sein de la classe, on utilise une instruction RaiseEvent pour déclencher un


événement dans le programme utilisateur. Le nom de l’instruction RaiseEvent
précède celui de l’événement, suivi d’une liste de valeurs passées au programme

334
Partie 4 : Fonctions VBA avancées

Développement de modules de classes


utilisateur. L’instruction suivante, par exemple, retourne deux valeurs au pro-
gramme appelant :

RaiseEvent ErreurRemise (discount, "Remise non valide."

Pour exploiter les événements dans une application, vous devez ajouter le mot-
clé WithEvents lors de la définition de l’objet. Sans ce mot-clé, tous les événe-
ments seront ignorés. L’instruction suivante montre comment déclarer un objet
avec des événements :

Chapitre 14
Dim WithEvents MonObjet As StéMonJardin

Définir des variables, sous-routines et fonctions privées


Bien qu’il ne soit pas indispensable de marquer les sous-routines et les fonctions
comme Private dans une classe, sans le mot-clé Private, toutes les sous-routines
ou fonctions prennent par défaut le mot-clé Public. Pour la majorité des cas, cela
ne présente aucun problème, en particulier si vous êtes celui qui exploite la
classe. En revanche, si vous envisagez de partager votre classe avec d’autres utili-
sateurs, ceux-ci pourraient référencer une routine pour laquelle vous avez acci-
dentellement omis le mot-clé Private, ce qui signifie que vous ne pouvez pas
modifier la définition de la routine sans impacter tous les programmes qui
l’exploitent.

Événements spéciaux pour les classes


VBA définit deux événements spéciaux pour toutes les classes : l’événement Ini-
tialize et l’événement Terminate.
L’événement Class_Initialize contient le code exécuté à la création d’un objet
basé sur cette classe. Il sert à initialiser les variables de classe, y compris l’exécu-
tion des instructions Set New nécessaires à la création de tout objet dont cet objet
a besoin.

Set ObjectVar = New MyClass

L’événement Class_Terminate contient le code qui s’exécute juste avant la des-


truction d’un objet. Il constitue l’emplacement idéal pour détruire tout objet
local à la classe en le positionnant sur Nothing avec un code comme :

Set ObjectVar = Nothing

Remarque Les événements Class_Initialize et Class_Terminate se déclen-


chent uniquement lorsque l’on crée ou détruit des objets réels. Il ne suffit pas
de définir une variable objet sur une autre pour déclencher l’événement
Class_Initialize. Si plusieurs variables objet pointent vers le même objet, le fait
de positionner l’une des variables sur Nothing ne déclenche pas l’événement
Class_Terminate.

335
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA

Résoudre des références


Il arrive qu’une variable locale et une variable de classe portent le même nom.
Cela se produit notamment lorsque vous donnez le même nom à un paramètre
d’une méthode et à une propriété. Pour différencier une variable de classe et une
variable locale ou un paramètre, préfixez la variable de classe avec Me., comme
dans l’exemple suivant :

If Me.Name <> Name Then


Chapitre 14

Dans cette instruction, la variable Me.Name fait référence à une variable de


classe, alors que la variable Name non qualifiée se réfère à une variable ou à un
paramètre locaux.

Astuce Identifier ce qui appartient au mot-clé Me


Le mot-clé Me sert également à qualifier tout élément public ou privé d’une
classe à partir du code de cette classe, y compris les variables de classe, les
sous-routines, les fonctions et les routines de propriété.

Conception pratique d’une classe


Maintenant que vous savez ce qu’est une classe et que vous connaissez les méca-
nismes de sa construction, il est intéressant d’aborder quelques techniques pra-
tiques de conception des classes.

Une classe simple


Créez des classes contenant uniquement des propriétés et aucune méthode (voir
figure 14.2).

336
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

Chapitre 14
Figure 14-2. Rien de plus facile que de construire une classe simple dans
Visual Basic Editor.

Pour créer cette classe, procédez de la manière suivante :


1 Sélectionnez Insertion, Module de classe dans le menu VBA.
2 Sélectionnez la nouvelle classe dans l’Explorateur de projets et remplacez
la propriété Name dans la fenêtre Propriétés par Plante.
3 Saisissez les instructions suivantes dans la fenêtre d’édition :

Public NomCommun As String


Public NomScientifique As String
Public Description As String
Public PrixDétail As Currency
Public PrixGros As Currency
Public NuméroProduit As Long

Étendre une classe simple


L’utilisation d’une classe pour conserver des données connexes présente un
avantage : vous disposez de plusieurs techniques simples pour l’étendre. Vous
pouvez, par exemple, ajouter un synonyme d’une propriété existante avec une
paire de routines de propriété :

Public Property Get NomCommun() As String

NomCommun = Nom

End Property

Public Property Let NomCommun(value As String)

Nom = value

337
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


End Property

Ces routines servent à retourner et à modifier une variable de classe, permettant


ainsi à l’utilisateur de manipuler la même valeur en utilisant deux noms diffé-
rents.
Une autre technique intéressante consiste à ajouter une méthode qui permet
d’initialiser toutes les propriétés de la classe en un seul appel. Notez que la rou-
tine suivante profite du mot-clé Me de sorte que toute personne qui exploite
cette méthode sait quel paramètre affecte quelle propriété.
Chapitre 14

Public Sub Init(Nom As String, _


NomScientifique As String, _
Description As String, _
PrixDétail As Currency, _
PrixGros As Currency, _
NuméroProduit As Long)

Me.Nom = Nom
Me.NomScientifique = NomScientifique
Me.Description = Description
Me.PrixDétail = PrixDétail
Me.PrixGros = PrixGros
Me.NuméroProduit = NuméroProduit

End Sub

Une classe de collection


On crée souvent une classe de collection pour conserver un groupe d’objets.
Cette tâche est grandement simplifiée par l’utilisation de l’objet Visual Basic Col-
lection pour stocker les données. Le code suivant déclare une variable objet Col-
lection locale à la classe. Lorsqu’on instancie la classe pour la première fois,
l’objet Collection est créé et si on détruit la classe, l’objet Collection l’est égale-
ment.

Private MesPlantes As Collection

Private Sub Class_Initialize()

Set MesPlantes = New Collection

End Sub

Private Sub Class_Terminate()

Set MesPlantes = Nothing

End Sub

On ajoute un objet à la collection avec le code suivant. Celui-ci suppose que le


type de la propriété Name de l’objet ajouté est String. La routine commence par
utiliser l’instruction On Error Resume Next pour désactiver le suivi des erreurs.

338
Partie 4 : Fonctions VBA avancées

Développement de modules de classes


Toute erreur oblige simplement Visual Basic à exécuter l’instruction suivante.
Pour détecter qu’une erreur s’est produite, on fait appel à l’objet Err.

Public Sub Add(Item As Plante)

Dim i As Long
Dim s As String

On Error Resume Next

i = 0

Chapitre 14
s = Item.Name
MesPlantes.Add Item, s
Do While Err.Number <> 0
i = i + 1
Item.Name = s & "(" & FormatNumber(i, 0) & ")"
Err.Clear
MesPlantes.Add Item, Item.Name

Loop

End Sub

On positionne initialement le compteur i sur zéro et on enregistre le nom du


nouvel objet dans une variable temporaire s. Ensuite on utilise la méthode Add
de l’objet Collection pour tenter d’ajouter un nouvel objet à l’objet Collection.
Si une erreur se produit dans la méthode Add, on incrémente le compteur i. On
construit alors un nouveau Name pour l’objet en se servant du nom d’origine
suivi d’une parenthèse ouvrante, du numéro issu du compteur i et d’une paren-
thèse fermante. La routine tente ensuite à nouveau d’ajouter le nouvel objet à la
collection. Si la méthode Add échoue à nouveau, la boucle se répète jusqu’à ce
que le nom de l’objet soit unique.
Pour supprimer un élément de la collection, on appelle la méthode Remove et on
spécifie la position relative de l’objet ou la valeur de la propriété Name. Dans l’un
ou l’autre cas, la méthode Remove de l’objet Collection sert à supprimer l’élément
de la collection sous-jacente.

Public Sub Remove(key As Variant)

MesPlantes.Remove key

End Sub

De la même façon, la méthode Count retourne le nombre d’éléments de la col-


lection en appelant la méthode Count sous-jacente associée à l’objet Collection.

Public Function Count() As Long

Count = MesPlantes.Count

End Function

339
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


On utilise la méthode Clear pour supprimer tous les objets de la collection. Cette
routine détruit l’objet Collection sous-jacent et crée ensuite une nouvelle ins-
tance de l’objet Collection.

Public Sub Clear()

Set MesPlantes = Nothing


Set MesPlantes = New Collection

End Sub
Chapitre 14

La méthode Item retourne un élément unique de la collection. À l’instar des


méthodes Remove et Count, cet élément appelle la méthode Item de l’objet Col-
lection.

Public Function Item(key As Variant) As Plante

Set Item = MesPlantes.Item(key)

End Function

La routine suivante est une macro qui se répète dans la classe de collection nou-
vellement créée. La macro commence par créer un nouvel objet Plantes intitulé
MesPlantes, qui contient une collection d’objets Plante. Le code appelle ensuite la
méthode SampleData qui ajoute certains objets à la collection.

Sub Test()

Dim MesPlantes As Plantes


Dim p As Plante
Dim i As Long

Set MesPlantes = New Plantes


MesPlantes.SampleData

For i = 1 To MesPlantes.Count
Set p = MesPlantes.Item(i)
MsgBox p.Name

Next i

Set p = Nothing
Set MesPlantes = Nothing

End Sub

Il se sert ensuite d’une boucle For...Next pour itérer dans chaque élément de la
collection. La variable objet p est positionnée sur l’élément en cours de la collec-
tion et la propriété Name est affichée dans une boîte de message.
Notez que le premier élément de la collection commence à 1 et que le nombre
d’éléments dans la collection se trouve dans la propriété Count de la collection.

340
Partie 4 : Fonctions VBA avancées

Développement de modules de classes

D’où proviennent les données ?


Les classes constituent un excellent moyen de conserver des données issues
d’une source externe. Ce faisant, vous permettez au programme d’accéder
aux données indépendamment de la manière dont elles sont physiquement
stockées.

Si vous changez de méthode de stockage, vous n’avez pas à modifier la


méthode d’accès aux données. Si vous fournissez une méthode LoadData,
toute personne qui exploite la classe peut charger les données à partir de leur

Chapitre 14
source. Si vous migrez ensuite les données depuis une feuille de calcul vers
une base de données Access, seule la méthode de chargement change. Le
code qui accède à la collection ne change pas, sauf si vous modifiez les para-
mètres de la méthode LoadData.

De même, vous pouvez proposer une méthode standard appelée SaveData qui
actualise les données quel que soit leur emplacement de stockage. Avec un
peu de travail supplémentaire, vous pouvez même rendre la méthode suffisam-
ment intelligente pour qu’elle actualise uniquement les objets qui ont été
modifiés, au lieu d’actualiser toutes les données.

Une classe avec des règles de métier


Vous pouvez étendre une classe en y ajoutant des règles de métier. Par exemple,
la méthode suivante valide les informations d’un objet Plante. Ce code se con-
tente de vérifier chaque propriété de la classe à la recherche de conditions
d’erreurs potentielles et retourne True s’il ne trouve aucune erreur et False dans
le cas contraire.

Public Function IsValid() As Boolean

If Len(Name) = 0 Then
IsValid = False

ElseIf Len(NomScientifique) = 0 Then


IsValid = False

ElseIf PrixGros < 0 Then


IsValid = False

ElseIf PrixDétail < PrixGros Then


IsValid = False

ElseIf NuméroProduit < 0 Then


IsValid = False

Else
IsValid = True

341
Partie 4 : Fonctions VBA avancées

Microsoft Excel 2003 VBA


End If

End Function

Nous aurions pu modifier la procédure IsValid pour qu’elle retourne un message


d’erreur textuel ou un tableau String contenant une liste d’erreurs repérées dans
les données.
Pour détecter les erreurs, vous pouvez également faire appel aux routines de pro-
priété. Par exemple, vous pouvez créer une routine Property Let comme celle-ci :
Chapitre 14

Public Property Let PrixDétail(value As Currency)

If value > PrixGros Then


MonPrixDétail = value

Else
RaiseEvent PlantError(1, "Le prix au détail est inférieur au prix
de gros.")

End If

End Property

La classe contient une variable de classe privée intitulée MonPrixDétail qui con-
tient la valeur de la propriété PrixDétail. Si la nouvelle valeur de PrixDétail est
supérieure à PrixGros, on enregistre le nouveau prix au détail dans la variable
MonPrixDétail.
En revanche, si quelqu’un tente de définir un prix au détail inférieur au prix de
gros, l’événement PlantError se déclenche et passe les détails de l’erreur au pro-
gramme auquel appartient l’objet.
Dans ce chapitre, vous avez appris la différence entre une classe et un objet. Vous
avez également appris à créer vos propres classes personnalisées et comment
définir des propriétés, des routines de propriété, des méthodes et des événe-
ments. Nous avons également étudié quelques astuces permettant de reconnaître
des objets, des propriétés et des méthodes. Pour finir, vous avez vu comment
concevoir plusieurs différents types de classes, y compris une classe simple et une
classe de collection, et comment étendre vos classes pour initialiser une classe et
mettre en œuvre des règles de métier.

342
Partie 5
Manipulation des
objets Excel
15 Graphiques 345

16 Tableaux et graphiques
croisés dynamiques 367

17 Barres de commandes 393

18 Personnalisation
des boîtes de dialogue 413

19 Création de formulaires
utilisateur 425

20 Création de formulaires
utilisateur avancés 449

343
Partie 5 : Manipulation des objets Excel

Chapitre 15
Graphiques
Tour d’horizon des graphiques . . 345 Réflexions sur la programmation
Manipulation des graphiques. . . 351 des graphiques . . . . . . . . . . . . . 364

La fonctionnalité graphique de Microsoft Excel est un outil impressionnant. Un


graphique permet à un utilisateur de créer une représentation graphique de
presque tous les types de données stockés dans une feuille de calcul. Un graphi-
que est parfois plus significatif qu’une liste de chiffres. Par exemple, un commer-
cial appréciera plus facilement les fluctuations des ventes mensuelles si elles lui
sont présentées sous forme d’un graphique en courbes ou d’un histogramme.
L’équivalent textuel représenterait plusieurs paragraphes de texte, sans parvenir
à être aussi clair.
À l’heure de créer des graphiques, Excel vous en propose plus de 100 types diffé-
rents. En outre, les différents objets contenus dans les graphiques comme la
légende, l’axe des x et l’axe des y, le titre, etc., vous permettent d’obtenir des
résultats finaux différents d’un graphique à l’autre selon vos exigences en
matière de mise en forme.
L’objet Chart et les objets que contient le graphique peuvent être directement
modifiés par l’utilisateur ou avec une macro Visual Basic pour Applications
(VBA).
Dans ce chapitre, nous allons étudier les concepts essentiels relatifs à l’écriture
du code VBA qui génère et manipule les graphiques. Ce code est conçu pour
montrer comment créer et accéder à la collection ChartObjects au sein du clas-
seur. Vous apprendrez également à modifier les graphiques existants, leurs séries
de données et leurs formats et à utiliser des étiquettes de graphique descriptives
se référant à des cellules.

Tour d’horizon des graphiques


Le graphique est considéré comme un objet incorporé dans un classeur Excel ;
l’objet ChartObject agit comme un conteneur pour les éléments qui s’y trouvent.
Parmi ces éléments, on trouve les données source qui constituent le graphique :
zone de graphique, légende et titres du graphique. Chaque objet du graphique
héberge ses propres propriétés et méthodes. La manipulation des graphiques
avec du code VBA constitue un réel défi en raison de la complexité du modèle
d’objet Chart. Vous devez absolument maîtriser le modèle Chart pour program-
mer des objets Chart et être sûr d’employer les objets et propriétés corrects.

345
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Remarque Reportez-vous à la section « Définition du modèle d’objet Chart »,


plus loin dans ce chapitre, pour en connaître la structure.

Avant de plonger dans les propriétés, les méthodes et les événements de l’objet
Chart, il serait intéressant de revoir les composants individuels employés pour
générer un graphique. Le tableau 15.1 détaille les objets que l’on trouve dans le
graphique que nous utiliserons tout au long de ce chapitre.
Tableau 15-1. Composants du graphique
Objet Description
Titres du graphique Décrivent les informations qui constituent le graphique : titre du
graphique, titres de l’axe des x et de l’axe des y.
Séries de données Stockent numériquement les données des plages qui définissent le
graphique et déterminent comment les informations sont affichées
dans la Zone de traçage. Un graphique contient au minimum une
série de données.
Chapitre 15

Légende Fournit l’explication visuelle des données du graphique. Le nom


des séries est listé avec la couleur correspondante.
Zone de traçage Affiche les séries de données sous forme graphique. Il s’agit du
fond, ou conteneur, qui encadre la zone de traçage.
Axe des x et Axe des y Déterminent comment les informations sont distribuées et tracées
sur le graphique.

Créer des graphiques incorporés ou des feuilles de


graphique
Comme vous le savez, il est possible de créer un graphique avec l’Assistant Gra-
phique d’Excel. Cet assistant vous aide à sélectionner les options graphiques :
Type de graphique, Plage de données et Emplacement du graphique. Vous pou-
vez insérer un graphique à deux emplacements : dans une feuille de calcul en
tant qu’objet incorporé ou sur une feuille de graphique.
La destination dépend de l’effet que vous cherchez à obtenir. Si l’utilisateur doit
pouvoir comparer plusieurs graphiques côte à côte, insérez les graphiques dans
une même feuille de calcul. En revanche, vous choisirez sans doute d’insérer le
graphique sur sa propre feuille si vous travaillez dans un graphique complexe,
contenant plusieurs séries de données ou plus simplement pour des raisons de
préférences personnelles. Rappelez-vous que vous pouvez toujours incorporer
un graphique ultérieurement avec un simple changement d’emplacement.
Pour créer un graphique, vous n’êtes cependant pas limité à l’Assistant Graphi-
que. Vous pouvez également employer le code VBA. La propriété Add de l’objet
Chart peut servir à insérer un nouveau graphique.

Charts.Add

346
Partie 5 : Manipulation des objets Excel

Graphiques
L’exemple suivant présente une macro de base qui crée un graphique en tant que
variable objet. La macro définit le type de graphique, la source des données et les
titres du graphique.

Sub AddChartSheet()
Dim Chrt As Chart

Set Chrt = Charts.Add


With Chrt
.ChartType = xlColumnClustered
.SetSourceData Source:=Sheets("Feuil1").Range("A4:D7"), _
PlotBy:=xlRows
.HasTitle = True
End With
End Sub

Remarque Lorsque vous créez des graphiques dans un classeur, créez-les en


tant que variables objet. Il est plus simple de référencer un objet Chart et de
manipuler le graphique avec cette technique. C’est ce que nous avons fait pour

Chapitre 15
les exemples de ce chapitre.

Par défaut, si on ne définit pas la propriété Location du graphique dans la macro,


celui-ci est placé sur sa propre feuille. Pour définir l’emplacement du graphique,
utilisez la propriété Location. Le tableau 15.2 définit les trois options d’emplace-
ment disponibles.
Tableau 15-2. Propriétés d’emplacement des graphiques
Propriété Emplacement
xlLocationAsNewSheet Le graphique est placé sur une nouvelle feuille de graphique.
xlLocationAsObject Le graphique est incorporé dans la feuille de calcul spécifiée.
xlLocationAutomatic Le graphique est incorporé comme objet dans la feuille de calcul
active.

L’exemple suivant définit le graphique comme objet incorporé de « Feuil1 » :

Variable = ChartObject.Location(xlLocationAsObject,"Feuil1")

Lorsque vous travaillez avec des graphiques incorporés, il est préférable de nom-
mer l’objet ChartObject de sorte qu’il soit facile à référencer dans le code. Pour
renommer manuellement un graphique existant, maintenez enfoncée la touche
CTRL et cliquez sur le graphique. L’objet ChartObject est ainsi sélectionné, sans
être activé. Cliquez dans la zone Nom et tapez le nouveau nom. Vous pouvez éga-
lement nommer l’objet ChartObject à partir d’une macro en positionnant la pro-
priété Name de l’objet.
Comme le montre la figure 15.1, les poignées du graphique sont représentées par
des cercles vides pour vous permettre de distinguer un graphique sélectionné

347
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


d’un graphique activé. La zone Nom affiche actuellement Graphique 1 comme
nom pour l’objet ChartObject.
Chapitre 15

Figure 15-1. La zone Nom affiche le nom de l’objet ChartObject lorsqu’il est
sélectionné.

Remarque Si le graphique est activé, les poignées prennent la forme de car-


rés noirs. Si on sélectionne l’objet ChartObject, les poignées prennent la
forme de cercles vides.

L’exemple suivant crée un graphique incorporé nommé GraphProduitGSC. La


macro commence par supprimer tout graphique incorporé existant sur la feuille
de calcul active. Elle crée ensuite un nouveau graphique et exploite la propriété
Parent pour identifier l’objet ChartObject. Le code se poursuit en définissant la
variable objet Chrt qui fait référence à l’objet ChartObject. Par défaut, ce dernier
crée une feuille de graphique. En conséquence, on utilise la méthode Location
pour définir graphique en tant qu’objet incorporé.

Sub AddEmbeddedChart()
Dim Chrt As Chart

ActiveSheet.ChartObjects.Delete
Set Chrt = Charts.Add
Set Chrt = Chrt.Location(where:=xlLocationAsObject,
Name:="Feuil1")
With Chrt
.ChartType = xlColumnClustered
.SetSourceData Source:=Sheets("Feuil1").Range("A4:D7"), _
PlotBy:=xlRows
.HasTitle = True
.ChartTitle.Text = "=Feuil1!L1C1"
With .Parent
.Top = Range("A9").Top

348
Partie 5 : Manipulation des objets Excel

Graphiques
.Left = Range("A1").Left
.Name = "GraphProduitGSC"
End With
End With
End Sub

Remarque Rappelez-vous que par défaut, l’emplacement est une feuille de


graphique. En conséquence, si vous utilisez la méthode Location de l’objet
Chart, ce dernier est recréé et toute référence à l’objet Chart d’origine, autre-
ment dit la feuille de graphique, est détruite. Vous devez assigner la valeur
retournée par la méthode Location à la variable objet Chrt de sorte qu’elle
fasse référence au nouvel objet Chart. Pour tester cela, examinez votre code et
affichez le classeur. Vous noterez que le code crée d’abord une feuille de gra-
phique puis qu’il la supprime après que la méthode Location a été positionnée
sur xlLocationAsObject.

La procédure d’événement AddEmbeddedChart introduit des paramètres sup-


plémentaires. ChartTitle est assigné à une formule qui se réfère à la cellule A1.

Chapitre 15
L’emplacement du graphique incorporé sur la feuille de calcul a été défini avec
les propriétés Top et Left de la cellule A9. On a utilisé la propriété Parent de l’objet
Chart pour faire référence à l’objet ChartObject et on l’a définie en attribuant aux
propriétés Top et Left de l’objet ChartObject les mêmes valeurs qu’à la propriété
Top de la cellule A9 et à la propriété Left de la cellule A1. Le graphique est aligné
sur le bord supérieur de la cellule A9 et sur le bord gauche de la cellule A1. Pour
finir, la macro AddEmbeddedChart assigne le nouveau nom à l’objet ChartOb-
ject de sorte qu’il soit facile à référencer à l’avenir.

Remarque Si vous définissez le titre du graphique en tant que formule, vous


devez utiliser la méthode d’adressage L1C1 et non la méthode d’adressage
A1.

Au Quotidien
Macro enregistrée et la création de graphiques

Une macro enregistrée génère du code raisonnablement efficace. Il est toute-


fois plus simple de manipuler le graphique si vous le créez en tant qu’objet.
L’exemple suivant présente une macro enregistrée, qui utilise la méthode Add
pour créer un nouveau graphique. Elle définit la propriété ChartType puis utilise
la méthode SetSourceData pour définir les plages mises en graphique. La pro-
priété Location définit le graphique en tant que feuille de graphique et assigne
le nom Ventes de produits à la feuille. La macro positionne ensuite la propriété
HasTitle sur True pour pouvoir définir la propriété ChartTitle. Pour finir, le code
positionne la propriété HasTitle des axes sur False, cette étape n’étant pas
indispensable.

Charts.Add

349
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Sheets("Feuil1").Range("A3:D7"), _
PlotBy:=xlRows

ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Vente de


produits"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Vente de produits"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With

La macro enregistrée crée le graphique. Vous remarquerez toutefois la pré-


sence de lignes de code supplémentaires redondantes dans la macro. Veillez
à supprimer les lignes inutiles dans une macro enregistrée.

Définition du modèle d'objet Chart


Chapitre 15

Le modèle d’objet Chart peut quelques fois sembler complexe en raison de


« l’effet de couche ». Servez-vous de l’Explorateur d’objets de Visual Basic Editor
pour « retrouver vos petits » pendant le codage des procédures qui contiennent
des graphiques.
L’emplacement du graphique en détermine la hiérarchie. Par exemple, dans un
graphique incorporé, pour modifier le texte qui se trouve dans ChartTitle, vous
devez revoir les niveaux des objets. Au sommet de la hiérarchie se trouve l’objet
Application. Il contient l’objet Workbook, qui contient l’objet Worksheet. Ce der-
nier contient un objet ChartObject, qui contient l’objet Chart. L’objet Chart pos-
sède un objet ChartTitle et ce dernier contient un objet Characters. La propriété
Text de l’objet Characters stocke le texte affiché dans le titre du graphique. Pour
résumer cette hiérarchie, reportez-vous à la liste suivante :

Application
Workbook
Worksheet
ChartObject
Chart
ChartTitle
Characters

Si vous travaillez sur un graphique qui se trouve sur sa propre feuille, la hiérar-
chie est plus simple. Une feuille de graphique se trouve techniquement au même
niveau que la feuille de calcul puisqu’il s’agit simplement d’un type différent de
feuille. Examinez la nouvelle hiérarchie et remarquez qu’on a supprimé deux
niveaux.

Application
Workbook
Chart

350
Partie 5 : Manipulation des objets Excel

Graphiques
ChartTitle
Characters

La collection Charts conserve la collection de feuilles de graphique d’un classeur.


L’objet Workbook est toujours le parent de la collection Charts. Celle-ci contient
uniquement les feuilles de graphique. Vous pouvez également incorporer les gra-
phiques individuels dans des feuilles de calcul et des feuilles de dialogue. En con-
séquence, vous pouvez accéder aux objets Chart de la collection Charts avec la
propriété Item. Vous pouvez spécifier le nom du graphique comme paramètre de
la propriété Item ou lui attribuer un numéro d’index décrivant la position du
graphique dans le classeur de gauche à droite.
L’objet Chart permet d’accéder à tous les attributs d’un graphique spécifique
dans Excel : mise en forme du graphique, type de graphique et propriétés de
positionnement du graphique. L’objet Chart expose également des événements
que vous pouvez exploiter en programmation.

Les procédures d’événements s’exécutent à l’initiation du déclencheur approprié. Vous


pouvez aussi surveiller des événements spécifiques au niveau de l’objet Chart. Pour plus

Chapitre 15
d’informations, reportez-vous à la rubrique « Au Quotidien : Utiliser ou ne pas utiliser les
événements Chart ». Pour revoir les procédures d’événements au niveau des objets Appli-
cation, Workbook et WorkSheet, reportez-vous au chapitre 12, « Événements ».

La collection ChartObjects représente tous les objets ChartObject d’une feuille de


graphique ou d’une feuille de calcul spécifiées. L’objet ChartObject agit comme
un conteneur pour un objet Chart. Les propriétés et les méthodes de l’objet
ChartObject déterminent l’apparence et la taille du graphique incorporé sur la
feuille de calcul.
Pour retourner un objet ChartObject, servez-vous de ChartObjects(index), où
index représente le numéro d’index ou le nom du graphique incorporé. Dans
l’exemple suivant, le nom du graphique est positionné à ExempleGraph dans un
graphique incorporé de la feuille de calcul intitulée « Feuil1 ».

Worksheets("Feuil1").ChartObjects("Graphique 1").Name = "ExempleGraph"

Le nom du graphique incorporé s’affiche dans la zone Nom lorsqu’on le sélec-


tionne. Servez-vous de la propriété Name pour définir ou retourner le nom de
l’objet ChartObject. L’exemple suivant arrondit les angles du graphique incor-
poré intitulé « ExempleGraph » sur la feuille de calcul « Feuil1 ».

Worksheets("Feuil1").ChartObjects("ExempleGraph").RoundedCorners =
True

Manipulation des graphiques


Pour créer un graphique, vous pouvez faire appel à une procédure. Vous créerez
toutefois souvent des macros qui modifient les graphiques existants. Par exem-
ple, vous pouvez utiliser une procédure pour rationaliser la mise en forme de
tous les graphiques incorporés au sein d’un classeur utilisé au niveau de l’entre-

351
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


prise. Dans cette procédure, vous pouvez inclure le redimensionnement de tous
les graphiques à une taille standard, spécifier l’emplacement du graphique dans
la feuille de calcul, voire ajouter le nom de la société dans une étiquette en vous
servant des couleurs de la société.

Activer un graphique
Le graphique est activé dès lors qu’un utilisateur le sélectionne, quel que soit son
emplacement. Avec le code VBA, vous activez un graphique incorporé avec la
méthode Activate.
ActiveSheet.ChartObjects("Graphique 1").Activate

Pour activer un graphique qui se trouve sur une feuille de graphique, servez-vous
de l’instruction suivante :

Sheets("Graphique 1").Activate

Lorsque le graphique est activé, vous pouvez vous y référer dans le code avec
Chapitre 15

ActiveChart. Voici une manière fort intéressante de simplifier le code. À des fins
de dépannage, vous pouvez vérifier le graphique qui a été activé en ajoutant une
boîte de message qui en affiche le nom. Une fois que vous avez vérifié que le gra-
phique voulu est activé, vous pouvez ajouter un guillemet simple au début de la
ligne qui appelle la boîte de message pour en faire un commentaire. En conver-
tissant la ligne en commentaire, vous l’empêchez de s’exécuter. Vous pouvez,
bien sûr, supprimer le code après avoir terminé la procédure de test.

MsgBox ActiveChart.Name

Lorsque vous créez une procédure qui modifie un graphique, vous n’êtes pas
obligé d’activer le graphique. En revanche, si vous le faites, il sera plus simple à
référencer à partir du code. Les exemples suivantes modifient le type de graphi-
que et retournent les mêmes résultats, mais la première procédure active la
feuille de graphique alors que la deuxième accède à un graphique incorporé :

Sub ModifyChart1()
ActiveSheet.ChartObjects("Graphique 1").Activate
ActiveChart.Type = xlLine
ActiveChart.Deselect
End Sub

Sub ModifyChart2()
ActiveSheet.ChartObjects("Graphique 1").Chart.Type = xlLine
End Sub

À l’heure de créer votre macro, rappelez-vous que si la procédure est écrite de


manière à dépendre de l’activation du graphique, une erreur se produit si l’utili-
sateur ne l’a pas activé. L’exemple suivant présente plusieurs formats différents
que l’on peut modifier. Exécutez la macro avec le graphique actif et la cellule A1
sélectionnée.

352
Partie 5 : Manipulation des objets Excel

Graphiques
Sub ModifyActiveChart()
With ActiveChart
.Type = xlArea
.ChartArea.Font.Name = "Tahoma"
.ChartArea.Font.FontStyle = "Regular"
.ChartArea.Font.Size = 8
.PlotArea.Interior.ColorIndex = xlNone
.Axes(xlValue).TickLabels.Font.Bold = True
.HasLegend = True
.Legend.Position = xlLegendPositionBottom
End With
End Sub

Notez l’erreur d’exécution ‘91’ : « Variable objet ou variable de bloc With non
définie » lorsque vous exécutez la procédure ModifyActiveChart et que le graphi-
que n’est pas sélectionné. Pour résoudre ce problème, indiquez le graphique à
modifier à l’exécution de la procédure. Modifions la procédure précédente pour
y inclure la référence au graphique.

Sub ModifySpecificChart()

Chapitre 15
With Sheets("Feuil1").ChartObjects("Graphique 1").Chart
.Type = xlArea
.ChartArea.Font.Name = "Tahoma"
.ChartArea.Font.FontStyle = "Regular"
.ChartArea.Font.Size = 8
.PlotArea.Interior.ColorIndex = xlNone
.Axes(xlValue).TickLabels.Font.Bold = True
.HasLegend = True
.Legend.Position = xlLegendPositionBottom
End With
End Sub

Au Quotidien
Utiliser ou ne pas utiliser les événements Chart

On utilise un événement pour surveiller un objet. Votre graphique est considéré


comme un objet, quel que soit son emplacement. En conséquence, si un évé-
nement spécifique réclame une action spécifique, utilisez les événements
Chart.

Activate, MouseDown, MouseMove et SeriesChange sont quelques-uns des


déclencheurs disponibles pour un objet Chart. Pour écrire une procédure
d’événement d’un graphique incorporé, vous devez créer un nouvel objet avec
le mot-clé WithEvents dans un module de classe et déclarer un objet du type
Chart dans les événements.

Prenons l’exemple suivant. Supposons que l’on crée un nouveau module de


classe intitulé EvenModuleClasse. Ce nouveau module de classe contient
l’instruction WithEvents suivante :

Public WithEvents myChartClass As Chart

353
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Une fois le nouvel objet déclaré avec des événements, il apparaît dans la liste
déroulante Objet du module de classe. Vous pouvez maintenant créer une pro-
cédure d’événement pour cet objet. Cependant, avant d’exécuter la procédure,
vous devez relier l’objet déclaré au graphique incorporé. Le code suivant peut
servir dans n’importe quel module pour obtenir le résultat souhaité :

Dim myClassModule As New EvenModuleClasse

Sub InitializeChart()
Set myClassModule.myChartClass =
Worksheets(1).ChartObjects(1).Chart
End Sub

Après que la procédure InitializeChart a été exécutée, l’objet myChartClass du


module de classe pointe vers le premier graphique incorporé de la première
feuille de calcul du classeur. Toutes les procédures d’événements du module
de classe pour l’objet seront à présent évaluées lorsque le déclencheur se pro-
duira.
Chapitre 15

Désactiver un graphique
Lorsque vous créez une macro avec l’enregistreur, celui-ci génère une instruction
du type :

ActiveWindow.Visible = False

Cette instruction désactive le graphique, mais on ne sait pas exactement pour-


quoi. Si vous écrivez une macro qui implique des graphiques, essayez la méthode
Deselect.

ActiveChart.Deselect

Les résultats de ces deux instructions sont légèrement différents. Si vous posi-
tionnez la propriété Visible de l’objet ActiveWindow sur False, le graphique incor-
poré est toujours sélectionné, mais il n’est plus activé. La méthode Deselect
désactive et désélectionne le graphique.
Modifions la procédure d’événement AddEmbeddedChart que nous avons créée
dans la section « Créer des graphiques incorporés ou des feuilles de graphique »,
précédemment dans ce chapitre, en positionnant l’objet ActiveWindow sur False
pour désactiver le graphique.

Sub AddEmbeddedChart()
Dim Chrt As Chart

ActiveSheet.ChartObjects.Delete
Set Chrt = Charts.Add
Set Chrt = Chrt.Location(where:=xlLocationAsObject,
Name:="Feuil1")
With Chrt

354
Partie 5 : Manipulation des objets Excel

Graphiques
.ChartType = xlColumnClustered
.SetSourceData Source:=Sheets("Feuil1").Range("A4:D7"), _
PlotBy:=xlRows
.HasTitle = True
.ChartTitle.Text = "=Feuil1!L1C1"
With .Parent
.Top = Range("A9").Top
.Left = Range("A1").Left
.Name = "GraphProduitGSC"
End With
End With
ActiveWindow.Visible = False
End Sub

Maintenant que vous avez testé la méthode ActiveWindow pour désactiver le gra-
phique, utilisez la méthode Deselect. Remplacez la ligne ActiveWindow.Visible =
False par ActiveChart.Deselect.

Pour chaque procédure que vous créez, vous pouvez évaluer la méthode de
désactivation fournissant le résultat approprié au scénario.

Chapitre 15
Dépannage
Comment déterminer qu’un graphique a été activé ?

Une macro peut manipuler un graphique sélectionné par l’utilisateur. Par exem-
ple, une macro peut modifier le type de graphique, appliquer des couleurs ou
changer la taille de police. La question est la suivante : « Comment peut-on
déterminer avec du code VBA que l’utilisateur a bien sélectionné le
graphique ? ». Le graphique peut être sélectionné si on active la feuille de gra-
phique ou, s’il s’agit d’un graphique incorporé, si on a cliqué dessus. Si vous
devez activer un graphique qui se trouve sur une feuille de graphique, servez-
vous de la ligne de code suivante pour déterminer s’il a été sélectionné :

TypeName(Selection) = "Graphique"

En revanche, si le graphique est un objet incorporé, la sélection réelle est un


objet au sein du graphique : l’objet Series ou l’objet ChartTitle, par exemple.
La fonction ChartIsSelected retourne True si une feuille de graphique ou un
graphique incorporé est activé(e) et False dans le cas contraire. La fonction
suivante détermine si l’objet ActiveChart est positionné sur Nothing. Si tel est
le cas, le graphique n’est pas activé.

Private Function ChartIsSelected() As Boolean


ChartIsSelected = Not ActiveChart Is Nothing
End Function

Modifier une série de données


Un graphique se compose d’un nombre quelconque de séries et les données de
ces séries sont définies par des références de plages dans la formule SERIE.

355
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Lorsqu’on sélectionne une série dans le graphique, la formule SERIE s’affiche
dans la barre de formule. Il est parfois plus simple d’employer des noms de pla-
ges dans les formules SERIE d’un graphique, notamment pour modifier les don-
nées source du graphique. Prenons par exemple la formule SERIE suivante :

=SERIE(;Feui1!$A$1:$A$6;Feuil1!$B$1:$B$6;1)

Vous pouvez définir les noms de plages puis modifier la formule SERIE de sorte
qu’elle utilise des noms au lieu des références de cellules. Par exemple, si votre
feuille contient deux plages libellées Catégories et Données, vous pouvez rempla-
cer la formule par :

=SERIE(;Feui1!Catégories;Feuil1!Données;1)

Remarque Cette formule peut changer lorsque vous la saisissez dans la


barre de formule. Par exemple, Feuil1 peut prendre la valeur du nom du clas-
seur, ce qui donne un argument comme Produits.xls!Catégories.
Chapitre 15

Lorsque vous avez défini les noms et modifié la formule SERIE, votre code VBA
peut exploiter les noms et les changements se reflètent dans le graphique. Par
exemple, l’instruction suivante attribut le nom Données à la plage :

Range("B1:B12").Name = "Données"

Après avoir exécuté l’instruction Name, le graphique s’actualise et exploite la


nouvelle définition de Données.
Maintenant que l’on connaît l’action de la formule SERIE, comment la modifie-
t-on ? La méthode la plus simple consiste à redéfinir les données du graphique
avec la méthode SetSourceData de l’objet Chart. Il reste cependant possible de
manipuler les séries individuelles avec l’objet Series. Celui-ci est membre de
l’objet SeriesCollection du graphique.

Au Quotidien
Comment fonctionne la formule SERIE du graphique ?

La formule SERIE détermine les données employées dans chaque série d’un
graphique. Si vous sélectionnez une série de données dans un graphique, la
formule SERIE s’affiche dans la barre de formule. La formule SERIE n’est pas
une formule que vous pouvez saisir dans une feuille de calcul comme une for-
mule traditionnelle. Vous ne pouvez pas l’exploiter dans une cellule, ni utiliser
de fonction ou de formule dans une formule SERIE. Il est cependant possible
de l’éditer.

La série Catalogue est actuellement sélectionnée dans le graphique, comme


l’indiquent les poignées sur les barres. Notez que la barre de formule contient
la formule SERIE de la série Catalogue.

356
Partie 5 : Manipulation des objets Excel

Graphiques

Figure 15-2. La série de données sélectionnée est indiquée par des marques
sur les éléments correspondants du graphique.

La syntaxe de la formule SERIE est la suivante :

values;o
=SERIE(name;category_labels;v order)

● name (optionnel) Le nom employé dans la légende. Si le graphique ne

Chapitre 15
contient qu’une série, l’argument name sert de titre.
● category_labels (optionnel) La plage qui contient les étiquettes de l’axe
des catégories. S’il est omis, Excel se sert d’entiers consécutifs en
commençant à 1.
● values La plage qui contient les valeurs.
● order Un entier qui spécifie l’ordre de traçage des séries (approprié uni-
quement si le graphique comporte plusieurs séries).

Les références de plage d’une formule SERIE sont toujours absolues et


incluent toujours le nom de la feuille, comme dans l’exemple suivant :

=SERIE(;Feui1!$B$1;Feuil1!$B$2:$B$7;1)

Une référence de plage peut se composer de plages non contiguës. Si tel est
le cas, chaque plage est séparée par un point virgule et l’argument est placé
entre parenthèses. Dans la formule SERIE suivante, les plages de valeurs sont
B2:B3 et B5:B7 :

=SERIE(;;(Feuil1!$B$2;Feuil1!$B$5:$B$7);1)

Vous pouvez remplacer les références de plage par des noms de plage. Dans
ce cas, Excel change la référence dans la formule SERIE pour inclure le clas-
seur, comme dans l’exemple suivant :

=SERIE(Feuil1$B$1;;budget.xls!MesDonnées;1)

357
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Modifier un graphique pour utiliser les données d’un


tableau
Vous pouvez définir une série d’un graphique en assignant un tableau VBA à sa
propriété Values. Cette fonctionnalité est intéressante si vous devez générer un
graphique qui n’est pas lié aux données d’origine. Le graphique peut, en effet, se
trouver sur un classeur séparé, indépendant des données source.
La figure 15.3 montre le graphique des ventes de produits de la société Mon Jar-
din, dans lequel on a sélectionné la série Catalogue. Notez la différence entre ce
graphique et celui de l’encadré « Au Quotidien » : « Comment fonctionne la for-
mule SERIE d’un graphique ? » qui présente la série Catalogue en utilisant des
informations de la Feuil1. Vous pouvez voir la définition de la première série de
données qui se trouve dans la barre de formule, au-dessus de la feuille de calcul.
Les valeurs de l’axe des y sont définies par un tableau Excel. Les noms des caté-
gories ont été assignés comme texte aux noms des séries.
Chapitre 15

Figure 15-3. La série Catalogue est affichée avec la formule SERIE dans la
barre de formule.

Remarque Un tableau est limité à environ 250 caractères. Cela limite le nom-
bre de points de données que l’on peut tracer avec un tableau.

Vous pouvez facilement convertir un graphique existant pour exploiter un


tableau à la place des références de cellules. Le graphique devient ainsi indépen-
dant des données d’origine sur lesquelles il se basait. Le code suivant montre
comment y parvenir :

Sub ConvertSeriesValuesToArrays()
Dim Ser As Series
Dim Chrt As Chart

358
Partie 5 : Manipulation des objets Excel

Graphiques
On Error GoTo Failure

Set Chrt = ActiveSheet.ChartObjects(1).Chart


For Each Ser In Chrt.SeriesCollection
Ser.XValues = Ser.Values
Ser.Name = Ser.Name
Next Ser

Exit Sub
Failure:
MsgBox "Les données dépassent les limites du tableau."
End Sub

Pour chaque série du graphique, les propriétés XValues et Name sont égales à
elles-mêmes. Bien qu’il soit possible d’assigner des références de plage à ces pro-
priétés, elles retournent toujours un tableau de valeurs lorsqu’on s’y réfère. Vous
pouvez exploiter ce comportement pour convertir les références de cellule en
tableaux.
Rappelez-vous que le nombre de points de données contenus dans une référence

Chapitre 15
de tableau est limité à environ 250 caractères. Le code échoue si vous dépassez la
limite : récupérez les erreurs pour faire face à cette possibilité.

Définir les étiquettes du graphique


Vous n’aurez aucune difficulté à ajouter des étiquettes au graphique si elles sont
basées sur les valeurs des séries de données ou sur celles de l’axe des x. Ces
options sont disponibles dans le menu Graphique, Options du graphique.
Vous pouvez également saisir votre propre texte ou formule dans chaque éti-
quette, mais en contrepartie d’un travail manuel conséquent. Vous devez, en
effet, ajouter des étiquettes standards aux séries puis sélectionner chacune indi-
viduellement et soit la remplacer par votre propre texte, soit cliquer dans la barre
de formule et saisir une formule. Pour économiser du temps et des efforts, écri-
vez une macro qui vise le même résultat.
La figure 15.4 présente le graphique des ventes de produits de la société Mon Jar-
din qui se compose des Ventes trimestrielles et du produit le plus vendu. Nous
avons défini les étiquettes à partir de formules liées à la ligne 4 de la feuille de cal-
cul. Comme vous pouvez le noter, l’engrais représente la meilleure vente du mois
d’avril. La formule de la barre de formule pointe vers la cellule E4.

359
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Figure 15-4. Les étiquettes ont été programmées avec des formules pour
Chapitre 15

pointer vers une cellule de la feuille de calcul.

Par exemple, configurez un histogramme similaire à celui de la figure 15.4. Ajou-


tez la macro suivante pour créer les étiquettes correspondant aux produits les
plus vendus qui se trouvent sur la ligne 4.

Sub AddDataLabels()
Dim seVentes As Series
Dim Pts As Points
Dim pt As Point
Dim rng As Range
Dim i As Integer

Set rng = Range("B4:G4")


Set seVentes =
ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
seVentes.HasDataLabels = True
Set Pts = seVentes.Points
For Each pt In Pts
i = i + 1
pt.DataLabel.Text = "=" &
rng.Cells(i).Address(RowAbsolute:=True, _
ColumnAbsolute:=True, ReferenceStyle:=xlR1C1,
External:=True)
pt.DataLabel.Font.Bold = True
pt.DataLabel.Position = xlLabelPositionAbove
Next pt
End Sub

La référence B4:G4 est assignée à la variable objet rng. On a assigné une référence
à la première et unique série du graphique incorporé à la série seVentes et on a
positionné la propriété HasDataLabels de la série sur True. La boucle For
Each...Next traite chaque point de la série de données. Pour chaque point, le code

360
Partie 5 : Manipulation des objets Excel

Graphiques
assigne une formule à la propriété Text de l’étiquette de donnée de ce point. La
formule se réfère à la cellule de la feuille de calcul en tant que référence externe
au format L1C1. On applique des caractères gras à l’étiquette de données qui est
positionnée au-dessus du point de donnée.

Mettre un graphique en forme


La mise en forme des graphiques constitue un vaste sujet. Vous pouvez formater
l’objet ChartObject, ainsi que les objets que contient le graphique. Par exemple,
vous pouvez modifier ChartObject Location pour placer un graphique incorporé
sur une feuille de graphique. On peut également classer la modification des cou-
leurs des séries de données dans la catégorie « mise en forme du graphique ». Il
existe plus de 60 propriétés de graphique ; le tableau 15.3 liste les noms des pro-
priétés Chart les plus employées et les résultats qu’elles retournent.
Tableau 15-3. Propriétés de Chart
Nom Retourne Description

Chapitre 15
ChartType xlChartType Définit le type de graphique ou retourne le type de
graphique en cours.
HasDataTable Boolean Définit l’affichage ou non du tableau de données associé
sur le graphique. Elle est positionnée sur False par défaut.
En conséquence, le tableau n’est pas inclus si on ne définit
pas cette propriété.
HasLegend Boolean Définit l’affichage ou non de la légende.
HasTitle Boolean Définit l’affichage ou non du titre du graphique.
PlotBy xlRowCol Définit si on utilise les colonnes des données originales
comme série de données (xlColumns) ou si on se sert des
lignes (xlRows).

Le tableau 15.4 liste les noms des propriétés de l’objet ChartObject les plus
employées et les résultats qu’elles produisent.
Tableau 15-4. Propriétés de l’objet ChartObject
Nom Retourne Description
BottomRightCell Range Retourne la plage de cellules qui se trouve sous l’angle
inférieur droit de l’objet ChartObject incorporé.
Chart Chart Retourne le graphique associé à l’objet ChartObject.
Height Double Définit la hauteur du graphique incorporé.
Left Double Définit la distance entre le bord gauche de la marge et
le bord gauche de l’objet ChartObject.
Name String Définit le nom de l’objet ChartObject.
PrintObject Boolean Indique si l’objet incorporé est imprimé lorsque la
feuille de calcul l’est.

361
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 15-4. Propriétés de l’objet ChartObject (Suite)


Nom Retourne Description
RoundedCorners Boolean Indique si le graphique incorporé est équipé d’angles
arrondis. Par défaut, cette propriété est positionnée
sur False, ce qui affiche des angles droits.
Shadow Boolean Indique si une ombre apparaît autour du graphique
incorporé.
Top Double Définit la distance entre le bord supérieur de l’objet
ChartObject et le bord supérieur de la feuille de calcul.
Visible Boolean Indique si l’objet ChartObject est visible.
Width Double Définit la largeur du graphique incorporé.

Chaque objet du graphique possède une série de propriétés. Par exemple, l’objet
ChartTitle peut être équipé d’une bordure bleue de 2 points ou avoir une ombre.
Vous pouvez définir ChartTitle avec les propriétés de positionnement comme
Left et Top. En fait, vous pouvez également définir l’orientation. Lorsqu’il est
Chapitre 15

question de l’apparence d’un graphique, les possibilités sont presque infinies.


Avant de programmer la macro, modifiez un graphique existant et documentez
les changements effectués. En vous basant sur l’exemple de graphique et votre
documentation, ajoutez les lignes de code appropriées à la procédure.
Prenons le scénario suivant. La société Mon Jardin crée tous les mois un graphi-
que Ventes de produits. Chaque mois, plusieurs modifications doivent être
appliquées après la création du graphique. Pour assurer la cohérence des graphi-
ques, vous décidez de créer une procédure qui applique les mises en forme
appropriées. La figure 15.5 montre le résultat final souhaité. Notez que le type de
graphique est positionné sur Barres groupées avec effet 3D (xl3DBarClustered) et
que la légende a été supprimée.

Figure 15-5. L’exemple de mise en forme du graphique des ventes mensuelles


de la société Mon Jardin.

La procédure suivante modifie le graphique de la figure 15.5 pour y inclure la


mise en forme que l’on a jugée nécessaire.

Sub FormatChart()

362
Partie 5 : Manipulation des objets Excel

Graphiques
Dim chrt As Chart
Set chrt = ActiveSheet.ChartObjects(1).Chart
chrt.ChartType = xl3DBarClustered
ActiveChart.HasLegend = False
ActiveChart.HasDataTable = True
ActiveChart.DataTable.ShowLegendKey = True
End Sub

Modifier tous les graphiques d’un classeur


Pour établir l’uniformité au sein de votre classeur, vous pouvez appliquer les
mêmes formats à tous les graphiques. Vous pouvez choisir d’appliquer la mise en
forme à tous les objets ChartObjects ou juste à un type de ChartObject, comme
les graphiques incorporés ou les feuilles de graphique. Pour parvenir à ce résul-
tat, utilisez une boucle For...Next pour parcourir chaque objet de la collection
ChartObjects puis accéder à l’objet Chart de chacune et changer sa propriété
ChartType. L’exemple suivant convertit tous les graphiques de la feuille de calcul
active en graphiques de type Aires :

Chapitre 15
Sub ChangeChartType()
Dim chtobj as ChartObject
For Each chtobj In ActiveSheet.ChartObjects
chtobj.Chart.ChartType = xlArea
Next chtobj
End Sub

Imprimer des graphiques


Lorsque vous imprimez une feuille de graphique, elle s’imprime par défaut sur sa
propre page. Avec les graphiques incorporés, vous devez déterminer si le graphi-
que doit être imprimé sur une page séparée ou avec la feuille de calcul. Pour
imprimer un graphique incorporé, l’utilisateur doit d’abord sélectionner le gra-
phique, puis choisir Fichier, Imprimer. Le graphique incorporé s’imprime alors
comme une feuille de graphique.
La procédure suivante montre comment prévisualiser tous les graphiques incor-
porés d’une feuille de calcul sur des pages pleines. Pour envoyer les graphiques à
l’imprimante par défaut, remplacez la méthode PrintPreview par la méthode
PrintOut.

Sub PrintEmbeddedCharts()
For Each chtObj In ActiveSheet.ChartObjects
chtObj.Chart.PrintPreview
Next chtObj
End Sub

En revanche, si vous voulez imprimer le graphique incorporé en tant qu’objet


avec le reste de la feuille de calcul, imprimez simplement la feuille de calcul et le
graphique sera automatiquement imprimé. Si vous ne voulez pas imprimer le
graphique incorporé en même temps que la feuille de calcul, positionnez la pro-
priété PrintObject de ChartObject sur False. Par défaut, l’objet ChartObject est

363
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


inclus au moment de l’impression d’une feuille de calcul. Vous définissez uni-
quement la propriété PrintObject lorsque vous voulez exclure les graphiques
incorporés du travail d’impression.
La procédure suivante imprime la feuille de calcul active et exclut tous les objets
graphiques. Remplacez la propriété PrintPreview par PrintOut pour envoyer le
travail d’impression vers l’imprimante par défaut.

Sub PrintWorksheetOnly()
For Each chtObj In ActiveSheet.ChartObjects
chtObj.PrintObject = False
Next chtObj
ActiveSheet.PrintPreview
End Sub

Réflexions sur la programmation des


graphiques
Après avoir étudié la variété des options disponibles dans le cadre de la création
Chapitre 15

et de la modification des graphiques dans une procédure, vous verrez qu’il est
simple de créer une référence conçue par programmation pour un graphique qui
se trouve sur une feuille de graphique. L’objet Chart est membre de la collection
Charts du classeur. Le défi est de définir la référence à un graphique incorporé.
Sachez que l’objet Chart incorporé se trouve dans un objet ChartObject qui
appartient à la collection ChartObjects de la feuille de calcul. L’Explorateur
d’objets est votre meilleure atout dans le dépannage du code VBA.
Pour déplacer ou redimensionner un graphique incorporé, modifiez les proprié-
tés Top, Left, Width et Height de l’objet ChartObject. Si vous disposez d’une réfé-
rence à l’objet Chart, vous pouvez récupérer une référence à l’objet ChartObject
par le biais de la propriété Parent de l’objet Chart.
Les séries individuelles d’un graphique sont des objets Series et appartiennent à
l’objet SeriesCollection du graphique. La méthode Delete de l’objet Series sert à
supprimer une série d’un graphique. Servez-vous de la méthode NewSeries de
l’objet SeriesCollection pour ajouter de nouvelles séries à un graphique.
Vous pouvez assigner un tableau VBA, à la place de l’habituel objet Range, à la
propriété Values d’un objet Series. Vous créez ainsi un graphique indépendant
des données de la feuille de calcul que vous pouvez distribuer sans une feuille de
calcul en annexe.
Les propriétés Values et XValues retournent les valeurs des données et non les
références de plage utilisées dans le graphique. Pour déterminer les plages réfé-
rencées par un graphique, examinez la fonction SERIE dans la propriété Formula
de chaque série.

364
Partie 5 : Manipulation des objets Excel

Graphiques
Gardez à l’esprit la complexité du modèle de graphique pendant que vous créez
les procédures qui référencent les graphiques. Utilisez l’une des astuces que nous
vous proposons pour simplifier la manière de référencer le graphique et produire
du code plus propre, comme assigner une variable objet au graphique.
Dans le prochain chapitre, vous allez apprendre à configurer le classeur pour
exploiter les tableaux et les graphiques croisés dynamiques.

Chapitre 15

365
Partie 5 : Manipulation des objets Excel

Chapitre 16
Tableaux et graphiques
croisés dynamiques
Tableaux et graphiques croisés Programmation de tableaux croisés
dynamiques . . . . . . . . . . . . . . . . 367 dynamiques. . . . . . . . . . . . . . . . 384
Objets des tableaux croisés Manipulation par programmation des
dynamiques . . . . . . . . . . . . . . . . 374 tableaux croisés dynamiques . . 386

Ce chapitre est consacré à la création et à la manipulation des tableaux et des gra-


phiques croisés dynamiques avec Microsoft Visual Basic pour Applications
(VBA). Dans ce chapitre, vous allez découvrir les objets associés aux tableaux et
graphiques croisés dynamiques et apprendre à manipuler les tableaux croisés
dynamiques ainsi que les objets associés par programmation.

Tableaux et graphiques croisés dynamiques


Pour les données bidimensionnelles organisées en lignes et en colonnes, les
feuilles de calcul constituent un parfait outil. Cependant, on peut souvent pré-
senter la synthèse des données de plusieurs manières. En outre, si vous créez de
nouvelles feuilles de calcul et de nouveaux graphiques basés sur leurs données
pour chaque aspect des données à mettre en évidence, vous risquez d’être rapi-
dement débordé par l’énormité de la tâche et d’en perdre le contrôle. Microsoft
propose une fonctionnalité qui constitue un outil puissant pour faire face à ce
problème.
Les tableaux et graphiques croisés dynamiques permettent de présenter vos don-
nées selon plusieurs perspectives différentes. Ils permettent souvent de découvrir
des relations cachées entre plusieurs champs que l’on aurait autrement ignorées.

Introduction aux tableaux croisés dynamiques


Un tableau croisé dynamique est un outil qui permet de gérer les rapports mul-
tidimensionnels. La figure 16.1 présente un simple rapport bidimensionnel con-
tenant un collection prédéfinie de colonnes et de lignes indexant les données
synthétisées.

367
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Figure 16-1. Rapport bidimensionnel simple contenant des données indexées


sur deux champs.

Pour représenter un rapport contenant trois champs, imaginez un cube dont


l’intersection de chaque variable de ligne, colonne et profondeur produit une
valeur récapitulative unique. Pour simplifier la gestion d’un rapport tridimen-
sionnel, vous pouvez « l’aplatir » en coupant le cube en plusieurs tranches sur
Chapitre 16

l’axe de la profondeur et représenter la troisième dimension dans la partie supé-


rieure de chaque page du rapport, comme c’est souvent le cas dans les rapports
créés avec Microsoft Access.
L’être humain est rarement capable de visualiser un rapport exploitant plus de
trois variables. Avec Excel, vous pouvez mettre à plat un rapport qui exploite
autant de variables que nécessaire. Il suffit de choisir les champs des lignes et des
colonnes du rapport et d’afficher les valeurs des autres champs dans la partie
supérieure de chaque page.
Les données employées dans un tableau croisé dynamique s’organisent générale-
ment sous forme de séries de lignes, appelées faits, qui se composent d’une col-
lection de clés et de mesures. Une mesure représente une valeur numérique
comme un volume de ventes ou la valeur totale en euros des ventes. Une clé, qui
peut être composée d’une ou de plusieurs colonnes, caractérise une mesure cor-
respondante et répond généralement à des questions comme les dates des ventes
ou à qui les ventes ont été faites. Un champ clé (ou collection de champs) con-
tient toujours une valeur unique pour chaque ligne d’un tableau, ce qui permet
à Excel d’identifier la mesure correspondante. Dans le tableau suivant, les
champs Month, Week, Weekday, Day et Hour comportent des clés, alors que le
champ Sales contient une mesure.

368
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques


Month Week Weekday Day Hour Sales
January 1 Mon 1 9 147
January 1 Tue 2 9 161
January 1 Wed 3 9 182
January 1 Thu 4 9 201
January 1 Fri 5 9 158
January 1 Sat 6 9 190
January 1 Sun 7 9 243
January 2 Mon 8 9 147
January 2 Tue 9 9 161
January 2 Wed 10 9 182
January 2 Thu 11 9 201
January 2 Fri 12 9 685

Excel se sert de transactions individuelles comme celles qui créent les faits affi-
chés dans le tableau croisé dynamique. Ce processus comporte deux phases :
l’extraction des clés des informations contenues dans les transactions et l’identi-
fication de la mesure correspondante.
Un tableau croisé dynamique met en œuvre des rapports multidimensionnels en
combinant les faits de différentes manières. Vous glissez-déposez des champs clé
depuis la Liste de champs du tableau croisé vers la zone de page pour déterminer
la page affichée. Vous pouvez également glisser-déposer les champs clé dans les
zones de ligne ou de colonne pour déterminer les lignes et colonnes affichées.
Glissez les mesures uniquement sur la zone de données. En effet, ces valeurs
seront calculées en fonction des autres champs. Le résultat de ces actions est un
tableau croisé dynamique, similaire à celui de la figure 16.2.

Chapitre 16

Figure 16-2. Un tableau croisé dynamique permet à l’utilisateur de combiner


les faits de différentes manières.

369
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Créer un tableau croisé dynamique avec l’Assistant


Tableau et graphique croisés dynamiques
Bien qu’il soit possible de créer un tableau croisé dynamique manuellement,
l’Assistant Tableau et graphique croisés dynamiques simplifie réellement la
tâche :
1 Dans le menu Données, choisissez Rapport de tableau croisé dynamique.
2 Sur la première page de l’assistant, choisissez l’emplacement des données
puis Tableau croisé dynamique.

3 La deuxième étape de l’assistant vous invite à sélectionner les données


source du tableau croisé dynamique. Vous pouvez saisir une plage dans la
zone Plage ou appuyer sur le bouton qui se trouve à l’extrémité droite de
la zone pour réduire la boîte de dialogue et choisir ainsi la plage dans l’un
des classeurs ouverts. Pour ouvrir un nouveau classeur, cliquez sur le bou-
Chapitre 16

ton Parcourir.

4 Dans la dernière étape de l’assistant, vous choisissez l’emplacement où


sera placé le tableau croisé dynamique. Vous pouvez opter pour la feuille
de calcul actuelle ou demander à l’assistant de créer une nouvelle feuille.
Cliquez sur le bouton Disposition pour afficher une boîte de dialogue
dans laquelle vous pouvez glisser-déposer les différents champs de la con-
figuration initiale du tableau croisé dynamique.

370
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques


5 Cliquez sur le bouton Options de la dernière page de l’assistant pour
ouvrir la boîte de dialogue Options du tableau croisé dynamique. Vous
pouvez y choisir un grand nombre d’options.

6 Cliquez sur le bouton Terminer pour créer le tableau croisé dynamique.


7 Lorsque l’assistant a terminé, un tableau croisé dynamique similaire à
celui de la figure 16.3 s’affiche.

Chapitre 16

Figure 16-3. Un tableau croisé dynamique contient des informations


synthétisées basées sur les données sous-jacentes fournies.

Introduction aux graphiques croisés dynamiques


Un graphique croisé dynamique constitue une représentation graphique d’un
tableau croisé dynamique (voir figure 16.4). En fait, on crée généralement le gra-
phique croisé dynamique à partir de données d’un tableau croisé dynamique
existant. À l’instar du tableau croisé dynamique, vous glissez-déposez les champs

371
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


dans les zones appropriées du graphique croisé dynamique.

Figure 16-4. Un graphique croisé dynamique contient des zones de dépose


similaires à celles d’un tableau croisé dynamique.

Les axes des x et des y du graphique correspondent aux zones de ligne et de


colonne du tableau croisé dynamique, alors que la zone de page se trouve dans la
Chapitre 16

partie supérieure du graphique. Ces champs sont intitulés zone de catégories et


zone de séries. La zone de page et la zone de données reflètent directement le
tableau croisé dynamique.
Une fois que vous avez déposé les champs dans les différentes parties du graphi-
que croisé dynamique, vous pouvez modifier le type de graphique en choisissant
Graphique, Type de graphique. Vous pouvez également exploiter la majorité des
outils de mise en forme de graphique proposés par Excel pour personnaliser le
graphique et l’adapter à vos besoins.

Créer un graphique croisé dynamique avec l’Assistant


Tableau et graphique croisés dynamiques
Pour créer un graphique croisé dynamique, faites appel au même assistant que
pour le tableau croisé dynamique. À l’arrière-plan, l’assistant crée un nouveau
tableau croisé dynamique, puis s’en sert pour créer un graphique croisé dynami-
que. Si vous disposez déjà d’un tableau croisé dynamique, il vous suffit de sélec-
tionner l’une de ses cellules et de choisir Insertion, Graphique dans le menu
d’Excel. La figure 16.5 montre le graphique ainsi généré.

372
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Figure 16-5. Un graphique croisé dynamique constitue une représentation


graphique d’un tableau croisé dynamique.

Bases de données OLAP


Les sources des données d’un tableau croisé dynamique sont multiples et ne se
limitent pas aux feuilles de calcul. On importe généralement les données dans

Chapitre 16
Excel ce qui permet de préserver celles d’origine. Cette organisation permet à
l’utilisateur du tableau croisé dynamique de rafraîchir les données.
Les tableaux croisés dynamiques Excel présentent cependant une limite
importante : ils ne savent pas gérer directement les gros volumes de données.
Cette limite ne constitue pas une surprise si l’on considère qu’une feuille de cal-
cul est limitée à 65 536 lignes. Excel propose toutefois un utilitaire qui permet à
un tableau croisé dynamique d’exploiter un type spécial de serveur de base de
données externe appelé serveur OLAP (Online Analytical Processing).

Remarque SQL Server Standard Edition et Enterprise Edition incluent un outil


appelé Services OLAP, qui propose les fonctionnalités d’une base de données
OLAP auxquelles on peut accéder à partir d’Excel.

Avec une base de données OLAP, les valeurs sont synthétisées au niveau du ser-
veur OLAP et non de l’ordinateur local. Celui-ci est capable de traiter des volu-
mes importants de données qu’il synthétise rapidement et efficacement en
précalculant les valeurs.

373
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Remarque Dans la mesure où Excel compte sur le serveur OLAP pour précal-
culer les données, chaque fois que vous modifiez la disposition d’un tableau
croisé dynamique, Excel demande une nouvelle copie des données au serveur
OLAP. Ce processus peut engendrer des délais importants pendant la transmis-
sion des données entre le serveur OLAP et Excel.

En outre, Excel exploite directement les données synthétisées. En conséquence,


vous ne pouvez pas modifier les fonctions de synthèse des champs de données.
L’autre inconvénient des données synthétisées est que vous n’avez pas accès aux
données détaillées. Ces informations sont déterminées par la conception de la
base de données OLAP.

Attention Les tableaux croisés dynamiques qui exploitent des sources de


données OLAP se comportent différemment de ceux qui ne le font pas. En
effet, les serveurs OLAP retournent des données déjà synthétisées. Ainsi, les
différents objets sont utilisés en interne pour stocker les données synthéti-
sées et pour interagir avec le serveur OLAP. Le reste de ce chapitre suppose
que vous exploitez des données ne provenant pas de sources OLAP.

Objets des tableaux croisés dynamiques


Une feuille de calcul Excel peut contenir plusieurs tableaux croisés dynamiques.
Pour accéder à un objet PivotTable particulier, commencez par l’objet Worksheet
qui représente la feuille de calcul qui contient le tableau croisé dynamique à
manipuler. Servez-vous ensuite de la collection PivotTables pour atteindre l’objet
Chapitre 16

PivotTable à manipuler.
Chaque objet PivotTable contient plusieurs objets clés qui représentent les diffé-
rentes pièces d’un tableau croisé dynamique (voir figure 16.6).

374
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Objet Worksheet

Collection PivotTables

Objet PivotTable

Objet PivotCache

Collection PivotFields
(accessible via les propriétés :
ColumnFields, DataFields,
HiddenFields, PageFields,
RowFields, VisibleFields,
CalculatedFields)

Objet PivotField

Collection PivotItems

Objet PivotItem

Figure 16-6. Les différentes parties d’un tableau croisé dynamique sont
représentées par une collection de différents types d’objets.

Chapitre 16
Collection PivotTables
La collection PivotTables contient tous les tableaux croisés dynamiques d’une
feuille de calcul. Le tableau 16.1 liste les principales propriétés et méthodes de la
collection PivotTables. On accède à la propriété PivotTables d’un objet Worksheet
avec le code suivant :

ActiveSheet.PivotTables(1)

375
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 16-1. Principales propriétés et méthodes de la collection


PivotTables
Propriété/Méthode Description
Add(PivotCache, Méthode : ajoute un nouveau tableau croisé dynamique à la
TableDestination, collection. PivotCache fait référence aux données affichées
TableName, ReadData, dans le tableau croisé dynamique ; TableDestination passe
DefaultVersion) un objet Range dont l’angle supérieur gauche marque
l’emplacement du tableau croisé dynamique dans la feuille
de calcul ; TableName contient le nom du tableau croisé
dynamique (optionnel) ; ReadData, si elle est positionnée
sur True, cache tous les enregistrements provenant d’une
base de données externe dans PivotCache ; DefaultVersion
spécifie la version d’Excel qui a créé le tableau croisé
dynamique.
Count Propriété (lecture seule) : retourne le nombre d’éléments
dans la collection PivotTables.
Item(index) Méthode : retourne la référence de l’objet PivotTable associé
à index, lequel peut référencer le tableau croisé dynamique
par son nom ou sa position relative dans la collection.

Objet PivotTable
L’objet PivotTable représente un tableau croisé dynamique. Vous pouvez exploi-
ter cet objet pour accéder à un tableau croisé dynamique existant sur une feuille
Chapitre 16

de calcul ou vous servir de la méthode Add de la collection PivotTables pour en


ajouter un nouveau. Il est même possible d’exploiter la méthode PivotTableWi-
zard de l’objet Worksheet pour créer un nouveau tableau croisé dynamique.
Le tableau 16.2 présente une liste des principales propriétés et méthodes asso-
ciées à l’objet PivotTable.
Tableau 16-2. Principales propriétés et méthodes
de l’objet PivotTable
Propriété/Méthode Description
AddDataField(Field, Caption, Méthode : cette routine ajoute un champ de
Function) données à un tableau croisé dynamique. Field est un
objet PivotField associé au tableau croisé
dynamique. Caption contient une valeur qui sera
employée comme étiquette de l’objet PivotField
spécifié (optionnel). Function spécifie la fonction de
synthèse réalisée sur le champ de données.
CalculatedFields Méthode : retourne une collection CalculatedFields
qui contient les objets PivotField calculés en fonction
des autres champs du tableau croisé dynamique.

376
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Tableau 16-2. Principales propriétés et méthodes


de l’objet PivotTable (Suite)
Propriété/Méthode Description
ColumnFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields qui contient
les champs actuellement affichés comme champs
de colonne.
ColumnGrand Propriété : si cette propriété est positionnée sur
True, le rapport de tableau croisé dynamique affiche
les totaux généraux de chaque colonne de l’objet
PivotTable.
DataFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields qui contient
les champs actuellement affichés comme champs
de données.
DisplayErrorString Propriété : si elle est positionnée sur True, toutes les
cellules contenant des erreurs présentent le texte de
la propriété ErrorString.
DisplayNullString Propriété : si elle est positionnée sur True, toutes les
cellules contenant des valeurs nulles présentent le
texte dans la propriété NullString.
ErrorString Propriété : contient le texte affiché dans les cellules
contenant des erreurs, si la propriété
DisplayErrorString est positionnée sur True.

Chapitre 16
Format (format) Méthode : positionne le format du tableau croisé
dynamique sur l’un des formats spécifiés dans
XlPivotFormatType. Les formats valides sont :
xlPTClassic, xlPTNone, xlPTReport1 à xlPTReport10 et
xlPTTable1 à xlPTTable10.
HiddenFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields contenant les
champs qui ne sont actuellement pas affichés
comme champs de ligne, colonne, page ou données.
Name Propriété : contient le nom du tableau croisé
dynamique.
NullString Propriété : contient le texte affiché dans les cellules
contenant des valeurs nulles, si la propriété
DisplayNullString est positionnée sur True.
PageFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields qui contient
les champs actuellement affichés comme champs
de page.

377
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 16-2. Principales propriétés et méthodes


de l’objet PivotTable (Suite)
Propriété/Méthode Description
PivotCache Méthode : retourne une référence à l’objet
PivotCache associé au tableau croisé dynamique.
PivotFields(index) Méthode : retourne l’objet PivotField spécifié par le
paramètre index ou la collection de tous les
PivotFields si on omet index.
PivotTableWizard (SourceType, Méthode : construit un tableau croisé dynamique
SourceData, TableDestination, libellé TableName en se servant des données de
TableName, RowGrand, SourceData et place le résultat dans
ColumnGrand, SaveData, TableDestination.
HasAutoFormat, AutoPage,
Reserved, BackgroundQuery,
OptimizeCache, PageFieldOrder,
PageFieldWrapCount, ReadData,
Connection)
RefreshTable Méthode : actualise les données affichées dans le
tableau croisé dynamique en fonction des données
de la source de données associée.
RowFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields qui contient
les champs actuellement affichés comme champs
de ligne.
Chapitre 16

RowGrand Propriété : si elle est positionnée sur True, cette


propriété affiche les totaux généraux de chaque ligne
du tableau croisé dynamique.
VisibleFields Propriété (lecture seule) : retourne un objet
PivotField ou une collection PivotFields qui contient
les champs actuellement affichés dans le tableau
croisé dynamique.

Astuce : Actualisez vos données


Servez-vous de la méthode RefreshTable pour actualiser les informations affi-
chées dans le tableau croisé dynamique si les données source changent.

Collection PivotCaches
La collection PivotCaches contient tous les objets PivotCache (voir tableau 16.3).
Les objets PivotCache étant stockés au niveau du classeur, vous pouvez les exploi-

378
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques


ter facilement pour créer des tableaux et des graphiques croisés dynamiques au
sein du classeur.
Tableau 16-3. Principales propriétés et méthodes de la collection
PivotCaches
Propriété/Méthode Description
Add(SourceType, Méthode : ajoute un nouvel objet PivotCache à la collection.
SourceData) SourceType identifie la provenance des données :
xlConsolidation, xlDatabase, xlExternal, xlPivotTable ou
xlScenario. SourceData donne des informations
complémentaires sur la source des données. Cette source
est généralement un objet Range. Dans le cas d’une base
de données externe, il s’agit d’un tableau à deux éléments,
où le premier élément représente la chaîne de connexion et
le deuxième élément contient la requête SQL qui obtient les
données.
Count Propriété (lecture seule) : retourne le nombre d’éléments
dans la collection PivotCaches.
Item(index) Méthode : retourne la référence de l’objet PivotCache
associé à index, lequel peut référencer le tableau croisé
dynamique par son nom ou sa position relative dans la
collection.

Objet PivotCache

Chapitre 16
Les données affichées dans un tableau croisé dynamique sont stockées dans un
objet PivotCache. Pour référencer l’objet PivotCache, on utilise la méthode Pivot-
Cache associée à l’objet PivotTable ou la collection PivotCaches associées à l’objet
Workbook. Plusieurs tableaux croisés dynamiques peuvent partager le même
objet PivotCache.
Le tableau 16.4 présente une liste des principales propriétés et méthodes asso-
ciées à l’objet PivotCache.
Tableau 16-4. Principales propriétés et méthodes
de l’objet PivotCache
Propriété/Méthode Description
CommandText Propriété : contient la chaîne de commande utilisée pour
récupérer les données à partir d’une base de données
externe.
CommandType Propriété : identifie le type de données stockées dans
CommandText avec une constante de l’énumération
XlCmdType, dont les types sont : xlCmdCube, xlCmdDefault,
xlCmdList, xlCmdSql et xlCmdTable.

379
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 16-4. Principales propriétés et méthodes


de l’objet PivotCache (Suite)
Propriété/Méthode Description
Connection Propriété : contient une chaîne de connexion OLE DB ou
ODBC servant à accéder à une base de données externe ;
peut également contenir une URL qui permet de se
connecter à une source de données web, le nom complet
d’un fichier texte ou une base de données Access. Utilisez la
méthode Refresh pour actualiser les données contenues
dans la source.
CreatePivotTable Méthode : crée un objet PivotTable basé sur l’objet
(TableDestination, PivotCache en cours.
TableName, ReadData,
DefaultVersion)
Index Propriété (lecture seule) : retourne le numéro d’index de
PivotCache au sein de la collection PivotCaches.
IsConnected Propriété (lecture seule) : si elle est positionnée sur True,
elle signifie que PivotCache est actuellement connecté à une
source de données.
MakeConnection Méthode : ouvre une connexion entre PivotCache et la
source des données spécifiée dans la propriété Connection.
MemoryUsed Propriété (lecture seule) : retourne le nombre d’octets
utilisés par l’objet PivotCache actuel.
OLAP Propriété (lecture seule) : retourne True si le cache est
Chapitre 16

connecté à un serveur OLAP.


QueryType Propriété (lecture seule) : retourne le type de requête utilisé
pour remplir le cache sous la forme d’une constante
XlQueryType : xlADORecordset, xlDAORecordset,
xlDDBCQuery, xlOLEDBQuery, xlTextImport et xlWebQuery.
RecordCount Propriété (lecture seule) : retourne le nombre
d’enregistrements présents dans le cache.
Recordset Propriété : contient l’objet Recordset utilisé pour remplir le
cache.
Refresh Méthode : actualise les informations contenues dans l’objet
PivotCache et l’objet PivotTable associé.
RefreshDate Propriété (lecture seule) : retourne la date de la dernière
actualisation du cache.
RefreshPeriod Propriété : contient le nombre de minutes entre les
actualisations. Si vous lui attribuez la valeur zéro, vous
désactivez les actualisations automatiques.

380
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Objets PivotField
L’objet PivotField représente l’un des champs d’un tableau croisé dynamique.
Cet objet contient de nombreuses informations utiles qui décrivent le champ,
dont son nom (Name), la mémoire qu’il occupe (MemoryUsed) et le format de
nombres (NumberFormat). Les principales propriétés sont toutefois Orientation
et Position. La première détermine l’emplacement du champ dans le tableau
croisé dynamique et la deuxième la position du champ parmi tous les champs de
son orientation.
● La méthode PivotItem retourne une collection d’objets PivotItem. Chacun
de ces objets représente une valeur spécifique au sein de l’objet PivotField.
● On accède à l’objet PivotField par le biais des propriétés associées à l’objet
PivotTable. Celles-ci offrent un raccourci pour les sous-ensembles de don-
nées couramment employés.
● La collection PivotFields contient le jeu complet des objets PivotField asso-
ciés à PivotTable.
● La propriété HiddenFields retourne le jeu d’objets PivotField qui ne sont
actuellement pas affichés dans le tableau croisé dynamique ou le graphi-
que croisé dynamique.
● La propriété VisibleFields retourne le jeu d’objets PivotField qui sont
actuellement affichés dans le tableau croisé dynamique ou le graphique
croisé dynamique.
● La propriété ColumnFields retourne le jeu d’objets PivotField qui sont affi-
chés en tant que colonnes dans un tableau croisé dynamique ou un graphi-

Chapitre 16
que croisé dynamique.
● La propriété RowFields retourne le jeu d’objets PivotField qui sont affichés
en tant que lignes dans un tableau croisé dynamique ou un graphique
croisé dynamique.
● La propriété PageFields retourne le jeu d’objets PivotField qui sont affichés
dans la zone de page dans un tableau croisé dynamique ou un graphique
croisé dynamique.
● La propriété DataFields retourne le jeu d’objets PivotField qui sont affichés
dans la zone de données dans un tableau croisé dynamique ou un graphi-
que croisé dynamique.
● La collection CalculatedFields contient le jeu d’objets PivotField calculés à
partir d’autres champs du tableau croisé dynamique.

Remarque Si la collection ne contient qu’un objet PivotField, la propriété


associée de l’objet PivotTable pointe directement sur l’objet PivotField et non
sur la collection PivotFields.

381
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Le tableau 16.5 présente une liste des principales propriétés et méthodes asso-
ciées à l’objet PivotField.
Tableau 16-5. Principales propriétés et méthodes
de l’objet PivotField
Propriété/Méthode Description
Caption Propriété (lecture seule) : retourne l’étiquette du champ.
CurrentPage Propriété : contient la page en cours d’un champ de page.
DataRange Propriété (lecture seule) : retourne un objet Range avec les
données contenues dans le champ.
DataType Propriété (lecture seule) : retourne le type de données à partir de
l’énumération XlPivotFieldDataType (xlDate, xlNumber ou xlText)
qui représente le champ.
DragToColumn Propriété : si elle est False, cette propriété signifie qu’on ne peut
pas glisser-déposer ce champ vers la position de la colonne dans
le tableau croisé dynamique.
DragToData Propriété : si elle est False, cette propriété signifie qu’on ne peut
pas glisser-déposer ce champ vers la zone de données dans le
tableau croisé dynamique.
DragToHide Propriété : si elle est False, cette propriété signifie qu’on ne peut
pas masquer le champ en le glissant hors du tableau croisé
dynamique.
DragToPage Propriété : si elle est False, cette propriété signifie qu’on ne peut
pas glisser-déposer ce champ vers la zone de page du tableau
Chapitre 16

croisé dynamique.
DragToRow Propriété : si elle est False, cette propriété signifie qu’on ne peut
pas glisser-déposer ce champ vers la position de la ligne dans le
tableau croisé dynamique.
LayoutForm Propriété : contient la manière dont les éléments du tableau
croisé dynamique s’affichent : xlTabular représente le format de
tableau, xlOutline désigne le format contours.
MemoryUsed Propriété (lecture seule) : retourne le nombre d’octets utilisés
par l’objet PivotField actuel.
Name Propriété : contient le nom de l’objet PivotField.
NumberFormat Propriété : contient les spécifications de mise en forme utilisées
pour afficher les informations provenant de l’objet PivotField.
S’applique uniquement aux champs utilisés dans la zone de
données du tableau croisé dynamique.
Orientation Propriété : indique l’emplacement du champ dans un tableau
croisé dynamique selon la spécification du type
XlPivotFieldOrientation (xlColumnField, xlDataField, xlHidden,
xlPageField ou xlRowField).

382
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Tableau 16-5. Principales propriétés et méthodes


de l’objet PivotField (Suite)
Propriété/Méthode Description
PivotItems Méthode : retourne la collection PivotItems représentant les
éléments individuels au sein d’un champ spécifique.
Position Propriété : contient la position relative du champ parmi tous les
champs de son orientation.
ShowAllItems Propriété : si elle est True, signifie que tous les éléments du
rapport de tableau croisé dynamique sont affichés, même s’ils
ne contiennent pas de données synthétisées.
Value Propriété : contient le nom du champ spécifié dans le rapport du
tableau croisé dynamique.

Objet PivotItem
L’objet PivotItem représente une valeur unique spécifique d’un objet PivotField
particulier. Le tableau 16.6 présente une liste des principales propriétés et
méthodes associées à l’objet PivotItem.
Tableau 16-6. Principales propriétés et méthodes de l’objet PivotItem
Propriété/Méthode Description
Caption Propriété (lecture seule) : retourne l’étiquette du champ.
DataRange Propriété (lecture seule) : retourne un objet Range avec les
données contenues dans le champ.

Chapitre 16
Formula Propriété : contient la formule associée à l’élément en notation
de style A1. Si la cellule est vide, elle retourne une chaîne vide.
Si la cellule contient une constante, elle la retourne.
LabelRange Propriété (lecture seule) : retourne l’objet Range qui représente
les cellules du rapport de tableau croisé dynamique contenant
l’élément.
Name Propriété : contient le nom de l’objet PivotItem.
Position Propriété : contient la position relative du champ parmi tous
les champs de son orientation.
RecordCount Propriété (lecture seule) : retourne le nombre
d’enregistrements de l’objet PivotCache qui contiennent
l’élément spécifié.
Value Propriété : contient le nom de l’élément spécifié dans le champ
du tableau croisé dynamique.
Visible Propriété : positionnée sur True, cette propriété signifie que
l’élément est visible.

383
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Programmation de tableaux croisés


dynamiques
Pour programmer des tableaux croisés dynamiques, vous devez créer l’objet
PivotCache approprié et vous en servir pour créer l’objet PivotTable. Une fois que
l’objet PivotTable est disponible, vous pouvez modifier ses propriétés pour affi-
cher les données à votre guise.

Astuce Simplifiez-vous la vie


Il est souvent complexe de créer des tableaux croisés dynamiques et vous
serez éventuellement tenté d’utiliser l’astuce de l’auteur de macros : enregis-
trer une nouvelle macro en se servant des commandes nécessaires pour
effectuer la tâche à programmer, puis exploiter le code enregistré comme base
du nouveau programme. Cette technique est extrêmement pratique pour les
modèles d’objets complexes comme ceux employés par Excel pour manipuler
les tableaux croisés dynamiques.

Créer un tableau croisé dynamique


Le listing suivant présente le code qui crée un tableau croisé dynamique simple.
La routine commence par déclarer les objets temporaires contenant les référen-
ces de l’objet PivotCache et les objets PivotTable, plus une variable temporaire qui
sera employée pour supprimer la feuille de calcul contenant le tableau croisé
dynamique.
Chapitre 16

Sub CreatePivotTable()

Dim pc As PivotCache
Dim ws As Worksheet
Dim tc As PivotTable

For Each ws In ActiveWorkbook.Worksheets


If ws.Name = "FeuilleTCD" Then
ws.Delete

End If

Next ws

Set ws = ActiveWorkbook.Worksheets.Add()
ws.Name = "FeuilleTCD"

Set pc = ActiveWorkbook.PivotCaches.Add(xlDatabase,
"AllData!R1C1:R1117C6")

Set tc = pc.CreatePivotTable("FeuilleTCD!R1C1", "Mon tableau croisé


dynamique")

tc.PivotFields("Month").Orientation = xlRowField
tc.PivotFields("Month").Position = 1

384
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques


tc.PivotFields("Hour").Orientation = xlColumnField
tc.PivotFields("Hour").Position = 1

tc.AddDataField tc.PivotFields("Sales"), "Total des ventes", xlSum

End Sub

On utilise une simple boucle For Each pour parcourir la collection d’objets
Worksheet associés au classeur actif à la recherche d’une feuille libellée
FeuilleTCD. Si la feuille existe, elle est supprimée. Une fois la feuille supprimée,
une nouvelle feuille de calcul portant le même nom est ajoutée à la collection
Worksheets. Le code s’assure que la feuille de calcul est vide avant d’ajouter le
tableau croisé dynamique.
Il crée ensuite un objet PivotCache avec la méthode PivotCaches.Add. L’argument
xlDatabase indique que les données sont organisées en séries de lignes et de
colonnes, alors que le deuxième paramètre indique que les données se trouvent
sur la feuille de calcul AllData dans les colonnes 1 à 6 et les lignes l à 1117.
Une fois que l’objet PivotCache est créé, le code peut créer un objet PivotTable
avec la méthode CreatePivotTable de l’objet PivotCache. Cette méthode prend
deux arguments, l’emplacement de l’angle supérieur gauche du tableau croisé
dynamique et son nom.
Par défaut, le tableau croisé dynamique est vide. Vous devez donc définir les
champs de lignes, de colonnes et de données. Pour définir les lignes et les colon-
nes, vous devez faire appel à la collection PivotFields de l’objet PivotTable et défi-
nir la propriété Orientation. La propriété Position est également positionnée sur

Chapitre 16
1, pour vous permettre d’ajouter des champs de ligne et de colonne.
Pour finir, la méthode AddDatatField définit les champs inclus dans la zone de
données du tableau croisé dynamique. Cette routine prend trois arguments :
l’objet PivotField qui doit être ajouté à la zone de données, le titre du champ et la
fonction employée pour combiner les champs de données.
Si vous exécutez la routine CreatePivotTable, vous obtenez le tableau croisé
dynamique de la figure 16.7.

385
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Figure 16-7. Ce tableau croisé dynamique est le résultat de l’exécution de la


sous-routine CreatePivotTable.

Créer un graphique croisé dynamique


Une fois que vous avez créé le tableau croisé dynamique, rien de plus simple que
de créer le graphique croisé dynamique. Créez un nouvel objet Chart et servez-
Chapitre 16

vous du tableau croisé dynamique comme source de données avec le code


suivant :

Charts.Add
ActiveChart.SetSourceData Sheets("FeuilleTCD").Range("A1")
ActiveChart.Location xlLocationAsNewSheet, "Graphique croisé
dynamique"

La méthode Charts.Add crée un nouvel objet Chart. Ensuite la méthode SetSour-


ceData désigne le tableau croisé dynamique qui se trouve sur FeuilleTCD en
commençant à la cellule A1. Pour finir, la méthode Location sert à créer une nou-
velle feuille qui héberge le graphique croisé dynamique et lui attribue un titre.

Manipulation par programmation des


tableaux croisés dynamiques
Faire pivoter un tableau croisé dynamique manuellement n’est guère compli-
qué… il suffit de faire glisser l’en-tête du champ vers l’emplacement approprié
dans la disposition du tableau croisé dynamique. Les utilisateurs de tableaux
croisés dynamiques se plaignent d’oublier régulièrement la configuration exacte
qu’ils doivent mettre en évidence. Dans un tableau croisé dynamique simple,

386
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques


comme dans le tableau à six champs de notre exemple, vous ne rencontrerez que
peu de difficultés à vous rappeler où placer les éléments. En revanche, si le
tableau croisé dynamique contient plus de six champs, ou si les données ne vous
sont pas familières, vous devrez faire appel à quelques techniques de macros
pour obtenir la présentation de votre choix. Cette section propose quatre macros
que vous pouvez employer pour construire vos propres solutions.

Faire pivoter un tableau croisé dynamique


La première procédure montre comment modifier la position d’un champ au
sein du tableau croisé dynamique. Servez-vous du tableau croisé dynamique qui
se trouve sur la feuille PivotTable du classeur EditPivot.xls (voir figure 16.8).

Chapitre 16
Figure 16-8. Voici la disposition de base utilisée pour les manipulations de
notre exemple.

La zone de ligne du tableau croisé dynamique comporte trois champs (Month,


Week et Day) et la zone de colonne en héberge un (Hour). Vous pouvez faire
pivoter le tableau croisé dynamique pour créer une colonne unique des résultats
en plaçant le champ Hour en quatrième position de la zone de ligne. La procé-
dure suivante réalise cette action et génère le résultat de la figure 16.9.
Sub PivotHourTo4()
On Error Goto NotEnough
With ActiveSheet.PivotTables("PivotTable8").PivotFields("Hour")
.Orientation = xlRowField
.Position = 4
End With
NotEnough: MsgBox ("Il y a moins de trois champs dans la zone de
ligne.")

387
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


End Sub

Figure 16-9. Voici le résultat du déplacement du champ Hour dans la


quatrième position de la zone de ligne.

Au Quotidien
Chapitre 16

Une occurrence intéressante

Pour que cette macro fonctionne correctement, la zone de ligne doit contenir
trois champs. L’ordre des champs est important en ce qu’il affecte la présen-
tation des données, mais il est peu significatif si la procédure fonctionne cor-
rectement. La présence ou l’absence de l’instruction OnError produit,
cependant, une différence intéressante dans la manière dont Excel gère le
résultat de l’instruction qui place le champ Hour à la quatrième position de la
zone de ligne. Si on ignore l’instruction OnError et qu’il y a moins de trois
champs dans la zone de ligne, Excel ne parvient pas à trouver la quatrième
position de la zone et vous obtenez l’erreur : « Erreur d’exécution ‘1004’ :
Impossible de définir la propriété Position de la classe PivotField. ». En revan-
che, si on inclut l’instruction OnError, qui dirige le programme vers la ligne de
l’étiquette NotEnough: si une erreur se produit, Excel interprète l’instruction de
déplacer le champ Hour vers la quatrième position de la zone de ligne comme
une instruction de déplacer le champ Hour vers la dernière position de la zone
de ligne. Voilà la récompense d’une programmation de qualité.

388
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Réinitialiser la position d’origine


Après avoir manipulé un tableau croisé dynamique pendant une présentation,
on peut oublier la disposition d’origine des champs. Pour réinitialiser la condi-
tion d’origine du tableau croisé dynamique, il vous suffit de réorganiser les
champs. Cette opération n’est pas toujours simple manuellement. Il peut donc
être intéressant d’écrire une macro qui recrée la disposition d’origine. La pro-
chaine procédure réinitialise le tableau croisé dynamique du classeur EditPi-
vot.xls de la figure 16.8.

Sub ResetPivotTable()

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Month")
.Orientation = xlRowField
.Position = 1
End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Week")
.Orientation = xlRowField
.Position = 2
End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Day")
.Orientation = xlRowField
.Position = 3
End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Hour")
.Orientation = xlColumnField

Chapitre 16
.Position = 1
End With

End Sub

Remarque Notez que le code déplace les champs par ordre de position de
sorte que le champ qui se trouve dans la position 1 de la zone de ligne soit
inséré avant le champ de la position 2.

Enregistrer et restaurer des positions


Si vous connaissez la disposition de votre tableau croisé dynamique, il n’est guère
difficile de spécifier l’emplacement exact de chaque champ, mais comment faire
si en manipulant votre tableau vous découvrez une disposition qui vous
convient ? Pour vous rappeler la disposition du tableau, vous pouvez toujours
opter pour l’ancienne méthode : un papier et un crayon. Il existe cependant une
nouvelle méthode : la macro RecordPosition qui écrit l’ordre des champs dans
un groupe de cellules de la feuille de calcul active. Cette macro est spécifique au
tableau croisé dynamique de la feuille PivotTable dans le classeur EditPivot.xls.

389
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Remarque Vérifiez que la cellule active se trouve à un emplacement dispo-


sant de l’espace suffisant pour coller les données de position que la macro
crée. À cette fin, il est préférable de créer une nouvelle feuille de calcul, éven-
tuellement intitulée Positions, pour sauvegarder ces dispositions.

Sub RecordPosition()

Dim pvtMyField As PivotField


Dim i As Integer

i = 1

ActiveCell.Value = "Field Name"


ActiveCell.Offset(0, 1).Value = "Orientation"
ActiveCell.Offset(0, 2).Value = "Position"

With Worksheets("PivotTable").PivotTables("PivotTable8")
For Each pvtMyField In .PivotFields

ActiveCell.Offset(i, 0) = pvtMyField.Name
ActiveCell.Offset(i, 1) = pvtMyField.Orientation
ActiveCell.Offset(i, 2) = pvtMyField.Position

i = i + 1
Next
End With

End Sub
Chapitre 16

La figure 16.10 présente le résultat de l’exécution de la macro RecordPosition sur


la disposition du tableau croisé dynamique du classeur EditPivot.xls.

Figure 16-10. Excel enregistre la position du tableau croisé dynamique pour un


usage ultérieur.

Il est important de réaliser que les valeurs assignées à la propriété Position sont
représentées en interne en tant que nombres et non par les constantes Excel du
groupe XlPivotFieldOrientation. Le tableau 16.7 liste les constantes XlPivotFiel-
dOrientation et leurs valeurs numériques correspondantes.

390
Partie 5 : Manipulation des objets Excel

Tableaux et graphiques croisés dynamiques

Tableau 16-7. Valeurs numériques des constantes


XlPivotFieldOrientation
Constante Valeur numérique
xlColumnField 2
xlDataField 0
xlHidden 0
xlPageField 3
xlRowField 1

Attention Lorsque vous écrivez les valeurs qui représentent la disposition


d’un tableau croisé dynamique dans une feuille de calcul, vérifiez qu’il se
trouve une ligne vide en dessous de la dernière entrée pour vous assurer que
la macro de restauration s’exécute correctement.

Et maintenant, le moment de vérité. Vous avez enregistré la disposition du


tableau croisé dynamique avec la procédure RecordPosition et il est temps de
vérifier que vous pouvez exploiter ces données pour recréer la disposition enre-
gistrée. Pour tester la procédure, changez la disposition du tableau croisé dyna-
mique sur la feuille PivotTable du classeur EditPivot.xls et exécutez la macro
ResetFromRecorded.

Important Pour que cette macro s’exécute correctement, la cellule active


doit se trouver sur la feuille de calcul qui contient les données de position

Chapitre 16
enregistrées. Cette macro suppose que vous utilisez le tableau croisé dynami-
que du classeur EditPivot.xls. Pour utiliser un autre tableau, modifiez l’instruc-
tion With de sorte qu’elle reflète le nom de la feuille de calcul (PivotTable dans
notre exemple) et l’identificateur du tableau (PivotTable8 dans cet exemple).

Sub ResetFromRecorded()

Dim myRange As Range


On Error Resume Next

Set myRange = Application.InputBox(Prompt:="Cliquez sur la cellule _


qui contient l’en-tête de colonne Field Name.", Type:=8)
myRange.Select

Do While ActiveCell.Offset(1, 0).Value <> ""


ActiveCell.Offset(1, 0).Select
With Worksheets("PivotTable").PivotTables("PivotTable8") _
.PivotFields(ActiveCell.Value)
.Orientation = ActiveCell.Offset(0, 1).Value
.Position = ActiveCell.Offset(0, 2).Value

End With

Loop

End Sub

391
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Cette procédure débute à la cellule qui contient l’étiquette Field Name, vérifie
que la cellule suivante de la colonne est vide et passe par la boucle Do…While,
assignant les champs aux orientations et positions listées jusqu’à trouver une cel-
lule vide dans la liste de noms de champs.

Astuce Chaque cas est spécial


Créez une version de la procédure ResetFromRecorded pour chaque position
que vous souhaitez réutiliser. Vous pourrez alors spécifier la cellule de départ
dans le code de la macro et lier cette dernière à un élément de menu, un bou-
ton de barre d’outils ou tout autre objet pour exécuter la macro d’un simple
clic.

Dans ce chapitre, vous avez étudié les tableaux et les graphiques croisés dynami-
ques, vous avez appris à les créer par programmation et par le biais de l’interface
Excel. Après l’étude de la création des tableaux croisés dynamiques, nous avons
approfondi le sujet en examinant quelques techniques précieuses permettant de
les manipuler par programmation. Les procédures qui clôturent ce chapitre
constituent d’intéressants outils pour toute personne qui souhaite exploiter des
données pour raconter une histoire, au lieu de combler la discussion le temps de
trouver une disposition spécifique du tableau croisé dynamique.
Chapitre 16

392
Partie 5 : Manipulation des objets Excel

Chapitre 17
Barres de commandes
Identification des différentes Contrôles des barres
parties du système de menus . . 393 de commandes . . . . . . . . . . . . . 400

Excel propose diverses fonctionnalités qui permettent de manipuler les menus et


trouvent tout leur intérêt lorsque vous créez des macros complémentaires. Vous
enregistrez les événements appropriés dans une macro complémentaire et celle-
ci ajoute automatiquement les éléments de menu nécessaire, pour en faire une
partie intégrante de l’application. Dans ce chapitre, vous découvrirez les divers
éléments associés aux menus et aux barres d’outils et vous apprendrez à ajouter
de nouveaux éléments, à modifier les éléments existants et à annuler les change-
ments entrepris par l’application pour restaurer l’état d’origine d’Excel.

Identification des différentes parties du


système de menus
Microsoft a développé un modèle d’objet particulièrement souple qui combine
les menus, les boutons de commandes, les zones de listes déroulantes et les
menus contextuels en un système extensible unique (voir figure 17.1). Ce sys-
tème sépare la présentation visuelle des choix de l’utilisateur de la structure hié-
rarchique sous-jacente des menus et des boutons, ce qui simplifie grandement le
processus de développement.

393
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Figure 17-1. Le jeu d’objets CommandBar permet aux programmeurs VBA


d’intégrer facilement leurs applications dans Excel.

Collection CommandBars
La collection CommandBars contient toutes les barres de commandes définies
dans Excel. Pour l’essentiel, la collection CommandBars ressemble à toute autre
Chapitre 17

collection avec ses propriétés et ses méthodes comme Item, Count et Add. Elle
possède cependant quelques propriétés qui déterminent le fonctionnement des
barres de commandes, comme l’activation et la désactivation de certaines fonc-
tionnalités (menus adaptables, personnalisation des menus et animation des
menus).

394
Partie 5 : Manipulation des objets Excel

Barres de commandes
Le tableau 17.1 présente une liste des principales propriétés et méthodes de la
collection CommandBars.
Tableau 17-1. Principales propriétés et méthodes de la collection
CommandBars
Propriété/Méthode Description
AdaptiveMenus Propriété : si elle est positionnée sur True, cette propriété
signifie que les menus adaptables sont utilisés dans Excel.
Add(Name, Position, Méthode : crée une nouvelle barre de commandes et l’ajoute
MenuBar, Temporary) à la collection CommandBars. Name représente le nom de la
nouvelle barre de commandes, Position spécifie
l’emplacement de la barre, MenuBar, s’il est positionné sur
True, signifie que la barre de commandes remplace la barre
de menus actuellement active. Temporary, si True, signifie que
la barre de commandes est automatiquement supprimée à la
fermeture d’Excel.
Count Propriété (lecture seule) : retourne le nombre d’éléments
dans la collection CommandBars.
DisableCustomize Propriété : sur True, cette propriété signifie que les barres de
commandes ne peuvent pas être personnalisées par
l’utilisateur.
FindControl(Type, Id, Tag, Méthode : retourne une référence à l’objet
Visible, Recursive) CommandBarControl qui correspond à un critère défini. Type
spécifie le type de contrôle en se servant de l’énumération
MsoControlType. Id désigne le nom du contrôle. Tag recherche
les correspondances par le biais de la propriété Tag. Visible,
s’il est positionné sur True, limite la recherche aux contrôles
visibles. Si Recursive est True, la recherche s’effectue dans
l’objet CommandBar en cours et toutes ses sous-barres
d’outils contextuelles.
Item(Index) Propriété : retourne l’objet barre de commandes spécifié par
Index. Chapitre 17

LargeButtons Propriété : si elle est True, les boutons affichés dans la barre
d'outils sont agrandis.
MenuAnimationStyle Propriété : spécifie l’animation de la barre de commandes.
Voici les constantes de msoMenuAnimation :
msoMenuAnimationNone, msnMenuAnimationRandom,
msoMenuAnimationSlide ou msoMenuAnimationUnfold.

La méthode Add crée un objet barre de commandes vide associé aux propriétés
spécifiées et la méthode FindControl parcourt les barres de commandes à la
recherche d’un contrôle répondant aux critères spécifiés.

395
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Objets CommandBar
Les objets CommandBar représentent des conteneurs dans lesquels on place des
éléments de menu et des icônes. On référence un objet CommandBar par le biais
de la collection CommandBars. Celle-ci existe pour l’objet Application, ainsi que
d’autres collections CommandBarControls qui contiennent d’autres contrôles,
comme des contrôles de menus équipés de sous-menus. Le tableau 17.2 liste les
principales propriétés et méthodes de l’objet CommandBar.
Tableau 17-2. Principales propriétés et méthodes
de l’objet CommandBar
Propriété/Méthode Description
AdaptiveMenus Propriété : si elle est positionnée sur True, cette propriété
signifie que les menus adaptables sont utilisés avec cette barre
de commandes.
BuiltIn Propriété (lecture seule) : retourne True si la barre de
commandes fait partie d’Excel.
Controls Propriété (lecture seule) : retourne une référence d’objet à une
collection CommandBarControls qui contient tous les contrôles
de la barre de commandes.
Delete Méthode : supprime cette barre de commandes de la collection
CommandBars.
Enabled Propriété : positionnée sur True, elle signifie que l’objet
CommandBar est affiché dans la liste des barres de
commandes disponibles.
FindControl(Type, Id, Tag, Méthode : retourne une référence à l’objet CommandBarControl
Visible, Recursive) qui correspond à un critère défini. Type spécifie le type de
contrôle en se servant de l’énumération MsoControlType (voir
tableau 17.4 pour une liste complète de l’énumération). Id
désigne le nom du contrôle. Tag recherche les correspondances
par le biais de la propriété Tag. Visible, si True, limite la
recherche aux contrôles visibles. Recursive, si True, recherche
Chapitre 17

dans l’objet CommandBar actuel et dans toutes ses sous-


barres d’outils contextuelles.
Height Propriété : contient la hauteur de la barre de commandes en
pixels.
Index Propriété (lecture seule) : retourne la position relative de la
barre de commandes dans la collection CommandBars.
Left Propriété : contient la distance entre le bord gauche de l’écran
et la barre de commandes en pixels.
Name Propriété : nom de la barre de commandes.

396
Partie 5 : Manipulation des objets Excel

Barres de commandes

Tableau 17-2. Principales propriétés et méthodes


de l’objet CommandBar (Suite)
Propriété/Méthode Description
Position Propriété : contient la position de la barre de commandes. Les
valeurs sont les suivantes : msoBarBottom, msoBarFloating,
msoBarLeft, msoBarMenuBar, msoBarPopup, msoBarRight ou
msoBarTop.
RowIndex Propriété : contient la position relative d’une barre de
commandes dans une zone d’ancrage.
ShowPopup(x, y) Méthode : affiche la barre de commandes spécifiée sous la
forme d’un menu contextuel selon les coordonnées indiquées.
Si on omet x et y, les coordonnées utilisées sont celles du
pointeur.
Top Propriété : contient la distance entre le bord supérieur de la
barre de commandes et celui de l’écran.
Type Propriété (lecture seule) : indique le type de la barre de
commandes : msoBarTypeMenuBar signifie que la barre
contient des boutons de menu, msoBarTypeNormal signifie que
la barre contient des icônes et msoBarTypePopup signifie que la
barre est un menu contextuel.
Visible Propriété : True lorsque la barre de commandes est affichée à
l’écran. Rappelez-vous que la propriété Enabled doit être True
avant que vous puissiez positionner cette propriété sur True.
Width Propriété : contient la largeur de la barre de commandes en
pixels.

Chaque objet CommandBar représente une collection d’éléments de menu et


d’icônes de barre d’outils que l’on peut afficher à l’écran. La propriété Type iden-
tifie le type exact. La collection Controls contient le jeu d’objets contrôle présents
dans la barre de commandes.
Les propriétés Enable et Visible déterminent si l’utilisateur voit la barre de com-
Chapitre 17

mandes et s’il peut l’utiliser. Si on clique droit alors que le pointeur de la souris
survole une quelconque barre d’outils, une liste des barres de commandes s’affi-
che. Pour que votre barre de commandes soit présente dans cette liste, elle doit
être activée. Si la propriété Visible est True, le nom de la barre de commandes est
précédé d’une coche dans le menu contextuel, indiquant également qu’elle est
visible.
Pour déterminer si une barre de commandes est incluse d’origine dans Excel,
vérifiez si la propriété BuiltIn est True.
La méthode FindControl localise un contrôle spécifique en fonction des certaines
des valeurs de propriété du contrôle. Cette fonction est particulièrement intéres-
sante si l’utilisateur a déplacé le contrôle depuis son emplacement d’origine vers
un objet CommandBar différent.

397
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Lister les objets CommandBar


Excel détient une collection importante de barres de commandes prédéfinies,
que vous pouvez lister avec la routine suivante (voir figure 17.2). Cette routine
commence par activer la feuille Liste Barres de commandes puis elle utilise une
boucle For Each pour parcourir la collection CommandBars (vous pouvez la
remplacer par « Feuil3 » ou n’importe quel nom de feuille existante). Avec l’objet
CommandBar de l’instruction For Each, les propriétés Index, Enabled, Visible,
Type et Name sont copiées dans la feuille de calcul en commençant à la ligne 4.

Sub ListCommandBars()
Dim c As CommandBar
Dim i As Long

Sheets.Item("Liste Barres de commandes").Activate

i = 3
For Each c In Application.CommandBars
i = i + 1
ActiveSheet.Cells(i, 1) = c.Index
ActiveSheet.Cells(i, 2) = c.Enabled
ActiveSheet.Cells(i, 3) = c.Visible
ActiveSheet.Cells(i, 4) = c.Type
ActiveSheet.Cells(i, 5) = c.Name

Next c
End Sub
Chapitre 17

Figure 17-2. Les propriétés Index, Enabled, Visible, Type et Name de chaque
objet CommandBar sont copiées dans une feuille de calcul Excel.

398
Partie 5 : Manipulation des objets Excel

Barres de commandes

Ajouter une barre de commandes flottante


Pour ajouter une barre de commandes flottante (voir figure 17.3) dans Excel,
servez-vous de la routine suivante. Notez que la méthode Add utilise le nom
Excel2k3 VBA, qui contient des espaces. La valeur msoBarFloating spécifie que la
barre ne doit pas être ancrée avec les autres barres de commandes, mais affichée
en tant que fenêtre séparée que l’utilisateur peut déplacer.

Sub AddFloatingCommandBar()
Dim c As CommandBar

Set c = Application.CommandBars.Add("Excel2k3 VBA", _


msoBarFloating, False, True)
c.Enabled = True
c.Visible = True
End Sub

Chapitre 17

Figure 17-3. Une barre de commandes flottante n’est pas ancrée avec les
autres barres.

En positionnant le troisième paramètre de la méthode Add sur False, on indique


simplement que la barre de commandes est ajoutée à la collection. Avec la valeur
True, cette barre remplace la barre de menus standard de l’application Excel.
Le dernier paramètre de la méthode Add est positionné sur True pour indiquer
que cette barre de commandes est temporaire et qu’elle sera automatiquement
supprimée à la fermeture d’Excel.
Par défaut, la barre de commandes n’est ni activée ni visible. Ainsi, pour l’affi-
cher, vous devez positionner ses propriétés Enabled et Visible sur True. Vous

399
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


devez, en outre, suivre cet ordre, puisqu’il faut activer la barre avant de la rendre
visible.

Remarque Vous pouvez également spécifier que la barre de commandes est


un menu contextuel en spécifiant msoBarPopup comme deuxième paramètre
de la méthode Add.

Supprimer une barre de commandes


Pour supprimer une barre de commandes, il suffit de la localiser par le biais de
son nom et d’appeler la méthode Delete :

Sub SupprimerBarre()
Application.CommandBars("Excel2k3 VBA").Delete
End Sub

Astuce Faites le ménage avant de quitter


Lorsque vous construisez une macro complémentaire qui contient ses propres
barres de commandes, assurez-vous de les supprimer lors de la suppression
de la macro. Par précaution, indiquez que la barre de commandes est tempo-
raire de sorte qu’elle soit supprimée à la fermeture d’Excel. Toutefois, si vous
le faites, vérifiez que la barre de commandes n’existe pas lorsque la macro
démarre puis ajoutez-la explicitement si elle manque.

Contrôles des barres de commandes


Une barre de commandes peut accueillir un grand nombre de contrôles. Tous ces
contrôles possèdent un jeu de propriétés et de méthodes commun, que l’on
trouve dans l’objet CommandBarControl. Outre ce dernier, il existe trois autres
types d’objets contrôle : CommandBarButton, CommandBarComboBox et Com-
mandBarPopup.

Collection CommandBarControls
Chapitre 17

La collection CommandBarControls contient le jeu de contrôles de barre de com-


mandes affiché dans la barre. Contrairement à la collection CommandBars, qui
possède un certain nombre de propriétés spéciales qui dictent le fonctionnement
des barres de commandes au sein d’Excel, la collection CommandBarControls est
une collection relativement simple (voir tableau 17.3).

400
Partie 5 : Manipulation des objets Excel

Barres de commandes

Tableau 17-3. Principales propriétés et méthodes de la collection


CommandBarControls
Propriété/Méthode Description
Add(Type, Id, Parameter, Méthode : crée une nouvelle barre de commandes et l’ajoute à la
Before, Temporary) collection CommandBarControls. Type spécifie le type général de
contrôle à ajouter et peut prendre l’une des valeurs suivantes :
msoControlButton, msoControlEdit, msoControlDropDown,
msoControlComboBox et msoControlPopup. Id est une valeur
entière qui désigne un contrôle prédéfini. Une valeur de 1 ou
l’omission de ce paramètre ajoute un contrôle personnalisé.
Parameter contient des informations définies par le programmeur
que la routine OnAction du contrôle peut exploiter pour
déterminer comment traiter cette instance du contrôle. Before
contient la position du nouveau contrôle dans la collection. S’il
est omis, le contrôle est ajouté à la fin de la collection.
Temporary, si True, signifie que le contrôle sera automatiquement
supprimé à la fermeture d’Excel.
Count Propriété (lecture seule) : retourne le nombre d’éléments dans la
collection CommandBars.
Item(Index) Propriété : retourne l’objet barre de commandes spécifié par
Index.

Bien qu’il existe nombre de types de contrôles différents (listés dans le


tableau 17.4), on peut les regrouper en quatre catégories majeures : Normal,
Bouton, Zone de liste modifiable et Menu contextuel. Les contrôles de la catégo-
rie Normal possèdent toutes les propriétés et méthodes associées à l’objet Com-
mandBarControl, alors que les catégories Bouton, Zone de liste modifiable et
Menu contextuel possèdent des propriétés et des méthodes supplémentaires.
Tableau 17-4. Types de contrôles de la barre de commandes
Constante Description
msoControlActiveX Normal
Chapitre 17

msoControlAutoCompleteCombo Normal
msoControlButton Contient un unique élément de menu, un bouton
d’icône, un élément de menu équipé d’une icône ou une
icône avec du texte sous l’image.
msoControlButtonDropdown Zone de liste modifiable
msoControlButtonPopup Menu contextuel
msoControlComboBox Zone de liste modifiable
msoControlCustom Bouton
msoControlDropdown Zone de liste modifiable
msoControlEdit Zone de liste modifiable

401
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 17-4. Types de contrôles de la barre de commandes (Suite)


Constante Description
msoControlExpandingGrid Normal
msoControlGauge Normal
msoControlGenericDropdown Normal
msoControlGraphicCombo Zone de liste modifiable
msoControlGraphicDropdown Zone de liste modifiable
msoControlGraphicPopup Menu contextuel
msoControlGrid Normal
msoControlLabel Normal
msoControlLabelEx Normal
msoControlOCXDropdown Zone de liste modifiable
msoControlPane Normal
msoControlPopup Menu contextuel
msoControlSpinner Normal
msoControlSplitButtonMRUPopup Menu contextuel
msoControlSplitButtonPopup Menu contextuel
msoControlSplitDropdown Zone de liste modifiable
msoControlSplitExpandingGrid Normal
msoControlWorkPane Normal

Objet CommandBarControl
Les objets CommandBarControl permettent à l’utilisateur d’effectuer des choix.
Ceux-ci prennent la forme de boutons de commande, de listes déroulantes, de
zones de liste modifiables et de bien d’autres éléments. Le tableau 17.5 liste les
principales propriétés et méthodes de l’objet CommandBarControl.
Tableau 17-5. Principales propriétés et méthodes de l’objet
Chapitre 17

CommandBarControl
Propriété/Méthode Description
BeginGroup Propriété : si True, elle signifie que ce contrôle marque le
début d’un groupe de contrôles sur une barre de
commandes.
BuiltIn Propriété (lecture seule) : retourne True si la barre de
commandes fait partie d’Excel.
Caption Propriété : contient le texte associé au contrôle de la barre
de commandes.

402
Partie 5 : Manipulation des objets Excel

Barres de commandes

Tableau 17-5. Principales propriétés et méthodes de l’objet


CommandBarControl (Suite)
Propriété/Méthode Description
Copy (Bar, Before) Méthode : crée une copie du contrôle de barre de
commandes spécifié dans une barre de commandes
existante. Si Bar n’est pas spécifié, le contrôle est recopié
sur sa barre d’origine. Si Before n’est pas spécifié, la copie
est placée à la fin de la barre de commandes.
Delete(temporary) Méthode : supprime cette barre de commandes de la
collection CommandBarControls associée à la barre.
Temporary, si True, signifie que le contrôle est
automatiquement supprimé à la fermeture d’Excel.
Enabled Propriété : positionnée sur False, cette propriété signifie
que le contrôle est désactivé.
Execute Méthode : exécute la procédure spécifiée dans la propriété
OnAction.
Height Propriété : contient la hauteur du contrôle de barre de
commandes en pixels.
HelpContextId Propriété : contient le numéro d’identificateur contextuel
dans l’aide de la rubrique d’aide liée au contrôle de barre
de commandes. Rappelez-vous que la propriété HelpFile
doit également être spécifiée pour permettre au sous-
système d’aide de fonctionner correctement.
HelpFile Propriété : contient le nom de fichier de la rubrique d’aide
attachée au contrôle de barre de commandes.
Id Propriété : détermine l’action prédéfinie d’un contrôle.
Rappelez-vous que Id est positionnée sur 1 pour tous les
contrôles personnalisés.
Index Propriété (lecture seule) : retourne la position relative du
contrôle de barre de commandes dans la collection
CommandBarControls. Chapitre 17

Left Propriété (lecture seule) : retourne la distance entre le bord


gauche de la zone d’ancrage et le contrôle de barre de
commandes.
Move (Bar, Before) Méthode : déplace le contrôle de barre de commandes
spécifié dans une barre de commandes existante. Si Bar
n’est pas spécifié, le contrôle est recopié sur sa barre
d’origine. Si Before n’est pas spécifié, la copie est placée à
la fin de la barre de commandes.

403
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 17-5. Principales propriétés et méthodes de l’objet


CommandBarControl (Suite)
OnAction Propriété : contient le nom d’une sous-routine qui
s’exécute lorsque l’utilisateur invoque le contrôle de barre
de commandes. Vous pouvez également désigner un
complément COM en créant une chaîne avec la syntaxe
suivante : "!<nom-complément>", où nom-complément est
le nom du composant COM à utiliser.
Parameter Propriété : contient des informations supplémentaires
utilisées par le code associé au contrôle pour modifier le
comportement par défaut du contrôle.
Priority Propriété : spécifie la priorité d’un contrôle de barre de
commandes. De sa priorité dépend le fait qu’il reste
suffisamment d’espace dans la zone d’ancrage pour
intégrer tous les contrôles ; les contrôles dont la valeur est
1 ne peuvent pas être éliminés. Les valeurs se situent
entre 0 et 7.
Tag Propriété : contient des informations définies par le
programmeur. Cette propriété peut être employée avec la
méthode CommandBar.FindControl pour localiser un
contrôle particulier.
TooltipText Propriété : contient le texte affiché si l’utilisateur survole le
contrôle avec le pointeur de la souris. Par défaut, la valeur
de la propriété Caption est affichée.
Top Propriété : contient la distance entre le bord supérieur du
contrôle de barre de commandes et celui de l’écran.
Type Propriété (lecture seule) : indique le type du contrôle de
barre de commandes.
Visible Propriété : True lorsque le contrôle de barre de commandes
est affiché à l’écran. Rappelez-vous que la propriété
Enabled doit être True avant que vous puissiez positionner
cette propriété sur True.
Chapitre 17

Width Propriété : contient la largeur du contrôle de barre de


commandes en pixels.

Lorsque l’utilisateur clique sur ou sélectionne un contrôle de barre de comman-


des, la sous-routine spécifiée dans la propriété OnAction se déclenche. Vous avez
également la possibilité d’exécuter la routine associée au contrôle de barre de
commandes avec la méthode Execute.
Les propriétés Parameter et Tag sont des zones dans lesquelles vous pouvez stoc-
ker des informations complémentaires relatives à une instance spécifique du
contrôle. La propriété Tag peut servir à localiser un contrôle spécifique en fonc-
tion de sa valeur Tag avec la méthode FindControl. Vous pouvez créer une rou-
tine OnAction commune qui effectue diverses actions en fonction de la valeur

404
Partie 5 : Manipulation des objets Excel

Barres de commandes
spécifique de la propriété Parameter de chaque contrôle.
Les méthodes Copy et Move permettre de déplacer les contrôles d’une barre de
commandes à une autre et la méthode Delete supprime le contrôle de la barre de
commandes et de l’application.

Contrôles de boutons
Il n’existe qu’un type de contrôle de bouton : msoControlButton. Cette objet sert
dans les cas où vous voulez exécuter une sous-routine en réponse à une action de
l’utilisateur : appuyer sur un bouton ou sélectionner un élément de menu. Le
tableau 17.6 liste des propriétés et méthodes uniques de l’objet CommandBar-
Button comparé à l’objet CommandBarControl.
Tableau 17-6. Propriétés et méthodes uniques de l’objet
CommandBarButton
Propriété/
Méthode Description
BuiltInFace Propriété : True si l’image du bouton de barre de commandes est son
image prédéfinie. Affecter la valeur True à cette propriété rétablit
l’image prédéfinie.
CopyFace Méthode : copie l’image du bouton dans le Presse-papiers.
FaceId Propriété : contient le numéro d’identification de l’image affichée sur
le bouton. La valeur de la propriété FaceId pour un bouton de barre de
commandes dont l’image est personnalisée est égale à 0 (zéro).
PasteFace Méthode : colle l’image du Presse-papiers vers le bouton de barre de
commandes.
ShortcutText Propriété : contient le texte de touche de raccourci affiché en regard
du contrôle bouton. Rappelez-vous que cette propriété fonctionne
uniquement pour les boutons de barre de commandes possédant une
macro OnAction valide.
State Propriété : indique l’état visuel du bouton. Voici les constantes de
msoButtonState : msoButtonDown, msoButtonMixed ou msoButtonUp.
Chapitre 17

Style Propriété : contient la manière dont le bouton est affiché :


msoButtonAutomatic choisit le style en fonction des valeurs définies
dans les propriétés, msoButtonCaption affiche la légende comme
texte du bouton, msoButtonIcon affiche l’icône identifiée par FaceId
sur le bouton, msoButtonIconAndCaption affiche la légende à droite de
l’icône, msoButtonIconAndCaptionBelow affiche la légende sous
l’icône, msoButtonIconAndWrapCaption affiche la légende complète à
droite du bouton même si elle doit envelopper le texte pour s’adapter,
msoButtonIconAndWrapCaptionBelow affiche le texte sous l’icône et
l’enveloppe si nécessaire et msoButtonWrapCaption affiche le texte
de la légende complet, enveloppant le texte si nécessaire.

405
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


La propriété Style impose la manière de dessiner le contrôle à l’écran. Vous pou-
vez choisir d’afficher le texte de la propriété Caption et/ou de l’icône spécifiée par
la propriété FaceId. Si vous optez pour les deux, vous pouvez positionner la
légende à droite de l’icône ou en dessous.
Pour un bouton personnalisé, vous avez le choix entre les trois états (up, down et
mixed) de la propriété State. Le bouton peut ainsi indiquer l’état du code, à l’ins-
tar du bouton Gras. Les états up et down désignent un bouton enfoncé ou non.
L’état mixed est un plus complexe : il reflète une situation dans laquelle le bouton
est à la fois enfoncé et soulevé, ce qui se produit par exemple lorsque l’on sélec-
tionne une plage de cellules contenant du texte à la fois normal et gras.

Créer des barres d'outils


Une barre d’outils constitue une collection de boutons organisés horizontale-
ment. Vous pouvez mélanger différents types de boutons sur une même barre
d’outils (voir figure 17.4).
Chapitre 17

Figure 17-4. Vous pouvez combiner plusieurs types de boutons sur une même
barre de commandes pour créer une barre d'outils.

La routine suivante a servi à créer la barre d’outils de la figure 17.4. Le code com-
mence par localiser la barre de commandes qui doit accueillir les contrôles en
utilisant la collection CommandBars et en spécifiant le nom souhaité. La routine
utilise ensuite la méthode Add de la collection Controls pour créer un nouveau
bouton. La propriété Style du bouton est positionnée sur le style de bouton
approprié, alors que la propriété Caption contient le texte qui doit ou non s’affi-
cher selon le type du bouton.

406
Partie 5 : Manipulation des objets Excel

Barres de commandes
Sub CreateBar()
Dim c As CommandBar
Dim cb As CommandBarButton

Set c = Application.CommandBars("Excel2k3 VBA")

Set cb = c.Controls.Add(msoControlButton, 2)
cb.Style = msoButtonCaption
cb.Caption = "légende de bouton avec un texte long"

Set cb = c.Controls.Add(msoControlButton, 3)
cb.Style = msoButtonIcon
cb.Caption = "bouton icône"

Set cb = c.Controls.Add(msoControlButton, 4)
cb.Style = msoButtonIconAndCaption
cb.Caption = "bouton icône et texte"
End Sub

Contrôles de zone de liste modifiable


Il existe de nombreuses variantes du contrôle ComboxBox (voir tableau 17.4).
Elles possèdent néanmoins toutes un point commun : l’utilisateur peut faire un
choix parmi une liste d’éléments. Toutes les propriétés et méthodes sont dédiées
à la gestion de la liste d’éléments, excepté une (voir tableau 17.7).
Tableau 17-7. Propriétés et méthodes uniques de l’objet
CommandBarComboBox
Propriété/Méthode Description
AddItem(Text, Index) Méthode : ajoute à la liste la valeur qui se trouve dans Text à
la position spécifiée par Index. Si on omet Index, l’élément
est ajouté à la fin de la liste.
Clear Méthode : supprime tous les éléments de la liste associés à
la zone de liste modifiable.
DropDownLines Propriété : contient le nombre de lignes affichées dans une
liste déroulante ou une zone de liste modifiable.
Chapitre 17

List(Index) Propriété : retourne une valeur de chaîne représentant


l’élément se trouvant à la position spécifié par Index.
Rappelez-vous que le premier élément de la liste prend la
valeur Index de 1.
ListCount Propriété (lecture seule) : retourne le nombre d’éléments
dans la liste.
ListHeaderCount Propriété : contient le nombre d’éléments de liste qui
s’affichent au dessus de la ligne de séparation.
ListIndex Propriété : contient le numéro de l’élément actuellement
sélectionné dans la liste d’un contrôle de zone de liste
modifiable. Une valeur de zéro signifie que rien n’est
sélectionné.

407
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Tableau 17-7. Propriétés et méthodes uniques de l’objet


CommandBarComboBox (Suite)
Propriété/Méthode Description
RemoveItem(Index) Méthode : supprime l’élément de la liste qui se trouve à la
position spécifiée par Index.
Style Propriété : spécifie l’apparence du contrôle : msoComboLabel
ou msoComboNormal.

La liste des éléments qui s’affichent dans une zone de liste modifiable est un
tableau de chaînes. Vous trouvez ou changer un élément par le biais de la pro-
priété List en spécifiant la position relative de l’élément dans la liste. La propriété
ListIndex pointe vers l’élément actuellement sélectionné dans la liste, alors que la
propriété ListCount indique le nombre total d’éléments dans la liste.
On ajoute des éléments à la liste avec la méthode Add. Vous pouvez en option
spécifier la position relative de l’élément à ajouter. Tous les éléments, en com-
mençant par celui se trouvant à l’emplacement spécifié, seront déplacés d’une
position vers la fin de la liste. Pour supprimer des éléments de la liste, servez-
vous de la méthode RemoveItem et spécifiez la position relative de l’élément à
supprimer. Tous les éléments suivants seront déplacés d’une position vers le
début de la liste.

Utiliser une zone de liste modifiable


Les zones de liste modifiables et les listes déroulantes permettent à l’utilisateur de
faire un choix rapide dans une liste de valeurs. La routine suivante crée un nou-
veau contrôle de liste déroulante contenant trois éléments. La propriété Parame-
ter sert à identifier ce contrôle en particulier et la propriété OnAction spécifie une
macro traitée lorsqu’une valeur de la liste déroulante est sélectionnée.

Sub AddCommandCombo()

Dim c As CommandBar
Dim cb As CommandBarComboBox
Chapitre 17

Set c = Application.CommandBars("Excel2k3 VBA")

Set cb = c.Controls.Add(msoControlDropdown)
cb.Style = msoComboNormal
cb.AddItem "Élément 1"
cb.AddItem "Élément 2"
cb.AddItem "Élément 3"
cb.Parameter = "Liste déroulante #1"
cb.OnAction = "ThisWorkbook.TestControl"

End Sub

La routine OnAction de cette procédure est appelée lorsque l’utilisateur sélec-


tionne un élément de la liste déroulante. L’instruction With simplifie la référence

408
Partie 5 : Manipulation des objets Excel

Barres de commandes
au contrôle actif qui déclenche la macro, auquel on se réfère par la propriété
CommandBars.ActionControl. Vous devez exécuter la routine AddFloatingCom-
mandBar et la routine AddCommandCombo pour tester l’événement OnAction.

Public Sub TestControl()

With Application.CommandBars.ActionControl
If .Parameter = "Liste déroulante #1" Then
MsgBox .List(.ListIndex)

End If

End With

End Sub

Au sein de la routine, on examine la propriété Parameter associée au contrôle


pour vérifier s’il s’agit de la liste déroulante créée plus tôt. Si tel est le cas, l’index
de l’élément sélectionné sert à extraire l’élément approprié de la liste.

Contrôles de menu contextuel


Les contrôles de menu contextuel servent à afficher des informations hiérarchi-
ques, comme un menu déroulant ou une liste d’icônes. Contrairement aux
autres contrôles de barre de commandes d’Excel, les contrôles de menu contex-
tuel comportent deux propriétés uniques (voir tableau 17.8).
Tableau 17-8. Propriétés uniques de l’objet CommandBarPopup
Propriété/Méthode Description
CommandBar Propriété (lecture seule) : retourne une référence à un objet
CommandBar qui représente le menu affiché par le menu
contextuel.
Controls Propriété (lecture seule) : retourne une référence à un objet
CommandBarControls contenant les contrôles d’une barre de
commandes pour un menu contextuel. Chapitre 17

Afficher un menu contextuel


L’affichage des menus contextuels constitue une fonctionnalité intéressante de
nombreux programmes VBA. La routine suivante montre comment créer et affi-
cher un menu contextuel. Elle commence par désactiver la récupération des
erreurs en utilisant une instruction On Error Resume Next. Elle essaie ensuite de
récupérer une référence d’objet à la barre de commandes Excel2k2 VBA Popup.
Si l’objet barre de commandes n’existe pas, la variable c est positionnée sur
Nothing. Sans l’instruction On Error, toute tentative de référencer une barre de
commandes inexistante déclenche une erreur d’exécution.

Sub ShowCommandPopup()

409
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Dim c As CommandBar
Dim cb As CommandBarButton
Dim cp As CommandBarPopup

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Popup")
If c Is Nothing Then
Set c = Application.CommandBars.Add("Excel2k3 VBA Popup", _
msoBarPopup, False, True)
c.Enabled = True
c.Visible = True

Set cb = c.Controls.Add(msoControlButton)
cb.Style = msoButtonIconAndCaption
cb.Caption = "Bouton de menu #1"
cb.Parameter = "Menu #1"
cb.OnAction = "ThisWorkbook.TestPopup"

Set cb = c.Controls.Add(msoControlButton)
cb.Style = msoButtonIconAndCaption
cb.Caption = "Bouton de menu #2"
cb.Parameter = "Menu #2"
cb.OnAction = "ThisWorkbook.TestPopup"

Set cp = c.Controls.Add(msoControlPopup)
cb.Parameter = "Menu #1"
cp.Caption = "Choix du sous-menu"

Set cb = cp.Controls.Add(msoControlButton)
cb.Style = msoButtonIconAndCaption
cb.Caption = "Bouton du sous-menu #1"
cb.Parameter = "Sous-menu #1"
cb.OnAction = "ThisWorkbook.TestPopup"

Set cb = cp.Controls.Add(msoControlButton)
cb.Style = msoButtonIconAndCaption
cb.Caption = "Bouton du sous-menu #2"
cb.Parameter = "Sous-menu #2"
cb.OnAction = "ThisWorkbook.TestPopup"
Chapitre 17

End If

c.ShowPopup

End Sub

Pour créer un menu contextuel, vous devez créer un nouvel objet du type mso-
BarPopup. Vous ajoutez ensuite les contrôles individuels au menu contextuel.
Il suffit d’ajouter des objets msoControlButton pour créer la traditionnelle liste
des éléments de menu. Pour présenter des éléments de sous-menu, vous devez
ajouter un élément msoControlPopup. Celui-ci insère un élément équipé d’une
flèche qui indique la présence d’un sous-menu. Il agit également comme conte-
neur pour les éléments du sous-menu, que l’on peut joindre avec la même tech-
nique que celle employée pour la barre contextuelle.

410
Partie 5 : Manipulation des objets Excel

Barres de commandes
Pour finir, une fois que la barre de commandes est initialisée, on l’affiche avec la
méthode ShowPopup. Vous devez exécuter cette méthode chaque fois que vous
voulez afficher le menu contextuel. En effet, une fois que l’utilisateur a sélec-
tionné un élément du menu, celui-ci disparaît. On affiche généralement le menu
contextuel en réponse à une action de l’utilisateur comme l’exécution d’une
macro, la gestion d’une condition particulière avec une application Excel plus
importante ou la réponse à une séquence.

Ajouter des éléments à un menu existant


Pour intégrer votre application dans la structure Excel classique, ajoutez vos pro-
pres éléments de menu aux éléments de menus Excel standard. Par exemple, la
routine suivante ajoute un élément de menu À propos pour une application VBA
personnalisée :

Sub AddMenuItem()

Dim c As CommandBar
Dim cb As CommandBarButton
Dim cp As CommandBarPopup

On Error Resume Next


Set c = Application.CommandBars("Worksheet Menu Bar")
If Not c Is Nothing Then
Set cp = c.Controls("&Help")

If Not cp Is Nothing Then


Set cb = cp.Controls.Add(msoControlButton)
cb.Style = msoButtonCaption
cb.Caption = "À propos de Mon application VBA"
cb.OnAction = "ThisWorkbook.TestMenu"

End If

End If
End Sub

La première étape consiste à localiser la barre de commandes dans laquelle vous


Chapitre 17

voulez ajouter le nouvel élément de menu. Dans la mesure où tous les éléments
de menu d’Excel se trouvent dans la barre de menus Worksheet, la manière la plus
simple de commencer est de localiser cette barre de commandes. Dans cette
barre, on localise ensuite le contrôle contextuel Help.
Pour finir, par le biais de la collection Controls du contrôle contextuel Help, on
ajoute un nouveau bouton de contrôle à la fin de la liste du message À propos de
votre application. La propriété OnAction spécifie la routine appelée pour afficher
la message.
Dans ce chapitre, vous avez appris que les barres de commandes combinent les
fonctions des éléments de menu et les barres d’outils en un unique système uni-
fié. Vous avez étudié l’objet CommandBar (qui peut représenter un menu ou une

411
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


barre d’outils) et la collection CommandBars, qui contient les références à tous
les objets CommandBar du classeur. Vous avez ensuite découvert comment ajou-
ter différents contrôles de barre de commandes, comme des menus contextuels,
des boutons et des zones de liste modifiables à vos barres de commandes. Pour
finir, nous avons vu comment définir une routine qui répond à un événement
déclenché par un contrôle de barre de commandes, permettant à votre applica-
tion d’effectuer une tâche associée au contrôle. Ces fonctionnalités vous permet-
tent de créer des macros et des macros complémentaires qui s’intègrent
parfaitement l’application Excel.
Chapitre 17

412
Partie 5 : Manipulation des objets Excel

Chapitre 18
Personnalisation des
boîtes de dialogue
Affichage des boîtes de dialogue Planification avec des boîtes
existantes. . . . . . . . . . . . . . . . . . 414 de dialogue . . . . . . . . . . . . . . . . 424
Modification des boîtes
de dialogue existantes . . . . . . . . 418

Inutile d’inventer des fonctionnalités existantes. Microsoft Excel permet d’accé-


der à la majorité des boîtes de dialogue intégrées au sein d’Excel et d’autres appli-
cations des Éditions Microsoft Office 2003.
Vous pouvez, bien entendu, modifier une feuille de calcul par le biais des pro-
priétés et des méthodes proposées par le code Visual Basic pour Applications
(VBA). Toutefois, si l’utilisateur doit pouvoir sélectionner des variables pendant
l’exécution d’une macro, de quelles options disposez-vous ? La première option
est de créer une feuille UserForm, comme nous le verrons au chapitre 19, dans
laquelle les options disponibles sont listées : il suffit à l’utilisateur de sélectionner
les paramètres appropriés. À partir des sélections de l’utilisateur, vous appliquez
ses choix aux plages appropriées du classeur. Bien sûr, certains d’entre nous se
plaisent à créer leurs propres feuilles et à les utiliser dès que possible. Toutefois,
avant d’obtenir les résultats souhaités lorsque l’utilisateur exécute la macro, vous
devez vous entraîner. Les feuilles se créent à partir de rien et vous obligent à anti-
ciper et à programmer chaque option que vous voulez proposer aux utilisateurs.
La deuxième option consiste à communiquer des informations à l’utilisateur par
le biais des boîtes de dialogue. Par exemple, vous pouvez ouvrir la boîte de dialo-
gue Bordures et appliquer les sélections de l’utilisateur aux plages spécifiées dans
le code. Vous pouvez suivre le même schéma avec n’importe quelle boîte de dia-
logue présentée à l’utilisateur. Si les options que l’utilisateur a sélectionnées
s’appliquent à un classeur vide, vous pouvez extraire leurs propriétés avec du
code VBA et les appliquer aux plages appropriées.
En général, lorsque l’intervention de l’utilisateur est nécessaire, votre meilleure
option est de proposer une interface que l’utilisateur connaît déjà. Vous consta-
terez que le temps de formation est réduit lorsqu’on fait appel aux boîtes de dia-
logue intégrées.
L’exemple de macro employé dans ce chapitre est spécifique aux changements de
mise en forme. Elle fonctionne cependant avec d’autres modifications de varia-
bles. Si vous voulez, par exemple, proposer à l’utilisateur de localiser le dossier

413
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien


dans lequel le classeur doit être enregistré, vous pouvez afficher la boîte de dialo-
gue intégrée Enregistrer sous, avec le code suivant :

Sub ShowSaveAs()
Application.Dialogs(xlDialogSaveAs).Show
End Sub

Dans ce chapitre, vous allez apprendre à afficher les boîtes de dialogue intégrées
et à les manipuler en leur passant des arguments et en définissant leurs proprié-
tés.

Affichage des boîtes de dialogue existantes


Les procédures écrites en VBA peuvent exécuter des commandes de menu Excel
et, si ces commandes mènent à une boîte de dialogue, vous pouvez lui appliquer
des paramètres via du code. Pour accéder aux boîtes de dialogue d’Excel, vous
pouvez également exploiter l’objet Dialog. Les boîtes de dialogue présentent un
intérêt particulier : vous pouvez exécuter leurs routines en arrière-plan. Inutile
d’afficher la boîte de dialogue pour appliquer les paramètres.
La collection Dialogs représente la liste des boîtes de dialogue intégrées dans
Excel. La constante xlBuiltinDialog sert à accéder à un objet Dialog individuel de
la collection Dialogs. Pour identifier la boîte de dialogue à ouvrir, servez-vous de
la syntaxe Dialogs(xlDialogObjectName) ou xlDialogObjectName représente la
constante intégrée qui l’identifie. L’exemple suivant affiche la boîte de dialogue
Ouvrir :

Sub ShowOpen()
Result = Application.Dialogs(xlDialogOpen).Show
End Sub

La variable Result permet de déterminer si l’utilisateur a cliqué sur le bouton OK


ou si l’action a été annulée parce que l’utilisateur a appuyé sur la touche ÉCHAP
ou cliqué sur le bouton Annuler. Vous pouvez ensuite vous servir de la valeur
assignée à la variable pour spécifier l’action suivante basée sur l’entrée de l’utili-
sateur.
La bibliothèque Excel Object Library contient les constantes intrinsèques de la
plupart des boîtes de dialogue intégrées. Chaque constante est formée à partir du
préfixe xlDialog suivi du nom de la boîte de dialogue. Par exemple, la constante
de la boîte de dialogue Validation est xlDialogDataValidation et celle de la boîte
de dialogue Définir un nom est xlDialogDefineName. Ces constantes constituent
des exemples du type de membre que l’on trouve dans la propriété xlBuiltinDia-
log.
Chapitre 18

Pour plus d’informations sur les constantes xlDialog, et une liste complète, tapez argu-
ments boîte dialogue dans la zone Poser une question de VBA et sélectionnez l’entrée
Listes d’arguments de boîte de dialogue intégrée.

414
Partie 5 : Manipulation des objets Excel

Personnalisation des boîtes de dialogue


Un objet Dialog représente une boîte de dialogue Excel intégrée. Chaque objet
Dialog possède des propriétés personnalisées qui dépendent du type de l’objet
Dialog. Outre les attributs de collection classiques, la collection Dialogs possède
également une propriété Count qui retourne le nombre d’objets Dialog de la col-
lection.
Par exemple, l’instruction VBA suivante revient à cliquer sur Édition, Atteindre
et à spécifier la plage A1:C3 avant de cliquer sur OK. Toutefois, lorsque vous uti-
lisez le code VBA, vous n’êtes pas obligé d’afficher la boîte de dialogue Atteindre.
Le résultat pour l’utilisateur est une action sans coupure.

Sub GotoRange()
Application.Goto Reference:=Range("A1:C3")
End Sub

Dans certains cas, vous devrez afficher la boîte de dialogue intégrée Excel pour
permettre à l’utilisateur d’effectuer certains choix. Pour ce faire, vous disposez de
deux possibilités :
● Accéder à la collection Dialogs de l’objet Application.
● Exécuter directement un élément de menu.

La collection Dialogs de l’objet Application représente la majorité des boîtes de


dialogue intégrées d’Excel. Elle dispose de constantes prédéfinies qui simplifient
la spécification de la boîte de dialogue à employer. Par exemple, la boîte de dia-
logue Atteindre d’Excel est représentée par la constante xlDialogFormulaGoto.
Servez-vous de la méthode Show pour afficher la boîte de dialogue. Voici un
exemple qui affiche la boîte de dialogue Atteindre avec le résultat de la
figure 18.1.

Sub ShowGoto()
Application.Dialogs(xlDialogFormulaGoto).Show
End Sub

Figure 18-1. La boîte de dialogue Atteindre apparaît lorsqu’on l’appelle avec la


Chapitre 18

constante intrinsèque xlDialogFormulaGoto.

Lorsque la boîte de dialogue Atteindre s’affiche, l’utilisateur peut spécifier une


plage de cellules ou saisir une adresse de cellule à atteindre. La boîte de dialogue
qui s’affiche avec la constante xlDialogFormulaGoto correspond à celle que vous
obtenez en choisissez la commande Atteindre dans le menu Édition.

415
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien


Vous pouvez également écrire du code qui utilise une variable pour déterminer
comment l’utilisateur ferme la boîte de dialogue. Dans l’instruction suivante, la
variable Result est True si l’utilisateur clique sur OK et False s’il clique sur Annu-
ler ou appuie sur la touche ÉCHAP.

Sub ShowGoto2()
Result = Application.Dialogs(xlDialogFormulaGoto).Show
End Sub

La variable Result ne conserve pas la plage spécifiée dans la boîte de dialogue


Atteindre, mais contient la valeur booléenne qui reflète le choix de fermeture de
la boîte de dialogue.
Les boîtes de dialogue intégrées ne sont guère documentées. L’aide en ligne reste
très fragmentaire et les fichiers ne mentionnent pas le fait qu’afficher l’une des
boîtes de dialogue d’Excel avec du code VBA ne fonctionne pas toujours exacte-
ment comme passer par la commande de menu correspondante. En consé-
quence, il est préférable d’effectuer quelques tests auparavant pour s’assurer que
le code réagit tel que prévu.
Dans le cas de la boîte de dialogue Atteindre, vous noterez que le bouton Cellules
est grisé si on se sert d’une instruction VBA pour l’afficher. Ce bouton n’est pas
grisé si on passe par les commandes de menu. Pour afficher la boîte de dialogue
Sélectionner les cellules avec du code VBA, vous devez utiliser la constante
intrinsèque de cette boîte de dialogue : xlDialogSelectSpecial. La figure 18.2 pré-
sente le résultat.

Sub ShowGotoSpecial()
Application.Dialogs(xlDialogSelectSpecial).Show
End Sub

Figure 18-2. Pour afficher la boîte de dialogue Sélectionner les cellules, vous
devez utiliser la constante intrinsèque de cette boîte de dialogue.
Chapitre 18

Les boîtes de dialogue intégrées présentent cependant un autre problème : cer-


taines boîtes de dialogue équipées d’onglets ne s’affichent pas de la même
manière qu’avec les commandes de menu. Par exemple, il est impossible d’affi-
cher la boîte de dialogue Format de cellule avec ses onglets. On ne peut afficher

416
Partie 5 : Manipulation des objets Excel

Personnalisation des boîtes de dialogue


qu’un onglet à la fois. L’instruction suivante affiche l’onglet Alignement de la
boîte de dialogue Format de cellule (voir figure 8.3).

Sub ShowAlignmentTab()
Application.Dialogs(xlDialogAlignment).Show
End Sub

Pour afficher les autres onglets de la boîte de dialogue Format de cellule, servez-
vous des constantes suivantes : xlDialogFormatNumber, xlDialogBorder, xlDialo-
gCellProtection, xlDialogPatterns ou xlDialogFontProperties. Notez qu’il n’existe
aucune logique dans le nommage de ces constantes.

Figure 18-3. Vous pouvez afficher la boîte de dialogue Format de cellule, mais
un onglet à la fois.

Au Quotidien
Variables retournées ou exécution ?

Une boîte de dialogue ouverte propose plusieurs options et son exécution


déclenche les actions attendues. Si vous cherchez uniquement à collecter des
informations comme un nom de fichier, essayez une autre méthode, comme
GetOpenFilename ou GetSaveAsFilename. Ces deux méthodes affichent leurs
boîtes de dialogue respectives (boîtes de dialogue Ouvrir et Enregistrer sous),
mais n’ouvrent pas et n’enregistrent pas les fichiers si l’utilisateur clique sur
OK. Ces méthodes retournent le nom de fichier complet comme variable que
vous pouvez exploiter ultérieurement dans le code.

L’exemple suivant utiliser les méthodes GetOpenFilename et GetSaveAsFile-


name pour retourner le nom du fichier sélectionné :
Chapitre 18

Sub GetFileName()
FullFileName = Application.GetOpenFilename("Fichiers Excel (*.xl*),
*.xl*", _
1, "Titre personnalisé", , False)

417
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien

FullFileName = Application.GetSaveAsFilename("DefaultFilename.xls", _
"Fichiers Excel (*.xl*), *.xl*, 1", "Titre personnalisé")
End Sub

Une fois le nom de fichier passé à la variable, vous pouvez l’exploiter dans la
méthode de votre choix. Il peut, par exemple, vous servir à ouvrir le fichier avec
la méthode Open.

Workbooks.Open FullFileName

Vous pouvez également enregistré le classeur sous le nouveau nom de fichier


en vous servant de la ligne de code suivante :

Workbooks.SaveAs FullFileName

Lorsque les utilisateurs ont confirmé leur choix dans la boîte de dialogue Ouvrir
ou Enregistrer sous, ils peuvent avoir modifié le dossier en cours. En effet,
l’utilisation de ces boîtes de dialogue permet aux utilisateurs de parcourir les
lecteurs de leur ordinateur pour choisir un autre dossier. Cette méthode cons-
titue la meilleure solution pour laisser aux utilisateurs le choix de la destina-
tion des fichiers.

Modification des boîtes de dialogue


existantes
Rien ne vous empêche d’utiliser une boîte de dialogue existante et d’en définir les
options par défaut. Par exemple, vous pouvez définir le répertoire par défaut
dans lequel un classeur doit être enregistré en vous servant des arguments d’une
boîte de dialogue pour modifier les sélections par défaut. La prochaine section
explique comment accéder à la collection Dialogs et passer des arguments à la
boîte de dialogue.
La plupart des boîtes de dialogue intégrées acceptent également des arguments,
qui correspondent aux contrôles de la boîte de dialogue. Par exemple, l’onglet
Protection de la boîte de dialogue Format de cellule, que l’on exécute avec la
constante xlDialogCellProtection, prend deux arguments : locked et hidden, qui
correspondent aux deux options disponibles (Verrouillée et Masquée). Pour affi-
cher la boîte de dialogue avec ces deux options cochées, utilisez l’instruction sui-
vante et positionnez les deux arguments sur True (figure 18.4).

Sub ProtectionArgs()
Application.Dialogs(xlDialogCellProtection).Show True, True
End Sub
Chapitre 18

418
Partie 5 : Manipulation des objets Excel

Personnalisation des boîtes de dialogue

Figure 18-4. Les deux cases de l’onglet Protection sont cochées par défaut par
le biais du code VBA.

Remarque Les arguments de chaque boîte de dialogue intégrée sont listés


dans l’aide en ligne. Pour localiser la rubrique d’aide, consultez la Liste d’argu-
ments de boîte de dialogue intégrée. Malheureusement, la rubrique d’aide ne
fournit aucune explication quant à l’usage de ces arguments.

Selon le fichier d’aide, la boîte de dialogue Atteindre exécutée par la constante


xlDialogFormulaGoto utilise deux arguments : reference et corner. L’argument
reference fournit une plage par défaut qui apparaît dans la zone Référence.
L’argument corner représente une valeur que vous définissez sur True ou False
pour indiquer si la cellule cible doit apparaître dans l’angle supérieur gauche de
la fenêtre. L’exemple suivant utilise ces deux arguments :

Sub GotoArguments()
Application.Dialogs(xlDialogFormulaGoto).Show Range("Z100"), True
End Sub

À mesure que vous exploiterez les boîtes de dialogue, vous découvrirez qu’il faut
quelque peu tâtonner avant de parvenir à utiliser correctement la collection Dia-
logs.

Explorer la collection Dialogs


La collection Dialogs de l’objet Application se compose de plus de 250 membres
qui représentent la plupart des boîtes de dialogue intégrées d’Excel. Chaque
objet Dialog dispose de constantes prédéfinies qui simplifient la spécification de
la boîte de dialogue à employer.
Chapitre 18

Pour obtenir la liste complète des constantes disponibles, servez-vous de l’Explo-


rateur d’objets. Pour afficher les membres de la collection Dialogs dans l’Explo-
rateur d’objets, procédez comme suit :
1 Ouvrez un module VBA.

419
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien


2 Appuyez sur F2 pour afficher l’Explorateur d’objets.
3 Tapez xlDialog dans la zone Rechercher un texte.
4 Cliquez sur le bouton Rechercher pour exécuter la recherche.
La figure 18.5 présente le résultat de la recherche.

Figure 18-5. L’Explorateur d'objets affiche les résultats de la recherche pour


les boîtes de dialogue intégrées disponibles dans Excel.

Il existe plus de 250 boîtes de dialogue que vous pouvez appeler par le biais des
constantes intrinsèques xlDialog, mais certaines sont plus utiles que d’autres. Les
trois prochains tableaux listent les boîtes de dialogue employées pour formater
les cellules, modifier les graphiques et effectuer diverses tâches pratiques.

Astuce Comparez votre travail avec l’interface


Les arguments de chaque boîte de dialogue ne sont pas toujours correctement
orthographiés dans l’aide en ligne ou toute autre littérature sur le sujet, mais
l’argument correspond souvent à une case à cocher, une option ou un autre
contrôle de la boîte de dialogue. Par exemple, la constante xlDialogFont
appelle la boîte de dialogue Polices. Pour sélectionner la police Tahoma avec
une taille de 12 par défaut, servez-vous du code :

Application.Dialogs(xlDialogFont).Show "Tahoma", 12.


Chapitre 18

Pour afficher la police par défaut, vous laissez le premier argument vide,
comme dans l’instruction Application.Dialogs(xlDialogFont).Show, 12.

420
Partie 5 : Manipulation des objets Excel

Personnalisation des boîtes de dialogue


Le tableau 18.1 liste certaines des boîtes de dialogue couramment employées
pour formater les cellules dans le classeur.
Tableau 18-1. Boîte de dialogue xlDialog couramment employées pour
formater les cellules
Constante xlDialog Description
xlDialogActiveCellFont font, font_style, size, strikethrough, superscript, subscript,
outline, shadow, underline, color, normal, background, start_char,
char_count
xlDialogAlignment horiz_align, wrap, vert_align, orientation, add_indent
xlDialogBorder outline, left, right, top, bottom, shade, outline_color, left_color,
right_color, top_color, bottom_color
xlDialogCellProtection locked, hidden
xlDialogFont name_text, size_num
xlDialogFontProperties font, font_style, size, strikethrough, superscript, subscript,
outline, shadow, underline, color, normal, background, start_char,
char_count
xlDialogFormatFont name_text, size_num, bold, italic, underline, strike, color, outline,
shadow
xlDialogPatterns apattern, afore, aback, newui

Le tableau 18.2 liste certaines des boîtes de dialogue couramment employées


pour insérer ou modifier des graphiques dans un classeur.
Tableau 18-2. Boîtes de dialogue xlDialog employées pour modifier les
graphiques
Constante xlDialog Description
xlDialogAddChartAutoformat name_text, desc_text
xlDialogAxes x_primary, y_primary, x_secondary, y_secondary
xlDialogChartAddData ref, rowcol, titles, categories, replace, series
xlDialogChartWizard long, ref, gallery_num, type_num, plot_by, categories,
ser_titles, legend, title, x_title, y_title, z_title, number_cats,
number_titles
xlDialogDataLabel show_option, auto_text, show_key
xlDialogDataSeries rowcol, type_num, date_num, step_value, stop_value, trend
xlDialogEditSeries series_num, name_ref, x_ref, y_ref, z_ref, plot_order
xlDialogFormatChart layer_num, view, overlap, angle, gap_width, gap_depth,
chart_depth, doughnut_size, axis_num, drop, hilo, up_down,
Chapitre 18

series_line, labels, vary


xlDialogFormatCharttype apply_to, group_num, dimension, type_num
xlDialogFormatLegend position_num
xlDialogGallery3dBar type_num

421
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien

Tableau 18-2. Boîtes de dialogue xlDialog employées pour modifier les


graphiques (Suite)
Constante xlDialog Description
xlDialogGallery3dColumn type_num
xlDialogGallery3dLine type_num
xlDialogGallery3dPie type_num
xlDialogGalleryDoughnut type_num, delete_overlay
xlDialogGalleryLine type_num, delete_overlay
xlDialogGalleryPie type_num, delete_overlay
xlDialogMainChartType type_num

Le tableau 18.3 présente certaines des boîtes de dialogue employées pour accéder
aux options disponibles par le biais de la structure d’Excel.
Tableau 18-3. Constantes xlDialog de la structure
des menus d’Excel
Constante xlDialog Description
xlDialogApplyNames name_array, ignore, use_rowcol, omit_col, omit_row, order_num,
append_last
xlDialogAutoCorrect correct_initial_caps, capitalize_days
xlDialogColorPalette file_text
xlDialogColumnWidth width_num, reference, standard, type_num, standard_num
xlDialogCreateNames top, left, bottom, right
xlDialogDefineName name_text, refers_to, macro_type, shortcut_text, hidden,
category, local
xlDialogDefineStyle style_text, number, font, alignment, border, pattern, protection
xlDialogFilterAdvanced operation, list_ref, criteria_ref, copy_ref, unique
xlDialogGoalSeek target_cell, target_value, variable_cell
xlDialogInsertObject object_class, file_name, link_logical, display_icon_logical,
icon_file, icon_number, icon_label
xlDialogOpen file_text, update_links, read_only, format, prot_pwd,
write_res_pwd, ignore_rorec, file_origin, custom_delimit,
add_logical, editable, file_access, notify_logical, converter
xlDialogPageSetup head, foot, left, right, top, bot, hdng, grid, h_cntr, v_cntr, orient,
paper_size, scale, pg_num, pg_order, bw_cells, quality,
head_margin, foot_margin, notes, draft
Chapitre 18

xlDialogSaveAs document_text, type_num, prot_pwd, backup, write_res_pwd,


read_only_rec
xlDialogSendMail recipients, subject, return_receipt

422
Partie 5 : Manipulation des objets Excel

Personnalisation des boîtes de dialogue

Tableau 18-3. Constantes xlDialog de la structure


des menus d’Excel (Suite)
Constante xlDialog Description
xlDialogShowToolbar bar_id, visible, dock, x_pos, y_pos, width, protect, tool_tips,
large_buttons, color_buttons
xlDialogZoom magnification

Il existe bien d’autres boîtes de dialogue intégrées. Pour en localiser tous les
arguments disponibles, consultez le site web de MSDN et l’aide en ligne
d’Excel.

Passer des arguments aux boîtes de dialogue existantes


La boîte de dialogue constitue parfois la solution parfaite : elle permet à l’utilisa-
teur d’interagir avec une interface qui lui est familière lorsque la propriété Show
est positionnée sur True. Rappelez-vous que vous n’êtes pas limité aux valeurs
par défaut de la boîte de dialogue. Vous pouvez les modifier en lui passant des
arguments.

Remarque S’il est possible de retourner ou de modifier une propriété ou une


méthode pour retourner ou modifier une valeur dans une boîte de dialogue,
préférez cette solution à l’utilisation d’un objet Dialog. En effet, si vous utilisez
le code VBA au lieu d’accéder à l’objet Dialog, votre code n’en sera que plus
simple et plus court.

Avant de retourner ou de modifier un paramètre de boîte de dialogue avec l’objet


Dialog, vous devez identifier la boîte de dialogue. Pour ce faire, servez-vous de la
propriété Dialogs avec une constante xlDialog. Si vous avez initié un objet Dialog,
vous pouvez retourner ou définir les options de la boîte de dialogue.
Par exemple, pour permettre à l’utilisateur de vérifier les paramètres appliqués à
une plage de cellules tout en minimisant son interaction, vous pouvez passer les
paramètres à la boîte de dialogue de sorte qu’ils soient automatiquement sélec-
tionnés. Pour afficher l’onglet Alignement de la boîte de dialogue Format de cel-
lule de sorte qu’il applique par défaut le format centré horizontalement et
verticalement avec le renvoi à la ligne automatique activé, servez-vous du code
suivant :

Sub VerifyAlignment()
Application.Dialogs(xlDialogAlignment).Show 3, 1, 2
End Sub
Chapitre 18

La figure 18.6 montre le résultat de cette procédure.

423
Partie 5 : Manipulation des objets Excel

Microsoft Office Excel 2003 au Quotidien

Figure 18-6. L’onglet Alignement avec les alignements définis et le renvoi à la


ligne activé.

Planification avec des boîtes de dialogue


Tout au long de ce chapitre, vous avec appris comment accéder aux boîtes de dia-
logue intégrées et comment leur passer des arguments. Une utilisation appro-
priée des boîtes de dialogue intégrées permet d’économiser du temps et de
minimiser le travail de codage. L’objectif d’une bonne procédure est un travail
simple et efficace. Gardez cela à l’esprit à l’heure d’entamer votre prochain pro-
jet.
Chapitre 18

424
Partie 5 : Manipulation des objets Excel

Chapitre 19
Création de feuilles
UserForm
Création d’une feuille Contrôles UserForm. . . . . . . . . . 431
UserForm . . . . . . . . . . . . . . . . . . 425

Les feuilles UserForm permettent aux programmeurs Microsoft Excel d’offrir


aux utilisateurs une manière différente d’interagir avec leurs applications. Dans
ce chapitre, vous allez apprendre à créer une feuille et à y ajouter les contrôles
standard fournis par Visual Basic pour Applications (VBA). Vous étudierez
ensuite comment afficher et fermer des feuilles à partir de vos routines. Pour
finir, vous découvrirez comment interagir avec la feuille à partir de l’application
VBA.

Création d’une feuille UserForm


VBA propose un objet spécial appelé UserForm. Un objet UserForm constitue
une surface sur laquelle vous pouvez placer des contrôles graphiques, comme des
boutons, des images et des zones de texte.

Ajouter un objet UserForm


Pour ajouter un UserForm à votre projet, dans le menu Insertion de Visual Basic
Editor, choisissez UserForm (voir figure 19.1). La feuille est une maquette de
fenêtre, comprenant une barre de titre complète dont le titre est UserForm1 par
défaut, un bouton Fermer et une surface remplie de points.
Outre la feuille, Visual Basic Editor affiche également une barre d’outils flottante
intitulée Boîte à outils. Celle-ci héberge différents contrôles que l’on peut placer
sur la surface de dessin de la feuille.

425
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 19

Figure 19-1. Un objet UserForm permet au programmeur VBA de concevoir une


interface graphique pour son application.

Concevoir un objet UserForm


Pour concevoir un objet UserForm, vous devez sélectionner des contrôles dans la
Boîte à outils et les faire glisser sur la surface de dessin. Une fois qu’ils se trouvent
sur la feuille, vous modifiez l’aspect des contrôles en les sélectionnant puis en les
formatant à votre guise manuellement ou par le biais de la fenêtre Propriétés.
Voici un exemple simple de ce processus :
1 Créez un nouvel objet UserForm en choisissant Insertion, Insertion dans le
menu Visual Basic Editor.
2 Placez le pointeur de la souris au-dessus du contrôle Intitulé dans la Boîte
à outils.
3 Cliquez et maintenez le bouton de la souris enfoncé.
4 Déplacez le pointeur vers la surface de dessin et relâchez le bouton de la
souris. Vous avez ajouté un contrôle Intitulé dans la feuille.

426
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm

Chapitre 19
5 Le nom du contrôle Intitulé est Label1. Pour modifier cette valeur, chan-
gez sa propriété Caption dans fenêtre Propriétés ou cliquez sur le contrôle
et tapez un nouvel intitulé directement dans la feuille.
6 Vous pouvez tester votre feuille à tout moment en choisissant Exécution,
Exécuter Sub/UserForm. La fenêtre Excel s’affiche avec votre nouvelle
feuille au premier plan.

7 Cliquez sur le bouton Fermer pour fermer la feuille et revenir à Visual


Basic Editor.

Modifier un objet UserForm


Pour modifier un objet UserForm, commencez par le sélectionner. Pour sélec-
tionner l’objet UserForm, cliquez dans n’importe quelle zone vide de la feuille ou
sélectionnez-le dans la liste déroulante de la fenêtre Propriétés. Une fois l’objet
sélectionné, une bordure composée de points et de carrés l’entoure.
Vous pouvez alors modifier la taille en faisant glisser ses bords. Placez le pointeur
de la souris au-dessus de l’un des carrés du bord pour qu’il prenne la forme
d’une double flèche. Cliquez et maintenez le bouton de la souris enfoncé tout en
déplaçant la souris pour modifier la taille de la feuille.

427
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Vous pouvez également modifier la taille à partir de la fenêtre Propriétés : la pro-
priété Height contrôle la hauteur de la feuille et la propriété Width gère sa largeur.
Chapitre 19

Ces valeurs sont exprimées en points.

Propriétés d’un objet UserForm


L’objet UserForm propose une large palette de propriétés qui contrôlent son
aspect et son fonctionnement. Le tableau 19.1 liste certaines de ces propriétés.
Tableau 19-1. Principales propriétés de l’objet UserForm
Propriété Description
BackColor Contient la couleur de fond de l’objet UserForm.
Caption Contient la valeur affichée dans la barre de titre de l’objet UserForm.
Enabled Positionnée sur True, cette propriété signifie que l’objet UserForm est
activé.
Height Spécifie la hauteur de l’objet UserForm en points.
Left Spécifie la distance entre le bord gauche de l’objet UserForm et le bord
gauche de l’écran.
Name Contient le nom de l’objet UserForm.
Picture Affiche l’image spécifiée comme fond de l’objet UserForm.
ScrollBars Spécifie les barres de défilement qui s’affichent sur l’objet UserForm. Les
options sont : fmScrollBarsNone, fmScrollBarsHorizontal,
fmScrollBarsVertical ou fmScrollBarsBoth.
StartUpPosition Détermine la position de l’objet UserForm à l’écran. Une valeur de 0
signifie que les propriétés Top et Left servent à positionner l’objet
UserForm. Une valeur de 1 signifie que la feuille est affichée au centre de
l’application Excel. Une valeur de 2 signifie que la feuille est affichée au
centre de l’écran. Une valeur de 3 signifie que la feuille est affichée dans
l’angle supérieur gauche de l’écran.
Top Spécifie la distance entre le bord supérieur de l’objet UserForm et le bord
supérieur de l’écran.
Width Spécifie la largeur de l’objet UserForm en points.

La propriété Name contient le nom de l’objet UserForm. Rappelez-vous que cette


propriété apparaît en réalité en tête de liste des propriétés et non selon l’ordre
alphabétique comme le reste des propriétés.
Si vous ajustez manuellement la hauteur et la largeur de la feuille, les propriétés
Height et Width sont automatiquement ajustées en conséquence. Les propriétés
Top et Left contrôlent la position de la feuille à l’écran lorsque la propriété
StartUpPosition est positionnée sur 0.
La propriété BackColor vous permet de modifier la couleur de fond de la feuille,
alors que la propriété Picture vous permet d’afficher une image de fond. Par

428
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


défaut, ces propriétés prennent les paramètres de Windows. Ainsi, si l’utilisateur
a installé un thème Windows spécial, la feuille exploite ces couleurs.

Chapitre 19
Afficher un objet UserForm
Les objets UserForm sont des objets Visual Basic que vous pouvez manipuler
avec du code en paramétrant leurs propriétés, méthodes d’appel et réponses
aux événements. Il n’est guère difficile de créer une macro qui affiche une
feuille à l’écran. Il suffit ensuite d’ajouter le code qui s’exécute en réponse
aux divers événements (en programmation, on appelle cela intercepter les
événements).
L’affichage d’une feuille dans VBA constitue un processus en deux phases. Pour
commencer, vous devez charger la feuille, puis l’afficher. Le processus de charge-
ment alloue de la mémoire et initialise la feuille pour préparer son affichage. Le
processus d’affichage crée la fenêtre graphique qui contient la feuille et la rend
visible à l’utilisateur.
Pour charger puis afficher une feuille, vous appelez sa méthode Load puis sa
méthode Show. Si la feuille ne se charge pas lorsque vous appelez la méthode
Show, elle est chargée automatiquement.
Hide est le contraire de Show et Unload celui de Load. Ainsi, si vous appelez la
méthode Hide, vous masquez une feuille sans libérer ses ressources. De même, si
vous appelez la méthode Unload, vous libérez toutes les ressources associées à
une feuille. Si vous appelez Unload alors que la feuille est visible à l’écran, elle est
automatiquement supprimée de l’affichage avant que ses ressources ne soient
libérées.

Astuce Des feuilles plus rapides


Le chargement d’un objet UserForm consomme beaucoup de ressources. Plus
la feuille est complexe, plus elle exploite de ressources pour se charger. Pour
afficher rapidement une feuille, il serait préférable de la masquer au lieu de la
décharger. En revanche, si vous n’utilisez pas souvent la feuille, vous écono-
miserez des ressources système qui seront mieux employées ailleurs en la
déchargeant.

Vous pouvez afficher une feuille de deux manières : modale ou sans mode. Dans
une feuille modale, tout le traitement de l’application associée s’arrête jusqu’à ce
que la feuille soit fermée. Une boîte de message est un exemple de feuille modale.
Pour afficher une feuille sans mode, servez-vous de l’instruction suivante :

UserForm1.Show vbModeless

Pour afficher une feuille modale, servez-vous de l’instruction suivante :

UserForm1.Show vbModal

429
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Toutefois, si vous appelez la méthode Show sans préciser le mode, la feuille s’affi-
che de manière modale.
Chapitre 19

Astuce Feuilles et contrôles de barre de commandes


Vous pouvez utiliser une sous-routine associée à la routine OnAction pour
appeler la méthode Show d’un objet UserForm. Cette technique est particuliè-
rement adaptée à l’ouverture d’assistants ou pour permettre à l’utilisateur de
saisir des données dans l’application.

Une feuille sans mode ne bloque pas l’application lorsqu’elle est active : l’appli-
cation continue de fonctionner comme si la feuille n’était pas présente. Cette
approche répond à différentes applications, mais il est préférable de l’employer
avec parcimonie. En effet, les feuilles sans mode n’apparaissent ni dans la barre
des tâches, ni dans l’ordre de tabulation des fenêtres. Autrement dit, les utilisa-
teurs risquent de perdre une feuille sans mode lorsqu’ils basculent dans une
autre application ou une autre fenêtre de l’application en cours.
Le cycle de vie d’une feuille est lié à trois événements essentiels. L’événement
Activate se déclenche juste avant que la feuille ne devienne la fenêtre active.
L’événement Deactivate se déclenche lorsque la feuille n’est plus la fenêtre active.
L’événement Terminate se déclenche lorsqu’on décharge la feuille.
Rappelez-vous que les événements Activate et Deactivate se déclenchent unique-
ment quand on se déplace au sein de l’application VBA. Basculer vers ou depuis
une autre application avec Excel et le programme VBA ne déclenche pas ces évé-
nements.

Au Quotidien
Boîte de dialogue intégrée ou personnalisée ?

Vous vous demandez probablement pourquoi utiliser une boîte de dialogue


pour modifier la feuille de calcul alors que vous disposez de méthodes et de
propriétés dans le code VBA. Supposons que l’utilisateur doive faire des choix
comme celui de la couleur de fond ou de la taille de police. Ce sont de parfaits
exemples de cas dans lesquels il est préférable d’utiliser une boîte de dialo-
gue. Il est bien plus simple d’afficher une boîte de dialogue intégrée et de per-
mettre à l’utilisateur de sélectionner une couleur dans une interface qu’il
connaît. Une fois qu’il a choisi la couleur, vous récupérez les sélections et les
appliquez aux plages de votre choix.

Avec une boîte de dialogue intégrée, l’utilisateur interagit avec le code de


manière productive. Servez-vous d’une instruction Then…Else pour appliquer
la couleur par défaut au cas où l’utilisateur clique sur le bouton Annuler ou
appuie sur la touche ÉCHAP.

430
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm

Rappelez-vous : le code doit interagir avec l’utilisateur. Il doit proposer des

Chapitre 19
solutions simples qui demandent peu voire pas de formation. Avec les boîtes
de dialogue intégrées, vous exploitez une interface connue de l’utilisateur et
qu’il maîtrise.

Avant de créer une boîte de dialogue personnalisée, arrêtez-vous quelques ins-


tants pour vous demander si elle est réellement nécessaire. Existe-t-il déjà une
boîte de dialogue qui vous évitera cette peine ? Si tel est le cas, essayez les
boîtes de dialogue intégrées et voyez si vous parvenez au résultat souhaité.

Contrôles UserForm
La Boîte à outils regroupe un assortiment de contrôles destinés aux feuilles. Cer-
tains, comme le contrôle Intitulé, sont statiques et se contentent de modifier
l’apparence de la feuille. D’autres, comme Zone de texte et Bouton de com-
mande, interagissent avec l’utilisateur pour éditer des informations ou déclen-
cher des tâches.

Programmer les contrôles


Outre l’affichage de la feuille, Visual Basic Editor affiche également une barre
d’outils flottante intitulée Boîte à outils. La Boîte à outils regroupe les contrôles
destinés aux feuilles.
Pour ajouter un contrôle à une feuille, sélectionnez-le dans la Boîte à outils, fai-
tes-le glisser sur la feuille et déposez-le à l’emplacement de votre choix. Pour
modifier sa taille et sa position manuellement, sélectionnez-le et déplacez-le ou
servez-vous des poignées de dimensionnement qui l’entourent (voir
figure 19.2).

431
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 19

Figure 19-2. Pour ajouter un contrôle, sélectionnez-le dans la Boîte à d’outils et


déposez-le dans la feuille.

Le module de la feuille UserForm stocke tout le code et les contrôles associés à la


feuille. Il s’agit d’un élément indépendant, au même titre qu’un module ou un
module de classe. Pour basculer du mode graphique de la feuille à l’affichage du
code, double-cliquez sur le contrôle : une définition de sous-routine est automa-
tiquement ajoutée à l’événement par défaut de ce contrôle.

Propriétés, méthodes et événements


Les contrôles UserForm sont des objets et, à l’instar des autres objets que nous
avons déjà étudiés, ils possèdent une riche collection de propriétés, méthodes et
événements. Le tableau 19.2 liste les propriétés, méthodes et événements princi-
paux communs à la majorité des contrôles.
Tableau 19-2. Propriétés, méthodes et événements principaux des
contrôles UserForm
Propriété/Méthode Description
BackColor Propriété : détermine la couleur de fond du contrôle.
Caption Propriété : contient le texte affiché sur le contrôle, mais ne peut
être modifié par l’utilisateur.
Change Événement : appelé lorsque la propriété Value change.
Click Événement : appelé lorsque l’utilisateur clique sur le contrôle
avec la souris.

432
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm

Tableau 19-2. Propriétés, méthodes et événements principaux des


contrôles UserForm (Suite)

Chapitre 19
Propriété/Méthode Description
ControlTipText Propriété : contient le texte affiché lorsque l’utilisateur survole le
contrôle avec le pointeur de la souris pendant quelques
secondes.
DblClick Événement : appelé lorsque l’utilisateur double-clique sur le
contrôle avec la souris.
Enabled Propriété : Si True, cette propriété signifie que le contrôle peut
recevoir le focus et répondre aux événements générés par
l’utilisateur.
Enter Événement : appelé juste avant que le contrôle reçoive le focus
d’un autre contrôle de la même feuille.
Exit Événement : appelé juste avant que le contrôle perde le focus au
profit d’un autre contrôle de la même feuille.
Font Propriété : contient une référence à un objet Font, qui définit les
caractéristiques du texte affiché sur le contrôle.
ForeColor Propriété : contient la couleur du premier plan du contrôle.
Height Propriété : contient la hauteur du contrôle en points.
Left Propriété : contient la distance entre le bord gauche du contrôle
et le bord gauche de la feuille sur laquelle le contrôle réside.
Locked Propriété : si True, l’utilisateur n’est pas habilité à changer la
valeur du contrôle.
Name Propriété : contient le nom du contrôle.
SpecialEffect Propriété : spécifie l’aspect du contrôle à l’écran.
TabIndex Propriété : spécifie la position relative du contrôle dans l’ordre
des tabulations.
TabStop Propriété : si True, elle signifie que le contrôle accepte le focus
lorsqu’un utilisateur emploie la touche TAB pour se déplacer.
Top Propriété : contient la distance entre le bord supérieur du contrôle
et le bord supérieur de la feuille sur laquelle le contrôle réside.
Value Propriété : décrit l’état ou le contenu d’un contrôle.
Visible Propriété : si True, elle signifie que le contrôle est affiché sur la
feuille.
Width Propriété : contient la largeur du contrôle en points.
ZOrder (zPosition) Méthode : place le contrôle à l’avant-plan (fmTop) ou à l’arrière-
plan fmBottom) de la hiérarchie d’affichage.

Les propriétés Height, Width, Top et Left indiquent la taille physique et la position
du contrôle sur la feuille. La propriété Enabled détermine si le contrôle peut rece-
voir le focus, alors que la propriété Visible détermine si le contrôle est affiché.

433
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Lorsque la propriété Locked est positionnée sur True, l’utilisateur peut manipuler
le contenu du contrôle mais ne peut pas en modifier la valeur. Par exemple, il
Chapitre 19

peut faire défiler une zone de texte à plusieurs lignes pour voir toutes les don-
nées, mais il ne peut pas les modifier. Si la propriété Enabled est positionnée sur
False, le contrôle zone de texte est visible, mais l’utilisateur ne peut pas faire défi-
ler pour afficher le texte qui n’est pas visible à l’écran.
Lorsque deux contrôles se chevauchent, la méthode ZOrder désigne celui qui est
entièrement visible et celui qui est partiellement ou totalement masqué. Si vous
placez un contrôle à l’avant-plan de l’axe des z, il est affiché en dernier : il sera
donc entièrement visible, même s’il chevauche d’autres contrôles. De même, si
vous vous servez de la méthode ZOrder pour placer un contrôle à l’arrière-plan
sur l’axe des z, il est restitué en premier : tout contrôle rendu ultérieurement peut
le masquer.
TabIndex identifie l’ordre dans lequel le focus passe d’un contrôle au suivant
lorsque l’utilisateur appuie sur la touche TAB et TabStop détermine si le contrôle
accepte le focus ou si celui-ci passe au prochain contrôle possédant la valeur
TabIndex la plus élevée. Les événements Enter et Exit se déclenchent lorsque le
focus passe d’un contrôle à l’autre au sein de la même feuille. La routine Exit
contient un unique argument, Cancel, que vous pouvez positionner sur True
pour empêcher l’utilisateur de passer à un autre contrôle.

Astuce Examiner les informations


Le code de l’événement Exit s’exécute uniquement lorsque l’utilisateur bas-
cule vers un autre contrôle. Il peut donc être intéressant d’examiner le contenu
du contrôle à ce moment-là pour déterminer si la valeur est correcte. Par exem-
ple, vous pouvez vérifier que le contenu du contrôle est numérique et, si l’utili-
sateur a saisi une valeur non valide, l’en informer par le biais d’une boîte de
message puis positionner l’argument Cancel sur True pour empêcher l’utilisa-
teur de passer à un autre contrôle de la même feuille.

La signification exacte de la propriété Value dépend du contrôle, mais elle con-


tient généralement la valeur associée au contrôle. L’événement Change se déclen-
che lorsque cette valeur change. Rappelez-vous que la propriété Value est
différente de la propriété Caption en ce que cette dernière représente habituelle-
ment un bloc de texte modifiable uniquement par le programme, alors que la
première contient essentiellement des informations que l’on peut modifier par
interaction de l’utilisateur avec la feuille.
Les événements Click et DblClick se déclenchent lorsque l’utilisateur clique ou
double-clique sur le souris. Dans certains cas, l’événement Change se déclenche
également si le clic ou le double-clic affecte la propriété Value du contrôle.

434
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm

Note du traducteur Les contrôles des feuilles UserForm ont été traduits

Chapitre 19
dans la Boîte à outils VBA, mais conservent leur nom anglais une fois insérés
sur la feuille et dans la fenêtre Propriétés. Afin de simplifier la compréhension
des prochaines sections, nous avons choisi de conserver le nom anglais des
contrôles et de placer leur nom traduit, tel qu’on le trouve dans la Boîte à
outils, entre parenthèses à la première occurrence.

Contrôle Label
Le contrôle Label (Intitulé) permet au programme d’afficher du texte sur la
feuille que l’utilisateur ne peut pas modifier. Le contrôle Label sert essentielle-
ment à décrire le contenu des autres contrôles, comme le contrôle TextBox (Zone
de texte).
Bien que l’utilisateur ne puisse pas modifier la valeur du contrôle Label, votre
programme le peut en assignant une valeur à la propriété Caption. Contraire-
ment à la plupart des autres contrôles, le contrôle Label ne possède pas de pro-
priété Value puisque l’utilisateur ne peut rien modifier. En revanche, il répond
aux clics de souris et déclenche les événements Click et DblClick.

Contrôle CommandButton
Le contrôle CommandButton (Bouton de commande) affiche un bouton qui
déclenche l’événement Click associé si l’utilisateur clique sur le bouton. Pour le
déclencher, on peut également utiliser la touche TAB pour lui donner le focus
puis appuyer sur la touche ENTRÉE ou la barre d’espace.
La routine suivante change le texte affiché sur le bouton chaque fois que l’on cli-
que dessus. Si la propriété Caption lit « Éteint », la routine réinitialise la valeur
sur « Allumé » ; sinon, la propriété Caption est positionnée sur « Éteint ».

Private Sub CommandButton1_Click()

If CommandButton1.Caption = "Éteint" Then


CommandButton1.Caption = "Allumé"

Else
CommandButton1.Caption = "Éteint"

End If

End Sub

435
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 19

Astuce Une pression sur un bouton


Servez-vous du bouton de commande pour appeler une sous-routine chargée
de traiter les informations sur la feuille.

Contrôle TextBox
Le contrôle TextBox (Zone de texte) constitue le principal contrôle employé pour
accepter du texte émanant de l’utilisateur. Il existe deux types principaux de
zones de texte : à ligne unique ou à plusieurs lignes. Cet aspect du contrôle est
géré par la propriété Multiline. Si elle est positionnée sur True, le contrôle pré-
sente plusieurs lignes de texte ; si elle prend la valeur False, la zone de texte ne
comporte qu’une seule ligne de texte.

Astuce Faire une coupure


Pour obliger le texte à commencer sur une nouvelle ligne, incorporez la cons-
tante vbCrLf (retour chariot, saut de ligne) avant le premier caractère de la
ligne suivante. Cet espace blanc peut vous servir à diviser un long bloc de
texte en paragraphes.

Si le texte affiché dans la zone de texte est plus long que la partie visible, vous
pouvez ajouter des barres de défilement permettant à l’utilisateur de visualiser le
texte masqué. Pour afficher une barre de défilement horizontale dans une zone
de texte à ligne unique, positionnez la propriété ScrollBars sur fmScrollBarsHori-
zontal. Dans une zone de texte à plusieurs lignes, vous pouvez également opter
pour une barre de défilement verticale (fmScrollBarsVertical) ou pour deux bar-
res de défilement (fmScrollBarsBoth). Attribuez la valeur fmScrollBarsNone à
cette propriété dans n’importe quelle zone de texte pour empêcher l’affichage
des barres de défilement.
La propriété WordWrap constitue une autre propriété intéressante des zones de
texte à plusieurs lignes. Lorsqu’elle est positionnée sur True, toute ligne trop
longue pour s’afficher complètement dans l’espace horizontal disponible est
renvoyée à la ligne suivante pour ne pas couper un mot en fin de ligne. Cepen-
dant, dans ce cas, vous ne pourrez pas afficher de barre de défilement horizon-
tale.

436
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


La propriété LineCount retourne le nombre de lignes d’une zone de texte à plu-
sieurs lignes.

Chapitre 19
Les caractères affichés dans un contrôle TextBox sont présents dans les propriétés
Text et Value et vous modifiez le contenu de la zone de texte en changeant l’une
ou l’autre propriété. Il est cependant coutume d’utiliser la propriété Text au lieu
de la propriété Value. L’événement Change se déclenche si on assigne une valeur
à l’une ou l’autre propriété.

Remarque L’événement Change se déclenche pour chaque caractère saisi


par un utilisateur dans la zone de texte. Cet événement peut servir à valider
les informations saisies caractère par caractère. Toutefois, pour valider la zone
de texte complète après que l’utilisateur a terminé de saisir des données, ser-
vez-vous de l’événement Exit (qui se déclenche automatiquement lorsque le
focus quitte la zone de texte) à la place de l’événement Change.

Pour masquer les caractères saisis dans une zone de texte, spécifiez une valeur
pour la propriété PasswordChar. Cette propriété sert essentiellement à masquer
le mot de passe en le remplaçant par un astérisque (*). Pour afficher les caractè-
res saisis, attribuez à cette propriété une valeur de chaîne vide.
La propriété MaxLength spécifie le nombre maximum de caractères que l’on
peut saisir dans le contrôle TextBox et la propriété TextLength retourne la lon-
gueur totale du texte. La propriété TextLength compte également les retours cha-
riot et les sauts de ligne présents dans une zone de texte à plusieurs lignes. Si la
propriété AutoTab est positionnée sur True, le focus se décale sur le contrôle sui-
vant dans l’ordre des tabulations lorsque le nombre maximum de caractères a été
saisi dans le contrôle.

Contrôle CheckBox
Le contrôle CheckBox (Case à cocher) permet à l’utilisateur de choisir entre deux
valeurs telles que Oui/Non, Vrai/Faux ou Actif/Inactif. Le texte de la propriété
Caption s’affiche en regard de la case à cocher.
Les événements Click et Change de ce contrôle génèrent le même résultat puisque
pour en modifier la valeur, il suffit que l’utilisateur clique n’importe où sur le
contrôle, y compris sur sa légende. Pour afficher la valeur d’un contrôle Check-

437
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Box, vous pouvez faire appel à un code similaire à celui de l’événement Change
suivant :
Chapitre 19

Private Sub CheckBox1_Change()

MsgBox "La valeur du contrôle CheckBox est " & CheckBox1.Value

End Sub

Contrôle ToggleButton
Le contrôle ToggleButton (Bouton bascule) est similaire au contrôle CheckBox en
ce qu’il permet à l’utilisateur de choisir entre deux valeurs. La seule différence
réelle entre les deux est que le contrôle ToggleButton semble « relevé » quand la
propriété Value est positionnée sur False et « enfoncé » lorsqu’elle prend la valeur
True.

Contrôle SpinButton
Le contrôle SpinButton (Bouton toupie) simplifie le choix entre plusieurs
valeurs. La propriété Value contient la valeur actuelle du contrôle. Si on clique
sur le bouton Flèche haut on augmente la valeur et si on clique sur le bouton Flè-
che bas, on réduit la valeur.
Les propriétés Min et Max spécifient la plus petite et la plus grande valeur du
contrôle. La propriété SmallChange spécifie le nombre ajouté ou soustrait cha-
que fois que l’on clique sur l’un des boutons flèche. Par défaut, la valeur est de 1.
Chaque fois que la propriété Value de ce contrôle change, l’événement Change se
déclenche. En outre, l’événement SpinUp se déclenche si on clique sur le bouton
Flèche haut et un clic sur le bouton Flèche bas déclenche l’événement SpinDown.

438
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


La propriété Delay spécifie l’intervalle entre les événements Change lorsque l’uti-
lisateur clique et maintient le bouton de la souris enfoncé sur les boutons flèche.

Chapitre 19
La valeur par défaut est de 500 millisecondes. Le délai entre le premier et le
deuxième appel est égal à cinq fois la valeur de Delay pour qu’il soit plus simple
pour l’utilisateur de cliquer une fois sur le bouton. Après le deuxième appel,
l’événement Change est appelé après que l’intervalle spécifié dans la propriété
Delay se soit écoulé.
En général, on place un contrôle TextBox ou Label en regard du contrôle
SpinButton pour afficher la valeur en cours. Voici un exemple de code :

Private Sub SpinButton1_Change()

TextBox1.Text = SpinButton1.Value

End Sub

Contrôle Frame
Le contrôle Frame (Cadre) permet de grouper une série de contrôles. Technique-
ment, ce contrôle est appelé conteneur. Il s’agit, en effet, du seul contrôle de
Visual Basic qui puisse contenir d’autres contrôles, appelés également contrôles
enfants.

Astuce Du cadre à la feuille


Vous ne pouvez pas faire glisser un contrôle existant dans un cadre, ni un con-
trôle du cadre vers la feuille UserForm. Pour déplacer un contrôle du cadre à la
feuille et inversement, vous devez utiliser une opération copier-coller. Sélec-
tionnez le contrôle et choisissez Édition, Couper. Sélectionnez ensuite le con-
teneur de votre choix (la cadre ou la feuille) et choisissez Édition, Coller. Une
fois que le contrôle se trouve sur la feuille ou dans le cadre, vous pouvez le
déplacer à votre guise.

Les cadres servent également à attirer l’attention sur un groupe de contrôles. La


propriété Caption s’affiche sur le bord du cadre.

439
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Astuce Déplacer des cadres


Chapitre 19

Si vous redimensionnez et/ou déplacez un cadre dans une feuille, tous les
contrôles qu’ils contient suivent le mouvement. La position relative entre les
contrôles enfants et l’angle supérieur gauche du cadre est constante.

Contrôle OptionButton
Le contrôle OptionButton (Bouton d’option) permet de choisir exactement un
élément dans un groupe. Le bouton d’option fonctionne comme une case à
cocher en ce qu’il possède deux états : sélectionné ou non sélectionné. Cepen-
dant, on ne peut sélectionner qu’un seul bouton d’option par feuille. Lorsque
l’utilisateur clique sur un bouton d’option différent, le bouton d’option actuel-
lement sélectionné est désélectionné au profit du nouveau. Autrement dit, si la
feuille contient 20 boutons d’option, un seul est sélectionné à la fois.
Pour afficher plusieurs groupes de boutons d’option sur une feuille, placez cha-
que groupe dans un contrôle Frame. Ainsi, le groupe de boutons d’option affecte
uniquement les valeurs des autres boutons d’option du même cadre. Les bou-
tons d’option qui se trouvent en-dehors du cadre ou dans un autre cadre ne sont
pas affectés.

Attention Soyez extrêmement prudent si vous supprimez un contrôle Frame.


Ce faisant, vous supprimez également les contrôles qu’il héberge. Pour con-
server ces contrôles, coupez ou copiez-les dans le Presse-papiers avant de
supprimer le contrôle Frame. Une fois le contrôle Frame supprimé, vous pouvez
les coller directement sur la feuille ou à l’endroit de votre choix.

440
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm

Contrôle Image

Chapitre 19
Le contrôle Image relativement simple. Il permet d’afficher une image sur une
feuille. Il supporte uniquement les formats de fichier suivants : BMP, CUR, GIF,
ICO, JPG et WMF.
La propriété Picture contient l’image binaire qui s’affiche dans le contrôle. Saisis-
sez le nom d’un fichier dans Visual Basic Editor et il charge automatiquement
l’image. Pour charger une image pendant l’exécution du programme, faites
appel à la fonction LoadPicture de la manière suivante, où <nomchemin> contient
le nom du fichier et son chemin d’accès :

Image1.Picture = LoadPicture(<nomchemin>)

Par défaut, lorsqu’une image est chargée dans un contrôle, à l’origine dans Visual
Basic Editor ou dans l’application, elle s’affiche dans sa taille normale. Cela
signifie que vous ne verrez la totalité de l’image que si le contrôle Image possède
la même taille que l’image. Si le contrôle est plus petit que l’image, vous n’en ver-
rez que l’angle supérieur gauche, mais s’il est plus grand, vous verrez toute
l’image plus l’arrière-plan du contrôle.
La propriété PictureAlignment gère le placement de l’image dans le contrôle. Par
défaut, elle s’aligne de sorte que son angle supérieur gauche soit placé dans
l’angle supérieur gauche du contrôle (fmPictureAlignmentTopLeft). Les valeurs
suivantes sont disponibles : fmPictureAlignmentTopRight, fmPictureAlignment-
Center, fmPictureAlignmentBottomLeft et fmPictureAlignmentBottomRight.
Utilisez la propriété PictureSizeMode pour redimensionner automatiquement
l’image de sorte qu’elle s’affiche entièrement. Une valeur de fmPictureSizeMo-
deStretch redimensionne l’image de sorte qu’elle remplisse tout l’espace du con-
trôle. Vous devrez éventuellement ajuster les propriétés Height et Width pour
éviter que l’image soit déformée. Si vous positionnez la propriété PictureSize-
Mode sur fmPictureSizeModeZoom, vous élargissez ou compactez l’image pour
l’adapter à la zone, mais vous ne modifiez par le rapport hauteur/largeur. Une
valeur de fmPictureSizeModeClip affiche l’image dans sa taille normale et élimine
toute partie de l’image qui n’entre pas dans le contrôle.
Lorsque la propriété PictureTiling est positionnée sur True, l’image se répète
autant de fois que nécessaire pour remplir complètement l’espace disponible
dans le contrôle Image. La première copie de l’image est placée en fonction de la
propriété PictureAlignment.

441
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Contrôle ScrollBar
Chapitre 19

Le contrôle ScrollBar (Barre de défilement) ajoute la classique barre de défile-


ment Windows à l’application. Selon la valeur de la propriété Orientation, la
barre de défilement sera horizontale (fmOrientaionHorizontal) ou verticale
(fmOrientationVertical).

Remarque Par défaut, la propriété Orientation prend la valeur fmOrientation


Auto. Autrement dit, Visual Basic Editor sélectionne automatiquement l’orien-
tation du contrôle selon qu’il est plus large que haut (horizontal) ou plus haut
que large (vertical).

En déplaçant l’ascenseur le long de la barre de défilement, vous modifiez la pro-


priété Value du contrôle. Les propriétés Min et Max spécifient les nombres mini-
mum et maximum retournés par la propriété Value. La valeur Min est retournée
lorsque l’ascenseur se trouve au sommet d’une barre de défilement verticale ou à
gauche d’une barre de défilement horizontale. La valeur Max est retournée lors-
que l’ascenseur se trouve au bas d’une barre de défilement verticale ou à droite
d’une barre de défilement horizontale.
La propriété LargeChange spécifie la distance de déplacement de l’ascenseur lors-
que l’utilisateur clique sur la barre de défilement entre l’ascenseur et les flèches,
alors que la propriété SmallChange spécifie la distance de déplacement de
l’ascenseur quand l’utilisateur clique sur les flèches de la barre de défilement.
L’événement Scroll se déclenche lorsqu’on déplace l’ascenseur sur la barre de
défilement, mais l’événement Change se déclenche quand la valeur change. Pour
des raisons pratiques, ces deux événements sont similaires. La seule différence est
que l’événement Scroll se déclenche plusieurs fois pendant que l’utilisateur
déplace l’ascenseur sur la barre de défilement. L’événement Change se déclenche
uniquement après que l’utilisateur a relâché l’ascenseur.

Contrôle ListBox
Le contrôle ListBox (Zone de liste) présente une liste d’informations parmi les-
quelles l’utilisateur sélectionne une ou plusieurs entrées. Vous pouvez organiser
les éléments à sélectionner en une série de lignes et de colonnes. Le nombre de
colonnes est défini par la propriété ColumnCount. Cette valeur contient le nom-
bre de colonnes disponibles. Par défaut, cette propriété est positionnée sur 1,

442
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


autrement dit une seule colonne est affichée. Si vous positionnez cette propriété
sur –1, toutes les colonnes disponibles s’affichent (jusqu’à 10).

Chapitre 19
Si la propriété ColumnHeads est positionnée sur True, la première ligne de la liste
sert d’en-tête à la colonne. Cette ligne ne peut pas être sélectionnée. La propriété
ColumnWidth spécifie la taille de chaque colonne. Les tailles de toutes les lar-
geurs de colonnes sont rassemblées dans une seule et même chaîne prenant la
forme d’une suite de nombres séparés par des points virgules (;). Chaque nom-
bre indique la largeur de la colonne en points. Vous pouvez également spécifier
les largeurs en centimètres (cm) ou en pouces (in). Le séparateur décimal est
autorisé. Si vous spécifiez une valeur de 0 pour la largeur d’une colonne, celle-ci
ne sera pas affichée.
La propriété ListCount contient le nombre de lignes dans la liste. La propriété
List accède à la liste d’éléments et prend deux paramètres, le numéro de la ligne
et celui de la colonne. Ces deux paramètres commencent à zéro et possèdent une
valeur maximale inférieure de un à celle des propriétés ColumnCount et List-
Count. Si vous référencez la propriété List sans argument, vous pouvez copier un
tableau bidimensionnel de valeurs dans la propriété en une seule instruction.
La routine suivante montre comment utiliser les propriétés List et ColumnCount
pour initialiser un contrôle zone de liste :

Private Sub UserForm_Initialize()

Dim MaListe(10, 2) As String


Dim i As Long

MaListe(0, 0) = "Ligne"
MaListe(0, 1) = "Colonne A"
MaListe(0, 2) = "Colonne B"

For i = 1 To 10
MaListe(i, 0) = "#" & FormatNumber(i, 0)
MaListe(i, 1) = "A" & FormatNumber(i, 0)
MaListe(i, 2) = "B" & FormatNumber(i, 0)

Next i

ListBox1.ColumnCount = 3
ListBox1.List = MaListe

End Sub

La propriété Column peut servir à référencer une valeur de colonne ou de ligne


particulière. Si la propriété Column ne contient qu’un argument, vous pouvez
assigner les valeurs à la colonne spécifiée dans la liste. Notez que les numéros de
colonnes et de lignes constituent les arguments, soit l’ordre inverse par rapport à
la propriété List.
La méthode AddItem sert à ajouter un nouvel élément à la liste. En option, il est
possible de spécifier la ligne à laquelle insérer la nouvelle ligne (les lignes sont

443
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


numérotées en commençant à zéro). La méthode RemoveItem supprime la ligne
spécifiée de la liste. La méthode Clear supprime tous les éléments de la liste.
Chapitre 19

La propriété TopIndex contient l’index de la première ligne visible dans la liste.


La propriété ListIndex contient l’index de la ligne sélectionnée. Elle peut égale-
ment prendre la valeur –1, ce qui signifie qu’aucune ligne n’est actuellement
sélectionnée. L’événement Click est appelé lorsque l’utilisateur clique sur le con-
trôle. Cette routine affiche l’élément sélectionné dans la liste lorsque l’utilisateur
clique sur l’élément.

Private Sub ListBox1_Click()

MsgBox ListBox1.ListIndex

End Sub

Si la propriété MultiSelect est positionnée sur fmMultiSelectMulti, l’utilisateur


peut sélectionner plusieurs éléments de la liste en appuyant sur la barre d’espace
ou en cliquant sur l’élément désiré. La valeur fmMultiSelectExtended permet à
l’utilisateur de se servir des touche MAJ et CTRL pendant le processus de sélec-
tion. S’il maintient la touche MAJ enfoncée tout en déplaçant le pointeur de la
souris, il ajoute tous les éléments situés entre l’élément sélectionné et l’élément
qui se trouve sous le pointeur de la souris. La touche CTRL permet à l’utilisateur
de cliquer et de sélectionner plusieurs éléments non contigus. Si l’utilisateur relâ-
che les touches MAJ ou CTRL et clique sur un quelconque élément, la liste des
éléments sélectionnés est annulée et seul le dernier élément cliqué est sélec-
tionné.
Si le programme autorise la sélection de plusieurs éléments, servez-vous de la
propriété Selected associée au nombre de lignes pour déterminer l’état de chaque
ligne. Une valeur True signifie que la ligne est actuellement sélectionnée.
Si la propriété ListStyle prend la valeur fmListStylePlain, la liste des éléments
s’affiche comme une liste normale. Les éléments sélectionnés sont placés en sur-
brillance en modifiant la couleur d’arrière-plan de l’élément. La valeur fmList
StyleOption affiche des boutons d’option (MultiSelect=False) ou des cases à
cocher (MultiSelect=True) devant chaque ligne pour simplifier le processus de
sélection.
La propriété Text contient la valeur sélectionnée dans la liste. Si la liste se com-
pose de plusieurs colonnes, la propriété TextColumn identifie la colonne à enre-
gistrer dans la propriété Text.
La propriété MatchEntry détermine la recherche au sein du contrôle ListBox. La
valeur fmMatchEntryFirstLetter signifie que si l’utilisateur tape une lettre, la
recherche s’effectue dans la liste jusqu’à la première ligne qui contient le carac-
tère correspondant en première position. Si on appuie à nouveau sur le même
caractère, la recherche localise la deuxième occurrence de la lettre en tant que
premier caractère. La valeur fmMatchEntryComplete permet à l’utilisateur de
sélectionner la ligne en tapant le préfixe des caractères qui correspondent à

444
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


l’entrée recherchée. La valeur fmMatchEntryNone désactive la fonction de cor-
respondance.

Chapitre 19
Contrôle ComboBox
Le contrôle ComboBox (Zone de liste modifiable) est sans doute l’un des contrô-
les les plus complexes de Visual Basic. Il combine les fonctions des contrôles List-
Box et TextBox. Toutes les propriétés et méthodes que nous avons étudiées dans
la précédente section « Contrôle ListBox » s’appliquent également au contrôle
ComboBox.
La seule fonctionnalité du contrôle ListBox que le contrôle ComboBox ne prend
pas en charge est la possibilité de sélectionner plusieurs éléments dans une liste.
En conséquence, les propriétés MultiSelect et Selected ne sont pas disponibles
pour ce contrôle. En outre, les fonctionnalités relatives aux zones de texte à plu-
sieurs lignes ne sont pas présentes dans le contrôle ComboBox.
Par défaut, une zone de liste modifiable se compose d’un champ texte, dans
lequel l’utilisateur saisit des caractères, suivi d’un bouton déroulant qui affiche
une zone de liste contenant une liste de valeurs que l’on peut sélectionner. En
positionnant la propriété Style sur fmStyleDropDownList, vous empêchez l’utili-
sateur de saisir une valeur et l’obligez à choisir l’une des valeurs proposées dans
la liste déroulante. La valeur sélectionnée s’affiche dans la zone de texte.
Vous pouvez également spécifier quand le bouton déroulant s’affiche à l’extré-
mité du champ texte en définissant la propriété ShowDropButtonWhen. Voici les
valeurs possibles : fmShowDropButtonWhenNever, qui masque le bouton dérou-
lant, fmShowDropButtonWhenFocus, qui affiche le bouton uniquement lorsque
le contrôle a le focus, et fmShowDropButtonWhenAlways, qui signifie que le bou-
ton est toujours affiché.
Pour modifier le symbole affiché sur le bouton déroulant, servez-vous de la pro-
priété DropButtonStyle. Par défaut, ce bouton est équipé d’une flèche (fmDro-
pButtonStyleArrow). Vous pouvez également y afficher des points de suite (…)
avec fmDropButtonStyleEllipsis ou un caractère de soulignement (_) avec fmDro-
pButtonStyleReduce. Pour finir, vous pouvez laisser le bouton vide en choisissant
fmDropButtonStylePlain.
Si AutoSize prend la valeur True, le contrôle s’étend automatiquement pour
s’adapter à la ligne la plus longue, sinon, la liste déroulante est tronquée sur le

445
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


bord du contrôle. Pour contrôler la largeur de la liste déroulante, servez-vous de
la propriété ListWidth. Veillez à prévoir suffisamment de place pour une barre de
Chapitre 19

défilement verticale si vous spécifiez une valeur pour ListWidth.


La propriété MatchFound est positionnée sur True lorsque la valeur affichée dans
la partie zone de texte du contrôle correspond à l’un des éléments de la liste. Si la
propriété MatchRequired est positionnée sur True, l’utilisateur n’est pas habilité à
quitter le contrôle s’il n’a pas sélectionné d’entrée.

Contrôle RefEdit
Le contrôle RefEdit simplifie la sélection d’une plage de cellules dans un classeur.
L’utilisateur peut saisir la valeur de texte de la plage dans la zone de texte du con-
trôle. S’il clique sur le bouton qui se trouve à droite du contrôle, il dissimule la
feuille de sorte que seul le contrôle RefEdit soit visible et transfère le contrôle à
Excel. L’utilisateur peut alors sélectionner une plage de cellules qui s’affiche dans
la zone de texte. S’il appuie à nouveau sur le bouton, il restaure la feuille qui pré-
sente la plage sélectionnée dans la zone de texte.

Contrôle TabStrip
Le contrôle TabStrip (Onglet) propose une série de conteneurs de contrôles
comme le contrôle Frame, plus un mécanisme de sélection du conteneur. Il per-
met ainsi de placer plus de contrôles sur une feuille.
Chaque onglet constitue un objet indépendant du contrôle TabStrip. La collec-
tion Tabs retourne une collection d’objets Tab. La méthode Add de cette collec-
tion permet d’ajouter un nouvel objet Tab, la méthode Delete supprime un objet
Tab et la méthode Clear vide la collection. L’onglet sélectionné peut être directe-
ment référencé par le biais de la propriété SelectedItem du contrôle TabStrip.

446
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm


Chaque onglet contient des valeurs Name et Index uniques, qui servent à locali-
ser l’onglet dans la collection. La propriété Caption contient le texte affiché sur

Chapitre 19
l’onglet.
La propriété Style définit la manière dont les informations de l’onglet sont affi-
chées. Par défaut, sa valeur est fmTabStyleTabs, mais vous pouvez également
choisir fmTabStyleButtons pour afficher des boutons à la place des onglets. Pour
finir, vous pouvez choisir fmTabStyleNone de sorte qu’aucune information ne
s’affiche sur le contrôle.
Lorsque la propriété MultiRow est True, ce contrôle accepte plusieurs rangées
d’onglets. La propriété TabOrientation spécifie la position des onglets. Les choix
possibles sont : fmTabOrientationTop, fmTabOrientationBottom, fmTabOrienta-
tionLeft et fmTabOrientationRight.
Vous spécifiez la taille des onglets avec les propriétés TabFixedHeight et Tab-
FixedWidth. Si vous assignez la valeur 0 à ces propriétés, la taille des onglets
s’ajuste automatiquement au contenu ; sinon, la valeur indique la taille en points
de chaque onglet.
Vous exploiterez essentiellement ce contrôle au moment de la conception et
pour faire glisser les contrôles sur différents onglets. Pendant l’exécution, l’utili-
sateur clique sur le bouton approprié pour basculer sur l’onglet de son choix.
Pour ajouter ou supprimer des feuilles au contrôle TabStrip, cliquez droit sur le
contrôle et choisissez l’option appropriée dans le menu contextuel.

Astuce Programmation inutile


Ce contrôle ne nécessite aucune programmation. La seule fois où vous écrirez
du code pour un contrôle TabStrip sera pour permettre à l’utilisateur de bascu-
ler automatiquement d’un onglet à un autre comme résultat de l’interaction
avec l’un des contrôles d’un des onglets.

Contrôle Multipage
Le contrôle Multipage (Multipage) est similaire au contrôle TabStrip. Il possède
une collection d’objets Page qui correspondent directement avec les objets Tab.
La principale différence entre le contrôle TabStrip et le contrôle Multipage se
situe au niveau des propriétés et des méthodes, dont le deuxième possède une
bien plus grande collection. En fait, le contrôle Multipage contient la plupart des

447
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


propriétés et méthodes disponibles pour l’objet UserForm, comme la possibilité
d’afficher des barres de défilement et d’utiliser des images comme arrière-plan.
Chapitre 19

La propriété TransactionEffect associée à l’objet Page contrôle la représentation


visuelle lors du passage d’une page à une autre. Avec cette propriété, vous pouvez
demander à la nouvelle page de couvrir l’ancienne page horizontalement, verti-
calement ou en diagonale ou de « pousser » l’ancienne page vers le haut ou vers
le bas. La propriété TransitionPeriod définit la durée de l’effet de transition.

Dans ce chapitre, vous avez découvert les feuilles UserForm et les contrôles que
vous pouvez y placer. Les feuilles servent essentiellement à interagir avec l’utili-
sateur pour lui demander de saisir des informations ou d’afficher un résultat. Les
contrôles les plus courants sont les contrôles Label, TextBox et CommandButton.
Le premier affiche des informations à l’attention de l’utilisateur. Le deuxième
permet d’accepter des informations provenant de l’utilisateur, alors que le troi-
sième permet à l’utilisateur de demander à l’application d’effectuer une tâche.
Les autres contrôles disponibles pour l’objet UserForm offrent des moyens diffé-
rents de présenter les informations à l’utilisateur ou d’accepter des informations
fournies par l’utilisateur.

448
Partie 5 : Manipulation des objets Excel

Chapitre 20
Création de feuilles
UserForm avancées
Récupération de l’information . . 449 Conception d’un assistant
à plusieurs étapes . . . . . . . . . . . 463

Les feuilles UserForm constituent une partie essentielle de la programmation


Microsoft Excel en ce qu’elles offrent une surface entièrement sous votre con-
trôle pour interagir avec l’utilisateur. Il est ainsi possible de construire des appli-
cations Excel complexes. Les feuilles servent également à collecter et à vérifier les
informations émanant de l’utilisateur avant de les insérer dans une feuille de cal-
cul. Vous pouvez aussi les intégrer à une macro complémentaire pour proposer
des options et contrôler l’exécution d’une tâche spécifique. Dans ce chapitre,
vous allez apprendre à construire une feuille UserForm permettant à l’utilisateur
de saisir des données dans une feuille de calcul, ainsi qu’une macro qui invoque
un assistant à plusieurs étapes pour créer un graphique basé sur les sélections
effectuées par un utilisateur.

Récupération de l’information
Il est parfois contraignant de saisir des informations dans une feuille de calcul : il
est difficile de vérifier que les données sont valides, correctement mises en forme
et intégrées à l’emplacement approprié. Dans cet exemple, vous apprendrez à
construire une feuille simple qui accepte les données émanant d’un utilisateur et
les stocke dans une feuille de calcul.

Tour d’horizon de l’application


La feuille de calcul Excel employée dans cet exemple d’application enregistre six
informations relatives à un client de la société The Garden Company : Custome-
rId, Name, City, State, ZipCode et DateAdded (voir figure 20.1).
On démarre cette feuille en exécutant une macro. Elle reste ouverte jusqu’à ce
que l’utilisateur la ferme explicitement. Les boutons contrôlent la ligne de la
feuille de calcul affichée dans le module UserForm et ce dernier permet à l’utili-
sateur de saisir et de modifier les données stockées dans une ligne particulière.

449
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Sur le site Le code source complet de cet exemple est publié sur le site web
de Dunod, que vous trouverez à l’adresse www.dunod.fr. Lancez une recher-
che sur le titre du présent ouvrage (Excel VBA Au quotidien) pour accéder à ces
contenus. Le classeur employé dans ce chapitre se nomme FormApp.xls. Au
lieu de saisir manuellement le code de ce chapitre, chargez le fichier qui con-
tient également des exemples de données que vous pourrez exploiter dans
vos tests.
Chapitre 20

Figure 20-1. Une feuille de calcul simple suit les informations des clients,
comme leurs noms et adresses, ainsi que la date de leur ajout à la liste.

Concevoir une feuille


Dans la plupart des feuilles pilotées par les données, on place les champs sur une
colonne et les étiquettes en regard de chaque champ. Cette disposition simplifie
la recherche des informations au sein de la feuille. Pour certains champs, cepen-
dant, comme ceux qui font partie d’une adresse, il est préférable de les disposer
de manière plus intuitive, comme de placer les champs Adresse, Code Postal, et
Ville sur une même ligne.
Il est important de noter que le placement des champs sur la feuille est totale-
ment indépendant du code qui y accède. Si vous voulez disposer les champs en
cercle, cela ne gêne en rien votre code. Si ce fait peut sembler évident, le concept
a marqué le début de la révolution Microsoft Visual Basic.

450
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées

Astuce Exploitez ce qui fonctionne


À l’heure de concevoir des feuilles, examinez les différentes fenêtres et boîtes
de dialogue intégrées d’Excel et d’autres applications pour y trouver des idées.

Pour créer une feuille qui interagit avec l’utilisateur, servez-vous de la procédure
suivante :
1 Démarrez Visual Basic Editor et choisissez Insertion, UserForm. Vous
créez ainsi un objet UserForm dans votre application.

Chapitre 20
2 Depuis la Boîte à outils, faites glisser un contrôle TextBox (Zone de texte)
et un contrôle Label (Intitulé) pour chaque colonne de la feuille de calcul.
Faites glisser un contrôle ComboBox (Zone de liste modifiable) pour y
placer la liste des états. Ajustez éventuellement la taille de la feuille pour y
placer les contrôles.

Astuce Double-cliquez pour gagner du temps


Pour ajouter plusieurs exemplaires d’un même contrôle à une feuille, double-
cliquez sur le contrôle dans la Boîte à outils. Le pointeur de la souris change
de forme pour refléter le contrôle sélectionné. Dessinez ensuite le contrôle sur
la feuille autant de fois que nécessaire. Lorsque vous avez terminé, recom-
mencez l’opération pour un autre contrôle ou cliquez sur la flèche de la Boîte
à outils pour revenir au pointeur normal.

3 Servez-vous de la fenêtre Propriétés pour changer la propriété Name de


chaque zone de texte et refléter les noms des champs de la base de données
(CustomerId, CustomerName, City, ZipCode et DateAdded). Rempla-
cez la propriété Name du contrôle ComboBox par State. Remplacez égale-
ment la propriété Caption de chaque contrôle Label par un nom plus
descriptif (voir figure 20.2).

451
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 20

Figure 20-2. Ajoutez des contrôles TextBox et Label pour chaque colonne de la
feuille de calcul et modifiez leurs propriétés comme décrit.

4 Ajoutez des contrôle CommandButton (Bouton de commande) à la feuille


pour permettre à l’utilisateur de parcourir les lignes. Remplacez leurs pro-
priétés Caption par First, Prev, Next et Last. Laissez de la place entre les
contrôles Previous et Next.

Astuce Les contrôles sont libres de bouger


Une fois qu’un contrôle se trouve sur la feuille, vous pouvez le sélectionner et
le déplacer à votre guise au sein de la feuille. Pour déplacer simultanément
plusieurs contrôles, sélectionnez-les en cliquant puis en faisant glisser le poin-
teur de la souris. Déplacez ensuite le groupe à votre convenance.

5 Ajoutez un contrôle TextBox (Zone de texte) entre les boutons Prev et


Next. Remplacez sa propriété Name par RowNumber. Positionnez la pro-
priété Text sur 2.
6 Ajoutez trois autres contrôles CommandButton. Remplacez la propriété
Caption du premier par Save, du second par Cancel et du troisième par
Add.
7 Positionnez la propriété Enabled des contrôles CommandButton Save et
Cancel sur False.
8 Une fois tous les contrôles ajoutés, ajustez leurs tailles et positions sur la
feuille pour obtenir une disposition qui vous convient (voir figure 20.3).

452
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées

Chapitre 20
Figure 20-3. Finition de la mise en forme.

Afficher les données


Maintenant que la feuille est construite, copions les données depuis la feuille de
calcul vers la feuille. La zone de texte RowNumber contient le numéro de la ligne
qui doit s’afficher sur la feuille. Il faut donc convertir la valeur qui se trouve dans
cette zone de texte en une valeur que l’on peut utiliser pour extraire les données
de la zone de texte avec la méthode Cells.
Le programme suivant exploite la routine GetData, qui se trouve dans le module
associé à la feuille. GetData copie les données à partir de la feuille de calcul active
vers la feuille. Après avoir déclaré une variable temporaire r qui conserve la ligne
en cours, la routine vérifie que la valeur qui se trouve dans le contrôle RowNum-
ber est numérique. Cette étape est importante puisque l’utilisateur peut taper
n’importe quelle valeur dans ce champ.

Private Sub GetData()

Dim r As Long

If IsNumeric(RowNumber.Text) Then
r = CLng(RowNumber.Text)

Else
ClearData
MsgBox "Illegal row number"
Exit Sub

End If

If r > 1 And r <= LastRow Then

453
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


CustomerId.Text = FormatNumber(Cells(r, 1), 0)
CustomerName.Text = Cells(r, 2)
City.Text = Cells(r, 3)
State.Text = Cells(r, 4)
Zip.Text = Cells(r, 5)
DateAdded.Text = FormatDateTime(Cells(r, 6), vbShortDate)

DisableSave

ElseIf r = 1 Then
ClearData
Chapitre 20

Else
ClearData
MsgBox "Invalid row number"

End If

End Sub

Sachant que RowNumber contient une valeur numérique, la fonction CLng con-
vertit la valeur de la variable RowNumber dans la variable r. Le reste du code uti-
lise r pour extraire les informations de la ligne appropriée et les copie dans le
champ approprié. Sinon, une boîte de message s’affiche pour indiquer à l’utilisa-
teur que la valeur du numéro de ligne n’est pas valide. La routine ClearData assi-
gne une chaîne vide à chaque champ de la feuille pour vider toutes les valeurs
déjà affichées dans la feuille (rappelez-vous que le contrôle ComboBox ne peut
pas prendre pour valeur une chaîne vide et doit être positionné sur une valeur
d’état valide).

Private Sub ClearData()

CustomerId.Text = ""
CustomerName.Text = ""
City.Text = ""
State.Text = "AK"
Zip.Text = ""
DateAdded.Text = ""

End Sub

Le fait que le numéro de ligne soit une valeur numérique ne signifie pas que l’on
peut sans risque passer le numéro à la méthode Cells. Vous pouvez ajouter la
constante LastRow au début du module UserForm, comme dans la ligne de code
suivante, pendant que vous testez cette routine (plus loin dans ce chapitre, nous
verrons comment déterminer la dernière ligne de données dans une feuille de
calcul et vous convertirez cette constante en une variable de module).

Const LastRow = 20

Avec cette valeur, vous pouvez vérifier que le numéro de ligne se trouve toujours
dans la plage 2 à LastRow, vous assurant ainsi que la valeur qui se trouve dans r
pointe toujours vers une ligne valide de la feuille de calcul.

454
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


Rappelez-vous que nous devons gérer la valeur 1 comme un cas spécial, puisqu’il
est possible que l’utilisateur ait saisi 1 dans la zone de texte RowNumber, comme
faisant partie d’un numéro de ligne commençant par 1 tel que 12 ou 123, par
exemple. La manière la plus simple de gérer ce problème consiste à vider la feuille
en appelant ClearData sans émettre de message d’erreur.
Remarquez que la routine FormatNumber sert à convertir la valeur de la pre-
mière colonne en nombre au lieu d’assigner simplement la valeur au contrôle
zone de texte. Cette technique garantit que la valeur est correctement formatée
dans le champ.

Chapitre 20
Le même argument s’applique aux données de date de la sixième colonne. La
fonction FormatDateTime assure que les données sont correctement mises en
forme. Cette fonction n’est pas indispensable, mais elle permet de se rappeler
que l’on ne traite pas des données texte.
Une fois les données chargées dans la feuille, on désactive les boutons Save et
Cancel en appelant la routine DisableSave. Ces boutons sont activés uniquement
lorsque l’utilisateur modifie une information au sein de la feuille.

Private Sub DisableSave()

CommandButton5.Enabled = False
CommandButton6.Enabled = False

End Sub

Pour attacher la routine GetData à la feuille, basculez de la fenêtre de code à celle


de la représentation graphique de la feuille. Double-cliquez sur le contrôle Row-
Number pour revenir à la fenêtre de code, à une exception près : le curseur est
placé au centre d’une nouvelle routine intitulée RowNumber_Change.
Au sein de ce nouvel événement, ajoutez un appel à la routine GetData. Ainsi,
chaque fois que les données du contrôle RowNumber changent, les données affi-
chées dans la feuille sont mises à jour.

Private Sub RowNumber_Change()

GetData

End Sub

Pour tester la routine, choisissez Exécution, Exécuter Sub/UserForm ou appuyez


sur la touche F5. Saisissez un numéro de ligne dans le contrôle RowNumber. Vous
noterez que les données de la ligne appropriée s’affichent. Remarquez également
qu’il est impossible de saisir une valeur erronée sans générer un message
d’erreur.

455
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Parcourir la feuille de calcul


Si vous cliquez sur l’un des quatre boutons de navigation, la valeur de la zone de
texte RowNumber s’ajuste automatiquement. Ensuite, dans la mesure où la
valeur de RowNumber a changé, l’événement RowNumber_Change se déclenche
et la ligne affichée est mise à jour.
Chacun des quatre boutons représente une situation légèrement différente. Le
code du bouton First est le plus simple puisqu’une simple instruction d’assigna-
tion suffit à positionner RowNumber sur 2. À l’instar de la zone de texte Row-
Chapitre 20

Number, la manière la plus simple d’éditer le code de l’événement approprié est


de double-cliquer sur le contrôle graphique. Visual Basic Editor ajoute automa-
tiquement l’événement et vous n’avez plus qu’à saisir la ligne de code pour le
compléter.

RowNumber.Text = "2"

Astuce Testez au fur et à mesure


À mesure que vous créez le code de chaque bouton, prenez le temps d’exécu-
ter le programme pour voir le résultat. Visual Basic offre l’avantage de vous
permettre de tester rapidement vos programmes. Il est plus simple de débo-
guer les 5 ou 10 lignes de code que vous venez d’ajouter que quelques centai-
nes de lignes.

Les boutons Prev et Next sont peu plus complexes puisqu’il faut calculer la valeur
de la ligne précédente et de la ligne suivante en fonction de la valeur de la ligne en
cours. À l’instar de la routine GetData, celle du prochain listing commence par
vérifier que la valeur contenue dans RowNumber est numérique.

Private Sub CommandButton2_Click()

Dim r As Long

If IsNumeric(RowNumber.Text) Then
r = CLng(RowNumber.Text)

r = r – 1
If r > 1 And r <= LastRow Then
RowNumber.Text = FormatNumber(r, 0)

End If

End If

End Sub

Une fois que la routine détient une valeur numérique, elle calcule la nouvelle
position en soustrayant 1 (ou en ajoutant 1 pour trouver la ligne suivante). Pour
finir, si le numéro de ligne résultant se trouve dans la plage 2 à LastRow–1, la
valeur est enregistrée dans la zone de texte RowNumber. L’affectation déclenche

456
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


l’événement Change du contrôle RowNumber et la nouvelle information est
chargée.
Passer à la dernière ligne est un peu plus difficile. En effet, le concept de dernière
ligne est assez trouble. Après tout, ce n’est pas parce qu’une feuille de calcul est
capable de gérer 65 536 lignes de données qu’un utilisateur de cette application
souhaite afficher autant de lignes. Il est préférable d’examiner la feuille de calcul
pour découvrir la dernière ligne contenant une valeur dans la première colonne
et la traiter en tant que dernière ligne.
Pour rendre la dernière ligne dynamique, vous devez modifier un peu le pro-

Chapitre 20
gramme. Pour commencer, convertissez la constante LastRow en variable :

Public LastRow As Long

Assignez ensuite une valeur initiale à la constante lorsque la feuille est chargée.
Pour ce faire, vous disposez de deux possibilités : la manière la plus simple con-
siste à assigner un numéro de ligne valide, comme 3, et d’appeler GetData pour
récupérer les valeurs initiales dans la feuille. Servez-vous du code suivant pour
créer l’événement UserForm_Initialize.

Private Sub UserForm_Initialize()

GetData

End Sub

Si les utilisateurs souhaitent afficher la dernière ligne de la feuille, ils doivent cli-
quer sur le bouton Last. Il existe plusieurs manières de localiser la dernière ligne
en réponse à un clic de l’utilisateur sur le bouton Last. Une solution serait de par-
courir toutes les données à la recherche de la première cellule vide dans une
colonne chaque fois qu’un utilisateur clique sur le bouton Last.
Il existe une meilleure solution : parcourir la feuille de calcul et localiser la pre-
mière cellule vide de la colonne 1 et assigner la valeur à LastRow, ce que fait la
routine du prochain listing. Cette routine se trouve dans le module UserForm :

Private Function FindLastRow()

Dim r As Long

r = 2
Do While r < 65536 And Len(Cells(r, 1).Text) > 0
r = r + 1

Loop

FindLastRow = r

End Function

457
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


La fonction FindLastRow parcourt la feuille de calcul à la recherche de la pre-
mière cellule ne contenant pas de valeur. Une simple boucle While itère dans cha-
que cellule de la colonne 1 de la feuille de calcul et la longueur de la valeur
retournée est testée pour vérifier si elle est égale à zéro. Si tel est le cas, la boucle
s’arrête et r pointe vers la dernière ligne de la feuille de calcul, autrement dit la
première ligne vide qui suit les données.
On peut ensuite définir la variable LastRow en ajoutant la ligne suivante à l’évé-
nement UserForm_Initialize.
Chapitre 20

LastRow = FindLastRow

La fonction FindLastRow peut également servir dans l’événement associé au


bouton Last pour actualiser la variable LastRow ainsi que la valeur du contrôle
RowNumber.

Private Sub CommandButton4_Click()

LastRow = FindLastRow - 1
RowNumber.Text = FormatNumber(LastRow, 0)

End Sub

Modifier les données


Pour l’instant, vous pouvez afficher toutes les lignes de données de la feuille de
calcul, mais les changements apportés aux données dans la feuille UserForm ne
sont pas enregistrés dans la feuille de calcul. Les techniques pour y parvenir sont
nombreuses. En voici toutefois une qui devrait fonctionner parfaitement.
Dans cette approche, les données affichées sur la feuille sont séparées des cellules
de la feuille de calcul jusqu’à ce que l’utilisateur clique explicitement sur le bou-
ton Save ou le bouton Cancel. S’il clique sur le bouton Save, il faut copier les don-
nées de la feuille vers la feuille de calcul, alors que s’il clique sur le bouton Cancel,
on doit recharger les données de la feuille de calcul et écraser les changements
apportés dans la feuille par l’utilisateur. Les boutons Save et Cancel doivent être
désactivés tant que l’utilisateur n’a pas modifié les données de la feuille.
La manière la plus simple de désactiver ces boutons est de positionner leur pro-
priété Enabled sur False, puis de lui attribuer la valeur True lorsque les valeurs de
champs changent. Vous pouvez limiter la tâche à la création de deux sous-routi-
nes, l’une intitulée EnableSave et l’autre DisableSave, pour activer et désactiver
les boutons de commande associés aux boutons Save et Cancel. Ensuite, dans
l’événement Change associé aux zones de texte qui contiennent les données,
ajoutez un appel à la sous-routine EnableSave. Avec ce paramètre, toute modifi-
cation des données marque l’ensemble des données de la feuille comme
« impropres » pour signaler qu’elles sont différentes de celles de la feuille de cal-
cul.

458
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


Si on charge les données directement à partir de la source, elles sont considérées
comme « propres ». En conséquence, les boutons Save et Cancel doivent appeler
la routine DisableSave. Cet appel doit être placé après que les données sont char-
gées sur la feuille puisqu’il est possible que l’utilisateur n’ait pas saisi de numéro
de ligne valide et que GetData n’ait pas chargé de données.
La routine PutData qui se trouve dans le module UserForm (présentée dans le
prochain listing) est similaire à la routine GetData en ce que toutes les valida-
tions employées pour s’assurer que la valeur de RowNumber est correcte sont
comprises. La principale différence entre les deux routines est que GetData copie

Chapitre 20
les informations à partir de la feuille de calcul, alors que PutData copie les don-
nées sur la feuille de calcul.

Private Sub PutData()

Dim r As Long

If IsNumeric(RowNumber.Text) Then
r = CLng(RowNumber.Text)

Else
MsgBox "Illegal row number"
Exit Sub

End If

If r > 1 And r < LastRow Then


Cells(r, 1) = CustomerId.Text
Cells(r, 2) = CustomerName.Text
Cells(r, 3) = City.Text
Cells(r, 4) = State.Text
Cells(r, 5) = Zip.Text
Cells(r, 6) = DateAdded.Text

DisableSave

Else
MsgBox "Invalid row number"

End If

End Sub

La vérification d’erreur n’est pas indispensable, mais elle est préférable pour le
cas où l’utilisateur saisirait une valeur non valide dans la zone de texte RowNum-
ber ou bascule dans une autre application avant de revenir à cette application.
Dans ce scénario, il est possible de saisir une valeur différente dans la zone de
texte RowNumber sans retrouver aucune donnée.
Remarquez qu’après l’enregistrement des données dans la feuille de calcul, on
appelle la routine DisableSave. En effet, les données de la feuille sont à présent les
même que celles stockées dans la feuille de calcul.

459
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA

Ajouter des données


Un clic sur le bouton Add appelle l’événement CommandButton7_Click qui affi-
che la première ligne vide à la fin de la feuille de calcul. Dans la mesure où la
variable LastRow pointe vers cette ligne, il suffit de positionner la propriété Text
du contrôle RowNumber sur cette valeur en se servant du code suivant :

Private Sub CommandButton7_Click()

RowNumber.Text = FormatNumber(LastRow, 0)
Chapitre 20

End Sub

Valider les données


À présent, la feuille est entièrement capable de récupérer des données émanant
de l’utilisateur et de les insérer dans la feuille de calcul. Elle permet également à
l’utilisateur de modifier les valeurs stockées dans la feuille de calcul. Il nous reste
encore à valider les données saisies.
Il est, par exemple, possible de saisir une date non valide dans le champ DateAd-
ded. En outre, le code ne vérifie pas que la valeur de CustomerId est numérique.
Pour finir, il est possible de saisir un code d’état de deux lettres erroné. Il existe
plusieurs techniques permettant de vérifier que les données saisies sont valides
avant qu’elles n’atteignent la feuille de calcul.
La première solution implique l’utilisation de l’événement KeyPress pour vérifier
que l’utilisateur peut uniquement saisir un type particulier d’information. Par
exemple, vous pouvez obliger l’utilisateur à saisir uniquement des nombres dans
le contrôle CustomerId avec le code suivant :

Private Sub CustomerId_KeyPress(ByVal KeyAscii As


MSForms.ReturnInteger)

If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then


KeyAscii = 0

End If

End Sub

Astuce Définir les événements


En double-cliquant sur le contrôle CustomerId dans la feuille UserForm, vous
affichez automatiquement l’événement CustomerId_Change. Si l’événement
n’existe pas, Visual Basic le crée. Pour gérer un autre événement, sélection-
nez son nom dans la liste déroulante qui se trouve dans la partie supérieure
droite de la fenêtre de code : Visual Basic Editor crée automatiquement un
événement vide accompagné des paramètres appropriés.

460
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


Une autre solution consiste à employer l’événement Exit. Vous pouvez détermi-
ner si l’utilisateur a commis une erreur et mettre en évidence l’arrière-plan du
contrôle pour informer visuellement l’utilisateur de l’erreur dans l’événement
Exit associé au contrôle. Vous pouvez également afficher une boîte de message
contenant une description de l’erreur avec un code similaire à celui-ci :

Private Sub DateAdded_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Not IsDate(DateAdded.Text) Then


DateAdded.BackColor = &HFF&

Chapitre 20
MsgBox "Illegal date value"
Cancel = True

Else
DateAdded.BackColor = &H8000000F

End If

End Sub

L’événement Exit possède une fonctionnalité intéressante : si on positionne son


argument Cancel sur True, l’utilisateur ne peut pas passer le focus à un autre con-
trôle tant que la zone de texte ne contient pas une date correcte.
Rappelez-vous que vous devez également définir la couleur d’arrière-plan sur
Fond de la fenêtre (&H8000000F) en cas d’erreur pour réinitialiser toutes les
conditions d’erreur antérieures. Pour ce faire, on utilise la clause Else.
La dernière technique employée dans cette application évite les erreurs en rem-
plaçant un contrôle zone de texte par un contrôle zone de liste modifiable pour
State. L’utilisateur étant limité aux choix de la liste, il devient impossible de saisir
des données non valides.
On a défini la propriété MatchRequired du contrôle ComboxBox sur True pour
empêcher l’utilisateur de quitter le contrôle si l’entrée ne correspond pas à l’une
des valeurs de List. Pour s’assurer qu’une valeur correcte est sélectionnée, on
peut également positionner la propriété Style de la zone de liste modifiable sur
fmStyleDropDownList, qui oblige le contrôle à fonctionner comme une zone de
liste, dans laquelle l’utilisateur peut uniquement choisir une valeur dans la liste
de valeurs spécifiée au lieu de saisir une valeur qui ne s’y trouve pas.
Quel que soit le cas, on a besoin d’une routine comme AddStates pour initialiser
la zone de liste modifiable. Cette routine est appelée par l’événement Initialize de
la feuille UserForm.

Sur le site Vous trouverez la liste complète des états dans la routine Add
States de l’exemple de programme.

Private Sub AddStates()

State.AddItem "AK"
State.AddItem "AL"

461
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


State.AddItem "AR"
State.AddItem "AZ"

End Sub

Pour plus d’informations sur la validation des données, reportez-vous à la section


« Validation des données », au chapitre 8.

Afficher la feuille UserForm


Pour la dernière étape de ce processus, nous devons créer une macro simple qui
Chapitre 20

affiche la feuille UserForm. Pour notre exemple, il suffit d’ajouter la sous-routine


suivante à l’objet ThisWorkbook dans Visual Basic Editor. Chaque fois qu’un uti-
lisateur souhaite employer cette feuille, il lui suffit d’exécuter la macro.

Public Sub ShowForm()

UserForm1.Show vbModal

End Sub

Comme l’implique la valeur vbModal, une fois que la feuille est affichée, il reste à
l’écran, empêchant l’utilisateur d’accéder à la feuille de calcul Excel qui se trouve
en dessous. S’il est important d’autoriser l’accès à la feuille de calcul, remplacez
la valeur vbModal par la valeur vbModeless. L’utilisateur pourra basculer entre la
feuille UserForm et la feuille de calcul (voir figure 20.4).

Figure 20-4. L’utilisateur peut basculer entre la feuille UserForm et Excel si la


feuille est affichée sans mode.

462
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées

Attention Utilisez vbModeless avec prudence. Dans cet exemple, permettre


à l’utilisateur d’accéder à la feuille de calcul sous-jacente l’autorise également
à changer les données affichées dans la feuille UserForm. Si cela se produit et
que l’utilisateur clique sur le bouton Save, toute modification qu’il a directe-
ment apportée à la ligne sera perdue.

Conception d’un assistant à plusieurs étapes


L’autre exemple de ce chapitre explique comment concevoir un assistant en plu-

Chapitre 20
sieurs étapes invoqué à partir des menus d’Excel. Cet exemple fournit la struc-
ture autour de laquelle vous pourrez développer vos propres assistants.

Tour d’horizon de l’application


L’assistant de cet exemple se contente de collecter des informations en plusieurs
étapes et de les synthétiser dans la dernière étape. L’étape 1 de l’assistant (voir
figure 20.5) propose à l’utilisateur de choisir entre quatre options matérialisées
par des contrôles OptionButton imbriqués dans un contrôle Frame. Remarquez
que le bouton Prev est désactivé puisqu’il s’agit de la première étape de l’assis-
tant.

Figure 20-5. L’étape 1 de l’assistant permet à l’utilisateur de faire un choix


entre plusieurs options matérialisées par des contrôles OptionButton.

Dans l’étape 2 de l’assistant, l’utilisateur saisit des valeurs dans deux zones de
texte (voir figure 20.6), également intégrées dans un contrôle Frame qui permet
des fournir des informations à l’utilisateur.

463
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 20

Figure 20-6. À l’étape 2 de l’assistant, l’utilisateur peut saisir des


informations dans plusieurs zones de texte.

Dans la dernière étape de l’assistant, l’utilisateur peut revoir les choix qu’ils a
effectués dans les précédentes étapes (voir figure 20.7). Le bouton Next est
désactivé puisqu’il s’agit de la dernière étape. Pour terminer l’assistant, l’utilisa-
teur clique sur le bouton Cancel ou sur le bouton Finish.

Sur le site Le code source complet de cet exemple est publié sur le site web
de Dunod, à l’adresse www.dunod.fr. Lancez une recherche sur le titre du pré-
sent ouvrage (Excel VBA Au quotidien) pour accéder à ces contenus. Le clas-
seur employé dans ce chapitre se nomme WizardApp.xls.

Figure 20-7. L’étape 3 de l’assistant permet à l’utilisateur de revoir ses choix


avant de cliquer sur Finish.

Gérer les menus


La première étape de la construction de cette application consiste à intercepter
l’événement Open du classeur pour ajouter le bouton de menu nécessaire. Cela
signifie également que l’événement BeforeClose doit supprimer le bouton de
menu.
Dans l’événement Workbook_Open de ce module ThisWorkbook (voir listing sui-
vant), on a ajouté un bouton de barre de commandes au menu Outils. La pre-
mière étape consiste à localiser la barre de menus Feuille de calcul dans la
collection Application.CommandBars. Une fois qu’on a trouvé la barre de com-

464
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


mandes appropriée, on localise le contrôle contextuel du menu Outils. Pour
finir, on ajoute un nouveau bouton de commande à la fin du contrôle contextuel.

Private Sub Workbook_Open()

Dim c As CommandBar
Dim cb As CommandBarButton
Dim cp As CommandBarPopup

On Error Resume Next


Set c = Application.CommandBars("Worksheet Menu Bar")

Chapitre 20
If Not c Is Nothing Then
Set cp = c.Controls("&Tools")

If Not cp Is Nothing Then


Set cb = cp.Controls.Add(msoControlButton)
cb.Tag = "Excel 2k3 WizardApp"
cb.Style = msoButtonCaption
cb.Caption = "Excel 2k3 Wizard"
cb.OnAction = "ThisWorkbook.RunWizard"

End If

End If

End Sub

Le nouveau bouton de commande déclenche la sous-routine ThisWork-


book.RunWizard lorsque l’utilisateur clique dessus. La routine RunWizard se
contente alors d’afficher la feuille UserForm de l’assistant à l’aide d’une ligne de
code.

Public Sub RunWizard

UserForm1.Show vbModal

End Sub

Remarquez que la propriété Tag de la routine Workbook_Open est positionnée


sur une valeur unique, ce qui simplifie la suppression du bouton dans l’événe-
ment Workbook_BeforeClose (voir listing suivant).

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim c As CommandBar
Dim cb As CommandBarButton

On Error Resume Next


Set c = Application.CommandBars("Worksheet Menu Bar")
If Not c Is Nothing Then
Set cb = c.FindControl(, , "Excel 2k3 WizardApp", , True)
Do While Not cb Is Nothing
cb.Delete
Set cb = c.FindControl(, , "Excel 2k3 WizardApp", , True)

465
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Loop

End If

End Sub

Le code de l’événement Workbook_BeforeClose est probablement plus complexe


que nécessaire, mais il garantit que tout bouton associé à l’application de l’assis-
tant sera supprimé. Le code localise le premier contrôle qui contient Excel 2k3
Wizard App dans la propriété Tag avec la méthode FindControl. Il entre ensuite
dans une boucle While qui supprime ce contrôle et recherche le prochain con-
Chapitre 20

trôle possédant la même valeur Tag.

Construire la feuille UserForm


Puisque l’assistant présente plusieurs feuilles d’informations, il est naturel
d’employer un contrôle Multipage. Celui-ci possède plusieurs propriétés qui en
font l’outil idéal dans cette situation. Pour commencer, le contrôle Multipage
contient un certain nombre d’objets Page.

Pour plus d’informations sur le contrôle Multipage et les objets Page, reportez-vous au
chapitre 19 « Création de feuilles UserForm ».

Chaque objet Page est un conteneur de contrôles, ce qui signifie que vous pouvez
placer plusieurs contrôles sur chaque page et y accéder comme s’ils étaient direc-
tement placés sur la feuille. L’avantage réel du contrôle Multipage repose sur sa
capacité à basculer d’une page à une autre en actualisant la propriété Value.
Autrement dit, vous pouvez préparer un objet Page pour chaque étape de l’assis-
tant, puis afficher l’objet qui correspond à l’étape appropriée de l’assistant.
Pour manœuvrer entre les quatre étapes de l’assistant, vous devez ajouter quatre
contrôles CommandButton dans la partie inférieure de la feuille. Ces contrôles se
trouvant en-dehors du contrôle Multipage, ils apparaissent à chaque étape de
l’assistant. Positionnez les propriétés Caption des boutons sur Cancel, < Prev,
Next > et Finish.
Puisque l’assistant comporte trois étapes, vous devez ajouter une troisième page.
Cliquez droit sur la zone des onglets et sélectionnez Nouvelle Page dans le menu
contextuel. Vous ajoutez ainsi un nouvel objet Page au contrôle Multipage (voir
figure 20.8). Remplacez ensuite la propriété Caption des pages par Step 1, Step 2
et Step 3.

466
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées

Chapitre 20
Figure 20-8. Cliquez droit sur la zone des onglets et sélectionnez Nouvelle
page dans le menu contextuel pour ajouter une page au contrôle Multipage.

Parcourir les pages


Les quatre boutons qui se trouvent dans la partie inférieure de la page consti-
tuent l’outil de navigation principal de l’assistant. Si on clique sur le bouton
Cancel, on déclenche l’événement CommandButton1_Click qui exécute l’ins-
truction End pour arrêter le programme. Si on clique sur les boutons Prev et
Next, l’assistant avance ou recule d’une étape. Le bouton Finish représente la
seule manière de déclencher l’exécution finale de l’assistant.

Private Sub CommandButton1_Click()

End

End Sub

Lorsque l’utilisateur clique sur le bouton Prev, l’événement associé au contrôle


de la feuille dans le listing suivant s’exécute. Le code calcule la nouvelle page à
afficher en soustrayant 1 de la page en cours par le biais de la propriété Value. Si
le numéro de la nouvelle page est supérieur ou égal à zéro, on assigne le numéro
de la nouvelle page à la propriété Value. Dans le cas contraire, le clic est ignoré.

Private Sub CommandButton2_Click()

Dim i As Long

i = MultiPage1.Value - 1

467
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


If i >= 0 Then
MultiPage1.Value = i

End If

End Sub

Le bouton Next utilise un code similaire, mais il incrémente la propriété Value


du contrôle Multipage et vérifie qu’elle est inférieure à MultiPage1.Pages.Count.

Private Sub CommandButton3_Click()


Chapitre 20

Dim i As Long

i = MultiPage1.Value + 1

If i < MultiPage1.Pages.Count Then


MultiPage1.Value = i

End If

End Sub

Outre les boutons Prev et Next, l’utilisateur peut sélectionner directement l’une
des étapes de l’assistant en cliquant sur les onglets dans la partie supérieure du
contrôle Multipage. Pour masquer ces onglets, positionnez la propriété Style du
contrôle Multipage sur fmTabStyleNone.

Astuce Trouver les contrôles masqués


Si un contrôle est masqué dans une feuille et que vous voulez modifier l’une
de ses propriétés, sélectionnez-le dans la liste déroulante des contrôles qui se
trouve dans la partie supérieure de la fenêtre Propriétés.

Chaque fois que la propriété Value du contrôle Multipage change, l’événement


Change du contrôle se déclenche. L’événement MultiPage1_Change, qui se
trouve dans le module UserForm, constitue le cœur du contrôle de l’assistant.
Chaque valeur de page possible est testée et le code approprié à la page exécuté.

Private Sub MultiPage1_Change()

If MultiPage1.Value = 0 Then
CommandButton2.Enabled = False
CommandButton3.Enabled = True
UserForm1.Caption = "Wizard App - Step 1 of 3"

ElseIf MultiPage1.Value = 1 Then


CommandButton2.Enabled = True
CommandButton3.Enabled = True
UserForm1.Caption = "Wizard App - Step 2 of 3"

ElseIf MultiPage1.Value = 2 Then


CommandButton2.Enabled = True

468
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


CommandButton3.Enabled = False
UserForm1.Caption = "Wizard App - Step 3 of 3"
GenerateOptions

Else
MsgBox "Error: invalid page value"

End If

End Sub

Pour la première page (Value = 0), le bouton Prev est désactivé, le bouton Next

Chapitre 20
est activé et la propriété Caption de la feuille est mise à jour pour indiquer qu’il
s’agit de la première étape de l’assistant. Le bouton Prev est désactivé puisqu’il est
impossible de revenir avant la première étape. Si l’utilisateur souhaite arrêter
l’assistant, il lui suffit de cliquer sur le bouton Cancel.
Sur la deuxième page (Value = 1), les boutons Prev et Next sont activés, puisque
l’utilisateur peut opter pour l’un ou l’autre choix. La propriété Caption de la
feuille est également mise à jour.
Sur la dernière page (Value = 2), on désactive le bouton Next, puisqu’il s’agit de
la dernière étape. Contrairement aux autres étapes de l’assistant, une ligne de
code supplémentaire prépare les informations de la feuille avant de les présenter
à l’utilisateur. Un appel à GenerateOptions effectue la tâche nécessaire.
Si la propriété Value ne correspond pas à l’une des pages associées aux étapes de
l’assistant, une boîte de message s’affiche pour signaler une erreur. En théorie, ce
message ne devrait jamais s’afficher. Dans la pratique, il peut être particulière-
ment intéressant à l’heure de déboguer la logique de navigation.

Collecter les options de l’assistant


Maintenant que la structure d’exécution de l’assistant est en place, il est temps de
vous montrer comment collecter des informations émanant de l’utilisateur. Ces
procédures montrent quelques-unes des méthodes à votre disposition. Vous
devez déterminer le type d’informations que l’assistant doit collecter pour lui
assigner sa tâche.
Dans la première étape de l’assistant, un contrôle Frame encadre un jeu de quatre
contrôles OptionButton (voir figure 20.9). L’utilisateur peut ainsi choisir l’une
des quatre options sans programmation.

469
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 20

Figure 20-9. Un contrôle Frame entoure un jeu de contrôles OptionButton.

Dans la deuxième étape de l’assistant, un autre contrôle Frame sert à donner une
apparence cohérente par rapport à l’étape 1. Dans le cadre, deux contrôles Label
et TextBox permettent de capturer d’autres informations (voir figure 20.10). Les
zones de texte sont intitulées Header et Footer en correspondance avec les légen-
des des intitulés placés en regard.

470
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées

Chapitre 20
Figure 20-10. Un contrôle Frame encadre une collection de contrôles Label et
TextBox.

Dans la dernière étape de l’assistant (voir figure 20.11), un autre contrôle Frame
sert de conteneur à une zone de texte appelée Review. On a positionné la pro-
priété Multiline de zone de texte sur True et sa propriété BackColor sur
&H8000000F, ce qui correspond à la couleur de fond de la feuille. Cette zone
indique à l’utilisateur que les données de la zone de texte ne peuvent pas être
modifiées.

471
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


Chapitre 20

Figure 20-11. La zone de texte Final Review présente un récapitulatif des


options sélectionnées.

Pour empêcher l’utilisateur de modifier des informations dans la zone de texte


Final Review, on a utilisé l’événement Review_KeyPress pour supprimer tout
caractère saisi. Le fait de positionner l’argument KeyAscii sur zéro signifie que
tout caractère sur lequel l’utilisateur appuie ne sera pas ajouté à la zone de texte.

Private Sub Review_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

KeyAscii = 0

End Sub

Synthétiser les options


La routine GenerateOptions (présentée dans le prochain listing) combine les
informations collectées dans les étapes précédentes de l’assistant et les présente à
l’utilisateur. Cette routine se trouve dans le module UserForm. Rappelez-vous
que cette routine accède aux contrôles placés sur les autres pages du contrôle
Multipage comme s’ils se trouvaient directement sur la feuille UserForm.

Private Sub GenerateOptions()

Review.Text = "Header: " & Header.Text & vbCrLf

If OptionButton1.Value Then
Review.Text = Review.Text & "Option 1 was selected"

ElseIf OptionButton2.Value Then


Review.Text = Review.Text & "Option 2 was selected"

472
Partie 5 : Manipulation des objets Excel

Création de feuilles UserForm avancées


ElseIf OptionButton3.Value Then
Review.Text = Review.Text & "Option 3 was selected"

ElseIf OptionButton4.Value Then


Review.Text = Review.Text & "Option 4 was selected"

Else
Review.Text = Review.Text & "No options were selected"

End If

Review.Text = Review.Text & vbCrLf

Chapitre 20
Review.Text = Review.Text & "Footer: " & Footer.Text

End Sub

Cette routine se sert d’une zone de texte à plusieurs lignes dans laquelle les diffé-
rents choix de l’utilisateur sont affichés. Dans cet exemple, les informations sont
copiées dans la zone de texte. Remarquez qu’on a joint la constante vbCrLf à la
propriété Text après la génération de chaque ligne d’informations. On oblige
ainsi la ligne suivante à s’afficher en commençant sur le bord gauche du contrôle.

Exécuter l’assistant
L’assistant s’exécute lorsque l’on clique sur le bouton Finish. Dans cet exemple,
l’exécution de l’assistant consiste à afficher une boîte de message et à terminer
le programme. Dans un cas réel, on remplace l’instruction MsgBox par un
appel à une sous-routine qui récupère les informations collectées pendant les
différentes étapes de l’assistant et on effectue la tâche pour laquelle l’assistant a
été conçu.

Private Sub CommandButton4_Click()

MsgBox "Ending the wizard"

End

End Sub

En fait, cette routine rassemble les informations collectées dans les différents
contrôles de la feuille et exécute la fonction que l’assistant est supposé effectuer.
Il est important de se rappeler que l’utilisateur peut choisir de cliquer sur le bou-
ton Finish à tout moment pendant que l’assistant est actif. En conséquence, nous
vous conseillons d’attribuer à chaque contrôle de l’assistant une valeur par
défaut significative de sorte que si l’utilisateur clique sur le bouton Finish, le
résultat soit utile.
Si vous n’attribuez pas de valeur significative aux contrôles, examinez les infor-
mations qu’ils contiennent pour déterminer si elles sont suffisantes pour pro-
duire un résultat utile. Si l’utilisateur n’a pas fourni suffisamment

473
Partie 5 : Manipulation des objets Excel

Microsoft Excel 2003 VBA


d’informations à l’assistant pour produire un résultat intéressant, votre routine
de vérification devrait afficher l’étape de l’assistant à laquelle l’utilisateur peut
fournir ces informations.
Dans ce chapitre, vous avez vu comment construire deux applications différentes
basées sur les feuilles UserForm. Dans la première application, vous avez décou-
vert qu’il était simple de créer une feuille qui permet à un utilisateur de modifier
les données contenues dans une feuille de calcul. La feuille UserForm permet éga-
lement de s’assurer que les données saisies dans la feuille de calcul sont valides et
correctement formatées. Dans la deuxième application, nous avons construit un
Chapitre 20

assistant à plusieurs étapes avec une feuille UserForm et un contrôle Multipage.


Chaque page du contrôle Multipage permet de créer une apparence personnali-
sée pour l’étape concernée de l’assistant et l’utilisation d’une seule feuille simpli-
fie le processus de développement.

474
Partie 6
Excel et le monde
extérieur : une
collaboration
simplifiée
21 Excel et les autres
applications Office 477

22 Excel et SQL 499

23 Introduction à ADO 515

24 Programme Excel Query 531

25 Excel et le web 553

26 Excel et XML 575

475
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 21
Excel et les autres
applications Office
Démarrage d’une autre Liaisons . . . . . . . . . . . . . . . . . . . 481
application . . . . . . . . . . . . . . . . . 477 Interaction avec d’autres
Activation d’une autre applications Office. . . . . . . . . . . 487
application . . . . . . . . . . . . . . . . . 481 Conjugaison des talents . . . . . . 497

Au début de l’informatique personnelle, la communication entre les différentes


applications était exceptionnelle. L’idée de partager des données entre les appli-
cations impliquait de ressaisir toutes les informations nécessaires. Avec les tech-
nologies actuelles, la communication entre les applications constitue l’apanage
de la majorité des logiciels, même si l’utilisateur n’en est pas toujours informé.
Par chance, le partage des données entre deux applications est aujourd’hui aussi
simple qu’une opération de glisser-déposer.
Les applications Microsoft Office—Excel, Word, PowerPoint, Outlook et
Access—utilisent toutes le même langage Visual Basic pour Applications (VBA).
Une fois que vous avez compris la syntaxe VBA dans Excel, vous connaissez celle
de toutes les autres applications. La différence se situe au niveau de chaque
modèle d’objet.
Le langage VBA commun présente un avantage majeur : toutes les applications
Office peuvent exposer leurs objets les unes aux autres et vous pouvez program-
mer une interaction entre toutes les applications à partir de n’importe laquelle
d’entre elles. Pour exploiter les objets Word à partir d’Excel, par exemple, il suffit
d’établir une liaison avec Word pour accéder à ses objets comme si vous pro-
grammiez avec VBA dans Word.
Dans ce chapitre, vous allez apprendre comment démarrer et activer une autre
application à partir d’Excel. Vous étudierez également comment interagir avec
les autres fichiers Office, comme utiliser des liaisons dynamiques et des liaisons
statiques, ouvrir un document dans Word, accéder à un document Word actif et
créer un nouveau document Word. Pour clore ce chapitre, vous verrez comment
contrôler Excel à partir des autres applications Office.

Démarrage d’une autre application


Vous devrez parfois démarrer une autre application à partir d’Excel. Plus loin
dans ce chapitre, nous verrons comment interagir avec les autres applications
Office, mais pour l’instant, nous allons nous concentrer sur l’ouverture d’une
application qui ne fait pas partie du domaine des applications Office.
477
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Il existe de nombreuses raisons pour lesquelles on peut interagir avec une autre
application : utiliser la Calculatrice, la Table des caractères ou un fichier batch
DOS, par exemple. En fait, vous pouvez exécuter une application du Panneau de
configuration, si nécessaire. Pour accomplir ces tâches avec du code VBA, servez-
vous d’une fonction Shell. La procédure suivante démarre l’application Calcula-
trice avec la fonction Shell :

Sub RunCalculator()
On Error Resume Next
Program = "calc.exe"
TaskID = Shell(Program, vbNormalFocus)
If Err <> 0 Then
MsgBox "Impossible de démarrer " & Program, vbCritical,
"Erreur"
End If
End Sub

La fonction Shell retourne l’identificateur de la tâche exécutée pour l’application.


Cet identificateur peut servir ultérieurement dans le code pour activer la tâche.
Le deuxième argument de la fonction Shell détermine l’état de la fenêtre de
Chapitre 21

l’application : réduite, agrandie, masquée ou normale. Si la fonction génère une


erreur, l’instruction OnError affiche un message indiquant que le fichier est
introuvable.

Remarque Rappelez-vous que si du code suit la fonction Shell, celui-ci est


immédiatement exécuté. Si une instruction requière l’intervention de l’utilisa-
teur, la barre de titre Excel clignote pour informer l’utilisateur qu’une autre
application est active.

Pour démarrer une application, vous pouvez également faire appel à la com-
mande Start. Vous exécutez la commande Start à partir de la boîte de dialogue
Exécuter ou directement dans une fenêtre DOS. Cette commande est disponible
dans la plupart des versions de Microsoft Windows. La commande Start sert à
démarrer une application Windows à partir d’une fenêtre DOS. Elle ne nécessite
pas l’emploi de code pour ouvrir le programme associé au document ; la com-
mande se sert du programme associé au nom de fichier pour ouvrir l’application
et le fichier. Vous devez saisir le chemin d’accès complet du fichier ainsi que son
extension pour exécuter cette commande correctement. La figure 21.1 donne un
exemple de la manière d’ouvrir le fichier Fall Initiative.ppt avec la commande
Start.

Figure 21-1. Servez-vous de la commande Start dans la boîte de dialogue


Exécuter pour ouvrir un fichier de présentation.

478
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Vous pouvez obtenir le même résultat en utilisant la commande Start dans du
code VBA. Par exemple, un commercial de la société Garden Supply Company
peut lancer PowerPoint et ouvrir un fichier de présentation Marketing à partir
d’Excel. Examinez le code qui suit pour voir comment y parvenir.

Remarque L’exemple suivant fonctionne si votre système d’exploitation est


antérieur à Microsoft Windows NT. Si vous exploitez Microsoft Windows NT ou
une version ultérieure, servez-vous de la fonction ShellExecute pour parvenir
au même résultat. La fonction ShellExecute est expliquée dans le prochain
exemple. Bien que vous deviez disposer de Microsoft Windows 2000 ou
Windows XP (ou version ultérieure) pour exécuter Excel 2003, cette procédure
fonctionne si vous exécutez le code Excel 2003 dans une ancienne version
d’Excel. Il est possible qu’il y ait d’autres incompatibilités.

Sub OpenPresentation()
Filename = "C:\Garden Supply Company\Marketing\Fall
Initiative.ppt"
Shell "Start " & Filename

Chapitre 21
End Sub

Astuce Automatiser les courriels


Pour envoyer un courrier avec du code VBA, la commande Start permet de
démarrer le message. Utilisez Shell "Start info@thegardencompany.com”
pour démarrer le client de messagerie par défaut. Si vous exploitez
Windows NT ou une version ultérieure, remplacez la commande Shell par la
fonction ShellExecute.

La commande Start n’étant pas disponible dans Windows NT et les systèmes


d’exploitation ultérieurs, vous devez utiliser la fonction ShellExecute pour parve-
nir aux mêmes résultats. L’exemple suivant se sert de la fonction ShellExecute
pour ouvrir la page d’accueil de Microsoft France :

Private Declare Function ShellExecute Lib "shell32.dll" Alias _


"ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperations As _
String, ByVal lpfile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long

Sub OpenFile()
File = "http://www.microsoft.com/france/"
Call ShellExecute(0&, vbNullString, file, vbNullString,
vbNullString, vbNormalFocus)
End Sub

479
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Au Quotidien
Simuler une pause dans le code VBA

Il arrive que l’on doive lancer une application, mais qu’il faille mettre le code
VBA en pause jusqu’à la fermeture de l’application. Supposons, par exemple,
que l’application lancée crée un fichier nécessaire ultérieurement dans la pro-
cédure. Puisque vous ne pouvez pas mettre le code en pause, vous pouvez
gérer cette situation en programmant une boucle qui surveille l’état des appli-
cations. La procédure suivante a été conçue pour afficher une boîte de mes-
sage lorsque l’application lancée par la fonction Shell n’est plus active.

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As


Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long

Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As


Long, lpExitCode As Long) As Long
Chapitre 21

Sub RunCharMap()
Dim TaskID As Long
Dim hProc As Long
Dim lExitCode As Long

ACESS_TYPE = &H400
STILL_ACTIVE = &H103

Program = "Charmap.exe"
On Error Resume Next

TaskID = Shell(Program, vbNormalFocus)


hProc = OpenProcess(ACCESS_TYPE, False, TaskID)

If Err <> 0 Then


MsgBox "Impossible de démarrer " & Program, vbCritical, _
"Erreur"
Exit Sub
End If

Do
GetExitCodeProcess hProc, lExitCode
DoEvents
Loop While lExitCode = STILL_ACTIVE

MsgBox Program & " n’est plus l’application active."


End Sub

Tant que le programme lancé est actif, la procédure continue à boucler jusqu’à
ce que lExitCode retourne une valeur différente. Lorsque la boucle se termine,
le code VBA reprend.

480
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office

Activation d’une autre application


Vous vous demandez peut-être comment procéder si l’application que vous vou-
lez utiliser est déjà ouverte. Si vous faites appel à la fonction Shell, vous ouvrez
une deuxième instance du programme occupant inutilement de la mémoire.
Dans la majorité des cas, il est préférable d’activer le programme qui s’exécute au
lieu d’en créer une nouvelle instance.
Prenons l’exemple suivant, dans lequel la procédure ActivateCalculator utiliser
l’instruction AppActivate pour activer l’application si elle est démarrée. L’argu-
ment de l’instruction AppActivate correspond à la légende qui se trouve dans la
barre de titre de l’application. Si l’instruction AppActivate génère une erreur, cela
signifie que la Calculatrice n’est pas en cours d’exécution et donc que la procé-
dure doit démarrer l’application.

Sub ActivateCalculator()
AppFile = "Calc.exe"
On Error Resume Next
AppActivate "Calculatrice"

Chapitre 21
If Err <> 0 Then
CalcTaskID = Shell(AppFile, vbNormalFocus)
If Err = 0 Then MsgBox _
"Impossible de démarrer la Calculatrice"
End If
End Sub

Liaisons
Vous pouvez écrire une macro pour contrôler le composant le plus important de
Microsoft Word, son serveur Automation. Dans une telle macro, Excel agit
comme l’application cliente et Word se comporte comme serveur d’application.
Il est également possible d’écrire une application VBA pour contrôler Excel. Le
processus d’une application contrôlant l’autre se nomme Automation, ancienne-
ment OLE Automation.
Automation permet de développer des macros complexes capables de contrôler
des objets à partir d’un grand choix d’applications. Il s’agit d’un outil particuliè-
rement puissant à l’heure de créer des fichiers d’application. Automation permet
à l’utilisateur d’interagir avec plusieurs applications, comme Access, sans se ren-
dre compte de cette interaction. Automation offre une interface unique à l’utili-
sateur final.
Comme vous le savez, il est possible d’utiliser le menu Insertion pour ajouter
divers objets dans le classeur. Vous pouvez également faire appel à Excel VBA
pour créer le même type d’objets. Lorsque vous créez l’objet, vous disposez d’un
accès complet à ses propriétés et méthodes, comme dans son application hôte.
Les développeurs préfèrent la méthode automation à la commande Objet du
menu Insertion. Une fois l’objet incorporé, l’utilisateur doit savoir comment
exploiter l’application de l’objet Automation. Cependant, si vous vous servez de
VBA pour manipuler l’objet, vous pouvez le programmer de sorte que l’utilisa-

481
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


teur puisse l’exploiter en cliquant dessus.
Avant de travailler avec l’objet externe, vous devez en créer une instance. Pour ce
faire, vous faites appel à l’un des deux types de liaison : statique ou dynamique.
La liaison représente la mise en correspondance des appels de fonction avec le
code réel qui met en œuvre la fonction.

Liaison dynamique
Dans une liaison dynamique, le processus de mise en correspondance entre la
variable objet et l’objet s’effectue pendant l’exécution de l’application. Les per-
formances sont plus lentes qu’avec une liaison statique, dans laquelle la liaison se
produit à la compilation de l’application.
Avec une liaison dynamique, il est inutile de déclarer les variables objet générales
puisque la bibliothèque d’objets appartenant à l’application extérieure n’est pas
activée. Les objets extérieurs sont plus complexes à programmer puisque leurs
propriétés, méthodes et événements n’apparaissent pas automatiquement pen-
dant la programmation de la procédure relative à ces objets. Cependant, une
Chapitre 21

liaison dynamique permet de créer un objet Application quelle que soit la version
installée sur le système de l’utilisateur. Cette méthode de liaison est préférables si
le fichier doit être distribué à des utilisateurs équipés de versions différentes d’un
logiciel : la procédure ouvre Microsoft Word, sans tenir compte de la version ins-
tallée.
Pour créer un objet, on utilise la fonction CreateObject. Pour créer une instance
de l’application, on se sert de la fonction GetObject. On déclare ensuite l’objet
comme type Object générique et on résout sa référence d’objet au moment de
l’exécution. La procédure suivante montre comment utiliser une liaison dyna-
mique avec l’application Word :

Sub UsingLateBinding()
Dim oApp As Object
Dim oDoc As Object
On Error Resume Next
Set oApp = GetObject(, "Word.Application")

If oApp Is Nothing Then


Set oApp = CreateObject("Word.Application")
End If
On Error GoTo 0
If oApp Is Nothing Then
MsgBox "L'application n'est pas disponible !", vbExclamation
End If
With oApp
.Visible = True
Set oDoc = _
.Documents.Open("C:\GSC\Employee Info\Health
Benefits.doc")
oDoc.Close True
.Quit
End With

482
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Set oDoc = Nothing
Set oApp = Nothing
End Sub

Voici un autre exemple de procédure qui exploite également une liaison dynami-
que, mais pour créer une entrée dans le Calendrier Outlook.
Sub MakeOutlookAppointmentLateBinding()
Dim olApp As Object
Dim olAppointment As Object
Const olAppointmentItem = 1

Set olApp = CreateObject("Outlook.Application")


Set olAppointment = olApp.CreateItem(olAppointmentItem)

With olAppointment
.Subject = "Réunion Ventes de printemps"
.Location = "Radisson : Salle de réunion A"
.Start = DateSerial(2005, 3, 7) + TimeSerial(9, 30, 0)
.End = DateSerial(2005, 3, 7) + TimeSerial(11, 30, 0)
.ReminderPlaySound = True

Chapitre 21
.Save
End With
olApp.Quit
Set olApp = Nothing
End Sub

La technique de base dans la programmation d’une autre application consiste à


créer une variable objet se référant à cette application. Dans ce cas, la variable
objet est olApp. On utilise ensuite la variable olApp pour référencer des objet du
modèle d’objet de l’application externe. Dans cet exemple, la méthode Crea-
teItem de l’objet Application d’Outlook sert à créer une référence un nouvel objet
AppointmentItem.
Dans la mesure où les constantes d’Outlook ne sont pas disponibles si on se sert
d’une liaison dynamique, nous devons définir nos propres constantes, comme
olAppointmentItem dans notre exemple, ou remplacer la valeur de la constante
comme la valeur du paramètre. Les propriétés et méthodes de l’objet Appoint-
ment qui se trouve dans la structure With…End With modifient le nouvel objet
créé.
Lorsqu’on déclare olApp et olAppointment en tant que types Object génériques, la
liaison dynamique est contrainte sur la procédure VBA. Aucune liaison vers Out-
look ne peut être établie avant que la procédure n’exécute la fonction CreateOb-
ject. L’argument d’entrée CreateObject définit le nom de l’application et la classe
de l’objet à créer. Outlook représente le nom de l’application et Application repré-
sente la classe. De nombreuses applications vous permettent de créer des objets à
divers niveaux du modèle d’objet. Par exemple, Excel vous permet de créer des
objets WorkSheet ou Chart à partir des autres applications en utilisant
Excel.WorkSheet ou Excel.Chart comme paramètre d’entrée de la fonction Crea-
teObject.

483
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Astuce Économisez votre mémoire


Il est de bonne pratique en matière de programmation de fermer l’application
externe lorsque vous avez terminé de l’exploiter et de positionner la variable
objet sur Nothing. Vous libérez ainsi la mémoire employée par la liaison et
l’application.

Si vous exécutez cette macro dans Excel, il semble ne rien se passer. Cependant,
si vous ouvrez Outlook et localisez le 7 mars 2005, vous remarquerez qu’un ren-
dez-vous a été ajouté au Calendrier. La figure 21.2 montre le rendez-vous créer
dans le Calendrier le 7 mars 2005.
Chapitre 21

Figure 21-2. Le Calendrier Outlook avec le nouveau rendez-vous affiché.

Liaison statique
Dans une liaison statique, la liaison entre la variable objet et l’objet se produit à
la compilation de l’application. Le résultat final est une meilleure performance
par rapport à la liaison dynamique. Vous ajoutez une bibliothèque d’objets par le
biais de la commande Références du menu Outils dans Visual Basic Editor et
vous pouvez alors déclarer les variables de l’objet spécifique. Cette méthode de
programmation des objets extérieurs est plus simple puisque Visual Basic Editor
affiche l’aide de programmation relative à l’objet externe.
Avant de programmer la procédure, ajoutez la référence appropriée. Pour ajou-
ter une référence à Microsoft Outlook, procédez comme suit :
1 Ouvrez Visual Basic Editor.
2 Dans le menu Outils, choisissez Références.
3 Faites défiler la liste des références disponibles et localisez la bibliothèque
d’objets Microsoft Outlook 11.0 Object Library.

484
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


4 Cochez la case en regard de la référence.
5 Cliquez sur OK pour fermer la boîte de dialogue Références.
La figure 21.3 montre la boîte de dialogue Références avec la bibliothèque
d’objets Outlook sélectionnée.

Figure 21-3. La boîte de dialogue Références présente toutes les références

Chapitre 21
disponibles. Pour activer une bibliothèque, sélectionnez sa référence et cliquez
sur OK.

Maintenant que vous avez ajouté la référence à Visual Basic Editor, vous disposez
de l’aide relative aux objets créés avec cette bibliothèque. Pour localiser les réfé-
rences aux types d’objets, VBA examine les bibliothèques de types, de haut en
bas dans l’ordre de tri de la boîte de dialogue Références. Si le même type d’objet
est présent dans plusieurs bibliothèques, VBA se sert du premier rencontré. Vous
pouvez sélectionner une bibliothèque et cliquer sur les boutons Priorité pour la
déplacer vers le haut ou le bas de la liste et modifier ainsi l’ordre de recherche. Il
est toutefois inutile de dépendre de la priorité : vous pouvez référencer l’objet
avec l’objet de l’application. Par exemple, au lieu d’utiliser AddressList, servez-
vous de Outlook.AddressList.
Examinez l’exemple de procédure suivant pour voir comment exploiter une
liaison statique. La procédure liste tous les noms du dossier Contacts d’Outlook
et les place dans la colonne A de la feuille de calcul active. Veillez à ajouter une
référence à la bibliothèque d’objets Outlook avant d’exécuter cette procédure.

Sub DisplayOutlookContactNamesEarlyBinding()
Dim olApp As Outlook.Application
Dim olNameSpace As Outlook.Namespace
Dim olAddresslist As AddressList
Dim olEntry As AddressEntry
Dim i As Long

Set olApp = New Outlook.Application


Set olNameSpace = olApp.GetNamespace("Mapi")
Set olAddresslist = olNameSpace.AddressLists("Contacts")
For Each olEntry In olAddresslist.AddressEntries
i = i + 1
Cells(i, 1).Value = olEntry.Name

485
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Next

olApp.Quit
Set olApp = Nothing
End Sub

Pendant l’exécution de ce code, un avertissement similaire à celui de la


figure 21.4 s’affiche. La sécurité contre les virus a énormément augmenté depuis
la dernière version d’Office XP. La tendance continue avec la version
d’Office 2003. Toute tentative d’accès aux adresses de messagerie par un pro-
gramme exécute un message d’avertissement. Vous serez également averti cha-
que fois qu’un courriel est envoyé par le biais du code VBA.
Chapitre 21

Figure 21-4. Le message d’avertissement qui s’affiche lorsque vous exécutez


du code qui interroge votre dossier Contacts dans Outlook.

Au Quotidien
Liaison statique versus liaison dynamique

Les liaisons statiques et les liaisons dynamiques possèdent chacune des


avantages et des inconvénients. Les liaisons dynamiques sont plus lentes que
les liaisons statiques puisque la liaison se produit au moment de l’exécution.
Si on termine le travail pendant la conception, le code est plus rapide. Si vous
écrivez du code utilisant des liaisons dynamiques, vous perdez certains
avantages : vous ne pouvez plus exploiter IntelliSense pour afficher les proprié-
tés et méthodes disponibles pour les objets utilisés, l’Explorateur d’objets ne
liste pas les objets de l’application que vous programmez et les constantes
intégrées ne sont pas disponibles.

Voilà qui ressemble à un argument convaincant en faveur des liaisons stati-


ques. Il ne faut toutefois pas perdre de vue un avantage important à utiliser les
liaisons dynamiques : l’indifférence face à la version de l’application installée.
L’objet de l’application recherche la version installée sur le système et réfé-
rence le modèle d’objet approprié. Avec les liaisons statiques, vous choisissez
la bibliothèque d’objets de l’application dans la liste Références. Celle-ci con-
tient uniquement les bibliothèques d’objets installées. Si vous choisissez de
partager la procédure, la liste est spécialement codée dans la version du logi-
ciel installé sur le système.

486
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office

La morale de l’histoire est la suivante : écrivez votre code avec des liaisons
statiques, mais avant de distribuer le fichier, modifiez le code et utilisez des
liaisons dynamiques. Il peut également être intéressant de modifier vos pro-
jets personnels pour y incorporer des liaisons dynamiques. Ainsi, vous ne
serez pas confronté à un problème lors d’une mise à jour ultérieure de votre
logiciel.

Dans la procédure DisplayOutlookContactNamesEarlyBinding, nous avons


déclaré olApp comme type Outlook.Application. Les autres instructions Dim
déclarent également les variables objet du type demandé pour atteindre les
objectifs. Si le même nom d’objet se trouve dans plusieurs bibliothèques
d’objets, vous pouvez faire précéder le nom de l’objet par celui de l’application,
au lieu de dépendre de la priorité établie dans les bibliothèques. Vous remarque-
rez que cette technique a été employé avec la propriété Outlook NameSpace. On a
utilisé le mot-clé New pour assigner une référence à Outlook.Application à olApp
pour créer une nouvelle instance d’Outlook.
La procédure est contrainte d’employer les liaisons statiques, puisque les types

Chapitre 21
variables ont été déclarés. Nous aurions pu utiliser la fonction CreateObject pour
créer la variable objet olApp, à la place du mot-clé New, sans affecter la liaison
statique. Mais l’utilisation du mot-clé New est plus efficace.

Interaction avec d’autres applications Office


L’utilisation de VBA pour accéder aux applications Microsoft Office revient à se
servir de code pour exploiter des objets au sein de l’application hôte du code.
Pour commencer, on crée une variable objet qui pointe vers l’objet Application
qui représente l’application Office contenant les objets à exploiter. Il est préféra-
ble d’utiliser un objet avec une liaison statique par l’intermédiaire du mot-clé
New. En alternative, vous pouvez utiliser la fonction CreateObject ou la fonction
GetObject pour créer une variable objet.
Lorsque le code VBA manipule des objets au sein de la même application, la réfé-
rence à l’objet Application est implicite. En revanche, si vous automatisez une
autre application, la référence à l’objet Application doit être explicite.
Examinez les exemples suivants pour voit la différence entre une référence impli-
cite et explicite à l’objet Application. La première procédure montre comment
créer un nouveau classeur Excel et comment référencer l’objet Application impli-
citement. La deuxième procédure montre comment référencer l’application
Microsoft Word explicitement et créer un nouveau document Word. Pour exé-
cuter la deuxième procédure, vous devez ajouter la référence à la bibliothèque
d’objets Microsoft Word dans l’application Excel. Pour ce faire, dans le menu
Outils de Visual Basic Editor, choisissez la commande Références.

Sub CreateNewWorkbookFromExcel()
Dim xlNew As Excel.Workbook

487
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Set xlNew = Workbooks.Add
ActiveCell.Value = "Créé le " & Date
End Sub

Sub CreateWordDocumentFromExcel()
Dim wdApp As Word.Application
Dim docNew As Word.Document

Set wdApp = New Word.Application


Set docNew = wdApp.Documents.Add
wdApp.Selection.TypeText "Ce fichier a été créé le " & Date
With docNew
MsgBox "'" & .Name & "' a été créé le " & Date & "."
.Close wdDoNotSaveChanges
End With
wdApp.Quit
Set wdApp = Nothing
End Sub

En général, on crée une variable objet qui se réfère à l’objet Application représen-
tant l’application à laquelle on souhaite accéder par le biais d’automation. Une
Chapitre 21

fois l’objet Application référencé, on ajoute des références supplémentaires aux


objets enfants de l’objet pour atteindre l’objet ou la méthode à manipuler. Ser-
vez-vous de l’instruction Set pour assigner des variables objet aux objets enfants.

Remarque Au sommet se trouve l’objet Application. L’objet Application con-


tient tous les autres objets auxquels vous ne pouvez accéder que si l’objet
Application existe. Les objets dépendant des objets Application sont souvent
appelés objets enfants. Ces derniers peuvent à leur tour posséder des objets
enfants. Par exemple, l’objet Excel Workbook est l’enfant de l’objet Application
d’Excel et l’objet Worksheet est l’objet enfant de l’objet Workbook d’Excel.

Cependant, Microsoft Excel et Word permettent de créer une référence de niveau


supérieur à certains objets enfants des objets Application. Sachant cela, nous
pouvons réécrire le code de la procédure CreateWordDocumentFromExcel pour
démarrer à partir d’une référence à un objet Document de Word.

Sub CreateWordDocumentFromExcel2()
Dim docNew As Word.Document

Set docNew = New Word.Document


Set docNew = Documents.Add
docNew.Application.Selection.TypeText "Ce fichier a été créé le "
& Date
With docNew
MsgBox "'" & .Name & "' a été créé le " & Date & "."
.Close wdDoNotSaveChanges
End With
Set docNew = Nothing
End Sub

488
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Vous pouvez utiliser la même théorie dans Excel en vous servant de l’objet Work-
book comme référence de niveau supérieur. Pour ce faire, vous utilisez le nom de
classe Excel.Sheet pour créer le classeur ou du nom de classe Excel.Chart pour
créer un classeur contenant une feuille de calcul avec un objet Chart incorporé et
une feuille de calcul qui contient les données par défaut du graphique.
Pour créer un objet Workbook, on utilise la fonction CreateObject puisque les
noms de classes Excel.Sheet et Excel.Chart ne supportent pas le mot-clé New.
L’exemple suivant automatise Excel, en commençant par un objet Workbook qui
contient une seule feuille de calcul :

Dim wbkSheet As Excel.Workbook


Set wbkSheet = CreateObject("Excel.Sheet")

Pour automatiser le démarrage d’Excel avec un objet Workbook qui contient une
feuille de calcul avec un graphique et une autre feuille de calcul, servez-vous du
code suivant :

Dim wbkChart As Excel.Workbook

Chapitre 21
Set wbkChart = CreateObject("Excel.Chart")

Quand on automatise Excel à partir d’un objet Workbook ou Word à partir d’un
objet Document, une référence implicite à l’objet Application se crée. Si vous
devez accéder aux propriétés et méthodes de l’objet Application, utiliser la pro-
priété Application appropriée des objets Document ou Workbook. En les utilisant
comme objets de niveau supérieur, vous réduisez le nombre de lignes de code à
écrire. Dans la majorité des cas, le code sera plus simple à suivre et plus cohérent
que lorsque vous référencez l’objet Application. Le tableau 21.1 liste tous les
objets Office de niveau supérieur que l’on peut référencer ainsi que leurs noms
de classe.
Tableau 21-1. Objets Office de niveau supérieur et leurs noms
de classe associés
Objet Office Nom de classe
Objet Application Access Access.Application
Objet Application Excel Excel.Application
Objet Workbook Excel Excel.Sheet
Objet Chart Excel Excel.Chart
Objet Application FrontPage FrontPage.Application
Objet Application Outlook Outlook.Application
Objet Application PowerPoint PowerPoint.Application
Objet Application Word Word.Application
Objet Document Word Word.Document

489
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Ouvrir un document dans Word


Pour ouvrir directement un fichier créé à partir d’une autre application Office
que vous êtes en train d’utiliser, servez-vous de la fonction GetObject. Il est tou-
tefois aussi simple d’ouvrir une instance de l’application et d’ouvrir le fichier à
partir de l’application.
Le code suivant copie une plage d’Excel dans le Presse-papiers. Il démarre
ensuite une nouvelle instance de Word, ouvre un document Word existant et
colle la plage à la fin du document. Ce code se sert d’une liaison statique, veillez
donc à configurer d’abord la référence à la bibliothèque d’objets Word.

Remarque Dans l’exemple qui suit, remplacez le nom de la feuille de calcul


et son nom de fichier par une référence à un objet de votre ordinateur. Si vous
référencez des fichiers qui n’existent pas, une erreur se produit au moment de
tester cette procédure.

Sub CopyFromExcelToWord()
Chapitre 21

Dim wdApp As Word.Application

ThisWorkbook.Sheets("Table").Range("A1:B6").Copy
Set wdApp = New Word.Application

With wdApp.Application
.Documents.Open Filename:="C:\test.doc"
With .Selection
.EndKey unit:=wdStory
.TypeParagraph
.Paste
End With
.ActiveDocument.Save
.Quit
End With
Set wdApp = Nothing
End Sub

Astuce Déboguer avec les objets Application masqués


Lorsqu’une procédure contient des applications qui ne sont pas visibles, vous
risquez de rencontrer des problèmes de mémoire à l’heure de déboguer le
code. Lorsqu’une procédure ouvre une copie masquée d’une application et
que le code s’arrête avant l’exécution de la méthode Quit, une instance de
l’application continue de s’exécuter en arrière-plan jusqu’à qu’elle soit con-
trainte de fermer. Chaque fois que la procédure est exécutée et arrêtée avant
l’exécution de la méthode Quit, une copie supplémentaire de l’application est
placée en mémoire. Cela peut engendrer de sérieuses erreurs de mémoire sur
votre système. En conséquence, obligez toujours l’application masquée à se
fermer en vous servant du Gestionnaire des tâches.

490
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Le mot-clé New crée une nouvelle instance de Word, même si l’application est
déjà ouverte. La méthode Open de la collection Documents sert à ouvrir un
fichier existant. Le code sélectionne ensuite la fin du document, crée un nouveau
paragraphe vide et colle la plage. Le document est alors enregistré et la nouvelle
instance de Word se ferme.
À présent que vous savez ouvrir un document Word existant et y placer des don-
nées Excel, étudions le scénario suivant. Le document Spring Promotion.doc de
la société Garden Supply Company contient le calendrier des promotions de la
société. Vous devez saisir les mêmes informations dans Excel. La procédure sui-
vante ouvre un document Word et place une copie du contenu du fichier dans un
nouveau classeur Excel :

Sub CopyWordToExcel()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Dim tString As String
Dim tRange As Word.Range
Dim i As Long

Chapitre 21
Dim r As Long
Workbooks.Add
r = 3
Set wrdApp = CreateObject("Word.Application")
Set wrdDoc = GetObject("C:\GSC\Correspondence\Spring
Promotion.doc")
With wrdDoc
For i = 1 To .Paragraphs.Count
Set tRange = .Range(Start:=.Paragraphs(i).Range.Start, _
End:=.Paragraphs(i).Range.End)
tString = tRange.Text
tString = Left(tString, Len(tString) - 1)
ActiveSheet.Range("A" & r).Formula = tString
r = r + 1
Next i
End With
With Range("A1")
.Formula = "Contenu du fichier : " & wrdDoc.Name
.Font.Italic = True
.Font.Size = 18
End With
wrdDoc.Close
wrdApp.Quit
Set wrdDoc = Nothing
Set wrdApp = Nothing
ActiveWorkbook.Saved = True
End Sub

491
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Au Quotidien
GetObject versus CreateObject

Les fonctions CreateObject et GetObject retournent des références à un objet,


alors laquelle choisir ?

La fonction CreateObject sert à créer une nouvelle instance de l’application.


Utilisez-la si l’application que vous devez référencer n’est pas ouverte. Si une
instance de l’application est déjà en cours d’exécution, une deuxième ins-
tance de l’application sera initiée. Prenons l’exemple suivant. La société Gar-
den Supply Company possède un classeur Excel qui copie des données dans
un document Word pour les rapports de ventes mensuels. Pour créer une nou-
velle instance de Microsoft Word, on se sert du code suivant :

Set xlApp = CreateObject("Word.Application")

On utilise la fonction GetObject avec une application déjà en cours d’exécution


ou pour démarrer une application tout en chargeant un fichier. L’exemple sui-
Chapitre 21

vant démarre Excel et ouvre le fichier Myfile.xls :

Set XLBook = GetObject("C:\Myfile.xls”)

L’objet retourné dans XLBook est une référence à l’objet Workbook.

Accéder à un document Word actif


Maintenant que vous savez ouvrir une application Office, comment faire pour
simplement accéder à un programme déjà ouvert ? Si une instance d’une appli-
cation est en cours d’exécution, il est inutile de créer une nouvelle instance et
d’exploiter des ressources supplémentaires. Pour activer l’application qui s’exé-
cute, servez-vous de la fonction GetObject.
L’exemple suivant utilise une liaison statique et la fonction GetObject pour copier
un tableau dans un document Word ouvert :

Remarque Cette fonction demande que Microsoft Word soit ouvert pour col-
ler les informations dans le document actif.

Sub CopyFromExcelToOpenWordDocument
Dim wdApp As Word.Application

ThisWorkbook.Sheets("Table").Range("A1:B6").Copy

Set wdApp = GetObject(, "Word.Application")


With wdApp.Selection
.EndKey unit:=wdStory
.TypeParagraph
.Paste
End With

492
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Set wdApp = Nothing
End Sub

La fonction GetObject possède deux paramètres d’entrée optionnels. Le premier


paramètre spécifie le fichier à ouvrir. Le deuxième paramètre désigne l’applica-
tion employée pour ouvrir le fichier. Si vous ne spécifiez par le premier paramè-
tre, la fonction GetObject suppose que vous voulez accéder à l’instance en cours
de Word. Si vous spécifiez une chaîne de longueur zéro comme premier paramè-
tre, GetObject présume que vous voulez ouvrir une nouvelle instance de Word.
Vous pouvez employer la fonction GetObject pour accéder à une instance en
cours de Word qui se trouve en mémoire. Mais en l’absence d’une instance de
Word en cours d’exécution, la fonction GetObject sans le premier paramètre pro-
voque une erreur d’exécution.

Remarque Tout programme ouvert crée une instance de l’application dans la


mémoire de l’ordinateur. Si cette même application est ouverte plusieurs fois,
le Gestionnaire des tâches liste plusieurs entrées de cette application. Pour

Chapitre 21
optimiser les performances, il est préférable d’utiliser une instance ouverte
d’une application au lieu de créer une nouvelle instance.

L’exemple suivant accomplit la même tâche. Cependant, la fenêtre Word est visi-
ble et le texte est inséré au point d’insertion :

Sub AccessActivateApp()
Application.ActivateMicrosoftApp xlMicrosoftWord
Dim appWord As Word.Application
Dim doc As Word.Document

Set appWord = GetObject(, "Word.Application")

appWord.Visible = True
appWord.Activate

Set doc = appWord.ActiveDocument

appWord.ShowMe

With doc
doc.Activate
doc.Application.Selection.TypeText "Ce fichier a été créé le "
& Date
End With
End Sub

Créer un nouveau document Word


Pour créer un nouveau fichier au lieu d’exploiter un document Word existant,
vous devez disposer d’une instance ouverte de Word et créer ensuite un nouveau
document.

493
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


L’exemple suivant utilise une liaison statique : le code qui crée un nouveau docu-
ment est le même que si on crée un nouveau document à partir de Word. Avant
de tester cette procédure, ajoutez la bibliothèque d’objets Word à la procédure.

Sub CopyFromExcelToNewWordDocument()
Dim wdApp As Word.Application

ThisWorkbook.Sheets("Table").Range("A1:B6").Copy

On Error Resume Next


Set wdApp = GetObject(, "Word.Application")

If wdApp Is Nothing Then


Set wdApp = GetObject("", "Word.Application")
End If
On Error GoTo 0

With wdApp
.Documents.Add
.Visible = True
End With
Chapitre 21

With wdApp.Selection
.EndKey unit:=wdStory
.TypeParagraph
.Paste
End With

Set wdApp = Nothing


End Sub

En l’absence d’une instance de Word en cours d’exécution, la fonction GetObject


sans le premier argument provoque une erreur d’exécution. La ligne On Error
Resume Next permet au code de continuer et se sert de la valeur de la variable
wdApp pour déterminer si une nouvelle instance de l’application doit être
ouverte. Si l’application Word n’est pas chargée en mémoire, la code utilise la
fonction GetObject avec une chaîne d’une longueur de zéro comme premier
argument, ce qui ouvre une nouvelle instance de Word. Une fois l’instance de
Word identifiée, la procédure crée un nouveau document. Le code rend égale-
ment l’instance de Word visible, contrairement aux précédents exemples, dans
lesquels le travail se faisait à l’arrière-plan, sans afficher la fenêtre Word. Les don-
nées copiées sont ensuite collées à la fin du document Word. À la fin de la procé-
dure, on libère la variable objet wdApp, mais la fenêtre Word est accessible à
l’écran pour visualiser le résultat.
La procédure CreateNewWordDoc montre comment créer un nouveau docu-
ment, mais au lieu de coller le contenu dans le document, la procédure entre la
date de création du fichier, ferme la fenêtre du programme et enregistre le fichier
sous le nom NewWordDoc.doc.

Sub CreateNewWordDoc()
Dim wrdApp As Word.Application

494
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


Dim wrdDoc As Word.Document
Dim i As Integer
Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
Set wrdDoc = wrdApp.Documents.Add
With wrdDoc
.Content.InsertAfter "Ce document a été créé le " & Date & " à
" & Time & "."
.Content.InsertParagraphAfter
.Content.InsertParagraphAfter
If Dir("C:\NewWordDoc.doc") <> "" Then
Kill "C:\NewWordDoc.doc"
End If
.SaveAs ("C:\NewWordDoc.doc")
.Close
End With
wrdApp.Quit
Set wrdDoc = Nothing
Set wrdApp = Nothing
End Sub

Chapitre 21
Contrôler Excel à partir d’autres applications Office
Pour boucler la boucle, vous devez également savoir référencer l’objet Applica-
tion d’Excel à partir des autres applications Office. Les concepts sont les mêmes :
commencez par ajouter la bibliothèque d’objets Excel à la procédure de l’appli-
cation hôte, si vous utilisez les liaisons statiques, puis créez un objet Excel
comme le décrit le tableau 21.2.
Tableau 21-2. Objets Excel et leurs fonctions
Objet Office Nom de classe
Objet Application CreateObject("Excel.Application")
Objet Workbook CreateObject("Excel.Sheet")
Objet Chart CreateObject("Excel.Chart")

La procédure suivante à été créée dans Word 2003. Nous avons inclus une réfé-
rence à la bibliothèque d’objets Excel. Pour exécuter cette procédure, vous devez
ajouter la référence Excel, saisir la procédure dans Word et créer un nouveau
classeur dans le répertoire racine du lecteur C: intitulé NewExcelWbd.xls.

Sub OpenWriteExcelWbkContents()

Dim xlApp As Excel.Application


Dim xlWbk As Excel.Workbook
Dim tString As String, r As Long
Documents.Add
Set xlApp = CreateObject("Excel.Application")
Set xlWbk = Excel.Workbooks.Open("C:\NewExcelWbk.xls")
r = 1
With xlWbk.Worksheets(1)
While .Cells(r, 1).Formula <> ""

495
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


tString = Cells(r, 1).Formula
With ActiveDocument.Content
.InsertAfter "Contenu du fichier : " & xlWbk.Name
.InsertParagraphAfter
.InsertParagraphAfter
.InsertAfter tString
.InsertParagraphAfter
End With
r = r + 1
Wend
End With
xlWbk.Close
xlApp.Quit
Set xlWbk = Nothing
Set xlApp = Nothing
End Sub

L’exemple précédent crée un classeur Excel basique. Maintenant que vous savez
créé un classeur, vous pouvez copier des données et un graphique dans un docu-
ment Word. La figure 21.5 montre un exemple d’un tel classeur.
Chapitre 21

Figure 21-5. Voici un exemple de classeur, qui présente les données de


configuration de base employée pour créer le graphique.

Astuce Configuration nécessaire


Vous devez au minimum configurer le classeur pour permettre l’exécution de la
procédure. La procédure référence un nom de fichier Projection.xls ; si vous
optez pour un nom de fichier différent, modifiez le code pour refléter le nom
que vous avez choisi. Vous devez définir les noms de plages : StartVal et pct-
Change. Chaque mois est calculé en fonction du mois précédent multiplié par
la valeur pctChange. Ces valeurs ne sont pas enregistrées dans le classeur
Excel avant qu’il soit fermé. On a également assigné le nom Données à la
plage contenant les informations employées pour créer le graphique. Pour finir,
on crée un graphique incorporé pour visualiser l’objectif de cette procédure.
496
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et les autres applications Office


La procédure CreateExcelChart demande deux valeurs à l’utilisateur et les insère
dans la feuille de calcul. Une fois les données saisies dans la feuille de calcul, le
graphique est automatiquement mis à jour.

Sub CreateExcelChart()
Dim XLSheet As Object

Documents.Add

StartVal = InputBox("Valeur de départ ?")


PctChange = InputBox("Pourcentage de changement ?")

WBook = "C:\GSC\Financial\Projections.xls"
Set XLSheet = GetObject(WBook, "Excel.Sheet").ActiveSheet

XLSheet.Range("StartVal") = StartVal
XLSheet.Range("pctChange") = PctChange
XLSheet.Calculate

With Selection
.Font.Size = 14

Chapitre 21
.Font.Bold = True
.TypeText "Incrémentation mensuelle : " & Format(PctChange,
"0,0%")
.TypeParagraph
.TypeParagraph
End With

XLSheet.Range("Données").Copy
Selection.Paste

XLSheet.ChartObjects(1).Copy
Selection.PasteSpecial link:=False,
DataType:=wdPasteMetafilePicture, _
Placement:=wdInLine, DisplayAsIcon:=False
Set XLSheet = Nothing
End Sub

Conjugaison des talents


Excel ne suffira pas toujours à gérer vos projets. C’est la principale raison pour
laquelle on lie un classeur à d’autres applications.
Tout au long de ce chapitre, vous avez appris à accéder à différentes applications.
La fonction Shell sert à ouvrir des programmes qui n’entrent pas dans la suite
Microsoft Office. Lorsque vous travaillez au sein de la suite Microsoft Office,
vous accédez à divers objets Application. Il est possible de référencer un nouvel
objet Application avec une liaison dynamique, mais nous vous recommandons
d’utiliser les liaisons statiques lorsque vous programmez vos procédures.
Pour automatiser les objets d’une autre application, vous créez une variable
objet faisant référence à l’application cible ou un objet dans l’application. Pour
établir la liaison entre VBA et les objets d’autres applications, vous avez le choix

497
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


entre les liaisons statiques et les liaisons dynamiques. Pour les liaisons statiques,
vous devez établir une référence à la bibliothèque d’objets de l’application cible
et déclarer toutes les variables objet qui se réfèrent aux objets cibles en vous ser-
vant du type correct. Si vous déclarez les variables objet comme type Object
générique, VBA se sert des liaisons dynamiques.
Les liaisons statiques produisent un code qui s’exécute plus rapidement que les
liaisons dynamiques : vous récupérez les informations sur les objets de l’applica-
tion cible par le biais de l’Explorateur d’objets et les info bulles s’affichent auto-
matiquement à mesure que vous saisissez le code. En outre, la vérification de la
syntaxe et de la saisie s’effectuent également pendant le codage, ce qui réduit le
risque d’erreur au moment de l’exécution du code par rapport aux liaisons dyna-
miques.
Avec les liaisons dynamiques, vous devez utiliser une fonction GetObject ou
CreateObject pour créer une référence de variable objet pour l’application cible.
Les fonctions sont les mêmes qu’avec les liaisons statiques, mais il est plus per-
formant d’utiliser le mot-clé New. Pour tester la présence d’une instance ouverte
d’une autre application au moment de l’exécution, vous pouvez exploiter
Chapitre 21

GetObject avec une liaison statique.


Les techniques présentées dans ce chapitre permettent de créer des programmes
puissants qui tirent avantages des capacités des différents produits. L’utilisateur
navigue dans un environnement familier comme Excel, alors que le code
exploite tout produit disposant d’une bibliothèque de types et expose ses objets
à VBA.

498
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 22
Excel et SQL
Comparaison des tableurs L’instruction Insert. . . . . . . . . . . 510
et des bases de données . . . . . . 499 L’instruction Update . . . . . . . . . 511
Manipulation des bases L’instruction Delete . . . . . . . . . . 512
de données avec SQL. . . . . . . . . 503
L’instruction Select. . . . . . . . . . . 504

Parmi les nombreuses fonctionnalités proposées par Excel, l’une des plus inté-
ressante est celle qui permet d’accéder aux informations stockées dans les bases
de données. Vous pouvez copier des informations issues d’une table de base de
données dans une feuille de calcul ou inversement. Il est même possible de com-
biner des informations émanant d’une base de données Microsoft Access ou
Microsoft SQL Server avec une feuille UserForm.
Ce chapitre constitue une brève introduction à l’utilisation des bases de données
comme Microsoft Access et Microsoft SQL Server dans Microsoft Excel. La con-
ception d’une base de données sort de la portée de ce livre et nous n’en parlerons
pas. Il existe un certain nombre d’excellents ouvrages traitant de Microsoft
Visual Basic et de la programmation des bases de données. Dans le contexte de la
programmation Excel 2003, intéressez-vous de préférence aux ouvrages dédiés à
la programmation des bases de données pour Visual Basic 6 et non pour
Visual Basic .NET. Visual Basic .NET n’est pas compatible avec les fonctionnali-
tés Visual Basic pour Applications (VBA) présentes dans Excel. En revanche,
Visual Basic 6 présente de nombreuses similitudes avec VBA et exploite les
mêmes outils (en particulier ADO) pour accéder aux bases de données. Les tech-
niques de programmation de Visual Basic 6 peuvent être transposées dans Excel
et VBA sans changement.

Comparaison des tableurs et des bases de


données
À bien des égards, une feuille de calcul, qui se compose de séries de lignes et de
colonnes, ressemble à une table d’une base de données relationnelle. Cette simi-
litude fait de la feuille de calcul un puissant outil pour manipuler les informa-
tions issues d’une base de données.

499
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Concepts essentiels des bases de données


Une base de données relationnelle se compose d’une série de tables. Chaque table
correspond à une feuille de calcul. Une table est structurée en séries de lignes et
de colonnes de données (voir figure 22.1).

Figure 22-1. La structure d’une table de base de données se compose de


lignes et de colonnes.

Contrairement à une feuille de calcul, une table de base de données ne comporte


pas de numéros de ligne et les colonnes ne portent pas de noms arbitraires, tels
que A, B ou C. Au lieu de cela, les tables se basent sur la théorie des jeux, ce qui
signifie que l’on traite des groupes de lignes et non des colonnes individuelles.
Un jeu de lignes extrait d’une ou de plusieurs tables peut être considéré comme
Chapitre 22

une table virtuelle ou une vue. Les tables employées pour créer une vue sont dites
tables de base. On peut créer une vue à partir d’une ou de plusieurs tables ou
d’autres vues de la base de données. De nombreuses opérations effectuées sur
une base de données relationnelle créent ou retournent des tables virtuelles, d’où
l’importance des vues.
Contrairement aux feuilles de calcul, dont les cellules peuvent stocker divers
types de données, dans une base de données relationnelle, chaque colonne con-
tient un seul type de données : nombre binaire, chaîne de caractères, valeur boo-
léenne, valeur date/heure ou valeur binaire non formatée. En outre, une colonne
dans une ligne particulière peut contenir une valeur Null, ce qui signifie
qu’aucune valeur n’a été assignée à la colonne. Remarquez qu’une chaîne vide et
une valeur Null sont deux choses différentes : une chaîne vide est une chaîne
contenant zéro caractère, alors que Null signifie simplement que la colonne ne
possède pas de valeur.

Remarque Il est possible de créer des tables dans lesquelles les valeurs Null
ne sont pas acceptables dans une ou plusieurs colonnes. Reportez-vous à la
document de votre base de données pour plus d’informations sur la gestion
des valeurs Null.

500
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL
En raison de la structure rigide imposée aux tables, les données sont générale-
ment réparties en plusieurs tables, chacune contenant des informations relatives
à une entité. Ainsi, une table peut contenir des informations sur les clients, une
autre sur les produits et une troisième sur les commandes passées par les clients.
On manipule cette organisation complexe des données avec le langage SQL
(Structured Query Language). Les instructions SQL permettent de retrouver des
données et d’actualiser des informations stockées dans les tables.

Au Quotidien
Conception et administration de bases de données

La conception et l’exploitation des bases de données représentent des tâches


complexes. Dans la plupart des organisations, plusieurs personnes sont res-
ponsables du système de base de données. Ce fait est d’autant plus avérer si
elles exploitent des bases de données haute performance comme Microsoft
SQL Server, Oracle ou DB2. Si vous n’êtes pas sûr que ces bases de données
fonctionnent au sein de votre organisation, adressez-vous à l’administrateur
des bases de données. Il devrait être capable de répondre à de nombreuses
questions relatives à votre environnement spécifique.

Si votre entreprise exploite un système de base de données simple, comme


Access, elle n’emploie pas nécessairement d’administrateur des bases de
données. Dans ce cas, adressez-vous à la personne qui a écrit les program-
mes de la base de données. Celle-ci devrait pouvoir vous fournir les informa-
tions, comme les chaînes de connexion, dont vous avez besoin pour ouvrir une
base de données à partir d’Excel.

Chapitre 22
Pour créer votre propre base de données, restez simple. Si vous ne disposez
que d’une centaine de données, servez-vous de quelques feuilles de calcul
Excel. Elles seront plus simples à maintenir que de construire une base de
données réelle.

Si vous pensez qu’une base de données est indispensable, prenez le temps


de lire quelques livres sur le sujet comme Microsoft Office Access Inside Out
de John L. Viescas (Microsoft Press, 2003). Rappelez-vous qu’il est facile de
concevoir une base de données assez complexe pour qu’elle ne réponde plus
à vos besoins d’origine.

Clés de base de données


Une clé de base de données permet d’identifier un jeu de lignes dans une table. La
clé primaire d’une table identifie de manière unique une ligne particulière de la
table. Souvent, la clé primaire est une colonne unique, comme IdClient ou IdEm-
ployé, qui identifie de manière unique une ligne des tables Clients ou Employés.
Il est cependant souhaitable que la clé primaire d’une table s’étende sur plusieurs
colonnes. Autrement dit, la combinaison de NumCommande et NumArticle

501
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


identifie de manière unique un article particulier acheté dans le cadre d’une
commande.
Une clé secondaire est différente d’une clé primaire en ce qu’il n’est pas nécessaire
qu’elle identifie de manière unique une ligne. En fait, les clés secondaires servent
à localiser des groupes de lignes possédant un point commun, comme tous les
clients d’une ville ou toutes les commandes passées à la même date.
Une clé externe est une clé secondaire dans une table et la clé primaire dans une
autre table. Les clés externes identifient un groupe de données connexes comme
une collection de commandes passées par un client particulier ou le nombre
d’articles d’une même commande.

Astuce Les index font gagner du temps


Les clés primaires et les clés externes servent souvent à optimiser l’accès aux
bases de données. Les concepteurs exploitent les clés pour créer des index
dans les tables, ce qui accélère significativement l’accès à un jeu de lignes
particulier. Lorsque c’est possible, utilisez les index dans les critères de vos
recherches au sein d’une base de données.

Certaines bases de données, y compris Microsoft Access, permettent de définir


une colonne d’identification. Une colonne d’identification (également appelée
NuméroAuto dans Access) génère automatiquement une nouvelle valeur
lorsqu’on insère une ligne dans la table. Ce type de colonne est extrêmement
utile en tant que clé primaire d’une table. En effet, la base de données garantit
que la valeur est unique.
Chapitre 22

Accéder aux bases de données à partir d’Excel


Les boîtes de dialogue s’organisent généralement autour du concept client/ser-
veur (voir figure 22.2). Ce modèle suppose que le serveur de bases de données est
séparé du programme de boîte de dialogue qui y accède. Un programme de base
de données exploite une API (Application Programming Interface) particulière,
qui communique avec le serveur de bases de données.

Client
Serveur
Figure 22-2. Les bases de données s’organisent souvent sous la forme d’un
client communiquant avec un serveur de bases de données.

Excel accède aux bases de données par l’intermédiaire d’une API appelée ADO
(Active Data Objects). ADO est un composant standard de Microsoft Windows ;
il est donc toujours disponible pour le programme. Par le biais d’ADO, vous

502
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL
pouvez vous connecter à une grande variété de bases de données différentes,
dont Access, SQL Server, Oracle et bien d’autres.

Remarque Bien qu’Access ne se base pas sur le traditionnel modèle client/


serveur, il utilise l’interface ADO pour se connecter à une base de données
Access.

Une fois la connexion établie avec la base de données via ADO, vous pouvez exé-
cuter des instructions SQL pour retourner des données à l’application ou modi-
fier les données stockées dans une table.

Manipulation des bases de données avec SQL


SQL propose une riche collection d’instructions permettant de manipuler les
données dans une base de données relationnelle. Dans la pratique, la plupart de
ces instructions s’appliquent à la création ou à la modification des tables ou
d’autres objets stockés dans la base de données. En fait, le programmeur moyen
ne doit réellement comprendre que quatre instructions principales pour écrire
des programmes de base de données.
● L’instruction Select spécifie les lignes de données à retrouver dans la base
de données.
● L’instruction Delete spécifie les lignes de données à supprimer de la base de
données.
● L’instruction Insert spécifie les lignes de données à ajouter à la base de don-

Chapitre 22
nées.
● L’instruction Update spécifie comment changer les lignes de données exis-
tantes dans la base de données.
Voici par exemple une instruction Select qui trouve quelques lignes d’informa-
tions client.

Select IdClient, Nom, Ville, Pays


From Clients
Where Pays = 'DE'

Cette instruction Select retourne un jeu de lignes qui contient quatre colonnes,
IdClient, Nom, Ville et Pays, issues de la table Clients. Cependant, au lieu de
retourner chaque ligne de la table, seules celles dont la colonne Pays contient la
chaîne ‘DE’ sont retournées. Les autres instructions sont aussi simples à utiliser.
Les instructions possèdent un certain nombre de clauses communes, ce qui
signifie que si l’on sait employer l’une des instructions, il est assez simple
d’apprendre à utiliser les autres.

503
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Remarque Bien que le langage SQL soit un standard international, chaque


distributeur de bases de données est libre d’ajouter des extensions. Cela
signifie généralement que la syntaxe exacte du langage SQL varie d’une base
de données à une autre. Pour l’essentiel, ces différences ne sont pas impor-
tantes, en particulier si on s’en tient au cœur de la syntaxe.

L’instruction Select
L’instruction Select sert à retrouver un jeu de lignes issues d’une ou de plusieurs
tables et constitue dans aucun doute l’instruction la plus couramment employée
dans le langage SQL. Voici sa syntaxe :

Select <selectexpression> [,<selectexpression>]…


From <tableref> [,<tableref>]…
[Where <expression>]
[Order By <expression> [Asc|Desc] [, <expression> [Asc|Desc] ] …
Where
<selectexpression> ::= * |
<selectitem> [ [As] <alias> ]
<selectitem> ::= <column> |
<table>.<column> |
<tablealias>.<column>
<expression> |
<function> ( <expression> )
<function> ::= Count |
Max |
Min |
Sum
Chapitre 22

<tableref> ::= <table> |


<table> <tablealias>

Où <alias> constitue un nom alternatif pour une colonne, <tablealias> repré-


sente un nom alternatif pour une table et <expression> est une expression
valide.

Remarque L’instruction Select est l’instruction la plus complexe du langage


SQL. Même si la syntaxe du code précédent semble impressionnante, rappe-
lez-vous qu’elle représente uniquement une petite part de la syntaxe complète
d’une instruction Select. Cependant, la syntaxe que nous vous présentons est
généralement supportée par tous les fournisseurs de bases de données et
vous pourrez l’exploiter avec la majorité des applications.

Instructions Select simples


Au lieu de passer un temps inutile à tenter d’apprendre les règles de syntaxe de
l’instruction Select, nous allons étudier une série d’exemples de situations classi-
ques qui en illustrent l’emploi.

504
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL

Tout extraire
L’instruction Select suivante extrait toutes les colonnes et lignes de la table
Clients :

Select *
From Clients

L’astérisque (*) indique que toutes les colonnes de la table doivent être récupé-
rées et la clause From indique que la commande doit extraire les enregistrements
de la table Clients.

Extraire une liste de colonnes


Supposons que vous ne vouliez pas extraire toutes les colonnes d’une table. Vous
pouvez faire appel à l’instruction Select suivante pour retrouver uniquement les
colonnes de votre choix. Cette requête extrait uniquement les colonnes IdClient
et Nom de la table Clients.

Select IdClient, Nom


From Clients

Astuce Juste ce qu’il faut


Même si l’utilisation de l’astérisque (*) pour retrouver des colonnes simplifie
la saisie de l’instruction SQL, elle peut être source de problèmes. Plus vous
extrayez de données d’une base de données, plus le traitement de la requête
sera long et plus vous exploiterez de mémoire pour conserver les résultats.

Chapitre 22
Nous vous accordons que le temps et l’espace supplémentaires sont parfois
négligeables pour certaines requêtes, mais le fait d’exploiter uniquement les
ressources nécessaires constitue une bonne pratique de programmation.

Extraire des lignes


Les deux précédents exemples extraient toutes les lignes de données de la base de
données. Si cette technique présente des avantages dans bien des situations, elle
peut également engendrer quelques problèmes. Imaginons que vous travailliez
pour une grande entreprise dont les tables contiennent des millions de lignes de
données. L’extraction des données déborderait n’importe quel ordinateur. Si
votre seul but est d’extraire les lignes associées à un client ou un code postal spé-
cifiques, au lieu de retourner toutes les lignes d’une table, vous pouvez faire
appel à la clause Where pour sélectionner les lignes de votre choix.

505
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Important Si l’instruction Select ne comporte pas de clause Where, deman-


dez-vous si vous avez réellement besoin de toutes ces données ou unique-
ment de quelques lignes. Il est parfois nécessaire d’extraire toutes les lignes
d’une table (par exemple, pour copier une table sur une feuille de calcul).
Néanmoins, dans la plupart des cas, l’opération est souvent inutile et impacte
négativement les performances du serveur.

Expressions de recherche simples


La clause Where implique la création d’une expression qui identifie les lignes à
extraire. Si l’expression est True, la ligne est retournée ; sinon, elle est ignorée.
Par exemple, l’instruction Select suivante, récupère uniquement les lignes dans
lesquelles IdClient est égal à 101. La colonne IdClient constituant la clé primaire
de la table, cette instruction retourne toujours une seule ligne.

Select *
From Clients
Where IdClient = 101

Remarquez que vous pouvez utiliser d’autres opérateurs de comparaison dans la


clause Where. Outre le signe égal (=), vous pouvez faire appel au signe inférieur
à (<), supérieur à (>), inférieur ou égal à (<=), supérieur ou égal à (>=) ou le
signe différent de (<>).

Expressions de recherche complexes


Chapitre 22

Vous disposez également d’autres opérateurs comme And, Or et Not pour créer
des expressions plus complexes. Cette requête choisit chaque client ajouté en
2003.

Select *
From Clients
Where DateAjout >= '01-Jan-2003' And DateAjout <= '31-Dec-2003'

Remarque Dans la syntaxe SQL, les valeurs non numériques comme les
chaînes de caractères et les dates, doivent être placées entre guillemets sim-
ples (‘). Les guillemets doubles (") encadrent les noms de colonnes et de
tables contenant des espaces.

Expression Null
Pour déterminer si une colonne ne contient pas de valeur dans un champ parti-
culier, servez-vous de l’expression Is Null. L’exemple suivant retourne unique-
ment les lignes dans lesquelles le champ DateAjout contient une valeur Null.

Select *
From Clients
Where DateAjout Is Null

506
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL

Opérateur Like
L’opérateur Like constitue un outil puissant qui permet de rechercher des valeurs
au sein d’une colonne avec des caractères génériques. Par exemple, l’instruction
Select suivante recherche chaque client dont la valeur de la colonne Nom com-
mence par les lettres Free :

Select *
From Clients
Where Nom Like 'Free*'

Le tableau 22.1 liste les caractères génériques que vous pouvez employer avec
une base de données Access. Rappelez-vous que ces caractères sont utilisables
dans n’importe quelle combinaison, comme dans l’instruction Select suivante,
qui extrait tous les clients dons les noms commencent par D, E ou F.

Select *
From Clients
Where Nom Like '[D-F]*'

Tableau 22-1. Caractères génériques dans Access


Caractère Signification Exemples
* Correspond à zéro ou plusieurs caractères. A*
True : A, AA, AB, ACC
False : B, BA
A*A
True : AA, AAA, ABA, ACCA

Chapitre 22
False : AB, AAB
*A*
True : A, AB, CAC, DADD
False : B, BB, CCC
? Correspond à un seul caractère. A?
True : AA, AB, AC
False : AAA, BA
# Correspond à un seul chiffre. A#
True : A0, A9
False : AA, A00
[] Correspond au caractère ou à la plage de A[*]A
caractères spécifiés entre les crochets. True : A*A
Rappelez-vous que l’utilisation du point False : AAA
d'exclamation (!) signifie que les caractères A[D-F]A
qui se trouvent en-dehors de la plage True : ADA, AFA
correspondent à la valeur. False : AAA, ADAA
A[!0-9]
True : AA, AB
False : A0, A9

507
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Si possible, limitez l’usage des opérateurs Like aux colonnes faisant partie d’un
index. Sans l’index, la requête doit examiner chaque ligne de la base de données
pour trouver celles qui correspondent. En outre, même avec un index, vous
obtiendrez de meilleures performances si vous utilisez des caractères génériques
à la fin de chaque chaîne de recherche.

Remarque Chaque système de base de données possède son propre jeu de


caractères génériques. Par exemple, l’astérisque (*) utilisé par Access devient
le signe pourcentage (%) dans SQL Server. Vérifiez que vous utilisez les carac-
tères génériques appropriés au programme.

Trier les lignes


Dans une base de données relationnelle, le serveur de bases de données est libre
de retourner les lignes dans n’importe quel ordre. Pour parer à cet inconvénient,
vous pouvez faire appel à la clause Order By. Celle-ci oblige le serveur de bases de
données à retourner le résultat dans l’ordre que vous spécifiez. Par exemple,
l’instruction Select suivante extrait tous les clients de la base de données par
ordre chronologique de code postal :

Select Nom, Rue, CodePostal, Ville


From Clients
Order By CodePostal

L’instruction Select trie les lignes par code postal puis par nom du client au sein
de chaque code postal.
Chapitre 22

Select Nom, Rue, CodePostal, Ville


From Clients
Order By CodePostal, Nom

Pour finir, vous pouvez employer le mot-clé Desc (abréviation de descending,


décroissant) pour inverser l’ordre de tri dans l’instruction Select. Ainsi, bien que
les lignes soient stockées selon l’ordre croissant par code postal, au sein de cha-
que code postal, les noms des clients sont triés de Z à A (ordre décroissant) au
lieu de A à Z (ordre croissant).

Select Nom, Rue, CodePostal, Ville


From Clients
Order By CodePostal, Nom Desc

Utilisation de plusieurs tables


Pour l’instant, nous avons vu comment utiliser l’instruction Select avec une seule
table. Il est possible d’extraire des lignes issues de plusieurs tables pour créer une
unique table virtuelle. Cette opération s’appelle une jointure. Pour spécifier plu-
sieurs noms de tables, il suffit d’ajouter une clause From à l’instruction Select.
Cependant, la jointure de deux tables est complexe et vous n’obtiendrez pas
nécessairement les résultats attendus.

508
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL

Jointure de deux tables : mauvaise méthode


Si vous supposez que la jointure de deux tables aboutit à une combinaison de
toutes les colonnes des deux tables, vous avez raison. Toutefois, si vous supposez
que les lignes se combinent intelligemment, vous avez tort.
La spécification de deux noms de table dans une instruction Select signifie sim-
plement que la base de données combine la première ligne de la première table
avec chaque ligne de la deuxième table. Elle prend ensuite la deuxième ligne de la
première table et la combine avec chaque ligne de la deuxième table. Ce proces-
sus se répète pour chaque ligne de la première table, ce qui signifie que si la pre-
mière table contient 100 lignes et la deuxième 200 lignes, la jointure des deux
tables retourne une table de 20 000 lignes.

Jointure de deux tables : bonne méthode


Au lieu de joindre toutes les lignes de la première table à celles de la deuxième,
servez-vous d’une clause Where pour identifier la jointure. On joint générale-
ment deux tables lorsqu’une valeur particulière d’une table est similaire à une
valeur d’une autre table. Prenons l’exemple de deux tables : l’une contient des
clients, alors que le deuxième contient des commandes passées par les clients.
Chaque client de la table Clients possède un champ qui l’identifie de manière
unique, comme IdClient.
De même, la table Commandes possède un champ qui indique le client qui a
passé la commande. Supposons que ce champ s’intitule également IdClient. Sup-
posons maintenant que vous vouliez créer une liste de tous les clients et des com-

Chapitre 22
mandes qu’ils ont passées. Vous joignez la table Clients à la table Commandes,
mais uniquement lorsque le champ IdClient de chaque table est identique de
sorte à mettre en relation les informations relatives à un client et ses commandes.

Résoudre les noms de colonnes


Si vous tentez de coder l’exemple précédent sous la forme d’une instruction
Select, vous risquez de rencontrer un problème puisque les deux tables possèdent
une colonne IdClient. Heureusement, l’instruction Select permet d’exploiter la
notation par point pour combiner le nom de la table et le nom de la colonne et
identifier de manière unique une colonne. La forme est la suivante <nomta-
ble>.<nomcolonne>. Ainsi, dans le cadre du précédent exemple, on se réfère aux
colonnes sous la forme Clients.IdClient et Commandes.IdClient. L’instruction
Select qui en découle est la suivante :

Select *
From Clients, Commandes
Where Clients.IdClient = Commandes.IdClient

509
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Alias
À l’instar d’Excel qui permet de créer des noms que l’on utilise pour faire réfé-
rence à des groupes de cellules, SQL permet de définir des alias pour un nom de
table. Un alias est un nom court que l’on peut employer à la place du nom de la
table. Pour définir un alias, vous faites suivre le nom de la table par son alias lors-
que vous faites référence à la table dans la clause From.

Select *
From Clients cl, Commandes cd
Where cl.IdClient = cd.IdClient

Fonctions
L’instruction Select permet d’effectuer des opérations de synthétisation sur le jeu
complet des lignes normalement retournées. À l’instar des opérations de syn-
thèse dans Excel (comme SOMME, NB ou NB.VIDE) qui retournent une valeur
unique, les fonctions récapitulatives de SQL retournent une seule ligne conte-
nant le résultat de la fonction. Par exemple, vous pouvez compter le nombre
d’enregistrements que retourne une instruction Select en vous servant de la fonc-
tion COUNT pour compter le nombre de valeurs IdClient retrouvées.

Select Count(IdClient)
From Clients

Parmi les fonctions disponibles, on trouve également : MIN, MAX et AVERAGE.


Si la fonction COUNT compte chaque ligne, sachez que les autres fonctions
Chapitre 22

exploitent la valeur contenue dans chaque colonne. MAX et MIN retournent res-
pectivement les pus grandes et les plus petites valeurs de la colonne. La fonction
AVERAGE totalise toutes les valeurs de la colonne puis divise le résultat par le
nombre de lignes. Si vous appliquez la fonction AVERAGE à une colonne qui ne
contient pas de valeurs numériques, vous obtiendrez une erreur.

L’instruction Insert
L’instruction Insert ajoute une nouvelle ligne à la table. Voici sa syntaxe :

Insert [Into] <table> [(<column> [, <column> ]…)]


[Values (<value> [, <value> ]…)]

Où <table> est le nom de la table dans laquelle la nouvelle ligne sera ajoutée,
<colonne> représente le nom d’une colonne de la table et <value> est la valeur de
la colonne correspondante.

Remarque À l’instar de l’instruction Select, la syntaxe présentée ici ne cons-


titue qu’une partie de la syntaxe complète de l’instruction Insert. Cependant,
les informations présentées fonctionnent avec presque tous les serveurs de
bases de données. Consultez la documentation du distributeur de la base de
données pour découvrir le jeu complet des options de l’instruction Insert.

510
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL

Utiliser l’instruction Insert


Dans l’instruction Insert, vous spécifiez le nom de la table dans laquelle vous
voulez ajouter la ligne, suivi en option, d’une liste des noms de colonnes et d’une
liste de valeurs à insérer dans la base de données. La position de chaque valeur
dans la liste des valeurs correspond à la position de la colonne dans la liste des
colonnes. Si vous n’indiquez pas toutes les colonnes dans l’instruction Insert, cel-
les qui ne sont pas listées sont positionnées sur Null.
Bien que la liste des noms de colonnes soit optionnelle, il est préférable de l’ajou-
ter. Dans le cas contraire, vous devrez en effet vous assurer que les valeurs sont
listées dans le même ordre que les colonnes dans la base de données. Même si ce
point n’est pas difficile à vérifier, si vous commettez une erreur ou, plus impor-
tant encore, si la base de données a été modifiée, l’ordre des colonnes peut avoir
changé.

Attention Si la table contient une colonne Identité, ne l’incluez pas dans la


liste des colonnes quand vous exécutez une instruction Insert. La base de
données retourne généralement une erreur si on tente explicitement d’insérer
une valeur dans la colonne Identité. Il existe des techniques permettant
d’insérer une valeur au lieu de laisser cette tâche à la base de données. Con-
sultez la documentation de votre système de base de données pour plus
d’informations.

L’instruction suivante montre comment insérer une nouvelle ligne de données


dans la table Clients. On stocke la valeur 12345 dans la colonne IdClient, on

Chapitre 22
stocke un client dans la colonne Nom et ainsi de suite. Toute colonne non spéci-
fiée dans cette liste contient Null.

Insert Into Clients (IdClient, Nom, Rue, CodePostal, Ville)


Values (12345, 'un client', 'dans une rue', 68200, 'Colmar')

L’instruction Update
L’instruction Update change les valeurs d’une ou de plusieurs colonnes de la
table. Voici sa syntaxe :

Update <table>
Set <column> = <value> [, <column> = <value>]…
[Where <expression>]

Où <table> représente le nom de la table à mettre à jour, <colonne> désigne le


nom de la colonne dans la table, <value> correspond à la nouvelle valeur stockée
dans la colonne et <expression> est True pour toutes les lignes à actualiser.
L’instruction Update permet de modifier la valeur d’une ou de plusieurs colon-
nes dans une table. Vous devez explicitement spécifier chaque colonne à modi-
fier, ainsi que la nouvelle valeur de la colonne. Rappelez-vous également que
l’instruction Update peut contenir une clause Where. Cette dernière est identi-

511
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


que à celle employée dans l’instruction Select et fonctionne de la même manière.
Seules les lignes qui correspondent à l’expression de la clause Where sont mises à
jour ; les autres lignes ne changent pas.

Astuce Restez dans les limites


Si votre instruction Update ne contient pas de clause Where, demandez-vous
« est-ce que je souhaite réellement modifier toutes les lignes de la table ? ». Si
la réponse est non, vérifiez l’instruction deux fois avant de l’exécuter.

Dans cet exemple, la clause Where sert à identifier toutes les lignes qui contien-
nent une valeur Null dans le champ NouvelleDate. La colonne NouvelleDate est
ensuite positionnée sur ‘01-Jan-2003’.

Update Clients
Set NouvelleDate = '01-Jan-2003'
Where NouvelleDate Is Null

L’instruction Delete
L’instruction Delete supprimer des lignes d’une table. Voici sa syntaxe :

Delete From <table>


[Where <expression>]

Où <table> désigne le nom de la table à actualiser et <expression> est True pour


toutes les lignes à actualiser.
Chapitre 22

L’instruction Delete permet de supprimer une ou plusieurs lignes d’une table. Si


vous spécifiez simplement Delete From Clients, vous supprimez toutes les
lignes de la table Clients. Sauf si vous voulez réellement vider la table, évitez cette
instruction. Pour limiter le nombre de lignes à supprimer, servez-vous d’une
clause Where dans l’instruction Select.

Attention Si vous supprimez accidentellement toutes les lignes de la table,


vous risquez d’être ennuyé. Une fois les lignes supprimées, il est impossible
de les récupérer. Contrairement à Excel, il n’existe pas de fonction Annuler
pour une base de données : appuyer sur CTRL+Z n’annule pas les modifica-
tions. Il existe des techniques (par exemple, l’utilisation de transactions) que
les programmeurs avancés de bases de données peuvent exploiter pour récu-
pérer ce type d’erreur, mais en général, une fois les lignes supprimées, il est
préférable de supposer qu’elles n’existent plus.

L’exemple suivant supprime toutes les lignes dont la valeur NouvelleDate est
antérieure au 31 Décembre 2002.

Delete From Clients


Where NouvelleDate <= '31-Dec-2002'

512
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et SQL
Dans ce chapitre, vous avez découvert le fonctionnement des bases de données
relationnelles, comme Microsoft Access et Microsoft SQL Server. Nous vous
avons également présenté le langage Structured Query Language, plus communé-
ment appelé SQL. Ce langage définit les instructions qui permettent d’extraire
des données d’une base de données (Select), d’ajouter des données à une base de
données (Insert), de modifier les données d’une base de données (Update) et de
supprimer les données d’une base de données (Delete).

Chapitre 22

513
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 23
Introduction à ADO
Le modèle d'objet ADO . . . . . . . 515 L’objet Command . . . . . . . . . . . 521
L’objet Connection . . . . . . . . . . . 517 L’objet Recordset. . . . . . . . . . . . 525

Les objets ADO (ActiveX Data Objects) permettent d’employer Excel VBA pour
accéder à une base de données. ADO est basé sur le modèle fournisseur de don-
nées/consommateur de données (voir figure 23.1). Le concept de ce modèle est
similaire au modèle client/serveur, excepté que ce dernier suppose généralement
que la base de données fonctionne en tant que serveur indépendant. Cette res-
triction ne s’applique pas à ADO.

Requête
Fournisseur Consommateur
de données Réponse de données

Figure 23-1. Un consommateur de données demande des données à un


fournisseur de données qui retourne une réponse relative à la requête.

ADO exige uniquement que le fournisseur de données fournisse des données


relatives à la requête du consommateur de données. Le fournisseur de données et
le consommateur de données communiquent via le protocole OLE DB. Autre-
ment dit, tant qu’un programme dispose d’une routine d’approvisionnement de
données compatible OLE DB, il peut apparaître comme une base de données à
une application. Ainsi, de nombreux programmes que l’on ne considère pas
comme des fournisseurs de bases de données peuvent servir de sources de don-
nées à Microsoft Excel VBA, en plus d’Excel.

Remarque Outre ADO, vous pouvez faire appel à d’autres interfaces de pro-
grammation comme RDO (Remote Database Objects) et DAO (Data Access
Objects) pour manipuler votre base de données. Ces deux API (Application Pro-
gramming Interface) de programmation sont très limitées comparées à ADO et
c’est la raison pour laquelle nous ne les étudions pas dans cet ouvrage. ADO
est plus souple et mieux supporté que RDO, alors que DAO est spécifiquement
optimisé pour les bases de données Microsoft Access. Sauf si vous devez
employer ces API pour une raison spécifique, préférez ADO.

Le modèle d'objet ADO


Le modèle d’objet ADO présente trois objets essentiels (voir figure 23.2). L’objet
Connection représente les informations nécessaires à l’établissement de la con-

515
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


nexion entre le consommateur de données et le fournisseur de données. L’objet
Command contient les informations relatives à une instruction SQL ou une
commande de base de données exécutée par le serveur de bases de données.
L’objet Recordset contient les lignes de la table virtuelle qui a été créée par l’objet
Command.

Objet
Connection

Collection
Errors

Objet Objet
Connection Connection

Collection
Parameters

Objet Objet
Recordset Parameter

Collection
Fields

Objet
Field

Figure 23-2. Quelques objets inclus dans le modèle d'objet ADO.

En-dehors de ces objets, il existe également quelques autres objets qui suppor-
Chapitre 23

tent ces objets principaux, parmi lesquels on trouve l’objet Error qui contient les
informations relatives aux erreurs qui se produisent et l’objet Parameter qui con-
tient les informations relatives aux paramètres associés à l’objet Command.
L’objet Field contient les informations concernant une colonne retournée dans
l’objet Recordset.

Utiliser le modèle d'objet ADO


Il existe deux scénarios de base qui dépendent de la commande à exécuter. Si la
commande ne retourne aucune ligne, servez-vous du scénario suivant.
1 Créez un objet Connection pour vous connecter à la base de données de
votre choix.
2 Ouvrez l’objet Connection.

516
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO
3 Préparez un objet Command qui contient la commande base de données à
exécuter.
4 Ajoutez tous les objets Parameter nécessaires à l’objet Command, y com-
pris les valeurs à passer à la commande. Rappelez-vous que les comman-
des ne requièrent pas toutes des paramètres.
5 Définissez la propriété ActiveConnection sur l’objet Connection.
6 Exécutez l’objet Command.
7 Fermez l’objet Connection.
Si la commande retourne des lignes de la base de données, utilisez l’approche
suivante :
1 Créez un objet Connection pour vous connecter à la base de données de
votre choix.
2 Ouvrez l’objet Connection.
3 Préparez un objet Command qui contient la commande base de données à
exécuter.
4 Ajoutez les objets Parameter nécessaires à l’objet Command, si l’objet
Command possède des paramètres.
5 Définissez la propriété ActiveConnection sur l’objet Connection.
6 Créez un nouvel objet Recordset avec toutes les options que vous prévoyez
d’employer.
7 Positionnez la propriété ActiveCommand de l’objet Recordset sur l’objet
Command que vous avez créé.
8 Ouvrez l’objet Recordset.
9 Extrayez les lignes de l’objet Recordset.
10 Fermez l’objet Recordset.
11 Fermez l’objet Connection.

L’objet Connection Chapitre 23


L’objet Connection décrit la connexion entre l’application et le serveur de bases
de données. Associé à la collection Errors et à l’objet Error, l’objet Connection
contrôle la connexion logique à la base de données.

Principales propriétés et méthodes de l’objet Connection


Le tableau 23.1 liste les principales propriétés et méthodes associées à l’objet
Connection.

517
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Tableau 23-1. Principales propriétés et méthodes de l’objet Connection


Propriété/Méthode Description
Close Méthode : ferme la connexion à la base de données.
ConnectionString Propriété : définit comment se connecter à la base de
données.
CursorLocation Propriété : spécifie où le pointeur de l’enregistrement en
cours est conservé. Les options sont : adUseClient ou
adUseServer.
Errors Propriété : pointeur vers un objet collection Errors
contenant la liste des objets Error individuels qui décrivent
l’erreur la plus récemment rencontrée sur la connexion.
Mode Propriété : détermine comment on ouvre la base de
données. Les options sont : adModeRead, adModeWrite,
adModeReadWrite, adModeShareDenyRead,
adModeShareDenyWrite, adModeShareExclusive ou
adModeShareDenyNone.
Open ConnectionString, Méthode : établit une connexion avec la base de données
UserId, Password en utilisant les valeurs ConnectionString, UserId et
Password fournies en option.
State Propriété : décrit l’état de la connexion. Les valeurs sont
adStateClosed ou adStateOpen.

La méthode Open ouvre une connexion à la base de données en se servant des


informations optionnelles. Si elles ne sont pas fournies, on utilise les informa-
tions de la propriété ConnectionString. La méthode Close termine une connexion
ouverte avec le serveur de bases de données. La propriété State permet de déter-
miner si la connexion avec la base de données est ouverte ou fermée.
La propriété CursorLocation détermine l’emplacement où est conservé le cur-
seur. On positionne en général cette propriété sur adUseServer pour simplifier la
programmation, en particulier si on utilise Access. Cependant, avec SQL Server,
Oracle, DB2 ou un autre serveur de bases de données partagé, consultez votre
Chapitre 23

administrateur de bases de données pour déterminer la valeur appropriée.


La propriété Mode détermine le niveau d’accès aux données nécessaire. La valeur
adModeRead signifie que votre programme lit uniquement les données dans la
base de données et qu’il peut coexister avec d’autres applications qui spécifient
adModeRead. Si vous prévoyez d’écrire uniquement dans la base de données (ce
qui n’est guère courant), vous pouvez vous servir de la valeur adModeWrite. En
revanche, si vous prévoyez de lire et d’écrire des informations dans la base de
données, choisissez la valeur adModeReadWrite.
Les propriétés adModeShareDenyRead, adModeShareDenyWrite et adModeSha-
reExclusive contrôlent la manière dont les autres programmes partagent la base
de données avec vous. En général, si plusieurs utilisateurs partagent la même

518
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO
base de données, consultez votre administrateur de bases de données pour con-
naître les valeurs appropriées de la propriété Mode.

Se connecter à différents systèmes de gestion de base de


données
La propriété ConnectionString est la plus importante propriété de l’objet Connec-
tion. Les informations exactes de la chaîne de connexion varient selon le type de
base de données à utiliser.
Les chaînes de connexion se composent d’une série de mots-clés et de valeurs
séparés par des points-virgules qui fournissent les informations nécessaires à la
localisation du fournisseur de données et de la base de données, ainsi que les
informations de sécurité nécessaires.

Se connecter à des bases de données Access


Avec les bases de données Access, vous êtes rarement obligé de fournir autre
chose qu’une chaîne de connexion contenant le nom de fournisseur et l’empla-
cement du fichier de la base de données :

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Excel2k3\Customer.mdb

Le mot-clé Provider sélectionne le fournisseur de données pour Access. Pour


Access 2000 et les bases de données plus récentes, servez-vous du fournisseur
Microsoft.Jet.OLEDB.4.0 et pour les bases de données plus anciennes, utilisez
Microsoft.Jet.OLEDB.3.51.

Remarque Le moteur de base de données généralement employé pour ali-


menter une base de données Access s’appelle Microsoft Jet. Plusieurs autres
produits se basent également sur le moteur Jet. Cependant, dans la mesure
où la majorité des utilisateurs accèdent à Jet par le biais d’Access, on se
réfère généralement à ce moteur en parlant d’Access.

Le mot-clé Data Source pointe vers l’emplacement de la boîte de dialogue sur le


Chapitre 23

disque. Il s’agit souvent d’un chemin d’accès à un fichier, comme celui de l’exem-
ple précédent, mais on peut également référencé un fichier via le format du par-
tage de fichier (\\athena\d\Excel2k3\Customer.mdb).

Se connecter à des boîtes de dialogue SQL Server


La chaîne de connexion qui permet de se connecter à des bases de données SQL
Server est quelque peu plus complexe, mais sans doute pas autant qu’on pourrait
s’y attendre.

Provider=SQLOLEDB.1;Data Source=athena.justpc.com;
Initial Catalog=Music;User ID=Wayne;Password=TopSecret

519
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Le mot-clé Provider référence SQLOLEDB.1, ce qui correspond au fournisseur
de données SQL Server.
Le mot-clé Data Source pointe sur le serveur de bases de données auquel vous
voulez accéder et le mot-clé Initial Catalog indique le nom de la base de données
sur le serveur de bases de données.
Pour finir, les mots-clés User ID et Password présentent les informations
d’authentification au serveur de bases de données. Pour vous servir des informa-
tions d’authentification Windows (l’identificateur que vous fournissez pour
ouvrir une session Windows), remplacez les mots-clés User ID et Password par le
mot-clé Integrated Security, comme dans la chaîne de connexion suivante :

Provider=SQLOLEDB.1;Data Source=athena.justpc.com;
Initial Catalog=Music;Integrated Security=SSPI

Se connecter à d’autres bases de données


Tant que vous récupérez le fournisseur de données approprié, vous pouvez vous
connecter à de nombreux types de bases de données différents, à la principale
condition que la base de données supporte OLE DB. Le tableau 23.2 liste certai-
nes de ces bases de données et leurs fournisseurs.
Tableau 23-2. Autres fournisseurs de données OLE DB
Base de données Fournisseur(s) de données
DB2 IBM OLE DB Provider for DB2
Oracle Microsoft OLE DB Provider for Oracle
Oracle Provider for OLE DB

Si la base de données que vous voulez utiliser ne supporte pas OLE DB, mais uni-
quement ODBC, Microsoft contient un fournisseur de données spécial intitulé
Microsoft OLE DB Provider for ODBC drivers, qui convertir les appels OLE DB
en ODBC. N’exploitez toutefois ce fournisseur que si vous ne trouvez pas de
fournisseur OLE DB. En effet, les performances en seront négativement impac-
tées.
Chapitre 23

Utiliser la collection Errors


La collection Errors contient des informations relatives aux erreurs qui se pro-
duisent pendant l’exécution d’une commande de base de données. Puisqu’il est
tout à fait possible qu’une erreur en déclenche plusieurs autres pendant l’exécu-
tion d’une commande, servez-vous toujours de l’objet VBA Err pour découvrir
la cause réelle de l’erreur. La collection ADO Errors contient un jeu complet des
erreurs qui surviennent pendant l’exécution d’une commande (voir
tableau 23.3).

520
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO

Tableau 23-3. Principales propriétés et méthodes de la collection Errors


Propriété/Méthode Description
Clear Méthode : supprime tous les éléments de la collection.
Count Propriété : retourne le nombre d’éléments dans la collection.
Item(index) Propriété : retourne l’objet Error qui se trouve à
l’emplacement spécifié par index.

Astuce Vider Err


L’objet Err ne fournit pas tous les détails concernant l’erreur, mais il permet
d’identifier l’erreur qui s’est produite. Pensez à utiliser la méthode Clear pour
supprimer les informations antérieures qui se trouvent dans l’objet Err avant
d’exécuter la requête.

L’objet de collection Errors représente un objet de collection classique contenant


une propriété Count et une propriété Item qui retourne un objet Error. Vous
pouvez faire appel à une boucle For…Each pour traiter tous les éléments de la
collection, puis faire appel à la méthode Clear pour supprimer tous les objets
Error de la collection.

Remarque La collection Errors est uniquement peuplée lorsqu’une erreur se


produit. Servez-vous de la méthode Clear avant d’exécuter une commande
pour éviter de détecter une erreur déjà gérée.

Utiliser l’objet Error


L’objet Error contient un certain nombre de propriétés qui décrivent une condi-
tion d’erreur spécifique (voir tableau 23.4). Pour l’essentiel, ces propriétés four-
nissent différentes perspectives de l’erreur, ce qui peut s’avérer nécessaire selon la
cause exacte de l’erreur.
Tableau 23-4. Principales propriétés de l’objet Error Chapitre 23

Propriété Description
Description Contient un court texte descriptif de l’erreur.
NativeError Contient un code d’erreur spécifique au fournisseur.
Number Contient le code d’erreur OLE DB.
SQLState Contient le code d’erreur ANSI SQL standard à cinq caractères.

L’objet Command
L’objet Command contient les informations relatives à la tâche exécutée par la
base de données. Selon le type de la commande à exécuter, vous devrez égale-
ment utiliser l’objet Parameter et la collection Parameters pour exécuter une pro-
cédure stockée.

521
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Principales propriétés et méthodes de l’objet Command


Le tableau 23.5 liste les principales propriétés et méthodes associées à l’objet
Command.
Tableau 23-5. Principales propriétés et méthodes de l’objet Command
Propriété/Méthode Description
ActiveConnection Propriété : pointe vers un objet Connection ouvert
qui va servir à exécuter la commande ou qui
contient une chaîne de connexion qui servira à
établir la connexion avec la base de données.
CommandText Propriété : la commande exécutée sur la base de
données.
CommandType Propriété : spécifie le type de commande dans
CommandText. Les valeurs possibles sont
adCmdText, adCmdTable ou adCmdStoredProc.
CreateParameter(Name, Type, Méthode : crée un objet Parameter en se servant
Direction, Size, Value) As Parameter des informations de type spécifiées.
Execute(RecordsAffected, Parameters, Méthode : exécute la commande et retourne
Options) As Recordset optionnellement un objet Recordset contenant
toute ligne retrouvée dans la base de données.
Name Propriété : contient le nom de la commande.
Parameters Propriété : pointeur vers un objet de collection
Parameters contenant les valeurs des paramètres
substituées dans la commande lors de son
exécution.

La propriété CommandText contient la commande à exécuter, alors que la pro-


priété CommandType décrit le type de commande stockée dans la propriété
CommandText. Vous pouvez créer trois types de commandes de base : les ins-
tructions SQL, les noms de tables et les procédures stockées.
Chapitre 23

Pour plus d’informations sur la syntaxe SQL, reportez-vous au chapitre 22, « Excel et
SQL ».

La propriété ActiveConnection contient soit une référence à un objet Connection


ouvert, soit une chaîne de connexion utilisée pour créer dynamiquement une
connexion à la base de données lorsque la méthode Execute est appelée.
La méthode CreateParameter crée un nouvel objet Parameter en se servant des
informations relatives au type de données. Une fois le nouvel objet Parameter
créé, vous devez l’ajouter à la collection Parameters par la biais de la méthode
Parameters.Append.

522
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO

Au Quotidien
Procédures stockées

Les procédures stockées sont des routines précompilées disponibles sur un


serveur de bases de données que l’on peut exécuter pour accomplir une tâche
de base de données. Bien qu’Access ne supporte pas les procédures stoc-
kées, de nombreux autres systèmes, comme SQL Server, Oracle et DB2, le
font.

En général, on écrit les procédures stockées avec des instructions SQL con-
nectées à d’autres instructions, comme les instructions If, les instructions de
boucle, les instructions Print et ainsi de suite. Chaque distributeur possède sa
propre syntaxe de ces instructions. En conséquence, les procédures stockées
ne sont pas portables d’un système de base de données à un autre. Elles sont
cependant bien plus rapides que l’exécution d’une instruction SQL. Lorsque
l’on crée des procédures stockées sur un serveur de bases de données, elles
sont stockées dans une forme précompilée, ce qui permet d’économiser des
ressources puisqu’il est inutile de compiler les instructions SQL chaque fois
que l’on exécute une commande.

Les procédures stockées ressemblent de bien des façons à des sous-routi-


nes. Vous pouvez créer des procédures stockées avec une liste de paramètres
et passer les valeurs de chaque paramètre lorsque vous exécutez la com-
mande. À nouveau, l’impact sur la vitesse et le rendement est important, ce
qui constitue l’une des principales inquiétudes des administrateurs de bases
de données. Pour finir, les procédures stockées offrent une autre manière de
sécuriser l’accès à la base de données. À l’heure actuelle, alors que les pira-
tes informatiques attaquent tous les types d’ordinateurs, nombreuses sont
les personnes qui considèrent que la sécurité est plus importante que la per-
formance.

Utiliser la collection Parameters


La collection Parameters contient des informations relatives aux paramètres
Chapitre 23

associés à l’objet Command (voir tableau 23.6).


Tableau 23-6. Propriétés et méthodes de la collection Parameters
Propriété/Méthode Description
Append(Parameter) Méthode : ajoute l’objet Parameter spécifié à la collection.
Count Propriété : retourne le nombre d’éléments dans la collection.
Delete(index) Méthode : supprime l’objet Parameter possédant l’index
spécifié.

523
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Tableau 23-6. Propriétés et méthodes de la collection Parameters (Suite)


Propriété/Méthode Description
Item(index) Propriété : retourne l’objet Parameter qui se trouve à
l’emplacement spécifié par index.
Refresh Méthode : se connecte à la base de données et extrait une
copie des informations de paramètres pour la procédure
stockée spécifiée dans CommandText.

La collection Parameters constitue pour l’essentiel un objet de collection classi-


que à deux différences près. La méthode Append sert à ajouter un nouvel objet
Parameter à la fin de la collection. Selon la manière dont les paramètres sont défi-
nis dans la commande, l’ordre peut s’avérer très important.
La méthode Refresh peuple la collection Parameters en se servant du nom de la
procédure stockée de la propriété CommandText. On évite ainsi le code supplé-
mentaire servant à définir manuellement tous les paramètres.

Remarque Bien que l’on puisse utiliser la méthode Refresh pour obtenir,
directement à partir de la base de données, une copie des paramètres d’une
procédure stockée, il n’est pas indispensable de le faire chaque fois que l’on
appelle la procédure stockée. La récupération des paramètres dans la base de
données est gourmande de temps système, d’autant plus si on appelle une
procédure stockée à partir d’une boucle.

Utiliser l’objet Parameter


L’objet Parameter contient un certain nombre de propriétés qui décrivent un
paramètre spécifique passé à une requête paramétrée ou une procédure stockée
(voir tableau 23.7).
Tableau 23-7. Principales propriétés de l’objet Parameter
Propriété Description
Direction Indique si le paramètre est un paramètre d’entrée (adParamInput), de
Chapitre 23

sortie (adParamOutput) ou d’entrée/sortie (adParamInputOutput) de la


procédure stockée.
Name Contient le nom du paramètre.
NumericScale Contient le nombre de chiffres à droite du séparateur décimal pour un
champ numérique.
Precision Contient le nombre total de chiffres dans un champ numérique.

524
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO

Tableau 23-7. Principales propriétés de l’objet Parameter (Suite)


Propriété Description
Type Contient le type de données associé au paramètre. Voici certaines des
valeurs classiques : adSmallInt, adInteger, asSingle, adDouble, adCurrency,
adDate, adBSTR, adBoolean, adDecimal, adBigInt, adBinary, adChar,
adWChar, adNumeric, adDBDate, adDBTime, adVarNumeric, adVarChar,
adLongVarChar, adVarWChar, adLongVarWChar, adVarBinary et
asLongVarBinary.
Value Contient la valeur du paramètre. Pour les paramètres d’entrée et les
paramètres d’entrée/sortie, cette valeur est passée à la procédure
stockée. Pour les paramètres d’entrée/sortie et les paramètres de sortie,
cette valeur est définie après l’exécution de la procédure stockée.

Chaque objet Parameter décrit un paramètre unique d’une procédure stockée.


La propriété Name doit correspondre au nom de paramètre défini dans la procé-
dure stockée. Vous devez spécifier le type de base de données associé au paramè-
tre, ainsi que la direction dans laquelle la valeur est passée.
La propriété Value contient la valeur passée et/ou retournée par la procédure
stockée. En général, on définit un objet Command ainsi que ses paramètres asso-
ciés une seule fois. Ensuite, on modifie le jeu de propriétés Value de sorte à passer
les informations appropriées à la procédure stockée.

L’objet Recordset
Lorsqu’une requête de base de données retourne des lignes à votre programme,
celles-ci sont mises à disposition par le biais de l’objet Recordset.

Principales propriétés et méthodes de l’objet Recordset


Le tableau 23.8 liste les principales propriétés et méthodes associées à l’objet
Recordset.
Chapitre 23
Tableau 23-8. Principales propriétés et méthodes
de l’objet Recordset
Propriété/Méthode Description
ActiveConnection Propriété : pointe vers un objet Connection ouvert qui va servir à
exécuter la commande ou qui contient une chaîne de connexion
qui servira à établir la connexion avec la base de données.
AddNew Méthode : ajoute une nouvelle ligne à la fin de l’objet Recordset.
BOF Propriété : retourne True si le pointeur de l’enregistrement en
cours précède le premier enregistrement de l’objet Recordset.
CancelUpdate Méthode : restaure la valeur d’origine de la ligne en cours dans
l’objet Recordset.

525
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Tableau 23-8. Principales propriétés et méthodes


de l’objet Recordset (Suite)
Propriété/Méthode Description
Close Méthode : ferme un objet Recordset ouvert et libère toutes ses
ressources.
Delete Méthode : Supprime l’enregistrement en cours.
EditMode Propriété : décrit l’état d’édition de l’enregistrement en cours.
Les valeurs possibles sont : adEditNone (enregistrement en
cours inchangé), adEditInProgress (enregistrement en cours
changé, mais pas enregistré), adEditAdd (la méthode AddNew a
créé un nouvel enregistrement vide qui n’a pas encore été
enregistré) ou adEditDelete (enregistrement en cours supprimé).
EOF Propriété : retourne True si le pointeur de l’enregistrement en
cours suit la dernière ligne de l’objet Recordset.
Fields Propriété : retourne une collection Fields contenant un jeu de
champs associé à l’enregistrement en cours.
Filter Propriété : il peut s’agir d’une chaîne contenant une expression
similaire à une clause Where SQL.
Move(NumRecords) Méthode : déplace le pointeur de l’enregistrement en cours vers
l’avant (valeur positive) ou vers l’arrière (valeur négative) du
nombre de lignes spécifié.
MoveFirst Méthode : déplace le pointeur de l’enregistrement en cours vers
la première ligne de l’objet Recordset.
MoveLast Méthode : déplace le pointeur de l’enregistrement en cours vers
la dernière ligne de l’objet Recordset.
MoveNext Méthode : déplace le pointeur de l’enregistrement en cours vers
la ligne suivante de l’objet Recordset.
MovePrevious Méthode : déplace le pointeur de l’enregistrement en cours vers
la ligne précédente de l’objet Recordset.
Open Méthode : accède aux données qui se trouvent dans l’objet
Chapitre 23

Recordset.
RecordCount Propriété : contient le nombre total de lignes extraites de la base
de données.
Sort Propriété : contient la liste des noms de colonnes selon lesquels
les résultats doivent être triés.
Source Propriété : contient soit une référence à un objet Command soit
une chaîne contenant une instruction SQL.
Update Méthode : enregistre tout changement effectué sur la ligne en
cours dans la base de données.

La propriété ActiveConnection pointe vers l’objet Connection associé à l’objet


Recordset ou elle contient une valeur de chaîne de connexion. Dans ce dernier

526
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO
cas, la connexion à la base de données est automatiquement ouverte lorsqu’on
ouvre l’objet Recordset.
La propriété Source contient soit une référence à un objet Command soit une
chaîne contenant le nom de la table, une procédure stockée ou une instruction
SQL. Si vous assignez un objet Command à la propriété Source, la lecture de cette
propriété retourne la valeur CommandText de l’objet Command au lieu d’une
référence d’objet.
Une fois que vous avez défini toutes les informations à extraire de la base de don-
nées, utilisez la méthode Open pour accéder aux informations qui se trouvent
dans l’objet Recordset. Une fois que vous disposez des données, servez-vous de la
méthode Close pour libérer toutes les ressources associées à l’objet Recordset.
Celui-ci expose les enregistrements retournés par la base de données ligne par
ligne. En interne, l’objet Recordset conserve un pointeur auquel on se réfère
comme le pointeur de l’enregistrement en cours et qui pointe vers l’enregistre-
ment en cours.
Dans la mesure où les enregistrements sont disponibles à raison d’un à la fois,
utilisez les méthodes de déplacement (MoveFirst, MovePrevious, MoveNext et
MoveLast) pour naviguer dans les enregistrements de l’objet Recordset. La
méthode Move permet d’avancer ou de reculer au sein de l’enregistrement du
nombre spécifié de lignes.
À mesure que vous parcourez les enregistrements de l’objet Recordset, les pro-
priétés BOF et EOF sont automatiquement redéfinies avec le déplacement du
pointeur de l’enregistrement en cours. BOF est l’abréviation de Beginning Of
File, début de fichier, et EOF celle de End Of File, fin de fichier.
Lorsque vous ouvrez l’objet Recordset, le pointeur de l’enregistrement en cours
pointe sur la première ligne. Si vous appelez la méthode MoveNext, le pointeur
de l’enregistrement en cours parcourt chaque ligne jusqu’à la dernière ligne
incluse. Si le pointeur de l’enregistrement en cours se trouve sur la dernière ligne,
en appelant la méthode MoveNext on positionne la propriété EOF sur True. Si
vous appelez à nouveau MoveNext, bien que la propriété EOF soit positionnée
sur True, vous obtenez une erreur.
Chapitre 23

Astuce Le bout du bout


N’appelez jamais la méthode MoveNext alors que la propriété EOF est position-
née sur True ni la méthode MovePrevious alors que la propriété BOF est posi-
tionnée sur True. Chacune de ces situations déclenche une erreur puisqu’il est
impossible de déplacer le pointeur de l’enregistrement en cours avant le début
(MovePrevious) ou après la fin (MoveNext) de l’objet Recordset.

La propriété RecordCount contient le nombre total de lignes extraites de la base


de données. Rappelez-vous que cette propriété peut posséder la valeur –1, ce qui
signifie que le total est inconnu pour l’instant. Dans ce cas, servez-vous de la

527
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


méthode MoveLast pour vous déplacer à la fin de l’objet Recordset, ce qui actua-
lise également la propriété RecordCount.
La propriété Filter peut servir différents objectifs. Le plus utile consiste à lui assi-
gner une valeur de chaîne qui contient une expression similaire à l’une de celles
employées dans une clause SQL Where. Cette technique peut être intéressante si
vous souhaitez restreindre l’objet Recordset au sous-ensemble de données que
vous venez d’extraire.

Astuce Le strict minimum


Bien que l’on puisse utiliser la propriété Filter pour afficher un sous-ensemble
de lignes retournées à partir de la base de données, il est toujours préférable
d’extraire uniquement les lignes à traiter.

Pour l’essentiel, la propriété Sort est similaire à la clause Order By de l’instruction


SQL Select. Assignez simplement une liste de noms de colonnes suivis d’un mot-
clé optionnel Asc ou Desc puis d’une virgule : ADO trie les lignes de l’objet
Recordset et les retourne à votre programme selon l’ordre choisi.
Pour accéder à chaque colonne individuelle, utilisez la collection Fields. Vous
pouvez extraire la valeur en cours de la colonne par le biais de l’objet Field ainsi
qu’en enregistrant une nouvelle valeur dans la colonne de la ligne en cours. En
modifiant l’une de ces valeurs, vous forcez la propriété EditMove à remplacer sa
valeur adEditNone par la valeur adEditInProgress. Une fois que vous avez terminé
d’effectuer des modifications, appelez la méthode Update pour les enregistrer
dans la base de données.
À l’heure d’écrire des données dans une table, commencez par vérifier que la
propriété EditMove est positionnée sur adEditAdd. Vous pouvez ensuite utiliser
la méthode AddNew pour insérer une ligne vide à la fin de l’objet Recordset, dans
lequel vous pouvez écrire la valeur de chaque colonne en vous servant des valeurs
de la collection Fields. Pour finir, utilisez la méthode Update pour enregistrer les
changements apportés à la base de données.
La méthode Delete supprime la ligne en cours et positionne la propriété Edit-
Chapitre 23

Move sur adEditDelete. À nouveau, servez-vous de la méthode Update pour les


derniers changements.
L’objet Recordset propose une autre fonctionnalité intéressante : la méthode
CancelUpdate. Si vous avez modifié la ligne en cours et que vous appelez cette
méthode, tous les changements sont annulés et les valeurs d’origine restaurées.
Si vous avez ajouté une nouvelle ligne avec la méthode AddNew, la nouvelle ligne
est supprimée et le pointeur de l’enregistrement en cours est réinitialisé pour
pointer vers la ligne sur laquelle il pointait avant l’appel de la méthode AddNew.

528
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Introduction à ADO

Utiliser la collection Fields


La collection Fields contient des informations relatives aux colonnes qui se trou-
vent dans la ligne en cours de l’objet Recordset (voir tableau 23.9).
Tableau 23-9. Principales propriétés de la collection Fields
Propriété/Méthode Description
Count Propriété : retourne le nombre d’éléments dans la collection.
Item(index) Propriété : retourne l’objet Field qui se trouve à l’emplacement
spécifié par index.

On utilise essentiellement la collection Fields pour accéder aux différents objets


Field associés à la ligne en cours. Les autres propriétés et méthodes de la collec-
tion Fields servent à ajouter et supprimer des objets Field de la collection et ne
sont pas indispensables au programmeur de bases de données moyen.

Utiliser l’objet Field


L’objet Field contient les informations relatives à une colonne unique associée à
la ligne en cours de l’objet Recordset. Le tableau 23.10 liste certaines des proprié-
tés les plus intéressantes.
Tableau 23-10. Principales propriétés de l’objet Field
Propriété Description
Name Contient le nom de la colonne tel que défini dans la base de données.
OriginalValue Contient la valeur d’origine du champ issu de la base de données.
Type Contient le type de données OLE DB de la colonne. Voici certaines des
valeurs classiques : adSmallInt, adInteger, asSingle, adDouble,
adCurrency, adDate, adBSTR, adBoolean, adDecimal, adBigInt, adBinary,
adChar, adWChar, adNumeric, adDBDate, adDBTime, adVarNumeric,
adVarChar, adLongVarChar, adVarWChar, adLongVarWChar, adVarBinary
et asLongVarBinary. Chapitre 23
UnderlyingValue Contient la valeur en cours de la colonne telle que trouvée dans la base
de données.
Value Contient la valeur du champ.

La propriété Name contient le nom de la colonne tel qu’il a été défini dans la base
de données ou l’instruction Select qui a retourné les lignes. La propriété Type
décrit le type OLE DB de la colonne.
Plusieurs propriétés différentes contiennent la valeur de la colonne de l’objet
Field. La propriété Value représente la valeur en cours de la colonne telle que
l’application la voit. Si votre programme ne change pas explicitement la pro-
priété Value, elle possède la même valeur que celle qui se trouve dans la propriété

529
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


OrginalValue. Cette propriété contient toujours la valeur la colonne telle qu’elle
a été extraite de la base de données.
D’autre part, la propriété UnderlyingValue contient la valeur la plus récente de la
colonne stockée dans la base de données. Dans la mesure où il est possible que la
base de données ait été actualisée depuis la création de l’objet Recordset, vous
pouvez utiliser la propriété UnderlyingValue pour revenir à la base de données et
récupérer une nouvelle copie de la colonne.

Remarque Servez-vous de la propriété UnderlyingValue avec précaution. En


effet, elle oblige ADO à revenir à la base de données pour récupérer la valeur
la plus récente. S’il n’y a aucun problème à effectuer cette action de temps en
temps, le faire de manière répétitive peut impacter négativement les perfor-
mances de l’application.

Dans ce chapitre, vous avez étudié les principaux objets de l’architecture ADO.
Chacun des trois principaux objets effectue une tâche spécifique. L’objet Connec-
tion contient les informations nécessaires pour permettre à votre application de
communiquer avec le serveur de bases de données. Il héberge également la col-
lection Errors qui décrit l’erreur la plus récente rencontrée pendant l’utilisation
d’ADO. L’objet Command décrit une instruction SQL qui sera exécutée, y com-
pris la collection d’objets Parameter qui sera passée à la commande pour exécu-
tion. Pour finir, l’objet Recordset permet d’accéder aux données retournées en
exécutant un objet Command, les valeurs individuelles associées à chaque ligne
retournée étant exposées par le biais de la collection Fields et chaque colonne
étant exposée par le biais de l’objet Field.
Chapitre 23

530
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 24
Programme Excel Query
Connexion à une base Exécution d’une requête . . . . . . 542
de données . . . . . . . . . . . . . . . . 535 Utilisation du programme
Édition d’une requête. . . . . . . . . 539 Excel Query . . . . . . . . . . . . . . . . 550

Le programme Excel Query, développé pour cet ouvrage, est une application
pratique de nombreux outils et techniques étudiés tout au long de ce livre. Vous
pouvez intégrer le programme sous forme de macro complémentaire ou
l’exploiter comme modèle de classeur autonome. Il combine, en outre, différents
éléments des feuilles et des barre d’outils en un programme cohésif.

Tour d’horizon du programme Excel Query


Le programme Excel Query est mis en œuvre comme macro complémentaire
dans Microsoft Excel. Celle-ci permet d’interroger une base de données et de
retourner des résultats dans une feuille de calcul. L’interface avec le programme
se présente sous la forme d’une barre de commandes, intitulée Excel2k3 VBA
Query, et comporte quatre composants principaux : une liste déroulante qui
regroupe les requêtes exécutées, un bouton qui permet de modifier une requête,
un bouton pour exécuter la requête et un bouton pour configurer la connexion
avec la base de données (voir figure 24.1).

531
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Figure 24-1. L’interface utilisateur avec le programme de requête se présente


sous la forme d’une nouvelle barre de commandes ajoutée à Excel.

Sur le site Le code source complet du programme Excel Query se trouve


dans le classeur ExcelQuery.xls, téléchargeable sur le site web de Dunod à
l’adresse www.dunod.fr.

Configurer le projet
Une grande partie de ce code est stockée dans le module ThisWorkbook. Le pro-
gramme contient également deux feuilles, DBInfo et DBQuery. Le module
ThisWorkbook est automatiquement créé à la création du classeur. On ajoute des
feuilles au projet en choisissant Insertion, UserForm dans le menu principal et
en modifiant le nom de la feuille dans la fenêtre Propriétés.
Ajoutez les lignes de code suivantes au début de chaque module. La première ins-
truction vous oblige à déclarer les variables avant de les utiliser, ce qui évite les
erreurs de saisie. La deuxième instruction demande à Visual Basic d’effectuer
toutes les comparaisons de chaînes sans tenir compte de la casse, ce qui réduit la
quantité de code à écrire lorsque vous comparez des chaînes.

Option Explicit
Option Compare Text

Pour exécuter le code relatif à la base de données, vous devez ajouter la bibliothè-
que d’objets ADO. Dans le menu Outils, choisissez Références et cochez la case
Chapitre 24

en regard de Microsoft ActiveX Data Objects 2.7 Library (voir figure 24.2).
Appuyez ensuite sur OK pour fermer la boîte de dialogue et mettre la bibliothè-
que à la disposition de l’application.

532
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query

Figure 24-2. Servez-vous de la boîte de dialogue Références pour ajouter la


bibliothèque d’objets ADO.

Initialiser le programme
Lorsque le programme Excel Quer y démarre, il utilise l’événement
Workbook_Open du module ThisWorkbook pour appeler la routine AddCom-
mandBar qui ajoute la barre de commandes Excel2k3 VBA Query à Excel.

Private Sub Workbook_Open()

AddCommandBar

End Sub

La routine AddCommandBar commence par désactiver la récupération des


erreurs en utilisant une instruction On Error Resume Next. Elle tente ensuite de
créer une référence d’objet à la barre de commandes Excel 2k3 VBA Query en
référençant son nom dans la collection CommandBars.

Private Sub AddCommandBar()

Dim c As CommandBar
Dim cc As CommandBarComboBox
Dim cb As CommandBarButton

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")
If Not c Is Nothing Then
Application.CommandBars("Excel2k3 VBA Query").Delete

End If
Chapitre 24

Set c = Application.CommandBars.Add("Excel2k3 VBA Query", _


msoBarFloating, False, True)
c.Enabled = True
c.Visible = True

Set cc = c.Controls.Add(msoControlComboBox, 1)

533
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


cc.Tag = "Excel2k3 VBA Query Statement"
cc.Text = "<enter a query>"
cc.Width = 200
cc.OnAction = "ThisWorkbook.EnterDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)
cb.Tag = "Excel2k3 VBA Query Run"
cb.Style = msoButtonCaption
cb.Caption = "Run Query"
cb.OnAction = "ThisWorkbook.RunDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)
cb.Tag = "Excel2k3 VBA Query Edit"
cb.Style = msoButtonCaption
cb.Caption = "Edit Query"
cb.OnAction = "ThisWorkbook.EditDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)
cb.Tag = "Excel2k3 VBA Query Database"
cb.Style = msoButtonCaption
cb.Caption = "Database"
cb.OnAction = "ThisWorkbook.ShowDatabaseInfo"

End Sub

Si cette barre de commandes n’existait pas, le programme génèrerait une erreur.


Cependant, la récupération d’erreur étant désactivée, l’objet temporaire c
demeure, positionné sur Nothing. Si c est Nothing, la barre de commandes
n’existe pas et est supprimée. Cette étape garantit que la barre de commandes est
toujours créée avec les contrôles appropriés.
Une fois que le programme est certain que la barre de commandes n’existe pas, il
crée une nouvelle barre flottante, qui peut être ancrée aux autres barres de com-
mandes (voir figure 24.1). Les autres instructions de la routine AddCommand-
Bar ajoutent la zone de liste modifiable, ainsi que les trois boutons utilisés pour
gérer l’application.
Deux des actions associées aux contrôles de barre de commandes ouvrent des
feuilles. La routine ShowDatabaseInfo ci-après ouvre la feuille DBInfo sous
forme modale.

Private Sub ShowDatabaseInfo()

DBInfo.Show vbModal

End Sub

La routine EditDatabaseQuery effectue la même tâche avec la feuille DBQuery.


Chapitre 24

Private Sub EditDatabaseQuery()

DBQuery.Show vbModal

End Sub

534
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query

Terminer le programme
L’événement Workbook_BeforeClose appelle la routine DeleteCommandBar pour
s’assurer que tous les changements apportés aux menus Excel sont supprimés
avant la fermeture d’Excel.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

DeleteCommandBar

End Sub

La logique de la routine DeleteCommandBar est similaire à celle de la routine


AddCommandBar qui vérifie que la barre de commandes n’existe pas avant d’en
créer une. La récupération des erreurs est désactivée et on crée une référence
d’objet temporaire à l’objet CommandBar à partir de la collection Command-
Bars. Si la référence d’objet temporaire est valide, la méthode Delete supprime
d’Excel la barre de commandes ainsi que tous les contrôle de barre de comman-
des associés.

Sub DeleteCommandBar()

Dim c As CommandBar

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")
If Not c Is Nothing Then
Application.CommandBars("Excel2k3 VBA Query").Delete

End If

End Sub

Connexion à une base de données


Pour exécuter une requête, vous devez créer une connexion avec la base de don-
nées. Toutefois, dans la mesure où les informations de connexion sont différen-
tes pour chaque base de données, il est préférable d’utiliser une feuille pour
collecter ces informations (voir figure 24.3).
Chapitre 24

535
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Figure 24-3. L’utilisateur fournit les informations de connexion à la base de


données par le biais de la boîte de dialogue Database Properties.

Le programme stocke les informations de connexion dans le registre


Microsoft Windows. Il se rappelle ainsi la dernière valeur sélectionnée par l’uti-
lisateur.
Les informations de connexion étant différentes d’un système de base de don-
nées à un autre, le contrôle Multipage masqué contient un unique objet Page
pour chaque base de données supportée. Un contrôle ComboBox, qui se trouve
dans la partie supérieure de la feuille, sélectionne la page visible. Cette disposi-
tion est plus clairement illustrée dans Visual Basic Editor (voir figure 24.4).

Figure 24-4. Chaque page du contrôle Multipage contient des informations de


connexion uniques à chaque base de données particulière.
Chapitre 24

536
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query

Astuce Gardez un œil sur les onglets


Lorsque vous développez des applications avec le contrôle Multipage, laissez
les onglets visibles en mode Création, même si vous préférez les masquer
pour l’utilisateur. Vous pouvez ainsi basculer rapidement sur l’onglet à modifier
pendant le développement. Ensuite, au moment de charger la feuille, position-
nez la propriété Style sur MultiPage1.Style = fmTabStyleNone.

Initialiser la feuille DBInfo


Au moment du chargement de la feuille DBInfo, qui génère la boîte de dialogue
Database Properties, l’événement UserForm_Initialize du prochain code se
déclenche. Dans la première phase, on peuple le contrôle ComboBox Provider
avec la liste des bases de données supportées. Pour cet exemple, seules les bases
de données Microsoft Access et SQL Server possèdent leurs propres pages ; nous
avons toutefois ajouter une page Advanced pour permettre à l’utilisateur de sai-
sir une valeur de chaîne de connexion.

Private Sub UserForm_Initialize()

Provider.AddItem "Access (Jet)"


Provider.AddItem "SQL Server"
Provider.AddItem "Advanced"

DBProperties.Style = fmTabStyleNone

DBName.Text = GetSetting("Excel2k3 VBA", "Query", "DBName", _


"<enter database name>")
DBPassword.Text = GetSetting("Excel2k3 VBA", "Query", "DBPassword", _
"<enter password>")
DBPath.Text = GetSetting("Excel2k3 VBA", "Query", "DBPath", _
"<enter path to database file>")
DBServer.Text = GetSetting("Excel2k3 VBA", "Query", "DBServer", _
"<enter database server>")
DBWindowsAuth.Value = GetSetting("Excel2k3 VBA", "Query", _
"DBWindowsAuth", True)
DBUserId.Text = GetSetting("Excel2k3 VBA", "Query", "DBUserId", _
"<enter userid>")
ConnectionString.Text = GetSetting("Excel2k3 VBA", "Query", _
"ConnectionString", "<enter connection string>")

Provider.ListIndex = GetSetting("Excel2k3 VBA", "Query", "DBType", 0)

End Sub

Les onglets du contrôle Multipage sont masqués en positionnant la propriété


Chapitre 24

Style sur fmTabStyleNone.


La fonction GetSetting extrait les valeurs de chaque champ de la feuille à partir
du registre. Elle prend quatre paramètres. Le trois premiers paramètres représen-
tent une clé qui identifie la valeur, alors que le quatrième paramètre fournit une
valeur par défaut pour le cas où la valeur ne se trouve pas dans le registre.

537
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Dans la dernière partie du listing, la fonction GetSetting choisit la base de don-
nées sélectionnée et définit le contrôle ComboBox en conséquence. Remarquez
que la propriété ListIndex déclenche également l’événement Change associé au
contrôle.

Changer les fournisseurs de la base de données


L’événement Provider_Change de la feuille DBInfo se déclenche chaque fois que
l’utilisateur sélectionne une nouvelle base de données dans la liste déroulante ou
que la propriété ListIndex change. Cette routine se contente de sélectionner la
page appropriée à afficher dans le contrôle Multipage en positionnant la pro-
priété Value de la manière suivante :

Private Sub Provider_Change

DBProperties.Value = Provider.ListIndex

End Sub

Sélectionner l’authentification Windows


La page SQL Server contient une case à cocher qui permet à l’utilisateur d’opter
pour l’authentification Windows. Si on utilise les informations d’authentifica-
tion Windows, il est inutile d’afficher les champs userid et password.
Le code suivant gère l’événement Click associé à la case à cocher et masque les
champs userid et password lorsque la valeur du contrôle est True et les affiche si
elle est False.

Private Sub DBWindowsAuth_Click()

If DBWindowsAuth.Value Then
DBUserId.Visible = False
DBPassword.Visible = False
DBUserIdLabel.Visible = False
DBPasswordLabel.Visible = False

Else
DBUserId.Visible = True
DBPassword.Visible = True
DBUserIdLabel.Visible = True
DBPasswordLabel.Visible = True

End If

End Sub
Chapitre 24

538
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query

Enregistrer les informations


Lorsque l’utilisateur clique sur le bouton OK, le code suivant s’exécute. La pro-
cédure appelle la routine SaveSetting pour enregistrer les valeurs saisies par l’uti-
lisateur dans le registre Windows.

Private Sub CommandButton1_Click()

SaveSetting "Excel2k3 VBA", "Query", "DBName", DBName.Text


SaveSetting "Excel2k3 VBA", "Query", "DBPassword", DBPassword.Text
SaveSetting "Excel2k3 VBA", "Query", "DBPath", DBPath.Text
SaveSetting "Excel2k3 VBA", "Query", "DBServer", DBServer.Text
SaveSetting "Excel2k3 VBA", "Query", "DBWindowsAuth", _
DBWindowsAuth.Value
SaveSetting "Excel2k3 VBA", "Query", "DBUserId", DBUserId.Text
SaveSetting "Excel2k3 VBA", "Query", "ConnectionString", _
ConnectionString.Text
SaveSetting "Excel2k3 VBA", "Query", "DBType", Provider.ListIndex

Unload Me

End Sub

Une fois les valeurs enregistrées dans le registre, on appelle la routine Unload
pour fermer la feuille. Remarquez que l’événement Click du bouton Cancel
appelle la routine Unload pour décharger la feuille. Toute modification des
champs de la feuille est alors annulée.

Astuce Mot-clé Me
Les modules UserForm ressemblent aux modules de classe classiques. Vous
pouvez donc vous référez à l’instance en cours de l’objet en vous servant du
mot-clé Me. Cette possibilité est particulièrement intéressante avec certaines
instructions, comme Unload, pour lesquelles il faut fournir une référence à
l’objet UserForm à décharger.

Lorsque l’utilisateur clique sur le bouton Cancel, l’événement CommandButton2


est appelé. Puisque l’utilisateur a choisi de ne pas modifier les informations de
connexion stockées dans le registre, la seule action à entreprendre est de déchar-
ger la feuille en cours.

Private Sub CommandButton2_Click()

Unload Me

End Sub
Chapitre 24

Édition d’une requête


Les valeurs de requêtes sont stockées dans le contrôle ComboBox sur la barre de
commandes Excel2k3 VBA Query. Chaque requête possède sa propre entrée, que

539
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


l’on sélectionne en choisissant l’entrée appropriée dans la liste déroulante. Si
l’utilisateur clique sur le bouton Edit Query de la barre de commandes, la feuille
DBQuery se charge (voir figure 24.5) complétée par la requête sélectionnée dans
le contrôle ComboBox de la barre de commandes.

Figure 24-5. La feuille DBQuery se compose pour l’essentiel d’une grande


zone de texte qui permet à l’utilisateur de saisir sa requête.

Le code suivant s’exécute lorsque la feuille est chargée. Après avoir localisé la
barre de commandes appropriée, la méthode FindControl récupère le pointeur
d’objet du contrôle Command barComboBox en recherchant la valeur de la pro-
priété Tag appropriée. Ensuite, en supposant que le contrôle existe, la propriété
Text de la zone de liste modifiable est copiée dans le contrôle TextBox à plusieurs
lignes de la feuille.

Private Sub UserForm_Initialize()

Dim c As CommandBar
Dim cc As CommandBarComboBox

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")
Set cc = c.FindControl(, , "Excel2k3 VBA Query Statement")
If Not cc Is Nothing Then
Query.Text = cc.Text

End If
Chapitre 24

End Sub

Une fois que l’utilisateur a modifié la requête à sa guise, il ferme la feuille en cli-
quant sur le bouton Close.

540
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query


Private Sub CommandButton1_Click()

Unload Me

End Sub

Lorsque la feuille est fermée, on appelle la routine SaveData de l’événement


UserForm_Terminate pour s’assurer que la requête est toujours enregistrée à la
fermeture de la feuille. En plaçant ici l’appel à SaveData, on enregistre la requête
sans tenir compte du fait que la feuille est fermée.

Private Sub UserForm_Terminate()

SaveData

End Sub

La routine SaveData copie l’instruction de la requête dans la propriété Text du


contrôle CommandBarComboBox en utilisant la même technique de base que
celle employée pour charger la requête.

Sub SaveData()

Dim c As CommandBar
Dim cc As CommandBarComboBox

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")

Set cc = c.FindControl(, , "Excel2k3 VBA Query Statement")


If Not cc Is Nothing Then
cc.Text = Query.Text

End If

End Sub

Remarquez qu’enregistrer la requête de cette manière déclenche l’événement


OnAction associé à ce contrôle, c’est-à-dire la routine EnterDatabaseQuery qui se
trouve dans le module ThisWorkbook, présenté ici. Cette routine parcourt la liste
des requêtes stockée dans le contrôle et ajoute la nouvelle requête à la fin, si elle
ne la trouve pas. L’utilisateur peut ainsi exécuter à nouveau rapidement une
requête.

Sub EnterDatabaseQuery()

Dim c As CommandBar
Dim cc As CommandBarComboBox
Chapitre 24

Dim q As String
Dim i As Long

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")
Set cc = c.FindControl(, , "Excel2k3 VBA Query Statement")

541
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


If Not cc Is Nothing Then
q = cc.Text
i = 1
Do While i <= cc.ListCount
If q = cc.List(i) Then
Exit Sub

End If

i = i + 1

Loop

cc.AddItem cc.Text

End If

Cette routine commence par localiser le contrôle CommandBarComboBox et


enregistre ensuite la valeur de la propriété Text dans la variable temporaire q. La
routine utilise ensuite une boucle Do…While pour parcourir la liste des requêtes
stockées dans la liste déroulante. Si elle trouve une correspondance, l’instruction
Exit Sub arrête la routine sans action. Si elle ne trouve pas de correspondance, la
méthode AddItem ajoute la requête à la fin des éléments de la liste déroulante.

Remarque Cette approche possède une limite : les requêtes sont perdues si
l’utilisateur quitte Excel. Le programme ne doit pas occuper trop de place dans
le registre Windows simplement pour stocker l’historique des requêtes et, si
cette version du programme n’utilise pas de fichier externe que l’on doit char-
ger et enregistrer chaque fois qu’Excel démarre, il est relativement simple
d’ajouter un jeu de boîtes de dialogue Enregistrer/Ouvrir à cette feuille pour
enregistrer les requêtes sur le disque.

Exécution d’une requête


Si l’utilisateur clique sur le bouton Run Query de la barre de commandes
Excel2k3 VBA Query, la requête sélectionné dans la zone de liste modifiable de la
barre de commandes s’exécute.

Récupérer les informations


Dans le module ThisWorkbook, la routine RunDatabaseQuery, présentée ci-
après, construit une chaîne de connexion en se servant de la fonction BuildCon-
nectionString et récupère la chaîne de requête dans la zone de liste modifiable de
la barre de commandes via la routine GetDBQuery. La fonction Trim supprime
Chapitre 24

les vides inutiles, comme le début et la fin des chaînes.

Pour plus d’informations sur l’utilisation des fonctions textuelles pour nettoyer les don-
nées, reportez-vous au chapitre 9, « Manipulation des données avec VBA ».

542
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query


Sub RunDatabaseQuery()

Dim c As String
Dim q As String

c = Trim(BuildConnectionString)
q = Trim(GetDBQuery)

If Len(c) = 0 Then
DBInfo.Show vbModal

ElseIf Len(q) = 0 Then


DBQuery.Show vbModal

Else
RunQuery c, q

End If

End Sub

On vérifie que la longueur de chaque variable temporaire qui contient la chaîne


de connexion et la requête est différente de zéro. Si la longueur est égale à zéro, la
feuille appropriée s’affiche pour que l’utilisateur complète les informations
nécessaires. Lorsque la feuille est fermée, l’utilisateur doit cliquer sur le bouton
Run Query pour tenter à nouveau d’exécuter la requête.
En supposant que la chaîne de connexion et la chaîne de requête contiennent les
informations nécessaires, on appelle la routine RunQuery pour exécuter la
requête en passant la chaîne de connexion et la chaîne de requête en tant que
paramètres.

Construire une chaîne de connexion


La routine BuildConnectionString suivante crée une chaîne de connexion à partir
de informations préalablement stockées dans le registre Windows. La routine,
qui se trouve dans le module ThisWorkbook, commence par déclarer un certain
nombre de variables temporaires qui vont contenir les informations extraites du
registre, ainsi qu’une variable temporaire c qui va contenir la valeur retournée
finale de la fonction.

Function BuildConnectionString() As String

Dim c As String

Dim DBName As String


Dim DBPassword As String
Chapitre 24

Dim DBPath As String


Dim DBServer As String
Dim DBType As Long
Dim DBUserId As String
Dim DBWindowsAuth As Boolean

543
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


c = ""

DBType = GetSetting("Excel2k3 VBA", "Query", "DBType", 0)

Select Case DBType


Case 0
DBPath = GetRegistryValue("DBPath", "<enter path to database
file>")

If Len(DBPath) <> 0 Then


c = "Provider=Microsoft.Jet.OLEDB.4.0"
c = c & ";Data Source=" & DBPath

End If

Case 1
DBWindowsAuth = GetSetting("Excel2k3 VBA", "Query", _
"DBWindowsAuth", True)

DBName = GetRegistryValue("DBName", "<enter database name>")


DBPassword = GetRegistryValue("DBPassword", "<enter password>")
DBServer = GetRegistryValue("DBServer", "<enter database server>")
DBUserId = GetRegistryValue("DBUserId", "<enter userid>")

If Len(DBServer) = 0 Then
DBServer = "localhost"

End If

If Len(DBName) <> 0 Then


c = "Provider=SQLOLEDB.1"
c = c & ";Data Source=" & DBServer
c = c & ";Initial Catalog=" & DBName

If DBWindowsAuth Then
c = c & ";Integrated Security=SSPI"

ElseIf Len(DBUserId) <> 0 And Len(DBPassword) <> 0 Then


c = c & ";User ID=" & DBUserId
c = c & ";Password=" & DBPassword

Else
c = ""

End If

End If

Case 2
c = GetRegistryValue("ConnectionString", _
Chapitre 24

"<enter connection string>")

End Select

BuildConnectionString = c

End Function

544
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query


Après avoir positionné c sur une chaîne vide, la routine extrait le type de la base
de données dans le registre et le stocke dans DBType. Cette variable est incorpo-
rée dans une instruction Select Case, qui construit les différentes chaînes de con-
nexion en fonction du type de base de données employé.
Si on se sert d’une base de données Access (Jet), la valeur DBPath est extraite du
registre Windows via la fonction auxiliaire GetRegistryValue. Cette fonction
prend deux paramètres, la clé et la valeur par défaut. Si la valeur extraite du regis-
tre est différente de la valeur par défaut, une chaîne vide est retournée.
Si GetRegistryValue retourne une chaîne vide (len = 0), c reste une chaîne vide.
Dans le cas contraire, on crée la chaîne de connexion appropriée pour la base de
données Access en se servant de la valeur extraite du registre.
On utilise la même approche pour les bases de données SQL Server (DBType
= 1). On extrait la valeur de DBWindowsAuth directement à partir du registre
puisque sa valeur par défaut n’est pas une chaîne, alors que les valeurs de
DBName, DBPassword, DBServer et DBUserId sont extraites du registre par la
routine GetRegistryValue.
Contrairement aux chaînes de connexion Access, la routine tente de substituer
des valeurs sensées dans le cas où l’utilisateur ne fournit pas de valeur par défaut.
Par exemple, si la longueur de DBServer est égale à zéro, le programme suppose
que l’utilisateur exécute la requête sur l’ordinateur local. Si la longueur de
DBName est différente de zéro, le programme tente de construire une chaîne de
connexion partielle en se servant de DBName et DBServer. Ensuite, si on fait
appel à l’authentification Windows, on ajoute Integrated Security=SSPI à la
chaîne de connexion et les informations et on ignore DBUserId et DBPassword.
Si DBWindowsAuth est False, on vérifie DBUserId et DBPassword pour voir s’ils
contiennent une valeur. Si les deux contiennent des informations, ces champs
sont attachés à la chaîne de connexion. Si l’un de ces champs ne contient pas
d’informations, on positionne c sur la chaîne vide, détruisant la chaîne de con-
nexion partielle qui existe déjà.
Si l’utilisateur a sélectionné Advanced sur la feuille DBInfo, on extrait la valeur
ConnectionString du registre en se servant de la fonction auxiliaire GetRegis-
tryValue. Aucune autre vérification n’est nécessaire puisque GetRegistryValue
garantit qu’une chaîne vide est retournée si on ne trouve pas de valeur par défaut
dans le registre.
Pour finir, la routine se termine en retournant la variable temporaire c comme
valeur de la fonction.
La fonction auxiliaire GetRegistryValue appelle la fonction GetSetting pour
extraire la clé appropriée du registre. Si la valeur retournée est la même que celle
Chapitre 24

fournie par la valeur par défaut, elle est positionnée sur la chaîne vide.

Function GetRegistryValue(key As String, default As String) As String

Dim r As String

545
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


r = GetSetting("Excel2k3 VBA", "Query", key, default)

If r = default Then
r = ""

End If

GetRegistryValue = r

End Function

Récupérer la requête
Pour récupérer la requête qui se trouve dans la zone de liste modifiable de la
barre de commandes, nous utilisons la même approche que celle employée
ailleurs dans ce chapitre. Après avoir localisé la barre de commandes appropriée,
on se sert de la méthode FindControl pour rechercher le contrôle qui contient la
zone de liste modifiable. La fonction suivante se trouve également dans le
module ThisWorkbook :

Function GetDBQuery() As String

Dim c As CommandBar
Dim cc As CommandBarComboBox

On Error Resume Next


Set c = Application.CommandBars("Excel2k3 VBA Query")

Set cc = c.FindControl(, , "Excel2k3 VBA Query Statement")


If Not cc Is Nothing Then
GetDBQuery = cc.Text

ElseIf cc.Text = "<enter a query>" Then


GetDBQuery = ""

Else
GetDBQuery = ""

End If

End Function

Le principal avantage de cette routine repose sur le fait que l’on compare la rou-
tine avec la valeur par défaut chargée au démarrage du programme. Si elle est
vide, la fonction retourne une chaîne vide, indiquant que l’utilisateur doit saisir
une requête.
Chapitre 24

Exécuter une requête


Une fois que l’utilisateur a fourni les valeurs de la chaîne de connexion et de la
chaîne de requête, qui passent quelques vérifications simples, on appelle la rou-

546
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query


tine RunQuery, qui se trouve dans le module ThisWorkbook, pour récupérer les
informations dans la base de données.

Sub RunQuery(c As String, q As String)

Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset

On Error Resume Next

Set cn = New ADODB.Connection


cn.ConnectionString = c
cn.Open
If Err.Number <> 0 Then
MsgBox "Connection error: " & Err.Description
Exit Sub

End If

Set cmd = New ADODB.Command


Set cmd.ActiveConnection = cn
cmd.CommandText = q
cmd.CommandType = adCmdText

Set rs = New ADODB.Recordset


Set rs.Source = cmd

cn.Errors.Clear
rs.Open

If Err.Number = 0 Then
CopyRows rs

Else
MsgBox "Query error: " & Err.Description

End If

rs.Close
cn.Close

End Sub

Pour exécuter la requête, cette routine se sert de trois objets de base de données
ADO (ActiveX Data Object ) : un objet Connection, un objet Command et un
objet Recordset. Chacun est déclaré au début de la routine. On désactive ensuite
la récupération d’erreurs via une instruction On Error Resume Next puisque cette
routine recherche les erreurs après une instruction décisive.
Chapitre 24

La première phase de l’extraction des lignes de la base de données consiste à éta-


blir la connexion avec la base de données. On crée une nouvelle instance de
l’objet ADODB.Connection et on assigne la valeur de la chaîne de connexion pas-
sée à cette routine à la propriété ConnectionString de l’objet Connection. Après

547
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


avoir instancié l’objet Connection, on se sert de la méthode Open pour ouvrir une
connexion avec la base de données.

Astuce Exit New


N’utilisez jamais le mot-clé New lorsque vous définissez un objet avec une ins-
truction Dim, Private ou Public. Visual Basic pour Applications (VBA) ajoute du
code autour de chaque référence d’objet pour déterminer si l’objet a été ins-
tancié. Si ce n’est pas le cas, le code crée automatiquement une nouvelle ins-
tance de l’objet à votre place. Même si ce code supplémentaire n’ajoute pas
une énorme surcharge, il est préférable de contrôler quand exactement un
objet est instancié.

En cas de problème à l’ouverture de la connexion, un message d’erreur s’affiche


et on utilise l’instruction Exit Sub pour quitter la sous-routine sans autre traite-
ment.
On crée ensuite une nouvelle instance de l’objet ADODB.Command. On assigne
l’objet Connection nouvellement ouvert à la propriété ActiveConnection de la
requête à la propriété CommandText. Pour finir, la propriété CommandType est
positionnée sur adCmdText, ce qui signifie que l’objet Command contient une
instruction SQL.
On crée ensuite un nouvel objet ADODB.Recordset et on positionne la propriété
Source sur l’objet Command que l’on vient d’initialiser. On vide explicitement la
collection Errors de l’objet Connection puis on appelle la méthode Open de
l’objet Recordset.
Toute erreur se produisant pendant l’ouverture de l’objet Recordset est intercep-
tée et un message d’erreur présenté à l’utilisateur. On appelle la sous-routine
CopyRows pour copier les lignes de l’objet Recordset dans la feuille de calcul en
cours.
Pour finir, l’objet Recordset et l’objet Connection sont fermés (dans cet ordre).
Ces étapes restituent toutes les ressources détenues par les objets au système
d’exploitation.

Astuce Fermez les connexions


Pour obtenir les meilleures performances possibles au niveau du serveur de
bases de données, minimisez toujours la durée d’ouverture d’une connexion.
En fermant les connexions non utilisées, vous réduisez les ressources néces-
saires à l’exécution du serveur ce qui lui permet de gérer plus de connexions.
Chapitre 24

Copier des lignes


Un fois que l’objet Recordset contient les lignes de la base de données, il ne reste
plus qu’à copier les lignes une à une dans la feuille de calcul. La routine Copy-
Rows qui se trouve dans le module ThisWorkbook se fonde sur trois variables

548
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query


locales : i et j, qui contiennent les pointeurs vers la ligne et la colonne de la cellule
en cours sur la feuille de calcul, et f, qui contient un champ de l’objet Recordset.

Sub CopyRows(rs As ADODB.Recordset)

Dim i As Long
Dim j As Long
Dim f As ADODB.Field

Cells.Select
Selection.ClearContents

i = 1
Do While Not rs.EOF
j = 1
For Each f In rs.Fields
Cells(i, j) = f.Value
j = j + 1

Next f

rs.MoveNext
i = i + 1

Loop

End Sub

Une fois réservé l’espace destiné aux variables, on vide la feuille de calcul en
sélectionnant toutes les cellules (Cells.Select) puis en vidant la sélection avec
la méthode ClearContents. On positionne ensuite la variable i sur 1, qui pointe
sur la première ligne de la feuille de calcul.
On configure ensuite une boucle qui itère dans chaque ligne de l’objet Recordset.
Cette boucle continue jusqu’à ce que la méthode EOF retourne True, ce qui signi-
fie que le pointeur de l’enregistrement en cours s’est déplacé au-delà de la der-
nière ligne contenue dans l’objet Recordset.
Dans la boucle, on positionne ensuite la variable j sur 1, qui pointe sur la pre-
mière colonne de la feuille de calcul. On se sert d’une boucle For…Each avec la
variable f pour extraire chaque objet Field de la collection Fields de l’objet
Recordset. La valeur du champ est directement copiée de la propriété Value vers la
cellule appropriée vers laquelle pointe i et j. Une fois qu’un champ est copié, on
incrémente j pour qu’elle pointe vers la colonne suivante.
Une fois que tous les champs d’une ligne ont été copiés, la méthode MoveNext
repositionne le pointeur de l’enregistrement en cours sur l’enregistrement sui-
vant. On incrémente également i pour qu’elle pointe vers une nouvelle ligne de la
Chapitre 24

feuille de calcul.

549
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Utilisation du programme Excel Query


Voici un court exemple d’utilisation du programme Excel Query. Il extrait une
liste de clients de la base de données exemple Northwind installée avec
Microsoft Access. Cette base de données se trouve généralement dans le réper-
toire Office11\Samples, dont le chemin d’accès devrait être similaire à celui pré-
senté ici, si vous avez installé Microsoft Office à son emplacement par défaut.

c:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb

Remarque Si vous ne trouvez pas la base de données Northwind dans le


répertoire Microsoft Office\Office11\Samples, vérifiez que vous avez installé
les exemples de bases de données Access en exécutant à nouveau le pro-
gramme d’installation d’Office 11.

Configurer les informations de connexion


Après avoir chargé le classeur ExcelQuery.xls, cliquez sur le bouton Database et
sélectionnez Access (Jet) dans la liste déroulante qui se trouve dans la partie
supérieure de la boîte de dialogue Database Properties (voir figure 24.6). Saisis-
sez le chemin d’accès complet du fichier qui contient la base de données et cli-
quez sur OK.

Figure 24-6. Choisissez Access (Jet) dans la liste déroulante et saisissez le


chemin d’accès complet de la base de données.

Saisir une requête


Cliquez ensuite sur le bouton Edit Query, saisissez la requête suivante (voir
figure 24.7) et cliquez sur le bouton Close.

Select *
Chapitre 24

From Customers
Order By CustomerId

550
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Programme Excel Query

Figure 24-7. Saisissez la requête à exécuter.

Exécuter la requête
Cliquez sur le bouton Run Query pour extraire les informations de la base de
données est les afficher dans la feuille de calcul en cours (voir figure 24.8).

Figure 24-8. Affichez les résultats de la requête sous la forme d’une feuille de
calcul classique.

Dans ce chapitre, vous avez appris à combiner la programmation des bases de


données avec des feuilles UserForm et des barres de commandes pour créer une
application utile qui s’exécute sous Excel. Le programme commence par charger
une barre de commandes contenant les contrôles qui manœuvrent l’application.
Chapitre 24

Cliquer sur le bouton Database affiche une feuille dans laquelle l’utilisateur peut
saisir les informations nécessaires pour se connecter à la base de données. En cli-
quant sur le bouton Edit Query, on affiche une autre feuille qui présente la
requête en cours que l’utilisateur peut modifier. Pour finir, l’utilisateur clique sur

551
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Run Query pour exécuter la requête par le biais d’appels à ADO et afficher le
résultat dans la feuille de calcul active.
Chapitre 24

552
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 25
Excel et le web
HTML . . . . . . . . . . . . . . . . . . . . . 554 Exploitation de l'Internet
Exploitation de l'Internet pour publier des résultats . . . . . 568
comme source de données . . . . 562 Exploitation des solutions
Internet avec Excel . . . . . . . . . . 573

À une certaine époque, les applications types basées sur Excel avaient pour tout
partenaire d'interaction l'utilisateur lui-même. Celui-ci saisissait les données,
puis assurait la mise en forme des résultats. Pour stocker les données, on utilisait
différentes feuilles de calcul et on tentait de simuler au mieux les effets d'une base
de données relationnelle.
Avec les technologies développées à partir des pilotes ODBC (Open Database
Connectivity, connectivité ouverte de bases de données), puis des objets DAO
(Data Access Objects, objets d'accès aux données) et enfin des objets ADO (Acti-
veX Data Objects, objets de données ActiveX), il est devenu monnaie courante de
stocker des données dans des bases de données externes et même d'y récupérer
des informations et de les actualiser dans d'autres système, et ce en réseau.
Désormais, il est relativement courant de voir Excel employé comme outil fron-
tal de requête et d'analyse pour les gros systèmes de bases de données ; on se sert
de plus en plus des tables de requête et des tableaux croisés dynamiques pour
récupérer les données. Le plus souvent, les données accessibles depuis Excel
étaient celles qui se trouvaient sur le réseau de l'entreprise, et celles qui étaient
stockées dans des bases de données autorisées.
Depuis la sortie de Microsoft Office 97, Microsoft a progressivement étendu les
capacités d'Excel de manière à l'ouvrir aux technologies Internet et associées.
Excel possède désormais des fonctionnalités web dans sa propre interface, et
notamment les requêtes Web. Tout est prévu pour que les développeurs puissent
exploiter des objets externes standards, comme le contrôle ITC (Internet Transfer
Control), le contrôle Web Browser et l'analyseur MSXML. Ces objets sont auto-
matiquement installés avec Office.
Excel offre des fonctionnalités suffisamment intéressantes pour que vous envisa-
giez de reconsidérer votre approche du développement d'applications avec ce
logiciel. En matière de récupération des données, de publication de résultats, de
suivi de vos applications et de partage de données en réseau, vous pouvez désor-
mais sortir du cadre de l'environnement habituel Excel/ADO.
Ce chapitre présente les fonctionnalités que vous pouvez mettre en œuvre et
montre comment interagir avec l'Internet dans le cadre de vos applications. Vous
y apprendrez à enregistrer une feuille de calcul en tant que page web, à la publier

553
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


sur le web, à la rendre interactive et à en assurer l'actualisation par voie de pro-
grammation. Puis vous découvrirez comment utiliser des pages web existantes
Chapitre 25

comme sources de données. Vous verrez comment ouvrir une page web dans
Excel, créer et utiliser les requêtes Web, puis analyser des pages web pour en
extraire des informations spécifiques. Pour terminer ce chapitre, vous verrez
comment mettre en œuvre un serveur web et communiquer avec lui.

HTML
HTML (Hypertext Markup Language) est le langage de balisage standard des
documents publiés sur le World Wide Web. Il emploie des balises pour indiquer
aux navigateurs web la manière d'afficher les éléments de page que sont les textes
et les images et de réagir aux interactions des utilisateurs.
L'idée de publier les données d'une feuille de calcul Excel sur le web relève d'une
logique simple, tant du point de vue de la disposition tabulaire des données que
des contenus calculés. Toute personne ayant déjà encodé un tableau en HTML
peut confirmer qu'il s'agit d'une tâche particulièrement fastidieuse. Même le
tableau HTML le plus simple demande du temps car vous devez déclarer les bali-
ses <TH> et </TH> pour les intitulés de colonnes, puis les balises <TR> et </
TR> pour les rangées et enfin, les balises <TD> et </TD> pour définir le nombre
et la largeur des colonnes, ainsi que les données qui vont aller les remplir.

Enregistrer une feuille de calcul en tant


que page web
Avec Excel, il est simple d'enregistrer une feuille de calcul en tant que page web.
Vous pouvez organiser votre feuille de calcul avec les données, les graphiques et
les tableaux croisés dynamiques qui conviennent. Une fois que le document est
prêt, il vous suffit de l'enregistrer en tant que page web.
Excel permet de créer des pages web qui affichent les données en mode statique
(on regarde, mais on ne touche pas) ou en mode interactif (ce qui permet à l'uti-
lisateur de "jouer" avec). Dans le premier cas, vos utilisateurs peuvent voir les
données Excel uniquement dans un navigateur web. En revanche, avec les pages
web interactives, l'utilisateur peut manipuler les données en modifiant des
valeurs ou des mises en forme. Selon la nature des fichiers, l'utilisateur peut
même continuer à faire des calculs et, dans le cas des listes de données, à mani-
puler celles-ci en les triant et en les filtrant.
Mais avant d'enregistrer votre classeur ou votre feuille de calcul en tant que page
web, il vous reste quelques aspects à prendre en considération. Par exemple, vous
devez savoir si vous souhaitez enregistrer la totalité d'un classeur ou seulement
une partie d'une feuille de calcul. Dans le second cas, sélectionnez les cellules
concernées avant de lancer le processus d'enregistrement. Rien ne vous limite
aux plages de cellules ; vous pouvez également enregistrer des graphiques.

554
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
Pour choisir l'emplacement de stockage de votre page web, sachez si celle-ci doit
se trouver sur votre disque dur ou sur un lecteur réseau, voire même si vous sou-

Chapitre 25
haitez la publier directement sur l'Internet ou sur l'intranet de votre entreprise.
Pour enregistrer une nouvelle page sur un site FTP (File Transfer Protocol), sélec-
tionnez Adresses Internet (FTP) dans la liste déroulante Enregistrer dans, puis
ouvrez le dossier FTP dans lequel enregistrer la page. Les dossiers web et/ou les
emplacements FTP doivent avoir été créés avant l'enregistrement des feuilles de
calcul sous forme de page web dans les emplacements appropriés. Vous pouvez
également ajouter un titre, qui sera centré en haut de la page, au-dessus des don-
nées et des graphiques. Cela dit, vous pouvez toujours ajouter un titre ou le
modifier après la création de la page.
Voici les étapes de la création d'une page web statique :
1 Ouvrez le classeur contenant les données à enregistrer en tant que page
web.
2 Cliquez sur le menu Fichier et choisissez Enregistrer en tant que page
Web, comme le montre la figure 25.1.

Figure 25-1. La boîte de dialogue Enregistrer sous pour les pages web
est similaire à la boîte de dialogue Enregistrer sous habituelle, mais
comporte quelques fonctions supplémentaires.

Astuce Sélectionnez les éléments à enregistrer


Si vous savez que vous voulez enregistrer un graphique ou une plage de cellu-
les précis dans la nouvelle page web, sélectionnez-les avant d’ouvrir la boîte
de dialogue Enregistrer sous. Ce faisant, vous n’enregistrez que les éléments
souhaités dans la page web. En sélectionnant le graphique par avance, le bou-
ton appelé Sélection : Feuille prend le libellé Sélection : Graphique. Dans le
cas d’une sélection de cellules, le bouton prend le libellé Sélection : <adresse
de la plage de cellules sélectionnées>.

3 Spécifiez l’emplacement d’enregistrement de la page web.

555
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


4 Indiquez la partie du classeur à enregistrer dans la nouvelle page web.
Pour enregistrer le contenu de toutes les feuilles de calcul du classeur,
Chapitre 25

assurez-vous que l’option Classeur entier est sélectionnée. Pour n’enregis-


trer que les données du classeur en cours, cliquez plutôt sur Sélection :
Feuille. N’oubliez pas que si vous avez sélectionné le graphique à convertir
en page web avant d’ouvrir la boîte de dialogue Enregistrer sous, vous
devez sélectionner l’option Sélection : Graphique, qui remplace le bouton
Sélection : Feuille. Si vous avez sélectionné une plage de cellules, sélec-
tionnez l’option Sélection : suivie de l’adresse de la plage de cellules sélec-
tionnées. Pour enregistrer le contenu d’une feuille de calcul autre que celle
actuellement active, vous pouvez le spécifier ultérieurement.
5 Tapez le nom de la nouvelle page web dans la zone Nom de fichier.

Attention Excel ajoute l’extension .htm au nom de fichier que vous saisissez
dans cette zone. Il s’agit de l’extension standard d’un fichier HTML. Si vous
prévoyez de publier la page web sur un serveur web UNIX, n’oubliez pas que ce
système d'exploitation est sensible à la casse (majuscules et minuscules)
dans le nom de fichier. Les systèmes d'exploitation Macintosh et Windows ne
sont pas sensibles à la casse en ce qui concerne les noms de fichiers.

6 Spécifiez un titre pour la page web. Cliquez sur le bouton Modifier le titre
dans la boîte de dialogue Enregistrer sous. Tapez le texte du titre dans la
boîte de dialogue Définir le titre de la page et cliquez sur OK.

Astuce La procédure dépend de vous


Pour enregistrer un graphique que vous n’aviez pas sélectionné avant d’ouvrir
la boîte de dialogue Enregistrer sous, cliquez sur le bouton Publier, puis sélec-
tionnez ledit graphique, identifié par sa description dans la liste déroulante
Choisissez. Pour enregistrer une plage de cellules que vous n’aviez pas sélec-
tionnées avant d’ouvrir la boîte de dialogue enregistrer sous, cliquez sur le
bouton Publier. Sélectionnez ensuite l’option Plage de cellules dans la liste
déroulante Choisissez avant de taper l’adresse de la plage de cellules dans la
zone située immédiatement en dessous ; il est également possible de sélec-
tionner la plage de cellules en la sélectionnant directement dans la feuille de
calcul.

Lorsque vous enregistrez les données de la feuille de calcul dans une nouvelle
page web, Excel crée automatiquement un nouveau dossier portant le même
nom que celui du fichier .htm contenant tous les fichiers nécessaires à la publica-
tion sur le web, ce qui inclut les fichiers d’images et de graphiques, en plus des
données numériques. Donc, si vous déplacez la page de votre disque dur local
vers un serveur web, n’oubliez pas de copier le dossier complet, ainsi que le
fichier de la page web, afin que le navigateur de l’utilisateur puisse ouvrir
l’ensemble du contenu de la page.

556
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
Si vous ne voulez pas qu’Excel crée un dossier distinct avec les fichiers d’accom-
pagnement, modifiez ce réglage dans la boîte de dialogue Options Web. Pour

Chapitre 25
l’ouvrir, cliquez sur Outils>Options. Dans l’onglet Général, cliquez sur le bou-
ton Options Web. Dans la boîte de dialogue qui s’affiche, sélectionnez l’onglet
Fichiers. Supprimez la coche de la case Regrouper les fichiers de prise en charge
dans un dossier.

Remarque Sachez que lorsque vous enregistrez un classeur complet conte-


nant plusieurs feuilles de calcul et des graphiques sur des feuilles de calcul
distinctes, Internet Explorer préserve l’organisation d’origine des éléments
dans la page web statique qui en résulte en ajoutant des onglets de feuille de
calcul au bas de la fenêtre Internet Explorer.

Il est également possible d’enregistrer une feuille de calcul en tant que page web
en passant par du code VBA. Voici la procédure qui permet de le faire :

Sub SaveAsWebPage()

With ActiveWorkbook.PublishObjects.Add(xlSourceSheet, _
"C:\Page.mht", "Feuil1", "", xlHtmlStatic, _
"ProductSales_18739", "Ma page Web")
.Publish (False)
.AutoRepublish = False
End With
End Sub

C’est aussi simple que cela. N’oubliez pas de procéder à une vérification de l’affi-
chage de la page chaque fois que vous créez une page web. Cela évitera aux utili-
sateurs d’avoir des problèmes ultérieurement.

Publierune feuille de calcul sur le web


Une fois la page web enregistrée, vous devez la publier sur le web afin qu’elle soit
mise à la disposition de tous. Voici les étapes à accomplir :
1 Cliquez sur Fichier>Enregistrer en tant que page Web, pour ouvrir la boîte
de dialogue d’enregistrement. Sélectionnez l’option Classeur entier, puis
cliquez sur le bouton Publier. La boîte de dialogue Publier en tant que page
Web s’affiche, comme le montre la figure 25.2.

557
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Chapitre 25

Figure 25-2. La boîte de dialogue Publier en tant que page Web affiche
les options disponibles pour achever l’opération d’enregistrement. Vous y
indiquez l’emplacement, le nom du fichier ainsi que d’autres options de
publication.

2 Cliquez sur le bouton Parcourir pour sélectionner l’emplacement de stoc-


kage de la page web.
3 Si vous avez déjà créé un dossier web, ouvrez-le et passez directement à
l’étape 10 ; dans le cas contraire, poursuivez à partir du point suivant.
4 Pour créer un nouveau dossier dans vos Favoris réseau, cliquez sur Favoris
réseau dans la liste Enregistrer dans, puis cliquez sur Créer un dossier.
L’Assistant Ajout d’un Favori réseau s’affiche, comme le montre la figure
25.3.

Figure 25-3. L’Assistant Ajout d’un Favori réseau vous guide tout au long
de la création d’un nouvel emplacement réseau pour votre page web.

558
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web

Remarque Vous pouvez retourner dans Excel après avoir terminé de configu-

Chapitre 25
rer le nouvel emplacement réseau.

5 Cliquez sur le bouton Suivant, puis dans la fenêtre suivante, sélectionnez


l’option Choisissez un autre emplacement réseau. Vous acceptez ainsi la
création d’un raccourci vers un emplacement réseau. Tapez l’emplace-
ment réseau dans la zone Adresse réseau ou Internet, comme par exemple
http://mondomainedetest.com/idutilisateur. Saisissez le nom choisi
pour le Favori réseau et cliquez sur Terminer pour refermer l’Assistant.
6 Saisissez votre nom d’utilisateur et votre mot de passe de façon que le ser-
veur web puisse vous authentifier.
7 Saisissez le nom du fichier et cliquez sur OK. Vous retournez dans la boîte
de dialogue Publier en tant que page Web.
8 Cliquez sur le bouton Publier.

Remarque Notez soigneusement l’URL qui s’affiche dans la zone Nom de


fichier.

9 Ouvrez la page web dans votre navigateur.


Une fois l’opération accomplie, n’oubliez pas de vérifier le bon fonctionnement
du fichier. La phase de test doit être complète de manière à éviter les problèmes
lorsque les utilisateurs commenceront à interagir avec le fichier. Il est recom-
mandé de tester tous les liens afin d’être certain que vous avez bien mis en œuvre
les fonctionnalités recherchées.
Maintenant que vous avez vu l’essentiel du processus de publication web, il est
très simple d’ajouter la démarche de publication à la procédure de création préa-
lablement présentée. La procédure suivante a été modifiée de façon que la page
web soit publiée après avoir été créée :

Sub SaveAsWebPage()

With ActiveWorkbook.PublishObjects.Add(xlSourceSheet, _
"C:\Page.mht", "Feuil1", "", xlHtmlStatic, _
"ProductSales_18739", "Ma page Web")
.Publish (False)
.AutoRepublish = False
End With

End Sub

559
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Au Quotidien
Chapitre 25

Style des pages web et publication

Que vous soyez en train de publier des informations pour les mettre à la dis-
position de l’intranet de votre entreprise ou de l’Internet, vous vous apprêtez à
partager de l’information. Celle-ci sera affichée à l’écran et devra avoir une
mise en forme visant à en faciliter la lecture. Il est intéressant de publier des
informations sous forme de tableau, mais un graphique sera peut-être plus
facile à assimiler par votre public.

Il y a également quelques règles générales à suivre lorsque vous créez un site


web. Par exemple, je suis certain que vous avez déjà vu des sites web difficiles
à lire à cause du choix des couleurs. Si vous choisissez un fond sombre et des
textes également sombres, vos lecteurs ne resteront pas longtemps dans la
contemplation des informations que vous leur proposez. La mise en page est
aussi importante. Elle doit s’accompagner d’outils de navigation appropriés et
faciles à utiliser. Sachez aussi qu’en dépit d’une mise en page claire, il est peu
pratique de remonter manuellement en début de page ou aux pages précéden-
tes.

Enfin, avant de publier votre page web, assurez-vous qu’elle est finalisée en
vérifiant si les liens hypertextes fonctionnent et que le rendu correspond à vos
attentes. Ouvrez votre page dans un navigateur et vérifiez bien que tout fonc-
tionne comme voulu. L’idéal est de procéder à ces tests dans plusieurs navi-
gateurs web.

Des pages web interactives


Les composants interactifs permettent aux utilisateurs de manipuler vos don-
nées dans les pages web qu’ils affichent dans un navigateur. Par exemple, vous
pouvez publier une feuille de calcul interactive pour calculer des informations
d’emprunt. L’utilisateur peut naviguer dans la page et y saisir des informations
financières, comme le montant de l’emprunt et le taux d’intérêt pour calculer ses
remboursements mensuels.
Les composants interactifs du fichier HTML ne sont ni accessibles depuis, ni
modifiables dans Excel. Vous devez donc assurer la viabilité d’une copie maître
du classeur Excel publié, de manière à pouvoir la modifier et la republier si
nécessaire.
Lorsque vous publiez une page web avec de l’interactivité, les utilisateurs peu-
vent manipuler les données. Pour créer une page web interactive, vous enregis-
trez les données avec des fonctionnalités supplémentaires. Voici ce que les
utilisateurs pourront en faire :
● Saisir des données ;
● Les mettre en forme ;
● Effectuer des calculs ;

560
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
● Analyser des données ;

Chapitre 25
● Effectuer des tris et des filtrages.

Votre feuille de calcul peut bénéficier de plusieurs types d’interactivité. Le


Tableau 25.1 vous en donne le détail.
Tableau 25-1. Options d’interactivité
Interactivité Description
Fonctionnalité de feuille Les utilisateurs peuvent modifier les données en modifiant des
de calcul valeurs dans les cellules. Les formules sont alors
automatiquement actualisées pour refléter les changements.
Cette option vous permet également de filtrer des listes sur la
page web.
Fonctionnalité de Les utilisateurs peuvent modifier la présentation des lignes et
tableau croisé des colonnes pour afficher différents récapitulatifs des données
dynamique source s’ils utilisent les rapports de tableaux croisés
dynamiques. Les tableaux croisés dynamiques permettent
également d’actualiser la plage de données externe.
Fonctionnalité de Donne à l’utilisateur la possibilité d’utiliser des fonctions
graphique interactives sur le graphique dans la page web.

Remarque Le navigateur utilisé pour afficher les composants interactifs doit


être Microsoft Internet Explorer version 4.1 ou ultérieure et disposer de la
licence Microsoft Office permettant de travailler avec les feuilles de calcul, les
diagrammes ou les tableaux croisés dynamiques publiés de manière interac-
tive à partir d’Excel.

Voici les étapes qui permettent d’ajouter de l’interactivité à vos pages web.
1 Sélectionnez le menu Fichier, puis la commande Enregistrer en tant que
page Web.
2 Saisissez le nom de fichier dans la zone Nom de fichier.
3 Cochez la case Ajouter de l’interactivité.
4 Cliquez sur le bouton Publier.
5 Sélectionnez le type d’interactivité dans la liste Ajouter l’interactivité avec.
Le type d’interactivité dépend des types d’objets qui se trouvent dans la
feuille de calcul.
6 Cliquez sur le bouton Publier.

561
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Remarque Une fois l’opération accomplie, vous pouvez ouvrir et utiliser des
Chapitre 25

pages web interactives dans votre navigateur web. Cependant, si vous avez
besoin de modifier les données sur le site web, il n’est pas possible d’ouvrir et
de modifier des pages web interactives dans Excel. Enregistrez une copie de
sauvegarde du classeur d’origine tel que vous l’avez publié au cas où vous
auriez besoin de modifier les données. Si vous apportez des changements à la
feuille de calcul d’origine, vous devez la republier et reconfigurer l’interactivité
de la nouvelle page web.

Exploitation de l'Internet comme source de


données
L’application Excel reconnaît couramment deux sources de données : les bases
de données en réseau et l’utilisateur. Habituellement, si un élément de données
n’était pas disponible dans une base de données, l’utilisateur était sollicité pour
le saisir et le tenir à jour. Pour ce faire, l’application devait comporter plusieurs
feuilles de calcul et boîtes de dialogue afin de stocker les informations et prévoir
le mécanisme de saisie des données.
L’actualisation régulière des taux de change en est un exemple type pour le cas
d’une application financière. Il est généralement de la responsabilité de l’utilisa-
teur de se procurer les taux les plus récents et de les saisir dans l’application. Or
vous pouvez optimiser celle-ci en automatisant la récupération des informations
de taux de change à partir d’un site web.
Les sections suivantes décrivent différentes techniques de récupération d’infor-
mations à partir du web, prenant pour exemple la récupération des taux de
change du dollar US/dollar canadien sur le site http://www.fms.treas.gov/
intn.html#rates. Voici la page web correspondante, dans la figure 25.4.

562
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web

Chapitre 25
Figure 25-4. Le site web du Trésor nord-américain montre les données
disposées dans un tableau. Ces informations seront évaluées dans les
prochaines sections.

Ouvrir des pages web en tant que classeurs


La solution la plus simple consiste à ouvrir la totalité de la page web comme s’il
s’agissait d’un classeur, puis d’y rechercher les informations voulues, comme par
exemple, le taux de change du dollar US par rapport au dollar canadien. Cepen-
dant, le problème de cette approche est que la page web est chargée en totalité.
Or celle-ci contient souvent des images, des bannières et des informations dont
vous n’avez pas besoin. Ces données inutiles ralentissent les performances de
vitesse de récupération des données. Plus loin dans ce chapitre, nous revien-
drons sur l’utilisation des requêtes Web pour améliorer les performances.
Entre-temps, voyez la procédure suivante, qui montre comment ouvrir le site
web du Trésor nord-américain dans Excel :

Sub OpenUSDRatesPage()

Dim webBk As Workbook


Dim webRng As Range

Set webBk = Workbooks.Open("http://www.fms.treas.gov/


intn.html#rates")
Set webRng = webBk.Worksheets(1).Cells.Find("CANADA - DOLLAR")

MsgBox "Le taux de change USD/CAD est " & webRng.Offset


(0, 1).Value

End Sub

Cette procédure emploie la méthode Open pour ouvrir une page web existante
au lieu de passer par un navigateur. Lorsque la page web s’affiche, elle recherche
le type de devise spécifié et affiche le taux de change dans une boîte de message.

563
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


On peut réutiliser cette procédure avec d’autres pages web qui affichent des
informations dans des tableaux. Il suffit de saisir l’intitulé approprié dans les cri-
Chapitre 25

tères de recherche. Si vous faites régulièrement des recherches sur l’Internet,


vous devez disposer d’une connexion permanente.

Dépannage
Cadres de pages web

Il vous arrivera peut-être d’ouvrir une page dans Excel et que rien ne s’affiche.
Ce n’est pas vous qui êtes en cause, mais le fait qu’Excel ne peut pas ouvrir
de pages web avec des cadres.

Les cadres permettent de subdiviser les pages web en plusieurs sections qui
sont en fait comme autant de pages web distinctes. Chacune de ces sections
s’appelle un cadre (frame). La page de cadres est le conteneur qui accueille le
groupe de cadres. Excel ne peut pas ouvrir les pages web contenant des
cadres.

Si vous savez travailler dans le code source HTML, servez-vous d’un éditeur
HTML pour copier les informations requises, sans le code des cadres, dans un
nouveau fichier que vous pourrez alors ouvrir dans Excel.

Utiliser les requêtes Web


Les requêtes Web ont fait leur apparition dans Excel 97 et ont été optimisées avec
chaque version successive du logiciel. Elles vous permettent de récupérer un
tableau dans une page web et vous proposent des options permettant d’actuali-
ser les données automatiquement chaque fois que vous ouvrez le classeur corres-
pondant, ou de définir des périodicités d’actualisation.
L’un des problèmes des requêtes Web est qu’Excel emploie les séparateurs de mil-
liers et décimaux définis dans les Paramètres régionaux de Windows pour recon-
naître les valeurs chiffrées. Par exemple, si vous récupérez le taux de change d’un
pays anglo-saxon, la virgule est utilisée comme séparateur de milliers et non pas
comme séparateur décimal, ce qui donne des taux de change erronés. Avant
Excel 2002, il n’était pas possible d’utiliser efficacement les requêtes Web pour les
pays qui n’utilisaient pas le format de séparateurs non européen. Il est
aujourd'hui possible de contourner ce problème.
L’objet Application contient trois propriétés permettant de remplacer provisoi-
rement les paramètres de reconnaissance des nombres. Les voici :
● Application.DecimalSeparator
● Application.ThousandsSeparator
● Application.UseSystemsSeparators

Elles vous permettent de définir des séparateurs dans Excel afin qu’ils correspon-
dent à ceux de la page web, de lancer la requête et de redéfinir les séparateurs

564
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
ultérieurement. Pour exploiter les options d’actualisation automatique des
requêtes Web, définissez ces séparateurs dans l’événement BeforeRefresh et redé-

Chapitre 25
finissez-les ensuite dans l’événement AfterRefresh. Pour capturer ces événe-
ments, vous devez configurer des modules de classe.
La procédure suivante montre comment récupérer le tableau des taux de change
à l’aide d’une requête Web créée au sein de la procédure.

Remarque La procédure RetrieveWebQueryData importe le tableau des taux


de change dans le classeur Excel. Si vous ne parvenez pas à récupérer ces
données dans votre classeur, vérifiez quel est le tableau à importer. L’encadré
« Au quotidien : Quel numéro pour mon tableau ? », un peu plus loin dans ce
chapitre, décrit ce qui se passe dans ce cas de figure.

Sub RetrieveWebQueryData()

ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.fms.treas.gov/intn.html",
Destination:=Range("A1"))
.Name = "USD"
.HasTitle = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "2"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With

End Sub

La ligne qui déclare .WebTables = 2 indique à Excel que vous voulez récupérer
le troisième tableau de la page. Il s’agit en effet de la troisième occurrence d’une
balise <TABLE> dans le code source HTML de la page (la numérotation com-
mence à zéro).
Avec Excel, vous avez la possibilité d’incorporer les données que vous trouvez sur
le web dans vos feuilles de calcul. Il n’est pas nécessaire de savoir comment la
page a été créée, ni de créer un fichier de requête. Vous pouvez sélectionner les

565
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


données que vous voulez et, une fois que les informations ont été importées dans
la feuille de calcul, vous pouvez les actualiser d’un simple clic de souris. Vous
Chapitre 25

pouvez aussi opter pour une actualisation au moment de l’ouverture du classeur,


ou à des moments prédéfinis.
Vous pouvez aussi créer une nouvelle requête Web au moyen de la fonctionnalité
Excel d’importation de données externes. Voici les étapes de cette action.
1 Cliquez sur Données>Données externes>Nouvelle requête sur le Web.
2 Tapez l’URL de la page web dans la zone Adresse.
3 Cliquez sur le bouton OK pour afficher la page web dans la boîte de dialo-
gue Nouvelle requête sur le Web. Notez les flèches noires sur fond jaune
apparaissant dans la page web. Lorsque vous cliquez dessus, le tableau
correspondant est importé dans le classeur.
4 Sélectionnez le tableau à importer. La flèche correspondante se trans-
forme en case à cocher, comme le montre la figure 25.5.
5 Cliquez sur le bouton Importer.
6 Vous disposez de deux options pour présenter le contenu de la requête
Web. Choisissez l’option Feuille de calcul existante pour afficher les don-
nées dans la feuille de calcul active ; choisissez Nouvelle feuille de calcul
pour importer les données dans une nouvelle feuille.

Figure 25-5. La boîte de dialogue Nouvelle requête sur le Web présente


le tableau des taux de change prêt à être importé dans la feuille de calcul
Excel.

566
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web

Au Quotidien

Chapitre 25
Quel numéro pour mon tableau ?

Il peut vous arriver d’afficher des pages web contenant de nombreux tableaux,
ce qui ne vous facilite pas la tâche pour déclarer le numéro correspondant à la
propriété WebTables. Or vous avez la possibilité de vérifier que vous ne vous
êtes pas trompé.

Pour ce faire, enregistrez une macro dans laquelle vous configurez une requête
Web. Celle-ci doit importer le tableau dont vous avez besoin dans une nouvelle
feuille de calcul, de manière à éviter les problèmes ultérieurs. Une fois la
requête Web créée, arrêtez l’enregistrement de la macro.

Parcourez le code de la macro à la recherche de la propriété WebTables. Sa


valeur correspond au numéro de tableau que vous recherchiez.

Ainsi, le fait d’enregistrer des macros peut vous aider à retrouver des valeurs
et des propriétés qui autrement, seraient difficiles à localiser. Pensez-y au
moment de travailler avec des propriétés nouvelles pour vous. Vous découvri-
rez des propriétés et des méthodes dont vous ignoriez l’existence jusqu’à pré-
sent. Et n’oubliez pas que les macros enregistrées doivent être nettoyées.
Elles contiennent toujours des lignes de code supplémentaires qui ne servent
à rien.

Analyser les pages web à la recherche d’informations


spécifiques
Les requêtes Web constituent un excellent moyen de récupérer des tableaux
d’informations dans des pages web, mais elles sont un peu lourdes à utiliser si
seules quelques informations vous intéressent. Plus simplement, vous pouvez
lire la page dans une instance masquée d’Internet Explorer, effectuer une recher-
che dans la page, puis récupérer le résultat. Pour utiliser le code suivant, vous
devez cliquer sur Outils>Références, puis sélectionner la bibliothèque d’objets
Microsoft Internet Controls :

Sub GetUSDtoCanadian()

Dim webIE As SHDocVw.InternetExplorer


Dim strPage As String
Dim lngCanadian As Long
Dim lngDec As Long
Dim lngStart As Long
Dim lngEnd As Long
Dim dblRate As Double

Set webIE = New SHDocVw.InternetExplorer


webIE.Navigate "http://www.fms.treas.gov/intn.html#rates"

Do Until webIE.ReadyState = READYSTATE_COMPLETE


DoEvents

567
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Loop
Chapitre 25

strPage = webIE.Document.body.innerHTML

lngCanadian = InStr(1, strPage, "CANADA - DOLLAR")


lngDec = InStr(lngCanadian, strPage, ".")

lngStart = InStrRev(strPage, ">", lngDec) + 1


lngEnd = InStr(lngDec, strPage, "<")

dblRate = Val(Mid$(strPage, lngStart, lngEnd - lngStart))

MsgBox "Le taux de change USD/CAD est " & dblRate

End Sub

Pour choisir entre une requête Web et l’analyse de la page web, réfléchissez aux
circonstances de votre recherche et au volume de données que cela implique.
Pour des éléments isolés, il est sans doute plus facile de faire une recherche dans
la page web directement. Mais si vous voulez récupérer plusieurs éléments, la
requête Web sera plus intéressante pour récupérer la page ou le tableau dans un
classeur, dans lequel vous n’aurez plus qu’à rechercher les informations voulues.

Exploitation de l'Internet pour publier des


résultats
Un serveur web peut faire office de dépôt d’informations, stocker les résultats de
vos applications et vous permettre de les présenter à un public élargi par rapport
à l’impression et à la diffusion de rapports écrits. En présentant les résultats sous
forme de pages web, votre public pourra aisément exploiter les résultats présen-
tés dans ses propres analyses et les transmettre plus facilement à d’autres parties
intéressées.

Configurer un serveur web


De nombreux ouvrages ont été écrits sur le sujet. C’est la raison pour laquelle ici,
nous nous contenterons de vous donner un rapide aperçu de la configuration
d’un serveur web. Vous trouverez de plus amples informations sur la configura-
tion d’un serveur Windows 2003 Server dans l’ouvrage Microsoft Windows Server
2003 Administrator’s Companion, édité chez Dunod. Pour apprendre à configu-
rer un serveur web avec Windows XP Professionnel, lisez plutôt Microsoft Win-
dows XP Networking Inside Out (également publié chez Dunod).
Les exemples présentés dans les prochaines sections nécessitent un accès en écri-
ture sur un serveur web. Pour héberger des pages web, vous devez commencer
par installer IIS (Internet Information Server). Pour ce faire, dans le Panneau de
configuration, choisissez Ajout/Suppression de programmes. Une fois IIS ins-
tallé, localisez la console Gestion des services Internet, dans le dossier Outils
d’administration du Panneau de configuration. Depuis cette console, vous pou-

568
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
vez gérer plusieurs aspects de votre serveur web.

Chapitre 25
Le dossier Répertoire de base sert à stocker votre page web. Pour configurer les
propriétés du répertoire de base de vos serveurs web, ouvrez IIS et cliquez droit
sur le noeud Site Web par défaut. Choisissez Propriétés et cliquez sur l’onglet
Répertoire de base. Vous obtenez plusieurs options de configuration pour le site
web par défaut. Vérifiez que les cases Lecture et Écriture sont cochées et cliquez
sur OK. Voyez la figure 25.6. Ces options vous permettent de publier de nou-
veaux contenus dans le dossier.

Figure 25-6. La boîte de dialogue Propriétés de Site Web par défaut permet de
configurer IIS. Pour publier des pages sur votre serveur web, n’oubliez pas de
cocher les cases Lecture et Écriture.

Observez la zone Chemin d’accès local. Elle indique la racine de votre serveur
web. Par défaut, il s’agit de l’emplacement C:\inetpub\wwwroot. Toute page web
placée dans ce répertoire sera publiée à l’adresse URL suivante : http://localhost/
NomPage.html.

Enregistrer des feuilles de calcul en tant que pages web


Vous pouvez gagner du temps si vous créez un modèle à partir duquel actualiser
les informations de votre site web. Les modèles facilitent considérablement la
présentation des résultats dans une page web. Le modèle de classeur contient les
mises en forme et liens nécessaires. Lorsque votre application a produit ses résul-
tats, il est aisé de copier les chiffres pertinents dans le modèle, puis d’enregistrer
celui-ci directement sur le serveur web.
Dans l’exemple suivant, vous allez voir comment utiliser un fichier de modèle
pour publier directement les nouveaux résultats sur votre serveur web :

569
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Astuce Personnalisez la procédure


Chapitre 25

Vous devez personnaliser la procédure suivante de manière à ce qu’elle utilise


un dossier que vous avez créé sur votre ordinateur. Pour qu’elle fonctionne,
vous devez modifier les noms de fichiers, les références de plages et de gra-
phiques, ainsi que les tableaux croisés dynamiques.

Sub PublishResultsToWeb()

Dim webBk As Workbook


Dim webSht As Worksheet

Set webBk = Workbooks.Add("C:\ModeleWeb.xls")


Set webSht = webBk.Worksheets(1)

webSht.Range("Profits").Value = Workbooks("Resultats.xls") _
.Worksheets("Financiers").Range("Profits").Value

webSht.SaveAs "http://localhost/resultatsjuillet2004.htm", xlHtml

webBk.Close False

End Sub

Ajout d’interactivité avec les composants Web


Dans l’exemple précédent, vous avez vu comment publier sur votre serveur web
une feuille de calcul statique au format HTML. Or les Office Web Components
vous permettent de créer des pages web interactives. Lorsque vous enregistrez
une feuille de calcul interactive (ou actualisable), plusieurs conversions se
produisent : les feuilles de calcul deviennent actualisables, ainsi que les graphi-
ques et les listes de tableaux croisés dynamiques.
Ces Web Components sont des contrôles ActiveX incorporés à la page HTML ;
ils sont conçus pour offrir la même interactivité que dans Excel, mais depuis
l’écran d’un navigateur.
La description exhaustive des Web Components dépasserait la portée de ce livre,
mais le code qui suit vous servira à enregistrer un classeur en tant que page web
interactive. Le classeur en question contient une plage de données à publier dans
un tableau spécifié, un tableau croisé dynamique et un graphique incorporé.

570
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web

Astuce Personnalisez votre procédure

Chapitre 25
Pour exécuter cette procédure, vous devez personnaliser la procédure
PublishInteractivePage afin qu’elle référence votre serveur web, remplacer les
noms de fichiers par les vôtres, ainsi que le nom de la feuille de calcul que
vous avez choisi pour réaliser cet exemple.

Sub PublishInteractivePage()

With ActiveWorkbook.PublishObjects
.Delete
.Add(xlSourcePivotTable, "http://localhost/page.htm",
"Sheet1", _
"PivotTable1", xlHtmlList).Publish True
.Add(xlSourceRange, "http://localhost/page.htm", "Feuil1", _
"A1:C30", xlHtmlCalc).Publish False
.Add(xlSourceChart, "http://localhost/page.htm", "Feuil1", _
"Graphique 1", xlHtmlChart).Publish False
End With

End Sub

Astuce Créez plusieurs pages web


Pour publier des composants de classeur dans des pages web différentes,
enregistrez les objets isolément, chaque fois dans une nouvelle page.

La page web qui en résulte est très simple car on a seulement ajouté les emplace-
ments des divers Web Components. Une fois la page créée, il ne vous reste plus
qu’à la modifier pour réaliser une présentation de qualité.
Les Web Components de Microsoft Office constituent un moyen de publier des
documents Office sur le web tout en préservant l’interactivité des documents tels
qu’ils peuvent être affichés dans leurs applications d’origine. Il s’agit d’un
ensemble de contrôles ActiveX. Lorsque les utilisateurs de Microsoft Office affi-
chent une page contenant un Web Component Office, ils peuvent interagir avec
les données affichées dans le document directement depuis Internet Explorer. Ils
peuvent trier, filtrer, ajouter ou modifier les données, développer et masquer des
vues détaillées, travailler avec les listes de tableaux croisés dynamiques et générer
des graphiques à partir des résultats de leurs modifications. En outre, les Web
Components Office sont entièrement programmables, ce qui vous permet de
créer du contenu enrichi et personnalisé dans vos applications pour le web.

Remarque Les Web Components Office fonctionnent avec Internet Explorer


version 4.01 et ultérieures ; les pages d’accès aux données Microsoft Access
ne fonctionnent qu’avec Internet Explorer version 5 et ultérieures. Pour être
certain de bénéficier des fonctionnalités complètes des Web Components, tra-
vaillez avec Internet Explorer version 5 ou ultérieure.

571
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Communication avec un serveur web


Chapitre 25

Dans un réseau d’entreprise, pratiquement tous les transferts de données s’effec-


tuent dans divers formats propriétaires binaires, qu’il s’agisse de transfert de
fichiers ou de requêtes adressées à des bases de données distantes. Essentielle-
ment à cause des problèmes de sécurité, la communication sur l’Internet a évo-
lué et a employé des formats textuels, les adresses URL en étant un exemple
parmi les plus simples (comme http://monsite.com/mapageweb.html).
Pour communiquer avec une application qui s’exécute sur un serveur web, vous
devez être en mesure de traiter des informations au niveau du serveur et
d’échanger des informations avec ladite application.
La méthode FollowHyperlink de l’objet Workbook permet de communiquer
avec un serveur web. Mais cette méthode comporte quelques inconvénients :
● En cas d’erreur pendant la connexion, Excel s’interrompt.
● Toute donnée retournée à partir du lien hypertexte s’affiche automatique-
ment en tant que nouveau classeur.
● Vous n’avez pratiquement aucun contrôle sur la communication.

Le contrôle Microsoft Internet Transfer Control (msinet.ocx) vous offre une


alternative plus souple. Ce contrôle ActiveX, souvent appelé ITC, est un wrapper
du fichier wininet.dll ; il est facile à utiliser et offre des services Internet de bas
niveau pour la plate-forme Microsoft Windows.
Vous pouvez vous servir de deux mécanismes pour envoyer des informations à
un serveur web. Le premier consiste à inclure les informations dans la chaîne de
l’URL ; le second à les envoyer comme une section distincte de la requête HTTP.
L’encodage des URL fait appel à des paramètres qui viennent s’ajouter à la fin de
la chaîne de l’URL. En surfant sur le web, vous avez sans doute remarqué qu’une
fois que vous avez saisi une adresse, celle-ci est modifiée automatiquement et que
l’URL de destination contient désormais des points d’interrogation et des signes
égal, avec des lettres et des chiffres un peu partout. À y regarder de plus près,
vous pouvez observer plusieurs choses. Après l’URL, on trouve un point d’inter-
rogation suivi de param1=valeur&param2=valeur. À titre d’exemple, ouvrez la
page web MSN Hotmail en tapant l’adresse www.hotmail.com, et tapez sur
ENTRÉE pour voir apparaître le résultat suivant dans la barre d’adresse :

http://loginnet.passport.com/
login.srf?id=2&svc=mail&cbid=24325&msppjph=1&tw=0&
fs=1&fsa=1&fsat=1296000&lc=1033&_lang=FR

C’est bien différent de ce que vous avez initialement saisi, mais c’est pourtant
ainsi que vous avez atteint le site web de destination.
En incluant les paramètres dans l’URL, vous faites en sorte que l’adresse corres-
pondante puisse être stockée dans les Favoris de l’utilisateur. Cependant, Inter-
net Explorer limite les URL à une longueur de 2 083 caractères, ce qui limite la
quantité d’informations que vous pouvez transmettre à l’aide de cette méthode.

572
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et le web
Si vous choisissez d’envoyer des informations dans une section distincte de la
requête HTTP, vous utiliserez le champ POST pour transférer l’information en

Chapitre 25
direction du serveur web. Il n’existe pas de limitation effective de la quantité de
données que vous pouvez placer dans un champ POST ; c’est donc le meilleur
moyen de transférer des informations au serveur.
Mais comment retourner l’information au client ? En les présentant sous forme
de pages web selon les différentes techniques décrites tout au long de ce chapitre.

Exploitation des solutions Internet avec


Excel
Microsoft a fait en sorte que les développeurs Excel puissent utiliser l’Internet
comme une partie intégrante de leurs applications. Par exemple, il est possible
d’ouvrir des classeurs sur des serveurs web et d’enregistrer des classeurs sur des
serveurs web. Excel sait ouvrir des pages HTML comme s’il s’agissait de clas-
seurs, et les requêtes web permettent d’extraire des tableaux depuis des pages
web. La bibliothèque d’objets Internet Explorer peut également être automatisée
afin de récupérer des éléments de données isolés dans une page web, sans
s’encombrer d’un classeur.
Au-delà de la possibilité d’utiliser et d’extraire des données du World Wide Web,
vous pouvez aussi enregistrer des classeurs sous forme de pages web au contenu
enrichi. Il est aisé de produire des pages web actualisables, de proposer des inte-
ractions comparables à celles d’Excel et ce, dans un navigateur.
Tous les outils abordés dans ce chapitre permettent de développer de nouveaux
types de solutions professionnelles dans lesquelles Excel est un élément clé dans
l’ensemble des processus métier. Ces possibilités ne se limitent toutefois pas à
l’entreprise ; vos solutions peuvent être étendues à plusieurs entreprises et loca-
lisations géographiques.
À la lecture de ce chapitre, vous aurez peut-être décidé de revoir votre stratégie
de développement de solutions avec Excel. L’Internet est une source d’informa-
tions inépuisable que vous pouvez exploiter en toute simplicité. Alors n’hésitez
pas à utiliser les informations disponibles sur la Toile, d’autant qu’Excel y ajoute
des fonctionnalités particulièrement intéressantes pour partager des informa-
tions avec le reste du monde. Plus rien n’entrave votre créativité dans la pour-
suite des objectifs que vous souhaitez atteindre en développant vos applications.

573
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 26
Excel et XML
Introduction aux listes Ajout manuel de XML
de données . . . . . . . . . . . . . . . . 575 à un classeur . . . . . . . . . . . . . . . 587
Création de schémas XML . . . . . 582 Ajout de XML à une feuille de
Création de fichiers de calcul par programmation. . . . . 590
données XML . . . . . . . . . . . . . . . 585

La prise en charge du XML, y compris la possibilité d’enregistrer des fichiers sous


forme de documents XML, a été introduite dans Microsoft Office XP, mais cette
technologie constitue l’un des fers de lance d’Office 2003. Si votre entreprise
échange des données avec d’autres organisations sous la forme de bons de com-
mandes, de données sur les stocks, de données financières ou de catalogues pro-
duits, vous pouvez vous servir du XML pour transférer les données entre vos
collègues et vos fournisseurs sans tenir compte du programme employé pour
créer les données.
Dans ce chapitre, vous apprendrez à :
● Créer des listes de données manuellement et par programmation ;
● Créer des schémas et des fichiers de données XML ;
● Associer les schémas XML aux classeurs ;
● Importer et exporter des données XML manuellement et par
programmation ;
● Associer des éléments de schéma à des colonnes ;
● Associer des schémas avec des listes de données existantes.

Introduction aux listes de données


Dans Microsoft Excel 2002 et les versions antérieures, vous deviez créer une liste
de données pour utiliser certaines fonctions comment le tri et le filtrage des don-
nées ou la création d’un tableau croisé dynamique. Le concept de liste de don-
nées restait cependant mal défini dans le système d’aide qui disait, en résumé,
qu’il vous fallait une série de colonnes avec des en-têtes et une série de lignes avec
des valeurs dans les colonnes. La figure 26.1 montre une liste de fournisseurs
issue de la table Suppliers de l’exemple de base de données Northwind (inclus
avec Microsoft Access).

575
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Chapitre 26

Figure 26-1. Une liste de données contient des en-têtes de colonnes et des
lignes de données, où chaque ligne représente un jeu complet de valeurs de
colonnes.

L’un des progrès proposés par Microsoft Office Excel 2003 est que le concept de
listes de données a été codifié en un ensemble cohérent, mettant en œuvre une
nouvelle visibilité très similaire à celle d’une table Access ou d’une feuille de don-
nées (à ne pas confondre avec une feuille UserForm).
Pour créer une liste de données avec l’interface Excel, procédez de la manière
suivante :
1 Saisissez les noms dans les cellules qui constituent la ligne supérieure de la
liste.
2 Cliquez sur Données, Liste, Créer une liste pour afficher la boîte de dialo-
gue Créer une liste (voir figure 26.2).
3 Sélectionnez les cellules à intégrer à la liste.
4 Cochez la case Ma liste comporte des en-têtes si la ligne supérieure de la
liste sélectionnée contient des en-têtes de colonnes.
5 Cliquez sur OK.

Figure 26-2. La boîte de dialogue Créer une liste permet de déterminer la


structure de la liste de données.

Une fois la liste créée, vous pouvez commencer à saisir les données dans la ligne
d’insertion, dont la cellule située le plus à gauche contient un astérisque.

576
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
Appuyez sur la touche TAB pour vous déplacer à la colonne suivante et sur la
touche ENTRÉE pour créer une nouvelle ligne. Lorsque vous avez saisi les don-
nées de la liste, servez-vous des flèches de la première ligne (généralement la
ligne des en-têtes) pour filtrer les valeurs de la liste de la même manière qu’avec
un Filtre élaboré. Vous pouvez ajouter une ligne des totaux en cliquant dans
n’importe quelle cellule de la liste avant de choisir Données, Liste, Ligne Total.
Cliquez dans une cellule de la ligne des totaux pour afficher une flèche sur
laquelle vous pouvez cliquer pour sélectionner la fonction à employer dans cha-
que cellule de total.

Chapitre 26
Remarque Si vous ne voulez plus utiliser la fonctionnalité de liste, mais sou-
haitez conserver les données de la liste, cliquez sur l’une des cellules de la
liste et choisissez Données, Liste, Convertir en plage.

Créer des listes de données par programmation


Les listes de données individuelles sont représentées dans le modèle d’objet Excel
par l’objet ListObject, qui possède une grande variété de propriétés et de métho-
des (voir tableau 26.1) servant à manipuler les listes via Microsoft Visual Basic
pour Applications (VBA).
Tableau 26-1. Propriétés et méthodes de l’objet ListObject
Propriété ou méthode Description
Propriété
Active Cette propriété retourne une valeur booléenne qui prend la
valeur True si la cellule active se trouve dans la corps de
l’objet ListObject.
DataBodyRange Cette propriété retourne un objet Range en lecture seule qui
faire référence aux cellules de la liste qui se trouvent entre la
ligne des en-têtes et la ligne d’insertion.
DisplayRightToLeft Cette propriété en lecture seule retourne True si la feuille de
calcul, la liste ou la fenêtre sont affichées dans un langage
dont les caractères sont affichés de droite à gauche.
HeaderRowRange Cette propriété retourne un objet Range en lecture seule qui
fait référence aux cellules de la ligne d’en-têtes de l’objet
ListObject.
InsertRowRange Cette propriété retourne un objet Range en lecture seule qui
fait référence aux cellules de la ligne d’insertion de l’objet
ListObject.
ListColumns Cette propriété retourne une collection ListColumns qui
contient toutes les colonnes de l’objet ListObject.
ListRows Cette propriété retourne une collection ListRows qui contient
toutes les lignes de l’objet ListObject.

577
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Tableau 26-1. Propriétés et méthodes de l’objet ListObject (Suite)


Propriété ou méthode Description
Propriété
Name Une propriété utilisée pour identifier l’objet ListObject en tant
que membre unique de la collection ListObjects. La propriété
Name peut uniquement être définie et lue via VBA. Vous ne
pouvez pas l’affecter en utilisant l’interface Excel.
QueryTable Cette propriété crée une liaison avec une table pour fournir
des données à l’objet ListObject.
Chapitre 26

Range Cette propriété retourne un objet Range en lecture seule qui


fait référence à toutes les cellules de l’objet ListObject.
SharePointUrl Cette propriété en lecture seule retourne une chaîne qui
contient l’URL de la liste Microsoft SharePoint pour un objet
ListObject donné.
ShowAutoFilter Une valeur booléenne qui, si elle prend la valeur True, affiche
le résultat du filtre automatique actif sur le contenu de l’objet
ListObject. La valeur par défaut est False.
ShowTotals Une valeur booléenne qui, si elle prend la valeur True, affiche
une ligne des totaux pour l’objet ListObject. La valeur par
défaut est False.
SourceType Une constante en lecture seule qui reflète le type de source
fournissant les données à l’objet ListObject. Les sources de
données disponibles sont xlSrcExternal (une source de
données externe comme une page web), xlSrcRange (une
plage de cellules dans un classeur Excel) et xlSrcXml (un
fichier de données XML).
TotalsRowRange Cette propriété retourne un objet Range en lecture seule qui
fait référence aux cellules de la ligne des totaux de l’objet
ListObject.
XmlMap Cette propriété en lecture seule retourne un objet XmlMap
représentant le mappage de schéma utilisé pour la liste
spécifiée.
Méthode
Delete Cette méthode supprime l’objet ListObject actif et supprime
toutes les données des cellules associées.

578
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML

Tableau 26-1. Propriétés et méthodes de l’objet ListObject (Suite)


Propriété ou méthode Description
Méthode
Publish(Target(Url, Cette méthode publie un objet LinkObject sur un site de
ListName, Description), services SharePoint. L’argument Target contient un tableau de
LinkSource) trois valeurs : l’URL du serveur SharePoint, le nom de la liste
et une description optionnelle. L’argument LinkSource est une
valeur booléenne qui, si elle est positionnée sur True, lie
l’objet LinkObject en cours à l’objet LinkObject publié. Si

Chapitre 26
l’argument LinkSource prend la valeur False, les deux objets ne
sont pas liés (aucune mise à jour de l’objet LinkObject qui a
appelé la méthode Publish ne sera reflétée dans l’objet
LinkObject du site SharePoint).
Refresh Cette méthode actualise les données et le schéma de l’objet
ListObject qui extrait ses données d’un site SharePoint.
Resize(Range) Cette méthode permet de modifier la plage de cellules
associée à la liste. Si la liste extrait ses données d’une source
se trouvant sur un site SharePoint, on peut uniquement ajouter
des lignes, mais pas de colonnes. La méthode ne supprime
aucune donnée existante.
Unlink Cette méthode supprime la liaison entre l’objet ListObject et
une source se trouvant sur un site SharePoint. Aucune donnée
n’est supprimée.
Unlist Cette méthode supprime la fonctionnalité de liste d’un objet
ListObject. Les cellules de l’objet ListObject deviennent de
simples cellules et conservent leurs données.
UpdateChanges Cette méthode met à jour la liste située sur le site SharePoint
(XlListConflict) en fonction des changements apportés à la liste se trouvant
sur la feuille de calcul. La constante XlListConflict optionnelle
peut prendre la valeur de l’une des constantes intrinsèques
suivantes : xlListConflictDialog (la valeur par défaut, qui affiche
la boîte de dialogue Résolution des conflits),
xlListConflictRetryAllConflicts (qui tente à nouveau d’actualiser
les données), xlListConflictDiscardAllConflicts (qui ignore tout
changement entrant en conflit avec les changements des
autres utilisateurs) et xlListConflictError (qui indique une erreur
et arrête la mise à jour).

Toutes les listes de données d’une feuille de calcul se trouvent dans la collection
ListObjects de l’objet Worksheet. La collection est vide au départ. Vous utilisez la
méthode Add de la collection pour créer un nouvel objet ListObject dans la feuille
de calcul qui appelle la méthode.
Voici la syntaxe de la méthode ListObjects.Add :

579
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


expression.Add(SourceType, Source, LinkSource, HasHeaders, <;$RD>
Destination).Name=namestring

Le tableau 26.2 détaille les arguments de la méthode Add.


Tableau 26-2. Arguments de la méthode Add de la collection
ListObjects
Argument Obligatoire ou optionnel Description
expression Obligatoire Expression qui retourne un objet ListObject.
SourceType Optionnel L’une des deux constantes
Chapitre 26

XlListObjectSourceType : xlSrcExternal, qui


désigne une source de données externe ou
xlSrcRange (par défaut), qui indique que la
source des données est une plage dans une
classeur.
Source Optionnel si SourceType Lorsque SourceType prend la valeur
prend la valeur xlSrcRange ; xlSrcRange, cet argument fait référence à la
obligatoire si SourceType plage utilisée pour créer l’objet ListObject. Si
prend la valeur xlSrcExternal SourceType est positionné sur xlSrcExternal,
cet argument doit contenir un tableau de trois
chaînes (l’URL d’une page d’un site
SharePoint, un nom de liste et une valeur
représentant la vue à appliquer à la liste). Le
système d’aide Visual Basic Editor ne contient
pas la liste de ces valeurs : laissez le
troisième élément du tableau vide, sauf si
vous êtes administrateur SharePoint ou que
vous pouvez récupérer les valeurs correctes
auprès de votre administrateur SharePoint.
LinkSource Optionnel Une valeur booléenne qui indique s’il faut lier
la liste à une source de données externe. La
valeur par défaut est True si l’argument
SourceType est positionné sur xlSrcExternal.
Positionner cet argument sur True ou False
alors que l’argument SourceType prend la
valeur xlSrcRange produit une erreur.
HasHeaders Optionnel Une valeur Variant qui indique si l’objet
ListObject possède un jeu d’étiquettes de
colonnes existant. L’argument peut prendre
les valeurs xlGuess, xlNo ou xlYes. Si les
données source ne contiennent pas
d’étiquettes de colonnes ou si Excel ne
parvient pas à les détecter, la méthode crée
des en-têtes.

580
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML

Tableau 26-2. Arguments de la méthode Add de la collection


ListObjects (Suite)
Argument Obligatoire ou optionnel Description
Destination Obligatoire si l’argument Un objet Range qui identifie la cellule se
SourceType est positionné trouvant dans l’angle supérieur gauche du
sur xlSrcExternal ; ignoré si nouvel objet ListObject. La destination doit se
l’argument SourceType est trouver sur la feuille de calcul qui a appelé la
positionné sur xlSrcRange méthode Add.
namestring Obligatoire Une chaîne qui contient un nom unique pour

Chapitre 26
la liste.

Remarque La méthode Add insère de nouvelles colonnes à droite de la cel-


lule identifiée dans l’argument Destination pour s’assurer qu’elle dispose de
suffisamment de place pour insérer la nouvelle liste ; les données existantes
ne sont pas écrasées.

Au Quotidien
Une meilleure manière de créer des listes

Si vous consultez la rubrique consacrée à la méthode Add de la collection Lis-


tObjects dans l’aide en ligne de Visual Basic Editor, vous ne verrez pas .Name
= namestring. L’exemple du système d’aide vous oblige à créer un nouvel
objet et à utiliser une instruction beaucoup plus longue pour générer le même
résultat. En outre, si vous vous servez de la méthode Add de la manière
décrire dans l’aide, vous obtiendrez des messages d’erreurs puisque l’objet
ListObject que vous avez créé ne possède pas de nom. L’instruction Add de
l’exemple est quelque peu confuse, mais vous pouvez l’envisager comme une
forme de l’instruction suivante :

ListObjects(0).Name = namestring

Vous créez et nommez le membre de la collection ListObjects dans la même


instruction, mais cela fonctionne puisque l’objet ListObject existe lorsque
Visual Basic Editor rencontre la méthode Name.

La feuille de calcul de la figure 26.3 présente un exemple de l’utilisation de la


méthode Add de la collection ListObjects : une série de cellules contient des
valeurs à utilisées comme étiquettes de colonnes.

581
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Chapitre 26

Figure 26-3. Cette feuille de calcul possède des étiquettes de colonnes


existantes : elle est prête à accueillir une liste.

Vous pouvez créer une liste basée sur ces étiquettes de colonnes par le biais de la
procédure suivante (que vous ajoutez à un module de code) :
Sub CreateListObject()
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$K$1"), _
, xlYes)<;$RD>
.Name = "Suppliers1"
End Sub

Les listes constituent un ajout majeur à votre batterie d’outils Excel, mais elles
sont encore plus puissantes lorsqu’on les combine avec des données XML. La
prochaine section de ce chapitre présente les fondements du XML (eXtensible
Markup Language) et explique comment Excel l’exploite pour simplifier la ges-
tion des données.

Création de schémas XML


La schéma se trouve au cœur de l’échange de données XML. Il s’agit d’un docu-
ment qui définit la structure d’un jeu de fichiers XML. Vous pouvez créer un
schéma personnalisé dans un éditeur XML, écrire le code XML vous-même dans
un éditeur de texte simple comme le Bloc-notes ou laisser Excel s’en charger en
enregistrant un classeur en tant que document XML. Le listing suivant, qui a été
crée dans le Bloc-notes, présente le schéma employé dans les exemples de ce
chapitre :
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="Root">
<complexType>
<sequence>

582
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
<element name="Supplier" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="SupplierID" type="positiveInteger"/>
<element name="CompanyName" type="string"/>
<element name="ContactName" type="string"/>
<element name="ContactTitle" type="string"/>
<element name="MailingAddress">
<complexType>
<sequence>
<element name="Address" type="string"/>
<element name="City" type="string"/>

Chapitre 26
<element name="Region" type="string"/>
<element name="PostalCode" type="string"/>
<element name="Country" type="string"/>
</sequence>
</complexType>
</element>
<element name="Phone" type="string"/>
<element name="Fax" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>

Ne vous laissez pas impressionner par la longue liste des balises fermantes qui se
trouvent à la fin du listing : la structure des objets de données décrite dans ce
schéma n’est pas aussi complexe qu’elle en a l’air. La figure 26.4 décrit graphi-
quement la structure du schéma.

Figure 26-4. Les schémas XML sont détaillés, mais pas excessivement
compliqués.

583
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Remarque Vous pouvez afficher le volet Source XML, qui présente les sché-
mas assignés à un classeur en cliquant sur Données, XML, Source XML.

Les deux premières lignes du listing relèvent des détails internes qui indiquent à
l’interpréteur XML la version XML utilisée, le standard de codage des caractères
auquel se conforment les données et la référence au document en ligne relatif
aux standards du schéma sur le site web du World Wide Web Consortium.
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
Chapitre 26

Au Quotidien
Surveillez votre langage

Le projet de codage utf-8 représente des jeux de caractères relativement sim-


ples tels que ceux employés dans le langue anglo-américaine. Ce langage
emploie peu d’accents (et uniquement sur des mots empruntés), ce qui signi-
fie que les ordinateurs peuvent représenter le jeu de caractères complet (y
compris les nombres, les lettres majuscules, la ponctuation et certains carac-
tères spéciaux comme les espaces, les tabulations, etc.) en utilisant seule-
ment huit bits de données. Pour les autres langues exploitant des caractères
de base différentes ou des accents, vous devez utiliser huit bits de données
supplémentaires pour représenter tous les caractères possibles. Le schéma
de codage de la plupart de ces langues est utf-16.

Les quelques prochaines lignes de code identifient l’élément de base dans le


schéma (souvent appelé Root) et indiquent la structure que vont prendre les
données.
<element name="Root">
<complexType>
<sequence>
<element name="Supplier" maxOccurs="unbounded">

</element>
</sequence>
</complexType>
</element>

La balise <complexType> de ce code de schéma XML indique que l’élément Root


est complexe, autrement dit qu’il est autorisé à contenir plusieurs sous-éléments.
Si vous revenez à la figure 26.4, vous noterez que l’élément Root possède en effet
des sous-éléments, dont le premier est Supplier. La balise <sequence> indique
que les sous-éléments apparaissent toujours dans le même ordre, ce qui est sou-
haitable si on génère un fichier de données XML à partir d’un tableau ou d’une
table de base de données.
La déclaration de l’élément Supplier contient un élément nouveau : le paramètre
maxOccurs="unbounded". Ce paramètre indique à l’interpréteur XML qu’il peut y

584
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
avoir plusieurs éléments Supplier dans tout fichier de données XML qui suit ce
schéma. Si vous ignorez ce paramètre, l’interpréteur attend une seule occurrence
de l’élément, chose pratique si vous voulez ajouter des informations relatives à
l’auteur, le service ou le code projet du document au début du fichier de don-
nées.
Considérez les éléments XML comme des objets associés à des propriétés.
L’exemple de code abrégé suivant, présente certaines propriétés associées à un
fournisseur (Supplier) :

Chapitre 26
<element name="SupplierID" type="positiveInteger"/>
<element name="MailingAddress">
<complexType>
<sequence>
<element name="Address" type="string"/>
<element name="City" type="string"/>
<element name="Region" type="string"/>
<element name="PostalCode" type="string"/>
<element name="Country" type="string"/>
</sequence>
</complexType>
</element>

Rappelez-vous que tout élément simple (c’est-à-dire un élément associé à une


seule valeur) est placé entre balises simples se terminant par />. Outre le nom de
l’élément, la balise contient également un paramètre type, qui indique le type de
donnée que l’élément doit héberger. Les deux types employés dans l’exemple
sont positiveInteger et string.
Pour enregistrer le schéma sous forme d’un fichier de schéma XML, procédez
comme suit dans le Bloc-notes :
1 Cliquez sur Fichier, Enregistrer.
2 Dans la liste déroulante Type, choisissez Tous les fichiers.
3 Saisissez le nom du fichier dans la zone Nom de fichier. Par exemple, si le
nom du fichier à enregistrer au format fichier de schéma XML est MySup-
pliers, tapez MySuppliers.xsd.

Pour plus d’informations sur les types de données XML, visitez la page de référence du
World Wide Web Consortium à l’adresse http:/ www.w3.org/ et tapez xml data type
dans la zone de recherche.

Création de fichiers de données XML


Pour exploiter des données XML, le schéma ne représente que la moitié de vos
besoins ; l’autre moitié de l’équation concerne les données elles-mêmes. Après
avoir créé un schéma qui reflète la structure de vos données, vous pouvez écrire
les données dans un fichier avec des balises correspondant à la structure du
fichier de données. Le listing suivant, que vous pouvez saisir dans un fichier du
Bloc-notes, contient les données de deux premiers fournisseurs du fichier
MySuppliers.xml que vous pouvez télécharger sur le site de Dunod :

585
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


<?xml version="1.0" encoding="UTF-8" ?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <;$RD>
xsi:noNamespaceSchemaLocation="MySuppliers.xsd">

<Supplier>
<SupplierID>1</SupplierID>
<CompanyName>Exotic Liquids</CompanyName>
<ContactName>Charlotte Cooper</ContactName>
<ContactTitle>Purchasing Manager</ContactTitle>
<MailingAddress>
<Address>49 Gilbert St.</Address>
<City>London</City>
Chapitre 26

<Region></Region>
<PostalCode>EC1 4SD</PostalCode>
<Country>UK</Country>
</MailingAddress>
<Phone>(171) 555-2222</Phone>
<Fax></Fax>
</Supplier>

<Supplier>
<SupplierID>2</SupplierID>
<CompanyName>New Orleans Cajun Delights</CompanyName>
<ContactName>Shelley Burke</ContactName>
<ContactTitle>Order Administrator</ContactTitle>
<MailingAddress>
<Address>P.O. Box 78934</Address>
<City>New Orleans</City>
<Region>LA</Region>
<PostalCode>70117</PostalCode>
<Country>USA</Country>
</MailingAddress>
<Phone>(100) 555-4822</Phone>
<Fax></Fax>
</Supplier>
</Root>

Pour enregistrer le schéma sous forme d’un fichier XML, procédez comme suit
dans le Bloc-notes :
1 Cliquez sur Fichier, Enregistrer.
2 Dans la liste déroulante Type, choisissez Tous les fichiers.
3 Saisissez le nom du fichier dans la zone Nom de fichier. Par exemple, si le
nom du fichier à enregistrer au format fichier XML est MySuppliers.xml,
tapez MySuppliers.xml.
Plusieurs aspects des données du fichier MySuppliers.xml sont à noter. Par
exemple, les deux premières lignes du fichier de données fournissent des infor-
mations similaires aux deux premières lignes du fichier du schéma.

<?xml version="1.0" encoding="UTF-8" ?>


<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <;$RD>
xsi:noNamespaceSchemaLocation="MySuppliers.xsd">

586
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
La première ligne indique la version XML et le schéma de codage du texte utilisé
dans le fichier et la deuxième ligne indique l’élément de base du schéma (Root),
l’URL désignant le document standard auquel se conforme le fichier de données
et le nom du fichier du schéma (MySuppliers.xsd).

Remarque Vous pouvez ajouter les deux premières lignes de l’exemple de


fichier MySuppliers.xml dans vos fichiers XML. Il suffit d’ouvrir le fichier MySup-
pliers.xml dans un éditeur de texte, de copier les lignes, de les coller dans
votre fichier XML et de remplacer MySuppliers.xsd par le nom de votre fichier

Chapitre 26
de schéma.

La prochaine section du fichier contient les données employées pour peupler la


feuille de calcul. La structure des données du fichier MySuppliers.xml se con-
forme exactement à celle du schéma présenté dans MySuppliers.xsd (que vous
pouvez télécharger à partir du site web de Dunod, à l’adresse www.dunod.fr). Par
exemple, l’élément CompanyName du fichier du schéma est défini dans la ligne
suivante :

<element name="CompanyName" type="string"/>

Et le fichier de données possède une ligne correspondante dans chaque jeu de


données fournisseur :

<CompanyName>New Orleans Cajun Delights</CompanyName>

Les éléments ne contiennent pas tous des données, mais chaque élément doit se
présenter au sein de chaque répétition de l’élément Supplier. Par exemple, l’élé-
ment Fax ne contient pas de valeur dans les deux jeux de données, mais les bali-
ses sont présentes dans le fichier de données XML de sorte que la séquence des
éléments suive exactement le même agencement que celle définie dans le fichier
du schéma.

Ajout manuel de XML à un classeur


Une fois que vous avez créé un schéma XML et un fichier de données XML asso-
cié, vous devez ajouter la structure du schéma à la feuille de calcul. Pour ce faire,
vous établissez un mappage des données, ou un modèle de données représenté
dans un fichier, dans la feuille de calcul.

Remarque Les mots mappage et schéma mots sont souvent employés de


manière interchangeable.

Pour associer un mappage de données à une feuille de calcul, procédez de la


manière suivante :
1 Cliquez sur Données, XML, Source XML pour afficher le volet Source
XML.

587
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


2 Cliquez sur le bouton Mappages XML pour afficher la boîte de dialogue
du même nom.
3 Cliquez sur Ajouter pour afficher la boîte de dialogue Sélectionnez une
source XML.
4 Localisez le dossier qui contient le schéma (un fichier avec l’extension
.xsd) à mapper dans la feuille de calcul.
5 Sélectionnez le fichier et cliquez sur Ouvrir pour ajouter la structure du
schéma dans le volet Source XML.
Vous pouvez ensuite faire glisser les éléments individuellement du mappage sur
Chapitre 26

les cellules de la feuille de calcul, à l’emplacement de votre choix. Après avoir fait
glisser un élément sur la feuille de calcul, une flèche pour le filtre automatique
apparaît sur le bord droit de la cellule. Cliquez sur la flèche et sélectionnez où
vous voulez voir apparaître l’étiquette de l’élément (le nom de l’élément, comme
CompanyName).

Remarque Les noms des éléments que vous avez mappés dans une cellule
apparaissent en caractères gras dans le volet XML Source.

Pour ajouter un élément complet avec tous ses sous-éléments, faites glisser l’élé-
ment principal vers une cellule de la feuille de calcul. La figure 26.5 présente le
résultat du mappage de l’élément Supplier du schéma MySuppliers.xsd dans la
cellule A1.

Figure 26-5. Vous pouvez mapper un élément complet (avec tous ses sous-
éléments) sur une feuille de calcul en une opération.

588
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML

Remarque Lorsque vous ajoutez un élément complexe (un élément équipé


de sous-éléments) à une feuille de calcul, Excel le traite comme une liste uni-
que et non en tant que série de listes, tel qu’il le fait quand vous faites indivi-
duellement glisser des éléments simples sur la feuille de calcul.

Après avoir ajouter les éléments de votre choix au classeur, vous pouvez les sup-
primer à l’instar de tout autre type de contenu d’un classeur. Il est également
possible de supprimer un élément de la feuille de calcul en cliquant droit sur
l’élément dans le volet Source XML et en choisissant Supprimer l’élément dans le

Chapitre 26
menu contextuel.
Pour modifier l’insertion des données XML dans la feuille de calcul, cliquez sur
le bouton Options du volet Source XML. Vous pouvez utiliser les options pour
afficher un aperçu des données dans le volet Office, masquer le texte d’aide dans
le volet Office et informer Excel que vos données possèdent des en-têtes pour
éviter qu’il vous le demande chaque fois que vous insérez un champ. Le menu
Données, quant à lui, permet de gérer l’importation des données XML : choisis-
sez XML et cliquez sur Propriétés du mappage XML. Servez-vous des contrôles
de la boîte de dialogue Propriétés du mappage XML (voir figure 26.6) pour ajus-
ter la largeur des colonnes à la taille des données, conserver le format des nom-
bres et valider les données par rapport au schéma avant d’importer ou
d’exporter les données.

Figure 26-6. La boîte de dialogue Propriétés du mappage XML élargit la palette


d’outils à votre disposition pour contrôler les données XML.

Importer manuellement des données XML


Une fois que vous avez assigné les éléments du schéma aux cellules de la feuille de
calcul, vous pouvez importer les données à partir du fichier de données XML qui
correspond à la structure du schéma.
Pour importer les données dans un schéma XML existant, procédez comme
suit :
1 Cliquez sur Données, XML, Importer.

589
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


2 Dans la boîte de dialogue Importer au format XML, localisez le dossier
qui contient le fichier de données XML, sélectionnez-le et cliquez sur
Importer.

Remarque Inutile de mapper chaque élément d’un schéma sur une feuille de
calcul pour que les données importées fonctionnent correctement.

Ajout de XML à une feuille de calcul par


programmation
Chapitre 26

Chaque action relative à XML réalisée dans l’interface Excel possède sa contre-
partie dans l’objet Excel, même s’il faut parfois un peu creuser pour découvrir
comment effectuer en VBA une action simple et intuitive dans l’interface. On
peut prendre pour exemple la série d’actions à entreprendre pour créer un liste
de données (au lieu d’une série de listes) à partir d’un schéma XML.

Mapper un schéma sur une feuille de calcul par


programmation
Lorsque vous mappez un schéma XML sur une feuille de calcul en VBA, vous
créez une variable qui contient une référence à un objet XmlMap, qui représente
un schéma contenu dans un fichier .xsd. Le tableau 26.3 liste les propriétés et
méthodes de l’objet XmlMap.
Tableau 26-3. Principales propriétés et méthodes
de l’objet XmlMap
Propriété ou méthode Description
Propriété
AdjustColumnWidth Si elle est positionnée sur True (par défaut), cette
valeur booléenne ajuste la largeur des colonnes aux
données importées dans la colonne. Si elle est
positionnée sur False, les colonnes conservent leur
largeur au moment de l’importation.
AppendOnImport Si cette valeur booléenne est positionnée sur False
(par défaut), les données importées dans un schéma
écrasent les valeurs existantes. Si elle est positionnée
sur True, les valeurs nouvellement importées sont
ajoutées à une liste existante.
IsExportable Une valeur booléenne qui retourne True si Excel peut
exploiter les objets XPath dans le mappage du schéma
spécifié pour exporter des données XML et si toutes
les listes XML mappées sur le mappage de schéma
spécifié sont exportables.

590
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML

Tableau 26-3. Principales propriétés et méthodes


de l’objet XmlMap (Suite)
Propriété ou méthode Description
Propriété
Name Une chaîne qui contient le nom d’un mappage XML. La
chaîne doit être unique au sein du classeur et ne peut
excéder 255 caractères.
PreserveColumnFilter Si cette valeur booléenne est positionnée sur True (par
défaut), le filtrage est conservé lors de l’actualisation

Chapitre 26
du mappage XML.
PreserveNumberFormatting Si cette valeur booléenne est positionnée sur True, le
format des nombres est conservé lors de
l’actualisation du mappage XML. La valeur par défaut
est False.
RootElementName Une chaîne en lecture seule qui contient le nom de
l’élément racine du schéma mappé.
SaveDataSourceDefinition Si cette valeur booléenne est positionnée sur True (par
défaut), Excel enregistre la définition de la source de
données du schéma mappé avec le classeur.
Schemas Une propriété qui retourne une collection XmlSchemas
qui contient chaque schéma mappé au classeur actif.
ShowImportExportValidationErrors Si cette valeur booléenne est positionnée sur True,
Excel affiche une boîte de dialogue qui détaille les
erreurs de validation du schéma lorsque les données
sont importées ou exportées par l’intermédiaire du
schéma XML spécifié. La valeur par défaut est False.
Méthode
Delete La méthode Delete supprime le schéma nommé du
classeur.
Export(Url, Overwrite) La méthode Export écrit le contenu des cellules
mappées sur l’objet XmlMap spécifié vers un fichier de
données XML. L’argument Url représente une chaîne
qui contient le chemin d’accès complet du fichier dans
lequel on écrit les données XML. L’argument Overwrite,
s’il prend la valeur True, remplace tout fichier existant
portant le même nom. La valeur par défaut est False.
La méthode Export retourne une des deux constantes :
xlXmlExportSuccess, qui indique que l’exportation s’est
effectuée sans erreur ou xlXmlExportValidationFailed,
qui indique que les données ne correspondent pas au
schéma XmlMap.

591
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Tableau 26-3. Principales propriétés et méthodes


de l’objet XmlMap (Suite)
Propriété ou méthode Description
Méthode
ExportXml(Data) La méthode ExportXml écrit le contenu des cellules
mappées sur l’objet XmlMap spécifié vers la chaîne
nommée dans l’argument Data. La méthode ExportXml
retourne une des deux constantes :
xlXmlExportSuccess, qui indique que l’exportation s’est
Chapitre 26

effectuée sans erreur ou xlXmlExportValidationFailed,


qui indique que les données ne correspondent pas au
schéma XmlMap.
Import(Url, Overwrite) La méthode Import écrit les données du fichier qui se
trouve à l’URL spécifié dans les cellules mappées sur
l’objet XmlMap qui a appelé la méthode. L’argument Url
contient un chemin d’accès ou une adresse web.
L’argument Overwrite est de type Variant. S’il est
positionné sur False (par défaut), la méthode ajoute les
données importées après les données existantes. S’il
est positionné sur True, les données existantes sont
écrasées. La méthode Import retourne une des trois
constantes : xlXmlImportElementsTruncated, qui
indique que le contenu du fichier de données XML
spécifié a été tronqué car le fichier de données XML est
trop volumineux pour une cellule, xlXmlImportSuccess,
qui indique que l’importation s’est effectuée sans
erreur ou xlXmlImportValidationFailed, qui indique que
le contenu du fichier de données XML ne correspond
pas au schéma spécifiée.
ImportXml(XmlData, Overwrite) La méthode ImportXml écrit les données d’une variable
de chaîne (spécifiée dans l’argument XmlData) dans
les cellules mappées sur l’objet XmlMap qui a appelé
la méthode. L’argument Overwrite est de type Variant.
S’il est positionné sur False (par défaut), ajoute les
données importées après les données existantes. S’il
est positionné sur True, les données existantes sont
écrasées. La méthode ImportXml retourne une des
trois constantes : xlXmlImportElementsTruncated, qui
indique que le contenu du fichier de données XML
spécifié a été tronqué car le fichier de données XML est
trop volumineux pour une cellule, xlXmlImportSuccess,
qui indique que l’importation s’est effectuée sans
erreur ou xlXmlImportValidationFailed, qui indique que
le contenu du fichier de données XML ne correspond
pas au schéma spécifiée.

592
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
Tous les schémas assignés à un classeur sont stockés dans la collection XmlMaps
de l’objet Workbook. On se réfère aux membres individuels de la collection en
notant leurs noms, comme dans l’instruction suivante :

ActiveWorkbook.XmlMaps("Root_Map")

Bien que la majorité des propriétés et méthodes que vous exploiterez dans le
cadre des mappages XML se trouvent dans l’objet XmlMap, la collection Xml-
Maps contient une méthode Add primordiale, que l’on utilise pour assigner un
schéma à un classeur. Voici la syntaxe de la méthode Add :

Chapitre 26
Add(Schema, RootElementName)

L’argument Schema est une variable de chaîne qui contient le chemin d’accès
complet du schéma à ajouter au classeur et l’argument RootElementName con-
tient le nom de l’élément racine du schéma. La procédure suivante ajoute le
schéma MySuppliers.xsd au classeur actif :

Sub ApplySchema()
Dim myMap As XmlMap
Dim xSchemaFile As String

xSchemaFile = "C:\MySuppliers.xsd"
Set myMap = ActiveWorkbook.XmlMaps.Add(xSchemaFile, "Root")
End Sub

Cette procédure définit une variable objet (myMap) qui contient la référence à
l’objet XmlMap. Après avoir assigné le chemin d’accès du fichier du schéma à la
variable xSchemaFile, on utilise la commande Set pour assigner le fichier du
schéma nommé à la collection Workbooks du classeur actif.
Lorsque vous liez un mappage à un classeur, le mappage se voit assigner le nom
de l’élément racine suivi d’un caractère de soulignement et du mot Map. Le
mappage que vous avez ajouté, dont l’élément racine est intitulé Root, se verrait
assigner le nom Root_Map.
Pour supprimer l’objet XmlMap que vous venez d’ajouter au classeur, exécutez la
procédure suivante :

Sub RemoveMap()
ActiveWorkbook.XmlMaps("Root_Map").Delete
End Sub

Remarque Si vous avez lié un mappage à un classeur et que vous tentez


d’assigner à nouveau le mappage au classeur, Excel ajoute un nombre à la fin
du nom du mappage. Par exemple, si on ajoute plusieurs fois le mappage
Root_Map à un classeur, il sera nommé Root_Map2, Root_Map3 et ainsi de
suite.

593
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Pour écrire les données qui se trouvent actuellement dans les cellules assignées
au schéma Root_Map dans un fichier intitulé SuppliersBackup.xml, servez-vous
de la procédure suivante :

Sub BackupXML()
ActiveWorkbook.XmlMaps("Root_Map").Export _
Url:= "C:\SuppliersBackup.xml", Overwrite:=True
If Err.Number = 0 Then
MsgBox "Data exported to SuppliersBackup.xml successfully."
Else
MsgBox "There was a problem exporting to SuppliersBackup.xml."
Chapitre 26

Exit Sub
End If
End Sub

Attention Dans la mesure où l’argument Overwrite est positionné sur True,


cette procédure supprime toutes les données existantes dans le fichier Sup-
pliersBackup.xml. En outre, si la liste des données est vide, la procédure
génère une erreur.

Mapper des éléments de schéma sur des cellules


avec XPath
Après avoir mappé un schéma sur un classeur, vous devez mapper chaque élé-
ment qui doit apparaître dans la feuille de calcul sur une plage de cellules. Vous
disposez ainsi d’un emplacement pour insérer les données XML associées. Inu-
tile d’assigner chaque élément du schéma à une cellule ou une plage ; Excel
ignore les éléments non utilisés lorsqu’il importe les données du fichier XML.
On identifie les éléments d’un fichier de schéma à mapper sur une cellule en fai-
sant appel au langage XML Path (XPath). Bien que la spécification complète de
XPath soit longue et complexe, elle se résume à un système d’identification caté-
gorique de l’élément du schéma à mapper. En fait, la notation XPath est similaire
à celle employée pour identifier le chemin d’accès d’un fichier Microsoft Win-
dows. Par exemple, le chemin d’accès d’un fichier peut être C:\Excel-
Prog\MySuppliers.xml, ce qui indique que le fichier MySuppliers se trouve dans
le répertoire ExcelProg du lecteur C. La différence entre le langage XPath et le
système de notation des chemins d’accès Windows réside dans le fait qu’il faut
spécifier l’emplacement d’un élément au sein du schéma. Prenons pour exemple
le schéma de la figure 26.4. L’élément racine est intitulé Root et possède le sous-
élément Supplier, qui possède le sous-élément SupplierID. La notation XPath du
sous-élément SupplierID est la suivante :

/Root/Supplier/SupplierID

594
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
Le modèle d’objet Excel contient un objet XPath accompagné des propriétés et
méthodes nécessaires à Excel pour utiliser les données XPath dans ces opéra-
tions. Le tableau 26.4 liste les propriétés et méthodes de l’objet XPath.
Tableau 26-4. Propriétés et méthodes de l’objet XPath
Name Description
Propriété
Map Une propriété en lecture seule qui retourne l’objet XmlMap
représentant le schéma assigné à l’objet XPath.

Chapitre 26
Repeating Une valeur booléenne en lecture seule qui retourne True si l’objet
XPath est assigné à une liste ou False s’il est assigné à une
cellule.
Value Retourne une chaîne qui représente le XPath de l’objet.
Méthode
Clear Supprime le mappage du schéma des cellules mappées sur
l’objet XPath spécifié.
SetValue(Map, XPath, L’argument Map (obligatoire) est une variable XmlMap qui
SelectionNamespace, représente le mappage du schéma dans lequel vous importez les
Repeating) données XML ; XPath (obligatoire) est une instruction XPath
valide ; SelectionNamespace (un argument de type Variant
optionnel) spécifie les préfixes des espaces de noms (cet
argument peut être omis si on place le XPath complet dans
l’argument XPath) ; Repeating (une valeur booléenne optionnelle)
indique si l’objet XPath doit être mappé sur une seule cellule
(False) ou sur une colonne de la liste (True).

Pour plus d’informations (très techniques) sur le langage XML Path, visitez le site web
XPath officiel à l’adresse http://www.w3.org/TR/xpath.

La méthode SetValue de l’objet XPath est la plus importante du lot : elle permet
de mapper un élément de schéma directement sur une cellule ou une plage. La
procédure suivante définit le fichier de données qui contient les données XML,
assigne le schéma à utiliser dans les appels de la méthode SetValue à la variable
objet myMap et mappe les éléments sur les plages spécifiques. La figure 26.7 pré-
sente le résultat de la procédure.

Attention Cette procédure ne s’exécute correctement que si vous avez préa-


lablement mappé le schéma MySuppliers.xsd sur le classeur actif. Pour ce
faire, exécutez la procédure ApplySchema de la section « Mapper un schéma
sur une feuille de calcul par programmation », présentée plus tôt dans ce cha-
pitre ou mappez le schéma manuellement sur le classeur.

Sub AssignElementsToRanges()
Dim myMap As XmlMap
Dim strXPath As String
Dim strSelNS As String

595
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Dim xMapName As String
Dim xDataFile As String

On Error Resume Next

xDataFile = "C:\MySuppliers.xml"

Set myMap = ActiveWorkbook.XmlMaps("Root_Map")

strXPath = "/Root/Supplier/SupplierID"
Range("B2:B10").XPath.SetValue myMap, strXPath
Range("B2").Value = "Supplier ID"
Chapitre 26

strXPath = "/Root/Supplier/CompanyName"
Range("C2:C10").XPath.SetValue myMap, strXPath
Range("C2").Value = "Company Name"

strXPath = "/Root/Supplier/ContactName"
Range("D2:D10").XPath.SetValue myMap, strXPath
Range("D2").Value = "Contact Name"

strXPath = "/Root/Supplier/ContactTitle"
Range("E2:E10").XPath.SetValue myMap, strXPath
Range("E2").Value = "Contact Title"

strXPath = "/Root/Supplier/MailingAddress/Address"
Range("F2:F10").XPath.SetValue myMap, strXPath
Range("F2").Value = "Address"

strXPath = "/Root/Supplier/MailingAddress/City"
Range("G2:G10").XPath.SetValue myMap, strXPath
Range("G2").Value = "City"

strXPath = "/Root/Supplier/MailingAddress/Region"
Range("H2:H10").XPath.SetValue myMap, strXPath
Range("H2").Value = "Region"

strXPath = "/Root/Supplier/MailingAddress/PostalCode"
Range("I2:I10").XPath.SetValue myMap, strXPath
Range("I2").Value = "Postal Code"

strXPath = "/Root/Supplier/MailingAddress/Country"
Range("J2:J10").XPath.SetValue myMap, strXPath
Range("J2").Value = "Country"

strXPath = "/Root/Supplier/Phone"
Range("K2:K10").XPath.SetValue myMap, strXPath
Range("K2").Value = "Phone"

strXPath = "/Root/Supplier/Fax"
Range("L2:L10").XPath.SetValue myMap, strXPath
Range("L2").Value = "Fax"

ThisWorkbook.XmlMaps("Root_Map").Import xDataFile
If Err.Number = 0 Then
MsgBox "Data from " & xDataFile & " was imported into " & _

596
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
"the " & xMapName & " map."
Else
MsgBox "There was a problem importing from " & xDataFile
Exit Sub
End If

End Sub

Chapitre 26
Figure 26-7. La procédure AssignElementsToRanges mappe les éléments du
schéma sur les plages de cellules de la feuille de calcul pour créer des listes.

La procédure AssignElementsToRanges crée une liste pour chaque élément du


schéma MySuppliers.xsd, mais la création de listes individuelles pose un
problème : lorsqu’on saisit un nouvel élément dans une liste (par exemple, dans
la liste SupplierID) et que l’on appuie sur la touche TAB, on passe sur une nou-
velle ligne de la même liste et non à ce qui constitue logiquement la prochaine
cellule de la liste. Vous remarquez que la procédure a créé une série de listes et
non une liste unique par la présence de lignes bleues sur les bords des colonnes.
Si vous aviez mappé le schéma sur la feuille de calcul en faisant glisser l’élément
Supplier depuis le volet Source XML vers la cellule B2, vous auriez créé une liste
unique. La bonne nouvelle, cependant, est que si vous appliquez un filtre à une
liste en cliquant sur la flèche qui se trouve sur le bord droit de l’en-tête de
colonne, vous filtrez toutes les listes. Comment créé une liste qui permette de se
déplacer d’une colonne à l’autre avec la touche de tabulation ?

597
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA

Au Quotidien
Mapper un schéma sur liste unique

Lorsque vous créez une liste à plusieurs colonnes, vous créez un objet sans
séparations dans lequel vous pouvez saisir des données. Mais en créant une
série de listes, comme dans la procédure AssignElementsToRanges de ce cha-
pitre, vous ne pouvez pas utiliser la touche TAB pour vous déplacer d’une
colonne à la suivante dans la collection de listes. Alors comment mapper une
série d’éléments de schéma de sorte que vous disposiez de toutes les fonc-
Chapitre 26

tionnalités d’une liste ? En créant une liste sur votre feuille de calcul et en
mappant les éléments du schéma sur les en-têtes de colonnes de la liste. La
procédure suivante crée une telle liste pour les fichiers MySuppliers.xsd et
MySuppliers.xml, avec le résultat illustré par la figure 26.8.

Attention Cette procédure suppose que la feuille de calcul que vous utilisez
est vide et que vous n’avez pas mappé le schéma MySuppliers.xsd sur le clas-
seur actif. En fait, il est préférable d’exécuter cette procédure sur un classeur
vide.

Sub CreateOneList()

Dim myMap, myMap2 As XmlMap


Dim xSchemaFile, strXPath, strSelNS, xMapName, xDataFile As String

Range("A2").Value = "SupplierID"
Range("B2").Value = "CompanyName"
Range("C2").Value = "ContactName"
Range("D2").Value = "ContactTitle"
Range("E2").Value = "Address"
Range("F2").Value = "City"
Range("G2").Value = "Region"
Range("H2").Value = "Postal Code"
Range("I2").Value = "Country"
Range("J2").Value = "Phone"
Range("K2").Value = "Fax"

xSchemaFile = "C:\MySuppliers.xsd"
Set myMap = ActiveWorkbook.XmlMaps.Add(xSchemaFile, "Root")

ActiveSheet.ListObjects.Add(xlSrcRange, Range("A2:K2"), ,
xlYes).Name = _
"List1"
Range("A3").Select

On Error Resume Next

xDataFile = "C:\MySuppliers.xml"

Set myMap2 = ActiveWorkbook.XmlMaps("Root_Map")

strXPath = "/Root/Supplier/SupplierID"

598
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Excel et XML
Range("A2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/CompanyName"
Range("B2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/ContactName"
Range("C2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/ContactTitle"
Range("D2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/MailingAddress/Address"

Chapitre 26
Range("E2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/MailingAddress/City"
Range("F2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/MailingAddress/Region"
Range("G2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/MailingAddress/PostalCode"
Range("H2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/MailingAddress/Country"
Range("I2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/Phone"
Range("J2").XPath.SetValue myMap, strXPath

strXPath = "/Root/Supplier/Fax"
Range("K2").XPath.SetValue myMap, strXPath

ActiveWorkbook.XmlMaps("Root_Map").Import
URL:="C:\MySuppliers.xml"

End Sub

599
Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Microsoft Excel 2003 VBA


Chapitre 26

Figure 26-8. Pour bénéficier de toutes les fonctionnalités d’une liste de


données, assignez les éléments du schéma aux en-têtes de colonnes.

Dans ce chapitre, vous avez appris à utiliser les nouvelles fonctionnalités XML de
Excel 2003. Depuis Excel 2002, il était possible d’enregistrer des classeurs XML,
mais vous disposez à présent d’un meilleur accès au modèle d’objet XML. En
outre, vous pouvez importer, exporter et manipuler des données par program-
mation au sein du classeur. Les outils à votre disposition permettent de transpor-
ter les données sur une grande variétés de plates-formes, simplifiant ainsi votre
collaboration avec vos clients, vos fournisseurs et vos collègues quel que soit le
tableur qu’ils exploitent.

600
Index
AddinInstance_OnDisconnecti
Symboles ActiveChart, propriété 123,
154 on, méthode 272
##### (valeur d’erreur) 137 ActiveConnection, propriété AddItem, méthode
#, caractère générique 507 objet Command 522, 548 objet
objet Recordset 525 CommandBarComboBox
#DIV/0! (valeur d’erreur) 137
407
#N/A (valeur d’erreur) 137 ActivePrinter, paramètre 164
AddItem, propriété
#NAME? (valeur d’erreur) 137 Activer
contrôle ListBox 443
#NULL! (valeur d’erreur) 137 objet UserForm 428
AddNew, méthode 525
#NUM! (valeur d’erreur) 137 ActiveSheet, objet
Address, paramètre de la
#REF! (valeur d’erreur) 137 référencer une plage 184 méthode FollowHyperlink
#VALUE! (valeur d’erreur) 137 ActiveSheet, propriété 124 162
&, opérateur 217 méthode Delete 168 AddToFavorites, méthode 161
*, caractère générique 507 ActiveWindow, propriété 126 AddToMru, paramètre
, caractère générique 507 ActiveWorkbook, propriété méthode Open 146
128 méthode SaveAs 151
, signe différent de 506
méthode AddToSearchFolders, méthode
=, signe égal 506
Unprotect 159 313
>, signe supérieur à 506
propriété AdjustColumnWidth, propriété
>=, signe supérieur ou égal à
506 WriteReserved 157 590

?, caractère générique 507 AdaptiveMenus, propriété 395, ADO (Active Data Objects) 502
396 ajouter la bibliothèque pour
A Add, méthode 206 la base de données 532
collection modèle d’objet 515
A1, notation 196 objets de base de données
Sheets 166
Access, application 547
Workbooks 143
se connecter aux bases de ADODB.Command, objet 548
collection ListObjects 580
données 519 ADODB.Connection, objet 547
collection PropertyTests
AccessMode, paramètre 151 ADODB.Recordset, objet 548
308
Accueil, volet Office 23 Affichage, menu
collection XmlMaps 593
Activate, événement 289, 290, éléments 50
objet Chart 346
430
objet Collection 339 Afficher
Activate, méthode
syntaxe 194 constantes intrinsèques 66
activer un graphique 352
syntaxe pour l’objet AddIn feuille de calcul 166
collection Workbooks 152
264 info-bulle d’argument 56
objet Workbook 160
AddDataField, méthode 376 macro 34, 47
Active, propriété 577
AddEmbeddedChart, Aide
ActiveCell, objet procédure d’événement créer des fichiers 162
méthode End 180 349
volet Office 23
propriété CurrentRegion AddIn, objet
180 zone Tapez une question 22
afficher les valeurs 266
ActiveCell, propriété 121 Ajouter
AddinInstance_OnConnection,
ActiveChart, objet 355 méthode 272 module 60

601
Index
procédure 60 accéder à partir d’autres partager des informations
Ajouter un espion, commande applications 495 entre 477
53 activer la surveillance des Appointment, objet 483
Ajouter une procédure, boîte événements 299 arglist, élément
de dialogue collection procédure Function 110
afficher 51 Dialogs 415 procédure Sub 96
Alertes créer 482 Argument
désactiver 169 méthodes passer à une boîte de
propriété DisplayAlerts 128 ConvertFormula 196 dialogue 423
AlertStyle, propriété 205 Union 191 passer dans une procédure
Alias 510 propriété 112

Aligner CalculateBeforeSave 173 Arguments nommés

objets 52 DisplayAlerts 169 passer à une procédure 114

AllowDeletingColumns, EnableEvents 286 Arrêt Défil. (touche) 140


paramètre 175 ThisWorkbook 150 Arrière-plan
AllowDeletingRows, paramètre propriétés définir pour un contrôle 461
175 Assistant
ActiveChart 123
AllowFiltering, paramètre 175 créer avec une feuille
ActiveSheet 124
AllowFormattingCells, UserForm 463
ActiveWindow 126
paramètre 174 Assistant Importation de texte
ActiveWorkbook 128 147
AllowFormattingColumns,
paramètre 174 DisplayAlerts 128 Assistant Recherche, macro
AllowFormattingRows, RangeSelection 129 complémentaire Excel
paramètre 174 ScreenUpdating 131 261
AllowInsertingColumns, Selection 129 Assistant Somme
paramètre 174 conditionnelle, macro
StatusBar 130
AllowInsertingHyperlinks, complémentaire Excel
ThisWorkbook 132 260
paramètre 175
référence implicite, explicite Assistant Tableau et graphique
AllowInsertingRows,
487 croisés dynamiques
paramètre 174
Application, propriété créer un graphique 372
AllowMultiSelect, propriété
316 collection AddIns 264 créer un tableau 370
AllowSorting, paramètre 175 objet AddIn 265 Atteindre, boîte de dialogue
AllowUsingPivotTables, Applications afficher 415
paramètre 175 activer 481 afficher la boîte de dialogue
Alt (touche) 140 créer des instances de 492 Sélectionner les cellules
Ancrage, onglet 59 416
créer une instance de Word
And, opérateur 506 482 constante 415

Aperçu avant impression 164 démarrer à partir d’Excel sélectionner des valeurs par
477 défaut 419
API (Application Programming
Interface) 502, 515 démarrer à partir de DOS Audit de formules, barre
478 d’outils 18
AppActivate, instruction 481
état de la fenêtre 478 Authentification Windows 538
Append, méthode 523
ouvrir une présentation Auto_Activate, macro 266
AppendOnImport, propriété
PowerPoint à partir Auto_Add, macro 266
590
d’Excel 479
Application, objet 120, 488 Auto_Close, macro 266
Auto_Deactivate, macro 266

602
Index
Auto_Open, macro 266 Barre de défilement, contrôle BOF, propriété 525
Auto_Remove, macro 266 Voir ScrollBar, contrôle Boîte à outils
AutoFit, méthode 190 Barre de formule 21 afficher 51
Automation 481 masquer 21 Boîte de dialogue
AutoSize, propriété 445 Barre de titre 21 afficher avec du code 414
AVERAGE, fonction 225, 510 Barres de commandes 21 afficher la collection Dialogs
Base de données 419
B accéder à partir d’Excel 502 déterminer comment elle
clé externe 502 est fermée 416
BackColor, propriété listes d’arguments de boîte
clé primaire 501
contrôle TextBox 471 de dialogue intégrée 414
clé secondaire 502
contrôle UserForm 432 modifier les sélections par
colonne d’indentification défaut 418
objet UserForm 428 502
Background, propriété 253 passer des arguments 423
comparée aux tableurs 499
Barre d'outils récupérer le choix de
concept client/serveur 502 l’utilisateur 417
boutons agrandis 395 conception et Boîte de message
Barre d’état administration 501
boutons par défaut 77
afficher un message 130 concepts essentiels 500
créer 78
désactiver les messages extraire une ou plusieurs
130 ligne(s) 504 icônes 76
propriété StatusBar 130 instruction modalité 77
Barre d’outils Delete 512 syntaxe 75
ajouter un bouton 280 Insert 511 Boîte de message Voir aussi
MsgBox, fonction
déplacer 56 Select 504
Boîte de saisie
Mise en forme 18 Update 511
méthode InputBox 134
personnaliser 56 manipuler avec SQL 503
positionner 80
Barre d’outils Voir aussi Barre OLAP 373
de commandes syntaxe 79
se connecter à 535
Barre de commandes Boîte de saisie Voir aussi
Base_de_données, nom InputBox, fonction
ajouter des contrôles 406 réservé 199
Bold, propriété 253
animation 395 BeforeClose, événement 289,
293 BorderAround, méthode
créer 406
BeforePrint, événement 289, syntaxe 257
empêcher l'utilisateur de
personnaliser 395 292 Borders, propriété
flottante 399 BeforeRightClick, événement constantes 256
295, 297 Bordure
lister les barres existantes
398 BeforeSave, événement 289, entourer une plage de
291 cellules 257
supprimer 400
BeginGroup, propriété 402 modifier 257
temporaire 399
Bibliothèque BottomMargin, propriété 170
Barre de commandes Voir
aussi Barre d’outils Microsoft ActiveX Data BottomRightCell, propriété
Objects 2.7 Library 532 361
Barre de défilement
Bibliothèque d’objets Boucle
ajouter à un contrôle
TextBox 436 Excel 495 For…Next 33
définir pour un objet Outlook 484 Boucle itérative
UserForm 428 BlackAndWhite, propriété 170

603
Index
For Each...Next 87 Calculatrice, application afficher les formules 18
For...Next 86 démarrer 478 appliquer le format Texte
Boucle logique Calculer 213

Do Until…Loop 89 intérêts d’un prêt 229 couleur de remplissage 255

Do While…Loop 89 ligne précédente, suivante déterminer si la valeur est


456 du texte 212
Do…Loop Until 90
mensualité d’un prêt 228 dimensionner 190
Do…Loop While 90
méthode Calculate 132 mapper des éléments de
Bouton schéma sur 594
agrandi dans une barre méthode CalculateFull 133
méthode Cells 189
d’outils 395 principal d’un prêt 230
mettre en forme 18
ajouter à la barre d’outils taux dÕint˙r_t dÕun pr_t 232
280 modifier 121
valeur actuelle 232
ajouter dans un menu 464 modifier la bordure 257
valeur actuelle nette 233
feuille UserForm motif 255
Call, instruction
désactiver 458, 469 non contiguës, référencer
dans une procédure Sub 190
navigation 456 104
propriété ActiveCell 121
personnalisé 406 CancelUpdate, méthode 525
référencer dans une plage
Bouton bascule, contrôle 438 Caption, propriété 185
Bouton d’option, contrôle 440 contrôle CommandButton sélectionner une plage 19,
Bouton de barre d’outils 452 21
affecter à une macro 36 contrôle Label 451 vide, détecter 192
Bouton de commande, contrôle UserForm 432 CenterHorizontally, propriété
contrôle 435 mettre à jour dans une 170
Bouton Sélectionner tout 21 feuille UserForm 469 CenterVertically, propriété 170
Bouton toupie, contrôle Voir objet CommandBarControl Certificat numérique
SpinButton, contrôle 402
acheter 43
BuildConnectionString, objet PivotField 382
Chaîne
fonction 542 objet PivotItem 383
ajouter des caractères au
BuiltIn, propriété objet UserForm 428 début ou à la fin 218
objet CommandBar 396 objet Window 126 assigner une valeur 67
objet CommandBarControl Caractères génériques déclarer 67
402 dans une instruction Select déterminer la longueur 215
BuiltInFace, propriété 405 507
récupérer les premiers ou
Case à cocher, contrôle 437 les derniers caractères
C Case, instruction 219
Cadre, contrôle 439 pièges 99 récupérer une sous-chaîne
CBool(expression), fonction 69 222
Calcul de prêt, classeur 187
CByte(expression), fonction 69 retourner des caractères
Calculate, méthode 132
arbitraires 221
CalculateBeforeSave, propriété CCur(expression), fonction 69
supprimer les caractères
173 CDate(expression), fonction 69
non imprimables 214
CalculatedFields, collection CDbl(expression), fonction 69
Change, événement 295, 296
376 CDec(expression), fonction 69
contrôle CheckBox 438
CalculatedFields, méthode Cells, méthode 453
376 contrôle Multipage 468
référencer une cellule 189
CalculateFull, méthode 133 contrôle ScrollBar 442
Cellule

604
Index
contrôle SpinButton 438 définition 323 enregistrer les valeurs liées
contrôle TextBox 437 événement 156

contrôle UserForm 432 Class_Initialize 335 enregistrer tous les


classeurs ouverts 152
Character, objet Class_Terminate 335
enregistrer une copie 152
propriété Font 254 définition 329
fermer 153
Characters, propriété modifier le nom 329
fermer sans sauvegarder
syntaxe 254 propriétés 328 156
Chart, modèle d’objet 350 propriétés simples 330 gérer les conflits 151
Chart, objet routine importer des fichiers texte
événements 353 Property Get 331 147
méthode Add 346 Property Let 331 imprimer 162
Chart, propriété 361 Property Set 331 indiquer le chemin d’accès
ChartObject, objet 351 Classeur 155
assigner un nom 349 activer 152, 160 indiquer le nom complet
155
créer un graphique afficher un graphique 154
incorporé 348 méthodes 160
afficher/masquer des
définir la position du formes 154 modifier tous les graphiques
graphique 361 363
afficher/masquer les
définir le nom du graphique feuilles 166 mots de passe 157
361 ajouter des feuilles 166 nombre de feuilles de calcul
retourner le graphique 16
ajouter du XML
associé 361 manuellement 587 nommer les feuilles 165
ChartObjects, collection 351 ajouter une feuille de ouvrir 144
Charts, collection graphique 167 propriété ActiveWorkbook
propriété Item 351 calculer 128
ChartTitle, propriété 349 méthode Calculate 132 propriété ThisWorkbook 132
ChartType, propriété 349, 361 méthode CalculateFull propriétés 153
CheckBox, contrôle 437 133 protégé contre les
collection Workbooks 143 modifications 158
Chemin d’accès d’un classeur
155 compter les feuilles 165 protégé en écriture 157
CHERCHE, fonction copier la palette de couleurs protégé en lecture 157
syntaxe 222 246 protéger les macros 174
CInt(expression), fonction 69 copier les feuilles 169 recalculer les formules 172
Class_Initialize, événement créer 143 signer numériquement 43
335 créer une copie 144 supprimer des feuilles 168
Class_Terminate, événement créer une copie de supprimer la protection 159
335 sauvegarde 151 vérifier s’il est ouvert 149,
Classe définition 15 300
ajouter des règles de métier déplacer les feuilles 169 CLEAN, fonction 214
341 détecter l’ouverture 465 Clear, méthode
créer 329 détecter la fermeture 466 collection Errors 521
définir enregistrer 150 collection FileDialogFilters
événements 334 enregistrer comme macro 315
méthodes 333 complémentaire 263 contrôle ListBox 444
routines de propriété 331 objet Collection 340

605
Index
objet dans un contrôle ListBox Command, objet
CommandBarComboBox 442 dans le modèle d’objet ADO
407 déterminer si elle contient la 521
objet Path 595 valeur Null 506 dans une requête de base
ClearContents, méthode 549 dimensionner 190 de données 547
Clés de base de données extraire d’une table 505 CommandBar, propriété 409
clé externe 502 lister les noms 511 CommandButton, contrôle
clé primaire 501 NuméroAuto 502 désactiver 458
clé secondaire 502 référencer 190 événement Click 435
Click, événement résoudre le nom 509 placer sur une feuille 452
contrôle CommandButton Color, propriété CommandButton_Click,
435 objet Borders 257 événement 458, 460
contrôle UserForm 432 objet Font 253 CommandLineSafe, sous-clé
CLng(expression), fonction 69 du registre 270
objet Interior 255
CLng, fonction 454 CommandText, propriété
ColorIndex, propriété 253,
Close, méthode 255, 257 objet Command 522

objet Connection 518 Colors, propriété objet PivotCache 379

objet Recordset 526 copier la palette de couleurs CommandType, propriété

propriété ThisWorkbook 153 entre classeurs 246 objet Command 522, 548

CLSID, propriété syntaxe 243 objet PivotCache 379

objet AddIn 265 Column, objet Commentaires dans le code


propriétés VBA 352
Code
Width 190 Compiler le code 53
compiler 53
ColumnCount, propriété 442 Complément Solveur, macro
mettre en forme 56 complémentaire Excel
règles de lisibilité 61 ColumnFields, propriété 377 261
signature numérique 55 ColumnGrand, propriété 377 Compléments COM
Code VBA ColumnHeads, propriété 443 afficher la boîte de dialogue
simuler une pause 480 Columns, propriété 190 Modules
ColumnWidth, propriété 443 complémentaires COM
Code, fenêtre
268
afficher 50 ComboBox, contrôle
créer dans Visual Basic
description 49 adapter au contenu 445
.NET 277
personnaliser 58 créer 408
entrées de registre 270
Collate, paramètre 164 définir
EXE ou DLL 268
Collection, objet 338 bouton déroulant 445
générer 281
méthode Add 339 largeur de la liste 446
initialiser 269
Collections 32 style 445
installer avec Visual Basic
Colonne fonctionnement comme un .NET 282
contrôle ListBox 461
actualiser les valeurs 511 interface IDTExtensibility2
méthodes et propriétés 407 268
autoriser les utilisateurs à
placer sur une feuille 451 Compléments
en insérer 174
ComboBox, contrôle Voir aussi d’automatisation
en modifier 174 ListBox, contrôle créer dans Visual Basic 6
en supprimer 175 ComboxBox, contrôle 272
d’indentification, base de ajouter des éléments 408 entrées du registre 276
données 502
Comma, paramètre 148 installer 275

606
Index
interface IDTExtensibility2 constantes collection Errors 521
271 xlReferenceStyle et collection Fields 529
Concaténer du texte 217 xlReferenceType 197
collection Parameters 523
ConflictResolution, paramètre convertir le style de notation
collection PivotCaches 379
151 196
collection PivotTables 376
Conflits syntaxe 197
collections Sheets et
gérer pour les classeurs Convertir
Worksheets 165
151 nombre en texte 212
COUNTA, fonction 226
Connection, objet types de données 68
COUNTIF, fonction 226
dans le modèle d’objet ADO Convertisseur 145
Courriels, envoyer 479
517 Copier
CreateBackup, paramètre 151
dans une requête de base données entre une plage et
de données 547 CreateItem, méthode 483
un tableau 202
propriétés et méthodes 518 CreateObject, fonction 482,
feuille 169
483, 489
Connection, propriété 380 feuille de calcul 16
fonction GetObject versus
ConnectionString, propriété modules entre projets 64 492
518, 519, 547
Copies, paramètre 164 CreateParameter, méthode
ConsecutiveDelimiter,
Copy, méthode 522
paramètre 148
collection Sheets 169 CreatePivotTable, méthode
Const, instruction 66
objet CommandBarControl 380
Constante
403 Creator, propriété
convertir en variable 457
CopyFace, méthode 405 collection AddIns 264
déclarer 66
CorruptLoad, paramètre 146 objet AddIn 265
Constantes
Couleur de fond Critères, nom réservé 199
couleurs de base de
contrôle UserForm 432 Cryptage
l’ordinateur 239
objet UserForm 428 clé publique, privée 42
Constantes intrinsèques
Couleurs CSng(expression), fonction 69
afficher 66
afficher la palette en cours, Ctrl (touche) 140
Contents, paramètre 174
procédure 244 CTXT, fonction
Contrôle
de base de l'ordinateur 239 syntaxe 212
ajouter à une barre de
onglet de la feuille de calcul CurrentPage, propriété 382
commandes 406
251
de menu contextuel 409 CurrentRegion, propriété 180
quadrillage 250
personnalisé 406 CursorLocation, propriété 518
système additif 240
positionner légende, texte CVar(expression), fonction 69
système soustractif 240
406
zone de liste modifiable 407
Couleurs de remplissage D
modifier 255
Controls, propriété
COUNT, fonction 225, 510 DAO (Data Access Objects)
objet CommandBar 396 515
Count, méthode 339
objet CommandBarPopup Data Source, mot-clé 519
409 Count, propriété
DataBodyRange, propriété 577
ControlTipText, propriété collection AddIns 264
DataFields, propriété 377
contrôle UserForm 433 collection
CommandBarControls DataRange, propriété
Conversion, fonctions de 69
401 objet PivotField 382
Converter, paramètre 145
collection CommandBars objet PivotItem 383
ConvertFormula, méthode 395

607
Index
DataType, paramètre 147 Delay, propriété 439 DisplayDrawingObjects,
DataType, propriété 382 Delete, méthode 206 méthode 154

Date collection Parameters 523 DisplayErrorString, propriété


377
ajouter/soustraire une unité objet CommandBar 396
de temps 235 DisplayNullString, propriété
objet CommandBarControl 377
année pivot 68 403
DisplayRightToLeft, propriété
assigner 67 objet ListObject 578 577
dans un champ UserForm, objet Recordset 526 Dissocier des objets 53
valider 455, 461 objet XmlMap 591 Do Until…Loop, boucle
déterminer l’intervalle entre supprimer une barre de
deux dates 236 syntaxe 89
commandes 535
numéros de série 233 Do While…Loop, boucle
Delete, propriété
variable 67 syntaxe 89
collections Sheets et
DateAdd, fonction Worksheets 168 Do…Loop Until, boucle

syntaxe 235 DeleteMenu, procédure 294 syntaxe 90

unités de temps disponibles Delimiter, paramètre 145 Do…Loop While, boucle


236 Délimiteur syntaxe 90
DateDiff, fonction sélectionner 148 Document, objet 489
syntaxe 236 Déplacer Documents, collection
DB2, bases de données 520 barre d’outils 56 méthode Open 491
DblClick, événement fenêtre 55 Données
contrôle UserForm 433 feuille 169 ajouter dans une feuille
DBWindowsAuth, valeur 545 UserForm 460
Desc, mot-clé 508
DBWindowsAuth_Click, autoriser les utilisateurs à
Description, propriété les filtrer 175
événement 538
objet Error 521 autoriser les utilisateurs à
Deactivate, événement 289,
Description, sous-clé du les trier 175
292
registre 270 copier 202
Deactivate,événement 430
Deselect, méthode 354 créer une liste 576
Débogage
Dialog, objet 415 déterminer la catégorie 212
applications masquées 490
Dialogs, collection 414 extraire d’une zone de texte
Débogage, menu
afficher les constantes 453
éléments 53 disponibles 419 fonctionnement de la
Déboguer méthode Show 415 recherche 183
macro 38 variable Result 416 importer 146
Début (touche) 140 Dim New, instruction 325 mapper 587
DecimalSeparator, paramètre Dim, instruction type dans un base de
148 données relationnelle
mot-clé New 325
Déclarations, section 500
Dimensionner
créer 102 types pour les éléments
ligne, colonne 190
Déclarer 585
Direction, propriété 524
chaînes de texte 67 valider 205
DisableCustomize, propriété
constante 66 valider dans une feuille
395
UserForm 460
objets 326 DisplayAlerts, propriété 128,
DOS, fenêtre
variable 65 169
démarrer des applications
variable statique 70
Windows 478

608
Index
DragToColumn, propriété 382 Entrée (pavé numérique) macro complémentaire 261
DragToData, propriété 382 (touche) 140 EUROCONVERT 261
DragToHide, propriété 382 Entrée (touche) 140 Événement
DragToPage, propriété 382 EOF, propriété 526 créer automatiquement 460
DragToRow, propriété 382 EPURAGE, fonction 214 définir 460
DrawingObjects, paramètre Err, objet 520 Événements 31
174 propriétés Number et activer la surveillance 299
DROITE, fonction Description 93
activer, désactiver 287
syntaxe 219 vider 521
Class_Initialize 335
DropButtonStyle, propriété Erreur
Class_Terminate 335
445 affichage 56
de classe 329
DropDownLines, propriété 407 afficher un message 461
définir dans une classe 334
commande Resume 93
E description 93
définition 324
instruction RaiseEvent 334
ECARTYPE, fonction 226 récupérer avec la
mot-clé WithEvents 329
commande On Error 92
Écran objet Application 298
validation de schéma XML
propriété ScreenUpdating 592 objet Chart 353
131
Erreur Voir aussi Err, objet objet Workbook 288
Écrire dans un fichier externe
ErrorMessage, propriété 205 objet Worksheet 294
317
Errors, propriété 518 rechercher dans
Editable, paramètre 145
l’Explorateur d’objets 298
Éditeur, onglet 56 ErrorString, propriété 377
Terminate 335
EditMode, propriété 526 ErrorTitle, propriété 205
Excel
Effacement (touche) 140 Espace de travail partagé,
volet Office 23 description de l'interface 20
Élément de menu
Espaces modèle d’objet 119
affecter une macro 37
éliminer 215 Excel 2003
Else, clause 461
Espion autres applications Office et
Enabled, propriété 403 477
ajouter 53
contrôle CommandButton bibliothèque d’objets 495
452 commande Espion express
53 contrôler à partir d’autres
contrôle UserForm 433 applications 495
Espions, fenêtre
des boutons 458 démarrer une autre
afficher 51
objet CommandBar 396 application à partir de
ESTERR, fonction 212 477
objet UserForm 428
ESTERREUR, fonction 213 nouvelles fonctionnalités 3
EnableEvents, propriété 286
ESTLOGIQUE, fonction 213 Excel Query, programme
EnableSelection, propriété 175
ESTNA, fonction 213 copier des lignes 549
End, méthode 180
ESTNONTEXTE, fonction 213 Excel Query, programme 531
Enregistrer
ESTNUM, fonction 213 changer le fournisseur de
macro 33
ESTREF, fonction 213 base de données 538
tous les classeurs ouverts
152 ESTTEXTE, fonction 212, 213 configurer le projet 532

Enregistrer sous, boîte de ESTVIDE, fonction 212 configurer les informations


dialogue 314 Étiquettes de graphique de connexion 550

Enter, événement définir 359 construire une chaîne de


connexion 543
contrôle UserForm 433 Euro

609
Index
éditer une requête 540 Export, méthode 591 limites 17
enregistrer les informations Exporter un module 63 mettre les données en
539 ExportXml, méthode 592 forme 170
exécuter une requête 542, Expression, paramètre modifier la couleur de
547, 551 l'onglet 16
méthode FollowHyperlink
initialiser 533 162 nombre par défaut 16
initialiser une feuille 537 méthode PrintOut 164 nommer 165
récupérer une requête 546 méthode Protect 174 options d’impression 170
saisir une requête 550 Extraction, nom réservé 199 propriété Worksheet 124
se connecter à une base de protéger 173
données 535 F recalculer les formules 173
sélectionner référencer une plage 184
l’authentification Windows F1 à F15 (touches) 140
renommer 16
538 FaceId, propriété 405
sélectionner 176
terminer 535 Favoris
sélectionner tout 21
utiliser le programme 550 ajouter le bouton à une
barre d’outils 161 supprimer 16, 168
Execute As Recordset,
méthode 522 ajouter un fichier 161 supprimer la protection 176
Execute, méthode Fenêtre Feuille de graphique
objet CommandBarControl afficher 60 ajouter 167
403 supprimer 168
déplacer 55
objet FileSearch 305, 307 Feuille UserForm
fractionner 60
Exécuter afficher 462
niveau de zoom 126
macro 35 ajouter 425
parcourir les fenêtres 60
procédure 54 ajouter un contrôle 426
propriété ActiveWindow 126
Exécuter jusqu’au curseur, boutons de navigation 456
Feuille
commande 53
ajouter à un projet 51 collecter les entées 472
Exécuter Sub/UserForm,
copier 169 créer une feuille avancée
commande 54
451
Exécution, fenêtre créer 62
désactiver les boutons 458
afficher 51 déplacer 169
événement Initialize 457
Exécution, menu Feuille de calcul
exécuter 427
éléments 54 ajouter 166
modale, non modale 429
Exit, événement ajouter un mappage de
données 587 modifier la taille 427
contrôle UserForm 433
calculer, méthode Calculate modifier le nom d’un
valider les données 461 contrôle 427
133
Explorateur d’objets sélectionner 427
comparée aux tables 499
afficher la collection Dialogs valider les données saisies
copier 16
419 460
déplacer 16
rechercher des événements Feuille Voir aussi Feuille de
298 déterminer la dernière ligne calcul, Feuille de
457 graphique
Explorateur d’objets, fenêtre
enregistrer sous 176 Fichier
afficher 51
extraire des données vers déterminer l’existence avec
Explorateur de projets, fenêtre
une zone de texte 453 l’objet FileDialog 317
afficher 51
insérer 16
description 48

610
Index
déterminer l’existence avec TextOrProperty 307 modifier les sélections par
l’objet FileSearch 313 FileSearch, propriété 304 défaut 418
écrire dans un fichier FileType, propriété 308 Format de l’éditeur, onglet 58
externe 317 Format, menu
FileTypes, collection 308
importer 52 éléments 52
Filter, propriété 526
lire un fichier externe 319 Format, méthode 377
Filters, propriété 315
localiser 303 Format, paramètre 145
Fin (touche) 140
méthode FindFile 133 FormatDateTime, fonction 455
FIND, fonction
ouvrir dans Word 491 Forme
syntaxe 222
rechercher une valeur 320 afficher, masquer 154
FindControl, méthode 395
Fichier de données protéger contre les
objet CommandBar 396
importer dans un schéma changements 174
récupérer un pointeur
XML 589 Formula, propriété 383
d’objet 540
XML, créer 585 Formula1, propriété 205
FindFile, méthode 133
Fichier texte Formula2, propriété 205
FindLastRow, fonction 458
importer 146 Formulaire Voir Feuille
FirstPageNumber, propriété
Field, objet 529 170 UserForm
FieldInfo, paramètre 148 FitToPagesTall, propriété 170 FormulaLocal, propriété
Fields, collection 529 FitToPagesWide, propriété 170 paramètres régionaux et
Fields, propriété 526 137
Flèche Bas (touche) 140
FileDialog, objet 304, 314 Formule
Flèche Droite (touche) 140
déterminer l’existence d’un afficher dans une cellule 18
Flèche Gauche (touche) 140
fichier 317 info-bulle d’argument 24
Flèche Haut (touche) 140
méthode Show 315 recalculer 172
Fonction
propriété Filters 315 FoundFiles, collection 304,
de l’instruction Select 510 307
propriété SelectedItems
marquer comme Private 335 FoundFiles, propriété 304
315
fonctionnalités Fournisseur de base de
FileDialogFilters, collection
droits relatifs à l'information données
méthode Clear 315
7 changer 538
FileDialogSelectedItems,
Fonctions Fractionner une fenêtre 60
collection 315
de conversion 69 Frame, contrôle 463
FileFormat, paramètre 150
Font, propriété 254, 433 contenant des boutons
FileFound, objet
FontStyle, propriété 253 d’option 469
propriété LastModified 306
FooterMargin, propriété 170 déplacer 439
FileName, paramètre
For Each...Next, boucle Frappes de touches
méthode Open 144
syntaxe 87 méthode SendKeys 140
méthode OpenText 147
For...Next, boucle FriendlyName, sous-clé du
méthode SaveAs 150
syntaxe 86 registre 270
FileName, propriété 304, 307
ForeColor, propriété 433 From, clause 508
FileSearch, objet 304
FormApp.xls, exemple From, paramètre 164
déterminer l’existence d’un
d’application 450 FullName, méthode 155
fichier 313
Format de cellule, boîte de FullName, propriété
méthode Execute 307
dialogue objet AddIn 265
propriété
afficher les onglets avec du Function, procédure
FileType 308 code 417

611
Index
ajouter à un module 110 nommer 348 HasLegend, propriété 361
comparée avec une propriété ActiveChart 123 HasTitle, propriété 361
procédure Sub 95 Graphique croisé dynamique HeaderMargin, propriété 170
exécuter 111 créer avec l’assistant 372 HeaderRowRange, propriété
créer par programmation 577
G 386 Height, propriété

GAUCHE, fonction présentation 372 contrôle UserForm 433

syntaxe 219 Graphique croisé dynamique objet ChartObject 361


Voir aussi Tableau croisé objet CommandBar 396
Général, onglet (boîte de dynamique
dialogue Options) 58 objet CommandBarControl
Graphique incorporé 346 403
Gestionnaire d’erreurs
activer 352 objet UserForm 428
brancher une erreur 92
créer 348 HelpContextId, propriété 403
Gestionnaire des tâches
définir HelpFile, propriété 403
fermer des applications
masquées 490 angles 362 Heure
Get, routine 328 hauteur 361 assigner 67
GetObject, fonction 482, 490, impression 361 numéros de série 233
492 largeur 362 passer les 24 heures 238
fonction CreateObject nom 361 HiddenFields, propriété 377
versus 492 ombre 362 Hide, méthode
GetOpenFilename, méthode position 361, 362 objet UserForm 429
417
visibilité 362
GetRegistryValue, fonction
auxiliaire 545
désélectionner, désactiver I
354
GetSaveAsFilename, méthode Icônes
imprimer 363
417
nommer 351 choisir pour une boîte de
GetSetting, fonction 538, 545 message 79
nommer l’objet ChartObjet
GoTo, instruction options pour les boîtes de
347
syntaxe 91 message 76
procédure d’événement 353
Graphique Id, propriété 403
retourner la plage de
activer manuellement 347 cellules 361 Identificateur de tâche 478
ajouter 346 Graphique Voir aussi IDTExtensibility2, interface
créer à partir d’un tableau Graphique incorporé complément COM 268
de données 358 GridlineColor, propriété 250 complément
créer un graphique GridlineColorIndex 251 d’automatisation 271
incorporé 348 If...Then...Else, instruction 217
GridlineColorIndex, propriété
définir 250 syntaxe 83
emplacement 349 Grille IgnoreBlank, propriété 205
plages tracées 349 aligner des objets 52 IgnoreReadOnlyRecommende
titre 349 Grouper d, paramètre 145
type 349 objets 52 Image clipart, volet Office 22
déterminer s’il a été activé Image, contrôle
355 H charger une image 441
macro de mise en forme formats acceptés 441
362 HasDataLabels, propriété 360
placement de l’image 441
mettre en forme 361 HasDataTable, propriété 361

612
Index
redimensionner l’image 441 Insertion, menu ISERR, fonction 212
répéter l’image 441 éléments 51 ISERROR, fonction 213
Import, méthode 592 InsertRowRange, propriété IsExportable, propriété 590
Importer 577 ISLOGICAL, fonction 213
fichier 52 Installed, propriété ISNA, fonction 213
module 62 objet AddIn 265 ISNONTEXT, fonction 213
texte 146 Installer ISNUMBER, fonction 213
ImportXml, méthode 592 complément COM 282 ISREF, fonction 213
Impression_des_titres, nom complément ISTEXT, fonction 212, 213
réservé 199 d’automatisation 275
Italic, propriété 253
Imprimer macro complémentaire 261,
Item(Index), propriété
263
définir collection AddIns 264
Integrated Security, mot-clé
nombre de hauteurs/ 520 Item, méthode
largeurs de pages 170
Interface Excel collection PivotCaches 379
orientation 170
barre d’état 23 collection PivotTables 376
première page 170
barre d’onglets 23 objet Collection 340
sauts de page 171
barre de formule 21 Item, propriété
en noir et blanc 170
barre de titre 21 accéder aux objets Chart
graphiques 363 351
barres de commandes 21
plage Zone_d_impression collection
200 bouton Sélectionner tout 21
CommandBarControls
supprimer les caractères commandes de la fenêtre 401
non imprimables 214 du classeur 22
collection CommandBars
InCellDropdown, propriété 205 commandes de la fenêtre 395
du programme 22
InchesToPoints, méthode 171 collection Errors 521
volets Office 22
Index de tableau 72 collection Fields 529
zone Nom 21
Index, propriété collection Parameters 524
zone Tapez une question 22
objet CommandBar 396
objet CommandBarControl
Intersect, méthode 137 J
403 Intitulé, contrôle 435
INTPER, fonction Jet, moteur de base de
objet PivotCache 380 données 519
Info-bulle d’argument 24 syntaxe 229
Jointure de tables 508
afficher/masquer 56 Investissement

Initial Catalog, mot-clé 520 calculer la valeur actuelle


232
K
InputBox, fonction
calculer la valeur actuelle KeyAscii, argument 472
syntaxe 79 nette 233 KeyPress, événement 460,
InputBox, méthode IPMT, fonction 472
syntaxe 134 syntaxe 229
InputMessage, propriété 205 IRM (Information Rights L
InputTitle, propriété 205 Management) 7
L1C1, notation 196
Ins (touche) 140 Is Nothing, test 326
Label, contrôle 435
Insérer Is Null, expression 506
associé à un contrôle
feuille de calcul 16 ISBLANK, fonction 212 SpinButton 439
Insert, instruction 511 IsConnected, propriété 380 LabelRange, propriété 383

613
Index
LargeButtons, propriété 395 dimensionner 190 ListHeaderCount, propriété
LargeChange, propriété 442 extraire d’une base de 407

LastModified, propriété 306 données 504 ListIndex, propriété 444

LastRow, constante 454 extraire d’une table 505 objet


référencer 190 CommandBarComboBox
LayoutForm, propriété 382 407
LBound, fonction 203 supprimer d’une table 512
ListObjects, collection 579
LEFT, fonction trier dans instruction Select
508 ListRows, propriété 577
syntaxe 219 ListStyle, propriété 444
Like, opérateur 507
Left, propriété ListWidth, propriété 446
LineStyle, propriété 257
contrôle UserForm 433 Load, méthode
Lire un fichier externe 319
objet ChartObject 361 objet UserForm 429
List, propriété 443
objet CommandBar 396 LoadBehavior, sous-clé du
objet
objet CommandBarControl CommandBarComboBox registre 270
403 407 LoadData, méthode 341
objet UserForm 428 ListBox, contrôle Local, paramètre
LeftMargin, propriété 170 ajouter des éléments à la méthode Open 146
Légende de graphique liste 443 méthode OpenText 149
afficher 361 définir méthode SaveAs 151
LEN, fonction 215 en-têtes des colonnes Localiser des fichiers 303
Let, routine 328 443
Locked, propriété 433
Liaison largeur des colonnes 443
LookIn, propriété 304
plage de cellules 191 nombre de colonnes 443
Liaison dynamique 486 nombre de lignes 443 M
avec le Calendrier Outlook style de liste 444
483 effectuer une recherche Macro

avec Word 482 444 affecter à un bouton de


sélection multiple 444 barre d’outils 36
Liaison statique 482, 484, 486
supprimer des lignes 444 affecter à un élément de
dossier Contacts Outlook
menu 37
485 supprimer tous les
éléments de la liste 444 affecter une séquence
Lien hypertexte
clavier 35
autoriser les utilisateurs à ListColumns, propriété 577
afficher 34, 47
en ajouter 175 ListCount, propriété 443
créer un graphique 347
créer 162 objet
CommandBarComboBox déboguer 38
Ligne
407 déboguer pas à pas 39
ajouter à une table 511
Liste de données définir niveau de sécurité 44
autoriser les utilisateurs à
convertir en plage 577 empêcher l’exécution
en insérer 174
créer manuellement 576 automatique 41
en supprimer 175
créer par programmation enregistrer 33
les modifier 174
577 exécuter 35
calculer la précédente, la
Liste des fichiers récemment mettre en pause 130
suivante 456
utilisés mettre un graphique en
copier dans une feuille de
ajouter un classeur 146 forme 362
calcul 549
ajouter un fichier 151 protéger 174
déterminer la dernière d’une
feuille de calcul 457

614
Index
protéger avec une signature objet PivotCache 380 objet Application 120
numérique 42 objet PivotField 382 Modificateurs de touche
rechercher 49 Menu codes 140
sécurité 40 ajouter des éléments 411 Modifier un espion, commande
sélectionner 55 Menu contextuel 53
signer numériquement 43 afficher 409 Modify, méthode 206
Macro complémentaire, boîte contrôles 409 Module
de dialogue 260 ajouter 60
créer 409
Macros complémentaires ajouter à un projet 52
MenuAnimationStyle,
boîte de dialogue Macro propriété 395 ajouter une procédure
complémentaire 260 Function 110
Menus
collection AddIns 264 ajouter une procédure Sub
afficher l’intégralité 20
créer dans Excel 262 96
Menus adaptatifs
décharger 261 copier entre projets 64
activer/désactiver 395
enregistrer 263 créer 62
Méthodes 31
enregistrer du disquette, exporter 63
de classe 328
CD-ROM 264 importer 62
définir dans une classe 333
installer 261, 263 ouvrir 60
définition 132, 324
présentation 259 renommer 105
objet Connection 518
Macros complémentaires Voir supprimer 63
aussi Compléments COM, Mettre en forme
Module de classe
Compléments cellule 18, 213
d’automation ajouter 329
code 56
Maj (touche) 140 ajouter à un projet 52
plage de cellules 19
MakeConnection, méthode créer 62
Microsoft OLE DB Provider for
380 définition 325
ODBC drivers 520
Map, propriété 595 Modules complémentaires
Microsoft Jet 519
Mappage des données 587 COM, boîte de dialogue
MID, fonction
Marges afficher 268
syntaxe 221
définir 170 Mot de passe
MIN, fonction 226, 510
Masquer forts 160
Min, propriété
barre de formule 21 pour modifier un classeur
contrôle ScrollBar 442 157
feuille de calcul 166
contrôle SpinButton 438 pour ouvrir un classeur 157
MatchEntry, propriété 444
Mise en forme conditionnelle Motif de remplissage
MatchFound, propriété 446
pièges 99 modifier 255
MatchRequired, propriété 461
Mise en forme, barre d’outils visualiser 256
MAX, fonction 226, 510 18
Move, méthode
Max, propriété Mises à jour du document,
volet Office 23 collection Sheets 169
contrôle ScrollBar 442
Modalité des boîtes de objet CommandBarControl
contrôle SpinButton 438
message 77 403
MaxLength, propriété 437
MODE, fonction 226 objet Recordset 526
Me, mot-clé 336, 539
Mode, propriété 518 MoveFirst, méthode 526
MEDIAN, fonction 226
Modèle d’objet Excel MoveLast, méthode 526
MEDIANE, fonction 226
description 119 MoveNext, méthode 549
MemoryUsed, propriété
objet Recordset 526

615
Index
MovePrevious, méthode 526 objet ChartObject 361 Noms réservés 199
MOYENNE, fonction 225 objet Command 522 Not, opérateur 506
MsgBox, fonction objet CommandBar 396 Notations
syntaxe 75 objet Field 529 convertir 196
MsgBox, procédure objet ListObject 578 Nothing, valeur
syntaxe 114 objet Parameter 524 utiliser avec les objets 326
msoButtonState, constantes objet PivotField 382 Notify, paramètre 145
405 objet PivotItem 383 Nouveau classeur, volet Office
msoButtonStyle, constantes objet PivotTable 377 23
405 nouveautés Excel 2003
objet UserForm 428
msoControlType, constantes comparer des classeurs 8
objet XmlMap 591
401
Names, propriété compléments Office 2003
msoMenuAnimation, 13
constantes 395 plages nommées 194
documents intelligents 6
Multiline, propriété 436 NativeError, propriété 521
espace de travail intelligent
contrôle TextBox 471 NB, fonction 225 7
Multipage, contrôle NB.SI, fonction 226 fonctions statistiques
ajouter une page 466 NB.VIDE, fonction 226 optimisées 3
contenant des informations NBA, fonction 226 mappage données avec
de connexion 536 NBCAR, fonction 215 schémas XML 12
incrémenter la propriété NBCOUNTBLANK, fonction 226 volet Recherche 8
Value 468 XML étendues 10
New, mot-clé
masquer les onglets 468, NPV, fonction
créer une nouvelle instance
537
de Word 491 syntaxe 233
transitions visuelles 448
créer une variable objet 487 Null, valeur
Multipage_Change,
dans une instruction, Dim, dans une colonne de base
événement 468
Public ou Private 325 de données 500
MultiRow, propriété 447
NewSearch, méthode sélectionner des lignes
MultiSelect, propriété 444 contenant 506
objet FileSearch 305
NullString, propriété 377
N NewSheet, événement 289,
291 Number, propriété
name, élément NewWindow, paramètre de la objet Error 521
méthode FollowHyperlink NumberFormat, propriété
procédure Function 110
162
procédure Sub 96 objet PivotField 382
NewWorkbook, événement
Name, instruction 298 objet Range 213
nommer les séries de Niveau de sécurité NumericScale, propriété 524
données d’un graphique NuméroAuto, colonne 502
définir pour les macros 44
356
Nom complet d’un classeur
Name, propriété 253
155 O
collection ScopeFolders
Nombre Objet
310
convertir en texte 212 accéder 325
collection Sheets 165
valider la saisie 461 ajuster la taille 52
contrôle ComboBox 451
Nommer une plage de cellules aligner 52
contrôle TextBox 451
19
contrôle UserForm 433 aligner sur la grille 52
directives 195
objet AddIn 265

616
Index
avec plusieurs variables OnDisconnection, méthode Ordre de tabulation, boîte de
objet 327 269 dialogue
centrer 52 Onglet afficher 51
déclarer 326 modifier la couleur 16, 251 Ordre des tabulations
définition 323 Onglet, contrôle Voir TabStrip, définir pour un contrôle
déterminer la création d’une contrôle UserForm 433
nouvelle instance 325 OnKey,méthode 138 Orientation, propriété 170
détruire 327 OnStartupComplete, méthode objet PivotField 382
dissocier 53 269 Origin, paramètre
empilement 53 Open, événement 289, 290, méthode Open 145
464
encapsulation 30 méthode OpenText 147
Open, instruction
enfants 488 OriginalValue, propriété 529
syntaxe 317
espacement horizontal 52 Other, paramètre 148
Open, méthode
espacement vertical 52 OtherChar, paramètre 148
collection Documents 491
grouper 52 Outils pour l’Euro, macro
collection Workbooks 144 complémentaire Excel
rechercher dans
l’Explorateur d’objets 298 objet Connection 518 261

uniformiser la taille 52 objet Recordset 526 Outils, menu

valeur Nothing 326 ouvrir une connexion à une éléments 55


base de données 548 Outlook, application
ODBC
syntaxe 144 liaison dynamique avec le
fournisseurs de données
pour 520 OpenText, méthode Calendrier 483

Office, applications 477 collection Workbooks 147 liaison statique avec le


syntaxe 147 dossier Contacts 485
contrôler Excel 495
Operator, propriété 205 référencer la bibliothèque
interagir avec 487 d’objets 484
Offset, propriété Option Base, instruction 72
Ouvrir
référencer une cellule 185 Option Private Module,
instruction 102 Visual Basic Editor 47
OLAP (Online Analytical Ouvrir, boîte de dialogue 314
Processing) 373 OptionButton, contrôle 440,
463 afficher avec du code 414
OLAP, propriété 380
dans un contrôle Frame 469
OLE DB, protocole 515
Options, boîte de dialogue P
types de données 529
onglet Ancrage 59 Page, objet 466
Ombre
onglet Éditeur 56 ajouter au contrôle
définir pour un graphique
incorporé 362 onglet Format de l’éditeur Multipage 466
58 PageBreak, propriété 171
On Error Resume Next,
instruction 547 onglet Général 58 PageFields, propriété 377
On Error, commande Or, opérateur 506 PageSetup, objet 170
récupérer les erreurs 92 Oracle, bases de données, se Palette de couleurs
connecter 520
OnAction, propriété 404 afficher les couleurs par
Order By, clause 528 défaut 251
OnAddInsUpdate, méthode
269 dans une instruction Select afficher, procédure 244
508
OnBeginShutdown, méthode copier entre classeurs 246
269 Ordinateur
méthode ResetColors 246
OnConnection, méthode 269 couleurs de base et
constantes 239

617
Index
personnaliser avec palette de couleurs à partir référencer sur la feuille de
l’interface Excel 244 de l’interface Excel 244 calcul active 184
personnaliser avec VBA 245 palette de couleurs à partir référencer sur une feuille de
réinitialiser 246 de VBA 245 calcul inactive 185

Parameter, objet 522 Visual Basic Editor 56 référencer une cellule 185

Parameter, propriété Pg. Préc (touche) 140 retourner dans un graphique


Pg. Suiv (touche) 140 361
objet CommandBarControl
404 Picture, propriété sélectionner 19, 21, 180

Parameters, propriété 522 contrôle Image 441 tableaux et 202

Paramètres régionaux objet UserForm 428 Plages nommées 19

propriété FormulaLocal et PictureAlignment, propriété définir 194


137 441 écrire dans les cellules 203
Parent, propriété PictureSizeMode, propriété étendre 203
collection AddIns 264 441 lire les cellules 203
objet AddIn 265 PictureTiling, propriété 441 noms réservés 199
Pas à pas détaillé, commande Pile des appels références absolues et
53 afficher la boîte de dialogue relatives 198
Pas à pas principal, 51 PlotBy, propriété 361
commande 53 vider 54 PMT, fonction
Pas à pas sortant, commande PivotCache, méthode 378 syntaxe 228
53 PivotField, objet 376 Point d’arrêt
Password, mot-clé 520 PivotFields, méthode 378 ajouter 54
Password, paramètre PivotItems 383 effacer 54
méthode Open 145 PivotTable, objet Pointeur de l’enregistrement
méthode Protect 174 modèle d’objet 374 en cours 527
méthode SaveAs 150 PivotTableWizard, méthode Polices, boîte de dialogue
PasswordChar, propriété 437 objet PivotTable 378 sélectionner les options par
PasteFace, méthode 405 objet Worksheet 376 défaut 420
Path, méthode 155 Plage de cellules Portée
Path, propriété ajouter une bordure 257 procédure Sub 101
collection ScopeFolders étendre 180 Position, propriété
310 objet CommandBar 397
liaison 191
objet AddIn 265 objet PivotField 383
méthodes
Pattern, propriété 255 objet PivotItem 383
Calculate 133
afficher les motifs PowerPoint, application
Cells 189
disponibles 256
End 180 ouvrir une présentation à
PatternColor, propriété 255 partir d’Excel 479
Intersect 137
PatternColorIndex, propriété PPMT, fonction 230
255 mettre en forme 19
Pr_t
Pause nommer 19, 194
calculer le taux dÕint˙r_t
simuler dans le code 480 noms absolus et relatifs 232
198
Pause (touche) 140 Precision, propriété 524
propriétés
Personnaliser Preserve, mot clé 74
CurrentRegion 180
barre d’outils 56 PreserveColumnFilter,
RangeSelection 129 propriété 591
fenêtre Code 58

618
Index
PreserveNumberFormatting, paramètres d’entrée/sortie Public, élément
propriété 591 525 procédure Function 110
Presse-papiers, volet Office 22 Procédures Voir aussi Sub, procédure Sub 96
Prêt procédure et Function,
Public, instruction 328
procédure
calculer la mensualité 228 déclarer une variable 71
ProgId, propriété
calculer la part des intérêts mot-clé New 325
229 objet AddIn 265
Public, mot-clé 101
calculer la part du principal Programmation
Publish, méthode 579
230 orientée objet 30
PV, fonction
Preview, paramètre 164 procédurale 29
syntaxe 232
PRINCPER, fonction 230 Programme Excel Query Voir
PrintObject, propriété 361 Excel Query, programme

PrintOut, méthode 162, 363 Projet Q


PrintPreview, méthode 164, ajouter un module 52 Quadrillage
363 ajouter un module de classe modifier la couleur 250
PrintToFile, paramètre 164 52
QueryTable, propriété 578
Priority, propriété 404 ajouter une feuille 51
QueryType, propriété 380
Private, élément copier un module 64

procédure Function 110 renommer 107 R


procédure Sub 96 Property Get, routine 331
Raccourcis clavier
Private, instruction 328 Property Let, routine 331
méthode OnKey 138
déclarer une variable 71 Property Set, routine 331
Rafraîchir l’écran
mot-clé New 325 PropertyTests, collection 307
propriété ScreenUpdating
Private, mot-clé 101 méthode Add 308
131
variables, sous-routines et propriété
RaiseEvent, instruction 334
fonctions 335 afficher les couleurs par
Range, méthode
Procédure défaut 251
syntaxe 184
ajouter 51, 60 Propriétés 30
Range, objet
arrêter l'exécution 54 collection Fields 529
méthodes
exécuter 54 de classe 328
Select 180
réinitialiser les valeurs 109 définir pour une classe 330
SpecialCells 192
séparer par une ligne 58 définition 324
propriété BorderAround 257
Procédures objet Application 121
propriété Characters 254
ajouter aux références 107 objet Connection 518
propriétés
conserver les valeurs 108 objet Field 529
NumberFormat 213
convertir de Public en Propriétés, fenêtre
Validation 205, 217
Private 101 afficher 51
Range, propriété 578
exécuter à partir d’une autre Protect, méthode
procédure 104 RangeSelection, propriété 129
objets Sheet et Worksheet
passer des arguments 112 173 RATE, fonction
passer des arguments syntaxe 158 syntaxe 231
nommés 114 Provider, mot-clé 519 RDO (Remote Database
récursivité 107 Objects) 515
Provider_Change, événement
Procédures stockées 523 538 ReadOnly, paramètre 144
PrToFileName 164 ReadOnlyRecommended,
paramètre 151

619
Index
Recherche objet ListObject 579 Retour chariot
expressions complexes 506 objet PivotCache 380 supprimer 215
expressions simples 506 RefreshDate, propriété 380 RGB, fonction
Rechercher RefreshPeriod, propriété 380 syntaxe 240
dans un contrôle ListBox RefreshTable, méthode 378 RIGHT, fonction
444 Registre syntaxe 219
valeur dans un fichier 320 compléments COM 270 RightMargin, propriété 171
Rechercher des fichiers entrées du complément RootElementName, propriété
collection PropertyTests d’automatisation 276 591
307 sous-clé CommandLineSafe RoundedCorners, propriété
limiter la recherche 307 270 362
objet FileSearch 304 sous-clé Description 270 Routine de propriété
Rechercher, volet Office 23 sous-clé FriendlyName 270 définir dans une classe 331
RECHERCHEV, fonction sous-clé LoadBehavior 270 Row, objet
Syntaxe 24 Remove, méthode 339 propriété Height 190
RecordCount, propriété RemoveItem, méthode RowFields, propriété 378
objet PivotCache 380 objet RowGrand, propriété 378
objet PivotItem 383 CommandBarComboBox RowIndex, propriété 397
408
objet Recordset 526 Rows, propriété 190
RemoveItem, propriété
Recordset, objet
dans le modèle d’objet ADO
contrôle ListBox 444 S
525 Renommer
feuille de calcul 16 SampleData, méthode 340
dans une requête de base
de données 547 module 105 Saut de page

Recordset, propriété 380 projet 107 définir 171

Récupération de document, Repeating, propriété 595 supprimer 171


volet Office 23 Répéter du texte 218 Save, méthode
ReDim, instruction 74 REPT, fonction propriété ThisWorkbook 150
RefEdit, contrôle 446 syntaxe 218 SaveAs, méthode
Référencer Requête objet Worksheet 176
absolu et relatif 198 exécuter 542, 547 propriété ThisWorkbook 150
cellule dans une plage 185 modifier 540 syntaxe 150
cellules non contiguës 190 récupérer 546 SaveAsCopy, méthode
cellules, plage de cellules ResetAllPageBreaks, méthode propriété ThisWorkbook 152
121 172 Saved, propriété 293
ligne, colonne 190 ResetColors, méthode 246 SaveData, méthode 341
plage sur la feuille de calcul Resize, méthode 203, 579 SaveDataSourceDefinition,
active 184 propriété 591
Result, variable 414, 416
plage sur une feuille de SaveLinkValues, méthode 156
Résultats de la recherche,
calcul inactive 185
volet Office 23 Scénario
procédures 107
Resume line, instruction 93 description 17
propriété Offset 185
Resume Next, instruction 93 Scénarios
Références, commande 484
Resume, commande 93 autoriser les utilisateurs à
Refresh, méthode les modifier 174
Ret. Arr (touche) 140
collection Parameters 524 Scenarios, paramètre 174
Retour (touche) 140

620
Index
Schéma XML règles de création 100 SetSourceData, méthode 356
ajouter au classeur actif syntaxe 84 SetValue, méthode 595
582, 593 Select, instruction 504 Shadow 362
créer un schéma clause Order By 508 SharePoint
personnalisé 582
clause Where 506 volet Office Espace de
documents standards 584 travail partagé 23
extraire des
élément Root complexe 584 enregistrements 505 volet Office Lises à jour du
enregistrer en tant que mot-clé Desc 508 document 23
fichier XML 585 SharePointUrl, propriété 578
opérateur Like 507
importer des données 589 Sheet, objet
utiliser des caractères
mapper des éléments sur génériques 507 méthode Protect 173
des cellules 594
Select, méthode 180 SheetActivate, événement
mapper sur une feuille de 289, 298
collection Worksheets 176
calcul par programmation
Selected, propriété 444 Sheets, collection
590
SelectedItems, propriété 315 méthode
Schemas, propriété 591
Selection, objet 179 Add 166
ScopeFolder, objet 310
Selection, propriété 129 Copy 169
méthode
AddToSearchFolders 313 SelectionChange, événement Move 169
ScopeFolders, collection 310 295, 297 propriété
ScreenUpdating, propriété 131 Sélectionner les cellules, boîte Count 165
de dialogue Delete 168
Scroll, événement 442
afficher avec du code 416 Name 165
ScrollBar, contrôle
constante 416 Visible 166
définir
Semicolon, paramètre 148 Shell, fonction 478
distance de déplacement
de l’ascenseur 442 SendKeys, méthode ShellExecute, fonction 479
valeurs minimum et syntaxe 140 ShortcutText, propriété 405
maximum 442 Séparateur Show, méthode 415
ScrollBars, propriété autre que les virgules 147 objet FileDialog 315
contrôle TextBox 436 de cellules 146 objet UserForm 429
objet UserForm 428 virgules 146 ShowAllItems, propriété 383
ScrollColumn, propriété 126 Séquence clavier ShowAutoFilter, propriété 578
ScrollRow, propriété 126 affecter à une macro 35 ShowDropButtonWhen,
SEARCH, fonction SERIE, formule 356 propriété 445
syntaxe 222 syntaxe 357 ShowError, propriété 206
Search_SearchFolders, Séries de données ShowImportExportValidationEr
procédure 312 rors, propriété 591
définir la source 361
SearchFolders, collection 311 ShowInput, propriété 206
propriété HasDataLabels
SearchScopes, collection 309 360 ShowPopup, méthode 397
SearchSubFolders, propriété Series, objet 356 ShowTotals, propriété 578
304
Set New, instruction 325 Signature numérique
Section des déclarations
Set, commande 81 fonctionnement 42
créer 102
Set, instruction 135 protéger macro 42
Sécurité
syntaxes XE 325 protéger une macro, un
des macros 40, 44 classeur 43
Set, routine 328
Select Case, instruction

621
Index
Signature numérique, boîte de Static, mot-clé 108 Do While…Loop 89
dialogue 55 StatusBar, propriété 130 Do…Loop Until 90
Size, propriété 253 STDEV, fonction 226 Do…Loop While 90
SmallChange, propriété 442 STR, fonction For Each...Next 87
contrôle SpinButton 438 syntaxe 212 For...Next 86
SOMME, fonction 226 Strikethrough, propriété 253 fonction
SOMME.SI, fonction 226 String, variable RGB 240
Sort, propriété 526, 528 déclarer 67 fonctions
Source XML, volet Office 23 STXT, fonction CHERCHE 222
Source, propriété 526 syntaxe 221 CTXT 212
SourceType, propriété 578 Style, propriété DateAdd 235
Sous-routine contrôle ComboBox 445, DateDiff 236
marquer comme Private 335 461 DROITE 219
Space, paramètre 148 contrôle Multipage 468, FIND 222
SpecialCells, méthode 537
GAUCHE 219
syntaxe 192 contrôle TabStrip 447
InputBox 79
SpecialEffect, propriété 433 objet CommandBarButton
INTPER 229
405
SpinButton, contrôle IPMT 229
objet
définir CommandBarComboBox LEFT 219
incrémentation 438 408 MID 221
intervalle entre Sub, procédure NPV 233
événements Change ajouter à un module 96 PMT 228
439
comparée avec une PV 232
valeurs minimum et procédure Function 95
maximum 438 RATE 231
définir la portée 101
SQL (Structured Query RECHERCHEV 24
Language) 501 exécuter à partir d’une autre
REPT 218
procédure 104
SQL Server RIGHT 219
instruction Call et 104
se connecter à des bases SEARCH 222
de données 519 SubAddress, paramètre de la
méthode FollowHyperlink STR 212
SQLState, propriété 521 162 STXT 221
Start, commande 478 Subscript, propriété 253 TAUX 231
StartRow, paramètre 147 SUM, fonction 226 TROUVE 222
StartUpPosition, propriété 428 Superscript, propriété 253 VA 232
State, propriété SUPPRESPACE, fonction 215 VAN 233
objet CommandBarButton Supprimer VPM 228
405
caractères non imprimables formule SERIES 357
objet Connection 518 214 instruction
statements, élément espaces blancs 215 Delete 512
procédure Function 110 feuille de calcul 16 Insert 510
procédure Sub 96 Supprimer ou Supp. (touche) Open 317
Static, élément 140
Select 504
procédure Function 110 Syntaxe
Update 511
procédure Sub 96 boucles
instructions
Static, mot clé 70 Do Until…Loop 89

622
Index
GoTo 91 copier dans un document TabStop, propriété 433
If...Then...Else 83 Word actif 492 TabStrip, contrôle
Select Case 84 créer 72 accepter plusieurs rangées
méthode créer un graphique 358 d’onglets 447

Add, objet AddIn 264 index 72 ajouter une feuille 447

BorderAround 257 instruction Option Base 72 ajouter, supprimer un onglet


limites 72 446
Calculate 172
limites supérieure et définir
Open 144
inférieure 72 style des onglets 447
OpenText 147
redimensionner 74 orientation des onglets 447
Protect 158
retrouver une valeur 74 taille des onglets 447
SaveAs 150
Tableau croisé dynamique Tabulation (touche) 140
méthodes
autoriser les utilisateurs à Tabulations
Add 194
les exploiter 175 supprimer 215
ConvertFormula 197
bases de données OLAP Tag, propriété 465
InputBox 134 373
objet CommandBarControl
Range 184 créer avec l’assistant 370 404
SendKeys 140 créer par programmation TAUX, fonction
SpecialCells 192 384
syntaxe 231
Union 191 enregistrer les positions
Terminate, événement 335,
389
procédure 430
objet PivotTable 374
MsgBox 114 Text, propriété
pivoter manuellement 386
propriété contrôle ListBox 444
pivoter par programmation
Characters 254 contrôle TextBox 452
387
Colors 243 TextBox, contrôle
présentation 367
Système d'exploitation à plusieurs lignes 436
réinitialiser la position
pour les fichiers texte 147 d’origine 389 associé à un contrôle
pour un classeur 145 SpinButton 439
restaurer les positions 391
barres de défilement 436
Tableau croisé dynamique Voir
T aussi Graphique croisé définir le nombre maximum
dynamique de caractères 437
Tab, paramètre 148
Tableau de données masquer les caractères 437
TabFixedHeight, propriété 447
afficher 361 placer sur une feuille 451
TabFixedWidth, propriété 447
Tableau dynamique renvoi à la ligne 436
TabIndex, propriété 433
déclarer 73 TextCodePage, paramètre 151
Table
Tableau multidimensionnel Texte
actualiser les valeurs 511
déclarer 73 concaténer 217
ajouter des lignes 511
Tableaux répéter 218
comparée aux feuilles de
définir les limites 203 TextLength, propriété 437
calcul 499
plages de cellules et 202 TextOrProperty, propriété 307
extraire toutes les colonnes
505 Tableur TextQualifier, paramètre 148
jointure 508 comparé aux bases de TextVisualLayout, paramètre
données 499 méthode OpenText 148
supprimer des lignes 512
TabOrientation, propriété 447 méthode SaveAs 151
virtuelle 500
Tabs, collection 446 ThisWorkbook, module 532
Tableau

623
Index
ThisWorkbook, propriété 132 abstrait 30 afficher les contrôles
méthode Type de graphique masqués 468

AddToFavorites 161 propriété ChartType 361 définir

Close 153 type, élément aspect visuel 433

FullName 155 procédure Function 110 couleur de fond 432

Path 155 Type, instruction couleur de premier plan


433
Save 150 créer des types de données
personnalisés 81 hauteur 433
SaveAs 150
Type, paramètre largeur 433
SaveAsCopy 152
d’une balise d’élément 585 position 433
SaveLinkValues 156
Type, propriété 206 position dans l’ordre des
ThousandsSeparator, tabulations 433
paramètre 148 objet CommandBar 397
position dans la hiérarchie
Titre de graphique objet CommandBarControl
d’affichage 433
afficher 361 404
texte de survol 433
To, paramètre 164 objet Field 529
texte du contrôle 432
ToggleButton, contrôle 438 objet Parameter 525
désactiver les boutons 469
TooltipText, propriété 404 Types de données
focus 433
Top, propriété chaînes 67
verrouiller 433
contrôle UserForm 433 conversion 68
UserForm, objet
objet ChartObject 362 Date 67
activer 428
objet CommandBar 397 personnalisés 81
afficher 429
objet CommandBarControl String 67
boutons de navigation 456
404
objet UserForm 428 U charger 429
construire un assistant 466
TopIndex, propriété 444 UBound, fonction 203 créer 451
TopMargin, propriété 171 Underline, propriété 253 décharger 429
TotalsRowRange, propriété UnderlyingValue, propriété 529
578 définir
Union, méthode barres de défilement 428
Touches
syntaxe 191 couleur de fond 428
codes des modificateurs
140 Unlink, méthode 579 hauteur 428
méthode SendKeys 140 Unlist, méthode 579 image de fond 428
récupérer les frappes de Unload, méthode largeur 428
140 objet UserForm 429 mode 429
TrailingMinusNumbers, Unprotect, méthode 159, 176 valeur de la barre de titre
paramètre 149 Update, instruction 511 428
TransactionEffect, propriété Update, méthode 526 masquer 429
448
UpdateChanges, méthode 579 positionner 428
TRIM, fonction 215
UpdateLinks, paramètre 144 UserForm_Initialize,
TROUVE, fonction événement
User ID, mot-clé 520
syntaxe 222 créer 457
UserForm 51
Twip, définition 80 dans le programme Excel
UserForm Voir aussi Feuille
Type d’objet UserForm Query 537, 540
propriété Selection 129 UserForm, contrôles définir la variable LastRow
Type de données 458

624
Index
UserForm_Terminate, créer 81, 487 vbIgnore, constante 78
événement 541 objets avec plusieurs 327 vbInformation, constante 77
UserInterfaceOnly, paramètre référencer des applications vbLf, constante 75
174 483 vbMagenta, constante 240,
utf-16, codage des schémas Variable statique 241
584
déclarer 70 vbModal, valeur 462
utf-8, codage des schémas
Variables vbModeless, valeur 462
584
marquer comme Private 335 vbMonday, constante 237
Utilitaire d’analyse - VBA,
macro complémentaire Variables de classe vbMsgBoxHelpButton,
Excel 260 définir 330 constante 77
Utilitaire d’analyse, macro référencer 336 vbMsgBoxRight, constante 77
complémentaire Excel vbMsgBoxRtlReading,
Variables locales, fenêtre
260 constante 77
afficher 51
vbMsgBoxSetForeground,
V Variant, variable 68 constante 77
copier des données 202 vbNo, constante 78
VA, fonction
VBA pour l’Assistant Internet, vbOk, constante 78
syntaxe 232 macro complémentaire
Excel 261 vbOkCancel, constante 76
Valeur
vbAbort, constante 78 vbOkOnly, constante 76
rechercher dans un fichier
320 vbAbortRetryIgnore, constante vbQuestion, constante 77
Valeur actuelle nette, calculer 76 vbRed, constante 239, 241
233 vbApplicationModal, constante vbRetry, constante 78
Valeur actuelle, calculer 232 77 vbRetryCancel, constante 76
Validation, propriété 205, 217 vbBlack, constante 239, 241 vbSaturday, constante 237
Valider vbBlue, constante 240, 241 vbSunday, constante 237
données 205 vbCancel, constante 78 vbSystemModal, constante 77
Value, propriété 206 vbCr, constante 75 vbThursday, constante 237
contrôle Multipage 468 vbCritical, constante 76 vbTuesday, constante 237
contrôle UserForm 433 vbCrLf, constante 75, 473 vbUseSystem, constante 237
objet Field 529 vbCyan, constante 240, 241 vbWednesday, constante 237
objet Parameter 525 vbDefaultButton1, constante vbWhite, constante 240, 241
77
objet Path 595 vbYellow, constante 239, 241
vbDefaultButton2, constante
objet PivotField 383 vbYes, constante 78
77
objet PivotItem 383 vbYesNo, constante 76
vbDefaultButton3, constante
VAN, fonction 77 vbYesNoCancel, constante 76
syntaxe 233 vbDefaultButton4, constante Verr. Maj (touche) 140
Variable 77 Verr. Num (touche) 140
assigner une valeur 71 vbExclamation, constante 77 Virus macro 40
déclarer 65 vbFirstFourDays, constante Visible, propriété 362
durée de vie 69 237
collections Sheets et
publique/privée 71 vbFirstFullWeek, constante Worksheets 166
237
réinitialiser 54 contrôle UserForm 433
vbFirstJan1, constante 237
visibilité 70 objet ActiveWindow 354
vbFriday, constante 237
Variable objet objet CommandBar 397
vbGreen, constante 239, 241

625
Index
objet CommandBarControl Where, clause méthode
404 dans une instruction Select Activate 160
objet PivotItem 383 506 Protect 158
VisibleFields, propriété 378 dans une instruction Update méthode ResetColors 246
Visual Basic .NET 512
propriété
générer le complément 281 opérateurs de comparaison
Saved 293
506
installer le complément propriété Colors 243
COM 282 Width, propriété
propriété Names 194
Visual Basic 6 contrôle UserForm 433
propriété ThisWorkbook 132
créer un complément objet ChartObject 362
Workbook_Activate,
d’automatisation 272 objet CommandBar 397
événement 290
installer un complément objet CommandBarControl
Workbook_Activate, macro
d’automatisation 275 404
266
Visual Basic Editor objet UserForm 428
Workbook_BeforeClose
afficher une macro 47 Window, objet
dans le programme Excel
ouvrir 47 propriété Caption 126 Query 535
personnaliser 56 With...End With, commande Workbook_BeforeClose,
Visual Basic .NET 82 événement 293, 466
créer un complément COM WithEvents, mot-clé 329, 353 Workbook_BeforePrint,
277 WizardApp.xls, exemple événement 292
Volets Office d’application 464 Workbook_BeforeSave,
Accueil 23 Word, application événement 291

Aide 23 accéder à des documents Workbook_Close, macro 266


actifs 492 Workbook_Deactivate,
Espace de travail partagé
23 copier des informations événement 292
dans Excel 491 Workbook_Deactivate, macro
Image clipart 22
créer un nouveau document 266
Mises à jour du document
493 Workbook_NewSheet,
23
créer une instance de événement 291
Nouveau classeur 23
l’application 482 Workbook_Open, événement
Presse-papiers 22 289, 293
créer une liaison dynamique
Rechercher 23 avec 482 dans le programme Excel
Récupération de document ouvrir un document 490 Query 533
23 module ThisWorkbook 465
Workbook, objet
Résultats de la recherche Workbook_Open, macro 266
créer 489
23
créer une procédure WorkbookOpen, événement
Source XML 23 298
d’événement 288
afficher 584 Workbooks, collection
de niveau supérieur 489
bouton Options 589 méthode
événement
VPM, fonction Activate 152
Activate 290
syntaxe 228 Open 144
BeforeClose 293
Vue (Access) 500 OpenText 147
BeforePrint 292
BeforeSave 291 propriété Colors 246
W Deactivate 292 Worksheet, objet
Wait, méthode 130 NewSheet 291 créer une procédure
Weight, propriété 257 Open 290 d’événement 294

626
Index
événement XlBordersIndex, constantes xlHide, constante 155
BeforeRightClick 297 257 xlInputOnly, type de validation
Change 296 xlBorderWeight, constantes 206
257 xlLess, constante 205
SelectionChange 297
xlCalculate, constantes 173 xlLessEqual, constante 205
méthode
xlChart, constante 167 xlLineStyle, constantes 257
Calculate 172
XlCmdType, énumération 379 XlListConflict, constantes 579
Protect 173
xlColorIndexAutomatic, XlListObjectSourceType,
propriété
constante 251, 257 constantes 580
PageSetup 170
xlColorIndexNone, constante xlLocationAsNewSheet,
Worksheet_BeforeRightClick, 257 propriété 347
événement 297
xlColumnDataType, constantes xlLocationAsObject, propriété
Worksheet_Change, 148 347
événement 296
xlDialog, constantes 414 xlLocationAutomatic, propriété
appel itératif 286 347
xlDialogAlignment, constante
Worksheet_SelectionChange, 417 xlLogical, constante 193
événement 297
xlDialogBorder, constante 417 xlNoRestrictions, constante
WorksheetFunction, objet 175
xlDialogCellProtection,
appeler des fonctions en constante 417, 418 xlNoSelection, constante 175
tant que propriétés 215
xlDialogDataValidation, xlNotBetween, constante 205
appeler la fonction PMT 229 constante 414
xlNotEqual, constante 205
appeler les fonctions xlDialogDefineName,
SEARCH et FIND 223 xlNumbers, constante 193
constante 414
utiliser 214 XlPattern, constantes 255
xlDialogFont, constante 420
Worksheets, collection XlPivotFieldDataType,
xlDialogFontProperties,
énumération 382
méthode constante 417
XlPivotFieldOrientation, types
Calculate 172 xlDialogFormatNumber,
382
constante 417
Select 176 XlPivotFormatType, formats
xlDialogFormulaGoto,
propriété 377
constante 415
Count 165 xlPlaceHolders, constante 155
xlDialogOpen, constante 414
Delete 168 XlQueryType, constantes 380
xlDialogPatterns, constante
Visible 166 417 xlReferenceStyle, constantes
Write #, instruction 318 197
xlDialogSelectSpecial,
WriteReserved, propriété 157 constante 416 xlReferenceType, constantes
197
WriteResPassword, paramètre xlDisplayShapes, constante
155 XlSaveConflictResolution,
méthode Open 145
constantes 151
xlDot, constante intrinsèque
méthode SaveAs 151
66 xlSheetHidden, constante 166
xlSheetVeryHidden, constante
X xlEqual, constante 205
166
xlErrors, constante 193
xlBackgroundAutomatic, xlSheetVisible, constante 166
xlExcel4IntMacroSheet,
constante 253 constante 167 XlTextParsingType, constantes
xlBackgroundOpaque, 147
xlExcel4MacroSheet,
constante 253 constante 167 XlTextQualifier, constantes 148
xlBackgroundTransparent, xlGreater, constante 205 xlTextValues, constante 193
constante 253
xlGreaterEqual, constante 205 xlUnderline, constantes 253
xlBetween, constante 205

627
Index
xlUnlockedCells, constante ajouter manuellement à un
175 classeur 587
xlValidAlertInformation, ajouter une feuille de calcul
constante 205 par programmation 590
xlValidAlertStop, constante éléments 585
205 importer des données 589
xlValidAlertWarning, constante mappage 590
205
supprimer un élément 589
xlValidateCustom, constante
XmlMap, propriété 578
206
XmlMaps, collection 593
xlValidateCustom, type de
validation 206 XValues, propriété 359
xlValidateDate, constante 206
xlValidateDate, type de Z
validation 207
Zone de liste modifiable,
xlValidateDecimal, constante contrôle Voir ComboBox,
206 contrôle
xlValidateDecimal, type de Zone de liste, contrôle Voir
validation 207 ListBox, contrôle
xlValidateInputOnly, constante Zone de texte, contrôle Voir
206 TextBox, contrôle
xlValidateList, constante 206 Zone Nom 21
xlValidateList, type de Zone Tapez une question 22
validation 207
Zone_d_impression, nom
xlValidateTextLength, réservé 199
constante 206
Zone_d_impression, plage 200
xlValidateTextLength, type de
Zone_de_consolidation, nom
validation 207
réservé 199
xlValidateTime, constante 206
Zoom
xlValidateTime, type de
fenêtre, niveau de 126
validation 207
Zoom, propriété 126, 171
xlValidateWholeNumber,
constante 206 ZOrder, méthode 433
xlValidateWholeNumber, type
de validation 207
xlWorksheet, constante 167
xlXmlExportSuccess,
constante 591
xlXmlExportValidationFailed,
constante 591
xlXmlImportElementsTruncate
d, constante 592
xlXmlImportSuccess,
constante 592
xlXmlImportValidationFailed,
constante 592
XML

628

You might also like