excel microsoft office excel

646
Curtis Frye Wayne S. Freeze et Felicia K. Buckingham Adapté de l’anglais par : Véronique Campillo Véronique Warion et Emmanuelle Burr Microsoft ® EXCEL 2003 VBA

Upload: abdelhamid-ferchichi

Post on 12-Aug-2015

665 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: EXCEL Microsoft Office Excel

Curtis FryeWayne S. Freeze

et Felicia K. Buckingham

Adapté de l’anglais par : Véronique Campillo

Véronique Warionet Emmanuelle Burr

Microsoft®

EXCEL 2003VBA

Page 2: EXCEL Microsoft Office Excel

Toute représentation ou reproduction intégrale ou partielle faite sans le consentement de l’auteurou 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 (ArtL 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èrecritique, 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 : DunodDistribution : InterforumTraduction : Véronique Campillo, Véronique Warion, Emmanuelle BurrMise en page : IID

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. Ilspeuvent 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 dequelque 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 à ladate de la parution. Néanmoins, Microsoft Press n’assume de responsabilités ni pour sonutilisation, ni pour les contrefaçons de brevets ou atteintes aux droits de tierces personnes quipourraient résulter de cette utilisation.

Microsoft Internet Explorer, Windows et Excel sont soit des marques déposées, soit desmarques 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 FeliciaK. Buckingham. All rights published by arrangement with the original publisher, MicrosoftPress, 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

ISBN : 978 2 10 055217 7

Page 3: EXCEL Microsoft Office Excel

i

Sommaire

À propos de ce livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iExigences d’équipement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iSupport technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .i

Conventions et signalétique de ce livre . . . . . . . . . . . . . . . . . . . . . . iiiConventions de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iiiConventions visuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii

Partie 1Préliminaires

Chapitre 1Les nouveautés d’Excel 2003 3

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

Créer des listes Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Mapper des données Excel avec des schémas XML . . . . . 12Publier des feuilles de calcul avec les Compléments Office 2003. . . . . . . . . . . . . . . . . . . . . 13

Chapitre 2Tour d’horizon 15

Classeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Feuilles de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Cellules et plages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18L’interface Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Partie 2Visual Basic pour Applications

Chapitre 3Exploration de Visual Basic pour Applications 29

Tour d’horizon de la programmation orientée objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Page 4: EXCEL Microsoft Office Excel

Sommaire

ii

Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Événements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Le travail avec les macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Enregistrer et afficher des macros . . . . . . . . . . . . . . . . . . 33Exécuter une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Déboguer une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Mettre en œuvre la sécurité des macros et des signatures numériques . . . . . . . . . . . . . . . . . . . . . 40

Chapitre 4Démarrage de la programmation VBA 47

Introduction à Visual Basic Editor . . . . . . . . . . . . . . . . . . . . . . 47Ouvrir Visual Basic Editor . . . . . . . . . . . . . . . . . . . . . . . . 47Tour d’horizon de Visual Basic Editor . . . . . . . . . . . . . . . . 48Personnaliser Visual Basic Editor . . . . . . . . . . . . . . . . . . 55

Gestion des fenêtres Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Gérer les fenêtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Ajouter du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Notes sur le style de programmation et la lisibilité du code . . . . . . . . . . . . . . . . . . . . . . . . . . 61

Développement de projets avec l’Explorateur de projets . . . . . . 62Créer des modules VBA . . . . . . . . . . . . . . . . . . . . . . . . . 62Supprimer des modules VBA . . . . . . . . . . . . . . . . . . . . . . 63Copier des modules entre projets . . . . . . . . . . . . . . . . . . 64

Déclaration des variables, constantes et types de données. . . . 64Déclarer des variables . . . . . . . . . . . . . . . . . . . . . . . . . . 65Définir les types de données . . . . . . . . . . . . . . . . . . . . . . 65Définir les constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . 66Gérer les chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Gérer les dates et les heures . . . . . . . . . . . . . . . . . . . . . 67Gérer les variables Variant et convertir des types de données . . . . . . . . . . . . . . . . . . . . . . . . . . 68Portée et durée de vie des variables . . . . . . . . . . . . . . . . 69

Assignation de valeurs aux variables . . . . . . . . . . . . . . . . . . . . 71Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Créer un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72Cré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 . . . . . . . . . . . . . . . . . . . . . . 75Créer une boîte de saisie . . . . . . . . . . . . . . . . . . . . . . . . 79

Définition de variables objet . . . . . . . . . . . . . . . . . . . . . . . . . . 81Création de types de données personnalisés . . . . . . . . . . . . . . 81

Commande With…End With . . . . . . . . . . . . . . . . . . . . . . 82Contrôle de la progression du programme . . . . . . . . . . . . . . . . 82

Instructions de sélection. . . . . . . . . . . . . . . . . . . . . . . . . 82

Page 5: EXCEL Microsoft Office Excel

Sommaire

iii

Boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Instruction GoTo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

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

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

Définition de procédures Sub . . . . . . . . . . . . . . . . . . . . . . . . . 95Définir la portée d’une procédure Sub . . . . . . . . . . . . . . 101Exécuter une procédure Sub à partir d’une autre procédure . . . . . . . . . . . . . . . . . . . . . . . . . 103Conserver les valeurs entre les appels de procédure . . . 108

Définition de procédures Function . . . . . . . . . . . . . . . . . . . . . 109Créer une procédure Function . . . . . . . . . . . . . . . . . . . . 110Exécuter des procédures Function . . . . . . . . . . . . . . . . . 111Passer des arguments aux procédures. . . . . . . . . . . . . . 112Passer des arguments nommés . . . . . . . . . . . . . . . . . . 114

Organisez votre réussite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Partie 3Le modèle d’objet Excel

Chapitre 6L’objet Application 119

Introduction à l’objet Application . . . . . . . . . . . . . . . . . . . . . . 120Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Chapitre 7Classeurs et feuilles de calcul 143

La collection Workbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Créer de nouveaux classeurs . . . . . . . . . . . . . . . . . . . . 143Ouvrir des classeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . 144Enregistrer des classeurs . . . . . . . . . . . . . . . . . . . . . . . 149Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160Imprimer et prévisualiser les classeurs . . . . . . . . . . . . . 162

Les collections Sheets et Worksheets . . . . . . . . . . . . . . . . . . 164Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166Méthodes des feuilles de calcul . . . . . . . . . . . . . . . . . . 172

Chapitre 8Plages et cellules 179

Manipulations de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179Localiser la plage active . . . . . . . . . . . . . . . . . . . . . . . . 179Sélectionner une plage . . . . . . . . . . . . . . . . . . . . . . . . . 180

Page 6: EXCEL Microsoft Office Excel

Sommaire

iv

Référencement des plages . . . . . . . . . . . . . . . . . . . . . . . . . . 183Référencer les plages de la feuille de calcul active . . . . . 184Référencer les plages d’une feuille de calcul inactive . . . 185Référencer les cellules d’une plage . . . . . . . . . . . . . . . . 185Référencer des cellules avec la propriété Offset . . . . . . . 185Définir une plage avec la propriété Cells. . . . . . . . . . . . . 189Référencer des colonnes et des lignes. . . . . . . . . . . . . . 190Référencer des groupes de cellules non contiguës . . . . . 190

Manipulation de groupes de cellules . . . . . . . . . . . . . . . . . . . 190Dimensionner les cellules par programmation . . . . . . . . 190Lier de deux plages . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Détecter les cellules vides . . . . . . . . . . . . . . . . . . . . . . 192

Plages nommées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194Définir une plage nommée . . . . . . . . . . . . . . . . . . . . . . 194Styles de notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Noms de plages réservés . . . . . . . . . . . . . . . . . . . . . . . 199Copier des données entre des plages et des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

Validation des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

Partie 4Fonctions VBA avancées

Chapitre 9Manipulation des données avec VBA 211

Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Déterminer si la valeur d’une cellule est du texte . . . . . . 212Préparer les données de chaîne pour le traitement . . . . . 214Déterminer le nombre de caractères d’une chaîne . . . . . 215Concaténer le texte de plusieurs cellules ou variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Retourner le premier ou le dernier caractère d’une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . 219Retourner des caractères arbitraires d’une chaîne . . . . . 221Retrouver une chaîne au sein d’une autre chaîne . . . . . . 221

Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Analyse des données . . . . . . . . . . . . . . . . . . . . . . . . . . 225Calculs financiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228

Dates et heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233Numéros de série des dates et des heures . . . . . . . . . . 233Fonctions de date et d’heure. . . . . . . . . . . . . . . . . . . . . 234

Chapitre 10Mise en forme d’objets Excel 239

Constantes et palette de couleurs Excel . . . . . . . . . . . . . . . . 239Palette de couleur Excel standard . . . . . . . . . . . . . . . . . 244La palette de couleurs Excel et le web . . . . . . . . . . . . . . 247

Page 7: EXCEL Microsoft Office Excel

Sommaire

v

Éléments de la feuille de calcul . . . . . . . . . . . . . . . . . . . . . . . 250Polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252Cellules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Bordures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

Chapitre 11Création de macros complémentaires et de compléments COM 259

Présentation des macros complémentaires . . . . . . . . . . . . . . 259Boîte de dialogue Macro complémentaire. . . . . . . . . . . . . . . . 260

Installer une macro complémentaire . . . . . . . . . . . . . . . 261Décharger une macro complémentaire . . . . . . . . . . . . . . 261

Création de macros complémentaires Excel . . . . . . . . . . . . . . 262Créer une macro complémentaire . . . . . . . . . . . . . . . . . 262Enregistrer la macro complémentaire . . . . . . . . . . . . . . . 263Installer la macro complémentaire . . . . . . . . . . . . . . . . . 263

Collection AddIns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264Tour d’horizon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264L’objet AddIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

Création de compléments d’automatisation et COM . . . . . . . . 267Interface IDTExtensibility2. . . . . . . . . . . . . . . . . . . . . . . 268Clés du registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

Construction d’un complément d’automatisation avec Visual Basic 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

Concevoir le complément . . . . . . . . . . . . . . . . . . . . . . . 271Entré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é . . . . . . . . . 277Modifier le modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Installer 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

Page 8: EXCEL Microsoft Office Excel

Sommaire

vi

Événements Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298Affiner la surveillance de l’événement Application . . . . . . 299Détecter si un classeur est ouvert . . . . . . . . . . . . . . . . . 300

Chapitre 13Manipulation des fichiers 303

Localisation des fichiers externes . . . . . . . . . . . . . . . . . . . . . 303Retourner tous les fichiers . . . . . . . . . . . . . . . . . . . . . . 304Limiter la recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . 307Retrouver des fichiers avec la boîte de dialogue FileDialog. . . . . . . . . . . . . . . . . . . . . . . . . . 314

Écriture dans un fichier externe . . . . . . . . . . . . . . . . . . . . . . . 317Lecture dans un fichier externe . . . . . . . . . . . . . . . . . . . . . . . 319Recherche d’une valeur dans un fichier . . . . . . . . . . . . . . . . . 320

Chapitre 14Développement de modules de classes 323

Qu’est-ce qu’un objet ?. . . . . . . . . . . . . . . . . . . . . . . . . 323Qu’est-ce qu’une classe ?. . . . . . . . . . . . . . . . . . . . . . . 323Que sont les propriétés ? . . . . . . . . . . . . . . . . . . . . . . . 324Que sont les méthodes ? . . . . . . . . . . . . . . . . . . . . . . . 324Que sont les événements ? . . . . . . . . . . . . . . . . . . . . . 324

Introduction aux modules de classe. . . . . . . . . . . . . . . . . . . . 325Accéder aux objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325Déclarer des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Objets et Nothing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Objets avec plusieurs variables objet . . . . . . . . . . . . . . . 327

Propriétés, méthodes et événements. . . . . . . . . . . . . . . . . . . 328Propriétés, méthodes et événements : Public ou Private ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Événements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

Construction d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . 329Créer un module de classe . . . . . . . . . . . . . . . . . . . . . . 329Définir les propriétés simples . . . . . . . . . . . . . . . . . . . . 330Définir les routines de propriété . . . . . . . . . . . . . . . . . . 331Définir des méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . 333Définir des événements . . . . . . . . . . . . . . . . . . . . . . . . 334Définir des variables, sous-routines et fonctions privées . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Événements spéciaux pour les classes . . . . . . . . . . . . . 335Résoudre des références . . . . . . . . . . . . . . . . . . . . . . . 336

Conception pratique d’une classe . . . . . . . . . . . . . . . . . . . . . 336Une classe simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336Étendre une classe simple . . . . . . . . . . . . . . . . . . . . . . 337

Page 9: EXCEL Microsoft Office Excel

Sommaire

vii

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

Partie 5Manipulation des objets Excel

Chapitre 15Graphiques 345

Tour d’horizon des graphiques . . . . . . . . . . . . . . . . . . . . . . . . 345Créer des graphiques incorporés ou des feuilles de graphique . . . . . . . . . . . . . . . . . . . . . . . 346Définition du modèle d'objet Chart. . . . . . . . . . . . . . . . . 350

Manipulation des graphiques . . . . . . . . . . . . . . . . . . . . . . . . 351Activer un graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . 352Désactiver un graphique . . . . . . . . . . . . . . . . . . . . . . . . 354Modifier une série de données . . . . . . . . . . . . . . . . . . . 355Modifier un graphique pour utiliser les données d’un tableau . . . . . . . . . . . . . . . . . . . . . . . 358Définir les étiquettes du graphique . . . . . . . . . . . . . . . . 359Mettre un graphique en forme . . . . . . . . . . . . . . . . . . . . 361Modifier tous les graphiques d’un classeur . . . . . . . . . . 363Imprimer des graphiques . . . . . . . . . . . . . . . . . . . . . . . 363

Réflexions sur la programmation des graphiques . . . . . . . . . . 364

Chapitre 16Tableaux et graphiques croisés dynamiques 367

Tableaux et graphiques croisés dynamiques . . . . . . . . . . . . . . 367Introduction aux tableaux croisés dynamiques . . . . . . . . 367Créer un tableau croisé dynamique avec l’Assistant Tableau et graphique croisés dynamiques . . . 370Introduction aux graphiques croisés dynamiques . . . . . . 371Créer un graphique croisé dynamique avec l’Assistant Tableau et graphique croisés dynamiques . . . 372Bases de données OLAP. . . . . . . . . . . . . . . . . . . . . . . . 373

Objets des tableaux croisés dynamiques . . . . . . . . . . . . . . . . 374Collection PivotTables . . . . . . . . . . . . . . . . . . . . . . . . . . 375Objet PivotTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Collection PivotCaches . . . . . . . . . . . . . . . . . . . . . . . . . 378Objet PivotCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Objets PivotField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381Objet PivotItem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

Programmation de tableaux croisés dynamiques. . . . . . . . . . . 384Créer un tableau croisé dynamique . . . . . . . . . . . . . . . . 384Créer un graphique croisé dynamique . . . . . . . . . . . . . . 386

Manipulation par programmation des tableaux croisés dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386

Faire pivoter un tableau croisé dynamique . . . . . . . . . . . 387

Page 10: EXCEL Microsoft Office Excel

Sommaire

viii

Réinitialiser la position d’origine . . . . . . . . . . . . . . . . . . 389Enregistrer et restaurer des positions . . . . . . . . . . . . . . 389

Chapitre 17Barres de commandes 393

Identification des différentes parties du système de menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393

Collection CommandBars . . . . . . . . . . . . . . . . . . . . . . . 394Objets CommandBar. . . . . . . . . . . . . . . . . . . . . . . . . . . 396Lister les objets CommandBar. . . . . . . . . . . . . . . . . . . . 398Ajouter une barre de commandes flottante . . . . . . . . . . . 399Supprimer une barre de commandes . . . . . . . . . . . . . . . 400

Contrôles des barres de commandes. . . . . . . . . . . . . . . . . . . 400Collection CommandBarControls . . . . . . . . . . . . . . . . . . 400Objet CommandBarControl . . . . . . . . . . . . . . . . . . . . . . 402Contrôles de boutons . . . . . . . . . . . . . . . . . . . . . . . . . . 405Créer des barres d'outils . . . . . . . . . . . . . . . . . . . . . . . 406Contrôles de zone de liste modifiable . . . . . . . . . . . . . . 407Utiliser une zone de liste modifiable . . . . . . . . . . . . . . . 408Contrôles de menu contextuel . . . . . . . . . . . . . . . . . . . . 409Afficher un menu contextuel . . . . . . . . . . . . . . . . . . . . . 409Ajouter des éléments à un menu existant. . . . . . . . . . . . 411

Chapitre 18Personnalisation des boîtes de dialogue 413

Affichage des boîtes de dialogue existantes . . . . . . . . . . . . . . 414Modification des boîtes de dialogue existantes. . . . . . . . . . . . 418

Explorer la collection Dialogs. . . . . . . . . . . . . . . . . . . . . 419Passer des arguments aux boîtes de dialogue existantes . . . . . . . . . . . . . . . . . . . . . . . . . 423

Planification avec des boîtes de dialogue . . . . . . . . . . . . . . . . 424

Chapitre 19Création de feuilles UserForm 425

Création d’une feuille UserForm . . . . . . . . . . . . . . . . . . . . . . 425Ajouter un objet UserForm. . . . . . . . . . . . . . . . . . . . . . . 425Concevoir un objet UserForm. . . . . . . . . . . . . . . . . . . . . 426Modifier un objet UserForm . . . . . . . . . . . . . . . . . . . . . . 427Propriétés d’un objet UserForm . . . . . . . . . . . . . . . . . . . 428Afficher un objet UserForm . . . . . . . . . . . . . . . . . . . . . . 429

Contrôles UserForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431Programmer les contrôles . . . . . . . . . . . . . . . . . . . . . . . 431Propriétés, méthodes et événements. . . . . . . . . . . . . . . 432Contrôle Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435Contrôle CommandButton . . . . . . . . . . . . . . . . . . . . . . . 435Contrôle TextBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Contrôle CheckBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

Page 11: EXCEL Microsoft Office Excel

Sommaire

ix

Contrôle ToggleButton. . . . . . . . . . . . . . . . . . . . . . . . . . 438Contrôle SpinButton . . . . . . . . . . . . . . . . . . . . . . . . . . . 438Contrôle Frame. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Contrôle OptionButton . . . . . . . . . . . . . . . . . . . . . . . . . 440Contrôle Image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441Contrôle ScrollBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442Contrôle ListBox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442Contrôle ComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . 445Contrôle RefEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446Contrôle TabStrip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446Contrôle Multipage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447

Chapitre 20Création de feuilles UserForm avancées 449

Récupération de l’information . . . . . . . . . . . . . . . . . . . . . . . . 449Tour d’horizon de l’application . . . . . . . . . . . . . . . . . . . . 449Concevoir une feuille . . . . . . . . . . . . . . . . . . . . . . . . . . 450Afficher les données . . . . . . . . . . . . . . . . . . . . . . . . . . . 453Parcourir la feuille de calcul . . . . . . . . . . . . . . . . . . . . . 456Modifier les données . . . . . . . . . . . . . . . . . . . . . . . . . . 458Ajouter des données. . . . . . . . . . . . . . . . . . . . . . . . . . . 460Valider les données . . . . . . . . . . . . . . . . . . . . . . . . . . . 460Afficher la feuille UserForm . . . . . . . . . . . . . . . . . . . . . . 462

Conception d’un assistant à plusieurs étapes . . . . . . . . . . . . 463Tour d’horizon de l’application . . . . . . . . . . . . . . . . . . . . 463Gérer les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Construire la feuille UserForm . . . . . . . . . . . . . . . . . . . . 466Parcourir les pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Collecter les options de l’assistant . . . . . . . . . . . . . . . . 469Synthétiser les options . . . . . . . . . . . . . . . . . . . . . . . . . 472Exécuter l’assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

Partie 6Excel et le monde extérieur : une collaboration simplifiée

Chapitre 21Excel et les autres applications Office 477

Démarrage d’une autre application . . . . . . . . . . . . . . . . . . . . 477Activation d’une autre application . . . . . . . . . . . . . . . . . . . . . 481Liaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481

Liaison dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Liaison statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484

Interaction avec d’autres applications Office. . . . . . . . . . . . . . 487Ouvrir un document dans Word . . . . . . . . . . . . . . . . . . . 490Accéder à un document Word actif. . . . . . . . . . . . . . . . . 492

Page 12: EXCEL Microsoft Office Excel

Sommaire

x

Créer un nouveau document Word . . . . . . . . . . . . . . . . . 493Contrôler Excel à partir d’autres applications Office . . . . 495

Conjugaison des talents . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497

Chapitre 22Excel et SQL 499

Comparaison des tableurs et des bases de données . . . . . . . 499Concepts essentiels des bases de données. . . . . . . . . . 500Clés de base de données . . . . . . . . . . . . . . . . . . . . . . . 501Accéder aux bases de données à partir d’Excel . . . . . . . 502

Manipulation des bases de données avec SQL . . . . . . . . . . . . 503L’instruction Select. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

Instructions Select simples. . . . . . . . . . . . . . . . . . . . . . 504Extraire des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Trier les lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508Utilisation de plusieurs tables . . . . . . . . . . . . . . . . . . . . 508Fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510

L’instruction Insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Utiliser l’instruction Insert. . . . . . . . . . . . . . . . . . . . . . . 511

L’instruction Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511L’instruction Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512

Chapitre 23Introduction à ADO 515

Le modèle d'objet ADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515Utiliser le modèle d'objet ADO. . . . . . . . . . . . . . . . . . . . 516

L’objet Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Principales propriétés et méthodes de l’objet Connection . . . . . . . . . . . . . . . . . . . . . . . . . . 517Se connecter à différents systèmes de gestion de base de données . . . . . . . . . . . . . . . . . . 519Utiliser la collection Errors . . . . . . . . . . . . . . . . . . . . . . 520Utiliser l’objet Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

L’objet Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521Principales propriétés et méthodes de l’objet Command . 522Utiliser la collection Parameters . . . . . . . . . . . . . . . . . . 523Utiliser l’objet Parameter . . . . . . . . . . . . . . . . . . . . . . . 524

L’objet Recordset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525Principales propriétés et méthodes de l’objet Recordset . 525Utiliser la collection Fields . . . . . . . . . . . . . . . . . . . . . . 529Utiliser l’objet Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . 529

Chapitre 24Programme Excel Query 531

Tour d’horizon du programme Excel Query . . . . . . . . . . . 531Configurer le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Initialiser le programme . . . . . . . . . . . . . . . . . . . . . . . . 533

Page 13: EXCEL Microsoft Office Excel

Sommaire

xi

Terminer le programme . . . . . . . . . . . . . . . . . . . . . . . . . 535Connexion à une base de données . . . . . . . . . . . . . . . . . . . . 535

Initialiser la feuille DBInfo . . . . . . . . . . . . . . . . . . . . . . . 537Changer les fournisseurs de la base de données . . . . . . 538Sélectionner l’authentification Windows . . . . . . . . . . . . . 538Enregistrer les informations . . . . . . . . . . . . . . . . . . . . . 539

Édition d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539Exécution d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542

Récupérer les informations . . . . . . . . . . . . . . . . . . . . . . 542Construire une chaîne de connexion . . . . . . . . . . . . . . . 543Récupérer la requête . . . . . . . . . . . . . . . . . . . . . . . . . . 546Exécuter une requête . . . . . . . . . . . . . . . . . . . . . . . . . . 546Copier des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548

Utilisation du programme Excel Query . . . . . . . . . . . . . . . . . . 550Configurer les informations de connexion . . . . . . . . . . . . 550Saisir une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Exécuter la requête . . . . . . . . . . . . . . . . . . . . . . . . . . . 551

Chapitre 25Excel et le web 553

HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554Enregistrer une feuille de calcul en tant que page web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554Publier une feuille de calcul sur le web. . . . . . . . . . . . . . 557Des pages web interactives. . . . . . . . . . . . . . . . . . . . . . 560

Exploitation de l'Internet comme source de données . . . . . . . 562Ouvrir des pages web en tant que classeurs . . . . . . . . . 563Utiliser les requêtes Web . . . . . . . . . . . . . . . . . . . . . . . 564Analyser les pages web à la recherche d’informations spécifiques . . . . . . . . . . . . . . . . . . . . . . 567

Exploitation de l'Internet pour publier des résultats . . . . . . . . 568Configurer un serveur web. . . . . . . . . . . . . . . . . . . . . . . 568Enregistrer des feuilles de calcul en tant que pages web . . . . . . . . . . . . . . . . . . . . . . . . . 569Ajouter l’interactivité avec les composants Web . . . . . . . 570Communiquer avec un serveur web . . . . . . . . . . . . . . . . 572

Exploitation des solutions Internet avec Excel. . . . . . . . . . . . . 573

Chapitre 26Excel et XML 575

Introduction aux listes de données . . . . . . . . . . . . . . . . . . . . 575Créer des listes de données par programmation. . . . . . . 577

Création de schémas XML . . . . . . . . . . . . . . . . . . . . . . . . . . 582Création de fichiers de données XML . . . . . . . . . . . . . . . . . . . 585Ajout manuel de XML à un classeur . . . . . . . . . . . . . . . . . . . . 587

Importer manuellement des données XML . . . . . . . . . . . 589Ajout de XML à une feuille de calcul par programmation . . . . . 590

Page 14: EXCEL Microsoft Office Excel

Sommaire

xii

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

Index 601

Page 15: EXCEL Microsoft Office Excel

i

À propos de ce livre

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

Exigences d’équipementVoici les exigences minimales d’équipement informatique pour exécuter lesexercices 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, vousdevrez pouvoir disposer d’un matériel plus performant. Prenez connaissancedes pré-requis indiqués pour chaque complément ou outil dans la page de télé-chargement.

Support techniqueMalgré tous les soins apportés à la réalisation de cet ouvrage et de son contenud’accompagnement, il se peut que des erreurs nous aient échappées et nous vousinvitons à 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 poserune 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 Supporttechnique Microsoft sur le web à l’adresse support.microsoft.com/.

Page 16: EXCEL Microsoft Office Excel
Page 17: EXCEL Microsoft Office Excel

iii

Conventions et signalétique de ce livre

Dans ce livre, nous avons adopté un certain nombre de conventions de texte et demise en forme destinées à faciliter la prise de connaissance des informations qu’ilcontient.

Conventions de texte

Conventions visuelles

Au QuotidienCet 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 auniveau 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.

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.

Page 18: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

iv

Astuce Les astuces contiennent des informations utiles, permettant degagner du temps, ou des procédures alternatives liées à la tâche décrite parailleurs.

DépannageCet 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éduressusceptibles de nécessiter un dépannage.

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

Attention Ces rubriques identifient les problèmes auxquels vous devez êtreattentif pendant la réalisation d’une tâche ou que vous devez résoudre avantde 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 sujetabordé. Vous en apprendrez plus en matière de technologie ou de fonctionna-lité.

Page 19: EXCEL Microsoft Office Excel

1

Partie 1

Préliminaires

1 Les nouveautés d’Excel 2003 3

2 Tour d’horizon 15

Page 20: EXCEL Microsoft Office Excel
Page 21: EXCEL Microsoft Office Excel

3

Partie 1 : Préliminaires

Chapitre 1

Les nouveautés d’Excel 2003

Utilisation des fonctions statistiques optimisées . . . . . . . . . 3Création de documents intelligents . . . . . . . . . . . . . . . . . . . 6Création d’espaces de travail intelligents . . . . . . . . . . . . . . . . . . . 7

Mise en œuvre de la gestion des droits relatifs à l’information. . . . . 7Comparaison de classeurs côte à côte . . . . . . . . . . . . . . . . . . 8Utilisation du volet Recherche . . . 8Exploitation des fonctionnalités XML étendues . . . . . . . . . . . . . . . 10

Microsoft Excel existe depuis 1985, il n’est donc pas étonnant que les éléments debase des feuilles de calculs du programme soient restés similaires. Ceci dit, il esttoujours possible d’améliorer un produit et Microsoft Office Excel 2003 bénéficed’une palette de fonctionnalités nouvelles qui rendent la collecte et le transfertdes données, ainsi que la collaboration, bien plus efficaces que dans les versionsanté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 textuelsouple qui permet de décrire le contenu d’une feuille de calcul de façon que lesdonnées qu’elle contient puissent être gérées automatiquement et non pasmanuellement. Cela vous permet de gagner du temps et d’éviter les inévitableserreurs 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 pluspré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 formulesrelativement simples, associées à des mises en forme standards, pour présenterdes informations commerciales et financières. Mais les scientifiques, les univer-sitaires et certains experts travaillant en entreprise ont besoin de ces fonctionsstatistiques 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 apermis 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 cesfonctions optimisées et les décrit une à une.

Page 22: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

4

Partie 1 : Préliminaires

Chapitre 1

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

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.

Page 23: EXCEL Microsoft Office Excel

Cha

pitr

e 1

Les nouveautés d’Excel 2003

5

Partie 1 : Préliminaires

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

Retourne une valeur reflétant la probabilité qu’une valeur 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.DETERMINATION

Retourne le carré du coefficient Pearson de deux jeux de 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).

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

Page 24: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

6

Partie 1 : Préliminaires

Chapitre 1

Création de documents intelligentsLes 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 desaptitudes intéressantes, le classeur Excel n’en était pas moins un bloc de donnéesisolé. Avec Office 2003, les documents intelligents sont des documents Office quipossèdent des métadonnées (des données qui informent le document sur ce qu’ilest). Les métadonnées sont des informations qui indiquent comment les donnéess’insèrent dans un processus métier, permettant au document d’effectuer desactions programmées en fonction du contexte.

Prenons un exemple. Vous travaillez dans une société de services techniques quiutilise un modèle Excel pour suivre le temps passé sur chaque projet. Vous allezsans doute créer un nouveau classeur (avec une feuille de calcul) en début desemaine, l’enregistrer avec vos informations d’identification, et le compléter avecle 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 « cartede pointage » et à la façon dont votre temps de travail s’ajuste au processus del’activité. Lorsque vous créez un nouveau classeur « carte de pointage », Excelvous reconnaît et complète vos informations personnelles (nom, numérod’employé, projets, etc.). Puis lorsque vous avez terminé votre travail de lasemaine, le document intelligent affiche un bouton qui vous permet d’envoyer leclasseur à la prochaine étape du processus. Et en ce qui vous concerne, peuimporte le mécanisme employé pour relayer les données. Celles-ci peuvent allerse placer dans une base de données, être enregistrées dans une feuille de calculquelque part sur le réseau, être incorporées aux données d’un serveur BizTalkchargé du suivi des flux d’activité, ou être envoyées en pièce jointe d’un messageOutlook adressé à votre responsable administratif.

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.

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

Page 25: EXCEL Microsoft Office Excel

Cha

pitr

e 1

Les nouveautés d’Excel 2003

7

Partie 1 : Préliminaires

Création d’espaces de travail intelligentsLe 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 importantprojet, vous avez besoin d’informations de tous les membres de votre équipepour déterminer les produits et les composants à prendre en considération. Sansparler de la somme des tâches administratives qu’il vous faut fournir pour gérerle projet en interne. Le partage et la fusion de classeurs permettent de récupérerles informations éparses, mais ce sont des tâches épineuses. Il suffit que l’un devos collaborateurs ajoute ou modifie son mot de passe sur son exemplaire duclasseur 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. Unespace 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 travaillersur une copie de celui-ci sur le serveur SharePoint ou sur une copie localequ’elles peuvent actualiser en ajoutant les changements survenus au niveau del’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 à cetteportion du site, ceux-ci pourront travailler sur le même exemplaire du classeur.Toute modification enregistrée dans un exemplaire quelconque du documentdevient disponible pour chaque membre de l’équipe. Si les modifications créentdes conflits, vous-même, en tant qu’administrateur, pouvez trancher quant auxchangements à valider. Vous pouvez également vous servir du volet Espace detravail partagé pour créer et administrer l’espace de travail intelligent.

Remarque On peut utiliser les espaces de travail intelligents avec MicrosoftOffice 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ésoudreest celui de la surveillance de l’accès aux informations. Les mots de passe, lescomptes 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 fichiernon protégé a quitté son périmètre de sécurité, n’importe qui peut le copier et lediffuser à sa guise. Les nouvelles fonctionnalités IRM (Information Rights Mana-gement, gestion des droits relatifs à l’information) d’Office 2003 permettent depré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 auniveau des utilisateurs pour limiter l’accès aux contenus. Ainsi, les utilisateursqui d’une manière ou d’une autre, parviennent à mettre la main sur des copies

Page 26: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

8

Partie 1 : Préliminaires

Chapitre 1

non autorisées de vos fichiers ne parviendront pas pour autant à jeter un œil survotre budget prévisionnel de l’année prochaine. Les utilisateurs autorisés maisqui 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, maisils ne pourront pas les modifier.

Remarque IRM (Information Rights Management) n’est disponible que dansMicrosoft Office Professional Edition 2003, Word 2003, Excel 2003 et Power-Point 2003.

Comparaison de classeurs côte à côteUne 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 apparaissentqui vous permettent souvent de relever des différences à l’œil nu. Ces différencesdeviennent encore plus visibles lorsque vous utilisez les formats conditionnelsou le suivi des modifications pour afficher les cellules de données dans un formatdifférent de celui du reste des données. Pour activer cette nouvelle fonction, ilvous suffit d’ouvrir deux classeurs à comparer et de cliquer sur Fenêtre, Compa-rer en côte à côte avec.

Utilisation du volet RechercheExcel 2003 comporte également plusieurs outils supplémentaires de recherchequi vous aident à trouver des informations en provenance de nombreuses sour-ces différentes. Affichez le volet Recherche en cliquant sur Affichage, Volet Officeet 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 égalementpossible de sélectionner des ouvrages de référence. Ensuite, cliquez sur le boutonDé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 unesélection d’ouvrages de référence que vous pouvez consulter.

Page 27: EXCEL Microsoft Office Excel

Cha

pitr

e 1

Les nouveautés d’Excel 2003

9

Partie 1 : Préliminaires

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 cellulePour lancer une recherche sur le contenu d’une cellule dans les ouvrages deréférence du volet Recherche, maintenez enfoncée la touche ALT et cliquez surla cellule contenant le texte voulu.

Au bas du volet Recherche, cliquez sur les liens pour actualiser les outils derecherche installés sur votre ordinateur, comme les thésaurus et les dictionnaires.Vous disposez également d’un lien vers Office Marketplace. Office Marketplaceest 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 voletRecherche ne vous apportent pas ce dont vous avez besoin. Parmi ces ressources,vous trouverez la eLibrary, qui vous donne accès à 13 millions de documentsmultimédias, dont des photographies et des cartes, qui sont collectées dans lesjournaux publiés à travers le monde entier, ainsi que plus de 450 000 profilsd’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é, lesclassements, ainsi que des actualités extraites de plus de 2 500 périodiques diffé-rents.

Page 28: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

10

Partie 1 : Préliminaires

Chapitre 1

Exploitation des fonctionnalités XML étendues

Le changement le plus notable d’Excel 2003 est sans doute la prise en chargeoptimisée de XML (Extensible Markup Language). À la différence du langageHTML (Hypertext Markup Language), qui permet de décrire l’apparence desdonné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. Maisle serveur qui présente ces données et le client qui les réceptionne pour le comptede son utilisateur sont des machines qui n’ont pas la moindre idée du type dedonnées transmis. Or avec un fichier XML, les machines deviennent capables dereconnaître qu’elles transportent des données de ventes et partant de là, lesgèrent de la manière appropriée. XML est pris en charge depuis Excel 2002, maison ne pouvait qu’ouvrir et enregistrer des classeurs au format Feuille de calculXML. C’était intéressant, mais loin de constituer une aptitude pleine et entière.

Remarque Toutes les fonctionnalités nouvelles décrites dans cette sectionsont disponibles uniquement dans Microsoft Office 2003 Édition Profession-nelle. Les utilisateurs des autres éditions peuvent seulement enregistrer etouvrir des classeurs XML, comme c’était déjà le cas dans Excel 2002.

Créer des listes ExcelDe 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 chaquecolonne 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ésdynamiques, 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 deslimites de plage, qu’il n’identifiait pas un intitulé dans l’une ou l’autre colonne, lerésultat était bancal. Avec Excel 2003, les listes sont devenues des entités biendé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 zoneoccupée par la liste.

Remarque Si vous sélectionnez les cellules de votre liste avant d’effectuercette 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.

Page 29: EXCEL Microsoft Office Excel

Cha

pitr

e 1

Les nouveautés d’Excel 2003

11

Partie 1 : Préliminaires

● Les contrôles de filtrage automatique apparaissent dans les cellulesd’intitulé ; vous pouvez vous en servir pour sélectionner les modalitésd’affichage des données dans la liste.

● Une ligne d’insertion apparaît, matérialisée par un astérisque. Commedans 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éesau 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 lagestion 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’outilsListe. L’opération par défaut effectuée dans la ligne de total consiste à fairela somme du contenu de la colonne, mais vous pouvez cliquer dansn’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. Parexemple, vous pouvez filtrer les données, créer un tableau croisé dynamique ouajouter de nouvelles lignes à la liste. Quelle que soit la tâche choisie, Excel décalele 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 laliste sur un ordinateur non connecté au réseau et intégrer les modifications lorsde 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 quevous –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 unserveur SharePoint, vous pouvez être encore plus spécifique quant aux types dedonnées, en obligeant les utilisateurs à ne saisir, par exemple, que des valeursentières.

Page 30: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

12

Partie 1 : Préliminaires

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 XMLLes structures de données XML sont définies dans un schéma, qui est stocké dansExcel dans un fichier .xsd. Le code XML qui suit montre comment vous pouvezconstruire 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 MicrosoftVisual 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. Ladé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 dedonné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émentsexactement dans cet ordre à chaque fois.

Page 31: EXCEL Microsoft Office Excel

Cha

pitr

e 1

Les nouveautés d’Excel 2003

13

Partie 1 : Préliminaires

Publier des feuilles de calcul avec les Compléments Office 2003

Techniquement, les Compléments Office 2003 font partie de la suite Office et passeulement d’Excel 2003. Ils incluent plusieurs composants permettant de publierdes 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 dedonnées. Un autre composant, le Data Access Component, présente des fonctionsd’accès à des bases de données pour les listes.

Page 32: EXCEL Microsoft Office Excel
Page 33: EXCEL Microsoft Office Excel

15

Partie 1 : Préliminaires

Chapitre 2

Tour d’horizonClasseurs . . . . . . . . . . . . . . . . . . . 15Feuilles de calcul . . . . . . . . . . . . . 16Cellules et plages. . . . . . . . . . . . . 18

L’interface Excel . . . . . . . . . . . . . 20Formules . . . . . . . . . . . . . . . . . . . 24

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

ClasseursLe 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 dessections 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 feuillesqui contiennent des données ainsi que d’autres objets Excel. Excel 2003 supporteles quatre types de feuilles suivants, mais vous exploiterez essentiellement lesdeux 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, maisExcel 2003 permet d’ouvrir des fichiers Excel 4.0 ou 5.0 sans aucune perte defonctionnalité. Si vous travaillez dans une entreprise qui exploite les mêmes clas-seurs de base depuis longtemps, la capacité de Excel 2003 à travailler avecd’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. Pourmodifier cette valeur, dans le menu Outils, choisissez Options, cliquez sur

Page 34: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

16

Partie 1 : Préliminaires

Chapitre 2

l’onglet Général et tapez une valeur dans la zone Nombre de feuilles de calcul parnouveau 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 étantun classeur contenant une seule feuille de calcul), optez pour une feuille decalcul par classeur par défaut jusqu’à ce que vous ayez terminé la création desmodèles.

Pour parcourir les feuilles de calcul d’un classeur, servez-vous des commandesde la barre d’onglets qui se trouve dans l’angle inférieur gauche de la fenêtreExcel. Chaque feuille de calcul possède son propre onglet (intitulés Feuil1, Feuil2et 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 contextuelhé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 del’onglet, introduite dans Excel 2002, offre un moyen pratique pour désigner unefeuille à laquelle vous avez apporté des modifications, mettre en évidence unefeuille par rapport à une autre (pour une feuille récapitulative, par exemple) etsimplifier 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 graphiquesincorporé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 ainsique sa légende. Ensuite, affichez le graphique et sa légende dans des fichiersgraphiques séparés ou incorporez le nouveau fichier dans le classeur.

Feuilles de calculDes quatre types de base de feuilles présents dans Excel, les feuilles de calcul sontde loin les plus couramment exploitées. Elles contiennent des cellules, organiséesen lignes et colonnes, où vous stockez les données et créez des formules poursynthétiser ces données. Comme le montre le tableau 2.1, les feuilles de calculExcel possèdent au maximum 256 colonnes et 65 536 lignes. Si vous travaillezavec 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 entreprisede vente intensive, vous serez contraint d’écrire les données dans un fichier texteque 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.

Page 35: EXCEL Microsoft Office Excel

Cha

pitr

e 2

Tour d’horizon

17

Partie 1 : Préliminaires

Le scénario, qui permet de définir des jeux de données alternatifs dans une feuillede calcul, est sans nul doute l’une des fonctionnalités les moins exploitées dansExcel. Comme vous avez pu le noter dans le tableau 2.1, chaque scénario peutcontenir 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 decréer une nouvelle feuille de calcul contenant les données théoriques. Si vouscréez une nouvelle feuille de calcul contenant 12 valeurs, dont trois changent, lesscé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 pourchaque 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.

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

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 cellule dans un scénario

32

Nombre maximum de changements de cellule dans le Solveur

200

Page 36: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

18

Partie 1 : Préliminaires

Chapitre 2

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

Cellules et plagesDans Excel, la cellule, formée par l’intersection d’une colonne et d’une ligne dansune 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 laformule. Pour modifier ce paramètre, dans le menu Outils, cliquez sur Optionspuis sur l’onglet Affichage et cochez la case Formules. Remarquez que la formules’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 deleurs résultats, la barre d’outils Audit de formules s’affiche. Elle présente desboutons qui permettent d’identifier les cellules utilisées dans les formules, devisualiser 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’outilsMise 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 dela cellule en gras ou dans une police différence. Toutefois, pour bénéficier d’uncontrô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 desbordures. 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 desdonnées et non de créer une œuvre d’art.

Page 37: EXCEL Microsoft Office Excel

Cha

pitr

e 2

Tour d’horizon

19

Partie 1 : Préliminaires

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 lamise en forme d’un groupe de cellules, il vous suffit de sélectionner les cellules etd’effectuer les modifications. Pour utiliser les valeurs d’un groupe de cellulesdans une formule, vous procédez de manière similaire. Par exemple, vous tapezla formule =SOMME() dans une cellule, placez le point d’insertion entre lesparenthèses puis sélectionnez les cellules à employer dans la formule. À mesureque vous sélectionnez les cellules, les références des cellules sont insérées dans laformule. 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 latouche CTRL. Par exemple, si vous tapez =SOMME() dans une cellule, placez lepoint 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 laformule suivante =SOMME(C3:C24, C26).

Important Lorsque vous créez une formule, si vous appuyez sur la toucheENTRÉ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 formulesou si vous devez transmettre un classeur que vous avez créé à un collègue, il n’estguère pratique d’utiliser les références de cellule pour désigner les valeursemployées dans une formule. Au lieu de ces obscures références, créez des plagesnommé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 plusieurscatégories de produits, vous pouvez créer une plage nommée par catégorie etcréer une formule comme =SOMME(Machines,Logiciel,Consultation) au lieude =SOMME(C3:C24,D3:D24,E3:E24).

La méthode la plus rapide pour créer une plage nommée consiste à sélectionnerles cellules de la plage, à cliquer sur la zone Nom, qui se trouve à l’extrémité gau-

Page 38: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

20

Partie 1 : Préliminaires

Chapitre 2

che de la barre de formule et à taper le nom de la plage (la zone Nom est la zonede 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), danslaquelle vous pouvez ajouter ou supprimer des plages.

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ècheorientée vers le bas qui se trouve à l’extrémité droite de la zone Nom et cliquezsur le nom de la plage.

L’interface ExcelUn 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 del’interface Excel pour permettre aux utilisateurs de tirer profit au mieux de leursclasseurs. La figure 2.4 montre la fenêtre Excel présentant les éléments clés del’interface Excel.

Au QuotidienAu 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 lebas 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 utilisateursqui ne maîtrisent pas le programme elle constitue plutôt un obstacle. Vouspouvez, et devriez, désactiver le système de menus adaptatifs. Pour ce faire,dans le menu Outils, choisissez Personnaliser et sur l’onglet Options, cochezla case Toujours afficher les menus dans leur intégralité.

Page 39: EXCEL Microsoft Office Excel

Cha

pitr

e 2

Tour d’horizon

21

Partie 1 : Préliminaires

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êtreExcel 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 auclasseur actif ou s’il est partagé, son nom est suivi d’une désignation entrecrochets. Si vous avez ouvert plusieurs copies du même classeur, le premiernom 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 basepar 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 lescellules 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 commandeEnregistrer du menu Fichier revient à cliquer sur le bouton Enregistrer dela 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 deformule, la longue bande blanche qui se trouve au-dessus des en-têtes decolonnes 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’unecommande 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’interfaceExcel. Si vous avez créé une plage nommée, comme nous l’avons décrit

Page 40: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

22

Partie 1 : Préliminaires

Chapitre 2

plus tôt dans ce chapitre, vous pouvez sélectionner une plage en cliquantsur la flèche pointant vers le bas, qui se trouve à droite de la zone Nom etcliquer sur le nom de votre choix pour la sélectionner (cette action encadreles cellules de la plage nommée). Si vous n’avez pas sélectionné de plagenommé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 voussélectionnez une zone de trois lignes par dix colonnes, la zone Nom affiche3L × 10C jusqu’à ce que vous relâchiez le bouton de la souris, puis elleindique la référence de la cellule qui se trouve dans l’angle supérieur gau-che de la plage sélectionnée.

Remarque Il est intéressant de connaître les dimensions exactes de la zonesélectionnée si vous devez coller un groupe de cellules provenant d’une autrefeuille 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êtreExcel : 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 dela 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’elleavait au moment où on a cliqué sur les boutons).

Zone Tapez une question. Cette zone constitue la méthode la plus rapide pourrechercher des rubriques dans le système d’aide Excel. Tapez un mot ouune phrase dans la zone Tapez une question et appuyez sur Entrée pourafficher une liste de rubriques d’aide dans le volet Résultats de la recherchequi se trouve à droite du classeur. Cliquez sur le nom d’une rubrique pourl’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 dela fenêtre Excel lorsque vous effectuez certaines tâches (par exemple, sivous cliquez sur Fichier, Nouveau, vous affichez le volet Nouveau clas-seur). Vous pouvez également afficher les volets Office par le biais du menuAffichage en choisissant Volet Office. Voici les volets Office disponiblesdans Excel 2003 :

■ Image clipart. Ce volet propose des liens pour rechercher des clipsdans 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 nouvelemplacement du Presse-papiers Office. Il peut contenir jusqu’à24 éléments copiés ou coupés.

Page 41: EXCEL Microsoft Office Excel

Cha

pitr

e 2

Tour d’horizon

23

Partie 1 : Préliminaires

■ Récupération de document. Si Excel subit une défaillance alorsqu’un classeur est ouvert, le volet Office Récupération de documents’affiche lorsque vous ouvrez à nouveau Excel. Vous pourrez choisirentre 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, cevolet 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 permettantd’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ésdu support Microsoft, des informations d’aide, des formationsMicrosoft 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 desmodèles de classeurs sur votre ordinateur ou sur le site MicrosoftOffice Online et de créer un classeur vide.

■ Rechercher. Le volet Office Rechercher contient des liens vers unegamme d’outils de recherche permettant de localiser des mots et desphrases. 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 permetd’effectuer une recherche dans le système d’aide, sur Micro-soft.com, sur le site de support Office ou d’exploiter des outils derecherche 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 lesservices SharePoint, contient un ensemble de liens hypertexte quevous pouvez exploiter pour créer et gérer des espaces de travail ausein desquels vous et vos collègues pouvez collaborer sur un docu-ment partagé.

■ Source XML. Le volet Office Source XML contient un ensembled’outils qui permettent d’assigner une structure XML à une feuillede calcul pour que vous puissiez échanger des données XML avecvos collègues et clients.

Barre d’onglets. La barre d’onglets contient un onglet par feuille de calcul. Pournaviguer 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 duprogramme. Elle indique si une sauvegarde ou une sauvegarde automati-

Page 42: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

24

Partie 1 : Préliminaires

Chapitre 2

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 sontverrouillées, si le défilement est verrouillé et/ou si la touche VERR NUM estactive sur votre clavier.

Au QuotidienLa fonction opération récapitulative est quelque peu méconnue mais elle offreune 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é-sente la somme des données dans une zone qui se trouve à gauche del’indicateur du verrouillage du pavé numérique. L’addition constitue l’opérationrécapitulative par défaut. Pour changer ce paramètre, cliquez droit dans lazone 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 droitdans la zone de la barre d’état et sélectionnez la nouvelle opération.

FormulesExcel est un programme de stockage des données extrêmement puissant, maisson principal atout réside dans la synthèse des données. Il permet de créer desformules qui exploitent et récapitulent les valeurs contenues dans les classeurs.Les formules peuvent être simples, par exemple, afficher la valeur d’une celluledans une autre cellule (par exemple, =A1 affiche la valeur de la cellule A1 dans lacellule 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, Excelreconnaî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 afficheune info-bulle d’argument contenant RECHERCHEV(valeur_cherchée;table_matrice; no_index_col; [valeur_proche]). Le premier paramètre à saisir, ladé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é lepoint-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 avezdé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

Page 43: EXCEL Microsoft Office Excel

Cha

pitr

e 2

Tour d’horizon

25

Partie 1 : Préliminaires

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

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.

Page 44: EXCEL Microsoft Office Excel
Page 45: EXCEL Microsoft Office Excel

27

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

Page 46: EXCEL Microsoft Office Excel
Page 47: EXCEL Microsoft Office Excel

29

Partie 2 : Visual Basic pour Applications

Chapitre 3

Exploration de Visual Basic pour Applications

Tour d’horizon de la programmation orientée objet. . . 29

Le travail avec les macros. . . . . . 33

Ce chapitre vous montre comment fonctionnent les macros dans le contexte deMicrosoft Office Excel 2003. La seconde partie de ce chapitre explique commentenregistrer 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 (VisualBasic 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, « Lesnouveautés d’Excel 2003 », vous avez découvert quelques éléments de base quevous retrouverez lors de l’utilisation et la programmation d’Excel ; ce chapitrepoursuit 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 objetsavec 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’instructionsqu’un ordinateur exécute dans un ordre spécifié. Dans Excel, cet ordre peutchanger en fonction du contenu de la feuille de calcul sur laquelle travaille le pro-gramme, mais i l subsiste un principe fondamental des langages deprogrammation : 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 ; lesprogrammeurs concevaient un algorithme, ou procédure, que le programmedevait suivre, et définissaient des variables (sortes de conteneurs de valeurs) aufur 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 demanière descriptive. S’il est aisé de créer une variable nommée prix pour stockerle 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 cadred’un stock en perpétuel changement. Car il faudrait créer une nouvelle variablechaque fois que l’on veut commercialiser un nouveau produit. Or ce n’est pasbien compliqué si cela se produit une ou deux fois par jour, mais si vous dévelop-

Page 48: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

30

Partie 2 : Visual Basic pour Applications

Chapitre 3

pez beaucoup de programmes et que vous voulez gagner du temps en créant ducode réutilisable, il vous faut organiser le code autour des éléments constitutifs devotre 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 decaracté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 etune 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 desvaleurs 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 untype de donnée abstrait pour représenter un produit ne crée pas d’emplacementoù conserver ses valeurs et les actions qui lui sont associées. Il vous faut en effetcréer une instance du type de donnée abstrait pour y stocker les données et lesactions associées à la nouvelle marque d’engrais que vous venez de mettre envente dans la partie couverte de votre jardinerie. Cette instance doit avoir unidentifiant unique au sein du système, comme par exemple produit001, et le pro-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 unprogramme, mais la structure sous-jacente des langages de programmation quitravaillent avec des types de données abstraits reste procédurale car il peut existerdes 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 pardes objets, et que toutes les actions et données soient encapsulées dans ces fameuxobjets. Dans Excel, ces objets peuvent être des classeurs, des feuilles de calcul, desplages 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 lesobjets :

● les propriétés ;

● les méthodes ;

● les événements ;

● les collections.

PropriétésEn un mot comme en cent, les propriétés sont des variables qui décrivent unaspect 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 quevous ou Excel avez assigné aux classeurs, feuilles de calcul, plages de cellules, ouobjets autres. Si vous modifiez le nom d’une feuille de calcul, que ce soit par lebiais de code VBA ou en cliquant droit sur l’onglet de la feuille de calcul, puis encliquant sur Renommer, avant de modifier la valeur, vous apportez un change-

Page 49: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

31

Partie 2 : Visual Basic pour Applications

ment à la valeur stockée dans la propriété Name. Il est des propriétés que vouspouvez 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’interfaceExcel (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 avecpoint, 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èguessachent que les données sont désormais différentes et qu’elles nécessitent unevérification avant que la feuille de calcul puisse rejoindre un ensemble de docu-ments finalisés.

MéthodesUne méthode est une action qu’un objet sait réaliser. Par exemple, vous savez sansdoute que la feuille de calcul affichée dans la fenêtre Excel est qualifiée de fenêtreactive. Dans Excel VBA, vous pouvez modifier la feuille de calcul sur laquellevous travaillez en invoquant la méthode Activate de la feuille de calcul cible. Unefois 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éesau moyen d’une notation avec point. Pour recalculer toutes les formules d’unefeuille de calcul, par exemple, vous appellerez la méthode Worksheet.Calculate.

ÉvénementsTout comme une propriété est un attribut quantifiable d’un objet et uneméthode est une action qu’un objet sait entreprendre, un événement est uneaction qu’un objet reconnaît comme ayant eu lieu. Voici quelques exemplesd’é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

Page 50: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

32

Partie 2 : Visual Basic pour Applications

Chapitre 3

actions a lieu et que vous avez indiqué à Excel ce que vous voulez qu’il fasse lorsde la survenue de l’événement correspondant, Excel exécute le code dans votregestionnaire 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 pouvezcréer le gestionnaire d’événements suivant :

Private Sub App_NewWorkbook(ByVal Wb As Workbook)Application.Windows.Arrange xlArrangeStyleCascadeEnd Sub

Ne vous souciez pas de savoir ce que fait chaque élément de la routine ; pour lemoment, voyez la deuxième ligne de code, qui indique à l’application Exceld’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, vouspouvez vous servir de VBA pour que cela se fasse sans intervention de votre part.

CollectionsLe dernier élément de la programmation orientée objet que vous devez connaîtreest la collection. Comme son nom l’indique, une collection est un groupe d’objetsdu même type qui se trouvent à l’intérieur d’un autre objet. Par exemple, unclasseur contient une collection d’une ou plusieurs feuilles de calcul. Pour appli-quer un changement à toutes les feuilles de calcul de votre classeur, vous pouvezpasser 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à probablementla boucle For…Next, qui permet de répéter un jeu d’instructions plusieurs foisvia du code semblable à la séquence qui suit et qui ajoute le chemin de dossier duclasseur actif à la section de droite du pied de page sur la première des troisfeuilles de calcul :

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

Le problème de ce codage « en dur » (c’est-à-dire le fait s’assigner une valeurdé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 vousgérez de grosses quantités de code, vous finirez inévitablement par oublier cettemodification, ce qui entraînera des erreurs qu’il vous faudra rectifier. Pireencore, vous risquez de ne rien remarquer tant que votre correcteur n’aura pasdécouvert que les 500 premiers exemplaires de votre rapport annuel sont malformaté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 decalcul se trouvent dans votre classeur, mais il y a plus simple : utiliser une boucleFor Each…Next. La boucle trouve le nombre d’objets d’une collection (le nom-

Page 51: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

33

Partie 2 : 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 WorksheetsWksht.PageSetup.RightFooter = PathNext Wksht

Au lieu d’incrémenter la valeur comme dans une boucle For…Next standard, onse contente de rechercher le prochain membre de la collection Worksheets etd’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 dela progression du programme » dans le chapitre 4 « Démarrage de la programmationVBA ».

Le travail avec les macrosL’avantage le plus évident des macros Excel est d’automatiser ainsi les tâchesrépétitives. Les macros et Visual Basic pour Applications ne se réduisent pas à lapossibilité de répéter des actions sans intervention humaine, mais commençonspar là. Dans cette section, nous allons voir comment enregistrer des macros, lesexécuter selon la méthode la plus aisée pour vous, et exploiter les fonctionnalitésintégrées de sécurité des macros pour vous protéger des virus.

Enregistrer et afficher des macrosRien de plus facile que d’enregistrer une macro dans Excel 2003 : vous cliquezsur Outils, Macro, Nouvelle macro pour afficher la boîte de dialogue Enregistrerune 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 macroet cliquez sur OK. La boîte de dialogue disparaît et est remplacée par la barred’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 estprête à être utilisée. Comme pour tout effort de programmation, vous devez pré-

Page 52: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

34

Partie 2 : Visual Basic pour Applications

Chapitre 3

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 lerésultat voulu.

Une fois l’enregistrement terminé, vous pouvez visualiser le code Excel VBA encliquant sur Outils, Macros, <nom_macro>, Modifier. La macro apparaît dansl’É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 ».

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 autreparticularité : 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 lacellule 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 lieudes références relatives, qui reflètent les positions des cellules sélectionnées parrapport à 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 vousmontre la même macro enregistrée avec des références relatives.

Page 53: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

35

Partie 2 : 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 etcellules ».

Exécuter une macroUne fois que vous avez créé votre macro, vous pouvez l’exécuter à tout momenten cliquant sur Outils, Macro, Macros, <nom_macro>, puis sur Exécuter. Enoutre, dans la boîte de dialogue Macro, vous pouvez afficher les macros desautres classeurs en cliquant sur la flèche adjacente à la zone Macros dans, et ensé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 lesdeux cas, les noms des macros affichés incluent le nom du classeur dans lequel lamacro 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 ellesné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 clavierLes utilisateurs qui préfèrent travailler avec les raccourcis clavier dans Excel(comme par exemple CTRL+C pour copier) affecteront leurs macros à des

Page 54: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

36

Partie 2 : Visual Basic pour Applications

Chapitre 3

séquences effectuées au clavier. Il est important de savoir que si vous assignezune macro à une séquence clavier déjà employée par ailleurs (par exempleCTRL+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 à laquelleassigner un raccourci clavier.

3 Cliquez sur Options.

4 Tapez une lettre dans la zone Touche de raccourci. Si vous tapez une lettreminuscule, 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 possiblede choisir un chiffre ou un caractère spécial comme le signe dollar ($) oul’esperluette (&).

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’outilsExé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 lamacro à 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 plusjudicieux de créer une nouvelle barre d’outils pour y accueillir les boutons de vosmacros. Si votre écran est réglé sur une résolution relativement basse afin deréduire la fatigue oculaire, par exemple, il ne vous restera pas beaucoup de placedans les barres d’outils existantes. Par ailleurs, si vous placez plusieurs boutonsde macros, vous risquez d’avoir du mal à sélectionner le bon bouton dans unebarre d’outils fortement « peuplée ». Si vous placez vos boutons dans une barred’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 assignerune macro au bouton :

1 Cliquez sur Outils, Personnaliser. Puis, si nécessaire, cliquez sur l’ongletBarres d’outils.

Page 55: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

37

Partie 2 : Visual Basic pour Applications

2 Cliquez sur Nouvelle. Dans la zone Nom de la barre d’outils, tapez le nomvoulu 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 venezd’ajouter, cliquez dans la zone Nom, tapez le nom du bouton et appuyezsur ENTRÉE.

7 Dans la nouvelle barre d’outils, cliquez droit sur le nouveau bouton et cli-quez sur Affecter une macro.

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 menuDe même que vous pouvez créer des barres d’outils pour accueillir les boutonsd’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 restegé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’occupentpas 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 laboî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.

Page 56: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

38

Partie 2 : Visual Basic pour Applications

Chapitre 3

4 Dans le volet Catégories de la boîte de dialogue Personnaliser, cliquez surMacros.

5 Dans la liste Commandes, faites glisser la commande Élément de menupersonnalisé vers l’en-tête du nouveau menu. Relâchez le bouton de lasouris une fois que vous avez placé le nouvel élément de menu dans laboî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 vousvenez 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 macroLa 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 pascomme il devrait. L’Éditeur Visual Basic vous donne quelques outils permettantde 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 prochaineinstruction 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.

Page 57: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

39

Partie 2 : Visual Basic pour Applications

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

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

Page 58: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

40

Partie 2 : Visual Basic pour Applications

Chapitre 3

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

Attention Lorsque vous exécutez une macro à plusieurs reprises, n’oubliezpas 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.Comme le montre la figure 3.5, Visual Basic Editor indique la présence d’unpoint 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 pasles ignorer lorsque vous travaillez avec des langages aussi puissants et souples queVBA. Vous devez disposer d’un logiciel antivirus (ou deux) sur chacun de vosordinateurs ; il s’agit de votre première ligne de défense contre les virus macro

Page 59: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

41

Partie 2 : 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 dedétection ne reconnaissent pas les nouvelles menaces. Votre deuxième ligne dedéfense, naturellement, dépend de votre méfiance quant aux fichiers que vousrecevez, 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 à lancementautomatique, 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. Ilexiste 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 afficherla boîte de dialogue Sécurité.

Le dernier niveau est à rayer de votre liste, même si vous avez installé sur votreordinateur 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 vousouvrez un classeur qui en contient. En cliquant sur Activer les macros, vousouvrez le classeur et permettez l’exécution des macros dans le classeur. Cliquezsur Désactiver les macros pour ouvrir le classeur sans autoriser l’exécution desmacros et cliquez sur Annuler pour ne pas ouvrir le classeur. Si vous travaillezbeaucoup 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 desmacros en cas de réception d’un fichier suspect, le réglage sur le niveau de sécu-

Page 60: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

42

Partie 2 : Visual Basic pour Applications

Chapitre 3

rité moyen convient. Si vous partagez votre ordinateur, ou que vous partez envacances 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 toujoursrevenir à une sécurité moyenne à votre retour au bureau.

Introduction aux signatures numériquesLe mécanisme associé au niveau de sécurité élevé repose en partie sur l’usage dessignatures 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 lestechniques de cryptage à clé publique. Elle constitue une combinaison unique dudocument 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 del’opération est complexe et repose sur des théories que seule une poignée dechercheurs maîtrise vraiment. Mais voici un aperçu de ce qui se passe au coursd’une opération de cryptage.

La première étape consiste à générer une clé qui sera employée pour crypter lesdonnées en ajoutant les valeurs contenues dans la clé à celles qui constituent letexte. Prenons un exemple simple : la clé est la lettre a et le mot à crypter estkazoo. Si vous ajoutez « a », ou plutôt sa position en tant que première lettre del’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 : unemoitié 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 quiconquevous demandant de la lui fournir serait à soupçonner d’avoir de mauvaisesintentions à votre égard. En revanche, vous devez diffuser la clé publique, en ladonnant à toute personne avec laquelle vous vous apprêtez à échanger desfichiers signés numériquement. Avec le cryptage à clé publique, l’astuce est quetoute personne disposant d’une copie de votre clé publique peut vérifier qu’undocument que vous avez signé avec votre clé privée provient bien de vous et qu’iln’a pas été modifié depuis que vous l’avez signé.

En fonction du logiciel de cryptage employé, vous aurez la possibilité d’utiliservotre paire de clés publique-privée pour apposer votre signature numérique auxclasseurs 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 estque toute personne se trouvant à l’extérieur de votre réseau ne pourra pas savoirsi 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 uncertificat numérique auprès d’une société spécialisée. Un certificat numériqueest un fichier électronique qui vous identifie et contient des informations commele nom de votre organisation, l’autorité émettrice du certificat, votre adressecourriel et votre pays, ainsi que la date d’expiration du certificat. Il détient unecopie de votre clé publique. Après avoir signé un document avec un certificatnumérique, toute personne désireuse de vérifier que le certificat employé poursigner le document vous appartient bien, peut s’adresser au serveur de clés main-

Page 61: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

43

Partie 2 : Visual Basic pour Applications

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

Au QuotidienCertificats 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’emparerde la plus grosse part du gâteau. Début 2000, deux compagnies sont sortiesdu 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’offrentces 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 leurcontrat standard. En effet, ces sociétés font de leur mieux pour procéder à lavérification de l’identité des individus et des entreprises qui leur achètent descertificats numériques. Mais en aucun cas elle ne garantissent que leursméthodes sont infaillibles et en fait, vous ne pourrez pas les attaquer siquelqu’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 macrosUne fois muni de votre certificat numérique, vous pouvez signer un classeur encliquant sur Outils, Options, Sécurité, Signatures numériques, Ajouter, <nom-certificat>, OK. Une fois que vous avez cliqué sur Ajouter, la boîte de dialogueSélectionner un certificat (voir figure 3.6) s’affiche, avec une liste des certificatsexistants sur votre ordinateur. Vous pouvez alors cliquer sur le nom du certificatavec lequel vous voulez signer le classeur (ou cliquer sur Afficher le certificatpour voir les détails au cas où plusieurs de vos certificats auraient le même nom).Cliquez sur OK pour signer votre classeur.

Page 62: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

44

Partie 2 : Visual Basic pour Applications

Chapitre 3

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 lecode 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îtede dialogue Signature numérique qui s’affiche lorsque vous voulez signer ducode VBA vous permet d’utiliser un certificat qui a déjà expiré. Le fait d’afficherles certificats arrivés à expiration n’est pas très judicieux. En effet, comme vous leverrez 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 unproblè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 lefait que le logiciel arrive à détecter la présence d’un problème avant que l’onpuisse 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 duNiveau de sécurité élevé. Lorsqu’il est activé, Excel devient particulièrementméfiant quant à l’exécution des macros. Si le logiciel ne reconnaît pas la sourcequi a signé les macros dans le classeur que vous vous apprêtez à ouvrir, la routinede sécurité vous demande si vous êtes d’accord pour faire confiance à la sourcesignataire 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 quevous 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-

Page 63: EXCEL Microsoft Office Excel

Cha

pitr

e 3

Exploration de Visual Basic pour Applications

45

Partie 2 : Visual Basic pour Applications

jours faire confiance aux macros provenant de cet éditeur et cliquez sur Activerles 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 serezpeut-ê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 macrosinteragissent 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 duré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 numérique.

Excel désactive les macros et ouvre le classeur.

La macro a une signature valide provenant d’une source approuvée.

Excel active les macros et ouvre le classeur.

La macro a une signature valide provenant d’une source inconnue.

Excel affiche les informations relatives au 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 valide, indiquant que le fichier a peut-être été endommagé par un virus.

Excel désactive les macros et vous avertit de la présente éventuelle d’un virus.

La signature ne peut être vérifiée car la clé publique est manquante ou ne peut être localisée sur un serveur de clés.

Excel désactive les macros et indique qu’il n’a pas pu vérifier la signature.

La macro a été signée avec un certificat qui a expiré ou qui a été révoqué.

Excel désactive les macros et indique que le certificat est non valide.

Page 64: EXCEL Microsoft Office Excel
Page 65: EXCEL Microsoft Office Excel

47

Partie 2 : Visual Basic pour Applications

Chapitre 4

Démarrage de la programmation VBA

Introduction à Visual Basic Editor . . . . . . . . . . . . . . . . . 47Gestion des fenêtres Code. . . . . . 59Développement de projets avec l’Explorateur de projets . . . . . . . . 62Déclaration des variables, constantes et types de données . 64Assignation de valeurs aux variables . . . . . . . . . . . . . . . . 71Tableaux . . . . . . . . . . . . . . . . . . . . 72

Création de tableaux dynamiques. . . . . . . . . . . . . . . . . 73Écriture à l’écran et acceptation des entrées utilisateur . . . . . . . . 74Définition de variables objet . . . . 81Création de types de données personnalisés . . . . . . . . . . . . . . . 81Contrôle de la progression du programme . . . . . . . . . . . . . . . . . 82Gestion des erreurs . . . . . . . . . . . 91

Introduction à Visual Basic EditorVisual Basic Editor est un outil puissant qui étend les capacités et la polyvalencedes macros bien au-delà du simple enregistrement d’actions. Pour comprendrele fonctionnement de Visual Basic Editor, ce chapitre en examine toutes lesfacettes : 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 dudébut à la fin. En revanche, si vous connaissez déjà Visual Basic Editor, passezdirectement aux sections qui vous intéressent.

Ouvrir Visual Basic EditorÀ l’instar de la majorité des applications Windows, il existe plusieurs méthodespour ouvrir Visual Basic Editor. Dans le menu Outils, choisissez Macros, VisualBasic 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 dedialogue Macro. Dans cette boîte de dialogue, sélectionnez la macro de votrechoix et cliquez sur le bouton Modifier. Vous pouvez également ouvrir la boîte dedialogue Macro en appuyant sur ALT+F8.

Page 66: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

48

Partie 2 : Visual Basic pour Applications

Chapitre 4

Tour d’horizon de Visual Basic EditorLorsque vous ouvrez Visual Basic Editor, vous utilisez la fenêtre Explorateur deprojets 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 unearborescence dont le fonctionnement est similaire à celui de l’arborescence del’Explorateur Windows. Le classeur sur lequel vous travaillez, ainsi que toutautre classeur ou composant externe ouvert, constitue l’objet racine, ou objet debase, 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, quenous avons étudiés au chapitre 3, des modules, qui contiennent le code de macroassocié à la feuille de calcul, des modules de classe, qui définissent les objets crééspour 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 etFeuil3), ainsi que le classeur (ThisWorkbook), se trouvent dans le dossier Micro-soft Excel Objets. Toutes les macros programmées en VBA ou enregistrées setrouvent également dans le dossier Modules. Les modules de classe et les feuilless’affichent respectivement dans un dossier Modules de classe ou Feuilles.

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-

Page 67: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

49

Partie 2 : Visual Basic pour Applications

ble, bien que les feuilles de calcul possèdent d’autres propriétés, que l’on modifiegé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 seind’Excel. Bien que les deux noms puissent sembler similaires en raison desrègles de nommage appliquées par défaut par Visual Basic Editor, il se peutqu’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 pasplus de 31 caractères de long).

La fenêtre Code constitue la plus grande fenêtre de Visual Basic Editor. Sa partiesupé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 uniquementsur du code, la liste affiche l’objet par défaut Général. Dans la deuxième listedéroulante, intitulée Procédure, vous sélectionnez des macros au sein dumodule. À mesure que vous ajoutez et supprimez des macros du module, ellessont également ajoutées et supprimées de la liste Procédure.

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 laliste 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êtreCode et place le point d’insertion dans la macro affichée.

Page 68: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

50

Partie 2 : Visual Basic pour Applications

Chapitre 4

Dans le menu Insertion, cliquez sur UserForm pour remplacer la fenêtre Codepar 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 passez de l’écriture de code VBA à la création de feuilles.

À l’instar de toute autre application Windows, Visual Basic Editor possède unebarre 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êtreet Aide sont similaires à celles des autres applications Windows. Le reste desmenus, cependant, contient des fonctionnalités dans Visual Basic Editor.

Menu AffichageLe menu Affichage permet d’ouvrir et/ou d’atteindre une fenêtre spécifique ausein de Visual Basic Editor. À partir de la fenêtre Visual Basic Editor, vous pouvezouvrir 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.

Page 69: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

51

Partie 2 : Visual Basic pour Applications

Menu InsertionLe menu Insertion permet d’insérer de nouvelles procédures, des modules oudes feuilles au sein du projet. Le tableau 4.2 récapitule les éléments disponiblesdans le menu Insertion de Visual Basic Editor.

Élément DescriptionObjet 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 d’objets

Affiche ou active la fenêtre Explorateur d’objets.

Fenêtre Exécution Affiche ou active la fenêtre Exécution.

Fenêtre Variables locales

Affiche ou active la fenêtre Variables 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 projets

Affiche ou active la fenêtre Explorateur de 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.

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.

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.

Tableau 4-1. Éléments de menu disponibles dans le menu Affichage de Visual Basic Editor (Suite)

Page 70: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

52

Partie 2 : Visual Basic pour Applications

Chapitre 4

Menu FormatLe menu Format contient les commandes de placement et de mise en forme desobjets dans les feuilles. Le tableau 4.3 récapitule les éléments du menu Format.

Élément DescriptionModule 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.

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

Affiche le sous-menu Espacement horizontal qui permet 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 boutons

Affiche le sous-menu Réorganiser les boutons qui 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.

Tableau 4-2. Éléments de menu disponibles dans le menu Insertion de Visual Basic Editor (Suite)

Page 71: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

53

Partie 2 : Visual Basic pour Applications

Menu DébogageLe 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 menuDébogage.

Élément DescriptionDissocier 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.

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.

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 curseur

Permet d’exécuter le code jusqu’à la ligne où se trouve 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.

Tableau 4-3. Éléments de menu disponibles dans le menu Format de Visual Basic Editor (Suite)

Page 72: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

54

Partie 2 : Visual Basic pour Applications

Chapitre 4

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

Élément DescriptionBasculer le point d’arrêt

Permet de créer un point d’arrêt sur la ligne de code en 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 points d’arrêt

Permet d’effacer tous les points d’arrêt au sein du module de code.

Définir l’instruction suivante

Permet de définir la prochaine ligne de code à exécuter.

Afficher l’instruction suivante

Permet de passer rapidement à la ligne de code à exécuter suivante. Cette commande est intéressante si vous parcourez le code et souhaitez revenir rapidement à ligne de code exécutable suivante.

Tableau 4-5. Éléments de menu disponibles dans le menu Exécution de Visual Basic Editor

Élément Description

Exécuter Sub/UserForm

Commence l’exécution de la procédure ou de la feuille en 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.

Tableau 4-4. Éléments de menu disponibles dans le menu Débogage de Visual Basic Editor (Suite)

Page 73: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

55

Partie 2 : Visual Basic pour Applications

Menu OutilsLe 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 deVisual Basic Editor, de définir les propriétés du projet en cours et de signernumériquement le projet. Le tableau 4.6 récapitule les éléments du menu Outils.

Personnaliser Visual Basic EditorVous pouvez entièrement personnaliser Visual Basic Editor et le configurer pourl’adapter à votre méthode de travail. Vous pouvez détacher les fenêtres de leurspositions par défaut et les placer où bon vous semble à l’écran, y compris sur lesdivers 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, ainsique les boutons qu’elle héberge.

Toutes les fenêtres secondaires de Visual Basic Editor possèdent un emplacementd’ancrage par défaut. Pour déplacer une fenêtre, placez le pointeur de la sourissur la barre de titre de la fenêtre et faites glisser vers l’emplacement de votrechoix. 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).

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 supplémentaires

Affiche la boîte de dialogue Contrôles supplémentaires qui 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 électronique

Affiche la boîte de dialogue Signature numérique qui permet de signer numériquement le code à l’aide de n’importe quelle signature numérique installée sur le PC.

Page 74: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

56

Partie 2 : Visual Basic pour Applications

Chapitre 4

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 etsa 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, eneffet, 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 à cellesemployées dans les autres applications Windows. Pour déplacer une barred’outils, cliquez dans une zone vide de la barre d’outils et faites-la glisser versl’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 droitdans une zone vide de la barre d’outils et choisissez Personnaliser pour afficher laboîte de dialogue Personnalisation qui permet d’ajouter ou de supprimer desboutons sur les barres d’outils visibles. Si vous cliquez droit sur une barred’outils, vous pouvez également afficher ou masquer les barres d’outils.

La boîte de dialogue Options de Visual Basic Editor propose plusieurs optionsqui affectent son environnement. Les commandes de la boîte de dialogueOptions sont réparties sur quatre onglets : Éditeur, Format de l’éditeur, Généralet Ancrage.

L’onglet Éditeur (voir figure 4.5) est divisé en deux jeux d’options. Le premierjeu, 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

Page 75: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

57

Partie 2 : Visual Basic pour Applications

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 lasouris. 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 etLargeur de la tabulation qui définit le nombre d’espaces par tabulation. Encochant 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’optionVé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 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 semblergênant, mais cela évite l’une des erreurs de programmation les plusmystérieuse : l’erreur de la division par zéro. Voici un exemple simple de cetteerreur : vous voulez découvrir la température moyenne de la semaine. Si voustentez 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’affichagede plusieurs procédures dans la fenêtre Code et détermine le déplacement ducode avec la souris. En cochant la case Édition du texte par glisser-déplacer, vouspouvez glisser-déplacer des éléments au sein du code et de la fenêtre Code versou depuis la fenêtre Exécution et/ou la Fenêtre Espions. L’option Affichage dumodule complet par défaut définit l’affichage de la fenêtre du nouveau module :

Page 76: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

58

Partie 2 : Visual Basic pour Applications

Chapitre 4

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. Lafenêtre Code peut être entièrement personnalisée pour répondre à des besoinsparticuliers : 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 lapolice. Vous pouvez activer ou non l’option Barre des indicateurs en marge, bienqu’il soit préférable de cocher cette case car elle permet d’activer rapidement lespoints d’arrêt.

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

Au QuotidienL’onglet Général (voir figure 4.7) propose un certain nombre d’options allantdes 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 lacompilation du code. Dans la section Paramètres de la grille de la feuille, vousactivez 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 égalementactiver ou désactiver les info-bulles qui expliquent l’action des boutons de labarre d’outils.

Page 77: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

59

Partie 2 : Visual Basic pour Applications

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 moduleet de la feuille se ferment automatiquement lorsque vous réduisez le projet dansla fenêtre Explorateur de projets. Si vous cochez la case Avertir avant la perted’é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électionnezl’option Arrêt sur toutes les erreurs, vous obligez Visual Basic Editor à basculeren mode Arrêt pour toutes les erreurs, que la récupération d’erreur soit ou nonactive dans les procédures en cours d’exécution. Si vous sélectionnez l’optionArrê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 codeimpliqué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 BasicEditor surligne la ligne de code dans la procédure appelante et non dans lemodule de classe.

Les deux dernières options de l’onglet Général concernent la compilation desprocédures. Pour accélérer l’exécution, cochez les deux options Compilation surdemande et Compilation en arrière-plan. La première option permet d’exécuterplus rapidement l’application en compilant le code à la volée et non en une foiset 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 CodeIl est tout aussi important d’organiser le code d’un projet Excel que les fichiers devotre disque dur. Heureusement, l’Explorateur de projets de Visual Basic Editor

Page 78: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

60

Partie 2 : Visual Basic pour Applications

Chapitre 4

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 soupleque l’Explorateur Windows, mais il regroupe les différents éléments d’un projetdans un dossier commun. Cette organisation classique simplifie la localisationdes modules, modules de classe, feuilles ou de tout autre objet Excel.

Gérer les fenêtresChaque module, module de classe ou feuille s’affiche dans sa propre fenêtreCode. Autrement dit, à mesure que vous ajoutez des modules, le nombre de fenê-tres sur lesquelles vous travaillez augmente. Quel que soit le nombre de modulesd’un projet, il est inutile de les ouvrir tous pour travailler sur le projet : ouvrezuniquement le module ou la feuille à modifier.

Pour simplifier la navigation au sein des diverses fenêtres, Visual Basic Editorpropose quelques outils pour ouvrir, basculer entre et fermer les fenêtres. Pourouvrir 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 autremodule s’il est ouvert.

Pour basculer entre les différentes fenêtres ouvertes, utilisez le menu Fenêtrepour sélectionner une fenêtre. Vous pouvez également faire défiler les fenêtresvers l’avant en appuyant sur CTRL+F6 ou vers l’arrière en appuyant surMAJ+CTRL+F6. Pour fermer une fenêtre, cliquez sur le bouton Fermer ouappuyez sur CTRL+F4.

Il est également possible de réduire ou de redimensionner les fenêtres pour affi-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 placeren 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 codeIl 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 oufeuille. Le choix du conteneur dépend des tâches effectuées par le code que vousy insérer. Bien qu’il soit possible de placer tout le code au sein d’un uniquemodule, 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 declasse ou feuille) dans le menu Insertion ou avec le bouton Ajouter de la barred’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 uneprocédure (voir figure 4.8) qui vous invite à saisir le minimum d’informationsnécessaires à la création d’une procédure.

Page 79: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

61

Partie 2 : Visual Basic pour Applications

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 uneprocédure plus loin dans ce chapitre.

Notes sur le style de programmation et la lisibilité du codeLes programmeurs sont issus de formations diverses, chacune possédant sonpropre style d’écriture du code. Ceux qui travaillent ou ont travaillé dans degrandes sociétés de création de logiciels suivent un schéma strict, spécifié parl’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 ducode facile à lire et à comprendre. Même si vous comprenez aujourd’hui le codeque vous écrivez, vous ou un autre programmeur pourriez être obligé de lemodifier à l’avenir. À moins de posséder une mémoire photographique, vouspourriez é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 unmacro qui ouvre un classeur, demandez les informations à l’utilisateur,effectuez les changements, puis enregistrez et fermez le classeur. Divisezensuite la macro en plusieurs procédures : une par tâche. Créez ensuiteune procédure principale qui appelle les autres procédures. Ce format deconstruction en une série de sous-procédures appelées par la procédureprincipale 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 lafenêtre Code, saisissez un espace suivi d’un caractère de soulignementpour indiquer que le code de la ligne suivante constitue la suite de la ligneen cours. La procédure PermissionLoop, que nous verrons en détails dans lasection « Boucles logiques », plus loin dans ce chapitre, est la premièred’une longue liste de procédures qui exploitent cette convention.

Page 80: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

62

Partie 2 : Visual Basic pour Applications

Chapitre 4

● Choisissez une convention de nommage et tenez-vous y. Projet, procédu-res, variables et autres éléments de programmation doivent être libellésavec un nom significatif qui décrit l’emploi de l’élément. Il existe un grandnombre de conventions de nommage, la majorité constituant une formede 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îtred’œ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 Notationdans la zone de recherche.

● Choisissez des noms concis. Le nom doit être descriptif mais il ne doit pasdé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 defrappe.

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 denouveaux modules, les supprimez et les copiez d’un projet à un autre. La seuleaction que vous ne pouvez pas entreprendre dans l’Explorateur de projets estcréer un projet (pour cela, vous devez créer un nouveau classeur).

Créer des modules VBAToutes les macros et procédures sont stockées dans un module VBA. Un projetpeut héberger plusieurs modules, ce qui peut s’avérer indispensable selon lacomplexité 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.9montre 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 etsélectionnez un fichier texte qui contient le code à utiliser dans un module ouune feuille. Visual Basic Editor crée un nouveau module. En conséquence, sauf sile code importé constitue une procédure complète, il ne s’exécute pas tant quevous n’avez pas ajouté la notation Sub…End Sub.

Page 81: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

63

Partie 2 : Visual Basic pour Applications

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

Supprimer des modules VBAPour supprimer un module devenu inutile, sélectionnez-le dans l’Explorateur deprojets et dans le menu Fichier, choisissez Supprimer <NomModule>, <NomMo-dule> étant le nom du module à supprimer. Avant de supprimer un module,Visual Basic Editor vous demande si vous souhaitez l’exporter dans un fichiertexte (voir figure 4.10), ce qui permet de le sauvegarder avant de le supprimerdé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.

Page 82: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

64

Partie 2 : Visual Basic pour Applications

Chapitre 4

Copier des modules entre projetsL’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 lemodule de destination. Une fois que le pointeur de la souris se trouve dans leprojet de destination, il change de forme : d’un cercle barré il se transforme enflèche équipée d’une boîte et d’un signe plus (voir figure 4.11).

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 lemême nom, Visual Basic Editor renomme le module copié en faisant suivre sonnom d’un nombre en commençant à 1. En outre, si le projet de destination necontient aucun module du type de celui copié, Visual Basic Editor crée unmodule 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 stockagetemporaire 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 possiblede stocker en mémoire une valeur qui ne changera pas. Une telle valeur senomme une constante. Les variables contiennent des valeurs de différents typesde données, spécifiés lorsque l’on nomme, ou déclare, la variable. Pour éviter les

Page 83: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

65

Partie 2 : Visual Basic pour Applications

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

Déclarer des variablesPour 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 commevariable type. Pour déclarer plusieurs variables sur une ligne, séparez-les avecune virgule :

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

Définir les types de donnéesDéclarez toujours les variables avec un type de données spécifiques. Ce type dedonnées détermine les valeurs que l’on peut stocker dans la variable ainsi que laquantité de mémoire nécessaire pour stocker la valeur. VBA propose différentstypes de données pour gérer les nombres, les chaînes, les dates et les heures, lesvaleurs booléennes et les objets. Vous pouvez, en outre, déclarer votre propretype 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.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

Type Plage DescriptionStockage nécessaire

Byte 0 à 255 Nombre entier non signé

1 octet

Currency –922 337 203 685 477,5808 à 922 337 203 685 477,5807

Nombre signé en virgule 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.

8 octets

Page 84: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

66

Partie 2 : Visual Basic pour Applications

Chapitre 4

Définir les constantesPour certaines procédures, vous devez référencer une valeur particulière quichange 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 foispour 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 fonctionsdisponibles. 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 lefonctionnement est similaire à celui de l’instruction Dim, excepté que vous devezfournir la valeur de la constante et que vous ne pouvez déclarer qu’une constantepar ligne. Les lignes suivantes déclarent deux constantes, la première est unevaleur Byte comprenant le nombre de jours au mois de décembre et la deuxièmeest une variable Single comprenant une valeur acceptée de pi.

Const conJoursDec as Byte = 31

Type Plage DescriptionStockage nécessaire

Decimal 79 228 162 514 264 337 593 543 950 335 sans séparateur décimal et ±7,9228162514264337593543950335 avec 28 chiffres après le séparateur décimal.

Ne peut être déclaré directement dans VBA. Nécessite l’emploi d’un type de données Variant.

12 octets

Double Valeurs négatives :–1,79769313486231E308 à –4,94065645841247E-324Valeurs positives :4,94065645841247E–324 à 1,79769313486231E308

Nombre signé à virgule flottante en double précision

8 octets

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 :–3,402823E38 à –1,401298E–45Valeurs positives :1,401298E–45 à 3,402823E38

Nombre signé à virgule flottante en double précision

4 octets

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

Page 85: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

67

Partie 2 : Visual Basic pour Applications

Const conPi as Single = 3,1415929

Gérer les chaînesLes types de données ne sont pas nécessairement numériques. Avec le type dedonnées String, les variables peuvent également contenir des valeurs textuelles.Les chaînes de texte sont de longueur variable ou fixe. Les premières peuventcontenir environ 2 milliards (2^31) de caractères, en fonction de la mémoiredisponible, 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 instructionDim, comme pour les valeurs numériques. Les chaînes de longueur fixe ajoutentdu code qui précise la longueur de la chaîne. La première ligne du fragment decode 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 StringDim MaChaineFixe as String * 25

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

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

Remarque La longueur des chaînes fixes doit être exactement de25 caractères. En conséquence, Visual Basic Editor ajoute des espaces outronque la chaîne à la longueur correcte.

Gérer les dates et les heuresOn stocke les dates et les heures dans le type de données Date. La plage de datesque vous pouvez stocker débute le 1er janvier 100 et se termine le31 décembre 9999 pour toutes les heures de 0:00:00 à 23:59:59. Bien qu’unevariable Date puisse contenir la date et l’heure, si un seul de ces éléments vous estutile, omettez l’autre.

Pour assigner des valeurs à une variable Date, délimitez une chaîne littéralereconnaissable par le signe dièse (#). VBA reconnaît les dates et les heures quelque soit leur format, mais il est préférable de rester aussi explicite que possiblepour s’assurer de l’utilisation de la valeur correcte. Voici quelques exemple dedates et d’heures reconnus par VBA.

MaDate = #15 Juillet 2004#DateDepart = #Avril 8, 2001#

Page 86: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

68

Partie 2 : Visual Basic pour Applications

Chapitre 4

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 surdeux chiffres et se sert de 2029 comme année pivot. Toutes les années surdeux chiffres entre 00 et 29 sont reconnues comme faisant partie des années2000. Les années restantes, 30 à 99, sont considérées comme faisant partiedes années 1900. Il est préférable de préciser les quatre chiffres de l’annéepour é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éedans le type de données Variant. Les variables Variant peuvent héberger touttype de données à l’exception des chaînes de longueur fixe et sont imposées pourcertains types de données, comme Currency.

Si vous utilisez les variables Variant, VBA recherche le type de données le plusadapté aux données stockées dans la variable, mais son choix n’est pas toujours lebon. Si vous assignez une valeur de 64 * 1024 à une variable Variant, vous obte-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 commeInteger. Le résultat réel, 65536, est trop grand pour un type de données Integer etproduit 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, sil’on convertit explicitement une des valeurs en type de données Long, VBA placele résultat comme Long évitant ainsi l’erreur.

VBA propose des fonctions pour convertir les valeurs en n’importe quel type dedonnées numériques. À l’heure de convertir deux types de données, tenezcompte du niveau de précision employé par chaque type et des limites de chaquetype. 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 lavaleur. En outre, la conversion inverse, autrement dit, reconvertir la variable enSingle, 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 dedonnées retourné et les règles d’arrondi. L’argument expression fourni aux fonc-

Page 87: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

69

Partie 2 : Visual Basic pour Applications

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.

Portée et durée de vie des variablesAu sein des modules et des procédures, les variables possèdent une durée de vieet une visibilité définies. La durée de vie d’une variable débute au moment de sadéclaration et se termine lorsque l’exécution de la procédure ou du module quia 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 leursvaleurs durant l’exécution de la deuxième procédure.

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.

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.

Page 88: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

70

Partie 2 : Visual Basic pour Applications

Chapitre 4

Remarque Si l’on utilise exclusivement le terme variable dans cette sectiondans 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. Lesvariables statiques d’une procédure conservent leurs valeurs entre les appels deprocé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 desvariables 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 autresprocé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 lemême nom, ces deux variables constituant des entités séparées et uniquementvisibles 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 * 74End Sub

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

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 signifieque intResult prend la valeur 6438 lorsque la troisième ligne s’exécute. DansProcedure2, la valeur de intCounter n’a pas été définie, elle conserve donc lavaleur 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 auniveau du module. Les variables déclarées au niveau du module peuvent êtreexploitées par n’importe quelle procédure de ce module. Pour déclarer unevariable de module, saisissez l’instruction de déclaration de la variable dans lasection Déclarations du module (après les instructions Option et avant toute pro-cédure), comme le montre la figure 4.12.

Page 89: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

71

Partie 2 : Visual Basic pour Applications

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é,il est préférable de les déclarer avec Private au lieu de Dim. Les deux déclarationssuivantes illustrent la différence entre une déclaration Public et Private :

Private intCeModuleUniquement as IntegerPublic intTousLesModules as Integer

Assignation de valeurs aux variablesUne 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 del’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, tellequ’une équation mathématique.

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

Page 90: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

72

Partie 2 : Visual Basic pour Applications

Chapitre 4

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 conservezle total en cours des heures travaillées, vous pouvez actualiser le total des heurestravaillées en ajoutant le nombre d’heures travaillées pendant la journée encours.

ToursTotaux = TourCompteurTotalHeuresTravaillees = TotalHeuresTravaillees + HeuresTravailleesAujourdhui

TableauxUn tableau est un ensemble de valeurs du même type de données. Bien que letableau contienne plusieurs valeurs, VBA le considère comme une seule variable,ce qui offre une certaine souplesse. Vous pouvez exploiter le tableau entier ouuniquement un élément du tableau. Pour utiliser un élément individuel d’untableau, 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 à laposition 0, autrement dit, on travaille toujours avec un index inférieur de 1 parrapport à 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 avecl’instruction Option Base. L’instruction Option Base doit être placée dans la sec-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 lemontre l’exemple suivant :

Option Base 1

Créer un tableauPour créer un tableau, on se sert de la même procédure que pour définir unevariable : on crée une instruction Dim, Private, Public ou Static, suivie du nomdu tableau et du type de données stockées dans le tableau. La définition d’unelimite supérieure dans la déclaration du tableau constitue le seule différenceentre 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 untableau 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 unelimite 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

Page 91: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

73

Partie 2 : Visual Basic pour Applications

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

Dim strMois(12) as String

Outre l’instruction Option Base, vous pouvez positionner la limite inférieured’un tableau sur une valeur autre que 0 ou 1 en la déclarant explicitement à lacréation du tableau avec une clause To. Par exemple, pour déclarer un tableau quicontient uniquement les trois mois d’été, utilisez l’instruction suivante :

Dim strMoisEte (6 To 8) as String

Créer des tableaux multidimensionnelsTous les tableaux que nous avons étudiés jusqu’ici étaient de simples tableauxunidimensionnels. Vous pouvez créer des tableaux multidimensionnels compre-nant jusqu’à 60 dimensions, quoi qu’il soit rare de trouver une raison d’exploiterplus de 3 ou 4 dimensions.

Pour déclarer un tableau multidimensionnel, on sépare les limites de chaquedimension par des virgules. Un tableau bidimensionnel qui contiendrait unevaleur 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. Prenonsl’exemple d’un tableau bidimensionnel où la première dimension représente leslignes du tableau et la deuxième dimension représente les colonnes, comme dansune 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 dematé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 dynamiquesDans 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’onajoute aux procédures.

Pour déclarer un tableau dynamique, on omet la limite dans l’instruction dedéclaration. Par exemple, pour créer un tableau dynamique test, servez-vous del’instruction suivante :

Dim intTableauTest() as Integer

Page 92: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

74

Partie 2 : Visual Basic pour Applications

Chapitre 4

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, ouredimensionner, un tableau le nombre d’éléments selon les besoins. L’instructionReDim 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 lesdonnées contenues dans ses éléments. Pour augmenter le nombre d’élémentsque peut contenir un tableau sans perdre les données qu’il contient, vous devezajouter 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 suivantscréent un tableau qui contient les noms des quatre principales zones horaires ducontinent américain et assignent ces noms au tableau :

Option Base 1Dim strZonesHorairesUS(4) as StringstrZonesHorairesUS(1) = "Eastern"strZonesHorairesUS(2) = "Central"strZonesHorairesUS(3) = "Moutain"strZonesHorairesUS(4) = "Pacific"

Pour retrouver une valeur dans un tableau, on procède de manière similaire : onspé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’étatconstituent 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 etdemander des informations à un utilisateur, ce qui simplifie l’utilisation desmacros puisqu’elles présentent une interface familière à l’utilisateur.

Page 93: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

75

Partie 2 : Visual Basic pour Applications

Créer une boîte de messageServez-vous de la fonction MsgBox (message box, boîte de message) pour afficherde petits messages informationnels ou poser des questions simples. Les boîtes demessage 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 pouvezemployer des boîtes de message.

● Informer l’utilisateur d’une action qui va avoir lieu et éventuellement luipermettre d’annuler l’action ou de choisir une action différente.

● Informer l’utilisateur d’une condition d’erreur qui s’est produite et luipermettre d’entreprendre une action corrective.

● Informer l’utilisateur qu’une tâche particulière est terminée avec succès ounon. Une boîte de message peut informer l’utilisateur du déroulementexact de la tâche.

L’un des principaux avantages des boîtes de message est qu’elles permettent depré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 boutonsparmi lesquels l’utilisateur doit opérer un choix, ce qui limite le nombred’options offertes.

● Les boutons existent uniquement sous forme prédéfinie : vous ne pouvezpas 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 plusd’options/d’informations à l’utilisateur.

Malgré ces limites, la boîte de message reste un outil particulièrement pratiquepour le programmeur. Voici la syntaxe d’une boîte de message.

MsgBox (pppprrrroooommmmpppptttt[, bbbbuuuuttttttttoooonnnnssss] [, ttttiiiittttlllleeee][, hhhheeeellllppppffffiiiilllleeee, ccccoooonnnntttteeeexxxxtttt]) as Integer

● prompt Un argument indispensable de la fonction MsgBox qui contient letexte affiché dans la boîte de message. La longueur maximale du texte estde 1024 caractères, selon la largeur des caractères employés. Si le textes’étend sur plusieurs lignes, spécifiez les retours à la ligne en insérant unretour chariot avec la constante vbCr, (Chr$(13)), un saut de ligne avec laconstante vbLf, (Chr$(10)) ou une combinaison retour chariot/saut deligne avec la constante vbCrLf.

Page 94: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

76

Partie 2 : Visual Basic pour Applications

Chapitre 4

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

● buttons Argument numérique optionnel qui sert à spécifier les boutons etl’icône affichée dans la boîte de message. En additionnant la valeur desoptions 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 lesoptions. 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 toucheEntré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’aideemployé pour l’aide contextuelle sur la boîte de message. Si helpfile estdé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é parl’utilisateur. Le tableau 4.10 liste ces valeurs.

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.

Page 95: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

77

Partie 2 : Visual Basic pour Applications

Constante intrinsèque Valeur DescriptionvbQuestion 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. 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.

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

Page 96: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

78

Partie 2 : Visual Basic pour Applications

Chapitre 4

Si la boîte de message contient un bouton Annuler, appuyer sur la touche Echapproduit le même résultat que cliquer sur ce bouton. Sélectionnez exactementune option par groupe. Si vous sélectionnez plusieurs options, Excel utilise celledont 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 letexte et un bouton OK. L’instruction ne contenant pas de valeur pour le titre dela boîte de message, celui-ci prend la valeur pas défaut, autrement dit le nom del’application (voir figure 4.13).

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 variablesde chaîne. Le fragment de code suivant affiche une boîte de message contenantdeux 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

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

Page 97: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

79

Partie 2 : Visual Basic pour Applications

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 desdirectives suivantes issues des directives de l’interface utilisateur Windows deMicrosoft :

● Utilisez l’icône d’information pour fournir à l’utilisateur le résultat d’unecommande 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 decontinuer, par exemple, lorsque les données risquent d’être définitivementmodifiées ou supprimées.

● Employez l’icône de message critique pour informer l’utilisateur d’uneerreur ou d’un problème critique qui doit être corrigé avant de poursuivrele 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 saisieUne boîte de saisie est similaire à une boîte de message en ce qu’elle affiche dutexte, mais elle présente une fonctionnalité supplémentaire : elle accepte desré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 saisirune réponse. À l’instar d’une boîte de message, la boîte de saisie présente uneinvite et un titre, mais aucune icône ne s’affiche et les boutons OK et Annulersont toujours présents. La figure 4.15 montre une boîte de saisie qui demande lenom 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.

Page 98: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

80

Partie 2 : Visual Basic pour Applications

Chapitre 4

InputBox (pppprrrroooommmmpppptttt [, ttttiiiittttlllleeee][, ddddeeeeffffaaaauuuulllltttt][, xxxxppppoooossss][, yyyyppppoooossss][, hhhheeeellllppppffffiiiilllleeee, ccccoooonnnntttteeeexxxxtttt]) as String

● prompt Argument obligatoire de la fonction InputBox qui contient letexte affiché dans la boîte de saisie. La longueur maximale du texte est de1024 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 unretour chariot avec la constante vbCr, un saut de ligne avec la constantevbLf ou une combinaison retour chariot/saut de ligne avec la constantevbCrLf. Vous pouvez également utiliser les constantes intrinsèquesVisual Basic, vbCr, vbLf et vbCrLf pour représenter les caractères.

● title Expression de chaîne optionnelle qui indique le texte affiché dans labarre 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 textecomme 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 detwips 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 uneboîte de saisie à un demi pouce du bord gauche de l’écran, vous assignez lavaleur 720 à xpos.

● ypos Expression numérique optionnelle qui représente le nombre detwips entre le bord supérieur de l’écran et le bord supérieur de la boîte desaisie. 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’aideemployé 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 zonede texte est vide ou que l’utilisateur appuie sur le bouton Annuler, la chaîneretournée est vide.

La valeur retournée par une boîte de saisie est généralement stockée dans unevariable 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, maisnous aurions pu employer des littéraux ou des constantes.

Page 99: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

81

Partie 2 : Visual Basic pour Applications

Sub VilleNaissance()Dim strResponse as String, strPrompt as String, strTitle as StringstrResponse = "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 objetAvec 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, sivous 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 dedéclarer une variable objet. Avec l’instruction Dim, vous fournissez le nom de lavariable puis vous indiquez le type d’objet à créer, comme dans le fragment decode 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 versun 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 doncfournir l’objet à assigner à la variable. Pour ce faire, vous utilisez la commandeSet. La commande suivante définit la variable objet monObj pour qu’elle pointevers la première feuille de calcul :

Set monObj = Worksheets(1)

Création de types de données personnalisésVBA 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, vousaurez 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 horizontaleset verticales d’un point sur une carte, au lieu de stocker les valeurs dans desvariables séparées. Avec l’instruction Type, vous définissez un nouveau type dedonnées qui contiendra les deux coordonnées.

Private Type SituationCarte sglHorizontal as Single sglVertical as SingleEnd Type

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

Page 100: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

82

Partie 2 : Visual Basic pour Applications

Chapitre 4

Dim maSituationCarte as SituationCartemonPointCarte.sglHorizontal = 29,57monPointCarte.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 WithPour rendre votre code plus lisible et plus court, servez-vous de la commandeWith...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énementappelés dans la procédure. Une fois l’objet défini dans la ligne de code With, vousajoutez 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 lesen-têtes de colonnes parallèles au bord le plus court du papier) en paysage (avecles 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 WithEnd Sub

Contrôle de la progression du programmeVBA 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 duprogramme 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 progressiondescendante. VBA propose plusieurs méthodes pour répéter certaines sectionsde code, sauter des sections de code et prendre des décisions quant aux sectionsà exécuter.

Instructions de sélectionL’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 prendreune 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-

Page 101: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

83

Partie 2 : Visual Basic pour Applications

sion est True, le code effectue l’une des actions définies. Dans le cas contraire, ileffectue 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 ccccoooonnnnddddiiiittttiiiioooonnnn Then [ ssssttttaaaatttteeeemmmmeeeennnnttttssss ][ ElseIf eeeellllsssseeeeiiiiffffccccoooonnnnddddiiiittttiiiioooonnnn [ Then ] [ eeeellllsssseeeeiiiiffffssssttttaaaatttteeeemmmmeeeennnnttttssss ] ][ Else [Else eeeellllsssseeeessssttttaaaatttteeeemmmmeeeennnnttttssss] ]End If

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

● statements Bloc optionnel d’une ou de plusieurs instructions à exécuter sicondition est True.

● elseifcondition Expression obligatoire si ElseIf est présent et qui prend lavaleur 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-ter si aucune condition ou elseifcondition est True.

● End If Élément obligatoire dans la forme multilignes qui termine le blocIf…Then.

Avec les instructions If...Then...Else vous devez employer les opérateurs de com-paraisons pour construire les instructions conditionnelles. Les opérateurs decomparaison comparent plusieurs valeurs et décident si les valeurs sont égales lesunes par rapport aux autres ou si l’une est supérieure à l’autre. Ils retournentensuite 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.

Page 102: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

84

Partie 2 : Visual Basic pour Applications

Chapitre 4

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 devoter :

If intAge >= 18 Then boolVoteAutorise = TrueElse boolVoteAutorise = FalseEnd 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

Instructions Select Case

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

Voici la syntaxe d’une instruction Select Case.

Select [Case] tttteeeessssttttccccoooonnnnddddiiiittttiiiioooonnnn [Case eeeexxxxpppprrrreeeessssssssiiiioooonnnnlllliiiisssstttt [ ssssttttaaaatttteeeemmmmeeeennnnttttssss ] [Case Else eeeellllsssseeeessssttttaaaatttteeeemmmmeeeennnnttttssssEnd Select

● testcondition Expression obligatoire qui doit prendre pour valeur l’un destypes 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 :

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.

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

Page 103: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

85

Partie 2 : Visual Basic pour Applications

● Expression1 To Expression2 Utilisé pour représenter une plage de valeursallant de Expression1 à Epression2. Expression1 doit être inférieur àExpression2.

● [Is] comparisonoperator Expression comparisonoperator sert à indiquerune restriction sur la valeur de Expression.

● Expression Les expressions de expressionlist peuvent être de n’importequel 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 testexpressioncorrespond à 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 Casepour 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" intJours = 31

End Select

Ce fragment constitue un exemple simple qui spécifie le nombre de jours dansun 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 lenombre 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

Page 104: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

86

Partie 2 : Visual Basic pour Applications

Chapitre 4

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

BouclesIl 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érativesLes 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 essentiellementpour compter et répond aux besoins des tableaux. Voici la syntaxe d’une boucleFor...Next.

For ccccoooouuuunnnntttteeeerrrr = ssssttttaaaarrrrtttt To eeeennnndddd [Step sssstttteeeepppp] [ssssttttaaaatttteeeemmmmeeeennnnttttssss] [Exit For] [ssssttttaaaatttteeeemmmmeeeennnnttttssss]Next ccccoooouuuunnnntttteeeerrrr

● counter Variable numérique obligatoire utilisée comme compteur. Il peuts’agir d’une valeur Boolean ou d’un membre de tableau.

● start Valeur obligatoire employée comme point de départ du tableau.

● 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 ounégative. Sa valeur par défaut est 1.

● statements Une ou plusieurs lignes d’instructions optionnelles exécutéespendant chaque itération de la boucle.

● Exit For Instruction optionnelle employée pour quitter prématurément laboucle. 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 boucleFor...Next.

Vous pouvez omettre la variable counter dans l’instruction Next, mais ce n’est pasrecommandé. En incluant le compteur, vous vous protégez davantage contre leserreurs de programmation.

Comme nous l’avons étudié précédemment, la boucle For...Next assure qu’unnombre donné de répétitions est réalisé. Supposons que vous disposiez d’untableau contenant 26 éléments et que vous vouliez définir chaque élément par lalettre de l’alphabet correspondante. La boucle For...Next constitue le meilleur

Page 105: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

87

Partie 2 : Visual Basic pour Applications

moyen d’y parvenir. Le code suivant crée un tableau de 26 membres, assigne unelettre de l’alphabet à chaque élément puis construit une boîte de message quiaffiche ces éléments.

Sub TableauAlphabet()Dim strABC (1 To 26) as StringDim intCounter as IntegerDim strPrompt as StringFor intCounter = 1 to 26 strABC(intCounter) = Chr$(intCounter + 64)Next intCounterstrPrompt = "Le tableau strABC contient les valeurs suivantes :" & vbCrLfFor intCounter = 1 to 26 strPrompt = strPrompt & strABC(intCounter)Next intCounterMsgBox strPromptEnd Sub

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

Dim strABC(100 To 101, 1 To 26) As StringDim intCounter1 As Integer, intCounter2 As IntegerDim strPrompt as StringFor intCounter1 = 100 To 101 For intCounter2 = 1 To 26 strABC(intCounter1, intCounter2) = Chr$(intCounter2 + 64) Next intCounter2Next intCounter1strPrompt = "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) NextNext intCounter1MsgBox 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 estconcerné. Sa syntaxe est similaire à celle d’une boucle For...Next.

For Each eeeelllleeeemmmmeeeennnntttt In ggggrrrroooouuuupppp [ssssttttaaaatttteeeemmmmeeeennnnttttssss] [Exit For] [ssssttttaaaatttteeeemmmmeeeennnnttttssss]Next eeeelllleeeemmmmeeeennnntttt

Page 106: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

88

Partie 2 : Visual Basic pour Applications

Chapitre 4

● element Objet ou variable Variant obligatoire utilisé pour pointer verschaque 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éesdu tableau.

● group Collection d’objets ou tableau obligatoires contenant les élémentsaffectés par la boucle.

● statements Une ou plusieurs lignes d’instructions optionnelles exécutéespendant chaque itération de la boucle.

● Exit For Instruction optionnelle employée pour quitter prématurément laboucle. 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 boucleFor...Next.

La boucle For Each...Next représente une méthode pratique pour effectuer lamême action sur une collection d’objets (nous détaillerons les collectionsd’objets et leur utilisation aux chapitres 6, 7 et 8). Par exemple, pour renommertoutes les feuilles de calcul d’un classeur, vous pouvez utiliser une boucle ForEach...Next pour demander à l’utilisateur le nom de chaque feuille de calcul, larenommer et continuer avec la suivante jusqu’à ce que toutes les feuilles de calculsoient renommées.

Sub RenommerFeuillesCalcul()Dim maFeuilleCalcul As WorksheetDim strPrompt As String, strResult As StringDim intCounter as Integer

intCounter = 0strPrompt = "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 + 1Next maFeuilleCalculstrPrompt = "Nombre total de feuilles de calcul renommées =" & Str$(intCounter)MsgBox strPromptEnd Sub

Boucles logiquesLes 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èrepuis 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 deuxcatégories : celles qui testent la condition avant d’effectuer une action et cellesqui testent la condition après avoir effectué une action. Dans chaque catégorie,

Page 107: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

89

Partie 2 : Visual Basic pour Applications

les deux boucles diffèrent en ce que l’une boucle lorsque la condition est vraie etl’autre lorsque la condition est fausse.

Les boucles Do While…Loop et Do Until…Loop testent la condition avantd’effectuer l’action de la boucle. La différence entre les deux boucles est que laboucle Do While effectue l’action si la condition est vraie et Do Until effectuel’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 quilui correspond au mieux.

Comme le montre le code suivant, la syntaxe des deux boucles est simple :

Do While ccccoooonnnnddddiiiittttiiiioooonnnn[ssssttttaaaatttteeeemmmmeeeennnntttt][Exit DDDDoooo][ssssttttaaaatttteeeemmmmeeeennnntttt]LoopetDo Until ccccoooonnnnddddiiiittttiiiioooonnnn[ssssttttaaaatttteeeemmmmeeeennnntttt][Exit DDDDoooo][ssssttttaaaatttteeeemmmmeeeennnntttt]Loop

● condition Expression numérique ou expression de chaîne obligatoiredont la valeur est True ou False.

● statement Une ou plusieurs lignes d’instructions exécutées pendant laboucle.

● Exit Do Instruction optionnelle employée pour quitter prématurément laboucle.

● 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 decomptage, similaire à l’instruction For…Next :

Dim intCounter as IntegerintCounter = 1Do While intCounter <= 10 intCounter = intCounter + 1Loop

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 IntegerintCounter = 1Do Until intCounter = 11 intCounter = intCounter + 1Loop

Page 108: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

90

Partie 2 : Visual Basic pour Applications

Chapitre 4

Ces deux exemples exécutent une boucle de comptage simple de 1 à 10. De cesdeux exemples, il est plus simple de comprendre que la boucle Do While comptede 1 à 10. La boucle Do Until semble compter jusqu’à 11. En fait, l’action nes’effectue pas lorsque le compteur atteint 11 : elle s’effectue pour la dernière foisavec la valeur 10.

À l’instar des boucles Do While et Do Until, les boucles Do…Loop While etDo…Loop Until sont similaires. Elles vérifient une expression conditionnelle à lafin de la boucle, garantissant au moins un passage dans la boucle. La boucleDo...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[ssssttttaaaatttteeeemmmmeeeennnntttt][Exit Do][ssssttttaaaatttteeeemmmmeeeennnntttt]Loop While ccccoooonnnnddddiiiittttiiiioooonnnnetDo[ssssttttaaaatttteeeemmmmeeeennnntttt][Exit Do][ssssttttaaaatttteeeemmmmeeeennnntttt]Loop Until ccccoooonnnnddddiiiittttiiiioooonnnn

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

● statement Une ou plusieurs lignes d’instructions exécutées pendant laboucle.

● Exit Do Instruction optionnelle employée pour quitter prématurément laboucle.

● Loop Instruction obligatoire qui marque la fin du bloc d’instruction DoWhile ou Do Until.

L’exemple suivant incrémente un compteur à chaque passage dans la boucle etutilise une boîte de message pour demander à l’utilisateur s’il souhaitecontinuer :

Sub PermissionLoop()Dim intCounter As Integer, strPrompt As StringDim intResult as Integer

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

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

Sub PermissionLoop2()

Page 109: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

91

Partie 2 : Visual Basic pour Applications

Dim intCounter As Integer, strPrompt As StringDim intResult as Integer

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

Instruction GoToL’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 êtremarquée par un numéro de ligne ou une étiquette de ligne pour permettre auprogramme 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éhensiondes procédures.

Voici la syntaxe de l’instruction GoTo :

GoTo lllliiiinnnneeee

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 toutesé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 dansla première colonne.

Dans la mesure où les instructions GoTo risquent de déstructurer le code, leurutilisation est fortement déconseillée. Toutefois, exploitées avec parcimonie, ellespeuvent être extrêmement utiles. La prochaine section, consacrée à la gestion deserreurs, explique quand et comment utiliser l’instruction GoTo et les étiquettesde ligne.

Gestion des erreursChaque 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 dequitter. 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édureappelante 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ôtdans ce chapitre pour calculer le nombre de jours dans un mois. Elle vérifiait si la

Page 110: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

92

Partie 2 : Visual Basic pour Applications

Chapitre 4

variable intMois correspondait à l’une des clauses attendues. Si intMois contientune 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, VBAvous permet de récupérer les erreurs qu’il détecte. En récupérant les erreurs queVBA détecte, votre procédure peut éventuellement les corriger et continuer sonexécution.

Pour récupérer les erreurs VBA, servez-vous de la commande On Error. Elleprend la forme de base

On Error Goto lllliiiinnnneeee llllaaaabbbbeeeellll

Dans cette ligne de code, line label spécifie la section de code que vous avez écritepour gérer les erreurs.

Le fragment de code suivant montre comment récupérer les erreurs et brancherle 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, placezl’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 gestionnairesd’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 deconstruction 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 gestionnairesd’erreurs que vous avez écrits si aucune erreur n’est récupérée. Pour empêcherVBA d’exécuter le code de gestion des erreurs, on le place généralement à la find’une procédure, puis dans la ligne immédiatement avant le gestionnaire

Page 111: EXCEL Microsoft Office Excel

Cha

pitr

e 4

Démarrage de la programmation VBA

93

Partie 2 : Visual Basic pour Applications

d’erreurs, on insère une instruction Exit Sub ou Exit Function pour quitter laprocé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 etFunction ».

Une fois une erreur récupérée, comment savoir de quelle erreur il s’agit et quelleaction corrective a été entreprise ? Pour décrire l’erreur, VBA propose diversesproprié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 del’erreur. Le code permet de reconnaître et de corriger les erreurs communes etattendues.

Les gestionnaires d’erreurs fonctionnent uniquement pour la procédure danslaquelle ils apparaissent. Une fois la procédure terminée, la récupérationd’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 produitl’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 gestionnaired’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,mais si l’erreur n’est pas fatale à l’exécution, elle ne fait pas échouer le reste de laprocédure. Si tel est le cas, vous pouvez reprendre l’exécution de la procédureavec l’instruction Resume Next. L’exécution se poursuit avec l’instruction quisuit 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’instructionResume 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 SubErrorHandler: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 desprogrammes avec des boucles et des tests et à gérer les erreurs qui les accompa-

Page 112: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

94

Partie 2 : Visual Basic pour Applications

Chapitre 4

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

Page 113: EXCEL Microsoft Office Excel

95

Partie 2 : Visual Basic pour Applications

Chapitre 5

Création de procédures Sub et Function

Définition de procédures Sub. . . . 95Définition de procédures Function . . . . . . . . . . . . . . . . . . . 109

Organisez votre réussite . . . . . . 115

Dans les premiers chapitres de ce livre, et plus particulièrement dans lechapitre 4, nous avons exploité des exemples de procédures pour illustrer l’utili-sation de Visual Basic pour Applications (VBA) avec Microsoft Excel. Lechapitre 4 a introduit les constructs de programmation que vous pouvezemployer pour créer et contrôler le fonctionnement du code VBA : répéter unextrait de code un certain nombre de fois dans une boucle For...Next, influencerchaque membre d’une collection dans une boucle For Each...Next ou répéter lecode jusqu’à satisfaire une condition. Il à est présent temps d’entrer dans lesdétails.

Dans ce chapitre, vous apprendrez à ajouter des procédures Sub et Function à vosmodules de code, à déterminer si les procédures doivent être à la disposition desautres 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 dansvos programmes.

Définition de procédures SubVous pouvez créer deux types de procédures dans Excel VBA : une procédure Subou une procédure Function. Quelle est la différence entre les deux types deprocédures ? Il s’agit de définir si la procédure retourne une valeur que l’on peutou non employer ailleurs dans le programme. Par exemple, une procédure Subconfigurée pour vérifier qu’un achat va entraîner un dépassement du créditautorisé 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 IfEnd Sub

Page 114: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

96

Partie 2 : Visual Basic pour Applications

Chapitre 5

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

Pour plus d’informations sur le passage de valeurs entre procédures, reportez-vous à lasection « 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.

[PPPPrrrriiiivvvvaaaatttteeee | PPPPuuuubbbblllliiiicccc] [SSSSttttaaaattttiiiicccc] SSSSuuuubbbb name [(arglist)] [ssssttttaaaatttteeeemmmmeeeennnnttttssss][EEEExxxxiiiitttt SSSSuuuubbbb][ssssttttaaaatttteeeemmmmeeeennnnttttssss]EEEEnnnndddd SSSSuuuubbbb

Le tableau 5.1 décrit les éléments d’une 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.

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

Page 115: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

97

Partie 2 : Visual Basic pour Applications

2 Si nécessaire, cliquez sur Insertion, Module pour créer un nouveaumodule de code (ou si vous souhaitez créer un nouveau module pour desraisons 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’autresoptions. 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.

Page 116: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

98

Partie 2 : Visual Basic pour Applications

Chapitre 5

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’objetsde 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 uneprocé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 dela 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 If .Value > 4999 Then .Font.Color = vbBlue If .Value > 9999 Then .Font.Color = vbGreen End WithEnd 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 votreclasseur, 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 celluleactive, génère un résultat incorrect.

Sub CreditDisponibleCase()

Page 117: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

99

Partie 2 : Visual Basic pour Applications

Solde = ActiveCell.ValueSelect Case SoldeCase "" Exit Sub Case Is >= 10000 ActiveCell.Font.Color = vbGreen Case Is <= 9999 ActiveCell.Font.Color = vbBlueCase Is <= 4999ActiveCell.Font.Color = vbBlackCase Is <= 1000 ActiveCell.Font.Color = vbRed End SelectEnd Sub

Au QuotidienLes 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 lesvaleurs d’une plage définie. Dans une instruction Select Case, vous devezemployer des règles définitives. En effet, dès l’instant qu’Excel trouve un casvrai, il quitte l’instruction Select Case. En conséquence, si vous évaluez unevaleur 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 aucuneaction.

3 La valeur est-elle supérieure à 1000 ? Oui, donc remplacer la couleur depolice par du noir.

4 La valeur est-elle supérieure à 5000 ? Oui, donc remplacer la couleur depolice par du bleu.

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

La routine change la couleur de la police une fois de trop (d’abord en noir, puisen bleu), mais le résultat obtenu est correct et l’étape supplémentaire ne posepas 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 cellules’affiche en noir et non en bleu.

Select Case SoldeCase "" Exit SubCase Is < 1000

Page 118: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

100

Partie 2 : Visual Basic pour Applications

Chapitre 5

ActiveCell.Font.Color = vbRedCase Is >= 1000ActiveCell.Font.Color = vbBlack Case Is >= 5000 ActiveCell.Font.Color = vbBlueCase Is >= 10000 ActiveCell.Font.Color = vbGreen End Select

Le résultat est faux. En effet, la routine quitte lorsqu’elle trouve que la valeurde 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 lemenu Format, Mise en forme conditionnelle pour créer des règles. Les règlesdu 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 malformatée.

Astuce La mise en forme conditionnelle est limitée à trois conditionsLa 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 dedialogue Mise en forme conditionnelle.

Bien sûr, si vous inversez l’ordre des instructions Case (ignorant le premiercas, qui vérifie si la cellule est vide), le cas le plus restrictif serait placer unpremier, le deuxième cas en deuxième, etc. Voilà l’astuce qui permet de créerdes 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. Dansune instruction Select Case, pour vérifier si des valeurs sont supérieures àd’autres valeurs, commencez par les valeurs les plus élevées (demandez, parexemple, « la valeur est-elle supérieure à 10 000 ? » avant de demander « lavaleur 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 « lavaleur est-elle inférieure à 5 000 ? »).

Page 119: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

101

Partie 2 : Visual Basic pour Applications

Définir la portée d’une procédure SubLe 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 peutuniquement être référencée par les procédures du même module, alors qu’uneprocédure dont la portée est Public peut être référencée par n’importe quelleprocé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 (voirFigure 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.

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écuterou modifier la procédure CreditDisponibleCase. Vous pouvez, toutefois, exécuterla procédure CreditDisponible à partir d’une autre procédure du même modulede 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’autresprocédures plus loin dans ce chapitre.

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

Page 120: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

102

Partie 2 : Visual Basic pour Applications

Chapitre 5

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 rendreprivée toute procédure, y compris celles qui utilisent le mot-clé Public. Lesmacros 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 dansl’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 nouvellesection délimitée par une ligne, apparaît dans le module de code.

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 lepoint d’insertion à gauche de la première ligne de code du module, appuyezsur ENTRÉE et revenez sur la nouvelle ligne vide. Ce faisant, la valeur de laliste 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 positionde la première ligne du module et appuyer sur ENTRÉE. Lorsque Visual BasicEditor reconnaît que vous avez saisi une déclaration sur la première ligne, ilcrée une section Déclarations et insère une ligne marquant la fin de la section.

Page 121: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

103

Partie 2 : Visual Basic pour Applications

Au QuotidienLe 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 del’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é lamacro à un bouton de la barre d’outils ou à un élément de menu ; vous voulezque 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 personnesachant utiliser la boîte de dialogue Personnalisation assigne la macro à unautre bouton, ou pire, la modifie dans Visual Basic Editor. Si une personne estdéterminée à entrer dans le code et que vous n’avez pas protégé le classeurpar 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’indiquele titre de cet encart, une procédure Public convertie en Private ne rompt pasle lien avec le bouton de la barre d’outils, l’élément de menu ou l’objet auquelvous avez assigné la macro. Si on clique sur le déclencheur de la macro, quelqu’il soit, la macro s’exécute.

Exécuter une procédure Sub à partir d’une autre procédureAprès avoir créé une procédure Sub, vous voudrez l’exécuter. Comme nousl’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

Page 122: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

104

Partie 2 : Visual Basic pour Applications

Chapitre 5

macro. Par exemple, vous pouvez exécuter une procédure existante, commeNOW, 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 dela procédure et ajoutez les valeurs des arguments nécessaires. L’instruction Calln’est pas indispensable, mais si vous l’employez, placez les arguments entreparenthè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 auchapitre 24, « Excel et le web ».

Pour exécuter cette procédure Sub à partir d’une autre procédure, vous pouvezutiliser l’une des trois techniques suivantes :

● Saisissez le nom de la procédure et de tout argument qu’elle prend. (enl’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-miner la macro à exécuter et pour assigner le nom de la macro de votrechoix à 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 modulesdisponibles à la recherche de procédure Public du même nom. Jusqu’à présent, ilfallait obligatoirement placer le mot-clé Call avant le nom de la procédure, maisce n’est plus le cas. Malgré tout, certains programmeurs choisissent de placer lemot-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édurene fait pas partie de la bibliothèque standard d’Excel.

Page 123: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

105

Partie 2 : Visual Basic pour Applications

En matière d’appel de procédures, vous n’êtes pas limité au code du module, niau même classeur. Rien ne vous empêche d’atteindre les procédures des autresmodules. En fait, si le moteur Excel VBA ne trouve pas la procédure que vousappelez dans le module de la procédure appelant, il la recherche dans les autresmodules du classeur actif et, s’il ne l’a toujours pas trouvée, il consulte les autresclasseurs ouverts.

Si vous connaissez le nom du module qui contient la procédure à exécuter et quevous savez qu’il se trouve dans le classeur actif, placez le nom du module devantle 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 attribuele 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 enregard de la propriété Name, tapez le nouveau nom du module et appuyezsur 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 lemê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 éviterainsi tout problème. Ceci dit, si plusieurs procédures portent le même nomdans différents modules et que vous tentez d’en appeler une sans spécifier lemodule qui l’héberge (par exemple, ModuleDevise.Couronnes), Visual BasicEditor affiche l’erreur « Nom ambigu détecté » et arrête l’exécution du code quiappelle la procédure.

Si vous savez que la procédure à exécuter se trouve dans un module lié à un autreclasseur et que, pour un raison ou une autre, vous ne voulez pas copier le codedans le classeur actuel, vous pouvez appeler la procédure de deux manières : envous servant de la méthode Application.Run et en spécifiant le nom du classeurou 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édurequi se trouve dans un autre classeur, il vous suffit de nommer le classeur et laprocédure à exécuter. Pour ce faire, vous utilisez une syntaxe qui ressemble à la

Page 124: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

106

Partie 2 : Visual Basic pour Applications

Chapitre 5

référence que vous créez pour lier une cellule de feuille de calcul à une celluled’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 lesprocédures disponibles. Cette exigence constitue la raison pour laquelle la boîtede dialogue Macros présente les macros du classeur en cours, de n’importe quelautre classeur ouvert ou de tous les classeurs ouverts : les concepteurs du pro-gramme ont choisit de ne pas autoriser Excel à atteindre les autres classeurs, saufs’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éeune référence à une procédure d’un autre classeur est similaire à celui qui permetde 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 dedialogue Références du menu Outils de Visual Basic Editor (voir figure 5.4).

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.

Page 125: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

107

Partie 2 : Visual Basic pour Applications

Au premier affichage, la boîte de dialogue Références ne présente pas les projetsdisponibles dans les classeurs Excel présents sur votre ordinateur (ou sur toutlecteur du réseau auquel vous avez accès), mais vous pouvez les rechercher par lebiais 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électionnezMicrosoft Office Excel Files (*.xls, *.xla).

4 Localisez le répertoire qui contient le classeur, cliquez sur le classeur puissur Ouvrir.

Après avoir créé la référence, le nom du projet du classeur que vous venez desélectionner s’affiche dans la boîte de dialogue Références. Le point à releverdans 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 nomde 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 VBAProjectet vous ne saurez pas lequel choisir. Pour renommer un projet, dans la fenêtreProjet, cliquez sur le nom du projet et modifiez sa propriété Name dans la fenêtrePropriétés.

Au QuotidienRé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 écritla fonction FACT a créé un test qui s’assure que la procédure ne continue pasà s’appeler après qu’elle a atteint 1, et c’est tant mieux. Si la procédure nevé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 ettombe en panne. Pour éviter toute sorte de boucle infinie, si vous devez écrireune procédure qui s’appelle, ajoutez un texte logique dans une boucleIf…Then ou Do…While .

Page 126: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

108

Partie 2 : Visual Basic pour Applications

Chapitre 5

Les procédures présentent un autre piège que l’on rencontre si on utilise lemot-clé Static pour conserver des valeurs de variables dans une procédureentre des appels. Supposons que vous travailliez avec une feuille de calcul quiregroupe les ventes journalières et que le classeur contienne la macro, décriteprécédemment dans ce chapitre, qui conserve un cumul des ventes. Que sepasse-t-il si l’un de vos collègues examine un autre classeur qui appelle lamê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 vousgérez le bureau avant que vous partiez pour des vacances bien méritées, loindes 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 unecellule et exécute la procédure, la prochaine actualisation de votre ordinateurne reflètera pas les vraies valeurs des ventes. Notons que les conséquencesde ce type d’erreur sont minimales si vous vous contentez de surveiller desvaleurs 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 dansvotre copie de la feuille de calcul indique un problème dans une autre copie duclasseur.

Ceci dit, si vous vous servez d’un cumul ou d’autres variables statistiquesdans 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édureLe deuxième élément optionnel d’une déclaration de procédure concerne lesvaleurs générées par ses exécutions antérieures : faut-il ou non les conserver ? Onpeut 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 valeursd’une journée dans un fichier ou un tableau et additionner les totaux, mais il estbeaucoup plus simple d’afficher le cumul du jour en s’assurant que la procédurese rappelle les valeurs antérieures.

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

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

Si elle fonctionnait, cette procédure présenterait l’avantage d’éviter l’exécutiond’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, cetteprocédure génère toujours la même réponse : la valeur de la cellule active. Eneffet, la variable intTotal est recréée chaque fois que vous exécutez la procédure :

Page 127: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

109

Partie 2 : Visual Basic pour Applications

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

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

Lorsqu’on ajoute le mot-clé Static à une instruction Sub, Excel sait créer unespace de stockage durable pour chaque variable et conserver cet espace et soncontenu 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 FunctionLa 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 sontpassés par une procédure appelante. Prenons l’exemple de la fonction SOMMEque vous utilisez couramment dans les formules d’une feuille de calcul Excel. Laformule suivante calcule la somme des valeurs des cellules C14 à H14, J14 etajoute 100 :

=SOMME(C14:H14; J14; 100)

La fonction SOMME additionne tout ce qui se trouve dans l’instruction quil’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 lecode de l’erreur. Si une procédure Function ne comporte pas d’arguments, soninstruction Function doit contenir paire de parenthèses vide.

[PPPPrrrriiiivvvvaaaatttteeee | PPPPuuuubbbblllliiiicccc] [SSSSttttaaaattttiiiicccc] FFFFuuuunnnnccccttttiiiioooonnnn name [(arglist)] [As type][statements][name = expression][EEEExxxxiiiitttt FFFFuuuunnnnccccttttiiiioooonnnn] [statements][name = expression]End FunctionLe tableau 5.2 décrit les éléments d’une procédure Function, dont la plupart sontsimilaires à ceux de la procédure Sub.

Page 128: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

110

Partie 2 : Visual Basic pour Applications

Chapitre 5

Créer une procédure FunctionPour créer une procédure Function dans un module de code existant, ouvrez lemodule dans Visual Basic Editor et saisissez :

Function nom()…End Function

Vous devez nommer la fonction et placer des instructions au centre, à la placedes points de suspension, mais vous procéderez plus rapidement en vous servantde la boîte de dialogue Ajouter une procédure.

Pour ajouter une procédure Function à un module de code, procédez commesuit :

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

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.

Page 129: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

111

Partie 2 : Visual Basic pour Applications

2 Si nécessaire, cliquez sur Insertion, Module pour créer un nouveaumodule de code (ou si vous souhaitez créer un nouveau module pour desraisons 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éduresFunction à la disposition des procédures présentes dans les autres classeursen 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 FunctionPour exécuter une procédure Function, servez-vous de l’une des méthodessuivantes :

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

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 dansvos 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èmeméthode d’exécution d’une procédure Function consiste à l’appeler à partird’une cellule dans une feuille de calcul. Pour ce faire, vous l’appelez en procédant

Page 130: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

112

Partie 2 : Visual Basic pour Applications

Chapitre 5

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 pourintervenir sur une valeur ? Dans deux cas : si vous voulez utiliser le résultat de lafonction dans une expression du code VBA ou dans une formule dans l’une devos 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 depetits sacs. Vous créez ensuite une fonction similaire à celle-ci :

Function PetitsSacs(intGrandsSacs as Integer) as Integer PetitsSacs = intGrandsSacs * 4End 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 dansune commande, stockée dans la cellule C16, en nombre de petits sacs de terreauque produit la commande.

Passer des arguments aux procéduresDans ce chapitre, nous avons pour l’instant étudié les procédures qui traitent desvaleurs 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 à partirde la procédure avec la propriété Act iveCel l .Value ou la propriétéRange(<cell>).Value, vous n’avez pas à vous soucier de valeurs passées par desvariables. Malheureusement, la situation n’est pas toujours aussi simple. Si vousdevez intervenir sur une valeur stockée dans une variable d’une procédure, etnon dans une cellule de feuille de calcul, vous devez indiquer à la procédure lesvaleurs 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 à180 pour cent du prix de gros de l’article, prend un argument :

Function Marge(curPrixArticle as Currency) as Currency Marge = curPrixArticle * 1,8End 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 lesdeux é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 fonctionrécupère la variable, elle sait traiter la valeur reçue en tant que variable du typeCurrency.

Page 131: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

113

Partie 2 : Visual Basic pour Applications

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 unedeuxième occurrence de as Currency. Cet élément indique à la fonction le typede 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 lavaleur passée à la procédure, mais on peut diviser une valeur à virgule flottanteen simple précision (single) par une valeur entière (integer) et retourner unevaleur entière, par exemple, si vous voulez savoir combien de sacs de 5 kg vousobtenez à 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 unevariable 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 QuotidienProtéger les données d’origine

En programmation, on court le risque de modifier accidentellement les valeursd’origine de la feuille de calcul. Par exemple, si vous créez une procédure Subqui assigne une valeur à la cellule active, vous détruisez les données d’origine.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édureutilise une copie des données et non la valeur de la cellule d’origine (ou dutableau, 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 certainnombre 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

Page 132: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

114

Partie 2 : Visual Basic pour Applications

Chapitre 5

Passer des arguments nommésToutes les procédures de ce chapitre qui appellent une procédure passent lesarguments dont la procédure a besoin selon l’ordre attendu. Par exemple, si voustapez 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 desarguments nommés. Un argument nommé se compose du nom de l’argumentsuivi 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 :

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 auchapitre 4, « Démarrage de la programmation ».

Page 133: EXCEL Microsoft Office Excel

Cha

pitr

e 5

Création de procédures Sub et Function

115

Partie 2 : Visual Basic pour Applications

Organisez votre réussiteVous 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 conseillonstoutefois d’écrire une procédure par tâche puis d’appeler chaque tâche depuisune même procédure principale. Voici un exemple de code permettant de créerun programme qui écrit le contenu d’une feuille de calcul des ventes journalièresdans une base de données, enregistre le fichier sous un nouveau nom basé sur ladate, supprime le contenu de la feuille de calcul des ventes puis enregistre etferme tous les fichiers ouverts :

Sub Principale() Call ActualisationSQL() Call RéenregistrerClasseur() Call SupprimerDonnées() Call EnregistrerEtFermer()End SubLe 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 cachetde qualité en matière de programmation depuis de longues années et nous vousconseillons vivement de l’adopter.

Dans ce chapitre, vous avez appris à créer des procédures Sub et Function, lesconteneurs du code VBA. Rappelez-vous leur principale différence : les procédu-res Sub ne retournent aucun résultat au programme principal, contrairementaux 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, vousallez commencer par faire la connaissance de l’objet Application.

Page 134: EXCEL Microsoft Office Excel
Page 135: EXCEL Microsoft Office Excel

117

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

Page 136: EXCEL Microsoft Office Excel
Page 137: EXCEL Microsoft Office Excel

119

Partie 3 : Le modèle d’objet Excel

Chapitre 6

L’objet ApplicationIntroduction à l’objet Application . . . . . . . . . . . . . . . . . 120

Visual Basic pour Applications (VBA) se sert des objets pour contrôler MicrosoftExcel. Que vous travailliez dans une application Excel (objet Application), desclasseurs (objet Workbook) ou des cellules individuelles (objet Cell), toutes vosactions 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’objetWorkbook contient des objets Worksheet, qui à leur tour contiennent des objetsCell.

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’objetWorksheet, Worksheets("Feuil2").Select.

Le modèle d’objet (voir figure 6.1) décrit les relations entre chaque objet d’Excelet les autres objets. Dans le modèle d’objet, vous visualisez les objets contenusdans l’objet, les objets contenus dans ces objets et ainsi de suite. Un objet peutcontenir plusieurs objets du même type. Par exemple, un classeur peut contenirplusieurs feuilles de calcul.

Page 138: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

120

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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 etchaque 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 à unefeuille de calcul spécifique intitulée Feuil2.

Introduction à l’objet ApplicationL’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 pourmanipuler l’application Excel, ainsi que les objets qui représentent des classeursindividuels 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 celluled’une feuille de calcul (A1), on commence par l’objet Application, suivi de l’objetWorksheet 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

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 lafeuille de calcul appropriés, particulièrement si vous travaillez directement avec

Page 139: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

121

Partie 3 : Le modèle d’objet Excel

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

PropriétésL’utilisation de l’objet Application implique généralement de lire ou de définirl’une de ses nombreuses propriétés, plus de 170, qui contrôlent chaque aspect del’application Excel. Des classeurs et des feuilles de calcul aux colonnes et auxlignes, l’objet Application donne accès à pratiquement chaque élément d’Excel etdes classeurs Excel.

Avec ce nombre impressionnant de propriétés, il est impossible de connaîtrechaque propriété disponible et ce n’est pas indispensable. Voici une liste des10 propriétés les plus courantes que vous devez connaître pour exploiter Excel etVBA. Vous ferez connaissance avec les autres propriétés à mesure que vous lesutiliserez. Le seul point important consiste à connaître leur existence pour lesapplications à 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’aidede Visual Basic Editor en tapant excel dans la zone Poser une question et en affichant larubrique d’aide Modèle objet Microsoft Excel.

Cette courte liste des propriétés de l’objet Application récapitule les principauxobjets employés avec Excel. La plupart ont été directement présentés par l’équipede programmation Excel de sorte qu’une référence explicite à l’objet Applicationest inutile. Ces propriétés sont décrites dans les prochaines sections par ordrealphabétique.

Propriété ActiveCell

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

Page 140: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

122

Partie 3 : Le modèle d’objet Excel

Chapitre 6

veCell retourne un objet Range qui définit la valeur ou la formule de la celluleainsi 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 valeurd’une cellule et modifier la bordure qui l’entoure si cette valeur se situe entre 500et 1000. La procédure ApplyBorders boucle dans toutes les cellules de donnéesspé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 MyCellEnd 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.

Rappelez-vous que la valeur de la propriété ActiveCell diffère de la valeur de laproprié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 unefeuille de calcul dans laquelle plusieurs cellules sont sélectionnées, la cellule

Page 141: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

123

Partie 3 : Le modèle d’objet Excel

active est encadrée et sans surbrillance. Les autres cellules de la sélection sontmises 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’ilsoit 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 sousla 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" .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"

Page 142: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

124

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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, msoScaleFromTopLeftEnd 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 decalcul 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, vouspouvez écrire une macro qui crée une nouvelle feuille portant le nom du moissuivant et le jour de la semaine correct en regard de la date. La figure 6.4 montrele résultat de cette macro, qui utilise la feuille de calcul January du classeurY2004ByMonth.xls comme modèle.

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

Page 143: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

125

Partie 3 : Le modèle d’objet Excel

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

Page 144: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

126

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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êtresélectionnée dans l’application Excel. La fenêtre active est toujours celle qui setrouve 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’onfasse référence à une fenêtre particulière dans la collection Windows en se servantde la valeur Caption à la place du numéro d’index. Le fragment de code suivantassigne la chaîne "My Window" à la propriété Caption de la fenêtre active puisinvoque la méthode Calculate de l’objet ActiveSheet pour recalculer toutes lesformules 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 lafenê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 dansl’angle supérieur gauche.

L’exemple suivant illustre l’utilisation des propriétés ScrollColumn, ScrollRow etZoom. Dans l’exemple, le code saisit du texte dans la cellule H18 avec une taillede 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%)

Page 145: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

127

Partie 3 : Le modèle d’objet Excel

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 = 18End Sub

Le deux macros suivantes peuvent être assignées à des boutons pour agrandir ouré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 = intZoomEnd Sub

Sub ZoomOut()Dim intZoom As Integer

intZoom = ActiveWindow.Zoom -50 If intZoom < 50 Then intZoom = 50

Page 146: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

128

Partie 3 : Le modèle d’objet Excel

Chapitre 6

ActiveWindow.Zoom = intZoomEnd 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 leseul classeur ouvert est masqué.

L’exemple suivant construit un nouveau classeur trimestriel en extrayant lesfeuilles appropriées du classeur annuel.

Sub ExtractQuarterlyFigures()Dim szMyName As String, szQuarter As String, intCount As IntegerDim 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 intCountEnd Sub

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

Page 147: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

129

Partie 3 : Le modèle d’objet Excel

réponse par défaut pour toutes les alertes affichées. La seule exception est lamé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 lapropriété DisplayAlerts est positionnée à False.

Excel réinitialise la propriété DisplayAlerts à sa valeur par défaut True lorsque lamacro est terminée.

La macro suivante, qui supprime toutes les feuilles de calcul non utilisées d’unclasseur, positionne la propriété DisplayAlerts à False de sorte que l’utilisateur nesoit pas averti chaque fois que la macro supprime une feuille de calcul.

Attention Vous devez exécuter cette macro dans un classeur qui contientdes 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' : Lamé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 cellulessé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èressélectionnées.

Lorsque des cellules sont sélectionnées, la propriété RangeSelection et l’objetSelection 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

Propriété Selection

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

Page 148: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

130

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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

Selection.Clear

Propriété StatusBar

La propriété StatusBar permet de modifier le message actuellement affiché dansla 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éduredoit 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 nousavons utilisée précédemment pour illustrer la propriété ActiveChart. Plusieurslignes de code ont été ajoutées pour afficher des messages relatifs à l’activité de lamacro à l’attention de l’utilisateur dans la barre d’état.

Au QuotidienMettre 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 rapportqui é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 lesinformations 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 mettreen 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 tropimportant : la méthode Wait arrête toute activité d’Excel et peut égalementvous 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 àun humain effectuant les mêmes tâches. L’écran reflète les différentes actionsprogrammé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 vitepour 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.

Page 149: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

131

Partie 3 : Le modèle d’objet Excel

Pour réduire le clignotement de l’écran et éventuellement gagner quelquessecondes sur le temps de traitement, en particulier dans le cadre des macrosgourmandes de temps de traitement, vous pouvez désactiver le rafraîchissementde l’écran avec la propriété ScreenUpdating.

En positionnant la propriété ScreenUpdating sur False au début de la macro, vousindiquez à Excel de ne pas actualiser l’écran pendant l’exécution jusqu’à ce que lapropriété soit à nouveau positionnée sur True. Il est très important de déboguerentièrement une macro et d’insérer du code de récupération des erreurs si vousdésactivez le rafraîchissement de l’écran. En effet, une simple condition d’erreurqui ne s’est pas affichée pourrait faire croire à l’utilisateur à un échec de la macroou à 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, msoScaleFromTopLeft Application.Wait (Now + TimeValue("0:00:03")) Application.StatusBar = False Application.ScreenUpdating = TrueEnd Sub

Page 150: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

132

Partie 3 : Le modèle d’objet Excel

Chapitre 6

Propriété ThisWorkbook

La propriété ThisWorkbook retourne un objet Workbook qui se réfère au classeurcontenant 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 auclasseur qui contient le code exécuté.

L’exemple suivant illustre la propriété ThisWorkbook en affichant une boîte demessage libellée avec le nom du classeur active et le nom du classeur à partirduquel 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éthodesLes 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 decuisine. Le mixeur est un conteneur d’objets. La nourriture placée dans le mixeurreprésente son contenu. Chaque bouton qui mélange, tranche, liquéfie, et ainside suite, correspond à une méthode différente.

Méthode Calculate

La méthode Calculate oblige tous les classeurs ouverts à recalculer les cellules quicontiennent de nouvelles données, des données modifiées ou changeantes, ainsique les cellules dépendantes. Cette méthode produit le même résultat que si l’onappuie sur la touche F9. Elle oblige Excel à recalculer un classeur lorsqu’on asé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.

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

Page 151: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

133

Partie 3 : Le modèle d’objet Excel

Au QuotidienLimiter les calculs

Vous pouvez également employer la méthode Calculate avec les objetsWorksheet et Range. Elle permet, en outre, de limiter le nombre de calculseffectué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 lafeuille active :

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

Pour calculer un nombre limité de cellules, servez-vous de l’objet Range pourspécifier les cellules à recalculer. Cet exemple recalcule les formules de toutesles cellules dans la plage C1:G13 :

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

Méthode CalculateFull

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

Sub ReCalcFull() Application.CalculateFullEnd 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’exemplesuivant invite l’utilisateur à localiser le fichier ProductList.xls :

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

strPrompt = "Veuillez localiser le fichier ProductList.xls." MsgBox strPrompt, vbOKOnly + vbInformation, "Excel 2003 VBA Au Quotidien"

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

Page 152: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

134

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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 affichenttoutes deux une boîte de dialogue simple qui permet à l’utilisateur de saisir desinformations exploitables dans la macro. La différence entre les deux réside dansle fait que la méthode InputBox peut effectuer une validation sélective de l’entréede l’utilisateur et qu’elle peut être employée avec d’autres objets Excel, valeursd’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 devaleur 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 devaleur 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 pourspécifier plusieurs types. Par exemple, si vous additionnez la valeur pour lesnombres (1) et la valeur pour le texte (2) et vous servir de leur somme (3) pourque la méthode InputBox accepte les nombres et le texte. Si vous ne précisez pasde 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ètressont optionnels, mais vous devez employer des paramètres fictifs si vous appelezla méthode dans sa forme standard. Pour éviter l’emploi de paramètres fictifs,nommez les paramètres fournis, comme dans l’exemple suivant :

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. Utilisezl’instruction Set pour assigner les cellules sélectionnées à un objet Range. Si vous

Page 153: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

135

Partie 3 : Le modèle d’objet Excel

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 unevariable 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 unobjet, 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 unefeuille 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 despécifier une plage de cellules dans laquelle insérer les totaux mensuels, puis luidemande les valeurs nécessaires :

Sub InputMonthlyTotals()Dim strPrompt As String, rgeMonth As Range, sglTotal As SingleDim 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

Page 154: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

136

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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/False)

Accepte toute variable Variant qui peut être convertie en valeur logique.

8 Une référence de cellule, comme un objet Range

Utilisez l’instruction Set pour assigner le résultat à un objet Range.

16 Une valeur d’erreur, comme #NULL!

Retourne une valeur de chaîne composée du mot « Erreur » et du numéro d’erreur 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.

Page 155: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

137

Partie 3 : Le modèle d’objet Excel

Au QuotidienLa 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 laversion anglaise de SOMME), vous pouvez assigner la formule à la cellule B16de la première feuille de calcul de votre classeur en vous servant de l’instruc-tion suivante :

Range(B16).FormulaLocal = InputBox("Saisissez une formule.")

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 plagedélimitée en B3:E6 et une autre plage délimitée en D5:G8. L’intersection desdeux 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 = vbBlueEnd Sub

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

Page 156: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

138

Partie 3 : Le modèle d’objet Excel

Chapitre 6

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 parl’utilisateur se trouve dans une plage donnée. La procédure TestPlants invitel’utilisateur à sélectionner le total mensuel le plus élevé pour Plants dans lefichier 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

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 normald’Excel. Voici la syntaxe de la méthode OnKey :

Page 157: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

139

Partie 3 : Le modèle d’objet Excel

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 unechaîne vide en lui assignant la valeur " "), la combinaison de touches n’effectueaucune action, même si Excel réagit normalement à cette combinaison. Si onomet entièrement l’argument Procedure (autrement dit, s’il n’y a rien après lavirgule), 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 laboî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’unclasseur 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é. Lesdeux procédures suivantes, placées dans le fichier Y2001ByMonth.xls, assignentle raccourci clavier Alt+C à la procédure CopySheet qui ajoute une nouvellefeuille de calcul au classeur :

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

Sub Auto_Exit() Application.OnKey "%c"End Sub

Page 158: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

140

Partie 3 : Le modèle d’objet Excel

Chapitre 6

Méthode SendKeys

La méthode SendKeys envoie des frappes de touches vers le tampon du clavierpour 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 uneboîte de dialogue et qu’il n’existe aucune méthode pour l’empêcher de s’ouvrir etd’attendre une entrée de l’utilisateur.

Voici la syntaxe de la méthode SendKeys :

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.SendKeys (KKKKeeeeyyyyssss, WWWWaaaaiiiitttt)

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)

Page 159: EXCEL Microsoft Office Excel

Cha

pitr

e 6

L’objet Application

141

Partie 3 : Le modèle d’objet Excel

● expression Expression optionnelle qui retourne un objet Application.

● Keys Expression Variant obligatoire, généralement exprimée sous formede chaîne, qui contient les codes de touches à envoyer (voir tableau 6.3pour la liste des codes de touches des touches spéciales).

● Wait Expression Variant optionnelle, généralement exprimée avec lavaleur booléenne True ou False qui indique si la procédure doit arrêterl’exécution jusqu’à ce que les touches ont été traitées. Si l’expression estTrue, la procédure s’interrompt jusqu’à ce que toutes les touches envoyéesont été traitées. Si l’expression est False ou omise, la procédure continuel’exécution sans tenir compte du traitement des touches.

Les touches sont d’abord placées dans un tampon de touche en attendant quel’application les appelle. Elles doivent donc être placées dans le tampon avantque 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é pourchacun. 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 Waitlaisse au programme de messagerie le temps de générer le courriel avant del’envoyer.

Sub SendEmail()Dim strLink As String, rgeEmail As RangeDim 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 combinaisonsde touches, empêcher l’écran de clignoter pendant qu’une procédure modifie leclasseur 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 lesobjets Workbook et Worksheet.

Page 160: EXCEL Microsoft Office Excel
Page 161: EXCEL Microsoft Office Excel

143

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 niveaudu classeur se limitent à créer des nouveaux classeurs, enregistrer les change-ments, fermer les classeurs ou supprimer les classeurs devenus inutiles. S’il estexact 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 enreste. Ce chapitre traite également des feuilles de calcul, à la fois comme feuilleset comme membres de la collection Sheets. Vous y trouverez ainsi les ressourcesnécessaires pour créer des classeurs, les configurer à votre guise (en terme deprotection 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 WorkbooksLa collection Workbooks contient les références à chaque classeur ouvert dansvotre copie d’Excel. Pour modifier chaque classeur ouvert, vous pouvez faireappel à 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 classeursexistants, celle de base étant la création : vous devez pouvoir créer un nouveauclasseur avant de savoir le manipuler.

Créer de nouveaux classeursLa 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 lamanière suivante :

Workbooks.Add

Page 162: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

144

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Pour créer une copie d’un classeur existant, définissez le paramètre Template dela méthode Add de la manière suivante :

Sub AjouterNouveauClasseur() Dim NewWbk As Workbook Set NewWbk = Workbooks.Add(Template:="C:\ExcelProg\VentesMensuelles.xls")End Sub

Ouvrir des classeursAprè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, danssa 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 :

expression.Open(FFFFiiiilllleeeeNNNNaaaammmmeeee, UUUUppppddddaaaatttteeeeLLLLiiiinnnnkkkkssss, RRRReeeeaaaaddddOOOOnnnnllllyyyy, FFFFoooorrrrmmmmaaaatttt, PPPPaaaasssssssswwwwoooorrrrdddd, WWWWrrrriiiitttteeeeRRRReeeessssPPPPaaaasssssssswwwwoooorrrrdddd, IIIIggggnnnnoooorrrreeeeRRRReeeeaaaaddddOOOOnnnnllllyyyyRRRReeeeccccoooommmmmmmmeeeennnnddddeeeedddd, OOOOrrrriiiiggggiiiinnnn, DDDDeeeelllliiiimmmmiiiitttteeeerrrr, EEEEddddiiiittttaaaabbbblllleeee, NNNNoooottttiiiiffffyyyy, CCCCoooonnnnvvvveeeerrrrtttteeeerrrr, AAAAddddddddTTTTooooMMMMrrrruuuu, LLLLooooccccaaaallll, CCCCoooorrrrrrrruuuuppppttttLLLLooooaaaadddd)

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’ilouvre le classeur en lecture seule, Password, qui doit être défini pour protéger leclasseur avec un mot de passe et Delimiter, qui spécifie le caractère employé pourséparer les champs si l’utilisateur ouvre un fichier texte.

Remarque Nous étudierons l’ouverture de fichiers texte plus loin dans cettesection.

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.

Page 163: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

145

Partie 3 : Le modèle d’objet Excel

Paramètre DescriptionPassword 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.

IgnoreReadOnlyRecommended

Si le classeur a été enregistré avec l’option Read-Only 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.

Tableau 7-1. Paramètres associés à la méthode Workbooks.Open (Suite)

Page 164: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

146

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Le format texte constitue l’un des formats de fichiers les plus utiles et les pluspolyvalents. Quel que soit le programme employé pour créer un tableur ou unetable de base de données, vous pouvez l’enregistrer au format texte et l’ouvrirdans Excel. Par exemple, si vous travaillez avec un collègue d’une autre entreprisequi utilise un tableur ou un programme de base de données qui ne lit pas ou necrée pas de fichiers compatibles avec Excel, vous pouvez écrire les données dansun fichier texte et les lire ensuite dans Excel. Vous perdrez la mise en forme et lesformules du fichier d’origine, mais la possibilité de déplacer ainsi les donnéesmérite qu’on s’y intéresse.

L’essentiel, lorsque vous créez un fichier texte pour représenter les données d’untableau, 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ésenteune limite entre deux cellules. Par exemple, la figure 7.1 présente une feuille decalcul sous forme d’un tableau composé de trois lignes de données et de trois cel-lules par ligne.

10345,5738,602924082,7459,31085119,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 desvirgules de séparation et des virgules comme séparateur décimal (en Europe) ouséparateur des milliers (aux Etats-Unis). La figure 7.2 montre ce qui se produitavec la même liste de données si les virgules servent de séparateurs décimaux etde délimiteurs.

10,345,5,738,6,02924,082,7,459,3,1085,119,8,003,14,972

Paramètre DescriptionAddToMru 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.

Tableau 7-1. Paramètres associés à la méthode Workbooks.Open (Suite)

Page 165: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

147

Partie 3 : Le modèle d’objet Excel

À la place des trois lignes de trois cellules, les données ci-dessus produisent unefeuille de calcul composée de trois lignes de six cellules.

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 lesdonnées. Dans l’Assistant Importation de texte, vous pouvez sélectionner uneoption 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 dumê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éthodeOpenText :

expression.OpenText(FFFFiiiilllleeeeNNNNaaaammmmeeee, OOOOrrrriiiiggggiiiinnnn, SSSSttttaaaarrrrttttRRRRoooowwww, DDDDaaaattttaaaaTTTTyyyyppppeeee, TTTTeeeexxxxttttQQQQuuuuaaaalllliiiiffffiiiieeeerrrr, CCCCoooonnnnsssseeeeccccuuuuttttiiiivvvveeeeDDDDeeeelllliiiimmmmiiiitttteeeerrrr, TTTTaaaabbbb, SSSSeeeemmmmiiiiccccoooolllloooonnnn, CCCCoooommmmmmmmaaaa, SSSSppppaaaacccceeee, OOOOtttthhhheeeerrrr, OOOOtttthhhheeeerrrrCCCChhhhaaaarrrr, FFFFiiiieeeellllddddIIIInnnnffffoooo, TTTTeeeexxxxttttVVVViiiissssuuuuaaaallllLLLLaaaayyyyoooouuuutttt, DDDDeeeecccciiiimmmmaaaallllSSSSeeeeppppaaaarrrraaaattttoooorrrr, TTTThhhhoooouuuussssaaaannnnddddssssSSSSeeeeppppaaaarrrraaaattttoooorrrr, TTTTrrrraaaaiiiilllliiiinnnnggggMMMMiiiinnnnuuuussssNNNNuuuummmmbbbbeeeerrrrssss, LLLLooooccccaaaallll)

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.

Page 166: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

148

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Paramètre DescriptionTextQualifier 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, Comma, Space

Positionnez ces paramètres sur True si le caractère nommé 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, ThousandsSeparator

Les caractères assignés à ces deux arguments indiquent le séparateur décimal et le séparateur des milliers.

Tableau 7-2. Paramètres de la méthode Workbooks.OpenText (Suite)

Page 167: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

149

Partie 3 : Le modèle d’objet Excel

Voici une routine ouvrant un fichier texte intitulé VentesExport.txt, dont lesdonnées sont séparées par des doubles points :

Sub ImporterTexte() Workbooks.OpenText Filename:="VentesExport.txt", Semicolon:=TrueEnd 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 nesont pas ouverts. Le code le mieux écrit n’a aucune valeur si à l’heure d’ouvrir unfichier, vous récupérez une copie en lecture seule du fichier parce que l’un de voscollè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’unclasseur spécifique est ouvert :

Sub VérifAvantOuverture()Dim Wkbk As WorkbookDim Filename As StringFilename = 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 WkbkEnd Sub

Attention Rappelez-vous que le nom du fichier est sensible à la casse etinclut l’extension du fichier, généralement .xls pour les fichiers Excel. Si onsaisi 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 estindispensable d’enregistrer les classeurs après avoir apporter des changementssignificatifs avec VBA. Imaginons, par exemple, que vous importiez des donnéesdans un classeur et le fermiez avant d’enregistrer les nouvelles données. Si le

Paramètre DescriptionTrailingMinusNumbers 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).

Tableau 7-2. Paramètres de la méthode Workbooks.OpenText (Suite)

Page 168: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

150

Partie 3 : Le modèle d’objet Excel

Chapitre 7

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.

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 retourneun objet Workbook représentant le classeur qui contient le code VBA exécuté. Cenouvel objet Workbook en main, vous appelez la méthode Save pour enregistrerune 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 enutilisant son nom actuel. S’il s’agit du premier classeur enregistré au cours decette session Excel, son nom sera Classeur1. Si un autre classeur du mêmeré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érationen cliquant sur Non ou Annuler. Si vous choisissez de ne pas écraser le fichierexistant, une boîte de message d’erreur d’exécution Microsoft Visual Basics’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’instardu bouton Enregistrer de la barre d’outils qui représente une méthode moinscompliquée que de cliquer sur Fichier, Enregistrer sous pour ouvrir la boîte dedialogue Enregistrer sous et ses options, la méthode ThisWorkbook.Save est bienmoins compliquée que la méthode ThisWorkbook.SaveAs. Mais, à vrai dire, laméthode ThisWorkbook.SaveAs est simple d’emploi. Voici la syntaxe complète dela méthode SaveAs :

expression.SaveAs(FFFFiiiilllleeeeNNNNaaaammmmeeee, FFFFiiiilllleeeeFFFFoooorrrrmmmmaaaatttt, PPPPaaaasssssssswwwwoooorrrrdddd, WWWWrrrriiiitttteeeeRRRReeeessssPPPPaaaasssssssswwwwoooorrrrdddd, RRRReeeeaaaaddddOOOOnnnnllllyyyyRRRReeeeccccoooommmmmmmmeeeennnnddddeeeedddd, CCCCrrrreeeeaaaatttteeeeBBBBaaaacccckkkkuuuupppp, AAAAcccccccceeeessssssssMMMMooooddddeeee, CCCCoooonnnnfffflllliiiiccccttttRRRReeeessssoooolllluuuuttttiiiioooonnnn, AAAAddddddddTTTTooooMMMMrrrruuuu, TTTTeeeexxxxttttCCCCooooddddeeeePPPPaaaaggggeeee, TTTTeeeexxxxttttVVVViiiissssuuuuaaaallllLLLLaaaayyyyoooouuuutttt, LLLLooooccccaaaallll)

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.

Page 169: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

151

Partie 3 : Le modèle d’objet Excel

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 menuFichier, peut sembler un choix étrange, mais elle permet de vous souvenir desclasseurs sur lesquels vous devez travailler la prochaine fois que vous ouvrirezExcel. Par exemple, si vous avez écrit une macro qui actualise les valeurs d’une

Paramètre DescriptionWriteResPassword 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).

Tableau 7-3. Paramètres de la méthode ThisWorkbook.SaveAs (Suite)

Page 170: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

152

Partie 3 : Le modèle d’objet Excel

Chapitre 7

série de classeurs que le président de votre société doit étudier ultérieurement, sivous ajoutez les noms des classeurs actualisés à la liste des fichiers récemmentutilisés, il lui sera plus simple de trouver les fichiers à examiner.

Pour enregistrer chaque classeur ouvert, écrivez un macro contenant une boucleFor 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 WkbkEnd Sub

L’instruction If...Then de la boucle For Each...Next vérifie si le chemin d’accès duclasseur 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 interventionhumaine. 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 duclasseur en cours sous un nouveau nom. La méthode SaveAsCopy permet de fairedes copies de sauvegarde d’un classeur durant une longue procédure pour éviterla 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 cetteprocédure :

ThisWorkbook.SaveCopyAs "cheminaccès\nomfichier.xls"

Attention Si vous utilisez la méthode SaveAsCopy pour enregistrer un fichieravec un nom de fichier existant, la macro écrase ce dernier sans demander lapermission.

Activer les classeursDans notre étude des propriétés Save et SaveAs, vous aurez remarqué que le codeutilise 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 vousavez choisi d’agir et non sur celui auquel le code est lié. Pour modifier le classeuractif, on appelle la méthode Activate de la collection Workbooks, comme dans lecode suivant :

Workbooks("2004T3Ventes.xls").Activate

Fermer les classeursLorsque 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 pourréduire le risque qu’il se produise quelque chose alors que le classeur est ouvert.

Page 171: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

153

Partie 3 : Le modèle d’objet Excel

Il suffit parfois d’une frappe de touche accidentelle pour que les données setransforment en chaos total. À l’instar des techniques Save et SaveAs que nousavons é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:=TrueEnd 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’avoirfermer 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’undes classeurs est nouveau.

PropriétésMême si les classeurs constituent le point central d’Excel, on passe moins detemps à 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 vousdevez afficher un graphique dans une zone relativement étroite et que vous nedisposez 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

Page 172: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

154

Partie 3 : Le modèle d’objet Excel

Chapitre 7

de commande dans une feuille de calcul qui présente des informations complé-mentaires sur le graphique actif.

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 SelectEnd Sub

Pour plus d’informations sur la création et la manipulation des graphiques dans VBA,reportez-vous au chapitre 15, « Graphiques ».

Afficher des formesLes classeurs contiennent une quantité de données et quelle que soit la manièredont vous structurez les données, il n’est pas toujours simple d’appréhenderl’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 desinformations utiles aux utilisateurs. Si vous vous servez des formes et autresobjets de dessin pour proposer des informations, vous pouvez également choisirde 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 lestenants et les aboutissants si l’utilisateur peut les activer ou les désactiver à saguise. La figure 7.3 présente la boîte de message produite par la procédure : encliquant 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 IfEnd Sub

Page 173: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

155

Partie 3 : Le modèle d’objet Excel

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 peutemployer 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 fichiersVous pouvez exploiter deux aspects des informations de fichiers pour manipulerle classeur : le chemin d’accès du fichier et le son nom complet. Le chemind’accès représente le listing complet des répertoires d’un fichier, commeC:\Excel\Données, alors que le nom complet du classeur inclut le nom de fichierdu classeur, comme C:\Excel\Données\T12004.xls. Pour faire référence à cespropriétés dans le classeur qui héberge le code de la macro, servez-vous de cesdeux méthodes :

ThisWorkbook.PathThisWorkbook.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écutionpour l’ouvrir et tapez MsgBox (ThisWorkbook.FullName) ou MsgBox(ThisWorkbook.Path) pour trouver les informations de répertoire et de nom defichier pour vos procédures. Ces informations n’ont pas grande importance sivous ne prévoyez pas de transférer votre code en-dehors du classeur, mais si vousdevez faire référence à ce classeur particulier depuis un autre emplacement, vousdevrez employer le nom complet du fichier. En outre, même si vous pouvez obte-

Page 174: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

156

Partie 3 : Le modèle d’objet Excel

Chapitre 7

nir les mêmes informations en essayant d’enregistrer le fichier et en cliquant surla flèche de la liste déroulante Enregistrer sous pour trouver le dossier danslequel le classeur est stocké, avec la fenêtre Exécution vous n’êtes pas obligé dequitter Visual Basic Editor, ce qui fluidifie votre travail.

Remarque Le nom complet d’un fichier comprend un chemin d’accès, maiscelui-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 SaveAsde 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 classeursans 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 fragmentde code suivant, Excel ferme le classeur actif sans enregistrer les changement nonsauvegardés :

ThisWorkbook.Saved = TrueThisWorkbook.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. Parexemple, si vous appartenez à une entreprise qui réalise un nombre important deventes 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 soncomportement par défaut qui consiste à recalculer le classeur en vérifiant lesvaleurs dans la table de la base de données, vous risquez d’attendre un longmoment 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 valeurschaque fois que l’on ouvre le classeur et si les valeurs ne sont pas disponibles, ilgénère une erreur.

Demander un mot de passe à l’ouverture d’un classeurMaintenir l’intégrité des données dans un environnement d’entreprise constituel’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 venantfureter dans votre système ou les utilisateurs internes ayant obtenu des privilègessupplémentaires et qui parcourent l’intranet, vous pouvez également choisir derestreindre l’accès à l’un de vos classeurs en demandant aux utilisateurs habilités

Page 175: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

157

Partie 3 : Le modèle d’objet Excel

de fournir un mot de passe correct lorsqu’ils enregistrent toute modification duclasseur.

Le code suivant permet à un utilisateur de définir un mot de passe qu’il devrafournir pour ouvrir le classeur. Une fois que la personne a ouvert le classeur, ellesera en mesure de le modifier à sa guise, mais uniquement si elle connaît le motde passe !

Sub MotDePasseLecture()Dim strPassword1 As StringDim strPassword2 As StringstrPassword1 = 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 IfEnd 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 pourle 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’ilavait prévu. Rappelez-vous que si les données sont suffisamment importantespour être protégées, il est préférable d’ajouter des mesures supplémentairespour surveiller le mot de passe.

Pour protéger votre classeur, vous pouvez également empêcher les utilisateursd’enregistrer les modifications sauf s’ils connaissent le mot de passe qui protègele classeur. Lorsqu’un classeur est protégé en écriture, la propriété WriteReservedest positionnée sur True. Ne commencez pas par écrire à la volée le code quichange un mot de passe protégé en écriture. En effet, l’utilisateur doit saisir lemot de passe actuel avant d’en définir un nouveau. En conséquence, la routinesuivante vérifie que le classeur actif n’est pas protégé en écriture avant d’autoriserl’utilisateur à définir un mot de passe qu’il devra saisir pour être habilité à enre-gistrer les changements.

Sub MotDePasseÉcriture()Dim strPassword1 As StringDim strPassword2 As StringstrPassword1 = 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

Page 176: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

158

Partie 3 : Le modèle d’objet Excel

Chapitre 7

ActiveWorkbook.WritePassword = strPassword1 Else MsgBox ("Le classeur est déjà protégé en écriture.") End If MsgBox ("Le mot de passe est défini.") End IfEnd Sub

Protéger les classeurs contre les modificationsLorsque vous utilisez la méthode WritePassword pour protéger votre classeur,vous demandez aux utilisateurs de connaître le mot de passe qui leur permetd’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, vouspouvez définir un autre mot de passe que les utilisateurs doivent saisir avant depouvoir 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 duclasseur) 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, lesprotections s’appliquent à l’ensemble du classeur.

Voici la syntaxe de la méthode Protect de l’objet Workbook :

Protect[PPPPaaaasssssssswwwwoooorrrrdddd], [SSSSttttrrrruuuuccccttttuuuurrrreeee], [WWWWiiiinnnnddddoooowwwwssss]

Pas besoin de tableau cette fois ! Le paramètre Password représente le mot depasse (obligatoire), les paramètres Structure et Windows sont optionnels. Pardé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êtresdu classeur seront protégées.

Sub DéfinirProtection()Dim strPassword1 As StringDim 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.")

Page 177: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

159

Partie 3 : Le modèle d’objet Excel

End If'De retour dans la partie de la routine qui vérifie la protection. Else MsgBox ("Le classeur est déjà protégé en écriture.") End IfEnd Sub

Au QuotidienQuand 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 venonsde voir vérifiait les erreurs et, au lieu s’arrêter quand la procédure s’exécutaitdans un classeur protégé, la routine continuait tranquillement jusqu’à la finsans informer l’utilisateur d’un quelconque problème. La seule manière fiablede vérifier la présence d’une protection consiste à interroger les propriétésProtectStructure 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’unclasseur :

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

Page 178: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

160

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Au QuotidienCréer des mots de passe valables

Les meilleurs mots de passe sont des chaînes aléatoires de caractères, maisce 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érezun nombre. Par exemple, votre mot de passe peut ressembler àprog#2003exce, que l’on peut lire « programmation de la version 2003d’Excel ». Quoi qu’il en soit, évitez les mots du dictionnaire en français ou danstoute 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’Excelest suffisamment fort pour obliger un attaquant à passer quelques 30 jours enmoyenne pour découvrir la clé qui déverrouille un classeur, mais les donnéesfinanciè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 lesprotéger contre le vol ou une divulgation accidentelle, servez-vous d’un pro-gramme de cryptage commercial plus puissant.

MéthodesLe 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 invoquerpour agir dans vos classeurs. Vous pouvez ajouter une classeur à la liste de vosfichiers et URL favoris, activer le classeur pour l’exploiter sans le nommer danschaque 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âchescomme manipuler les valeurs d’une feuille de calcul ou sauvegarder un classeuren faisant une copie du fichier avec la méthode SaveCopyAs, exploitent toutes despropriétés et des méthodes du classeur actif. Lorsque l’on commence à travaillersur plusieurs classeurs à partir d’une même macro, cependant, il faut informer lemoteur 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 decode suivant : il fait du classeur T42004Ventes.xls le classeur actif.

Page 179: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

161

Partie 3 : Le modèle d’objet Excel

Workbooks("T42003Ventes.xls").Activate

Attention Il est important de se rappeler que la propriété ThisWorkbook et lapropriété ActiveWorkbook peut faire référence à des classeurs différents. Lapremiè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 surcinq classeurs mais que vous n’en avez modifié que deux, vous pouvez les activertour à 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").ActivateEnd Sub

Méthode AddToFavorites

Précédemment dans ce chapitre, nous avons étudié comment ajouter le nomd’un fichier enregistré à la liste des fichiers récemment utilisés du menu Fichieravec la propriété AddToMru. Vous pouvez également ajouter le fichier à la listeFavoris 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 barred’outils. Pour ce faire, dans le menu Outils, choisissez Personnaliser et cliquezsur l’onglet Commandes de la boîte de dialogue Personnalisation. Dans levolet 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 desfavoris, servez-vous de n’importe quelle méthode liée à un objet qui référence unobjet classeur, comme dans les deux fragments de code suivants :

Page 180: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

162

Partie 3 : Le modèle d’objet Excel

Chapitre 7

ActiveWorkbook.AddToFavoritesThisWorkbook.AddToFavorites

Méthode FollowHyperlink

Pour créer des fichiers d’aide et d’informations dans les applications Excel quevous créez, enregistrez-les en tant que pages web. Vous pouvez ainsi configurerune série de liens hypertexte sur lesquels les utilisateurs cliquent pour obtenir del’aide sur une feuille ou tout autre objet. Le code suivant présente la syntaxe debase de la méthode FollowHyperlink et le tableau 7.4 détaille les paramètres lesplus employés.

expression.FollowHyperlink(AAAAddddddddrrrreeeessssssss, SSSSuuuubbbbAAAAddddddddrrrreeeessssssss, NNNNeeeewwwwWWWWiiiinnnnddddoooowwww, EEEExxxxttttrrrraaaaIIIInnnnffffoooo, MMMMeeeetttthhhhoooodddd, HHHHeeeeaaaaddddeeeerrrrIIIInnnnffffoooo)

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 quevous 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 dansle tableau servent uniquement lorsque l’on doit appeler la page web par le biaisd’instructions HTTP (Hypertext Transfer Protocol) spécifiques. Consultez votreadministrateur 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 auchapitre 25, « Excel et le web ».

Imprimer et prévisualiser les classeursAvec 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 cesmots (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.

Tableau 7-4. Paramètres de la méthode FollowHyperlink

Paramètre Type Description

Expression Obligatoire Expression qui retourne un objet Workbook.

Address String, obligatoire

Adresse du document cible.

SubAddress Variant, optionnel

Emplacement au sein du document cible. La valeur par défaut est une chaîne vide.

NewWindow Variant, optionnel

True pour afficher l’application cible dans une nouvelle fenêtre. La valeur par défaut est False.

Page 181: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

163

Partie 3 : Le modèle d’objet Excel

expression.PrintOut(FFFFrrrroooommmm, TTTToooo, CCCCooooppppiiiieeeessss, PPPPrrrreeeevvvviiiieeeewwww, AAAAccccttttiiiivvvveeeePPPPrrrriiiinnnntttteeeerrrr, PPPPrrrriiiinnnnttttTTTTooooFFFFiiiilllleeee, CCCCoooollllllllaaaatttteeee, PPPPrrrrTTTTooooFFFFiiiilllleeeeNNNNaaaammmmeeee)

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 laboî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 boutonRechercher 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 aucunede 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 pourimprimer 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 etdescriptions sont simples à une exception près. Lorsque vous positionnez leparamètre Preview sur True, Excel affiche le classeur en mode Aperçu avantimpression dans lequel l’utilisateur doit cliquer sur le bouton Imprimer pourcommencer l’impression.

Page 182: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

164

Partie 3 : Le modèle d’objet Excel

Chapitre 7

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 auxfeuilles, 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 margeavant l’impression. Lorsqu’il est positionné sur False, les boutons Page et Margessont désactivés, mais l’utilisateur peut toujours choisir d’imprimer (en cliquantsur le bouton Imprimer) ou non (en cliquant sur le bouton Fermer).

Les collections Sheets et WorksheetsLa plupart des utilisateurs qui entendent « feuille » dans un classeur, pensent àune feuille de calcul, avec des lignes, des colonnes, des cellules et des formules. Ilexiste cependant plusieurs types de feuilles dans un classeur. Il y a évidemment lafeuille de calcul, mais également la feuille de graphique. Voilà qui est quelque peu

Tableau 7-5. Paramètres de la méthode PrintOut

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 optionnel

Numéro de la page à laquelle débute l’impression. Si on omet cet argument, l’impression commence au début du document.

To Variant optionnel

Numéro de la dernière page à imprimer. Si on omet cet argument, l’impression se termine à la dernière page.

Copies Variant optionnel

Nombre de copies à imprimer. Si cet argument est omis, une copie est imprimée.

Preview Variant optionnel

True pour qu’Excel invoque l’aperçu avant impression avant d’imprimer l’objet. False (ou omis) pour imprimer l’objet immédiatement.

ActivePrinter Variant optionnel

Définit le nom de l’imprimante active.

PrintToFile Variant optionnel

True pour imprimer dans un fichier. Si on ne spécifie pas PrToFileName, Excel invite l’utilisateur à saisir le nom du fichier de sortie.

Collate Variant optionnel

True pour assembler plusieurs copies.

PrToFileName Variant optionnel

Si PrintToFile est positionné sur True, cet argument spécifie le nom du fichier dans lequel imprimer.

Page 183: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

165

Partie 3 : Le modèle d’objet Excel

confus. En effet, une feuille de calcul peut héberger un graphique, mais si vousutilisez l’Assistant Graphique, vous avez la possibilité de placer le graphique surune feuille de graphique séparée. Les deux autres types de feuilles gèrent lesmacros Excel 4 : une pour les macros américaines et une autre pour les macrosinternationales.

PropriétésLes collections Sheets et Worksheets ont en commune un grand nombre de pro-priétés, mais vous devez prêter attention à quelques points importants lorsquevous 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é etcompte 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 graphiqueet de feuilles de calcul du classeur. Vous pouvez utiliser la propriété Count descollections Sheets et Worksheets pour examiner la structure du classeur avec de lapasser à une autre procédure pour continuer le traitement.

Sub VérifClasseur() Do While Worksheets.Count < 12 ThisWorkbook.Sheets.Add LoopEnd Sub

Le reste de cette procédure se trouve après la section relative à la méthode Add del’objet Workbook.

Propriété Name

Le nom fait partie de la face publique de la feuille. Il l’identifie dans la barred’onglets et permet de l’identifier dans le code VBA. Pour modifier le nom d’unefeuille de calcul, vous définissez sa propriété Name. Par exemple, pour copier lesventes 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 = strWkshtNameEnd Sub

Page 184: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

166

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Propriété Visible

La propriété Visible constitue l’autre propriété fréquemment employée dans lescollections 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 : lesconstantes Excel xlSheetVisible, xlSheetHidden et xlSheetVeryHidden. Si la pro-priété Visible est positionnée sur xlSheetVisible la feuille apparaît dans la barred’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 decliquer 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éen’apparaît pas dans boîte de dialogue Afficher et ne peut être rendue accessibleque par le biais du code VBA en modifiant la valeur de la propriété Visible.

MéthodesLa collection Sheets héberge un grande variété de méthodes qui permettentd’ajouter, de supprimer, de déplacer, de copier et de définir les options de miseen 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. Pourcréer une nouvelle feuille de calcul dans un classeur existant, on utilise laméthode Add, dont la syntaxe est la suivante :

Sheets.Add(BBBBeeeeffffoooorrrreeee, AAAAfffftttteeeerrrr, CCCCoooouuuunnnntttt, TTTTyyyyppppeeee)

Les paramètres Before et After sont mutuellement exclusifs : celui que vousemployez dépend de l’emplacement de la nouvelle feuille dans le classeur. Lesparamè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

Page 185: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

167

Partie 3 : Le modèle d’objet Excel

ThisWorkbook.Sheets.Add Before:=ActiveSheet

La dernière instruction présume que la feuille active est la Feuil1.

Remarque Contrairement aux tables classiques, qui comment par une valeurd’index de 0 par défaut, les collections Sheets et Worksheets commencent parune valeur d’index de 1.

Pour ajouter plusieurs feuilles de calcul à un classeur, le système d’aide de VisualBasic Editor indique que l’on peut positionner le paramètre Count sur le nombrede 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. Ildétermine le type de la feuille ajoutée au classeur avec l’une des quatre constantessuivantes :

● 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 unefeuille à 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 typede feuille) la collection Worksheets pour déterminer le nombre de feuilles dans leclasseur et ajouter la feuille après. Le code suivant représente l’une de méthodepour 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 unclasseur donné, créez le classeur avec le nombre approprié au lieu d’ajouterdes feuilles ultérieurement. Vous éviterez ainsi tout problème d’accès auclasseur : un utilisateur qui aurait ouvert le classeur ou un problème réseau aumoment 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 desfeuilles, elle en supprime. Avec la méthode Delete de la collection Sheets, vous

Page 186: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

168

Partie 3 : Le modèle d’objet Excel

Chapitre 7

pouvez supprimer n’importe quelle feuille du classeur. En revanche, avec laméthode Delete de la collection Worksheets, vous ne pourrez pas supprimer acci-dentellement une feuille de graphique (ce qui est également vrai si vous essayezde supprimer une feuille de calcul avec la méthode Delete de la collectionCharts).

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 sonnom ou soit par sa position dans la collection, et invoquer la méthode Delete. Parexemple, n’importe laquelle des lignes de code suivantes supprime la feuille decalcul intitulé Récapitulatif, en admettant qu’il s’agit de la quatrième feuille d’unclasseur :

Worksheets("Récapitulatif").DeleteSheets("Récapitulatif").DeleteWorksheets(4).DeleteSheets(4).Delete

Vous pouvez également supprimer la feuille active avec la propriété ActiveSheetdans l’instruction suivante :

ActiveSheet.Delete

Il est important de noter, toutefois, que la dernière des quatre lignes de code del’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 classeurcréé pour la société Mon Jardin et qui contient cinq feuilles, la quatrième étantune feuille de graphique. Dans ce classeur, le quatrième membre de la collectionWorksheets est la feuille Récapitulatif, mais le quatrième membre de la collectionSheets 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 lecas dans lequel vous voulez supprimer toutes les feuilles sauf une et que vousen 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 servird’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 lecode 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 vousdemander si vous êtes sûr de vouloir supprimer la feuille. Ce n’est évidemmentpas le comportement attendu dans une procédure automatisée. Pour désactiverles alertes, faites appel à la propriété DisplayAlerts de l’objet Application. Il estcependant préférable de les réactiver de sorte que, si un problème inattendu seproduit, la procédure ne se poursuive pas sans que vous ou un collègue n’ayez pu

Page 187: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

169

Partie 3 : Le modèle d’objet Excel

vérifier qu’aucun problème ne s’en suivra.

Sub SupprimerFeuille() Application.DisplayAlerts = False Sheets(1).Delete Application.DisplayAlerts = TrueEnd Sub

Méthodes Move et Copy

Le code VBA permet de changer la position des feuilles d’un classeur ou dedéplacer ou de copier une feuille vers un nouveau classeur. On peut prendrepour exemple un classeur employé dans un rapport annuel ou un autre type deprésentation. Ce type de rapport suit souvent des directives de mise en formestrictes. Il peut également être intéressant de déplacer ou de copier une feuilled’un classeur à un classeur récapitulatif. Par exemple, si un directeur de projetrécapitule des dépenses en main d’œuvre et en équipement sur une feuille dontil 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 ounon conserver la feuille d’origine. La copie est une opération non destructive ence que la feuille copiée n’est pas supprimée. En revanche, si vous la déplacez, ellesera supprimée de son emplacement d’origine.

Les méthodes Move et Copy permettent de définir une position cible pour lafeuille 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 lenombre de pages dans le classeur existant et déplace la page Récapitulatif à la findu 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 unetable dans la collection Sheets. La procédure suivante, par exemple, place lesfeuilles 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.

Page 188: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

170

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Objet PageSetup

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 enforme des données de manière plus détaillée au chapitre 10, « Mise en formed’objets Excel », mais il est logique de voir comment modifier la disposition desfeuilles 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ésreflétant la position, l’orientation, les marges et le niveau de détail de l’affichaged’une feuille de calcul. Le tableau 7.6 liste les propriétés les plus importantes del’objet PageSetup, mais vous en trouverez une liste complète dans l’aide de VisualBasic 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).

Page 189: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

171

Partie 3 : Le modèle d’objet Excel

Notez que les valeurs des paramètres de marge s’expriment en points (un pointest égal à 1/72e de pouce, soit environ 1/28e de centimètre). Si vous ne voulez pasgarder 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èsesde 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 codesuivant :

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 oucolonne imprimée sur une page. Dans la majorité des cas, vous pouvez laisserExcel 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 à droiteou la ligne qui se trouve au-dessous du saut de page.

Remarque Nous détaillerons le référencement des lignes et des colonnes auchapitre 8, « Plages et cellules ».

Voici la syntaxe qui définit un saut de page manuel au-dessus de la ligne 30 de laFeuil2 :

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’unedes constantes Excel xlPageBreakNone ou xlNone, comme dans les exemplessuivants :

Worksheets("Feuil2").Rows(30).PageBreak = xlPageBreakNone

Propriété DescriptionRightMargin 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).

Tableau 7-6. Propriétés sélectionnées de l’objet PageSetup (Suite)

Page 190: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

172

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Worksheets("Feuil1").Columns("D").PageBreak = xlNone

Pour supprimer tous les sauts de page d’une feuille de calcul, servez-vous de lamé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 calculLes feuilles de calcul constituent l’élément vital d’un classeur et VBA propose ungrand nombre de méthodes permettant de retirer le maximum de vos feuilles decalcul. Certaines de ces méthodes sont similaires à celles disponibles pour lesclasseurs, 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 decalcul ;

● Protect qui permet de demander un mot de passe aux utilisateurs pourmodifier 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 formulesd’une feuille de calcul. Elle est particulièrement pratique si ces formulesextraient des données qui peuvent avoir changer depuis la dernière ouverture duclasseur les héberge. La syntaxe de la méthode Calculate est simple : il suffit denommer la feuille de calcul à calculer et d’ajouter la méthode Calculate, commedans les exemples suivants :

Worksheets(1).CalculateWorksheets("Récapitulatif").Calculate

Pour actualiser le résultat de chaque formule de chaque classeur ouvert, vouspouvez ajouter la méthode Calculate seule (raccourci pour Application.Calcu-late) au code VBA.

Normalement, Excel recalcule les formules chaque fois que vous effectuez unemodification, mais vous pouvez choisir quand Excel recalcule vos formules. Cechoix constitue une science inexacte : si les valeurs affichées doivent toujoursreprésenter les résultats les plus récents alors que ceux-ci changent en perma-

Page 191: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

173

Partie 3 : Le modèle d’objet Excel

nence, il est préférable qu’Excel recalcule les formules à chaque changement. Uneautre approche consiste à placer un bouton de commande dans une feuille decalcul sur lequel les utilisateurs cliquent pour recalculer les formules lorsqu’ilsont 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èreles données à partir de plusieurs autres sources. Si votre réseau est actif ou si vousdevez actualiser des centaines de formules, il peut être plus intéressant de créerun 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) surl’une des constantes xlCalculate :

● xlCalculationAutomatic, la valeur par défaut, avec laquelle Excel recalculeles formules à chaque changement.

● xlCalculationManual, avec laquelle l’utilisateur doit appuyer sur MAJ+F9pour recalculer les formules de la feuille de calcul active.

● xlCalculationSemiautomatic, qui recalcule toutes les formules d’une feuillede calcul, excepté celles qui se trouvent dans un tableau.

Pour calculer les formules juste avant d’enregistrer le classeur, optez pour unrecalcul manuel puis positionnez la propriété CalculateBeforeSave de l’objetApplication sur True, comme dans le code suivant :

Application.Calculation = xlCalculationManualApplication.CalculateBeforeSave = True

Méthode Protect

La première ligne de défense contre les changements dans une feuille de calculcommence par un mot de passe que les utilisateurs doivent fournir avant d’êtrehabilités à ouvrir le classeur. La méthode Protect de l’objet Workbook est quelquepeu limitée, mais elle protège votre classeur contre les accès non autorisés, leschangements dans la structure du classeur ou les modifications de taille et deplacement 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 Sheetet Worksheet proposent davantage d’options.

expression.Protect(PPPPaaaasssssssswwwwoooorrrrdddd, DDDDrrrraaaawwwwiiiinnnnggggOOOObbbbjjjjeeeeccccttttssss, CCCCoooonnnntttteeeennnnttttssss, SSSScccceeeennnnaaaarrrriiiioooossss, UUUUsssseeeerrrrIIIInnnntttteeeerrrrffffaaaacccceeeeOOOOnnnnllllyyyy, AAAAlllllllloooowwwwFFFFoooorrrrmmmmaaaattttttttiiiinnnnggggCCCCeeeellllllllssss, AAAAlllllllloooowwwwFFFFoooorrrrmmmmaaaattttttttiiiinnnnggggCCCCoooolllluuuummmmnnnnssss, AAAAlllllllloooowwwwFFFFoooorrrrmmmmaaaattttttttiiiinnnnggggRRRRoooowwwwssss, AAAAlllllllloooowwwwIIIInnnnsssseeeerrrrttttiiiinnnnggggCCCCoooolllluuuummmmnnnnssss, AAAAlllllllloooowwwwIIIInnnnsssseeeerrrrttttiiiinnnnggggRRRRoooowwwwssss, AAAAlllllllloooowwwwIIIInnnnsssseeeerrrrttttiiiinnnnggggHHHHyyyyppppeeeerrrrlllliiiinnnnkkkkssss, AAAAlllllllloooowwwwDDDDeeeelllleeeettttiiiinnnnggggCCCCoooolllluuuummmmnnnnssss, AAAAlllllllloooowwwwDDDDeeeelllleeeettttiiiinnnnggggRRRRoooowwwwssss, AAAAlllllllloooowwwwSSSSoooorrrrttttiiiinnnngggg, AAAAlllllllloooowwwwFFFFiiiilllltttteeeerrrriiiinnnngggg, AAAAlllllllloooowwwwUUUUssssiiiinnnnggggPPPPiiiivvvvoooottttTTTTaaaabbbblllleeeessss)

Page 192: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

174

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Le tableau 7.7 présente les valeurs par défaut de chacun de ces paramètres etdécrit ce qui est ou n’est pas autorisé lorsque ces options sont positionnées surTrue ou False.

Tableau 7-7. Paramètres de la méthode Worksheet.Protect

ParamètreValeur par 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.

Page 193: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

175

Partie 3 : Le modèle d’objet Excel

Pour étendre la protection de la feuille de calcul, vous pouvez également limiterles 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 lafeuille ;

● 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électionnern’importe quelle valeur.

L’extrait de code suivant empêche les utilisateurs de sélectionner une cellule dansla feuille de calcul protégée intitulée Janvier :

Worksheets("Janvier").EnableSelection = xlNoSelection

ParamètreValeur par 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.

Tableau 7-7. Paramètres de la méthode Worksheet.Protect (Suite)

Page 194: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

176

Partie 3 : Le modèle d’objet Excel

Chapitre 7

Important La propriété EnableSelection prend uniquement effet si la feuillede calcul est protégée.

À 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 decode 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’écrireune 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 individuelleen tant que fichier séparé avec la méthode SaveAs de la méthode Worksheet.

expression.SaveAs(FFFFiiiilllleeeeNNNNaaaammmmeeee, FFFFiiiilllleeeeFFFFoooorrrrmmmmaaaatttt, PPPPaaaasssssssswwwwoooorrrrdddd, WWWWrrrriiiitttteeeeRRRReeeessssPPPPaaaasssssssswwwwoooorrrrdddd, RRRReeeeaaaaddddOOOOnnnnllllyyyyRRRReeeeccccoooommmmmmmmeeeennnnddddeeeedddd, CCCCrrrreeeeaaaatttteeeeBBBBaaaacccckkkkuuuupppp, AAAAddddddddTTTTooooMMMMrrrruuuu, TTTTeeeexxxxttttCCCCooooddddeeeeppppaaaaggggeeee, TTTTeeeexxxxttttVVVViiiissssuuuuaaaallllLLLLaaaayyyyoooouuuutttt, LLLLooooccccaaaallll)

La méthode SaveAs de l’objet Worksheet est très similaire à celle de l’objetWorkbook ; 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 Selectpermet d’intervenir simultanément sur plusieurs feuilles de calcul. Prenons unexemple dans l’interface utilisateur : vous pouvez déplacer simultanément deuxfeuilles de calcul en cliquant sur l’onglet de la première, en cliquant sur l’ongletde la deuxième tout en maintenant la touche MAJ enfoncée et en faisant glisserles deux feuilles vers leur nouvelle position dans le classeur.

Remarque Dans le cas que nous venons de mentionner, la première feuillede 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 tablecomme argument de la méthode Select, comme dans l’exemple suivant :

Worksheets (Array ("Feuil1", "Feuil2")).Select

Page 195: EXCEL Microsoft Office Excel

Cha

pitr

e 7

Classeurs et feuilles de calcul

177

Partie 3 : Le modèle d’objet Excel

Dans ce chapitre, vous avez fait la connaissance des propriétés et méthodes lesplus importantes dans le cadre de la manipulation des feuilles de calcul et desclasseurs Excel. Vous êtes entièrement libre de choisir le comportement que voussouhaitez 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 motde 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 niveaudes plages et des cellules.

Page 196: EXCEL Microsoft Office Excel
Page 197: EXCEL Microsoft Office Excel

179

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Plages et cellulesManipulations de base. . . . . . . . 179Référencement des plages . . . . 183Manipulation de groupes de cellules . . . . . . . . . . . . . . . . . 190

Plages nommées . . . . . . . . . . . 194Validation des données . . . . . . . 204

Avant d’exploiter les informations contenues dans un classeur, vous devez yaccéder. Nous avons déjà vu comment accéder à des divers éléments du modèled’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 baseSi la cellule constitue l’unité de travail de base d’une feuille de calcul Excel, ausein du modèle d’objet Excel, l’unité de travail de base est l’objet Range. Il permetde manipuler des groupes de cellules et des cellules individuelles.

Localiser la plage activeL’objet PlageActive n’existe pas, mais il existe d’autres moyens pour exploiter laplage sélectionnée. La méthode classique consiste à employer l’objet Selection. Cedernier 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 leseffectuiez é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 encaractè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 decalcul en appuyant sur CTRL+A, mais une seule cellule est active (généralementA1, si on utilise CTRL+A).

Page 198: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

180

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Sélectionner une plageLa méthode Select d’un objet Range propose diverses manières de sélectionnerune plage de cellules. La plupart de ces procédures sont similaires à une sélectionpar le biais du clavier, ce qui en simplifie l’émulation.

L’exemple suivant utilise la propriété CurrentRegion de l’objet ActiveCell poursélectionner la plage de cellules utilisées dans la feuille de calcul. La procédureInsertNewSheet copie la plage dans le presse-papier, la colle dans une nouvellefeuille de calcul, lui applique la mise en forme appropriée et, pour finir, efface lecontenu, laissant des cellules vides pour une nouvelle année d’informations dansle 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-

Page 199: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

181

Partie 3 : Le modèle d’objet Excel

sez l’une des valeurs du tableau 8.1, Excel étend la plage en exploitant les mêmesrègles que celles de la touche Fin combinée avec l’une des touches de directionpour 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 classeurY2001ByMonth.xls pour trouver celle qui contient la valeur la plus élevée. Unefois l’entrée trouvée, Excel étend la plage vers le haut et le bas pour inclure toutesles entrées de cette plage horaire et remplace la couleur de remplissage des cellu-les par du bleu.

Sub HighLightTimeFrame()Dim MyCell As Range, strAddress As StringDim 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 = 41End 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.

Page 200: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

182

Partie 3 : Le modèle d’objet Excel

Chapitre 8

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

Page 201: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

183

Partie 3 : Le modèle d’objet Excel

Au QuotidienComment Excel étend-il la plage ?

Pour localiser une cellule qui correspond à l’un des types spéciaux dutableau 8.1, Excel commence la recherche à la cellule active. À partir de cepoint, il effectue une recherche minutieuse vers la droite et vers le bas et ilsé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 auxcritères, Excel modifie le sens de la recherche, passe à une recherche plus« paresseuse » et retourne la première cellule qui correspond.

Excel continue la recherche vers la droite et vers le haut. S’il ne trouve aucunecorrespondance, il continue la recherche vers la gauche. Puis à nouveau versle bas et ensuite vers le haut.

Pour connaître les cellules qu’Excel sélectionne, rappelez-vous les règlessuivantes :

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

Référencement des plagesLa 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-

Recherche 1

Recherche 4 Recherche 2

Recherche 3

Page 202: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

184

Partie 3 : Le modèle d’objet Excel

Chapitre 8

lage par rapport à une autre cellule, par nom ou par la sélection en cours. Lapropriété Range permet de référencer une cellule de plusieurs manières. Voici lasyntaxe de la méthode Range :

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.Range(Cell1, Cell2)

expression Élément obligatoire qui retourne un objet Application, Range ouWorksheet. Si on omet expression, ActiveSheet est implicite.

Cell1 Variable Variant obligatoire qui référence avec la notation A1 une celluleou une plage de cellules. Si vous utilisez le paramètre Cell1 pour faire référence àune plage de cellules, la variable Variant peut contenir l’opérateur de plage (undouble 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. Ilest également possible de fournir un nom définit localement.

Cell2 Variable Variant qui, associée à Cell1, indique la cellule qui se trouve dansl’angle inférieur droit de la plage.

Comme le démontre la description de la propriété, les manières de spécifier lescellules 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 commeobjet 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 lignesou des colonnes.

Référencer les plages de la feuille de calcul activeDans VBA, le référencement d’une plage sur la feuille de calcul active est sansaucun 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’estpas indispensable, sans compter que cette action ralentit les performances dela procédure (voir la section « Copie de données entre des plages et destableaux », 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 uneseule ligne, au lieu de sélectionner d’abord la plage puis d’appliquer la miseen forme.

Page 203: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

185

Partie 3 : Le modèle d’objet Excel

Par exemple, pour mettre en évidence la liste complète des entrées de 6:00dans 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 inactiveLe nombre de feuilles de calcul dans un classeur Excel est limité uniquement parla quantité de mémoire disponible et les informations peuvent être réparties denombreuses 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 devezindiquer la feuille de calcul qui contient la plage.

Sur une feuille de calcul inactive, on utilise la propriété Range de la mêmemaniè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 faisaitréférence à la cellule D6. Sur une feuille de calcul inactive, on s’y réfère avec lecode 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 trouveou non sur la feuille de calcul active.

Référencer les cellules d’une plagePour référencer une cellule individuelle au sein d’une plage, on procède commepour une cellule dans un classeur. La cellule qui se trouve dans l’angle supérieurgauche 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 classeurY2001ByMonth.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 feuillede calcul), vous pouvez utiliser la cellule A1 de l’objet Range. De même, l’entrée7:00 P.M. du seizième jour (la cellule N21 dans la feuille de calcul) est la celluleK16 de l’objet Range.

Référencer des cellules avec la propriété OffsetSi les informations dont vous avez besoin se trouvent à un emplacement donnépar rapport à une cellule connue, vous pouvez utiliser la propriété Offset pourréférencer la cellule, en indiquant le nombre de lignes et de colonnes à partird’un emplacement défini. Le principe est similaire à celui utiliser pour orienterune personne à partir d’un lieu précis. La personne que vous renseignez doit se

Page 204: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

186

Partie 3 : Le modèle d’objet Excel

Chapitre 8

rendre au point de départ et une fois sur place, elle peut suivre les directionsindiqué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 ladroite, alors que les nombres négatifs indiquent un déplacement vers le haut etvers la gauche. Zéro conserve la ligne ou la colonne en cours. La routineTable_Calcul (voir figure 8.1) utilise la propriété Offset pour définir la formuledes colonnes Valeur actuelle et Intérêts payés.

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 IntegerDim Temp As String, intRow As Integer, intColumn As IntegerDim 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"

Page 205: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

187

Partie 3 : Le modèle d’objet Excel

'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/" & _ 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êtLe 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 cechapitre), les contrôles de formulaire et les boutons de commande. Pour cons-truire le classeur, procédez de la manière suivante :

Page 206: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

188

Partie 3 : Le modèle d’objet Excel

Chapitre 8

1 Ouvrez un classeur vide en cliquant sur le bouton Nouveau de la barred’outils Standard ou en choisissant Nouveau classeur Excel dans leVolet 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

■ 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 desdescriptifs. Faites correspondre le nom de chaque cellule de lacolonne B avec la description de la colonne A : Nom, Capital,Valeur_capitalisée, TIA, Années, Paiement. Ignorez la cellule du tauxeffectif 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 formulesuivante : =TAUX.EFFECTIF(TIA;12).

Remarque Lorsque vous saisissez cette formule la première fois, uneerreur #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.

Page 207: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

189

Partie 3 : Le modèle d’objet Excel

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 unbouton sur la feuille de calcul (voir figure 8.3). La boîte de dialogueAffecter une macro s’affiche pour vous permettre de sélectionner lamacro Table_Calcul.

8 Sélectionnez le texte du bouton et saisissez : Tracer le tableau d’amor-tissement.

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 lanouvelle feuille de calcul. Si vous tentez de créer une feuille de calcul avec unnom en double, la macro génère une erreur.

Définir une plage avec la propriété CellsPour référencer une plage de cellules, il est également possible de la désigner avecla méthode Cells. Pour ce faire, vous devez spécifier les numéros de ligne et decolonne des cellules qui se trouvent dans les angles opposés de la plage. Pour unecellule individuelle, vous désignez deux fois la même cellule, puisqu’il s’agit biende la même cellule dans les deux angles opposés. Par exemple, pour sélectionnerla cellule D6, on utilise le code suivant :

Range(Cells(4,6), Cells(4,6)).Select

Page 208: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

190

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Référencer des colonnes et des lignesPour 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 descellules.

Columns("A:E").SelectColumns.EntireColumn.AutoFit

Référencer des groupes de cellules non contiguësLes 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 dumois 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 cellulesOn 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 estmême possible de travailler conjointement avec deux groupes de cellules pourgénérer une union de deux groupes ou trouver leur intersection.

Dimensionner les cellules par programmationLa taille par défaut de chaque cellule est 10,71 points (80 pixels) de large sur12,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 toutemodification de la hauteur affecte l’ensemble de la ligne. En conséquence, pourtoute modification réalisée avec une macro, servez-vous de la propriété Width del’objet Column ou de la propriété Height de l’objet Row. Vous pouvez définir lesproprié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 envous servant de la méthode AutoFit.

Lier de deux plagesIl n’est pas toujours souhaitable de créer une plage de cellules non contiguës, parexemple, 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

Page 209: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

191

Partie 3 : Le modèle d’objet Excel

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’autresjours de la semaine. Pour créer les plages des jours de semaine identiques, onpeut faire appel à la méthode Union de l’objet Application.

Pour plus d’informations sur l’objet Application, reportez-vous au chapitre 6, « L’objetApplication ».

La méthode Union prend plusieurs plages et les combine en une seule. Sa syntaxeest la suivante :

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.Union(AAAArrrrgggg1111 aaaassss RRRRaaaannnnggggeeee,,,, AAAArrrrgggg2222 aaaassss RRRRaaaannnnggggeeee,,,, …………)

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

Sub CalcWeeklyAverages()Dim intDayOfWeek As Integer, intWeeks As Integer, intHours As IntegerDim rgeWeek As Range, rgeMonth As Range, rgeDay As RangeDim sglTotal As SingleDim 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")

Page 210: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

192

Partie 3 : Le modèle d’objet Excel

Chapitre 8

'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) 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 videsSi on fournit des données erronées à une procédure, le résultat généré seraerroné. 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 toutesles valeurs ont été saisies. Pour ce faire, vous pouvez rechercher les cellules videset demander à l’utilisateur les valeurs manquantes. Pour localiser les cellulesvides, on fait appel à la méthode SpecialCells de l’objet Range. Voici la syntaxe dela méthode SpecialCells:

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.SpecialCells(TTTTyyyyppppeeee, VVVVaaaalllluuuueeee)

● expression Objet Range obligatoire.

● Type Valeur obligatoire qui doit correspondre à l’une des constantesxlCellType 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 correspondentaux constantes xlSpecialCellsValues, listées dans le tableau 8.2, peuvent êtreadditionnées pour retourner plusieurs types de cellules spéciales.

Page 211: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

193

Partie 3 : Le modèle d’objet Excel

La procédure FindEmptyCells recherche les cellules vident des zones de donnéesdans 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 RangeDim strPrompt As String, strTitle As String, strReturn As StringDim 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")

Tableau 8-2. Constantes xlSpecialCellsValues

Constante DescriptionValeur numérique

xlErrors Retourne les cellules qui contiennent des erreurs 16

xlLogical Retourne les cellules qui contiennent une valeur logique (autrement dit, booléenne)

4

xlNumbers Retourne les cellules qui contiennent des valeurs numériques.

1

xlTextValues Retourne les cellules qui contiennent du texte 2

Page 212: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

194

Partie 3 : Le modèle d’objet Excel

Chapitre 8

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

Plages nomméesVous savez déjà qu’il est possible de sélectionner une plage de cellules dans unefeuille 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 nomdans 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 pouvezvous servir de son nom.

Définir une plage nomméeExcel 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 plagenommée dans le classeur en indiquant le nom à utiliser et la plage vers laquelle ilpointe.

Pour ana lyser l e s ventes de chaque pér iode hor a i re du c la s seurY2001ByQuarter.xls, il est plus simple de lire les formules si chaque périodehoraire constitue une plage. Au lieu de sélectionner manuellement la plage et detaper son nom, servez-vous d’une macro. La routine CreateNames créer uneplage nommée pour chaque période horaire de la feuille de calcul en cours et lanomme en fonction du nom de la feuille de calcul et de la période horaire. Lasyntaxe de base est la suivante :

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.Add(NNNNaaaammmmeeee, RRRReeeeffffeeeerrrrssssTTTToooo, VVVViiiissssiiiibbbblllleeee, MMMMaaaaccccrrrrooooTTTTyyyyppppeeee, SSSShhhhoooorrrrttttccccuuuuttttKKKKeeeeyyyy, CCCCaaaatttteeeeggggoooorrrryyyy, NNNNaaaammmmeeeeLLLLooooccccaaaallll, RRRReeeeffffeeeerrrrssssTTTTooooLLLLooooccccaaaallll, CCCCaaaatttteeeeggggoooorrrryyyyLLLLooooccccaaaallll, RRRReeeeffffeeeerrrrssssTTTTooooRRRR1111CCCC1111, RRRReeeeffffeeeerrrrssssTTTTooooRRRR1111CCCC1111LLLLooooccccaaaallll)

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 plageavec la notation A1. Obligatoire si on n’utilise pas RefersToR1C1.

● RefersToR1C1 Valeur Variant qui indique les cellules à inclure dans laplage 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 lesboîtes de dialogue Définir un nom, Coller un nom et Atteindre. Si cette

Page 213: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

195

Partie 3 : Le modèle d’objet Excel

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 à Namedans les formules et le code VBA).

Au QuotidienNommer 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 (_). 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 colonnequi contient des entrées fondées sur l’heure. À chaque passage de la boucle, lenom 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ées1:00 P.M. de la feuille de calcul February sont intitulées February1.

Sub CreateNames()Dim strRangeName As String, strWorksheetName As StringDim intCounter As Integer, strRangeFormula As StringDim strColumn As String, strR1C1Formula As StringDim 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")

Page 214: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

196

Partie 3 : Le modèle d’objet Excel

Chapitre 8

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

Figure 8-4. Cette procédure crée des noms dans le classeur Y2001ByQuarter.xls.

Styles de notationLa 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 pointervers une colonne spécifique simplifie le déplacement vers la gauche ou la droiteau sein des colonnes : si la valeur 4 pointe vers la colonne D, en ajoutant 6, onpointe 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 lanotation A1 ou la méthode Cells. Dans la procédure on a substitué la méthodeConvertFormula à la méthode Cells pour construire une référence de style L1C1et la convertir en notation A1.

La méthode ConvertFormula permet également de convertir la notation A1 ennotation 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 adressede cellule d’un type de référence à l’autre. Rien ne vous empêche cependant depasser une formule plus complexe, comme dans l’exemple suivant, qui calcule lamoyenne journalière des deux premiers lundis de janvier dans le classeurY2001ByQuarters.xls.

strA1Formula = Application.ConvertFormula( _ Formula:=" =AVERAGE(R5C2:R5C13, _ R12C2:R12C13), fromReferenceStyle:=xlR1C1, _ toReferenceStyle:=xlA1)

Page 215: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

197

Partie 3 : Le modèle d’objet Excel

Voici la syntaxe de la méthode ConvertFormula :

eeeexxxxpppprrrreeeessssssssiiiioooonnnn.ConvertFormula(FFFFoooorrrrmmmmuuuullllaaaa,,,, FFFFrrrroooommmmRRRReeeeffffeeeerrrreeeennnncccceeeeSSSSttttyyyylllleeee,,,, TTTTooooRRRReeeeffffeeeerrrreeeennnncccceeeeSSSSttttyyyylllleeee,,,, TTTTooooAAAAbbbbssssoooolllluuuutttteeee,,,, RRRReeeellllaaaattttiiiivvvveeeeTTTToooo)

● Expression Expression obligatoire qui retourne un objet Application.

● Formula Variable Variant obligatoire qui fournit la formule à convertirsous forme de chaîne.

● FromReferenceStyle Entier obligatoire qui correspond à l’une des deuxconstantes xlReferenceStyle.

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

● 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 versune cellule unique. Les références relatives se réfèrent à cette cellule.

Le tableau 8.3 liste les constantes xlReferenceStyle et xlReferenceType disponiblesque 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

Page 216: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

198

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Au Quotidien Noms et formules

Excel stocke les noms des plages sous forme de formules. Cette gestion peutvous être profitable pour optimiser les raccourcis employés dans les feuillesde calcul. D’ordinaire, il est impossible d’exploiter plusieurs fois un mêmenom dans un même classeur, mais comment procéder si votre classeur com-por te p lus ieu r s feu i l l es s im i la i res , comme dans le c lasseurY2001ByMonth.xls ? Il serait intéressant de pouvoir utiliser le même nom pourfaire référence à la même zone d’une feuille de calcul sans tenir compte de lafeuille sur laquelle elle se trouve. Pour ce faire, il vous suffit de créer un nomspé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 lazone 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 dunom de la plage (appliquez les règles de nommage normales après le pointd'exclamation).

Le point d’exclamation sert de séparateur entre le nom de la feuille et le nomde 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 appelaux 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 encliquant sur Insertion, Nom, Définir, vous pouvez employer une référence rela-tive. Ouvrez par exemple le classeur Y2001ByMonth.xls, affichez la feuille decalcul 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.

Page 217: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

199

Partie 3 : Le modèle d’objet Excel

Le total qui s’affiche dans la cellule doit être identique, $5 571,00. Examinezla définition du nom ValeursJournalières. Revenez à la boîte de dialogue Définirun nom et sélectionnez ValeursJournalières dans la zone de liste. La zone Faitréférence à contient la valeur =January!D$6:D$36. Les noms de colonnessont 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 devaleurs de cette colonne, des lignes 6 à 36.

Attention Vous pouvez utiliser les noms que vous avez créés dansn’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ésIl 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 esttoutefois intéressant de savoir comment ils sont exploités et comment les appli-quer. Les noms réser vés sont Zone_de_conso l ida t ion , Cr i tè res ,Base_de_données, Extraction, Zone_d_impression, Impression_des_titres etune 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 laplage de cellules imprimées. Bien que cette tâche puisse également être réaliséeavec la propriété PrintArea de l’objet Worksheet.PageSetup, la plageZone_d_impression est plus souple. La propriété PrintArea permet uniquement

Page 218: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

200

Partie 3 : Le modèle d’objet Excel

Chapitre 8

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

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. Laplage Zone_d_impression sert à informer Excel des valeurs à imprimer.

Sub SelectPrint()Dim intReturn As Integer, strPrompt As String, strTitle As StringDim 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

Page 219: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

201

Partie 3 : Le modèle d’objet Excel

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 '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.PrintPreviewEnd Sub

Page 220: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

202

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Copier des données entre des plages et des tableauxToutes les informations d’un classeur sont simples à exploiter avec une macroVBA. 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 VBAlit 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 écrivantdes plages de cellules en une fois. En effet, la plus grand part du temps nécessaireest employée par la configuration dont VBA a besoin pour accéder à la feuille decalcul. 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’unecellule ou de plusieurs centaines de cellules.

Attention Comme souvent, il existe un point de rendement décroissant ou depanne 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, onutilise 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 pourqu’elle puisse contenir un tableau. En fait, dans le cadre de la copie de donnéesvers et depuis une feuille de calcul, la variable Variant ne peut pas être déclaréecomme tableau. Elle doit être déclarée comme simple type Variant, comme dansl’exemple suivant.

Dim varA As Variant

Pour lire les données qui se trouvent dans une variable Variant, on se sert d’uneinstruction d’affectation, autrement dit, varA = Range("January1PM") ou varA =Range("H6:H36"). Ces deux exemple lisent la même plage dans la variable varA etaccè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 pourréférencer la plage. Par exemple, on peut utiliser ce code pour afficher une boîtede message contenant la somme des valeurs des cellules E12:E15.

Sub VariantSum()Dim varA As Variant, intSum As IntegervarA = Range("E12:E15")intSum = WorksheetFunction.Sum(varA)MsgBox (intSum)End Sub

Page 221: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

203

Partie 3 : Le modèle d’objet Excel

Remarque Une plage retourne toujours un tableau multidimensionnel, engénéral bidimensionnel, quel que soit le nombre de colonnes. Le deuxièmedimension contient au moins un élément, mais peut en héberger davantageselon le nombre de colonnes qui se trouvent dans la plage.

Pour déterminer la taille d’un tableau, vous pouvez faire appel aux fonctionsLBound 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 queUBound(var) retourne la limite supérieure.

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. Parexemple, dans le classeur Y2001ByMonth.xls, l’instruction varA = Range("Janu-aryAllValues") lit toutes les cellules de B3:Q38. Pour obtenir le nombre delignes, servez-vous de UBound(varA, 1) ou simplement de UBound(varA). Pourretrouver le nombre de colonnes, utilisez la commande UBound(varA, 2).

Lorsque vous lisez les valeurs d’une plage nommée, vous pouvez égalementréduire ou augmenter le nombre de cellules lues avec la méthode Resize. Parexemple, pour lire uniquement les sept premières lignes de données, sur unepér iode de t ro i s heures à compter de 1 :00 P.M. dans l e c lasseurY2001ByQuarter.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’heured’écrire des informations dans des cellules. Assurez-vous que la taille de plage etcelle 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 lamé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 deuxobjectifs : elle dimensionne le tableau à la taille de la plage et elle le remplit avecles valeurs actuellement contenues dans la plage de sorte que lorsque les donnéessont écrites en retour, Excel conserve les valeurs qui n’ont pas été modifiées aucours de la procédure.

La procédure suivante illustre la différence des temps de traitement entre l’accèsdirect aux cellules et leur copie initiale dans un tableau (chaque méthode estrépétée 50 fois de sorte que le temps nécessaire aux lectures soit notable).

Sub ProcessTime()Dim rgeCells As Range, intCount As IntegerDim strPrompt As String, strTitle As StringDim sglStart As Single, sglEnd As SingleDim rgeCell As Range, varCells As Variant

Page 222: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

204

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Dim intRows As Integer, intColumns As IntegerDim 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 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éesLa saisie des données dans une feuille de calcul ou un formulaire constitue l’unedes activités les plus ennuyeuses qui existent. Si vous aviez saisi des numérosISBN dans une base de données huit heures par jour, cinq jours par semainependant deux mois, vous commenceriez à apprécier le travail des opérateurs desaisie. Des colonnes de nombres se transposent devant vos yeux, des livres saisiss’égarent dans votre pile « à faire » et vous passer d’une main à l’autre pour éviterles désordres nerveux. Ajoutez le risque d’erreurs de saisie et vous comprendrezpourquoi 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, unerè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 saisirdes données non valides ou si l’utilisateur doit saisir à nouveau les données avant

Page 223: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

205

Partie 3 : Le modèle d’objet Excel

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’objetRange. 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. Letableau 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

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.

Page 224: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

206

Partie 3 : Le modèle d’objet Excel

Chapitre 8

Les paramètres des méthodes Add et Modify employées dépendent du type devaleur à valider. Le tableau 8.5 liste les valeurs correspondant à chaque type devalidation.

Attribut Description

PropriétésShowError 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.

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.

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.

Tableau 8-4. Propriétés et méthodes de l’objet Validation (Suite)

Page 225: EXCEL Microsoft Office Excel

Cha

pitr

e 8

Plages et cellules

207

Partie 3 : Le modèle d’objet Excel

Pour définir le critère de validation pour 600 cellules dans la colonne H d’unefeuille 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 uneplage ou non, on utilise l’objet Range (par exemple Range("A16"). Une fois quevous 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.

Type de validation ParamètresxlValidateList 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.

xlValidateWholeNumber, xlValidateDate, xlValidateDecimal, xlValidateTextLength ou xlValidateTime

Formula1 et/ou Formula2 doivent être spécifiés.

Tableau 8-5. Liste des paramètres utilisés dans une instruction Add ou Modify (Suite)

Page 226: EXCEL Microsoft Office Excel
Page 227: EXCEL Microsoft Office Excel

209

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

Page 228: EXCEL Microsoft Office Excel
Page 229: EXCEL Microsoft Office Excel

211

Partie 4 : Fonctions VBA avancées

Chapitre 9

Manipulation des données avec VBA

Texte. . . . . . . . . . . . . . . . . . . . . . 211Nombres. . . . . . . . . . . . . . . . . . . 225

Dates et heures. . . . . . . . . . . . . 233

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 ? Oude l’année ? Quel est le délai qui sépare deux commandes d’un client ? Le formatutilisé pour écrire les données dans un fichier texte peut-il être lu dans une basede données ? Pour répondre à ces questions, et à bien d’autres, vous faites appelaux 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 lelibellé 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 etles tableaux, nous avons mis en correspondance le terme anglais et le termefrançais (entre parenthèses). À vous de les utiliser à bon escient.

TexteMême si de prime abord on envisage Excel comme une application de traitementde 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 classeurou 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 desfeuilles de calcul.

Page 230: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

212

Partie 4 : Fonctions VBA avancées

Chapitre 9

Déterminer si la valeur d’une cellule est du textePour manipuler du texte sans générer d’erreur, vous devez d’abord déterminer sila variable ou la valeur de la cellule à utiliser est, en fait, une valeur de texte. Pource 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 leserreurs de saisie des données, comme lorsqu’un utilisateur saisit des donnéesincorrectes 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 : lespersonnes qui saisissent des données sont tellement habituées à saisir le codeclient en premier, qu’elles oublient qu’elles doivent maintenant commencer parle nom de la société.

La fonction ISTEXT (ESTTEXTE) est écrite en majuscules parce qu’elle constitue l’une desnombreuses fonctions de feuille de calcul que l’on peut appeler avec du code VBA. Pourplus d’informations sur l’appel des fonctions de feuille de calcul comme ISTEXT dans lecode VBA, reportez-vous à la section « Cette fonction existe-t-elle dans VBA ? », plus loindans ce chapitre.

La fonction ISTEXT sert également à assurer que les données importées depuisune source externe sont correctement formatées avant que vous n’exécutiez unensemble de procédures. Si vous avez déjà exécuté une routine de traitement detexte sur des données autres que textuelles, vous savez précisément le chaosqu’une petite vérification permet d’éviter. Vous pouvez également utiliserISTEXT comme fonction de base si vous n’êtes pas absolument sûr du type desdonnées textuelles reçues. En revanche, si vous êtes sûr qu’il s’agit de texte, vouspouvez écrire une procédure pour parcourir les cellules non vides de la feuille decalcul 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é unnombre ? Dans ce cas, servez-vous de la fonction STR (CTXT) pour représenterle 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’adressede 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 lesfonctions de feuille de calcul que vous pouvez employer pour déterminer si unevaleur correspond à une catégorie donnée.

Tableau 9-1. Les fonctions de la famille IS (EST)

Fonction Excel

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

Page 231: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

213

Partie 4 : Fonctions VBA avancées

À 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éesavec le format de nombre Standard (par défaut) et que vous essayez d’écrire unechaîne qui se trouve être un nombre (comme, 0000097239) dans la cellule, leszéros de tête seront supprimés. Pour vous assurez qu’Excel traite votre entréecomme du texte, remplacez le format de nombre par Texte. Pour ce faire, dans lemenu Format de l’interface Excel, choisissez Cellule, cliquez sur l’onglet Nombreet sélectionnez Texte dans la liste Catégorie. Vous obtiendrez le même résultatavec la propriété NumberFormat de l’objet Range.

Par exemple, pour appliquer le format de nombre Texte à la cellule active (qui estconsidérée comme une plage dans ce contexte), servez-vous de la ligne de codesuivante :

ActiveCell.NumberFormat = "@"

Vous pouvez appliquer n’importe quel format de nombre proposé dans la listePersonnalisée de la boîte de dialogue Format de cellule (voir figure 9.1). Si vousn’ê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.

Fonction Excel

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

Tableau 9-1. Les fonctions de la famille IS (EST) (Suite)

Page 232: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

214

Partie 4 : Fonctions VBA avancées

Chapitre 9

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 traitementUne fois que vous avez déterminé que les données sur lesquelles vous voulezeffectuer des opérations de texte sont de fait du texte, vous pouvez continuer etvous occuper de leur aspect. Pour traiter les données, vous disposez de deuxfonctions : CLEAN (EPURAGE) et TRIM (SUPPRESPACE). La fonctionCLEAN 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’ilssont généralement saisis en appuyant sur la touche Ctrl associée à une séquencede touches. Les caractères non imprimables n’apparaissent souvent pas dans lefichiers texte ou les feuilles de calcul, mais si vous importez les données à partird’un autre programme, ils peuvent être interprétés comme une mise en formeou des instructions relatives à la structure des données qui n’étaient pas visibleslorsque 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 estd’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 sonnom 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-bulles’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 listedes propriétés disponibles pour l’objet.

Page 233: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

215

Partie 4 : Fonctions VBA avancées

Remarque La ligne ci-après est uniquement constituée de caractères nonimprimables :

La fonction TRIM (SUPPRESPACE)est similaire à la fonction CLEAN en ce queles deux fonctions suppriment des caractères indésirables, mais la fonctionTRIM é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èrealphanumérique de la chaîne. La fonction TRIM élimine également tous lesespaces 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 fixepour compléter la chaîne. Pour appeler les fonctions CLEAN et TRIM, ainsiqu’une foule d’autres fonctions de texte et de données pratiques, ajoutez le nomde 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îneAvec la fonction LEN (NBCAR) de VBA, vous pouvez déterminer le nombre decaractères qui composent une chaîne. À l’instar de la fonction ISTEXT qui valideles données, la fonction LEN assure que la longueur des données saisies, impor-

Page 234: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

216

Partie 4 : Fonctions VBA avancées

Chapitre 9

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 chaqueISBN est exactement de 10 caractères. Si vous saisissez le titre, les auteurs, l’ISBNet le prix de chaque livre de la bibliothèque de votre entreprise, vous devez vousassurer que la longueur des ISBN est correcte. Les ISBN ne sont qu’un exempleparmi d’autres ; cette fonction peut servir à vérifier la longueur des données dansune 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 descodes 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 produitsaisi 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"End If

Si vous exploitez d’anciens systèmes de gestion de base de données ou une basede 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 chaqueentrée a été correctement lue. En outre, même si la taille des bases de données estsouvent 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érablede limiter la taille de chaque champ (à l’exception éventuellement du champ descommentaires) au minimum de caractères.

La fonction LEN peut également servir à garantir que les mots de passe que voscollègues assignent aux classeurs et aux feuilles de calcul possèdent une longueurminimum. Comme nous l’avons étudié au chapitre 7, le plan de protection parmot de passe dans Excel n’empêche pas la compromission de vos données, maisvous pouvez compliquer la tâche d’un attaquant en assignant des mots de passelongs. Excel accepte des mots de passe d’une longueur maximale de15 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 depasse 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.

Page 235: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

217

Partie 4 : Fonctions VBA avancées

Au QuotidienValidation ou instruction If…Then ?

Plusieurs méthodes sont à votre disposition pour fixer la longueur des valeurssaisies. Au chapitre 8, nous avons appris à utiliser la propriété Validation del’objet Range pour établir un critère que doit satisfaire la valeur d’une cellulepour être acceptée. En positionnant le paramètre Type de objet Validation surxlValidateTextLength, 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 à desrègles de validation.

● Afficher un type de boîte de message spécifique (information, avertisse-ment ou arrêt) et programmer son comportement (passage à la cellulesuivante 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…Elseplus 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 clientpeut varier d’un employé à l’autre.

Concaténer le texte de plusieurs cellules ou variablesCertaines des procédures que vous avez étudiées dans ce livre génèrent des boîtesde message qui affichent du texte issu de plusieurs variables ou cellules. Lesauteurs de ce livre admettent avoir été un peu trop rapides et s’être perdus dansl’ordre des rubriques. Il est à présent temps de vous montrer comment ajouterdu 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 avezsans doute déjà employé l’opérateur & pour indiquer un « et » logique dans desexpressions comme

If ((Range("C5").Value >= 1000) & (Range("D5")<=10)) Then…

Page 236: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

218

Partie 4 : Fonctions VBA avancées

Chapitre 9

Ne tombez pas dans ce piège ! L’opérateur de concaténation VBA & est différentde 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, pourindiquer 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 IfEnd 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éeavant d’exporter les données dans un programme où la longueur des données estfixe. Pour ajouter des caractères au début ou à la fin d’une chaîne, servez-vous dela fonction REPT (REPT) combinée à l’opérateur &. Voici la syntaxe de la fonc-tion REPT :

Application.WorksheetFunction.Rept(tttteeeexxxxtttteeee, nnnnoooo____ffffooooiiiissss)

Le paramètre texte représente le texte à répéter et no_fois indique le nombre defois que le texte doit être répété. Par exemple, dans une entreprise en pleineexpansion qui utilise des codes de commande de longueur variable, vous pouvezremplacer le code sur 5 caractères par un code sur 10 caractères. Cela ne poseaucun problème dans Excel, il suffit de répéter un zéro devant chaque code decommande pour obtenir une longueur de 10 caractères. La procédure suivantevérifie la longueur de la chaîne du code de commande dans les cellules identifiéespar l’utilisateur et ajoute suffisamment de x pour obtenir une chaîne de10 caractères.

Public Sub MakeTen()

Dim strFirst, strLast, strAllCells, strPadding, strContents As StringDim 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

Page 237: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

219

Partie 4 : Fonctions VBA avancées

intPadding = 10 - Len(MyCell.Value) strPadding = Application.WorksheetFunction.Rept("0", intPadding) MyCell.NumberFormat = "@" MyCell.Value = strPadding & strContentsEnd If MyCell.NumberFormat = "@" Next MyCell

End Sub

Attention Vérifiez que le code de commande que vous modifiez est stocké entant que chaîne et non comme un nombre. Si vous ajoutez une chaîne de zéroau début d’une cellule qu’Excel convertit en nombre (ce qui inclut les cellulesauxquelles 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îneLes 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 êtreutiles 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 lecas), vous pouvez lire ces chiffres en mémoire, rechercher l’identité de l’éditeurdans une base de données ou le tableau d’une feuille de calcul et programmerl’é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îneou la fonction RIGHT (DROITE), qui retourne les derniers caractères d’unechaîne. La syntaxe des deux fonctions, à l’exception de leurs noms, est identique :

LEFT(ssssttttrrrriiiinnnngggg, lllleeeennnnggggtttthhhh)GAUCHE(tttteeeexxxxtttteeee; nnnnbbbbrrrreeee____ccccaaaarrrr)RIGHT(ssssttttrrrriiiinnnngggg, lllleeeennnnggggtttthhhh)DROITE(tttteeeexxxxtttteeee;;;; nnnnbbbbrrrreeee____ccccaaaarrrr)

Dans ces fonctions, string (texte) représente la variable ou la plage qui contient lachaîne à traiter et length (nbre_car) correspond au nombre de caractères àretourner. Prenons l’exemple d’une feuille de calcul dans laquelle chaque lignereprésente les articles des commandes passées à la société Garden.

Page 238: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

220

Partie 4 : Fonctions VBA avancées

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 chaqueproduit commandé. Dans ce système de nommage, les deux premiers caractèresdu 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 dedemander à l’utilisateur de saisir la catégorie, on peut créer une procédure pourcette action.

Remarque Les données de la feuille de calcul sont toutes en majuscules. Enconsé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 RangeDim 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"

Page 239: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

221

Partie 4 : Fonctions VBA avancées

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 compriscelles 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îneDes 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 leschaînes pour en extraire ce dont on a besoin. Le système d’immatriculation desvéhicules aux États-Unis en est un exemple. Les numéros d’immatriculation ontune 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 faireappel à 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 audé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 laposition du premier caractère à retourner et le nombre de caractères retournés.

MID(ssssttttrrrriiiinnnngggg, ssssttttaaaarrrrtttt, lllleeeennnnggggtttthhhh)STXT(tttteeeexxxxtttteeee;ddddéééébbbbuuuutttt;nnnnbbbbrrrreeee____ccccaaaarrrr)

Pour récupérer les caractères des positions 4 à 8 (soit 5 caractères au total) de lavaleur de la cellule D5, servez-vous du code suivant (en supposant que vous avezcréé les variables strCode et strDetails précédemment :

strCode = Range("D5").ValuestrDetails = Mid(strCode, 4, 5)

Retrouver une chaîne au sein d’une autre chaîneVous vous demandez peut-être pour quelle raison on voudrait récupérer unechaîne au sein d’une autre chaîne. Dans le domaine de la génétique, on peutrechercher 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

Page 240: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

222

Partie 4 : Fonctions VBA avancées

Chapitre 9

Excel pour trouver une sous-chaîne. Supposons plutôt que vous ayez reçu deslignes de données qui, indépendamment de votre volonté, ont été importéesdans 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 fonctionMID sans un minimum de peaufinage. Mais si, pour votre malheur, les donnéesde chaque cellule ressemblent à NC1800230AR7801CL486EXFX2J, il existe unesolution à votre problème.

En réalité, les données se répartissent de la manière suivante : NoCdeNC1800230, Article AR7801, Client CL486, Expédition FedEx Deuxième jour.Comment le découvrir ? Cette méthode repose autant sur l’intelligence que surles compétences. L’intelligence permet de déterminer que le début de chaquechamp 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 partailleurs dans la chaîne. On a employé la même technique de marquage pourlibeller l’article (AR), le client (CL) et la méthode d’expédition (EX).

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 debalisage est similaire à celui des langages HTML (Hypertext Markup Language)et XML (Extensible Markup Language). Il fonctionne avec d’autres systèmesqui 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 permetde connaître l’usage des fonctions SEARCH (CHERCHE) et FIND (TROUVE).Ces deux fonctions retournent un certain nombre de caractères extraits d’unechaîne dans laquelle se trouve un caractère ou une chaîne de texte spécifique. Lesdifférences de fonctionnement de ces fonctions sont minimes mais importantes.Voici leur syntaxe :

SEARCH(ffffiiiinnnndddd____tttteeeexxxxtttt, wwwwiiiitttthhhhiiiinnnn____tttteeeexxxxtttt, ssssttttaaaarrrr____nnnnuuuummmm)CHERCHE(tttteeeexxxxtttteeee____cccchhhheeeerrrrcccchhhhéééé; tttteeeexxxxtttteeee; nnnnoooo____ddddééééppppaaaarrrrtttt)FIND(ffffiiiinnnndddd____tttteeeexxxxtttt; wwwwiiiitttthhhhiiiinnnn____tttteeeexxxxtttt; ssssttttaaaarrrr____nnnnuuuummmm)TROUVE(tttteeeexxxxtttteeee____cccchhhheeeerrrrcccchhhhéééé; tttteeeexxxxtttteeee; nnnnoooo____ddddééééppppaaaarrrrtttt)

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 (?) etun astérisque (*) dans find_text. Le point d’interrogation représente n’importequel caractère, alors que l’astérisque correspond à une suite de caractères. Pourlocaliser un vrai point d’interrogation ou astérisque, saisissez un tilde (~) avantle caractère. La fonction SEARCH n’est pas sensible à la casse, autrement dit sivous cherchez un « e » la fonction récupère également les « E ». La fonctionFIND 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èrerezpas « E ».

Page 241: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

223

Partie 4 : Fonctions VBA avancées

● within_text (texte) représente le texte dans lequel vous rechercheztexte_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 recherchecommence 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 lescombine avec la fonction MID. Après avoir localisé le début de deux champsconsécutifs avec la fonction SEARCH ou la fonction FIND, servez-vous de lafonction 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 fassepartie du package VBA standard, ce n’est pas le cas des fonctions SEARCH etFIND. Vous devez donc utiliser l’objet Application.WorksheetFunction pourappeler ces fonctions, comme dans l’exemple suivant :

Application.WorksheetFunction.Search("AR", ActiveCell.Value)

Remarque La fonction VBA INSTR (CAR) retourne également la position ducaractère dans une chaîne qui commence par une autre chaîne, mais cettefonction est équivalente à la fonction FIND en ce qu’elle est sensible à lacasse.

Reprenons notre scénario cauchemardesque dans lequel les enregistrements descommandes ont été incorrectement importés. Nous allons utiliser les fonctionsSEARCH 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 RangeDim intAR, intCL, intEX As IntegerDim 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)

Page 242: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

224

Partie 4 : Fonctions VBA avancées

Chapitre 9

Next MyCell

End Sub

Cette procédure récupère les chaînes des cellules qui se trouvent dans une plagesaisie 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.

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, vouspouvez vous dispenser de calcul pour déterminer le début de chaque chaîne.

Page 243: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

225

Partie 4 : Fonctions VBA avancées

Au QuotidienTraitement 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épensessubstantielles pour l’entreprise. Une partie de la tâche des administrateursconsiste à 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 lesinformations stockées dans les cookies que votre serveur web place sur lesordinateurs des clients. La programmation des cookies sort de la portée de celivre, 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 nousavons vues p lus tôt dans ce chapi t re : par exemple, la cha îneUI007589TM37900.77589 pourrait constituer le texte d’un cookie, où007589 représente le numéro d’identification utilisateur du visiteur et37900.77589 correspond à la chaîne date/heure indiquant la dernière visitede l’utilisateur (qui, dans ce cas, était le 10/06/2003 à 06:37).

NombresLes rubriques que nous allons étudiées dans les prochaines sections font partiedu 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 cadrede l’entreprise et nous les avons inclus dans ce livre. Ces fonctions sont traitéesdans le contexte des routines VBA, mais nous examinerons suffisammentd’exemples d’utilisation des fonctions financières dans les feuilles de calcul pourvous permettre d’apprendre à les exploiter dans des formules.

Analyse des donnéesLe 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 particulierpour 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’unefeuille 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

Page 244: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

226

Partie 4 : Fonctions VBA avancées

Chapitre 9

Maintenant que vous connaissez les fonctions d’analyse de base comment voscollè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 ouune 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érationapproprié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 etd’appeler cette fonction à partir de l’instruction Case correspondante. On peutaussi demander à l’utilisateur de saisir un numéro d’opération à effectuer aulieu de son nom. Pour éviter les erreurs d’orthographe ou de capitalisation, lesvaleurs doivent correspondre exactement.

Fonction Excel Fonction VBA DescriptionNBA 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, criteria)

Compte le nombre de cellules dans 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

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; critère)

COUNTIF(range, criteria)

Renvoie la somme arithmétique des valeurs de la plage qui répondent au critère

Tableau 9-2. Calculs d’analyse standards disponibles dans Excel et Excel VBA (Suite)

Page 245: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

227

Partie 4 : Fonctions VBA avancées

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

Page 246: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

228

Partie 4 : Fonctions VBA avancées

Chapitre 9

Case Else MsgBox ("Opération non reconnue. Recommencez.") End Select End WithEnd Sub

Remarque Vous avez probablement remarqué le travail économisé avec l’ins-truction With ActiveCell.CurrentRegion. Columns(intColNumber) dans laprocédure Analyse. Sans l’instruction With, le code de référence de la plageparcourt chaque ligne, ce qui le rend difficile à lire. Recherchez toujours cetype d’opportunité pour simplifier votre code.

Calculs financiersL’un montant du remboursement mensuel d’un prêt représente sans doute l’undes calculs financiers les plus exploités. Pour ce calcul, vous utilisez la fonctionPMT (VPM), dont voici la syntaxe :

PMT(rrrraaaatttteeee, nnnnppppeeeerrrr, ppppvvvv, fv, type)VPM(ttttaaaauuuuxxxx;nnnnppppmmmm;vvvvaaaa;vc;type)

Le tableau 9.3 décrit les cinq arguments utilisés avec la fonction PMT (VPM).

Pour emprunter €20 000 avec un taux d’intérêts de 8% et un remboursement en24 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. DansVBA, vous pouvez utiliser l’objet Application.WorksheetFunction pour appeler lafonction PMT dans une procédure VBA. L’exemple ci-après suppose que le taux

Tableau 9-3. Arguments de la fonction PMT (VPM)

Arguments de la fonction PMT

Arguments de la fonction 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)

Page 247: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

229

Partie 4 : Fonctions VBA avancées

se trouve dans la cellule B2, le nombre de mensualités dans la cellule B3, lasomme 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 WithEnd 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 typeest remplacé par when. En effet, type est un mot réservé dans VBA et Excelgénère une erreur au moment de la compilation.

Certaines fonctions de feuille de calcul Excel permettent de déterminer la partied’un paiement dédiée aux intérêts et celle dédiée au principal du prêt. Ces calculssont 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éressantde 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 lapart dédiée aux intérêts. Sa syntaxe est similaire à celle de la fonction PMT, àquelques différentes près :

IPMT(rrrraaaatttteeee, ppppeeeerrrr, nnnnppppeeeerrrr, ppppvvvv, fv, type)INTPER(ttttaaaauuuuxxxx;ppppéééérrrr;nnnnppppmmmm;vvvvaaaa;vc;type)

Les arguments rate (taux), pv (va), fv (vc) et type (type) ont la même significationque 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 êtrecomprise entre 1 et nper (npm). Par exemple, pour déterminer la part mensuelledédiée aux intérêts, servez-vous de la procédure suivante, qui place le résultatdans 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 ?")

Page 248: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

230

Partie 4 : Fonctions VBA avancées

Chapitre 9

With Application.WorksheetFunction curInterest = -1 *(.IPmt(intRate / 1200, intPer, intNper, curPv)) End With

ActiveCell.Value = curInterestEnd Sub

Remarque Cette procédure multiplie curInterest par –1 pour produire unré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 boucleFor...Next autour du calcul de l’intérêt périodique, ce qui place les résultats dansune colonne commençant à la cellule active.

Public Sub DetermineAllInterest()Dim intRate, intPer, intNper, intPayment As IntegerDim curPv, curInterest As Currency

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 fonctionIPMT. Elle détermine la part de remboursement du principal sur un paiement.La syntaxe de la fonction PPMT est exactement identique à celle de la fonctionIPMT, 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 lespaiements, 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.

Page 249: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

231

Partie 4 : Fonctions VBA avancées

La syntaxe de la fonction RATE (TAUX) est similaire à celle des fonctions de lafamille PMT.

RATE(nnnnppppeeeerrrr, ppppmmmmtttt, ppppvvvv, fv, type, guess)

TAUX(nnnnppppmmmm;vvvvppppmmmm;vvvvaaaa;vc;type;estimation)

Il existe quelques différences entre RATE et les autres fonctions PMT. Letableau 9.4 récapitule les arguments de la fonction RATE (TAUX).

Tableau 9-4. Arguments de la fonction RATE (TAUX)

Arguments de la fonction RATE

Arguments de la fonction 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 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.

Page 250: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

232

Partie 4 : Fonctions VBA avancées

Chapitre 9

Ainsi, pour découvrir le taux d’intérêt d’un prêt immobilier de €150 000 pourlequel vous remboursez €1 186,19 par mois pendant 15 ans, la formule suivantedé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’unnombre négatif. Pour vous en souvenir, pensez au fait que l’argent quitte votrecompte en banque.

Déterminer la valeur actuelle d’un investissementLa fonction PV (VA), pour present value (valeur actuelle), retourne la valeuractuelle d’un investissement ce qui, du point de vue financier, correspond à lasomme totale que représente aujourd’hui un ensemble de remboursementsfuturs. Lorsque vous faites un emprunt, le montant de l’emprunt représente lavaleur actuelle pour le prêteur. Par exemple, pour calculer la valeur actuelle d’unprêt de €150 000 à un taux d’intérêt de 5% que vous remboursez mensuelle-ment pendant 15 ans, utilisez la formule suivante :

PV(rrrraaaatttteeee, nnnnppppeeeerrrr, ppppmmmmtttt, fv, type)VA(ttttaaaauuuuxxxx;nnnnppppmmmm;vvvvppppmmmm;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 depériodes de paiement (dans ce cas, 12 * 15, soit 180), pmt (vpm) le montant duremboursement pour chaque période (1 186,19 dans ce cas), fv (vc) la valeurcapitalisée, autrement dit le montant obtenu après le dernier paiement (la valeurcapitalisée d’un prêt est de 0) et type indique si le paiement est du en début ou enfin de mois (0, la valeur par défaut, signifie que le paiement est du à la fin dumois et 1 au début). Ainsi, pour le prêt décrit précédemment, on crée la formulesuivante :

=VA(5%/12;180;-1186,19)

La formule précédente génère une valeur actuelle de €150 000, soit le montanttotal du prêt. La somme totale des paiements représente €213 514,20, mais lavaleur actuelle du prêt est inférieure puisque, au moment du prêt, les intérêtsn’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 investissementNPV (VAN) est une fonction apparentée à PV (VA). Elle calcule la valeur actuellenette d’un investissement. La principale différence entre la valeur actuelle et lavaleur actuelle nette réside dans le fait que la première suppose que la valeur del’investissement diminue dans le temps en raison de l’inflation ou du taux

Page 251: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

233

Partie 4 : Fonctions VBA avancées

d’escompte. Cette supposition se reflète dans la syntaxe de la fonction NPV(VAN) :

NPV(rrrraaaatttteeee, vvvvaaaalllluuuueeee1111, value2, value3…)VAN(ttttaaaauuuuxxxx;vvvvaaaalllleeeeuuuurrrr1111;valeur2;valeur3…)

Une autre différence entre les calculs de la valeur actuelle et de la valeur actuellenette est que les valeurs d’une formule NPV (VAN) peuvent varier, alors quedans un calcul PV (VA) les paiements sont constants sur toute la durée de vie del’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 500aprè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 seuilmagique qui détermine si la valeur actuelle nette rend l’investissement rentable.Vous devez comparer le résultat de plusieurs investissements pour déterminer sivous 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 davantagedu domaine d’une formule Excel que de VBA. Il est cependant important desavoir travailler avec des dates et des heures dans le cadre des tâches avancéesd’Excel.

Numéros de série des dates et des heuresSi vous avez déjà saisi une date dans une cellule de feuille de calcul puis lui avezappliqué 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 etque vous lui appliquez ensuite le format Standard, la valeur de la cellule devient37900. En effet, Excel traite les dates et les heures comme des nombres et noncomme des chaînes. Dans Excel, le comportement par défaut du programmeconsiste à compter à partir du 1er janvier 1900, autrement dit le 1er janvier 1900représente le jour 1, le 2 janvier 1900 représente le jour 2, et ainsi de suite. Cetterepré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 quiest devenue bénéficiaire à compter du 9 janvier 2004 pour atteindre son seuil derentabilité.

Page 252: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

234

Partie 4 : Fonctions VBA avancées

Chapitre 9

Important Les dates antérieures au 1er janvier 1900 sont traitées commedes 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éesvalides.

Fonctions de date et d’heureLes fonctions de date ou d’heure sont utiles dans bien des circonstances. Si vousvous servez d’Excel pour suivre des commandes passées à votre entreprise, faitesappel 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 feuillede 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èchedu 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 lacommande par l’heure en cours. Pour éviter ce problème, créez une macro quiassigne 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 Excel

Fonction 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 (year, month, day)

En fonction d’une année, d’un mois et d’un jour (par exemple, DateSerial(2, 8, 2004), renvoie la date (02/08/2004).

/ TimeSerial (hour, minute, second)

En fonction d’une heure, minute et seconde (par exemple, TimeSerial(19, 30, 24), renvoie l’heure (19:30:24).

Page 253: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

235

Partie 4 : Fonctions VBA avancées

À l’exception des fonctions Weekday et MonthName, pour écrire le résultat del’une des fonctions de date ou d’heure dans une cellule de feuille de calcul, vousdevez 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 sontDateAdd et DateDiff. DateAdd permet d’ajouter un intervalle de temps à unedate ou une heure. Pour ajouter trois jours à la date en cours, servez-vous de laprocé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émentsd’heure une date ou une heure grâce à une syntaxe ingénieuse :

DateAdd("iiiinnnntttteeeerrrrvvvvaaaallll", nnnnuuuummmmbbbbeeeerrrr, ddddaaaatttteeee)

où interval représente le code (entre guillemets) de l’unité d’heure, numberrepré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.6liste les unités disponibles et leurs codes correspondants.

Fonction Excel

Fonction VBA Description

Heure, Minute, Seconde

Hour, Minute, Second

En fonction d’une heure, renvoie le composant heure, minute ou seconde de cette heure.

Année, Mois, Jour

Year, Month, Day

En fonction d’une date, renvoie le composant 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).

Tableau 9-5. Fonctions de date et d’heure (Suite)

Page 254: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

236

Partie 4 : Fonctions VBA avancées

Chapitre 9

Par exemple, pour afficher la date située à 9 semaines à partir d’aujourd’hui dansune 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. Parexemple, 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 lesfonctions DateSerial et TimeSerial, décrite précédemment, mais la fonctionDateAdd est plus souple puisqu’elle vous permet d’exploiter différentes unitésde 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 dela fonction DateAdd, mais au lieu d’utiliser une date de base et un intervalle pourdéterminer une date de fin, la fonction DateDiff utilise deux dates pour détermi-ner l’intervalle entre les deux.

DateDiff ("iiiinnnntttteeeerrrrvvvvaaaallll", ddddaaaatttteeee1111, ddddaaaatttteeee2222, ffffiiiirrrrssssttttddddaaaayyyyooooffffwwwweeeeeeeekkkk, ffffiiiirrrrssssttttwwwweeeeeeeekkkkooooffffyyyyeeeeaaaarrrr)

Le tableau 9.7 liste les arguments de la fonction DateDiff.

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

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.

Page 255: EXCEL Microsoft Office Excel

Cha

pitr

e 9

Manipulation des données avec VBA

237

Partie 4 : Fonctions VBA avancées

Par exemple, la fonction suivante renvoie le nombre de jours entre la dateactuelle et le 2 août 2005 (rappelez-vous que la date doit être placée entre signesdiè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é neufheures, mais si vous soustrayez 0,875 (le numéro de série pour 9:00) de 0,25 (lenuméro de série de 6:00) vous obtenez un nombre négatif, ce que vous ne pouvezpas 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érode série de 6:00, on obtient l’équation 1,25 – 0,875, ce qui donne 0,375 (neufheures ou 9:00). Voici comment mettre cette vérification en œuvre en VBA :

'datTime1 représente l’heure de départ, datTime2 celle de finIf datTime1 > datTime2 ThendatTime2 = datTime2 + 1End IfdatDifference = datTime2 – datTime 1

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

Tableau 9-7. Arguments de la fonction DateDiff (Suite)

Page 256: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

238

Partie 4 : Fonctions VBA avancées

Chapitre 9

Au QuotidienQuand les heures dépassent 24 heures

Si vous avez déjà essayé d’additionner deux heures dans une feuille de calculExcel, 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 heureset affiche uniquement le nombre d’heures qui dépassent 24. Il se produit lemême résultat avec deux instances de 12:00 (12 heures), en fait, même untotal de 49:00 présente 1:00.

Pour contourner ce problème, formatez la cellule qui contient le résultat dansun des formats personnalisés disponibles dans la boîte de dialogue Format decellule (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.

Les crochets ([]) qui encadrent le symbole de l’heure signifient que la limitenormale des 24 heures ne s’applique pas : la cellule affiche correctement25: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 lesaisissant 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é, lenombre d’heures resterait à 0. Sachez également qu’il n’est pas possible deplacer un indicateur de jour ou de mois entre crochets.

Dans ce chapitre, vous avez appris à manipuler les données dans les classeursExcel. Avec les fonctions de Excel VBA vous analysez vos données, concaténez lesvaleurs de plusieurs cellules pour créer des boîtes de message et gérez les dates etles heures. Si les fonctions n’existent pas dans Excel VBA, vous pouvez les appelerà partir du programme Excel principal avec la propriété WorksheetFunction del’objet Application.

Page 257: EXCEL Microsoft Office Excel

239

Partie 4 : Fonctions VBA avancées

Chapitre 10

Mise en forme d’objets Excel

Constantes et palette de couleurs Excel . . . . . . . . . . . . 239Éléments de la feuille de calcul. . . . . . . . . . . . . . . . . . . 250

Polices . . . . . . . . . . . . . . . . . . . . 252Cellules . . . . . . . . . . . . . . . . . . . 254Bordures . . . . . . . . . . . . . . . . . . 256

Dans leur forme d’origine, les feuilles de calcul Microsoft Excel sont relativementordinaires : 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 égalementpréciser le fait que toutes les données sont présentées de manière similaires etque rien ne distingue une cellule d’une autre exceptée la valeur. Si les donnéesconstituent la part la plus importante d’une feuille de calcul, la présentation asont importance.

Dans ce chapitre, vous allez apprendre à exploiter les constantes de couleur et lapalette de couleurs Excel, à modifier la palette de couleurs existante, à passeroutre la limite des 56 couleurs d’Excel et à formater des cellules pour modifierleurs couleurs de remplissage, de police et de bordures.

Constantes et palette de couleurs ExcelExcel propose un grand nombre d’options de mise en forme, mais l’une desméthode les plus intéressantes d’attirer l’attention sur un élément consiste à enmodifier la couleur. Les couleurs mettent les données en évidence et simplifientl’emploi des feuilles de calcul : une couleur de texte différente reflète la valeurd’une cellule, la couleur d’un onglet de feuille de calcul indique qu’on y aapporté 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 decalcul 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 listeles 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

Page 258: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

240

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

Pourquoi ces couleurs sont-elles les seules assorties de constantes ? La raison estliée à la manière dont les couleurs sont créées sur un ordinateur. Vous avez sansdoute déjà étudié le cercle chromatique, probablement en classe, et vous avezappris que l’on peut combiner les pigments rouges, bleus et jaunes pour créer lacouleur de son choix. Si ceci est vrai pour les pigments (peinture ou encre), cen’est pas le cas de la lumière. Pour créer des couleurs à partir de la lumière, on sesert des trois couleurs primaires : rouge, vert et bleu.

La différence entre les pigments et la lumière s’exprime dans le nom de chaquesystè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 commencepar 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é égalede couleurs primaires (rouge, jaune et bleu), on obtient du noir puisqu’on asoustrait toutes les couleurs. Dans le système additif, en revanche, on commencepar le noir (l’absence de couleur ou de lumière) et on ajoute les couleurs. Dans cesystème, si on ajoute du rouge, du vert et du bleu en pleine intensité, on obtientdu blanc.

À l’instar des pigments dont on mélange différentes quantités pour obtenir descouleurs uniques (par exemple, en mélangeant des quantités égales de jaune etde rouge, on obtient de l’orange, alors qu’en mélangeant davantage de rouge quede jaune, on obtient un rouge orangé), il est possible de mélanger des quantitésde 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 quel’on a ajouté la quantité maximum de cette couleur.

Remarque Un pixel se compose en réalité de trois points : l’un qui émet dela lumière rouge, un autre qui émet de la lumière verte et le troisième qui émetde la lumière bleue.

Pour définir une couleur avec un mélange de lumière rouge, verte et bleue, onutilise la fonction Visual Basic RGB dont la syntaxe est la suivante :

RGB(rrrreeeedddd, ggggrrrreeeeeeeennnn, bbbblllluuuueeee)

Dans cette fonction, red représente la quantité de lumière rouge utilisée, greencelle de lumière verte et blue celle de lumière bleue (toute valeur supérieure à 255

Constante Description Constante DescriptionvbBlue Bleu vbMagenta Magenta

vbCyan Cyan vbWhite Blanc

Tableau 10-1. Couleurs de base de l’ordinateur et leurs constantes (Suite)

Page 259: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

241

Partie 4 : Fonctions VBA avancées

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.

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 : leprogramme ne peut afficher simultanément que les 56 couleurs qu’il conservedans la palette de couleurs. Si vous tentez d’assigner à un élément une couleurabsente 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 lapalette de couleurs Excel standard, ainsi que son nom.

Tableau 10-2. Valeurs RVB des constantes de couleurs VBA

ConstanteComposante rouge

Composante verte

Composante 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

Tableau 10-3. Valeurs RVB des couleurs Excel standard

NomComposante rouge

Composante verte

Composante 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

Page 260: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

242

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

NomComposante rouge

Composante verte

Composante 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

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

Tableau 10-3. Valeurs RVB des couleurs Excel standard (Suite)

Page 261: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

243

Partie 4 : Fonctions VBA avancées

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 principalExcel) d’assigner de nouvelles valeurs RVB à n’importe quel emplacement de lapalette.

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 uniquementemployée comme représentation interne des couleurs.

Pour assigner une couleur à un élément d’une feuille de calcul, on se réfère à saposition 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éspar votre entreprise, certaines couleurs seront répétées. Ce n’est pas si grave, ilsuffit de les éloigner suffisamment dans le graphique de sorte qu’il soit simple dedifférencier chaque segment. En alternative, vous pouvez créer un graphique quirepré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 desproduits restants sur un autre graphique.

NomComposante rouge

Composante verte

Composante 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

Tableau 10-3. Valeurs RVB des couleurs Excel standard (Suite)

Page 262: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

244

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

Palette de couleur Excel standardSachant 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’ellehé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 NumColorEnd 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’unevariable qui lui fait répéter la même couleur dans les 56 cellules. Pour vousentraî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é).

Que faire si les couleurs proposées dans la palette ne répondent pas à vosattentes ? Il n’est pas rare qu’une entreprise possède une convention de couleurspour ses logos et ses documents officiels. Pour éviter d’employer une couleurinexacte, vous pouvez remplacer une couleur existante par une couleur person-nalisée.

Pour assigner une nouvelle couleur à un emplacement de la palette de couleursdu programme Excel, procédez comme suit :

1 Dans le menu Outils, choisissez Options et cliquez sur l’onglet Couleur.

Page 263: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

245

Partie 4 : Fonctions VBA avancées

2 Cliquez sur la couleur à remplacer puis sur Modifier. Si la couleur quiconvient 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 surl’onglet Personnalisées.

3 Dans la liste déroulante Palette de couleurs, vérifiez que l’élément RVB estsé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, uneligne de code suffit.

ActiveWorkbook.Colors (index) = RGB (red, green, blue)

Mais quelles couleurs faut-il remplacer ? L’une de celles que vous n’emploierezpas, 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 particuliersi 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 classeuractif en se servant des couleurs 26, 27, 28, 29 et 30 :

Sub CustomColors() ActiveWorkbook.Colors(26) = RGB(240, 248, 255)

Page 264: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

246

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

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 couleursSi vous atteignez la limite des 56 couleurs et manquez de couleurs pour lelogo de votre entreprise, insérez-le sous forme d’une image. Les couleurs desimages 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. Enrevanche, si vous devez la modifier manuellement pour chaque classeur, vouspréférerez sans doute trouver une autre solution. Vous pouvez, par exemple,écrire une macro qui copie la palette de couleurs entre une classeur quelconqueet 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 leclasseur contenant la palette souhaitée soit intitulé NosCouleurs.xls, servez-vousde la procédure suivante pour copier la palette de couleurs :

Sub ObtenirNosCouleurs() ActiveWorkbook.Colors = Workbooks("NosCouleurs.xls").ColorsEnd Sub

Pour copier une palette de couleurs à partir d’un autre classeur dans l’interfaceExcel, 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 choisissezOptions.

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

Page 265: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

247

Partie 4 : Fonctions VBA avancées

La palette de couleurs Excel et le webSi 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 constituentun réel capharnaüm dans un autre : l’interlignage est désactivé, le texte est plusgrand 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 quine comprennent pas les nouveaux langages de balisage. Une autre raison est liéeau fait que certains programmes, comme Microsoft FrontPage, créent du codeparfaitement interprété par Microsoft Internet Explorer, mais moins bien pard’autres navigateurs. Les couleurs ne sont pas différentes des autres instructionsde 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éesainsi 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 lesprincipaux en sont capables. Le tableau 10.4 liste les couleurs HTML standard etleurs valeurs RVB associées de sorte que vous puissiez les ajouter à la palette decouleurs Excel pour créer un classeur dont l’aspect est correct à l’impression etsur le web.

Pour plus d'informations sur l’apparence de ces couleurs à l’écran, reportez-vous à latable des couleurs sur le site MSDN, Microsoft Developer Network, à l’adresse : http://msdn.microsoft.com/workshop/author/dhtml/reference/colors/colors.asp.

Tableau 10-4. Valeurs RVB des couleurs HTML standard

CouleurComposante rouge

Composante verte

Composante bleue Couleur

Composante rouge

Composante verte

Composante 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

Page 266: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

248

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

CouleurComposante rouge

Composante verte

Composante bleue Couleur

Composante rouge

Composante verte

Composante 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

lightcoral 240 128 128 lightcyan 224 255 255

lightgoldenrodyellow

250 250 210 lightgreen 144 238 144

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 mediumaquamarine

102 205 170

mediumblue 0 0 205 mediumorchid 186 85 211

mediumpurple 147 112 219 mediumseagreen

60 179 113

mediumslateblue

123 104 238 mediumspringgreen

0 250 154

mediumturquoise

72 209 204 mediumvioletred

199 21 133

Tableau 10-4. Valeurs RVB des couleurs HTML standard (Suite)

Page 267: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

249

Partie 4 : Fonctions VBA avancées

Pour plus d’informations sur la publication de feuilles de calcul et de classeurs Excel surle 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.

CouleurComposante rouge

Composante verte

Composante bleue Couleur

Composante rouge

Composante verte

Composante 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

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

Tableau 10-4. Valeurs RVB des couleurs HTML standard (Suite)

Page 268: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

250

Partie 4 : Fonctions VBA avancées

Chapitre 1

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 calculMaintenant 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, lequadrillage est gris. Pour adapter sa couleur à votre convenance, attribuez unevaleur RVB ou une constante de couleur personnalisée à la propriété ActiveWin-dow.GridlineColor. Pour assigner une couleur de la palette Excel, servez-vous dela propriété ActiveWindow.GridlineColorIndex. Avec la propriété GridlineColo-

Tableau 10-5. Couleurs de la palette Excel correspondant aux couleurs HTML

Couleur ExcelCouleur HTML

Composante rouge

Composante verte

Composante 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 (jaune)

yellow 255 255 0

Couleurs 7 et 26 (magenta)

fuschia 255 0 255

Couleurs 8 et 28 (cyan)

aqua 0 255 255

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

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

Page 269: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

251

Partie 4 : Fonctions VBA avancées

rIndex vous pouvez revenir à la couleur par défaut en lui attribuant la valeur dela 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 lescouleurs par défaut de la palette de couleurs Excel.

Vous pouvez également modifier l’apparence de l’onglet d’une feuille. Lesonglets se trouvent dans la barre d’onglets, dans la partie inférieure gauche de lafenê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 :

Private Sub Worksheet_Change(ByVal Target As Excel.Range) ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 5End 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 particulier, reportez-vous auchapitre 12, « Événements ».

La figure 10.1 montre deux feuilles de calcul dont on a modifié les onglets avec laprocédure événementielle Worksheet_Change. La feuille de calcul de gauche estactive : Excel affiche une ligne de la couleur de l’onglet sous le nom de la feuillede calcul. Notez qu’Excel affiche le nom de la feuille de calcul en noir un fondblanc pour qu’il soit plus lisible. La feuille inactive à droite présente un ongletdont l’arrière-plan est bleu et le texte blanc, pour indiquer qu’elle a également étémodifiée.

Page 270: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

252

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

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 decalcul à contrôler.

PolicesSi vous programmez Excel avec VBA, n’oubliez pas que les données constituentla 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 labarre d’outils Mise en forme et de la boîte de dialogue Format de cellule dès leursdébuts dans Excel. Dans ce même esprit, vous devez faire de l’objet Font votrerépertoire VBA de base. Le tableau 10.6 liste et décrit les propriétés de l’objetFont.

Page 271: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

253

Partie 4 : Fonctions VBA avancées

La possibilité de créer des formats conditionnels ou des formats qui reflètent lavaleur 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 5pour modifier la couleur du contenu de la cellule active en fonction de sa valeur.

Sub AvailableCredit()

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.

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.

Page 272: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

254

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

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 WithEnd Sub

Si vous ne voulez pas modifier la couleur de tous le contenu de la cellule, faitesappel à la propriété Characters de l’objet Range pour formater une partie de lavaleur 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 :

Characters (ssssttttaaaarrrrtttt, lllleeeennnnggggtttthhhh)

L’argument start représente le caractère à partir duquel la mise en forme débuteet length indique le nombre de caractères (y compris le premier) à mettre enforme. Une fois que vous avez identifié les caractères, utilisez la propriété Font del’objet Character pour modifier l’apparence des caractères. Par exemple, si dansune 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 lamanière suivante :

Sub HighlightAgent()Dim MyCell As RangeDim strFirst, strLast, strAllCells, strCategory As String

strFirst = InputBox("Saisissez la première cellule.")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 = TrueNext MyCellEnd Sub

Pour plus d’informations sur la manipulation des chaînes de texte et autres valeurs decellules et sur la manière de vérifier si le début et/ou la fin d’une sous-chaîne répond à unschéma spécifique, reportez-vous au chapitre 9, « Manipulation des données avec VBA ».

CellulesDans 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, laplupart des formats automatiques proposés par Excel exploitent les couleursintérieures pour distinguer les en-têtes des données.

Page 273: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

255

Partie 4 : Fonctions VBA avancées

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ésde l’objet Interior auquel on se réfère par la propriété Interior d’une cellule. Letableau 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.

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.

Page 274: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

256

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

Pour visualiser les motifs disponibles, représentés par les constantes Excel de lapropriété Pattern dans le tableau précédent, dans le menu Format, choisissezCellules, 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 affectentun aspect différent de l’intérieur d’une cellule que les propriétés PatternColor etPatternColorIndex. La couleur par défaut des propriétés PatternColor et Pattern-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 deremplissage 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 = 2End WithEnd Sub

BorduresPour affecter l’extérieur d’une cellule, on fait appel à la propriété Borders, qui setrouve ê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-

Page 275: EXCEL Microsoft Office Excel

Cha

pitr

e 1

0

Mise en forme d’objets Excel

257

Partie 4 : Fonctions VBA avancées

dex pour identifier l’élément de la bordure : xlDiagonalDown, xlDiagonalUp,xlEdgeBottom, xlEdgeLeft, xlEdgeRight et xlEdgeTop.

Remarque Les constantes xlDiagonalDown et xlDiagonalUp tracent une ligneentre 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 unobjet Border, dont le tableau 10.8 liste les propriétés.

Pour désigner la bordure à définir, placez la constante xlBordersIndex appropriéeentre 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 laplage A1:D1.

Sub BlueBorder() With Worksheets("Feuil1").Range("A1:D1").Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .Color = vbBlue End WithEnd 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éthodeBorderAround :

BorderAround(LLLLiiiinnnneeeeSSSSttttyyyylllleeee, WWWWeeeeiiiigggghhhhtttt, CCCCoooolllloooorrrrIIIInnnnddddeeeexxxx, CCCCoooolllloooorrrr)

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 constantes de xlBorderWeight : xlHairline, xlMedium, xlThick ou xlThin.

Page 276: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

258

Partie 4 : Fonctions VBA avancées

Chapitre 1

0

Les objectifs des arguments LineStyle, Weight, ColorIndex et Color sont décritsdans 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 := vbRedEnd Sub

Dans ce chapitre, nous avons étudié comment Excel gère les couleurs, commentafficher les couleurs dans la palette de couleurs Excel et comment adapter cescouleurs à 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’ensimplifier la lecture. Nous avons également décrit comment mettre en évidencedes feuilles de calcul modifiées depuis leur dernier enregistrement.

Page 277: EXCEL Microsoft Office Excel

259

Partie 4 : Fonctions VBA avancées

Chapitre 11

Création de macros complémentaires et de compléments COM

Présentation des macros complémentaires . . . . . . . . . . . . 259Boîte de dialogue Macro complémentaire. . . . . . . . . . . . . 260Création de macros complémentaires Excel . . . . . . . 262Collection AddIns . . . . . . . . . . . . 264

Création de compléments d’automatisation et COM . . . . . 267Construction d’un complément d’automatisation avec Visual Basic 6 . . . . . . . . . . . . . . 271Génération d’un complément 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 etles décharger dans Microsoft Excel. Vous étudierez également certaines desmacros complémentaires proposées dans Excel et découvrirez comment créer lesvôtres.

Présentation des macros complémentairesLes macros complémentaires étendent les fonctionnalités et les commandesd’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 menuou 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 classeurspécial, appelé Macro complémentaire Microsoft Office Excel (*.xla). On crée lescompléments d’automatisation et COM avec un langage compilé commeVisual 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

Page 278: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

260

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

dans Excel. Autrement dit, les programmeurs et les développeurs tiers peuventfournir 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 optimiseainsi les performances globales d’Excel pour les utilisateurs qui n’utilisent pas cescapacités supplémentaires.

Boîte de dialogue Macro complémentairePour utiliser une macro complémentaire, vous devez la charger dans Excel. Laboîte de dialogue Macro complémentaire (à laquelle vous accédez par le menuOutils, Macros complémentaires) contrôle les macros complémentaires chargéesau 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 macrocomplémentaire indique que celle-ci est chargée. Le tableau 11.1 présente uneliste des macros complémentaires installées avec Excel.

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

Page 279: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

261

Partie 4 : Fonctions VBA avancées

Installer une macro complémentairePour installer une macro complémentaire, il suffit de cocher la case en regard deson 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 desmacros 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. Pardéfaut, les macros complémentaires créées par l’utilisateur sont stockées dans ledossier \Documents and Settings\Utilisateur\Application Data\Micro-soft\AddIns. Rien ne vous empêche cependant de les stocker dans le dossier devotre 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.

Décharger une macro complémentaireUne 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 prochaindémarrage d’Excel, la macro complémentaire ne sera pas chargée.

Remarque Si vous avez supprimé une macro complémentaire, toute formulequi référence des fonctions de cette macro sera actualisée pour refléter lenom de fichier du classeur contenant la macro. Si vous rechargez la mêmemacro, la forme d’origine des formules sera restaurée.

Macro complémentaire DescriptionOutils 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.

Tableau 11-1. Macros complémentaires fournies avec Excel (Suite)

Page 280: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

262

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

Création de macros complémentaires ExcelUne macro complémentaire Excel est un type spécial de classeur contenant unjeu de macros et de fonctions qui effectuent les tâches de votre choix.

Créer une macro complémentaireSupposons que vous disposiez d’une feuille de calcul qui calcule un prix net enfonction 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 duclasseur (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 dialogueMacro complémentaire. Par défaut, Excel stocke les macros complémentairesdans le répertoire Application Data\Microsoft\AddIns du répertoire Documentsand Settings de l’utilisateur.

Figure 11-2. Spécifiez le titre d’une macro complémentaire ainsi que les autres propriétés du classeur.

Page 281: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

263

Partie 4 : Fonctions VBA avancées

Enregistrer la macro complémentairePour enregistrer le classeur en tant que macro complémentaire, dans le menuFichier, choisissez Enregistrer sous pour afficher la boîte de dialogue du mêmenom (voir figure 11.3). Choisissez le dossier dans lequel vous voulez enregistrerle fichier et sélectionnez le type de fichier Macro complémentaire MicrosoftExcel (*.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émentaireUne fois la macro enregistrée, vous pouvez l’installer par le biais de la boîte dedialogue Macro complémentaire (dans le menu Outils, choisissez Macros com-plémentaires). Dans cette boîte de dialogue, cliquez sur le bouton Parcourir pourlocaliser la nouvelle macro. Placez une coche en regard de son nom et cliquez surOK pour l’inclure au classeur en cours (voir figure 11.4).

Figure 11-4. Localisez votre nouvelle macro complémentaire et incluez-la à votre classeur.

Page 282: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

264

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

Vous pouvez ensuite utiliser la formule suivante dans une cellule :

=PrixNet(D2, E2)

Collection AddInsLa collection AddIns contient le jeu de macros complémentaires disponibles,qu’elles aient ou non été installées. Les entrées de cette collection correspondentaux macros de la boîte de dialogue Macro complémentaire. Cette collection per-met de parcourir les macros complémentaires disponibles pour Excel, d’ajouterde nouvelles macros et d’installer ou de supprimer des macros au programme.

Tour d’horizonLa collection AddIns constitue un objet de collection classique possédant les pro-priétés décrites dans le tableau 11.2.

La collection AddIns inclut une seule méthode, Add. Celle-ci prend un ou deuxparamè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 :

expression.Add(FFFFiiiilllleeeeNNNNaaaammmmeeee, CopyFile)

La paramètre FileName est obligatoire et indique le chemin complet et le nom defichier 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 macrocomplémentaire est copiée sur un disque dur, alors que la valeur False signifieque 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é.

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.

Page 283: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

265

Partie 4 : Fonctions VBA avancées

Le fragment de code suivant montre comment exploiter la méthode Add pourinclure un nouveau classeur de macro complémentaire dans la collectionAddIns :

NewAddIn = Application.AddIns.Add("c:\Chapitre11.xla")

L’objet AddInL’objet AddIn représente une macro complémentaire disponible dans Excel. Letableau 11.3 donne une liste des propriétés associées à une macro complémen-taire.

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é-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înevide pour les macros complémentaires Excel.

Les propriétés Name, Path et FullName contiennent des informations relatives aunom de fichier du classeur de la macro. Name contient uniquement le nom defichier, alors que Path désigne le répertoire qui contient le fichier de la macrocomplé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 nondans Excel. Si elle est positionnée à True, elle installe la macro complémentaire et

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.

Page 284: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

266

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

déclenche l’événement Workbook_AddinInstall. Si elle est positionnée à False, elles u p p r i m e l a m a c ro co m p l é m e n t a i re e t d é c l e n c h e l ’ é v é n e m e n tWorkbook_AddinUninstall.

Routines automatiquesDans 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 unmodule 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 etWorkbook_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 pourboucler dans chaque objet AddIn de la collection AddIns puis insère la valeurdans la feuille de calcul en cours.

Sub GetAddIns()

Dim a As AddInDim i As Long

i = 1For 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 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’onpeut 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.

Page 285: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

267

Partie 4 : Fonctions VBA avancées

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 pourcré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 lesperformances des macros de calcul. En outre, certaines fonctions ne sont passimples à mettre en œuvre avec VBA, comme le traitement d’images ou desapplications 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 ouEXE externe. Pour accéder aux macros complémentaires externes, il existe deuxméthodes différentes créées avec des techniques de programmation similaires.

Les compléments COM sont essentiellement employés pour répondre à un clicsur un bouton de commande ou à tout autre événement Excel, comme ouvrir oufermer un classeur. Contrairement aux macros complémentaires Excel, vous nepouvez pas créer de complément COM à utiliser dans une formule de cellule. Lescompléments d’automatisation sont moins limitatifs : ils servent à répondre àdes événements Excel et proposent des fonctions que vous pouvez exploiter dansune formule.

Pour définir les compléments COM, vous utilisez la boîte de dialogue Modulescomplémentaires COM, accessible depuis la barre d’outils, alors que pour lescompléments d’automatisation, vous pouvez vous servir de la boîte de dialogue

Page 286: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

268

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

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 deuxpossèdent des avantages et des inconvénients. En général, un composant DLLfonctionne 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, cequi constitue une restriction sérieuse si un utilitaire doit accéder à un pro-gramme autonome ou une macro complémentaire Office. Le composant EXEpossède, en outre, l’avantage d’isoler l’exécution de la macro complémentairede 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 sousforme 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 seulesolution consiste à ajouter le bouton Modules complémentaires COM à unebarre d’outils. Pour ce faire, cliquez droit sur une barre d’outils et choisissezPersonnaliser (au bas de la liste). Cliquez sur l’onglet Commandes. Dans laliste Catégories, sélectionnez Outils et faites glisser Modules complémentai-res COM depuis la liste Commandes vers une barre d’outils. Cliquez ensuitesur le bouton Modules complémentaires COM pour afficher la boîte de dialo-gue.

Interface IDTExtensibility2L’interface IDTExtensibility2 constitue une interface générale partagée par denombreux produits hors Microsoft Office. Cette interface représente unemaniè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.

Page 287: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

269

Partie 4 : Fonctions VBA avancées

La méthode OnConnection est appelée lorsqu’on charge le complément dansl’application. Il reçoit des informations relatives à l’environnement dans lequel ils’exécute par le biais d’un jeu de paramètres. Les deux paramètres essentiels sontune référence à l’objet application associé à l’application et des informationsrelatives à 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 audémarrage de l’application).

Si la méthode OnConnection est retournée avec succès, l’application considèreque le complément est chargé. Si elle retourne un message d’erreur, l’applicationdé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 etacquérir toute ressource dont il a besoin. Vous pouvez ensuite libérer ces res-sources avec la méthode OnDisconnection.

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

Les méthodes OnStartupComplete et OnBeginShutdown sont appelées justeavant que l’application soit prête à accepter l’entrée de l’utilisateur et juste aprèsque l’utilisateur a demandé à l’application de se fermer.

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.

Page 288: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

270

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

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 debarres d’outils. Vous pourrez ensuite annuler ces modifications avec laméthode OnBeginShutdown.

La méthode OnAddInsUpdate est appelée lorsque la liste des complémentschange.

Attention Soyez extrêmement prudent si vous modifiez Excel lors du charge-ment d’un complément. En effet, Excel peut dynamiquement charger unemacro complémentaire en mode édition de cellule. Afficher une feuille ou uneboîte de dialogue, modifier la sélection en cours, appeler une propriété ou uneméthode de la collection Windows ou changer certains paramètres Excel sontautant d’actions qui risquent de provoquer un arrêt inopiné d’Excel.

Clés du registreLes 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ù Appreprésente le nom de l’application Office (comme Excel) et ProgID représente lavaleur 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. Sivous ne possédez pas l’expérience pour l’éditer, regardez, mais ne touchezpas. Laissez le programme d’installation de la macro complémentaire effec-tuer les modifications appropriées. Pour afficher et/ou modifier les entrées duregistre, servez-vous du programme RegEdit (cliquez sur Démarrer, Exécuter,tapez regedit et cliquez sur OK).

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 uncomplément. Une valeur de 0 signifie que le complément n’est pas chargé, unevaleur de 3 signifie qu’il est chargé au démarrage de l’application, une valeur de9 signifie qu’il est chargé à la demande de l’utilisateur et une valeur de 16 signifiequ’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 unevaleur 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

Page 289: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

271

Partie 4 : Fonctions VBA avancées

DWORD qui marque le complément comme sûr, utilisable dans des applicationsqui 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’iln’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émentsexploitant l’interface IDTExtensibility2, que vous pouvez employer pour créerun complément d’automatisation mettant en œuvre la même fonction PrixNetque celle construite pour la macro complémentaire Excel.

Concevoir le complémentVoici 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 del’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

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

Page 290: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

272

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

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 sontemployé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 auxinformations 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 des’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.

2 Lorsque Visual Basic 6 démarre, ouvrez la fenêtre Explorateur de projets.Cliquez droit sur frmAddIn et choisissez Supprimer frmAddIn dans lemenu contextuel. En effet, ce formulaire ne sera pas utile dans ce projet.

Page 291: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

273

Partie 4 : Fonctions VBA avancées

3 Dans le menu Projet, choisissez Propriétés de MyAddIn pour afficher laboîte de dialogue MyAddIn - Propriétés du projet. Dans la zone Nom duprojet, 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 pourouvrir la boîte de dialogue AddInDesigner de l’élément. Dans la fenêtreProprié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 Nomd’affichage et Description du complément. Dans la liste déroulante Appli-cation, choisissez Microsoft Excel et optez pour la version appropriée (siplusieurs versions d’Excel sont installées sur votre ordinateur). Choisissezle mode d’initialisation du complément en sélectionnant une entrée dansla liste déroulante Comportement initial.

Page 292: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

274

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

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èqued’objets Microsoft Excel 11.0 Object Library à la liste des références decette application.

7 Affichez le code associé au designer en cliquant sur l’icône Code dansl’Explorateur de projets ou en cliquant droit sur le nom du designer et enchoisissant la commande Code. Le modèle de AddIn est orienté vers ledéveloppement de compléments pour Visual Basic. En conséquence, vouspouvez supprimer presque tout le code du module (voir Astuce suivante).

Page 293: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

275

Partie 4 : Fonctions VBA avancées

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 variablesmal orthographiées et les variables que vous avez oublié de définir au niveaudu module. Elle vous permet de gagner du temps et je vous recommande vive-ment d’inclure Option Explicit comme première instruction dans chaquemodule 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 lefichier DLL contenant le complément d’automatisation. Démarrezensuite Excel et dans le menu Outils, choisissez Modules complémentairespour afficher la boîte de dialogue Macro complémentaire. Cliquez sur lebouton Automatisation pour afficher la liste des serveurs Automation dis-ponibles sur le système. Dans la liste, localisez le nom du projet que vousvenez 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 cellede la figure 11.8.

Page 294: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

276

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

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 registreMême si la création d’une macro complémentaire avec le modèle AddIn deVisual Basic 6 semble augmenter la charge de travail, AddInDesigner simplifie letravail 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).

Figure 11-9. Vérifiez les entrées créées dans le registre Windows avec l’utilitaire RegEdit.

Page 295: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

277

Partie 4 : Fonctions VBA avancées

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émentsCOM. À l’instar de Visual Basic 6, Visual Basic .NET contient des modèles quisimplifient la création de compléments.

Le but de ce complément consiste à placer un nouveau bouton dans la barred’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 pourcréer le complément. Le deuxième projet est un projet d’installation, qui installele 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’arborescenceTypes de projets, développez le nœud Autres projets et sélectionnez Projetsd’extensibilité, puis sélectionnez Complément partagé dans le volet Modè-les. Saisissez des valeurs pour les zones Nom et Emplacement. Appuyez surOK pour démarrer l’assistant.

2 L’assistant vous demande de choisir un langage : Microsoft Visual C#,Visual Basic ou Visual C++/ATL. Sélectionnez Visual Basic et cliquez surSuivant.

Page 296: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

278

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

3 Sur la page 2 de l’assistant, choisissez les applications qui hébergeront lecomplé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 dialogueModules complémentaires COM.

5 Dans la page 4, vous décidez si le complément est ou non chargé en mêmetemps 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ûrdes valeurs à employer, cochez les ceux cases.

6 La dernière étape est un récapitulatif de vos choix. Pour modifier l’un deces choix, cliquez sur Précédent jusqu’à atteindre la page appropriée.Sinon, cliquez sur Terminer pour créer le nouveau projet.

Page 297: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

279

Partie 4 : Fonctions VBA avancées

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 écrivezun 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 apporterles modifications appropriées aux menus ou informations contenues dansl’application.

Modifier le modèleMême si vous avez coché Microsoft Excel pendant l’exécution de l’assistant, vousdevez explicitement ajouter une référence à la bibliothèque TypeLib Excel dans leprogramme Visual Basic .NET. Pour ce faire, dans le menu projet, choisissezAjouter une référence. Dans la boîte de dialogue du même nom, cliquez surl’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.

Le squelette de code créé par l’assistant construit une interface IDTExtensibility2minimale. 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 suivantedéfinit l’objet MonBouton. Notez que le mot-clé WithEvents est inclus. Lorsquel’on clique sur le bouton dans Excel, l’événement Click de l’objet MonBouton estdéclenché.

Dim WithEvents MonBouton As CommandBarButton

Page 298: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

280

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

La routine OnConnection est appelée par l’application hôte pour initialiser lecomplément. Comme nous l’avons étudié précédemment dans ce chapitre, laseule 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é parl’assistant. La variable applicationObject est également définie par l’assistant entant 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 œuvreune routine qui se trouve dans une interface particulière. Dans ce cas, on peutnoter 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 meilleuremplacement 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 servantde 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 etdéfinissez la propriété Style de sorte que la légende s’affiche sur le bouton et nonsous forme d’icône.

Public Sub OnStartupComplete(ByRef custom As System.Array) _ Implements Extensibility.IDTExtensibility2.OnStartupComplete

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 lapropriété OnAction pour qu’elle pointe vers ce complément.

Page 299: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

281

Partie 4 : Fonctions VBA avancées

Reportez-vous au chapitre 18, « Personnalisation des menus et des barres d’outils », pourplus d’informations sur la manière de créer et de manipuler les menus et les barresd’outils.

Avant de fermer l’application, vous devez supprimer correctement le bouton envous servant d’un code comme la routine OnBeginShutdown. La méthode Deletedu bouton sert à supprimer le bouton de la barre d’outils. On détruit ensuite lesressources associées à l’objet bouton en positionnant l’objet MonBouton surNothing.

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’onclique sur Mon Bouton dans la barre d’outils. Comme le montre cet exemple, laroutine MonBouton_Click se contente d’appeler la routine MsgBox pour afficherun simple message à l’écran. Cependant, dans une macro complémentaire pluscomplexe, 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émentPour installer le complément, vous devez commencer par le générer. Ensuite,vous créerez le programme d’installation et l’exécuterez.

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 cefaire, cliquez droit sur le Setup du projet dans l’Explorateur de solutionset 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.

Page 300: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

282

Partie 4 : Fonctions VBA avancées

Chapitre 1

1

3 Une fois la génération terminée, cliquez droit à nouveau sur le Setup duprojet et choisissez Installer dans le menu contextuel. Cette actiondé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 informerque l’installation est terminée. Notez la présence du bouton Mon Bouton dans labarre d’outils Standard.

Si vous cliquez sur le bouton Mon Bouton, vous affichez une boîte de messagequi indique qu’on a cliqué sur le bouton Mon Bouton.

Page 301: EXCEL Microsoft Office Excel

Cha

pitr

e 1

1

Création de macros complémentaires et de compléments COM

283

Partie 4 : Fonctions VBA avancées

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 ensuiteexpliqué comment utiliser la boîte de dialogue Macro complémentaire pourincorporer une macro complémentaire dans Excel. Pour finir, vous avez appristrois techniques différentes pour générer un complément : créer un classeur avecune 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 avecVisual Basic .NET. Chacune de ces techniques possède des avantages et desinconvénients selon la manière dont vous prévoyez de l’incorporer à l’applica-tion.

Page 302: EXCEL Microsoft Office Excel
Page 303: EXCEL Microsoft Office Excel

285

Partie 4 : Fonctions VBA avancées

Chapitre 12

ÉvénementsActivation et désactivation des événements . . . . . . . . . . . . . . . . 286Événements Workbook . . . . . . . 288

Événements Worksheet . . . . . . 294Événements Application . . . . . . 298

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 avecl’application Excel.

Au moment du déclenchement, Excel recherche une procédure d’événementintitulée Objet_NomÉvénement, dans laquelle Objet représente l’objet qui génèreet 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édureintitulé Objet_SelectionChange. De même, si l’utilisateur modifie la valeur d’unecellule, 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 etexé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égoriessuivantes :

● Événements Workbook Événements qui se produisent pour un classeurparticulier : Open, Activate et NewSheet, par exemple.

● Événements Worksheet Événements qui se produisent pour une feuille decalcul particulière : Calculate, Change et BeforeRightClick par exemple.

● Événements Chart Événements qui se produisent pour un graphiqueparticulier : Select, Activate et SeriesChange, par exemple.

Page 304: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

286

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

● Événements Application Événements qui se produisent pour l’applica-tion, Excel : SheetChange, NewWorkbook et WorkbookBeforeClose, parexemple.

● Événements UserForm Événements qui se produisent pour une feuilleUserForm particulière ou un objet qu’elle contient : Click et Initialize, parexemple.

Les objets ne définissent pas tous les événements. En général, si un objet possèdeun événement, son objet parent le possède également. Par exemple, l’événementChange est contenu au plus bas niveau par l’objet Worksheet. L’objet Workbookest 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 programmerl’événement le « plus bas » pour faire parvenir l’événement à un niveau élevé. Parexemple, l’événement Workbook_SheetChange est déclenché que vous ayez ounon 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’erreurde programmer la procédure d’événement au mauvais endroit. La fenêtre deVisual Basic Editor affiche tous les projets ouverts et organise leurs composantssous forme de liste que vous pouvez développer ou réduire, comme le montre lafigure 12.1. Avant de programmer votre procédure d’événement, vérifiez quel’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énementsL’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 codeVBA, y compris les procédures d’événements, peut déclencher des événements, ilest parfois préférable de les désactiver. Par exemple, si vous modifiez la valeurd’une cellule à partir de VBA, vous déclenchez les événements Change de tous lesniveaux d’objets. Si votre procédure d’événement Worksheet_Change contient ducode qui modifie une autre cellule, vous devez désactiver les événements pourempêcher Worksheet_Change de s’auto-appeler de manière répétitive. Si uneprocédure s’appelle elle-même continuellement, elle risque de faire déborder la

Page 305: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

287

Partie 4 : Fonctions VBA avancées

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, sivous le positionnez sur False, tous les classeurs ouverts sont affectés et pasuniquement le classeur actif qui contient le code. Rappelez-vous égalementqu’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 bouclessans fin d’événements ininterrompus. Supposons, par exemple, que vous avezdé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 pourvalider 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édureWorksheet_Change. Votre procédure vérifie l’entrée de l’utilisateur pour s’assurerqu’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, puisles réactiver pour contrôler l’entrée de l’utilisateur suivant. L’événementWorksheet_Change suivant présent le code nécessaire pour valider les entrées desutilisateurs dans une plage nommée Heures. Dans cet exemple, vous pouvezremplacer le nom de la plage Heures par l’adresse d’une cellule spécifique pourtester le code dans n’importe quel classeur. Cette procédure d’événement faitréférence au niveau de la feuille de calcul. En conséquence, vous devez ajouter lecode 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 MsgBox "Le nombre d'heures hebdomadaires ne doit pas excéder 40." Application.EnableEvents = False ActiveCell.Value = "" Application.EnableEvents = True End If

Page 306: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

288

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

End Sub

Remarque Application.EnableEvents = False affecte tous les classeursouverts. 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 WorkbookLes é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’avonsmentionné 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 leprojet de votre choix dans la fenêtre Projet et double-cliquez sur l’objetThisWorkBook pour l’activer. Toutes les procédures d’événements du classeurs’affichent dans la fenêtre Code, à droite de l’écran.

Pour créer une nouvelle procédure d’événement Workbook, procédez commesuit :

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

Dans la figure 12.2, Visual Basic Editor présente la liste déroulante Procédurependant la création d’une nouvelle procédure d’événement Workbook.

Figure 12-2. Visual Basic Editor simplifie la création des procédures d'événements.

Page 307: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

289

Partie 4 : Fonctions VBA avancées

Après avoir créé une nouvelle procédure d’événement, vous remarquerez que leslignes Private Sub Workbook_Event et End Sub ont été ajoutées dans la fenêtreCode. Maintenant que vous avez créé le cadre de la procédure d’événement, vouspouvez ajouter le code à exécuter lorsque l’événement se déclenche. Letableau 12.1 décrit les événements habituellement employés avec l’objet Work-book.

Événement OpenL’événement Open est l’un des plus surveillés. Il se déclenche chaque fois qu’onouvre un classeur ou une macro complémentaire. L’événement Workbook_Openaccomplit une large gamme de tâches, comme générer un fichier journal poursavoir qui a ouvert le classeur et quand. Vous pouvez créer un formulaire quis’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

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.

Page 308: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

290

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

passe avant d’accéder au fichier. Une fois le nom de l’utilisateur et son mot depasse acceptés, vous pouvez enregistrer le nom de l’utilisateur dans un fichierjournal avec un horodatage. Voici quelques autres applications pratiques del’é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 commedécrit précédemment dans la section « Événements Workbook » ou taper le codesuivant :

Private Sub Workbook_Open()

La procédure d’événement suivante s’assure que la fenêtre de l’application Excelest agrandie et qu’elle affiche une boîte de message rappelant à l’utilisateur ladate en cours :

Private Sub Workbook_Open() Application.WindowState = xlMaximized Msgbox "La date est :" & DateEnd Sub

Remarque Si vous maintenez enfoncée la touche MAJ au démarrage d’Excelou à l’ouverture d’un classeur, vous empêchez l’exécution de la procédureWorkbook_Open.

Événement ActivateL’é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 assurerque le classeur est agrandi, ajoutez la procédure d’événement suivante à l’objetThisWorkbook.

Private Sub Workbook_Activate() ActiveWindow.WindowState = xlMaximizedEnd SubSheetActivate Event

L’événement SheetActivate s’exécute lorsqu’on active une feuille quelconque duclasseur. L’événement se produit quel que soit le type de feuille activée, Worksheetou Chart. Il est important de vérifier le type de feuille activée. Vous pouvez vousservir d’une instruction If...Then...Else pour déterminer le code qui s’exécutepour chaque type de feuille. Vous pouvez, par exemple, sélectionner la cellule A1de la feuille de calcul pour aider les utilisateurs qui travaillent dans le fichier. Laprocédure d’événement suivante vérifie le type de feuille et active la cellule A1 :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Page 309: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

291

Partie 4 : Fonctions VBA avancées

If TypeName(Sh) = "Worksheet" Then Range("A1").SelectEnd Sub

Événement NewsheetL’événement NewSheet se déclenche lorsqu’on ajoute une nouvelle feuille auclasseur. 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 duclasseur :

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 utilisateursen automatisant leurs tâches. Par exemple, le comptable de la société Mon Jardina demandé à son assistant de documenter l’ajout de nouvelles feuilles de calculdans le fichier Revenus.xls. Ils ont décidé d’entrer la date de création de la feuillede calcul dans la cellule A1. Pour s’assurer que la date de création est ajoutée auxnouvelles 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 BeforeSaveLa 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’argumentSaveAsUI sert à identifier si la boîte de dialogue Enregistrer sous s’affiche etl’argument Cancel permet d’annuler l’opération d’enregistrement. Par exemple,la procédure d’événement suivante demande aux utilisateurs s’ils souhaitentenregistrer 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 = TrueEnd 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 sousd’Excel, la variable SaveAsUI est positionnée à True. Si la procédure BeforeSavepositionne l’argument Cancel sur True, le fichier n’est pas enregistré.

Page 310: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

292

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

Événement DeactivateL’é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 leclasseur :

Private Sub Workbook_Deactivate() Application.Windows.Arrange xlArrangeStyleTiledEnd Sub

Attention L’événement Deactivate se produit lorsqu’on désélectionne unclasseur. Toutefois, il se déclenche également lorsqu’on ouvre un nouveauclasseur ou que l’on ferme un classeur. Utilisez cet événement avec prudenceet testez attentivement votre procédure pour vous assurer que vous obtenez lerésultat attendu.

Événement BeforePrintL’é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édured’événement en tant qu’argument Cancel, ce qui peut servir à annuler la requêted’impression si elle est positionnée sur True. Malheureusement, cette procédured’événement possède une limite : elle ne peut pas déterminer s’il s’agit d’unerequête d’impression ou si l’utilisateur souhaite simplement afficher un aperçudu classeur.

La procédure d’événement suivante recalcule l’ensemble du classeur avant que leclasseur actif soit imprimé :

Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each wk in Worksheets wk.Calculate NextEnd 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 lataille des marges, définir la zone d’impression, définir les en-têtes et les colonnesrépétés sur chaque page ou simplement configurer l’impression d’une seule pagedu classeur. S’il faut appliquer une série de formats à un classeur avant del’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.

Page 311: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

293

Partie 4 : Fonctions VBA avancées

Événement BeforeCloseLa 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énementWorkbook_Open . Vous pouvez, par exemple, créer une procédureWorkbook_Open pour ouvrir un menu personnalisé dans le classeur et une pro-cédure Workbook_BeforeClose pour fermer ensuite le menu personnalisé. Dansce scénario, le menu personnalisé est uniquement visible lorsque le classeur estouvert. 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 OpenCustomMenuEnd Sub

Private Sub Workbook_BeforeClose (Cancel as Boolean) Call CloseCustomMenuEnd Sub

Ce scénario pose toutefois un problème : l’invite Excel « Voulez-vous enregistrerles modifications apportées à nomclasseur.xls ? » se produit après l’exécution dela procédure d’événement Workbook_BeforeClose. Si l’utilisateur clique surAnnuler, 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 modificationsné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 End IfEnd Sub

Cette procédure d’événement consulte la propriété Saved de l’objet Workbookpour déterminer si le classeur a été enregistré. Si tel est le cas, la procédure Dele-

Page 312: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

294

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

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é. Sil’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 laprocédure se termine sans supprimer le menu.

Événements WorksheetLes é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 ouqu’un utilisateur modifie le contenu d’une cellule. Les événements Worksheetsont également activés par défaut mais, comme nous l’avons mentionné dans lasection « Activation et désactivation d’événements », précédemment dans cechapitre, vous pouvez activer et désactiver les événements.

Pour afficher les procédures d’événements d’une feuille de calcul, commencezpar ouvrir Visual Basic Editor. Développez le projet de votre choix dans la fenêtreProjet 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 commesuit :

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

La figure 12.3 montre comment créer une nouvelle procédure d’événementWorksheet.

Page 313: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

295

Partie 4 : Fonctions VBA avancées

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 leslignes Private Sub Worksheet_Event et End Sub ont été ajoutées dans la fenêtreCode. Le tableau 12.2 décrit les événements Worksheet les plus courants.

Remarque Pour localiser les procédures d’événements dans une feuille decalcul, cliquez droit sur l’onglet de la feuille dans la fenêtre Excel et sélection-nez Visualiser le code.

Événement ChangeL’événement Change se produit lorsque l’utilisateur, du code VBA ou un lienexterne modifient une cellule de la feuille de calcul. Il ne se déclenche pas si un

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.

Page 314: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

296

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

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 capturerle recalcul de la feuille.

Lorsque la procédure Worksheet_Change s’exécute, elle reçoit un objet Rangecomme 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ées’affiche.

L’événement Change s’accompagne toutefois de quelques bizarreries : desactions qui devraient le déclencher mais qui ne le font pas ou des actions quile 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éclenchepas l’événement Change.

● Appuyer sur les touches SUPPR ou RETOUR ARR. suivies de la toucheENTRÉ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 nonl’événement Change. Par exemple, si vous ajoutez de nouveaux enregis-trements dans un formulaire ou que vous triez les données, vous nedé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éclenchezl’événement Change.

Page 315: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

297

Partie 4 : Fonctions VBA avancées

Comme le montrent les incohérences de cette liste, il est préférable de ne pasfaire confiance à l’événement Change pour détecter tous les changementsapportés aux cellules. Vous pouvez cependant contourner ces problèmes sivous les connaissez. Par exemple, si vous savez qu’un format ou une valeurspé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 pasoublié d’entrée non valide.

Événement SelectionChangeLa 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 desfichiers importants. Par exemple, la procédure d’événement peut griser la ligneet la colonne à l’intersection de la cellule active. Lorsque l’utilisateur effectue unenouvelle sélection, vous désactivez le grisé en cours et le réappliquez à la nouvelleintersection 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 WithEnd Sub

Événement BeforeRightClickL’événement BeforeRightClick se déclenche lorsque l’utilisateur clique droit dansla 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 etpositionnez l’argument Cancel sur True.

Remarque L’événement BeforeRightClick ne se déclenche pas si le pointeurse 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 contextuelsd’une feuille de calcul :

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

Page 316: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

298

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

Événements ApplicationLes événements de l’objet Application se déclenchent lorsque l’on crée, ouvre oumodifie un classeur. Pour écrire une procédure d’événement au niveau de l’objetApplication, vous devez créer un nouvel objet dans un module de classe. Une foisle 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 quevous pouvez programmer dans vos classeurs.

Au Quotidien Localiser les événements avec l’Explorateur d’objets

L’Explorateur d’objets constitue un outil pratique qui vous renseigne sur lesobjets, leurs propriétés et leurs méthodes. Il sert également à rechercher lesobjets supportés par un événement particulier. Par exemple, disons que vousvouliez trouver les objets supportés par l’événement Change. Activez VisualBasic 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 cliquezsur l’icône des jumelles.

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.

Page 317: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

299

Partie 4 : Fonctions VBA avancées

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, vousvoyez 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 deces trois colonnes. Le nom d’un événement ou d’un terme appartenant à unebibliothè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 lamême fonctionnalité. Pour chaque élément de la liste de l’Explorateur d’objetssur lequel vous cliquez, la barre d’état, qui se trouve dans la partie inférieurede 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 ApplicationDans les sections précédentes, nous avons vu comment créer des événementsWorksheet et Workbook. Ces événements s’appliquent uniquement à un classeurparticulier. 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 vousservant 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) 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."

Page 318: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

300

Partie 4 : Fonctions VBA avancées

Chapitre 1

2

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’objetApplication déclaré dans le module de classe. Il peut s’agir d’une variableobjet de module, déclarée dans un module VBA classique ou dans l’objetThisWorkbook. Par exemple :

Dim ApplicationClass As New AppEventClass

6 Associez l’objet déclaré et l’objet Application. Pour ce faire, on utilisegénéralement une procédure Workbook_Open. Par exemple :

Private Sub Workbook_Open()Set ApplicationClass.Appl = ApplicationEnd 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 compreniezcomment 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équencede 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 ouvertAvec Excel, vous ne pouvez ouvrir qu’une copie d’un classeur à la fois. Il est doncimportant de déterminer si le classeur est ouvert ou s’il faut le faire. Si vous nevé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 pourentrer le nom de produit correct dans la facture. Il est indispensable que le fichierListeProduits.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 actuellementouvert. La fonction retourne la réponse True si le classeur est ouvert.

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

Page 319: EXCEL Microsoft Office Excel

Cha

pitr

e 1

2

Événements

301

Partie 4 : Fonctions VBA avancées

End IfWorkBookNotOpen: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 etfeuille 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 listede procédures obligatoires, l’étape suivante consiste à déterminer leur niveau destockage. 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 unmauvais objet.

Souvenez-vous également que certains déclencheurs engendrent l’exécution deplusieurs événements. Pour cerner correctement vos procédures d’événements,n’hésitez pas à les tester. Vous devrez sans doute en passer par plusieursbrouillons avant de finaliser la configuration de vos gestionnaires d’événements.

Page 320: EXCEL Microsoft Office Excel
Page 321: EXCEL Microsoft Office Excel

303

Partie 4 : Fonctions VBA avancées

Chapitre 13

Manipulation des fichiersLocalisation des fichiers externes . . . . . . . . . . . . . . . . . . . 303Écriture dans un fichier externe . . . . . . . . . . . . . . . . . . . . 317

Lecture dans un fichier externe . . . . . . . . . . . . . . . . . . . 319Recherche d’une valeur dans un fichier. . . . . . . . . . . . . . 320

La majorité des applications que vous développez pour Microsoft Excel vousobligent à travailler simultanément dans plusieurs fichiers. Vous devrez, parexemple, récupérer un listing de fichiers dans un répertoire, supprimer ourenommer des fichiers. Excel permet d’importer et d’exporter plusieurs types defichiers 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 fichiertexte qui contient plus de 256 colonnes de données, ce qui représente la limited’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 lesfichiers.

Localisation des fichiers externesComme nous l’avons étudié dans les précédents chapitres, toutes les applicationsMicrosoft Office bénéficient du modèle d’objet Office. Celui-ci contient desobjets employés par toutes les applications Office, comme l’objet CommandBars,que nous étudierons au chapitre 17. Vous allez apprendre à exploiter deux objetsdu 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

Page 322: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

304

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

● FileDialogSelectedItems

L’objet FileSearch permet de rechercher des fichiers en utilisant une large gammede critères : type de fichier, taille du fichier, emplacement du fichier et date de laderniè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 Dirpour effectuer séquence d’opérations sur les fichiers. L’objet FileSearch est utiledans le cadre de la maintenance des fichiers. Il permet, par exemple, de localiserdes fichiers d’une certaine ancienneté et de les supprimer ou de les déplacer versun répertoire d’archive. L’objet FileSearch sert également à retrouver des donnéesdans 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. Ilpermet d’afficher les boîtes de dialogue Ouvrir et Enregistrer sous, ainsi qu’unnavigateur 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’étaientpas pour les autres applications Office. L’objet FileDialog, étant un objet Office,est à la disposition de toutes les applications Office.

Retourner tous les fichiersLa 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 dansla collection FoundFiles. Cet objet donne à votre code la fonctionnalité de lafonction Recherche de fichiers disponible dans l’application Excel. Vous pouvez,par exemple, effectuer une recherche sur tous les fichiers Excel associés à uneextension ou contenant un texte spécifique. Le tableau 13.1 liste certaines desproprié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.

Page 323: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

305

Partie 4 : Fonctions VBA avancées

Prenons l’exemple suivant, dans lequel la variable objet FS est déclarée commefaisant 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. Dansle 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 toutesles propriétés FileSearch excepté LookIn. Ces propriétés étant maintenues tantqu’Excel est ouvert, il est préférable d’exécuter la méthode NewSearch chaquefois 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 lesous-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 Excelpendant 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

Propriété ou méthode RésultatExecute Commence la recherche.

NewSearch Efface les résultats des précédentes recherches présents dans l’objet FileSearch.

Tableau 13-1. Liste des propriétés et méthodes de l’objet FileSearch (Suite)

Page 324: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

306

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

MsgBox strMessage End WithEnd Sub

La propriété FileType détermine les extensions de fichiers incluses dans le critèrede recherche. La constante msoFileTypeExcelWorkbooks mène la recherche pourinclure toutes les extensions de fichier Excel : .xls, .xlt, .xlm, .xlc et .xla. Letableau 13.2 liste les autres constantes disponibles.

La propriété LastModified peut utiliser les constantes listées dans le tableau 13.3.

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

Page 325: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

307

Partie 4 : Fonctions VBA avancées

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 contenudans 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 objetreprésentant chaque fichier à la collection FoundFiles. Elle retourne égalementune valeur qui correspond au nombre de fichiers trouvés.

La collection FoundFiles permet d’accéder aux noms des fichiers trouvés avecleur chemin d’accès. Le code de l’exemple précédent utilise la boucle ForEach...Next pour traiter la liste, ajoutant chaque nom à strMessage en les séparantpar un retour chariot.

Limiter la rechercheIl peut arriver que vous deviez ouvrir un fichier ancien de plusieurs mois et quevous 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 Excelpermet d’accomplir cette tâche. Vous pouvez également faire appel à la collectionPropertyTests dans votre procédure VBA pour automatiser le processus derecherche.

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 undossier Archive sur le serveur de la société. La procédure suivante recherche lesfichiers modifiés au cours du mois précédent :

Sub FindLastMonthFiles() Dim FS As Office.FileSearch Dim vaFileName As Variant

Tableau 13-3. Liste des propriétés LastModified et leurs valeurs

Constantes msoLastModified Valeur

msoLastModifiedYesterday 1

msoLastModifiedToday 2

msoLastModifiedLastWeek 3

msoLastModifiedThisWeek 4

msoLastModifiedLastMonth 5

msoLastModifiedThisMonth 6

msoLastModifiedAnyTime 7

Page 326: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

308

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

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

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 WithEnd Sub

La collection PropertyTests fonctionne indépendamment de tout paramètre duvolet 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’uneméthode NewSearch.

La méthode Add de la collection PropertyTests ajoute de nouveaux tests, que l’onspécifie en assignant au paramètre Name une chaîne identique à celle qui setrouve dans la zone de liste déroulante Propriété du volet Office Recherche defichiers.

La propriété FileType de l’objet FileSearch peut servir à limiter la recherche à unou plusieurs types de fichiers spécifiques. La collection FileTypes permet de pré-ciser plusieurs types de fichiers. L’exemple suivant retourne tous les fichiersMicrosoft 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

Page 327: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

309

Partie 4 : Fonctions VBA avancées

Dim iCount As Long

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 WithEnd 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 collectionFileTypes avant d’ajouter de nouvelles entrées. Si vous assignez une entrée auparamètre FileType, toutes les entrées existantes dans la collection FileTypes sontdé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 ajouterd’autres entrées. Pour ce faire, servez-vous des constantes listées précédemmentdans 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 larecherche et que vous pouvez indiquer les sous-répertoires à parcourir. Enrevanche, 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 strMessageEnd Sub

Page 328: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

310

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

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-vail et de Favoris réseau n’est pas une surprise. Le résultat du code devrait êtresimilaire à 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.

La propriété ScopeFolder est à la disposition de l’objet SearchScope et référenceun objet ScopeFolder. ScopeFolder représente le sommet de la structure de la col-lection ScopeFolders qui contient d’autres objets ScopeFolder. L’exemple suivantaffiche 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

Tableau 13-4. Liste des propriétés msoSearchIn et leurs valeurs

Constantes msoSearchIn Valeur

msoSearchInMyComputer 0

msoSearchInOutlook 1

msoSearchInMyNetworkPlaces 2

msoSearchInCustom 3

Page 329: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

311

Partie 4 : Fonctions VBA avancées

strMessage = strMessage & "Chemin d'accès = " & SF.Path & vbCr 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 chaquestructure de niveau supérieur. Chaque collection ScopeFolders de niveau supé-rieur contient des objets ScopeFolder qui représentent les répertoires racine desstructures de fichiers disponibles. Chacun de ces objets ScopeFolder contient uneautre collection ScopeFolders qui représente les sous-répertoires se trouvant endessous 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 lacollection 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

Page 330: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

312

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

ou si vous exécutez NewSearch. La valeur LookIn vient en supplément des entréesSearchFolders.

La collection SearchFolders est également conservée pendant toute la sessionExcel en cours ; pensez à la vider avant d’exécuter une nouvelle recherche. Pource 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 larecherche au sein de tous les sous-répertoires du répertoire racine sur le lecteurC. Lorsque la procédure trouve un répertoire qui commence par les caractèresProduit, 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_SearchFoldersEnd Sub

Cet exemple vide la collection SearchFolders puis parcourt les collectionsSearchScopes et ScopeFolders pour localiser le lecteur C. Le code évalue ensuite lapropriété Name de chaque ScopeFolder du répertoire racine du lecteur C pourdé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 lecode trouve un répertoire correspondant, il utilise la méthode AddToSearchFol-

Page 331: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

313

Partie 4 : Fonctions VBA avancées

ders de l’objet ScopeFolder pour ajouter l’objet à la collection SearchFolders. Voicila routine Search_SearchFolders :

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 WithEnd Sub

La collection Search_SearchFolders définit la propriété LookIn de FileSearch sur lelecteur 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 QuotidienDéterminer si un fichier existe avec FileSearch

Il peut arriver que la procédure ne parvienne pas à s’exécuter correctementsans un fichier particulier. Pour déterminer si ce fichier existe, il suffitd’employer une fonction. Par exemple, la fonction suivante a été écrite pourvérifier si un fichier et son chemin d’accès sont valides. La fonction retourneTrue 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 WithEnd Function

Page 332: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

314

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

Retrouver des fichiers avec la boîte de dialogue FileDialogL’objet FileDialog permet d’afficher les boîtes de dialogue Ouvrir et Enregistrersous par le biais du code VBA. Les méthodes GetOpenFileName et GetSaveAsFi-leName de l’objet Application donnent des résultats similaires et peuvent servirdans 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’elleutilise dans son catalogue de printemps. On vous a demandé de créer une feuillede calcul qui permette aux utilisateurs de choisir les images et d’insérer unaperçu dans la feuille de calcul.

Important Les deux procédures suivantes supposent qu’il existe une feuillede 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’objetOffice FileDialogs. Le tableau 13.5 liste les constantes msofileDialogType disponi-bles pour spécifier le type de la boîte de dialogue.

Page 333: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

315

Partie 4 : Fonctions VBA avancées

La propriété Filters de l’objet FileDialog retourne une référence à la collectionFileDialogFilters 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électionnerdans une liste déroulante, située dans la partie inférieure de la boîte de dialogueOuvrir. La méthode Clear de la collection FileDialogFilters supprime les filtresprésents. Nous ajoutons ensuite notre propre filtre qui affiche uniquement lesfichiers .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 eton quitte la procédure.

La méthode Show n’ouvre pas réellement le fichier sélectionné, mais elle place lenom 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 laproprié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 defichier et Sélecteur de dossier contient le mot Parcourir et les autres présententOuvrir ou Enregistrer sous, selon le cas. Toutes les boîtes de dialogue présententles dossiers et les fichiers, exceptée la boîte de dialogue Sélecteur de dossier, quin’affiche que des dossiers.

La méthode Show affiche l’objet FileDialog et les éléments choisis sont placésdans l’objet FileDialogSelectedItems sans qu’ils soient ouverts ou enregistrés.L’exemple suivant montre comment employer la méthode Execute avec les boîtesde dialogue Ouvrir et Enregistrer sous pour réaliser les opérations nécessairesdès que l’utilisateur clique sur le bouton Ouvrir ou Enregistrer.

With Application.FileDialog(xlDialogOpen) If .Show Then .ExecuteEnd 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

Tableau 13-5. Liste des types de boîtes de dialogue et leurs valeurs

Constantes msoFileDialog Valeur

msoFileDialogOpen 1

msoFileDialogSaveAs 2

msoFileDialogFilePicker 3

msoFileDialogFolderPicker 4

Page 334: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

316

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

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électionnantleurs 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éeanté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édured’événement Change pour charger la nouvelle image.

Page 335: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

317

Partie 4 : Fonctions VBA avancées

Au QuotidienDé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êmesrésultats, mais on utilise une méthode différente pour les obtenir. La fonctionretourne 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 donneaccès au système de fichiers de l’ordinateur. Une fois cet accès autorisé, lafonction utilise la propriété FileExists de l’objet FileSys pour déterminer si lefichier existe. Le code est beaucoup plus simple et plus élégant que dansl’exemple précédent.

Écriture dans un fichier externeVBA contient un certain nombre d’instructions qui permettent de manipuler lesfichiers. 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 del’objet Application. La première sert à ouvrir un fichier pour le lire ou y écrirealors que la deuxième ouvre réellement le fichier.

Au QuotidienOuvrir un fichier texte

Avant de pouvoir lire ou écrire dans un fichier, vous devez l’ouvrir. L’instructionOpen est relativement versatile et sa syntaxe complexe.

Open ppppaaaatttthhhhnnnnaaaammmmeeee For mmmmooooddddeeee [Access aaaacccccccceeeessssssss] [lllloooocccckkkk] As [#]ffffiiiilllleeeennnnuuuummmmbbbbeeeerrrr [Len=rrrreeeecccclllleeeennnnggggtttthhhh]

Page 336: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

318

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

● pathname Élément obligatoire qui contient le nom et le chemin d’accèsdu 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 ditque ce paramètre est obligatoire, mais si vous l’omettez, Excel supposeque vous optez pour Random. Nous n’avons pas réussi à résoudre cettecontradiction, 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 LockRead Write.

● filenumber Élément obligatoire qui définit le numéro de fichier sur unevaleur 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 fichiersouverts en mode Random ou la taille de tampon pour les fichiersséquentiels.

L’exemple suivant exporte les données d’une plage spécifiée vers un fichier texteCSV. 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 retourchariot/saut de ligne. Pour la dernière cellule d’une ligne, cependant, ladeuxiè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

Page 337: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

319

Partie 4 : Fonctions VBA avancées

Write #1, Data; Else Write #1, Data End If Next c Next r Close #1End Sub

La variable intitulée Data stocke le contenu de chaque cellule. Si la cellule estnumé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, sapropriété Value retourne 0. En conséquence, le code vérifie également les cellulesvides 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éepour 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 estcelle qui sera réellement stockée dans cette variable.

Lecture dans un fichier externeLa procédure qui consiste à lire un fichier externe est similaire à celle employéepour écrire dans un fichier externe. Voici les étapes nécessaires pour lire unfichier 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 LineInput #.

4 Fermez le fichier avec l’instruction Close.

L’exemple suivant lit le fichier texte créé dans l’exemple précédent et stocke lesvaleurs en commençant par la cellule active. Le code lit chaque caractère etsépare les lignes de données, ignorant les guillemets et recherchant les virgulespour 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

Page 338: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

320

Partie 4 : Fonctions VBA avancées

Chapitre 1

3

MsgBox "Non trouvé : " & FileName, vbCritical, "ERREUR" Exit Sub 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 #1End Sub

Remarque Cette procédure constitue un point de départ. Elle ne tient pascompte 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 fichierIl n’est pas toujours nécessaire de copier l’ensemble du contenu d’un fichiertexte. 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édureFilterFile 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

Page 339: EXCEL Microsoft Office Excel

Cha

pitr

e 1

3

Manipulation des fichiers

321

Partie 4 : Fonctions VBA avancées

CloseEnd Sub

Les objets FileSearch et FileDialog proposent d’intéressants outils dans le cadrede la programmation VBA. Ces objets faisant partie du modèle d’objet Office, ilspossè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 sortequ’on puisse les traiter dans le code qui suit. L’objet FileDialog sert à afficher lesboîtes de dialogue Ouvrir et Enregistrer sous pour permettre à l’utilisateur denaviguer au sein des dossiers. Il constitue un outil plus puissant que les fonctionsGetOpenFileName et GetSaveAsFileName utilisées dans les précédentes versionsd’Excel.

Les capacités de recherche de fichiers étudiées dans ce chapitre permettentd’optimiser les projets sur lesquels vous travaillez. Limitez vos recherches avec lescritères étudiés, comme une extension de fichier spécifique ou une valeur dansun fichier. Les techniques de recherche peuvent être incorporées dans vos projetsultérieurs pour améliorer les résultats obtenus. Une fois les fichiers souhaitéslocalisés, vous pouvez lire leur contenu puis l’écrire dans de nouveaux fichiers sinécessaire.

Page 340: EXCEL Microsoft Office Excel
Page 341: EXCEL Microsoft Office Excel

323

Partie 4 : Fonctions VBA avancées

Chapitre 14

Développement de modules de classes

Introduction aux modules de classe . . . . . . . . . . . . . . . . . . 325Propriétés, méthodes et événements . . . . . . . . . . . . . . 328

Construction d’une classe . . . . . 329Conception pratique d’une classe . . . . . . . . . . . . . . . 336

Ce chapitre introduit le concept de classes. Dans ce chapitre, vous allez étudierles 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 uneentité physique comme une personne, une fleur, une machine ou un lieu. Cettechose peut également représenter une entité logique comme un rapport, unecommande 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 desvariables 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 ouString. Avant de pouvoir utiliser le type Integer ou String, vous devez déclarer unevariable 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 commeinstances d’une même classe.

On implémente les classes dans Visual Basic pour Applications par le biais dumodule de classe. Chaque module de classe contient exactement une classe etenglobe toutes les propriétés, méthodes et événements associés à l’interface de laclasse, ainsi que toute autre variable, fonction ou sous-routine locales nécessairesau fonctionnement de la classe.

Page 342: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

324

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

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 etainsi de suite. Les attributs d’une personne sont son nom, son adresse, sonnumé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 peutcontenir un bouton. Dans la cadre de cette explication, on peut aussi caractériserces 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’estpas parfait puisque certains attributs sont relativement spécifiques, commeun 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 objetrapport 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 : ellesdé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 ouune 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 programmationd’objet, les événements constituent un outil intéressant qui permet à un objet decommuniquer 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 leprogramme qui a créé l’objet.

Un événement constitue une technique pratique qui évite à un programme deconstamment surveiller les modifications d’un objet. Au lieu de cela, l’objetappelle l’événement pour informer le programme appelant d’un changementdans l’état de l’objet.

Page 343: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

325

Partie 4 : Fonctions VBA avancées

Introduction aux modules de classeLes 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 dansMicrosoft Excel. En outre, à l’instar de ces derniers, chaque module de classepossède des propriétés, des méthodes et des événements.

Accéder aux objetsIl existe une différence fondamentale entre une simple variable et une variableobjet. 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. Onappelle 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 utiliseune instruction spéciale, Set. L’instruction Set prend deux formes. Voici lapremière :"

Set OOOObbbbjjjjeeeeccccttttVVVVaaaarrrriiiiaaaabbbblllleeee = New CCCCllllaaaassssssssNNNNaaaammmmeeee

Dans cette forme, l’instruction Set crée un nouvel objet basé sur ClassName. Celasignifie que Visual Basic alloue de la mémoire à l’objet et enregistre l’emplace-ment mémoire dans la classe ObjectVariable.

Set OOOObbbbjjjjeeeeccccttttVVVVaaaarrrriiiiaaaabbbblllleeee = OOOObbbbjjjjeeeeccccttttEEEExxxxpppprrrreeeessssssssiiiioooonnnn

Dans sa deuxième forme, l’instruction Set fait deux choses. Elle libère d’abordl’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 pourcréer une nouvelle instance de classe. Cependant, l’instruction Set New estlégèrement plus efficace que l’instruction Dim New. En effet, Visual Basic negénère pas de code supplémentaire pour vérifier qu’une nouvelle instance dela classe a été créée.

Page 344: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

326

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

Si vous employez une instruction Set New à la place d’une instruction DimNew, vous évitez également des problèmes de débogage. Supposons que vousvous 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 votreprogramme va l’utiliser en supposant qu’il contient quelque information, ce quin’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 à unobjet qui n’est pas encore créé. Bien qu’une erreur d’exécution ne soit pasagréable, elle vous informe d’un problème dans le code. Sinon, vous nel’auriez éventuellement pas remarquée.

Déclarer des objetsVous déclarez un objet avec une instruction Dim, Public ou Private en utilisantdeux formes différentes. Voici la première :

Dim ObjectVariable As ClassName

Cette instruction se contente de réserver de l’espace pour ObjectVariable etd’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éeautomatiquement un nouvel objet la première fois que l’on référence ObjectVa-riable.

Objets et NothingVBA propose une valeur spéciale appelé Nothing, que vous pouvez uniquementexploiter avec les objets. Nothing est la valeur associée à une variable objet qui nepointe actuellement vers aucune instance de classe. Une variable objet déclaréeavec 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 IsNothing dans une instruction If :

If ObjectVariable Is Nothing Then

Attention Bien que l’expression ObjectVariable Is Not Nothing peut semblerlogique en anglais, Visual Basic pour Applications ne la comprend pas. Si vousdevez vérifier qu’une variable objet se réfère à une instance d’un objet, utilisezl’expression Not ObjectVariable Is Nothing.

Page 345: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

327

Partie 4 : Fonctions VBA avancées

Le résultat du test Is Nothing est une valeur booléenne que vous pouvez utiliseroù 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 dansson état non initialisé. En supposant qu’une seule variable objet pointait versl’objet, cette instruction détruit également l’objet et libère toutes les ressourcesqui lui sont associées.

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 apositionné VariableObjet1 sur Nothing.

Set VariableObjet1 = New MaClasseSet VariableObjet2 = VariableObjet1Set VariableObjet1 = Nothing

Objets avec plusieurs variables objetIl est important de se rappeler qu’un objet et une variable objet sont deux chosesdifférentes. Par exemple, le code suivant crée un objet vers lequel pointent deuxvariables :

Set ObjetA = New MaClasseSet ObjetB = ObjetA

La première instruction Set crée une nouvelle instance de MaClasse, alors que ladeuxième instruction Set crée uniquement un deuxième pointeur vers le mêmeobjet, créé par la première instruction.

Cela signifie que les instructions suivantes effectuent la même tâche puisqueObjetA 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’à cequ’ObjetB soit également positionné sur Nothing.

Page 346: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

328

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

Propriétés, méthodes et événementsChaque 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 routinequi 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,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ésUn 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 variablede classe est marquée comme Public, elle est accessible à toutes les procédures quiexploitent la classe et constitue une propriété de la classe.

Outre les variables de classe publiques, les propriétés peuvent être associées à ducode. Chaque propriété dans laquelle vous voulez utiliser le code est organisée endeux routines, qui retournent la valeur au programme appelant ou changent lavaleur dans la classe. La routine Get retourne une valeur à l’appelant, alors que laroutine 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 pasmodifier 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 savaleur.

MéthodesOutre 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 unesous-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.

Page 347: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

329

Partie 4 : Fonctions VBA avancées

ÉvénementsLes é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éepar 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ètrespassés au programme externe, constitue la seule information stockée dans laclasse.

Remarque Vous devez placer le mot-clé WithEvents dans la déclaration del’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 formentl’interface de l’objet. Celle-ci isole le code au sein de la classe du code qui exploiteles 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 dureste 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 plusieurspersonnes sur une même application. Une personne peut se concentrer sur laclasse, alors que les autres travaillent sur le code qui l’exploite. Troisièmement, ilest possible de modifier le code dans la classe sans nécessairement impacter lesapplications 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 classeLe 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-routineslocales exploitées par la classe.

Créer un module de classePour 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 estformé en ajoutant un numéro unique au mot Classe. Ainsi, la première classe quevous 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 à vosclasses. Pour ce faire, sélectionnez la classe dans l’Explorateur de projets et dansla fenêtre Propriétés, modifiez la propriété Name associée à la classe (voirfigure 14.1).

Page 348: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

330

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

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 simplesIl existe deux types de propriétés : les variables de classe publiques et les routinesde 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 toutesvos 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 retournerun 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 deces éléments, créez une variable de classe privée appropriée puis créez uneroutine 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 desstructures complexes.

Page 349: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

331

Partie 4 : Fonctions VBA avancées

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

Les routines Property Let et Property Set sont appelées pour enregistrer unevaleur 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 unobjet.

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 objetset 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 serventessentiellement à simuler un tableau. Par exemple, le fragment de code suivantdéclare une variable de classe privée libellée MesNoms, qui représente un tableaude 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

Page 350: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

332

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

Remarque Vous pouvez spécifier autant de paramètres que vous le souhaitezdans les routines de propriété. Ils doivent, cependant, être identiques entreles 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 :

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 routinede 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 quedes 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’utilisateurSi 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 desproblèmes lorsque vous tenterez d’assigner directement une valeur à l’un deséléments de la structure en une seule instruction. Supposons que votre classecontienne les instructions suivantes :

Public Type TypeCoordonnéesCarte Latitude As Single Longitude As SingleEnd 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

Page 351: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

333

Partie 4 : Fonctions VBA avancées

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,63RouteMicrosoft.CoordonnéesCarte.Longitude = 122,13

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 lavariable temporaire est remplie de zéros lorsqu’elle est allouée et qu’aucunevaleur n’est explicitement assignée à Longitude, elle contient la valeur zéro. Enconséquence, lorsque la routine CoordonéesCarte Let est appelée, avec lavariable 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 lavariable temporaire, la valeur précédente de 47,63 est écrasée par zéro, cequi 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 instructionType. Toutefois, si vous voulez réellement utiliser l’instruction Type, vous devezvous-même créer une variable temporaire, assigner les valeurs à la structurepuis la structure à la propriété, en procédant comme suit :

Dim TempVar As TypeCoordonnéesCarteTempVar.Latitude = 47,63TempVar.Longitude = 122,13RouteMicrosoft.CoordonnéesCarte = TempVar

Définir des méthodesLes 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’à touteroutine de propriété.

Supposons, par exemple, que la classe contienne des informations relatives à unproduit particulier de la société Mon Jardin. Vous pouvez créer une fonction quicalcule le prix net de la manière suivante :

Page 352: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

334

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

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

Cette routine vérifie que le paramètre d’entrée est valide en s’assurant qu’il sesitue entre 0 et 1, puis calcule le prix net en fonction. Si la valeur de la remisen’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 declasse privée dans une méthode, servez-vous de la deuxième. Vous évitezainsi 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énementsLes événements peuvent s’avérer d’une grande utilité dans une classe, mais vousne 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 defonctionner si un utilisateur ne répond à aucun événement.

L’instruction Event sert à définir un événement. Pour des raisons pratiques, ils’agit en fait d’une instruction de sous-routine sans le code. Cette définition estindispensable, 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 lenombre de paramètres et leur type correspondent à la définition.

Remarque Bien qu’il soit possible de spécifier presque n’importe quel typede paramètre utilisable dans une sous-routine, les événements ne peuventpas 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 RaiseEventprécède celui de l’événement, suivi d’une liste de valeurs passées au programme

Page 353: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

335

Partie 4 : Fonctions VBA avancées

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 objetavec des événements :

Dim WithEvents MonObjet As StéMonJardin

Définir des variables, sous-routines et fonctions privéesBien qu’il ne soit pas indispensable de marquer les sous-routines et les fonctionscomme Private dans une classe, sans le mot-clé Private, toutes les sous-routinesou fonctions prennent par défaut le mot-clé Public. Pour la majorité des cas, celane présente aucun problème, en particulier si vous êtes celui qui exploite laclasse. 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 pasmodifier la définition de la routine sans impacter tous les programmes quil’exploitent.

Événements spéciaux pour les classesVBA 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 objetbasé 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 objeta 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 objetlocal à 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 pasde définir une variable objet sur une autre pour déclencher l’événementClass_Initialize. Si plusieurs variables objet pointent vers le même objet, le faitde positionner l’une des variables sur Nothing ne déclenche pas l’événementClass_Terminate.

Page 354: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

336

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

Résoudre des référencesIl 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ètred’une méthode et à une propriété. Pour différencier une variable de classe et unevariable locale ou un paramètre, préfixez la variable de classe avec Me., commedans l’exemple suivant :

If Me.Name <> Name Then

Dans cette instruction, la variable Me.Name fait référence à une variable declasse, alors que la variable Name non qualifiée se réfère à une variable ou à unparamè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’uneclasse à partir du code de cette classe, y compris les variables de classe, lessous-routines, les fonctions et les routines de propriété.

Conception pratique d’une classeMaintenant 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 simpleCréez des classes contenant uniquement des propriétés et aucune méthode (voirfigure 14.2).

Page 355: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

337

Partie 4 : Fonctions VBA avancées

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 remplacezla 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 StringPublic NomScientifique As StringPublic Description As StringPublic PrixDétail As CurrencyPublic PrixGros As CurrencyPPPPuuuubbbblllliiiicccc NNNNuuuummmméééérrrrooooPPPPrrrroooodddduuuuiiiitttt AAAAssss LLLLoooonnnngggg

Étendre une classe simpleL’utilisation d’une classe pour conserver des données connexes présente unavantage : vous disposez de plusieurs techniques simples pour l’étendre. Vouspouvez, par exemple, ajouter un synonyme d’une propriété existante avec unepaire de routines de propriété :

Public Property Get NomCommun() As String

NomCommun = Nom

End Property

Public Property Let NomCommun(value As String)

Nom = value

Page 356: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

338

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

End Property

Ces routines servent à retourner et à modifier une variable de classe, permettantainsi à 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 permetd’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 exploitecette méthode sait quel paramètre affecte quelle propriété.

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 = NomMe.NomScientifique = NomScientifiqueMe.Description = DescriptionMe.PrixDétail = PrixDétailMe.PrixGros = PrixGrosMe.NuméroProduit = NuméroProduit

End Sub

Une classe de collectionOn 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 letype de la propriété Name de l’objet ajouté est String. La routine commence parutiliser l’instruction On Error Resume Next pour désactiver le suivi des erreurs.

Page 357: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

339

Partie 4 : Fonctions VBA avancées

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 LongDim s As String

On Error Resume Next

i = 0s = Item.NameMesPlantes.Add Item, sDo 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 dunouvel objet dans une variable temporaire s. Ensuite on utilise la méthode Addde 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. Onconstruit alors un nouveau Name pour l’objet en se servant du nom d’originesuivi 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 à lacollection. Si la méthode Add échoue à nouveau, la boucle se répète jusqu’à ceque le nom de l’objet soit unique.

Pour supprimer un élément de la collection, on appelle la méthode Remove et onspécifie la position relative de l’objet ou la valeur de la propriété Name. Dans l’unou l’autre cas, la méthode Remove de l’objet Collection sert à supprimer l’élémentde 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

Page 358: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

340

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

On utilise la méthode Clear pour supprimer tous les objets de la collection. Cetteroutine détruit l’objet Collection sous-jacent et crée ensuite une nouvelle ins-tance de l’objet Collection.

Public Sub Clear()

Set MesPlantes = NothingSet MesPlantes = New Collection

End Sub

La méthode Item retourne un élément unique de la collection. À l’instar desmé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 laméthode SampleData qui ajoute certains objets à la collection.

Sub Test()

Dim MesPlantes As PlantesDim p As PlanteDim i As Long

Set MesPlantes = New PlantesMesPlantes.SampleData

For i = 1 To MesPlantes.Count Set p = MesPlantes.Item(i) MsgBox p.Name

Next i

Set p = NothingSet MesPlantes = Nothing

End Sub

Il se sert ensuite d’une boucle For...Next pour itérer dans chaque élément de lacollection. 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 nombred’éléments dans la collection se trouve dans la propriété Count de la collection.

Page 359: EXCEL Microsoft Office Excel

Cha

pitr

e 1

4

Développement de modules de classes

341

Partie 4 : Fonctions VBA avancées

D’où proviennent les données ?Les classes constituent un excellent moyen de conserver des données issuesd’une source externe. Ce faisant, vous permettez au programme d’accéderaux données indépendamment de la manière dont elles sont physiquementstockées.

Si vous changez de méthode de stockage, vous n’avez pas à modifier lamé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 leursource. Si vous migrez ensuite les données depuis une feuille de calcul versune base de données Access, seule la méthode de chargement change. Lecode 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 quiactualise les données quel que soit leur emplacement de stockage. Avec unpeu 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étierVous 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 conditionsd’erreurs potentielles et retourne True s’il ne trouve aucune erreur et False dansle 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

Page 360: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

342

Partie 4 : Fonctions VBA avancées

Chapitre 1

4

End If

End Function

Nous aurions pu modifier la procédure IsValid pour qu’elle retourne un messaged’erreur textuel ou un tableau String contenant une liste d’erreurs repérées dansles 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 :

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 estsupérieure à PrixGros, on enregistre le nouveau prix au détail dans la variableMonPrixDétail.

En revanche, si quelqu’un tente de définir un prix au détail inférieur au prix degros, 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. Vousavez également appris à créer vos propres classes personnalisées et commentdé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îtredes objets, des propriétés et des méthodes. Pour finir, vous avez vu commentconcevoir plusieurs différents types de classes, y compris une classe simple et uneclasse de collection, et comment étendre vos classes pour initialiser une classe etmettre en œuvre des règles de métier.

Page 361: EXCEL Microsoft Office Excel

343

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

Page 362: EXCEL Microsoft Office Excel
Page 363: EXCEL Microsoft Office Excel

345

Partie 5 : Manipulation des objets Excel

Chapitre 15

GraphiquesTour d’horizon des graphiques . . 345Manipulation des graphiques. . . 351

Réflexions sur la programmation des graphiques . . . . . . . . . . . . . 364

La fonctionnalité graphique de Microsoft Excel est un outil impressionnant. Ungraphique permet à un utilisateur de créer une représentation graphique depresque 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 luisont 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 lalégende, l’axe des x et l’axe des y, le titre, etc., vous permettent d’obtenir desrésultats finaux différents d’un graphique à l’autre selon vos exigences enmatière de mise en forme.

L’objet Chart et les objets que contient le graphique peuvent être directementmodifiés par l’utilisateur ou avec une macro Visual Basic pour Applications(VBA).

Dans ce chapitre, nous allons étudier les concepts essentiels relatifs à l’écrituredu code VBA qui génère et manipule les graphiques. Ce code est conçu pourmontrer comment créer et accéder à la collection ChartObjects au sein du clas-seur. Vous apprendrez également à modifier les graphiques existants, leurs sériesde données et leurs formats et à utiliser des étiquettes de graphique descriptivesse référant à des cellules.

Tour d’horizon des graphiquesLe 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 graphiquehéberge ses propres propriétés et méthodes. La manipulation des graphiquesavec du code VBA constitue un réel défi en raison de la complexité du modèled’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.

Page 364: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

346

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

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’objetChart, il serait intéressant de revoir les composants individuels employés pourgénérer un graphique. Le tableau 15.1 détaille les objets que l’on trouve dans legraphique que nous utiliserons tout au long de ce chapitre.

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 entant qu’objet incorporé ou sur une feuille de graphique.

La destination dépend de l’effet que vous cherchez à obtenir. Si l’utilisateur doitpouvoir comparer plusieurs graphiques côte à côte, insérez les graphiques dansune même feuille de calcul. En revanche, vous choisirez sans doute d’insérer legraphique sur sa propre feuille si vous travaillez dans un graphique complexe,contenant plusieurs séries de données ou plus simplement pour des raisons depréférences personnelles. Rappelez-vous que vous pouvez toujours incorporerun 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’objetChart peut servir à insérer un nouveau graphique.

Charts.Add

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.

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.

Page 365: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

347

Partie 5 : Manipulation des objets Excel

L’exemple suivant présente une macro de base qui crée un graphique en tant quevariable objet. La macro définit le type de graphique, la source des données et lestitres 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 WithEnd Sub

Remarque Lorsque vous créez des graphiques dans un classeur, créez-les entant que variables objet. Il est plus simple de référencer un objet Chart et demanipuler le graphique avec cette technique. C’est ce que nous avons fait pourles 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.

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. Pourrenommer manuellement un graphique existant, maintenez enfoncée la toucheCTRL 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 pardes cercles vides pour vous permettre de distinguer un graphique sélectionné

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.

Page 366: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

348

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

d’un graphique activé. La zone Nom affiche actuellement Graphique 1 commenom pour l’objet ChartObject.

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 laforme de cercles vides.

L’exemple suivant crée un graphique incorporé nommé GraphProduitGSC. Lamacro commence par supprimer tout graphique incorporé existant sur la feuillede 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 lavariable objet Chrt qui fait référence à l’objet ChartObject. Par défaut, ce derniercrée une feuille de graphique. En conséquence, on utilise la méthode Locationpour 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

Page 367: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

349

Partie 5 : Manipulation des objets Excel

.Left = Range("A1").Left .Name = "GraphProduitGSC" End With End WithEnd Sub

Remarque Rappelez-vous que par défaut, l’emplacement est une feuille degraphique. En conséquence, si vous utilisez la méthode Location de l’objetChart, 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 valeurretournée par la méthode Location à la variable objet Chrt de sorte qu’ellefasse référence au nouvel objet Chart. Pour tester cela, examinez votre code etaffichez 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éesur 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.L’emplacement du graphique incorporé sur la feuille de calcul a été défini avecles propriétés Top et Left de la cellule A9. On a utilisé la propriété Parent de l’objetChart pour faire référence à l’objet ChartObject et on l’a définie en attribuant auxproprié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. Pourfinir, 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, vousdevez utiliser la méthode d’adressage L1C1 et non la méthode d’adressageA1.

Au QuotidienMacro 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 Addpour créer un nouveau graphique. Elle définit la propriété ChartType puis utilisela 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 assignele 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 codepositionne la propriété HasTitle des axes sur False, cette étape n’étant pasindispensable.

Charts.Add

Page 368: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

350

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

ActiveChart.ChartType = xlColumnClusteredActiveChart.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 = FalseEnd 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 ChartLe 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 Editorpour « retrouver vos petits » pendant le codage des procédures qui contiennentdes graphiques.

L’emplacement du graphique en détermine la hiérarchie. Par exemple, dans ungraphique incorporé, pour modifier le texte qui se trouve dans ChartTitle, vousdevez revoir les niveaux des objets. Au sommet de la hiérarchie se trouve l’objetApplication. 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. Pourré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êmeniveau que la feuille de calcul puisqu’il s’agit simplement d’un type différent defeuille. Examinez la nouvelle hiérarchie et remarquez qu’on a supprimé deuxniveaux.

Application Workbook Chart

Page 369: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

351

Partie 5 : Manipulation des objets Excel

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 contientuniquement 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 lapropriété Item. Vous pouvez spécifier le nom du graphique comme paramètre dela propriété Item ou lui attribuer un numéro d’index décrivant la position dugraphique dans le classeur de gauche à droite.

L’objet Chart permet d’accéder à tous les attributs d’un graphique spécifiquedans Excel : mise en forme du graphique, type de graphique et propriétés depositionnement du graphique. L’objet Chart expose également des événementsque vous pouvez exploiter en programmation.

Les procédures d’événements s’exécutent à l’initiation du déclencheur approprié. Vouspouvez aussi surveiller des événements spécifiques au niveau de l’objet Chart. Pour plusd’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 degraphique ou d’une feuille de calcul spécifiées. L’objet ChartObject agit commeun conteneur pour un objet Chart. Les propriétés et les méthodes de l’objetChartObject déterminent l’apparence et la taille du graphique incorporé sur lafeuille 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é. Dansl’exemple suivant, le nom du graphique est positionné à ExempleGraph dans ungraphique 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 del’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 graphiquesPour créer un graphique, vous pouvez faire appel à une procédure. Vous créereztoutefois souvent des macros qui modifient les graphiques existants. Par exem-ple, vous pouvez utiliser une procédure pour rationaliser la mise en forme detous les graphiques incorporés au sein d’un classeur utilisé au niveau de l’entre-

Page 370: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

352

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

prise. Dans cette procédure, vous pouvez inclure le redimensionnement de tousles graphiques à une taille standard, spécifier l’emplacement du graphique dansla feuille de calcul, voire ajouter le nom de la société dans une étiquette en vousservant des couleurs de la société.

Activer un graphiqueLe graphique est activé dès lors qu’un utilisateur le sélectionne, quel que soit sonemplacement. Avec le code VBA, vous activez un graphique incorporé avec laméthode Activate.

ActiveSheet.ChartObjects("Graphique 1").Activate

Pour activer un graphique qui se trouve sur une feuille de graphique, servez-vousde l’instruction suivante :

Sheets("Graphique 1").Activate

Lorsque le graphique est activé, vous pouvez vous y référer dans le code avecActiveChart. Voici une manière fort intéressante de simplifier le code. À des finsde dépannage, vous pouvez vérifier le graphique qui a été activé en ajoutant uneboî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 laligne 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 pasobligé 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 lafeuille de graphique alors que la deuxième accède à un graphique incorporé :

Sub ModifyChart1() ActiveSheet.ChartObjects("Graphique 1").Activate ActiveChart.Type = xlLine ActiveChart.DeselectEnd Sub

Sub ModifyChart2() ActiveSheet.ChartObjects("Graphique 1").Chart.Type = xlLineEnd Sub

À l’heure de créer votre macro, rappelez-vous que si la procédure est écrite demaniè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érentsque l’on peut modifier. Exécutez la macro avec le graphique actif et la cellule A1sélectionnée.

Page 371: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

353

Partie 5 : Manipulation des objets Excel

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 WithEnd Sub

Notez l’erreur d’exécution ‘91’ : « Variable objet ou variable de bloc With nondé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 poury inclure la référence au graphique.

Sub ModifySpecificChart() 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 WithEnd Sub

Au QuotidienUtiliser 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énementsChart.

Activate, MouseDown, MouseMove et SeriesChange sont quelques-uns desdéclencheurs disponibles pour un objet Chart. Pour écrire une procédured’événement d’un graphique incorporé, vous devez créer un nouvel objet avecle mot-clé WithEvents dans un module de classe et déclarer un objet du typeChart dans les événements.

Prenons l’exemple suivant. Supposons que l’on crée un nouveau module declasse intitulé EvenModuleClasse. Ce nouveau module de classe contientl’instruction WithEvents suivante :

Public WithEvents myChartClass As Chart

Page 372: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

354

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

Une fois le nouvel objet déclaré avec des événements, il apparaît dans la listedé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 peutservir 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).ChartEnd Sub

Après que la procédure InitializeChart a été exécutée, l’objet myChartClass dumodule de classe pointe vers le premier graphique incorporé de la premièrefeuille de calcul du classeur. Toutes les procédures d’événements du modulede classe pour l’objet seront à présent évaluées lorsque le déclencheur se pro-duira.

Désactiver un graphiqueLorsque vous créez une macro avec l’enregistreur, celui-ci génère une instructiondu 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éthodeDeselect.

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 Deselectdésactive et désélectionne le graphique.

Modifions la procédure d’événement AddEmbeddedChart que nous avons crééedans 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 Falsepour 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

Page 373: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

355

Partie 5 : Manipulation des objets Excel

.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 WithActiveWindow.Visible = FalseEnd 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 dedésactivation fournissant le résultat approprié au scénario.

DépannageComment 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 ouchanger la taille de police. La question est la suivante : « Comment peut-ondéterminer avec du code VBA que l’utilisateur a bien sélectionné legraphique ? ». 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 vousdevez 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 unobjet au sein du graphique : l’objet Series ou l’objet ChartTitle, par exemple.La fonction ChartIsSelected retourne True si une feuille de graphique ou ungraphique incorporé est activé(e) et False dans le cas contraire. La fonctionsuivante détermine si l’objet ActiveChart est positionné sur Nothing. Si tel estle cas, le graphique n’est pas activé.

Private Function ChartIsSelected() As Boolean ChartIsSelected = Not ActiveChart Is NothingEnd Function

Modifier une série de donnéesUn graphique se compose d’un nombre quelconque de séries et les données deces séries sont définies par des références de plages dans la formule SERIE.

Page 374: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

356

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

Lorsqu’on sélectionne une série dans le graphique, la formule SERIE s’affichedans 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 sortequ’elle utilise des noms au lieu des références de cellules. Par exemple, si votrefeuille 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 labarre de formule. Par exemple, Feuil1 peut prendre la valeur du nom du clas-seur, ce qui donne un argument comme Produits.xls!Catégories.

Lorsque vous avez défini les noms et modifié la formule SERIE, votre code VBApeut exploiter les noms et les changements se reflètent dans le graphique. Parexemple, 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 lanouvelle 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 graphiqueavec la méthode SetSourceData de l’objet Chart. Il reste cependant possible demanipuler les séries individuelles avec l’objet Series. Celui-ci est membre del’objet SeriesCollection du graphique.

Au QuotidienComment fonctionne la formule SERIE du graphique ?

La formule SERIE détermine les données employées dans chaque série d’ungraphique. Si vous sélectionnez une série de données dans un graphique, laformule SERIE s’affiche dans la barre de formule. La formule SERIE n’est pasune 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 utiliserde fonction ou de formule dans une formule SERIE. Il est cependant possiblede l’éditer.

La série Catalogue est actuellement sélectionnée dans le graphique, commel’indiquent les poignées sur les barres. Notez que la barre de formule contientla formule SERIE de la série Catalogue.

Page 375: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

357

Partie 5 : Manipulation des objets Excel

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 :

=SERIE(name;category_labels;vvvvaaaalllluuuueeeessss;oooorrrrddddeeeerrrr)

● name (optionnel) Le nom employé dans la légende. Si le graphique necontient qu’une série, l’argument name sert de titre.

● category_labels (optionnel) La plage qui contient les étiquettes de l’axedes catégories. S’il est omis, Excel se sert d’entiers consécutifs encommenç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 etincluent 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 estle 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 sontB2: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. Dansce 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)

Page 376: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

358

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

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 à sapropriété Values. Cette fonctionnalité est intéressante si vous devez générer ungraphique qui n’est pas lié aux données d’origine. Le graphique peut, en effet, setrouver 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 cegraphique 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 desinformations de la Feuil1. Vous pouvez voir la définition de la première série dedonné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.

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 untableau à 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 montrecomment y parvenir :

Sub ConvertSeriesValuesToArrays() Dim Ser As Series Dim Chrt As Chart

Page 377: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

359

Partie 5 : Manipulation des objets Excel

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 SubFailure: 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. Vouspouvez exploiter ce comportement pour convertir les références de cellule entableaux.

Rappelez-vous que le nombre de points de données contenus dans une référencede tableau est limité à environ 250 caractères. Le code échoue si vous dépassez lalimite : récupérez les erreurs pour faire face à cette possibilité.

Définir les étiquettes du graphiqueVous n’aurez aucune difficulté à ajouter des étiquettes au graphique si elles sontbasées sur les valeurs des séries de données ou sur celles de l’axe des x. Cesoptions 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, eneffet, 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 barrede 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. Nousavons 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 moisd’avril. La formule de la barre de formule pointe vers la cellule E4.

Page 378: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

360

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

Figure 15-4. Les étiquettes ont été programmées avec des formules pour 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 lesplus 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 ptEnd 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 apositionné la propriété HasDataLabels de la série sur True. La boucle ForEach...Next traite chaque point de la série de données. Pour chaque point, le code

Page 379: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

361

Partie 5 : Manipulation des objets Excel

assigne une formule à la propriété Text de l’étiquette de donnée de ce point. Laformule se réfère à la cellule de la feuille de calcul en tant que référence externeau format L1C1. On applique des caractères gras à l’étiquette de données qui estpositionnée au-dessus du point de donnée.

Mettre un graphique en formeLa mise en forme des graphiques constitue un vaste sujet. Vous pouvez formaterl’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 ». Ilexiste 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.

Le tableau 15.4 liste les noms des propriétés de l’objet ChartObject les plusemployées et les résultats qu’elles produisent.

Tableau 15-3. Propriétés de Chart

Nom Retourne Description

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

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.

Page 380: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

362

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

Chaque objet du graphique possède une série de propriétés. Par exemple, l’objetChartTitle 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 commeLeft et Top. En fait, vous pouvez également définir l’orientation. Lorsqu’il estquestion de l’apparence d’un graphique, les possibilités sont presque infinies.Avant de programmer la macro, modifiez un graphique existant et documentezles changements effectués. En vous basant sur l’exemple de graphique et votredocumentation, 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 êtreappliqué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 formeappropriées. La figure 15.5 montre le résultat final souhaité. Notez que le type degraphique est positionné sur Barres groupées avec effet 3D (xl3DBarClustered) etque 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 lamise en forme que l’on a jugée nécessaire.

Sub FormatChart()

Nom Retourne DescriptionRoundedCorners 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é.

Tableau 15-4. Propriétés de l’objet ChartObject (Suite)

Page 381: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

363

Partie 5 : Manipulation des objets Excel

Dim chrt As Chart Set chrt = ActiveSheet.ChartObjects(1).Chart chrt.ChartType = xl3DBarClustered ActiveChart.HasLegend = False ActiveChart.HasDataTable = True ActiveChart.DataTable.ShowLegendKey = TrueEnd Sub

Modifier tous les graphiques d’un classeurPour établir l’uniformité au sein de votre classeur, vous pouvez appliquer lesmêmes formats à tous les graphiques. Vous pouvez choisir d’appliquer la mise enforme à tous les objets ChartObjects ou juste à un type de ChartObject, commeles 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 collectionChartObjects 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 calculactive en graphiques de type Aires :

Sub ChangeChartType() Dim chtobj as ChartObject For Each chtobj In ActiveSheet.ChartObjects chtobj.Chart.ChartType = xlArea Next chtobjEnd Sub

Imprimer des graphiquesLorsque vous imprimez une feuille de graphique, elle s’imprime par défaut sur sapropre 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. Pourimprimer un graphique incorporé, l’utilisateur doit d’abord sélectionner le gra-phique, puis choisir Fichier, Imprimer. Le graphique incorporé s’imprime alorscomme 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éthodePrintOut.

Sub PrintEmbeddedCharts() For Each chtObj In ActiveSheet.ChartObjects chtObj.Chart.PrintPreview Next chtObjEnd Sub

En revanche, si vous voulez imprimer le graphique incorporé en tant qu’objetavec le reste de la feuille de calcul, imprimez simplement la feuille de calcul et legraphique sera automatiquement imprimé. Si vous ne voulez pas imprimer legraphique 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

Page 382: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

364

Partie 5 : Manipulation des objets Excel

Chapitre 1

5

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 graphiquesincorporés du travail d’impression.

La procédure suivante imprime la feuille de calcul active et exclut tous les objetsgraphiques. Remplacez la propriété PrintPreview par PrintOut pour envoyer letravail d’impression vers l’imprimante par défaut.

Sub PrintWorksheetOnly() For Each chtObj In ActiveSheet.ChartObjects chtObj.PrintObject = False Next chtObj ActiveSheet.PrintPreviewEnd Sub

Réflexions sur la programmation des graphiques

Après avoir étudié la variété des options disponibles dans le cadre de la créationet de la modification des graphiques dans une procédure, vous verrez qu’il estsimple de créer une référence conçue par programmation pour un graphique quise trouve sur une feuille de graphique. L’objet Chart est membre de la collectionCharts 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 quiappartient à la collection ChartObjects de la feuille de calcul. L’Explorateurd’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 ChartObjectpar 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 del’objet SeriesCollection pour ajouter de nouvelles séries à un graphique.

Vous pouvez assigner un tableau VBA, à la place de l’habituel objet Range, à lapropriété Values d’un objet Series. Vous créez ainsi un graphique indépendantdes données de la feuille de calcul que vous pouvez distribuer sans une feuille decalcul en annexe.

Les propriétés Values et XValues retournent les valeurs des données et non lesré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é Formulade chaque série.

Page 383: EXCEL Microsoft Office Excel

Cha

pitr

e 1

5

Graphiques

365

Partie 5 : Manipulation des objets Excel

Gardez à l’esprit la complexité du modèle de graphique pendant que vous créezles procédures qui référencent les graphiques. Utilisez l’une des astuces que nousvous proposons pour simplifier la manière de référencer le graphique et produiredu code plus propre, comme assigner une variable objet au graphique.

Dans le prochain chapitre, vous allez apprendre à configurer le classeur pourexploiter les tableaux et les graphiques croisés dynamiques.

Page 384: EXCEL Microsoft Office Excel
Page 385: EXCEL Microsoft Office Excel

367

Partie 5 : Manipulation des objets Excel

Chapitre 16

Tableaux et graphiques croisés dynamiques

Tableaux et graphiques croisés dynamiques . . . . . . . . . . . . . . . . 367Objets des tableaux croisés dynamiques . . . . . . . . . . . . . . . . 374

Programmation de tableaux croisés dynamiques. . . . . . . . . . . . . . . . 384Manipulation par programmation des 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 etgraphiques croisés dynamiques et apprendre à manipuler les tableaux croisésdynamiques ainsi que les objets associés par programmation.

Tableaux et graphiques croisés dynamiquesPour les données bidimensionnelles organisées en lignes et en colonnes, lesfeuilles 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 denouvelles feuilles de calcul et de nouveaux graphiques basés sur leurs donnéespour 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. Microsoftpropose une fonctionnalité qui constitue un outil puissant pour faire face à ceproblè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écouvrirdes relations cachées entre plusieurs champs que l’on aurait autrement ignorées.

Introduction aux tableaux croisés dynamiquesUn 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éessynthétisées.

Page 386: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

368

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 dontl’intersection de chaque variable de ligne, colonne et profondeur produit unevaleur récapitulative unique. Pour simplifier la gestion d’un rapport tridimen-sionnel, vous pouvez « l’aplatir » en coupant le cube en plusieurs tranches surl’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 rapportscréés avec Microsoft Access.

L’être humain est rarement capable de visualiser un rapport exploitant plus detrois variables. Avec Excel, vous pouvez mettre à plat un rapport qui exploiteautant de variables que nécessaire. Il suffit de choisir les champs des lignes et descolonnes du rapport et d’afficher les valeurs des autres champs dans la partiesupé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ériquecomme un volume de ventes ou la valeur totale en euros des ventes. Une clé, quipeut ê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 ventesou à 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, leschamps Month, Week, Weekday, Day et Hour comportent des clés, alors que lechamp Sales contient une mesure.

Page 387: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

369

Partie 5 : Manipulation des objets Excel

Month Week Weekday Day Hour SalesJanuary 1 Mon 1 9 147January 1 Tue 2 9 161January 1 Wed 3 9 182January 1 Thu 4 9 201January 1 Fri 5 9 158January 1 Sat 6 9 190January 1 Sun 7 9 243January 2 Mon 8 9 147January 2 Tue 9 9 161January 2 Wed 10 9 182January 2 Thu 11 9 201January 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 encombinant 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éterminerla page affichée. Vous pouvez également glisser-déposer les champs clé dans leszones 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 valeursseront calculées en fonction des autres champs. Le résultat de ces actions est untableau croisé dynamique, similaire à celui de la figure 16.2.

Figure 16-2. Un tableau croisé dynamique permet à l’utilisateur de combiner les faits de différentes manières.

Page 388: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

370

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 latâ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éespuis Tableau croisé dynamique.

3 La deuxième étape de l’assistant vous invite à sélectionner les donnéessource du tableau croisé dynamique. Vous pouvez saisir une plage dans lazone Plage ou appuyer sur le bouton qui se trouve à l’extrémité droite dela zone pour réduire la boîte de dialogue et choisir ainsi la plage dans l’undes classeurs ouverts. Pour ouvrir un nouveau classeur, cliquez sur le bou-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 feuillede calcul actuelle ou demander à l’assistant de créer une nouvelle feuille.Cliquez sur le bouton Disposition pour afficher une boîte de dialoguedans laquelle vous pouvez glisser-déposer les différents champs de la con-figuration initiale du tableau croisé dynamique.

Page 389: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

371

Partie 5 : Manipulation des objets Excel

5 Cliquez sur le bouton Options de la dernière page de l’assistant pourouvrir la boîte de dialogue Options du tableau croisé dynamique. Vouspouvez 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.

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 dynamiquesUn graphique croisé dynamique constitue une représentation graphique d’untableau 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é dynamiqueexistant. À l’instar du tableau croisé dynamique, vous glissez-déposez les champs

Page 390: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

372

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 decolonne du tableau croisé dynamique, alors que la zone de page se trouve dans lapartie supérieure du graphique. Ces champs sont intitulés zone de catégories etzone de séries. La zone de page et la zone de données reflètent directement letableau 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 choisissantGraphique, Type de graphique. Vous pouvez également exploiter la majorité desoutils de mise en forme de graphique proposés par Excel pour personnaliser legraphique 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 quepour le tableau croisé dynamique. À l’arrière-plan, l’assistant crée un nouveautableau 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 menud’Excel. La figure 16.5 montre le graphique ainsi généré.

Page 391: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

373

Partie 5 : Manipulation des objets Excel

Figure 16-5. Un graphique croisé dynamique constitue une représentation graphique d’un tableau croisé dynamique.

Bases de données OLAPLes sources des données d’un tableau croisé dynamique sont multiples et ne selimitent pas aux feuilles de calcul. On importe généralement les données dansExcel 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 limiteimportante : 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 dedonnées externe appelé serveur OLAP (Online Analytical Processing).

Remarque SQL Server Standard Edition et Enterprise Edition incluent un outilappelé Services OLAP, qui propose les fonctionnalités d’une base de donnéesOLAP 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 enprécalculant les valeurs.

Page 392: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

374

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 tableaucroisé dynamique, Excel demande une nouvelle copie des données au serveurOLAP. 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 auxdonnées détaillées. Ces informations sont déterminées par la conception de labase de données OLAP.

Attention Les tableaux croisés dynamiques qui exploitent des sources dedonnées OLAP se comportent différemment de ceux qui ne le font pas. Eneffet, les serveurs OLAP retournent des données déjà synthétisées. Ainsi, lesdiffé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 supposeque vous exploitez des données ne provenant pas de sources OLAP.

Objets des tableaux croisés dynamiquesUne feuille de calcul Excel peut contenir plusieurs tableaux croisés dynamiques.Pour accéder à un objet PivotTable particulier, commencez par l’objet Worksheetqui représente la feuille de calcul qui contient le tableau croisé dynamique àmanipuler. Servez-vous ensuite de la collection PivotTables pour atteindre l’objetPivotTable à 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).

Page 393: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

375

Partie 5 : Manipulation des objets Excel

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.

Collection PivotTablesLa collection PivotTables contient tous les tableaux croisés dynamiques d’unefeuille de calcul. Le tableau 16.1 liste les principales propriétés et méthodes de lacollection PivotTables. On accède à la propriété PivotTables d’un objet Worksheetavec le code suivant :

ActiveSheet.PivotTables(1)

Collection PivotTables

Objet PivotTable

Objet PivotField

Objet PivotCache

Collection PivotFields(accessible via les propriétés :ColumnFields, DataFields,HiddenFields, PageFields,RowFields, VisibleFields,CalculatedFields)

Objet Worksheet

Collection PivotItems

Objet PivotItem

Page 394: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

376

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

Objet PivotTableL’objet PivotTable représente un tableau croisé dynamique. Vous pouvez exploi-ter cet objet pour accéder à un tableau croisé dynamique existant sur une feuillede calcul ou vous servir de la méthode Add de la collection PivotTables pour enajouter 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-1. Principales propriétés et méthodes de la collection PivotTables

Propriété/Méthode Description

Add(PivotCache, TableDestination, TableName, ReadData, DefaultVersion)

Méthode : ajoute un nouveau tableau croisé dynamique à la collection. PivotCache fait référence aux données affichées dans le tableau croisé dynamique ; TableDestination passe 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.

Tableau 16-2. Principales propriétés et méthodes de l’objet PivotTable

Propriété/Méthode Description

AddDataField(Field, Caption, Function)

Méthode : cette routine ajoute un champ de 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.

Page 395: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

377

Partie 5 : Manipulation des objets Excel

Propriété/Méthode DescriptionColumnFields 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.

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.

Tableau 16-2. Principales propriétés et méthodes de l’objet PivotTable (Suite)

Page 396: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

378

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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

Propriété/Méthode DescriptionPivotCache 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, SourceData, TableDestination, TableName, RowGrand, ColumnGrand, SaveData, HasAutoFormat, AutoPage, Reserved, BackgroundQuery, OptimizeCache, PageFieldOrder, PageFieldWrapCount, ReadData, Connection)

Méthode : construit un tableau croisé dynamique libellé TableName en se servant des données de SourceData et place le résultat dans TableDestination.

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.

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.

Tableau 16-2. Principales propriétés et méthodes de l’objet PivotTable (Suite)

Page 397: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

379

Partie 5 : Manipulation des objets Excel

ter facilement pour créer des tableaux et des graphiques croisés dynamiques ausein du classeur.

Objet PivotCacheLes données affichées dans un tableau croisé dynamique sont stockées dans unobjet 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’objetWorkbook. Plusieurs tableaux croisés dynamiques peuvent partager le mêmeobjet 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-3. Principales propriétés et méthodes de la collection PivotCaches

Propriété/Méthode Description

Add(SourceType, SourceData)

Méthode : ajoute un nouvel objet PivotCache à la collection. 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.

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.

Page 398: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

380

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

Propriété/Méthode DescriptionConnection 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 (TableDestination, TableName, ReadData, DefaultVersion)

Méthode : crée un objet PivotTable basé sur l’objet PivotCache en cours.

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

Tableau 16-4. Principales propriétés et méthodes de l’objet PivotCache (Suite)

Page 399: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

381

Partie 5 : Manipulation des objets Excel

Objets PivotFieldL’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 denombres (NumberFormat). Les principales propriétés sont toutefois Orientationet Position. La première détermine l’emplacement du champ dans le tableaucroisé dynamique et la deuxième la position du champ parmi tous les champs deson orientation.

● La méthode PivotItem retourne une collection d’objets PivotItem. Chacunde 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’objetPivotTable. 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 sontactuellement 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 sontactuellement affichés dans le tableau croisé dynamique ou le graphiquecroisé 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-que croisé dynamique.

● La propriété RowFields retourne le jeu d’objets PivotField qui sont affichésen tant que lignes dans un tableau croisé dynamique ou un graphiquecroisé dynamique.

● La propriété PageFields retourne le jeu d’objets PivotField qui sont affichésdans la zone de page dans un tableau croisé dynamique ou un graphiquecroisé dynamique.

● La propriété DataFields retourne le jeu d’objets PivotField qui sont affichésdans 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 nonsur la collection PivotFields.

Page 400: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

382

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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

Page 401: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

383

Partie 5 : Manipulation des objets Excel

Objet PivotItemL’objet PivotItem représente une valeur unique spécifique d’un objet PivotFieldparticulier. Le tableau 16.6 présente une liste des principales propriétés etméthodes associées à l’objet PivotItem.

Propriété/Méthode DescriptionPivotItems 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.

Tableau 16-5. Principales propriétés et méthodes de l’objet PivotField (Suite)

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.

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.

Page 402: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

384

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

Programmation de tableaux croisés dynamiques

Pour programmer des tableaux croisés dynamiques, vous devez créer l’objetPivotCache approprié et vous en servir pour créer l’objet PivotTable. Une fois quel’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 vousserez éventuellement tenté d’utiliser l’astuce de l’auteur de macros : enregis-trer une nouvelle macro en se servant des commandes nécessaires poureffectuer la tâche à programmer, puis exploiter le code enregistré comme basedu nouveau programme. Cette technique est extrêmement pratique pour lesmodèles d’objets complexes comme ceux employés par Excel pour manipulerles tableaux croisés dynamiques.

Créer un tableau croisé dynamiqueLe 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 quisera employée pour supprimer la feuille de calcul contenant le tableau croisédynamique.

Sub CreatePivotTable()

Dim pc As PivotCacheDim ws As WorksheetDim 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 = xlRowFieldtc.PivotFields("Month").Position = 1

Page 403: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

385

Partie 5 : Manipulation des objets Excel

tc.PivotFields("Hour").Orientation = xlColumnFieldtc.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’objetsWorksheet associés au classeur actif à la recherche d’une feuille libelléeFeuilleTCD. 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 collectionWorksheets. Le code s’assure que la feuille de calcul est vide avant d’ajouter letableau croisé dynamique.

Il crée ensuite un objet PivotCache avec la méthode PivotCaches.Add. L’argumentxlDatabase indique que les données sont organisées en séries de lignes et decolonnes, alors que le deuxième paramètre indique que les données se trouventsur 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 PivotTableavec la méthode CreatePivotTable de l’objet PivotCache. Cette méthode prenddeux 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 leschamps 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 sur1, 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 dedonné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 lafonction 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.

Page 404: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

386

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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é dynamiqueUne fois que vous avez créé le tableau croisé dynamique, rien de plus simple quede créer le graphique croisé dynamique. Créez un nouvel objet Chart et servez-vous du tableau croisé dynamique comme source de données avec le codesuivant :

Charts.AddActiveChart.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 encommenç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 tableauxcroisés dynamiques se plaignent d’oublier régulièrement la configuration exactequ’ils doivent mettre en évidence. Dans un tableau croisé dynamique simple,

Page 405: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

387

Partie 5 : Manipulation des objets Excel

comme dans le tableau à six champs de notre exemple, vous ne rencontrerez quepeu de difficultés à vous rappeler où placer les éléments. En revanche, si letableau croisé dynamique contient plus de six champs, ou si les données ne voussont pas familières, vous devrez faire appel à quelques techniques de macrospour obtenir la présentation de votre choix. Cette section propose quatre macrosque vous pouvez employer pour construire vos propres solutions.

Faire pivoter un tableau croisé dynamiqueLa première procédure montre comment modifier la position d’un champ ausein du tableau croisé dynamique. Servez-vous du tableau croisé dynamique quise trouve sur la feuille PivotTable du classeur EditPivot.xls (voir figure 16.8).

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 fairepivoter le tableau croisé dynamique pour créer une colonne unique des résultatsen 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 WithNotEnough: MsgBox ("Il y a moins de trois champs dans la zone de ligne.")

Page 406: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

388

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 QuotidienUne occurrence intéressante

Pour que cette macro fonctionne correctement, la zone de ligne doit contenirtrois 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 lerésultat de l’instruction qui place le champ Hour à la quatrième position de lazone de ligne. Si on ignore l’instruction OnError et qu’il y a moins de troischamps dans la zone de ligne, Excel ne parvient pas à trouver la quatrièmeposition 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 del’étiquette NotEnough: si une erreur se produit, Excel interprète l’instruction dedéplacer le champ Hour vers la quatrième position de la zone de ligne commeune instruction de déplacer le champ Hour vers la dernière position de la zonede ligne. Voilà la récompense d’une programmation de qualité.

Page 407: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

389

Partie 5 : Manipulation des objets Excel

Réinitialiser la position d’origineAprè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 leschamps. 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 = 1End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Week") .Orientation = xlRowField .Position = 2End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Day") .Orientation = xlRowField .Position = 3End With

With ActiveSheet.PivotTables("PivotTable8").PivotFields("Hour") .Orientation = xlColumnField .Position = 1End With

End Sub

Remarque Notez que le code déplace les champs par ordre de position desorte que le champ qui se trouve dans la position 1 de la zone de ligne soitinséré avant le champ de la position 2.

Enregistrer et restaurer des positionsSi vous connaissez la disposition de votre tableau croisé dynamique, il n’est guèredifficile de spécifier l’emplacement exact de chaque champ, mais comment fairesi en manipulant votre tableau vous découvrez une disposition qui vousconvient ? Pour vous rappeler la disposition du tableau, vous pouvez toujoursopter pour l’ancienne méthode : un papier et un crayon. Il existe cependant unenouvelle méthode : la macro RecordPosition qui écrit l’ordre des champs dansun groupe de cellules de la feuille de calcul active. Cette macro est spécifique autableau croisé dynamique de la feuille PivotTable dans le classeur EditPivot.xls.

Page 408: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

390

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

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 macrocré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 PivotFieldDim 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 NextEnd With

End Sub

La figure 16.10 présente le résultat de l’exécution de la macro RecordPosition surla 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 sontreprésentées en interne en tant que nombres et non par les constantes Excel dugroupe XlPivotFieldOrientation. Le tableau 16.7 liste les constantes XlPivotFiel-dOrientation et leurs valeurs numériques correspondantes.

Page 409: EXCEL Microsoft Office Excel

Cha

pitr

e 1

6

Tableaux et graphiques croisés dynamiques

391

Partie 5 : Manipulation des objets Excel

Attention Lorsque vous écrivez les valeurs qui représentent la dispositiond’un tableau croisé dynamique dans une feuille de calcul, vérifiez qu’il setrouve une ligne vide en dessous de la dernière entrée pour vous assurer quela macro de restauration s’exécute correctement.

Et maintenant, le moment de vérité. Vous avez enregistré la disposition dutableau croisé dynamique avec la procédure RecordPosition et il est temps devé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 macroResetFromRecorded.

Important Pour que cette macro s’exécute correctement, la cellule activedoit se trouver sur la feuille de calcul qui contient les données de positionenregistré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 dansnotre exemple) et l’identificateur du tableau (PivotTable8 dans cet exemple).

Sub ResetFromRecorded()

Dim myRange As RangeOn 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

Tableau 16-7. Valeurs numériques des constantes XlPivotFieldOrientation

Constante Valeur numérique

xlColumnField 2

xlDataField 0

xlHidden 0

xlPageField 3

xlRowField 1

Page 410: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

392

Partie 5 : Manipulation des objets Excel

Chapitre 1

6

Cette procédure débute à la cellule qui contient l’étiquette Field Name, vérifieque 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 positionque vous souhaitez réutiliser. Vous pourrez alors spécifier la cellule de départdans 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 simpleclic.

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’interfaceExcel. Après l’étude de la création des tableaux croisés dynamiques, nous avonsapprofondi le sujet en examinant quelques techniques précieuses permettant deles manipuler par programmation. Les procédures qui clôturent ce chapitreconstituent d’intéressants outils pour toute personne qui souhaite exploiter desdonnées pour raconter une histoire, au lieu de combler la discussion le temps detrouver une disposition spécifique du tableau croisé dynamique.

Page 411: EXCEL Microsoft Office Excel

393

Partie 5 : Manipulation des objets Excel

Chapitre 17

Barres de commandesIdentification des différentes parties du système de menus . . 393

Contrôles des barres de commandes . . . . . . . . . . . . . 400

Excel propose diverses fonctionnalités qui permettent de manipuler les menus ettrouvent tout leur intérêt lorsque vous créez des macros complémentaires. Vousenregistrez 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 unepartie 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 à ajouterde 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 combineles menus, les boutons de commandes, les zones de listes déroulantes et lesmenus 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 leprocessus de développement.

Page 412: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

394

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

Figure 17-1. Le jeu d’objets CommandBar permet aux programmeurs VBA d’intégrer facilement leurs applications dans Excel.

Collection CommandBarsLa collection CommandBars contient toutes les barres de commandes définiesdans Excel. Pour l’essentiel, la collection CommandBars ressemble à toute autrecollection avec ses propriétés et ses méthodes comme Item, Count et Add. Ellepossède cependant quelques propriétés qui déterminent le fonctionnement desbarres de commandes, comme l’activation et la désactivation de certaines fonc-tionnalités (menus adaptables, personnalisation des menus et animation desmenus).

Page 413: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

395

Partie 5 : Manipulation des objets Excel

Le tableau 17.1 présente une liste des principales propriétés et méthodes de lacollection CommandBars.

La méthode Add crée un objet barre de commandes vide associé aux propriétésspécifiées et la méthode FindControl parcourt les barres de commandes à larecherche d’un contrôle répondant aux critères spécifiés.

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, MenuBar, Temporary)

Méthode : crée une nouvelle barre de commandes et l’ajoute à 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, Visible, Recursive)

Méthode : retourne une référence à l’objet 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.

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.

Page 414: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

396

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

Objets CommandBarLes 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 biaisde la collection CommandBars. Celle-ci existe pour l’objet Application, ainsi qued’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 lesprincipales 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, Visible, Recursive)

Méthode : retourne une référence à l’objet CommandBarControl 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 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.

Page 415: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

397

Partie 5 : Manipulation des objets Excel

Chaque objet CommandBar représente une collection d’éléments de menu etd’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ésentsdans la barre de commandes.

Les propriétés Enable et Visible déterminent si l’utilisateur voit la barre de com-mandes et s’il peut l’utiliser. Si on clique droit alors que le pointeur de la sourissurvole 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 estprécédé d’une coche dans le menu contextuel, indiquant également qu’elle estvisible.

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 certainesdes 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 versun objet CommandBar différent.

Propriété/Méthode DescriptionPosition 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.

Tableau 17-2. Principales propriétés et méthodes de l’objet CommandBar (Suite)

Page 416: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

398

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

Lister les objets CommandBarExcel 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 routinecommence par activer la feuille Liste Barres de commandes puis elle utilise uneboucle For Each pour parcourir la collection CommandBars (vous pouvez laremplacer par « Feuil3 » ou n’importe quel nom de feuille existante). Avec l’objetCommandBar 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 CommandBarDim i As Long

Sheets.Item("Liste Barres de commandes").Activate

i = 3For 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 cEnd Sub

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.

Page 417: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

399

Partie 5 : Manipulation des objets Excel

Ajouter une barre de commandes flottantePour 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 nomExcel2k3 VBA, qui contient des espaces. La valeur msoBarFloating spécifie que labarre ne doit pas être ancrée avec les autres barres de commandes, mais affichéeen 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 = Truec.Visible = TrueEnd Sub

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 indiquesimplement que la barre de commandes est ajoutée à la collection. Avec la valeurTrue, 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 indiquerque cette barre de commandes est temporaire et qu’elle sera automatiquementsupprimé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

Page 418: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

400

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

devez, en outre, suivre cet ordre, puisqu’il faut activer la barre avant de la rendrevisible.

Remarque Vous pouvez également spécifier que la barre de commandes estun menu contextuel en spécifiant msoBarPopup comme deuxième paramètrede la méthode Add.

Supprimer une barre de commandesPour supprimer une barre de commandes, il suffit de la localiser par le biais deson nom et d’appeler la méthode Delete :

Sub SupprimerBarre()Application.CommandBars("Excel2k3 VBA").DeleteEnd Sub

Astuce Faites le ménage avant de quitter

Lorsque vous construisez une macro complémentaire qui contient ses propresbarres de commandes, assurez-vous de les supprimer lors de la suppressionde 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 vousle faites, vérifiez que la barre de commandes n’existe pas lorsque la macrodémarre puis ajoutez-la explicitement si elle manque.

Contrôles des barres de commandesUne barre de commandes peut accueillir un grand nombre de contrôles. Tous cescontrôles possèdent un jeu de propriétés et de méthodes commun, que l’ontrouve dans l’objet CommandBarControl. Outre ce dernier, il existe trois autrestypes d’objets contrôle : CommandBarButton, CommandBarComboBox et Com-mandBarPopup.

Collection CommandBarControlsLa collection CommandBarControls contient le jeu de contrôles de barre de com-mandes affiché dans la barre. Contrairement à la collection CommandBars, quipossède un certain nombre de propriétés spéciales qui dictent le fonctionnementdes barres de commandes au sein d’Excel, la collection CommandBarControls estune collection relativement simple (voir tableau 17.3).

Page 419: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

401

Partie 5 : Manipulation des objets Excel

Bien qu’il existe nombre de types de contrôles différents (listés dans letableau 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 etMenu contextuel possèdent des propriétés et des méthodes supplémentaires.

Tableau 17-3. Principales propriétés et méthodes de la collection CommandBarControls

Propriété/Méthode Description

Add(Type, Id, Parameter, Before, Temporary)

Méthode : crée une nouvelle barre de commandes et l’ajoute à la 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.

Tableau 17-4. Types de contrôles de la barre de commandes

Constante Description

msoControlActiveX Normal

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

Page 420: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

402

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

Objet CommandBarControlLes objets CommandBarControl permettent à l’utilisateur d’effectuer des choix.Ceux-ci prennent la forme de boutons de commande, de listes déroulantes, dezones de liste modifiables et de bien d’autres éléments. Le tableau 17.5 liste lesprincipales propriétés et méthodes de l’objet CommandBarControl.

Constante DescriptionmsoControlExpandingGrid 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

Tableau 17-4. Types de contrôles de la barre de commandes (Suite)

Tableau 17-5. Principales propriétés et méthodes de l’objet 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.

Page 421: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

403

Partie 5 : Manipulation des objets Excel

Propriété/Méthode DescriptionCopy (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.

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.

Tableau 17-5. Principales propriétés et méthodes de l’objet CommandBarControl (Suite)

Page 422: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

404

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

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 decommandes 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 ducontrô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

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.

Width Propriété : contient la largeur du contrôle de barre de commandes en pixels.

Tableau 17-5. Principales propriétés et méthodes de l’objet CommandBarControl (Suite)

Page 423: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

405

Partie 5 : Manipulation des objets Excel

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 decommandes à une autre et la méthode Delete supprime le contrôle de la barre decommandes et de l’application.

Contrôles de boutonsIl n’existe qu’un type de contrôle de bouton : msoControlButton. Cette objet sertdans les cas où vous voulez exécuter une sous-routine en réponse à une action del’utilisateur : appuyer sur un bouton ou sélectionner un élément de menu. Letableau 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.

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.

Page 424: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

406

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

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 parla propriété FaceId. Si vous optez pour les deux, vous pouvez positionner lalégende à droite de l’icône ou en dessous.

Pour un bouton personnalisé, vous avez le choix entre les trois états (up, down etmixed) 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 boutonest à 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'outilsUne 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 barred’outils (voir figure 17.4).

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 enutilisant la collection CommandBars et en spécifiant le nom souhaité. La routineutilise ensuite la méthode Add de la collection Controls pour créer un nouveaubouton. La propriété Style du bouton est positionnée sur le style de boutonapproprié, alors que la propriété Caption contient le texte qui doit ou non s’affi-cher selon le type du bouton.

Page 425: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

407

Partie 5 : Manipulation des objets Excel

Sub CreateBar()Dim c As CommandBarDim cb As CommandBarButton

Set c = Application.CommandBars("Excel2k3 VBA")

Set cb = c.Controls.Add(msoControlButton, 2)cb.Style = msoButtonCaptioncb.Caption = "légende de bouton avec un texte long"

Set cb = c.Controls.Add(msoControlButton, 3)cb.Style = msoButtonIconcb.Caption = "bouton icône"

Set cb = c.Controls.Add(msoControlButton, 4)cb.Style = msoButtonIconAndCaptioncb.Caption = "bouton icône et texte"End Sub

Contrôles de zone de liste modifiableIl 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 unchoix 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.

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

Page 426: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

408

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

La liste des éléments qui s’affichent dans une zone de liste modifiable est untableau 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 laproprié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 optionspé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’uneposition 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 ledébut de la liste.

Utiliser une zone de liste modifiableLes zones de liste modifiables et les listes déroulantes permettent à l’utilisateur defaire 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 unemacro traitée lorsqu’une valeur de la liste déroulante est sélectionnée.

Sub AddCommandCombo()

Dim c As CommandBarDim cb As CommandBarComboBox

Set c = Application.CommandBars("Excel2k3 VBA")

Set cb = c.Controls.Add(msoControlDropdown)cb.Style = msoComboNormalcb.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

Propriété/Méthode DescriptionRemoveItem(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.

Tableau 17-7. Propriétés et méthodes uniques de l’objet CommandBarComboBox (Suite)

Page 427: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

409

Partie 5 : Manipulation des objets Excel

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ôlepour vérifier s’il s’agit de la liste déroulante créée plus tôt. Si tel est le cas, l’indexde l’élément sélectionné sert à extraire l’élément approprié de la liste.

Contrôles de menu contextuelLes contrôles de menu contextuel servent à afficher des informations hiérarchi-ques, comme un menu déroulant ou une liste d’icônes. Contrairement auxautres 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).

Afficher un menu contextuelL’affichage des menus contextuels constitue une fonctionnalité intéressante denombreux programmes VBA. La routine suivante montre comment créer et affi-cher un menu contextuel. Elle commence par désactiver la récupération deserreurs en utilisant une instruction On Error Resume Next. Elle essaie ensuite deré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 surNothing. Sans l’instruction On Error, toute tentative de référencer une barre decommandes inexistante déclenche une erreur d’exécution.

Sub ShowCommandPopup()

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.

Page 428: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

410

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

Dim c As CommandBarDim cb As CommandBarButtonDim cp As CommandBarPopup

On Error Resume NextSet 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"

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 listedes éléments de menu. Pour présenter des éléments de sous-menu, vous devezajouter un élément msoControlPopup. Celui-ci insère un élément équipé d’uneflè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.

Page 429: EXCEL Microsoft Office Excel

Cha

pitr

e 1

7

Barres de commandes

411

Partie 5 : Manipulation des objets Excel

Pour finir, une fois que la barre de commandes est initialisée, on l’affiche avec laméthode ShowPopup. Vous devez exécuter cette méthode chaque fois que vousvoulez 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 menucontextuel en réponse à une action de l’utilisateur comme l’exécution d’unemacro, la gestion d’une condition particulière avec une application Excel plusimportante ou la réponse à une séquence.

Ajouter des éléments à un menu existantPour 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, laroutine suivante ajoute un élément de menu À propos pour une application VBApersonnalisée :

Sub AddMenuItem() Dim c As CommandBarDim cb As CommandBarButtonDim cp As CommandBarPopup

On Error Resume NextSet 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 IfEnd Sub

La première étape consiste à localiser la barre de commandes dans laquelle vousvoulez ajouter le nouvel élément de menu. Dans la mesure où tous les élémentsde menu d’Excel se trouvent dans la barre de menus Worksheet, la manière la plussimple de commencer est de localiser cette barre de commandes. Dans cettebarre, on localise ensuite le contrôle contextuel Help.

Pour finir, par le biais de la collection Controls du contrôle contextuel Help, onajoute un nouveau bouton de contrôle à la fin de la liste du message À propos devotre application. La propriété OnAction spécifie la routine appelée pour afficherla message.

Dans ce chapitre, vous avez appris que les barres de commandes combinent lesfonctions 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

Page 430: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

412

Partie 5 : Manipulation des objets Excel

Chapitre 1

7

barre d’outils) et la collection CommandBars, qui contient les références à tousles 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. Pourfinir, nous avons vu comment définir une routine qui répond à un événementdé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ègrentparfaitement l’application Excel.

Page 431: EXCEL Microsoft Office Excel

413

Partie 5 : Manipulation des objets Excel

Chapitre 18

Personnalisation des boîtes de dialogue

Affichage des boîtes de dialogue existantes. . . . . . . . . . . . . . . . . . 414Modification des boîtes de dialogue existantes . . . . . . . . 418

Planification avec des boîtes de dialogue . . . . . . . . . . . . . . . . 424

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 pendantl’exécution d’une macro, de quelles options disposez-vous ? La première optionest de créer une feuille UserForm, comme nous le verrons au chapitre 19, danslaquelle les options disponibles sont listées : il suffit à l’utilisateur de sélectionnerles paramètres appropriés. À partir des sélections de l’utilisateur, vous appliquezses choix aux plages appropriées du classeur. Bien sûr, certains d’entre nous seplaisent à 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, vousdevez 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 parle 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 dansle 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éess’appliquent à un classeur vide, vous pouvez extraire leurs propriétés avec ducode VBA et les appliquer aux plages appropriées.

En général, lorsque l’intervention de l’utilisateur est nécessaire, votre meilleureoption 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 demise en forme. Elle fonctionne cependant avec d’autres modifications de varia-bles. Si vous voulez, par exemple, proposer à l’utilisateur de localiser le dossier

Page 432: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

414

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

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

Dans ce chapitre, vous allez apprendre à afficher les boîtes de dialogue intégréeset à les manipuler en leur passant des arguments et en définissant leurs proprié-tés.

Affichage des boîtes de dialogue existantesLes procédures écrites en VBA peuvent exécuter des commandes de menu Excelet, si ces commandes mènent à une boîte de dialogue, vous pouvez lui appliquerdes paramètres via du code. Pour accéder aux boîtes de dialogue d’Excel, vouspouvez également exploiter l’objet Dialog. Les boîtes de dialogue présentent unintérêt particulier : vous pouvez exécuter leurs routines en arrière-plan. Inutiled’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 dansExcel. La constante xlBuiltinDialog sert à accéder à un objet Dialog individuel dela collection Dialogs. Pour identifier la boîte de dialogue à ouvrir, servez-vous dela syntaxe Dialogs(xlDialogObjectName) ou xlDialogObjectName représente laconstante intégrée qui l’identifie. L’exemple suivant affiche la boîte de dialogueOuvrir :

Sub ShowOpen() Result = Application.Dialogs(xlDialogOpen).ShowEnd Sub

La variable Result permet de déterminer si l’utilisateur a cliqué sur le bouton OKou si l’action a été annulée parce que l’utilisateur a appuyé sur la touche ÉCHAPou cliqué sur le bouton Annuler. Vous pouvez ensuite vous servir de la valeurassigné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 laplupart des boîtes de dialogue intégrées. Chaque constante est formée à partir dupréfixe xlDialog suivi du nom de la boîte de dialogue. Par exemple, la constantede la boîte de dialogue Validation est xlDialogDataValidation et celle de la boîtede dialogue Définir un nom est xlDialogDefineName. Ces constantes constituentdes exemples du type de membre que l’on trouve dans la propriété xlBuiltinDia-log.

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éeListes d’arguments de boîte de dialogue intégrée.

Page 433: EXCEL Microsoft Office Excel

Cha

pitr

e 1

8

Personnalisation des boîtes de dialogue

415

Partie 5 : Manipulation des objets Excel

Un objet Dialog représente une boîte de dialogue Excel intégrée. Chaque objetDialog possède des propriétés personnalisées qui dépendent du type de l’objetDialog. 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, Atteindreet à 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 pourpermettre à l’utilisateur d’effectuer certains choix. Pour ce faire, vous disposez dedeux 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 dedialogue intégrées d’Excel. Elle dispose de constantes prédéfinies qui simplifientla 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 unexemple qui affiche la boîte de dialogue Atteindre avec le résultat de lafigure 18.1.

Sub ShowGoto()Application.Dialogs(xlDialogFormulaGoto).ShowEnd Sub

Figure 18-1. La boîte de dialogue Atteindre apparaît lorsqu’on l’appelle avec la constante intrinsèque xlDialogFormulaGoto.

Lorsque la boîte de dialogue Atteindre s’affiche, l’utilisateur peut spécifier uneplage de cellules ou saisir une adresse de cellule à atteindre. La boîte de dialoguequi s’affiche avec la constante xlDialogFormulaGoto correspond à celle que vousobtenez en choisissez la commande Atteindre dans le menu Édition.

Page 434: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

416

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

Vous pouvez également écrire du code qui utilise une variable pour déterminercomment l’utilisateur ferme la boîte de dialogue. Dans l’instruction suivante, lavariable 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).ShowEnd Sub

La variable Result ne conserve pas la plage spécifiée dans la boîte de dialogueAtteindre, mais contient la valeur booléenne qui reflète le choix de fermeture dela boîte de dialogue.

Les boîtes de dialogue intégrées ne sont guère documentées. L’aide en ligne restetrès fragmentaire et les fichiers ne mentionnent pas le fait qu’afficher l’une desboî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 quele code réagit tel que prévu.

Dans le cas de la boîte de dialogue Atteindre, vous noterez que le bouton Cellulesest grisé si on se sert d’une instruction VBA pour l’afficher. Ce bouton n’est pasgrisé si on passe par les commandes de menu. Pour afficher la boîte de dialogueSélectionner les cellules avec du code VBA, vous devez utiliser la constanteintrinsèque de cette boîte de dialogue : xlDialogSelectSpecial. La figure 18.2 pré-sente le résultat.

Sub ShowGotoSpecial()Application.Dialogs(xlDialogSelectSpecial).ShowEnd 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.

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êmemaniè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

Page 435: EXCEL Microsoft Office Excel

Cha

pitr

e 1

8

Personnalisation des boîtes de dialogue

417

Partie 5 : Manipulation des objets Excel

qu’un onglet à la fois. L’instruction suivante affiche l’onglet Alignement de laboîte de dialogue Format de cellule (voir figure 8.3).

Sub ShowAlignmentTab()Application.Dialogs(xlDialogAlignment).ShowEnd 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’existeaucune 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 QuotidienVariables retournées ou exécution ?

Une boîte de dialogue ouverte propose plusieurs options et son exécutiondéclenche les actions attendues. Si vous cherchez uniquement à collecter desinformations comme un nom de fichier, essayez une autre méthode, commeGetOpenFilename ou GetSaveAsFilename. Ces deux méthodes affichent leursboî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 surOK. Ces méthodes retournent le nom de fichier complet comme variable quevous 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é :

Sub GetFileName()FullFileName = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*", _ 1, "Titre personnalisé", , False)

Page 436: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

418

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

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 laméthode de votre choix. Il peut, par exemple, vous servir à ouvrir le fichier avecla méthode Open.

Workbooks.Open FullFileName

Vous pouvez également enregistré le classeur sous le nouveau nom de fichieren vous servant de la ligne de code suivante :

Workbooks.SaveAs FullFileName

Lorsque les utilisateurs ont confirmé leur choix dans la boîte de dialogue Ouvrirou 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 leslecteurs 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 lesoptions par défaut. Par exemple, vous pouvez définir le répertoire par défautdans lequel un classeur doit être enregistré en vous servant des arguments d’uneboîte de dialogue pour modifier les sélections par défaut. La prochaine sectionexplique comment accéder à la collection Dialogs et passer des arguments à laboî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’ongletProtection de la boîte de dialogue Format de cellule, que l’on exécute avec laconstante xlDialogCellProtection, prend deux arguments : locked et hidden, quicorrespondent 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, TrueEnd Sub

Page 437: EXCEL Microsoft Office Excel

Cha

pitr

e 1

8

Personnalisation des boîtes de dialogue

419

Partie 5 : Manipulation des objets Excel

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ésdans 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 nefournit aucune explication quant à l’usage de ces arguments.

Selon le fichier d’aide, la boîte de dialogue Atteindre exécutée par la constantexlDialogFormulaGoto utilise deux arguments : reference et corner. L’argumentreference 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 Falsepour indiquer si la cellule cible doit apparaître dans l’angle supérieur gauche dela fenêtre. L’exemple suivant utilise ces deux arguments :

Sub GotoArguments() Application.Dialogs(xlDialogFormulaGoto).Show Range("Z100"), TrueEnd Sub

À mesure que vous exploiterez les boîtes de dialogue, vous découvrirez qu’il fautquelque peu tâtonner avant de parvenir à utiliser correctement la collection Dia-logs.

Explorer la collection DialogsLa collection Dialogs de l’objet Application se compose de plus de 250 membresqui représentent la plupart des boîtes de dialogue intégrées d’Excel. Chaqueobjet Dialog dispose de constantes prédéfinies qui simplifient la spécification dela boîte de dialogue à employer.

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.

Page 438: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

420

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

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 desconstantes intrinsèques xlDialog, mais certaines sont plus utiles que d’autres. Lestrois prochains tableaux listent les boîtes de dialogue employées pour formaterles 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 correctementorthographiés dans l’aide en ligne ou toute autre littérature sur le sujet, maisl’argument correspond souvent à une case à cocher, une option ou un autrecontrôle de la boîte de dialogue. Par exemple, la constante xlDialogFontappelle la boîte de dialogue Polices. Pour sélectionner la police Tahoma avecune taille de 12 par défaut, servez-vous du code :

Application.Dialogs(xlDialogFont).Show "Tahoma", 12.

Pour afficher la police par défaut, vous laissez le premier argument vide,comme dans l’instruction Application.Dialogs(xlDialogFont).Show, 12.

Page 439: EXCEL Microsoft Office Excel

Cha

pitr

e 1

8

Personnalisation des boîtes de dialogue

421

Partie 5 : Manipulation des objets Excel

Le tableau 18.1 liste certaines des boîtes de dialogue couramment employéespour formater les cellules dans le classeur.

Le tableau 18.2 liste certaines des boîtes de dialogue couramment employéespour insérer ou modifier des graphiques dans un 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

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, series_line, labels, vary

xlDialogFormatCharttype apply_to, group_num, dimension, type_num

xlDialogFormatLegend position_num

xlDialogGallery3dBar type_num

Page 440: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

422

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

Le tableau 18.3 présente certaines des boîtes de dialogue employées pour accéderaux options disponibles par le biais de la structure d’Excel.

Constante xlDialog DescriptionxlDialogGallery3dColumn 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

Tableau 18-2. Boîtes de dialogue xlDialog employées pour modifier les graphiques (Suite)

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

xlDialogSaveAs document_text, type_num, prot_pwd, backup, write_res_pwd, read_only_rec

xlDialogSendMail recipients, subject, return_receipt

Page 441: EXCEL Microsoft Office Excel

Cha

pitr

e 1

8

Personnalisation des boîtes de dialogue

423

Partie 5 : Manipulation des objets Excel

Il existe bien d’autres boîtes de dialogue intégrées. Pour en localiser tous lesarguments disponibles, consultez le site web de MSDN et l’aide en ligned’Excel.

Passer des arguments aux boîtes de dialogue existantesLa 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é Showest positionnée sur True. Rappelez-vous que vous n’êtes pas limité aux valeurspar défaut de la boîte de dialogue. Vous pouvez les modifier en lui passant desarguments.

Remarque S’il est possible de retourner ou de modifier une propriété ou unemé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 utilisezle code VBA au lieu d’accéder à l’objet Dialog, votre code n’en sera que plussimple et plus court.

Avant de retourner ou de modifier un paramètre de boîte de dialogue avec l’objetDialog, vous devez identifier la boîte de dialogue. Pour ce faire, servez-vous de laproprié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 lesparamè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 etverticalement avec le renvoi à la ligne automatique activé, servez-vous du codesuivant :

Sub VerifyAlignment() Application.Dialogs(xlDialogAlignment).Show 3, 1, 2End Sub

La figure 18.6 montre le résultat de cette procédure.

Constante xlDialog DescriptionxlDialogShowToolbar bar_id, visible, dock, x_pos, y_pos, width, protect, tool_tips,

large_buttons, color_buttons

xlDialogZoom magnification

Tableau 18-3. Constantes xlDialog de la structure des menus d’Excel (Suite)

Page 442: EXCEL Microsoft Office Excel

Microsoft Office Excel 2003 au Quotidien

424

Partie 5 : Manipulation des objets Excel

Chapitre 1

8

Figure 18-6. L’onglet Alignement avec les alignements définis et le renvoi à la ligne activé.

Planification avec des boîtes de dialogueTout 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 deminimiser le travail de codage. L’objectif d’une bonne procédure est un travailsimple et efficace. Gardez cela à l’esprit à l’heure d’entamer votre prochain pro-jet.

Page 443: EXCEL Microsoft Office Excel

425

Partie 5 : Manipulation des objets Excel

Chapitre 19

Création de feuilles UserForm

Création d’une feuille UserForm . . . . . . . . . . . . . . . . . . 425

Contrôles UserForm. . . . . . . . . . 431

Les feuilles UserForm permettent aux programmeurs Microsoft Excel d’offriraux utilisateurs une manière différente d’interagir avec leurs applications. Dansce chapitre, vous allez apprendre à créer une feuille et à y ajouter les contrôlesstandard fournis par Visual Basic pour Applications (VBA). Vous étudierezensuite comment afficher et fermer des feuilles à partir de vos routines. Pourfinir, vous découvrirez comment interagir avec la feuille à partir de l’applicationVBA.

Création d’une feuille UserFormVBA propose un objet spécial appelé UserForm. Un objet UserForm constitueune surface sur laquelle vous pouvez placer des contrôles graphiques, comme desboutons, des images et des zones de texte.

Ajouter un objet UserFormPour ajouter un UserForm à votre projet, dans le menu Insertion de Visual BasicEditor, choisissez UserForm (voir figure 19.1). La feuille est une maquette defenêtre, comprenant une barre de titre complète dont le titre est UserForm1 pardéfaut, un bouton Fermer et une surface remplie de points.

Outre la feuille, Visual Basic Editor affiche également une barre d’outils flottanteintitulée Boîte à outils. Celle-ci héberge différents contrôles que l’on peut placersur la surface de dessin de la feuille.

Page 444: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

426

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Figure 19-1. Un objet UserForm permet au programmeur VBA de concevoir une interface graphique pour son application.

Concevoir un objet UserFormPour concevoir un objet UserForm, vous devez sélectionner des contrôles dans laBoîte à outils et les faire glisser sur la surface de dessin. Une fois qu’ils se trouventsur la feuille, vous modifiez l’aspect des contrôles en les sélectionnant puis en lesformatant à 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 lemenu 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 lasouris. Vous avez ajouté un contrôle Intitulé dans la feuille.

Page 445: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

427

Partie 5 : Manipulation des objets Excel

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ôleet 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 nouvellefeuille au premier plan.

7 Cliquez sur le bouton Fermer pour fermer la feuille et revenir à VisualBasic Editor.

Modifier un objet UserFormPour 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 ousélectionnez-le dans la liste déroulante de la fenêtre Propriétés. Une fois l’objetsé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 pointeurde la souris au-dessus de l’un des carrés du bord pour qu’il prenne la formed’une double flèche. Cliquez et maintenez le bouton de la souris enfoncé tout endéplaçant la souris pour modifier la taille de la feuille.

Page 446: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

428

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

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.Ces valeurs sont exprimées en points.

Propriétés d’un objet UserFormL’objet UserForm propose une large palette de propriétés qui contrôlent sonaspect et son fonctionnement. Le tableau 19.1 liste certaines de ces propriétés.

La propriété Name contient le nom de l’objet UserForm. Rappelez-vous que cettepropriété apparaît en réalité en tête de liste des propriétés et non selon l’ordrealphabétique comme le reste des propriétés.

Si vous ajustez manuellement la hauteur et la largeur de la feuille, les propriétésHeight et Width sont automatiquement ajustées en conséquence. Les propriétésTop 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

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.

Page 447: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

429

Partie 5 : Manipulation des objets Excel

défaut, ces propriétés prennent les paramètres de Windows. Ainsi, si l’utilisateura installé un thème Windows spécial, la feuille exploite ces couleurs.

Afficher un objet UserFormLes objets UserForm sont des objets Visual Basic que vous pouvez manipuleravec du code en paramétrant leurs propriétés, méthodes d’appel et réponsesaux événements. Il n’est guère difficile de créer une macro qui affiche unefeuille à l’écran. Il suffit ensuite d’ajouter le code qui s’exécute en réponseaux 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. Pourcommencer, 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. Leprocessus d’affichage crée la fenêtre graphique qui contient la feuille et la rendvisible à l’utilisateur.

Pour charger puis afficher une feuille, vous appelez sa méthode Load puis saméthode Show. Si la feuille ne se charge pas lorsque vous appelez la méthodeShow, elle est chargée automatiquement.

Hide est le contraire de Show et Unload celui de Load. Ainsi, si vous appelez laméthode Hide, vous masquez une feuille sans libérer ses ressources. De même, sivous 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 estautomatiquement supprimée de l’affichage avant que ses ressources ne soientlibérées.

Astuce Des feuilles plus rapides

Le chargement d’un objet UserForm consomme beaucoup de ressources. Plusla feuille est complexe, plus elle exploite de ressources pour se charger. Pourafficher rapidement une feuille, il serait préférable de la masquer au lieu de ladé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 ladéchargeant.

Vous pouvez afficher une feuille de deux manières : modale ou sans mode. Dansune feuille modale, tout le traitement de l’application associée s’arrête jusqu’à ceque 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

Page 448: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

430

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Toutefois, si vous appelez la méthode Show sans préciser le mode, la feuille s’affi-che de manière modale.

Astuce Feuilles et contrôles de barre de commandes

Vous pouvez utiliser une sous-routine associée à la routine OnAction pourappeler la méthode Show d’un objet UserForm. Cette technique est particuliè-rement adaptée à l’ouverture d’assistants ou pour permettre à l’utilisateur desaisir 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. Cetteapproche répond à différentes applications, mais il est préférable de l’employeravec parcimonie. En effet, les feuilles sans mode n’apparaissent ni dans la barredes 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 uneautre 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énementActivate 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 depuisune autre application avec Excel et le programme VBA ne déclenche pas ces évé-nements.

Au QuotidienBoîte de dialogue intégrée ou personnalisée ?

Vous vous demandez probablement pourquoi utiliser une boîte de dialoguepour modifier la feuille de calcul alors que vous disposez de méthodes et depropriétés dans le code VBA. Supposons que l’utilisateur doive faire des choixcomme celui de la couleur de fond ou de la taille de police. Ce sont de parfaitsexemples 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’ilconnaît. Une fois qu’il a choisi la couleur, vous récupérez les sélections et lesappliquez aux plages de votre choix.

Avec une boîte de dialogue intégrée, l’utilisateur interagit avec le code demanière productive. Servez-vous d’une instruction Then…Else pour appliquerla couleur par défaut au cas où l’utilisateur clique sur le bouton Annuler ouappuie sur la touche ÉCHAP.

Page 449: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

431

Partie 5 : Manipulation des objets Excel

Rappelez-vous : le code doit interagir avec l’utilisateur. Il doit proposer dessolutions simples qui demandent peu voire pas de formation. Avec les boîtesde dialogue intégrées, vous exploitez une interface connue de l’utilisateur etqu’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à uneboîte de dialogue qui vous évitera cette peine ? Si tel est le cas, essayez lesboîtes de dialogue intégrées et voyez si vous parvenez au résultat souhaité.

Contrôles UserFormLa 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 modifierl’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ôlesOutre l’affichage de la feuille, Visual Basic Editor affiche également une barred’outils flottante intitulée Boîte à outils. La Boîte à outils regroupe les contrôlesdestiné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. Pourmodifier sa taille et sa position manuellement, sélectionnez-le et déplacez-le ouservez-vous des poignées de dimensionnement qui l’entourent (voirfigure 19.2).

Page 450: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

432

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

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 à lafeuille. Il s’agit d’un élément indépendant, au même titre qu’un module ou unmodule de classe. Pour basculer du mode graphique de la feuille à l’affichage ducode, 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énementsLes contrôles UserForm sont des objets et, à l’instar des autres objets que nousavons 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.

Page 451: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

433

Partie 5 : Manipulation des objets Excel

Les propriétés Height, Width, Top et Left indiquent la taille physique et la positiondu 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é.

Propriété/Méthode DescriptionControlTipText 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.

Tableau 19-2. Propriétés, méthodes et événements principaux des contrôles UserForm (Suite)

Page 452: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

434

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Lorsque la propriété Locked est positionnée sur True, l’utilisateur peut manipulerle contenu du contrôle mais ne peut pas en modifier la valeur. Par exemple, ilpeut 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 surFalse, 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 estentièrement visible et celui qui est partiellement ou totalement masqué. Si vousplacez un contrôle à l’avant-plan de l’axe des z, il est affiché en dernier : il seradonc entièrement visible, même s’il chevauche d’autres contrôles. De même, sivous vous servez de la méthode ZOrder pour placer un contrôle à l’arrière-plansur l’axe des z, il est restitué en premier : tout contrôle rendu ultérieurement peutle masquer.

TabIndex identifie l’ordre dans lequel le focus passe d’un contrôle au suivantlorsque l’utilisateur appuie sur la touche TAB et TabStop détermine si le contrôleaccepte le focus ou si celui-ci passe au prochain contrôle possédant la valeurTabIndex la plus élevée. Les événements Enter et Exit se déclenchent lorsque lefocus passe d’un contrôle à l’autre au sein de la même feuille. La routine Exitcontient un unique argument, Cancel, que vous pouvez positionner sur Truepour 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 contenudu 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 demessage 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 estdiffé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 lapremière contient essentiellement des informations que l’on peut modifier parinteraction de l’utilisateur avec la feuille.

Les événements Click et DblClick se déclenchent lorsque l’utilisateur clique oudouble-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.

Page 453: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

435

Partie 5 : Manipulation des objets Excel

Note du traducteur Les contrôles des feuilles UserForm ont été traduitsdans la Boîte à outils VBA, mais conservent leur nom anglais une fois inséréssur la feuille et dans la fenêtre Propriétés. Afin de simplifier la compréhensiondes prochaines sections, nous avons choisi de conserver le nom anglais descontrô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 LabelLe contrôle Label (Intitulé) permet au programme d’afficher du texte sur lafeuille 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 (Zonede texte).

Bien que l’utilisateur ne puisse pas modifier la valeur du contrôle Label, votreprogramme 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épondaux clics de souris et déclenche les événements Click et DblClick.

Contrôle CommandButtonLe contrôle CommandButton (Bouton de commande) affiche un bouton quidéclenche l’événement Click associé si l’utilisateur clique sur le bouton. Pour ledéclencher, on peut également utiliser la touche TAB pour lui donner le focuspuis 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 valeursur « 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

Page 454: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

436

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Astuce Une pression sur un bouton

Servez-vous du bouton de commande pour appeler une sous-routine chargéede traiter les informations sur la feuille.

Contrôle TextBoxLe contrôle TextBox (Zone de texte) constitue le principal contrôle employé pouraccepter du texte émanant de l’utilisateur. Il existe deux types principaux dezones de texte : à ligne unique ou à plusieurs lignes. Cet aspect du contrôle estgé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 necomporte 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 laligne suivante. Cet espace blanc peut vous servir à diviser un long bloc detexte en paragraphes.

Si le texte affiché dans la zone de texte est plus long que la partie visible, vouspouvez ajouter des barres de défilement permettant à l’utilisateur de visualiser letexte masqué. Pour afficher une barre de défilement horizontale dans une zonede texte à ligne unique, positionnez la propriété ScrollBars sur fmScrollBarsHori-zontal. Dans une zone de texte à plusieurs lignes, vous pouvez également opterpour 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’affichagedes barres de défilement.

La propriété WordWrap constitue une autre propriété intéressante des zones detexte à plusieurs lignes. Lorsqu’elle est positionnée sur True, toute ligne troplongue pour s’afficher complètement dans l’espace horizontal disponible estrenvoyé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.

Page 455: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

437

Partie 5 : Manipulation des objets Excel

La propriété LineCount retourne le nombre de lignes d’une zone de texte à plu-sieurs lignes.

Les caractères affichés dans un contrôle TextBox sont présents dans les propriétésText et Value et vous modifiez le contenu de la zone de texte en changeant l’uneou l’autre propriété. Il est cependant coutume d’utiliser la propriété Text au lieude 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 saisipar un utilisateur dans la zone de texte. Cet événement peut servir à validerles informations saisies caractère par caractère. Toutefois, pour valider la zonede 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 lefocus 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 valeurpour la propriété PasswordChar. Cette propriété sert essentiellement à masquerle 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’onpeut 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 laproprié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 CheckBoxLe contrôle CheckBox (Case à cocher) permet à l’utilisateur de choisir entre deuxvaleurs 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 puisquepour en modifier la valeur, il suffit que l’utilisateur clique n’importe où sur lecontrôle, y compris sur sa légende. Pour afficher la valeur d’un contrôle Check-

Page 456: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

438

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Box, vous pouvez faire appel à un code similaire à celui de l’événement Changesuivant :

Private Sub CheckBox1_Change()

MsgBox "La valeur du contrôle CheckBox est " & CheckBox1.Value

End Sub

Contrôle ToggleButtonLe contrôle ToggleButton (Bouton bascule) est similaire au contrôle CheckBox ence qu’il permet à l’utilisateur de choisir entre deux valeurs. La seule différenceréelle entre les deux est que le contrôle ToggleButton semble « relevé » quand lapropriété Value est positionnée sur False et « enfoncé » lorsqu’elle prend la valeurTrue.

Contrôle SpinButtonLe contrôle SpinButton (Bouton toupie) simplifie le choix entre plusieursvaleurs. La propriété Value contient la valeur actuelle du contrôle. Si on cliquesur 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 ducontrô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 sedéclenche. En outre, l’événement SpinUp se déclenche si on clique sur le boutonFlèche haut et un clic sur le bouton Flèche bas déclenche l’événement SpinDown.

Page 457: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

439

Partie 5 : Manipulation des objets Excel

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.La valeur par défaut est de 500 millisecondes. Le délai entre le premier et ledeuxième appel est égal à cinq fois la valeur de Delay pour qu’il soit plus simplepour 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ôleSpinButton pour afficher la valeur en cours. Voici un exemple de code :

Private Sub SpinButton1_Change()

TextBox1.Text = SpinButton1.Value

End Sub

Contrôle FrameLe 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 deVisual Basic qui puisse contenir d’autres contrôles, appelés également contrôlesenfants.

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 à lafeuille 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. Unefois que le contrôle se trouve sur la feuille ou dans le cadre, vous pouvez ledéplacer à votre guise.

Les cadres servent également à attirer l’attention sur un groupe de contrôles. Lapropriété Caption s’affiche sur le bord du cadre.

Page 458: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

440

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Astuce Déplacer des cadres

Si vous redimensionnez et/ou déplacez un cadre dans une feuille, tous lescontrôles qu’ils contient suivent le mouvement. La position relative entre lescontrôles enfants et l’angle supérieur gauche du cadre est constante.

Contrôle OptionButtonLe 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. Lorsquel’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 lafeuille 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 affecteuniquement 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 sontpas 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 desupprimer le contrôle Frame. Une fois le contrôle Frame supprimé, vous pouvezles coller directement sur la feuille ou à l’endroit de votre choix.

Page 459: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

441

Partie 5 : Manipulation des objets Excel

Contrôle ImageLe contrôle Image relativement simple. Il permet d’afficher une image sur unefeuille. 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 automatiquementl’image. Pour charger une image pendant l’exécution du programme, faitesappel à la fonction LoadPicture de la manière suivante, où <nomchemin> contientle 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 VisualBasic Editor ou dans l’application, elle s’affiche dans sa taille normale. Celasignifie que vous ne verrez la totalité de l’image que si le contrôle Image possèdela 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 toutel’image plus l’arrière-plan du contrôle.

La propriété PictureAlignment gère le placement de l’image dans le contrôle. Pardéfaut, elle s’aligne de sorte que son angle supérieur gauche soit placé dansl’angle supérieur gauche du contrôle (fmPictureAlignmentTopLeft). Les valeurssuivantes sont disponibles : fmPictureAlignmentTopRight, fmPictureAlignment-Center, fmPictureAlignmentBottomLeft et fmPictureAlignmentBottomRight.

Utilisez la propriété PictureSizeMode pour redimensionner automatiquementl’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 pourl’adapter à la zone, mais vous ne modifiez par le rapport hauteur/largeur. Unevaleur de fmPictureSizeModeClip affiche l’image dans sa taille normale et éliminetoute 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èteautant de fois que nécessaire pour remplir complètement l’espace disponibledans le contrôle Image. La première copie de l’image est placée en fonction de lapropriété PictureAlignment.

Page 460: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

442

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

Contrôle ScrollBarLe 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, labarre de défilement sera horizontale (fmOrientaionHorizontal) ou verticale(fmOrientationVertical).

Remarque Par défaut, la propriété Orientation prend la valeur fmOrientationAuto. 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 hautque 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éelorsque 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 à droited’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 del’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 dedéfilement, mais l’événement Change se déclenche quand la valeur change. Pourdes raisons pratiques, ces deux événements sont similaires. La seule différence estque l’événement Scroll se déclenche plusieurs fois pendant que l’utilisateurdéplace l’ascenseur sur la barre de défilement. L’événement Change se déclencheuniquement après que l’utilisateur a relâché l’ascenseur.

Contrôle ListBoxLe 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 organiserles éléments à sélectionner en une série de lignes et de colonnes. Le nombre decolonnes 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,

Page 461: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

443

Partie 5 : Manipulation des objets Excel

autrement dit une seule colonne est affichée. Si vous positionnez cette propriétésur –1, toutes les colonnes disponibles s’affichent (jusqu’à 10).

Si la propriété ColumnHeads est positionnée sur True, la première ligne de la listesert 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 laforme 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écifierles largeurs en centimètres (cm) ou en pouces (in). Le séparateur décimal estautorisé. Si vous spécifiez une valeur de 0 pour la largeur d’une colonne, celle-cine 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 ligneet celui de la colonne. Ces deux paramètres commencent à zéro et possèdent unevaleur 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 untableau bidimensionnel de valeurs dans la propriété en une seule instruction.

La routine suivante montre comment utiliser les propriétés List et ColumnCountpour initialiser un contrôle zone de liste :

Private Sub UserForm_Initialize()

Dim MaListe(10, 2) As StringDim 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 = 3ListBox1.List = MaListe

End Sub

La propriété Column peut servir à référencer une valeur de colonne ou de ligneparticulière. Si la propriété Column ne contient qu’un argument, vous pouvezassigner les valeurs à la colonne spécifiée dans la liste. Notez que les numéros decolonnes 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 estpossible de spécifier la ligne à laquelle insérer la nouvelle ligne (les lignes sont

Page 462: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

444

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

numérotées en commençant à zéro). La méthode RemoveItem supprime la lignespécifiée de la liste. La méthode Clear supprime tous les éléments de la liste.

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 actuellementsé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’utilisateurclique sur l’élément.

Private Sub ListBox1_Click()

MsgBox ListBox1.ListIndex

End Sub

Si la propriété MultiSelect est positionnée sur fmMultiSelectMulti, l’utilisateurpeut sélectionner plusieurs éléments de la liste en appuyant sur la barre d’espaceou 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 lasouris, il ajoute tous les éléments situés entre l’élément sélectionné et l’élémentqui se trouve sous le pointeur de la souris. La touche CTRL permet à l’utilisateurde 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 lapropriété Selected associée au nombre de lignes pour déterminer l’état de chaqueligne. 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émentss’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 fmListStyleOption affiche des boutons d’option (MultiSelect=False) ou des cases àcocher (MultiSelect=True) devant chaque ligne pour simplifier le processus desé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. Lavaleur fmMatchEntryFirstLetter signifie que si l’utilisateur tape une lettre, larecherche 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êmecaractère, la recherche localise la deuxième occurrence de la lettre en tant quepremier caractère. La valeur fmMatchEntryComplete permet à l’utilisateur desélectionner la ligne en tapant le préfixe des caractères qui correspondent à

Page 463: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

445

Partie 5 : Manipulation des objets Excel

l’entrée recherchée. La valeur fmMatchEntryNone désactive la fonction de cor-respondance.

Contrôle ComboBoxLe 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 dansla précédente section « Contrôle ListBox » s’appliquent également au contrôleComboBox.

La seule fonctionnalité du contrôle ListBox que le contrôle ComboBox ne prendpas 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 disponiblespour 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, danslequel l’utilisateur saisit des caractères, suivi d’un bouton déroulant qui afficheune zone de liste contenant une liste de valeurs que l’on peut sélectionner. Enpositionnant 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 dansla 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 lesvaleurs possibles : fmShowDropButtonWhenNever, qui masque le bouton dérou-lant, fmShowDropButtonWhenFocus, qui affiche le bouton uniquement lorsquele 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 choisissantfmDropButtonStylePlain.

Si AutoSize prend la valeur True, le contrôle s’étend automatiquement pours’adapter à la ligne la plus longue, sinon, la liste déroulante est tronquée sur le

Page 464: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

446

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

bord du contrôle. Pour contrôler la largeur de la liste déroulante, servez-vous dela propriété ListWidth. Veillez à prévoir suffisamment de place pour une barre dedéfilement verticale si vous spécifiez une valeur pour ListWidth.

La propriété MatchFound est positionnée sur True lorsque la valeur affichée dansla partie zone de texte du contrôle correspond à l’un des éléments de la liste. Si laproprié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 RefEditLe 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 lafeuille 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 dansla 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 TabStripLe contrôle TabStrip (Onglet) propose une série de conteneurs de contrôlescomme 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 objetTab 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.

Page 465: EXCEL Microsoft Office Excel

Cha

pitr

e 1

9

Création de feuilles UserForm

447

Partie 5 : Manipulation des objets Excel

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é surl’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 égalementchoisir fmTabStyleButtons pour afficher des boutons à la place des onglets. Pourfinir, vous pouvez choisir fmTabStyleNone de sorte qu’aucune information nes’affiche sur le contrôle.

Lorsque la propriété MultiRow est True, ce contrôle accepte plusieurs rangéesd’onglets. La propriété TabOrientation spécifie la position des onglets. Les choixpossibles 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 ongletss’ajuste automatiquement au contenu ; sinon, la valeur indique la taille en pointsde chaque onglet.

Vous exploiterez essentiellement ce contrôle au moment de la conception etpour 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 lecontrô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 écrirezdu 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’interactionavec l’un des contrôles d’un des onglets.

Contrôle MultipageLe contrôle Multipage (Multipage) est similaire au contrôle TabStrip. Il possèdeune 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 sesitue au niveau des propriétés et des méthodes, dont le deuxième possède unebien plus grande collection. En fait, le contrôle Multipage contient la plupart des

Page 466: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

448

Partie 5 : Manipulation des objets Excel

Chapitre 1

9

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.

La propriété TransactionEffect associée à l’objet Page contrôle la représentationvisuelle lors du passage d’une page à une autre. Avec cette propriété, vous pouvezdemander à la nouvelle page de couvrir l’ancienne page horizontalement, verti-calement ou en diagonale ou de « pousser » l’ancienne page vers le haut ou versle 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 quevous 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. Lescontrôles les plus courants sont les contrôles Label, TextBox et CommandButton.Le premier affiche des informations à l’attention de l’utilisateur. Le deuxièmepermet 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 informationsfournies par l’utilisateur.

Page 467: EXCEL Microsoft Office Excel

449

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 programmationMicrosoft 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 lesinformations é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 proposerdes 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’utilisateurde saisir des données dans une feuille de calcul, ainsi qu’une macro qui invoqueun assistant à plusieurs étapes pour créer un graphique basé sur les sélectionseffectuées par un utilisateur.

Récupération de l’informationIl est parfois contraignant de saisir des informations dans une feuille de calcul : ilest difficile de vérifier que les données sont valides, correctement mises en formeet intégrées à l’emplacement approprié. Dans cet exemple, vous apprendrez àconstruire une feuille simple qui accepte les données émanant d’un utilisateur etles stocke dans une feuille de calcul.

Tour d’horizon de l’applicationLa feuille de calcul Excel employée dans cet exemple d’application enregistre sixinformations 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’à ceque l’utilisateur la ferme explicitement. Les boutons contrôlent la ligne de lafeuille 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.

Page 468: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

450

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

Sur le site Le code source complet de cet exemple est publié sur le site webde 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 à cescontenus. Le classeur employé dans ce chapitre se nomme FormApp.xls. Aulieu de saisir manuellement le code de ce chapitre, chargez le fichier qui con-tient également des exemples de données que vous pourrez exploiter dansvos tests.

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 feuilleDans la plupart des feuilles pilotées par les données, on place les champs sur unecolonne et les étiquettes en regard de chaque champ. Cette disposition simplifiela 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 disposerde manière plus intuitive, comme de placer les champs Adresse, Code Postal, etVille 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 encercle, cela ne gêne en rien votre code. Si ce fait peut sembler évident, le concepta marqué le début de la révolution Microsoft Visual Basic.

Page 469: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

451

Partie 5 : Manipulation des objets Excel

Astuce Exploitez ce qui fonctionne

À l’heure de concevoir des feuilles, examinez les différentes fenêtres et boîtesde 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éduresuivante :

1 Démarrez Visual Basic Editor et choisissez Insertion, UserForm. Vouscréez ainsi un objet UserForm dans votre application.

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 yplacer la liste des états. Ajustez éventuellement la taille de la feuille pour yplacer 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 changede forme pour refléter le contrôle sélectionné. Dessinez ensuite le contrôle surla 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 dechaque 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 plusdescriptif (voir figure 20.2).

Page 470: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

452

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 feuillepour 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 lescontrô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 etle déplacer à votre guise au sein de la feuille. Pour déplacer simultanémentplusieurs 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 etNext. 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 parAdd.

7 Positionnez la propriété Enabled des contrôles CommandButton Save etCancel sur False.

8 Une fois tous les contrôles ajoutés, ajustez leurs tailles et positions sur lafeuille pour obtenir une disposition qui vous convient (voir figure 20.3).

Page 471: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

453

Partie 5 : Manipulation des objets Excel

Figure 20-3. Finition de la mise en forme.

Afficher les donnéesMaintenant que la feuille est construite, copions les données depuis la feuille decalcul vers la feuille. La zone de texte RowNumber contient le numéro de la lignequi doit s’afficher sur la feuille. Il faut donc convertir la valeur qui se trouve danscette zone de texte en une valeur que l’on peut utiliser pour extraire les donnéesde la zone de texte avec la méthode Cells.

Le programme suivant exploite la routine GetData, qui se trouve dans le moduleassocié à la feuille. GetData copie les données à partir de la feuille de calcul activevers la feuille. Après avoir déclaré une variable temporaire r qui conserve la ligneen 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 tapern’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

Page 472: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

454

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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

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 lechamp 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 valeursdéjà affichées dans la feuille (rappelez-vous que le contrôle ComboBox ne peutpas prendre pour valeur une chaîne vide et doit être positionné sur une valeurd’é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’onpeut sans risque passer le numéro à la méthode Cells. Vous pouvez ajouter laconstante LastRow au début du module UserForm, comme dans la ligne de codesuivante, pendant que vous testez cette routine (plus loin dans ce chapitre, nousverrons comment déterminer la dernière ligne de données dans une feuille decalcul 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 toujoursdans la plage 2 à LastRow, vous assurant ainsi que la valeur qui se trouve dans rpointe toujours vers une ligne valide de la feuille de calcul.

Page 473: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

455

Partie 5 : Manipulation des objets Excel

Rappelez-vous que nous devons gérer la valeur 1 comme un cas spécial, puisqu’ilest possible que l’utilisateur ait saisi 1 dans la zone de texte RowNumber, commefaisant partie d’un numéro de ligne commençant par 1 tel que 12 ou 123, parexemple. La manière la plus simple de gérer ce problème consiste à vider la feuilleen 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ôlezone de texte. Cette technique garantit que la valeur est correctement formatéedans le champ.

Le même argument s’applique aux données de date de la sixième colonne. Lafonction FormatDateTime assure que les données sont correctement mises enforme. Cette fonction n’est pas indispensable, mais elle permet de se rappelerque 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 etCancel en appelant la routine DisableSave. Ces boutons sont activés uniquementlorsque l’utilisateur modifie une information au sein de la feuille.

Private Sub DisableSave()

CommandButton5.Enabled = FalseCommandButton6.Enabled = False

End Sub

Pour attacher la routine GetData à la feuille, basculez de la fenêtre de code à cellede 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 estplacé 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 appuyezsur la touche F5. Saisissez un numéro de ligne dans le contrôle RowNumber. Vousnoterez que les données de la ligne appropriée s’affichent. Remarquez égalementqu’il est impossible de saisir une valeur erronée sans générer un messaged’erreur.

Page 474: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

456

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

Parcourir la feuille de calculSi vous cliquez sur l’un des quatre boutons de navigation, la valeur de la zone detexte RowNumber s’ajuste automatiquement. Ensuite, dans la mesure où lavaleur de RowNumber a changé, l’événement RowNumber_Change se déclencheet la ligne affichée est mise à jour.

Chacun des quatre boutons représente une situation légèrement différente. Lecode 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-Number, la manière la plus simple d’éditer le code de l’événement approprié estde 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 lecomplé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 vouspermettre 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 valeurde la ligne précédente et de la ligne suivante en fonction de la valeur de la ligne encours. À l’instar de la routine GetData, celle du prochain listing commence parvé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 nouvelleposition en soustrayant 1 (ou en ajoutant 1 pour trouver la ligne suivante). Pourfinir, si le numéro de ligne résultant se trouve dans la plage 2 à LastRow–1, lavaleur est enregistrée dans la zone de texte RowNumber. L’affectation déclenche

Page 475: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

457

Partie 5 : Manipulation des objets Excel

l’événement Change du contrôle RowNumber et la nouvelle information estchargée.

Passer à la dernière ligne est un peu plus difficile. En effet, le concept de dernièreligne est assez trouble. Après tout, ce n’est pas parce qu’une feuille de calcul estcapable de gérer 65 536 lignes de données qu’un utilisateur de cette applicationsouhaite afficher autant de lignes. Il est préférable d’examiner la feuille de calculpour découvrir la dernière ligne contenant une valeur dans la première colonneet la traiter en tant que dernière ligne.

Pour rendre la dernière ligne dynamique, vous devez modifier un peu le pro-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 pourrécupérer les valeurs initiales dans la feuille. Servez-vous du code suivant pourcré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 ligneen 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 unecolonne 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 laroutine du prochain listing. Cette routine se trouve dans le module UserForm :

Private Function FindLastRow()

Dim r As Long

r = 2Do While r < 65536 And Len(Cells(r, 1).Text) > 0 r = r + 1 Loop

FindLastRow = r

End Function

Page 476: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

458

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 valeurretournée est testée pour vérifier si elle est égale à zéro. Si tel est le cas, la boucles’arrête et r pointe vers la dernière ligne de la feuille de calcul, autrement dit lapremiè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.

LastRow = FindLastRow

La fonction FindLastRow peut également servir dans l’événement associé aubouton Last pour actualiser la variable LastRow ainsi que la valeur du contrôleRowNumber.

Private Sub CommandButton4_Click()

LastRow = FindLastRow - 1RowNumber.Text = FormatNumber(LastRow, 0)

End Sub

Modifier les donnéesPour l’instant, vous pouvez afficher toutes les lignes de données de la feuille decalcul, mais les changements apportés aux données dans la feuille UserForm nesont pas enregistrés dans la feuille de calcul. Les techniques pour y parvenir sontnombreuses. En voici toutefois une qui devrait fonctionner parfaitement.

Dans cette approche, les données affichées sur la feuille sont séparées des cellulesde 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 changementsapportés dans la feuille par l’utilisateur. Les boutons Save et Cancel doivent êtredé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 dechamps 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ésactiverles boutons de commande associés aux boutons Save et Cancel. Ensuite, dansl’é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.

Page 477: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

459

Partie 5 : Manipulation des objets Excel

Si on charge les données directement à partir de la source, elles sont considéréescomme « propres ». En conséquence, les boutons Save et Cancel doivent appelerla 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érode 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 leprochain 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 sontcomprises. La principale différence entre les deux routines est que GetData copieles 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 lecas 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 detexte RowNumber sans retrouver aucune donnée.

Remarquez qu’après l’enregistrement des données dans la feuille de calcul, onappelle la routine DisableSave. En effet, les données de la feuille sont à présent lesmême que celles stockées dans la feuille de calcul.

Page 478: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

460

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

Ajouter des donnéesUn 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ù lavariable LastRow pointe vers cette ligne, il suffit de positionner la propriété Textdu contrôle RowNumber sur cette valeur en se servant du code suivant :

Private Sub CommandButton7_Click()

RowNumber.Text = FormatNumber(LastRow, 0)

End Sub

Valider les donnéesÀ présent, la feuille est entièrement capable de récupérer des données émanantde 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 resteencore à 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 existeplusieurs techniques permettant de vérifier que les données saisies sont validesavant qu’elles n’atteignent la feuille de calcul.

La première solution implique l’utilisation de l’événement KeyPress pour vérifierque l’utilisateur peut uniquement saisir un type particulier d’information. Parexemple, vous pouvez obliger l’utilisateur à saisir uniquement des nombres dansle 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, vousaffichez automatiquement l’événement CustomerId_Change. Si l’événementn’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érieuredroite de la fenêtre de code : Visual Basic Editor crée automatiquement unévénement vide accompagné des paramètres appropriés.

Page 479: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

461

Partie 5 : Manipulation des objets Excel

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 ducontrôle pour informer visuellement l’utilisateur de l’erreur dans l’événementExit associé au contrôle. Vous pouvez également afficher une boîte de messagecontenant 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& 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 sonargument 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 surFond de la fenêtre (&H8000000F) en cas d’erreur pour réinitialiser toutes lesconditions 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 pourState. L’utilisateur étant limité aux choix de la liste, il devient impossible de saisirdes données non valides.

On a défini la propriété MatchRequired du contrôle ComboxBox sur True pourempêcher l’utilisateur de quitter le contrôle si l’entrée ne correspond pas à l’unedes valeurs de List. Pour s’assurer qu’une valeur correcte est sélectionnée, onpeut également positionner la propriété Style de la zone de liste modifiable surfmStyleDropDownList, qui oblige le contrôle à fonctionner comme une zone deliste, dans laquelle l’utilisateur peut uniquement choisir une valeur dans la listede 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 initialiserla zone de liste modifiable. Cette routine est appelée par l’événement Initialize dela feuille UserForm.

Sur le site Vous trouverez la liste complète des états dans la routine AddStates de l’exemple de programme.

Private Sub AddStates()

State.AddItem "AK"State.AddItem "AL"

Page 480: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

462

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 UserFormPour la dernière étape de ce processus, nous devons créer une macro simple quiaffiche la feuille UserForm. Pour notre exemple, il suffit d’ajouter la sous-routinesuivante à 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 trouveen dessous. S’il est important d’autoriser l’accès à la feuille de calcul, remplacezla valeur vbModal par la valeur vbModeless. L’utilisateur pourra basculer entre lafeuille 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.

Page 481: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

463

Partie 5 : Manipulation des objets Excel

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 etque 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 étapesL’autre exemple de ce chapitre explique comment concevoir un assistant en plu-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’applicationL’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 (voirfigure 20.5) propose à l’utilisateur de choisir entre quatre options matérialiséespar des contrôles OptionButton imbriqués dans un contrôle Frame. Remarquezque 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 detexte (voir figure 20.6), également intégrées dans un contrôle Frame qui permetdes fournir des informations à l’utilisateur.

Page 482: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

464

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 aeffectués dans les précédentes étapes (voir figure 20.7). Le bouton Next estdé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 webde 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 menusLa première étape de la construction de cette application consiste à intercepterl’événement Open du classeur pour ajouter le bouton de menu nécessaire. Celasignifie également que l’événement BeforeClose doit supprimer le bouton demenu.

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 lacollection Application.CommandBars. Une fois qu’on a trouvé la barre de com-

Page 483: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

465

Partie 5 : Manipulation des objets Excel

mandes appropriée, on localise le contrôle contextuel du menu Outils. Pourfinir, on ajoute un nouveau bouton de commande à la fin du contrôle contextuel.

Private Sub Workbook_Open()

Dim c As CommandBarDim cb As CommandBarButtonDim cp As CommandBarPopup

On Error Resume NextSet c = Application.CommandBars("Worksheet Menu Bar")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 secontente alors d’afficher la feuille UserForm de l’assistant à l’aide d’une ligne decode.

Public Sub RunWizard

UserForm1.Show vbModal

End Sub

Remarquez que la propriété Tag de la routine Workbook_Open est positionnéesur 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 CommandBarDim cb As CommandBarButton

On Error Resume NextSet 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)

Page 484: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

466

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

Loop End If

End Sub

Le code de l’événement Workbook_BeforeClose est probablement plus complexeque 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 2k3Wizard App dans la propriété Tag avec la méthode FindControl. Il entre ensuitedans une boucle While qui supprime ce contrôle et recherche le prochain con-trôle possédant la même valeur Tag.

Construire la feuille UserFormPuisque l’assistant présente plusieurs feuilles d’informations, il est natureld’employer un contrôle Multipage. Celui-ci possède plusieurs propriétés qui enfont l’outil idéal dans cette situation. Pour commencer, le contrôle Multipagecontient un certain nombre d’objets Page.

Pour plus d’informations sur le contrôle Multipage et les objets Page, reportez-vous auchapitre 19 « Création de feuilles UserForm ».

Chaque objet Page est un conteneur de contrôles, ce qui signifie que vous pouvezplacer 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 sacapacité à 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 quatrecontrôles CommandButton dans la partie inférieure de la feuille. Ces contrôles setrouvant en-dehors du contrôle Multipage, ils apparaissent à chaque étape del’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 menucontextuel. Vous ajoutez ainsi un nouvel objet Page au contrôle Multipage (voirfigure 20.8). Remplacez ensuite la propriété Caption des pages par Step 1, Step 2et Step 3.

Page 485: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

467

Partie 5 : Manipulation des objets Excel

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 pagesLes 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 boutonCancel, 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 etNext, l’assistant avance ou recule d’une étape. Le bouton Finish représente laseule 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ôlede 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. Sile numéro de la nouvelle page est supérieur ou égal à zéro, on assigne le numérode 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

Page 486: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

468

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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é Valuedu contrôle Multipage et vérifie qu’elle est inférieure à MultiPage1.Pages.Count.

Private Sub CommandButton3_Click()

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’unedes étapes de l’assistant en cliquant sur les onglets dans la partie supérieure ducontrôle Multipage. Pour masquer ces onglets, positionnez la propriété Style ducontrô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’unede ses propriétés, sélectionnez-le dans la liste déroulante des contrôles qui setrouve 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énementChange du contrôle se déclenche. L’événement MultiPage1_Change, qui setrouve 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

Page 487: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

469

Partie 5 : Manipulation des objets Excel

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 Nextest activé et la propriété Caption de la feuille est mise à jour pour indiquer qu’ils’agit de la première étape de l’assistant. Le bouton Prev est désactivé puisqu’il estimpossible de revenir avant la première étape. Si l’utilisateur souhaite arrêterl’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, puisquel’utilisateur peut opter pour l’un ou l’autre choix. La propriété Caption de lafeuille est également mise à jour.

Sur la dernière page (Value = 2), on désactive le bouton Next, puisqu’il s’agit dela dernière étape. Contrairement aux autres étapes de l’assistant, une ligne decode 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 del’assistant, une boîte de message s’affiche pour signaler une erreur. En théorie, cemessage 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’assistantMaintenant que la structure d’exécution de l’assistant est en place, il est temps devous montrer comment collecter des informations émanant de l’utilisateur. Cesprocédures montrent quelques-unes des méthodes à votre disposition. Vousdevez déterminer le type d’informations que l’assistant doit collecter pour luiassigner sa tâche.

Dans la première étape de l’assistant, un contrôle Frame encadre un jeu de quatrecontrôles OptionButton (voir figure 20.9). L’utilisateur peut ainsi choisir l’unedes quatre options sans programmation.

Page 488: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

470

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 uneapparence cohérente par rapport à l’étape 1. Dans le cadre, deux contrôles Labelet TextBox permettent de capturer d’autres informations (voir figure 20.10). Leszones de texte sont intitulées Header et Footer en correspondance avec les légen-des des intitulés placés en regard.

Page 489: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

471

Partie 5 : Manipulation des objets Excel

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 Framesert 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 zoneindique à l’utilisateur que les données de la zone de texte ne peuvent pas êtremodifiées.

Page 490: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

472

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

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 texteFinal Review, on a utilisé l’événement Review_KeyPress pour supprimer toutcaractère saisi. Le fait de positionner l’argument KeyAscii sur zéro signifie quetout 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 optionsLa routine GenerateOptions (présentée dans le prochain listing) combine lesinformations 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-vousque cette routine accède aux contrôles placés sur les autres pages du contrôleMultipage 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 ThenReview.Text = Review.Text & "Option 2 was selected"

Page 491: EXCEL Microsoft Office Excel

Cha

pitr

e 2

0

Création de feuilles UserForm avancées

473

Partie 5 : Manipulation des objets Excel

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

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 sontcopiées dans la zone de texte. Remarquez qu’on a joint la constante vbCrLf à lapropriété Text après la génération de chaque ligne d’informations. On obligeainsi la ligne suivante à s’afficher en commençant sur le bord gauche du contrôle.

Exécuter l’assistantL’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 à terminerle programme. Dans un cas réel, on remplace l’instruction MsgBox par unappel à une sous-routine qui récupère les informations collectées pendant lesdiffé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érentscontrô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, nousvous conseillons d’attribuer à chaque contrôle de l’assistant une valeur pardéfaut significative de sorte que si l’utilisateur clique sur le bouton Finish, leré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 ’util isateur n’a pas fourni suffisamment

Page 492: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

474

Partie 5 : Manipulation des objets Excel

Chapitre 2

0

d’informations à l’assistant pour produire un résultat intéressant, votre routinede vérification devrait afficher l’étape de l’assistant à laquelle l’utilisateur peutfournir ces informations.

Dans ce chapitre, vous avez vu comment construire deux applications différentesbasé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 modifierles 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 etcorrectement formatées. Dans la deuxième application, nous avons construit unassistant à 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.

Page 493: EXCEL Microsoft Office Excel

475

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

Page 494: EXCEL Microsoft Office Excel
Page 495: EXCEL Microsoft Office Excel

477

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 application . . . . . . . . . . . . . . . . . 477Activation d’une autre application . . . . . . . . . . . . . . . . . 481

Liaisons . . . . . . . . . . . . . . . . . . . 481Interaction avec d’autres applications Office. . . . . . . . . . . 487Conjugaison des talents . . . . . . 497

Au début de l’informatique personnelle, la communication entre les différentesapplications é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’apanagede 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 aussisimple qu’une opération de glisser-déposer.

Les applications Microsoft Office—Excel, Word, PowerPoint, Outlook etAccess—utilisent toutes le même langage Visual Basic pour Applications (VBA).Une fois que vous avez compris la syntaxe VBA dans Excel, vous connaissez cellede toutes les autres applications. La différence se situe au niveau de chaquemodèle d’objet.

Le langage VBA commun présente un avantage majeur : toutes les applicationsOffice peuvent exposer leurs objets les unes aux autres et vous pouvez program-mer une interaction entre toutes les applications à partir de n’importe laquelled’entre elles. Pour exploiter les objets Word à partir d’Excel, par exemple, il suffitd’é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 autreapplication à partir d’Excel. Vous étudierez également comment interagir avecles autres fichiers Office, comme utiliser des liaisons dynamiques et des liaisonsstatiques, ouvrir un document dans Word, accéder à un document Word actif etcréer un nouveau document Word. Pour clore ce chapitre, vous verrez commentcontrôler Excel à partir des autres applications Office.

Démarrage d’une autre applicationVous devrez parfois démarrer une autre application à partir d’Excel. Plus loindans ce chapitre, nous verrons comment interagir avec les autres applicationsOffice, mais pour l’instant, nous allons nous concentrer sur l’ouverture d’uneapplication qui ne fait pas partie du domaine des applications Office.

Page 496: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

478

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Il existe de nombreuses raisons pour lesquelles on peut interagir avec une autreapplication : utiliser la Calculatrice, la Table des caractères ou un fichier batchDOS, par exemple. En fait, vous pouvez exécuter une application du Panneau deconfiguration, 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 IfEnd 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 del’application : réduite, agrandie, masquée ou normale. Si la fonction génère uneerreur, l’instruction OnError affiche un message indiquant que le fichier estintrouvable.

Remarque Rappelez-vous que si du code suit la fonction Shell, celui-ci estimmé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 autreapplication 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 dialogueExécuter ou directement dans une fenêtre DOS. Cette commande est disponibledans 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écessitepas 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’applicationet le fichier. Vous devez saisir le chemin d’accès complet du fichier ainsi que sonextension pour exécuter cette commande correctement. La figure 21.1 donne unexemple de la manière d’ouvrir le fichier Fall Initiative.ppt avec la commandeStart.

Figure 21-1. Servez-vous de la commande Start dans la boîte de dialogue Exécuter pour ouvrir un fichier de présentation.

Page 497: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

479

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Vous pouvez obtenir le même résultat en utilisant la commande Start dans ducode VBA. Par exemple, un commercial de la société Garden Supply Companypeut lancer PowerPoint et ouvrir un fichier de présentation Marketing à partird’Excel. Examinez le code qui suit pour voir comment y parvenir.

Remarque L’exemple suivant fonctionne si votre système d’exploitation estantérieur à Microsoft Windows NT. Si vous exploitez Microsoft Windows NT ouune version ultérieure, servez-vous de la fonction ShellExecute pour parvenirau même résultat. La fonction ShellExecute est expliquée dans le prochainexemple. Bien que vous deviez disposer de Microsoft Windows 2000 ouWindows XP (ou version ultérieure) pour exécuter Excel 2003, cette procédurefonctionne si vous exécutez le code Excel 2003 dans une ancienne versiond’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 " & FilenameEnd Sub

Astuce Automatiser les courriels

Pour envoyer un courrier avec du code VBA, la commande Start permet dedémarrer le message. Utilisez Shell "Start [email protected]”pour démarrer le client de messagerie par défaut. Si vous exploitezWindows NT ou une version ultérieure, remplacez la commande Shell par lafonction ShellExecute.

La commande Start n’étant pas disponible dans Windows NT et les systèmesd’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 ShellExecutepour 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

Page 498: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

480

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Au QuotidienSimuler une pause dans le code VBA

Il arrive que l’on doive lancer une application, mais qu’il faille mettre le codeVBA 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 pouvezgé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

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.

Page 499: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

481

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Activation d’une autre applicationVous 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 ouvrezune 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 aulieu d’en créer une nouvelle instance.

Prenons l’exemple suivant, dans lequel la procédure ActivateCalculator utiliserl’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 labarre de titre de l’application. Si l’instruction AppActivate génère une erreur, celasignifie 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" If Err <> 0 Then CalcTaskID = Shell(AppFile, vbNormalFocus) If Err = 0 Then MsgBox _ "Impossible de démarrer la Calculatrice" End IfEnd Sub

LiaisonsVous pouvez écrire une macro pour contrôler le composant le plus important deMicrosoft Word, son serveur Automation. Dans une telle macro, Excel agitcomme l’application cliente et Word se comporte comme serveur d’application.Il est également possible d’écrire une application VBA pour contrôler Excel. Leprocessus 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ôlerdes 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 ajouterdivers objets dans le classeur. Vous pouvez également faire appel à Excel VBApour créer le même type d’objets. Lorsque vous créez l’objet, vous disposez d’unaccè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 dumenu Insertion. Une fois l’objet incorporé, l’utilisateur doit savoir commentexploiter l’application de l’objet Automation. Cependant, si vous vous servez deVBA pour manipuler l’objet, vous pouvez le programmer de sorte que l’utilisa-

Page 500: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

482

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

teur puisse l’exploiter en cliquant dessus.

Avant de travailler avec l’objet externe, vous devez en créer une instance. Pour cefaire, 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 lecode réel qui met en œuvre la fonction.

Liaison dynamiqueDans une liaison dynamique, le processus de mise en correspondance entre lavariable 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 seproduit à la compilation de l’application.

Avec une liaison dynamique, il est inutile de déclarer les variables objet généralespuisque la bibliothèque d’objets appartenant à l’application extérieure n’est pasactivée. Les objets extérieurs sont plus complexes à programmer puisque leurspropriétés, méthodes et événements n’apparaissent pas automatiquement pen-dant la programmation de la procédure relative à ces objets. Cependant, uneliaison dynamique permet de créer un objet Application quelle que soit la versioninstallée sur le système de l’utilisateur. Cette méthode de liaison est préférables sile fichier doit être distribué à des utilisateurs équipés de versions différentes d’unlogiciel : 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 instancede l’application, on se sert de la fonction GetObject. On déclare ensuite l’objetcomme type Object générique et on résout sa référence d’objet au moment del’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

Page 501: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

483

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Set oDoc = Nothing Set oApp = NothingEnd 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 .Save End With olApp.Quit Set olApp = NothingEnd 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 variableobjet est olApp. On utilise ensuite la variable olApp pour référencer des objet dumodè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 objetAppointmentItem.

Dans la mesure où les constantes d’Outlook ne sont pas disponibles si on se sertd’une liaison dynamique, nous devons définir nos propres constantes, commeolAppointmentItem dans notre exemple, ou remplacer la valeur de la constantecomme 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 objetcréé.

Lorsqu’on déclare olApp et olAppointment en tant que types Object génériques, laliaison 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 classede 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 desobjets WorkSheet ou Chart à partir des autres applications en utilisantExcel.WorkSheet ou Excel.Chart comme paramètre d’entrée de la fonction Crea-teObject.

Page 502: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

484

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Astuce Économisez votre mémoire

Il est de bonne pratique en matière de programmation de fermer l’applicationexterne lorsque vous avez terminé de l’exploiter et de positionner la variableobjet sur Nothing. Vous libérez ainsi la mémoire employée par la liaison etl’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éerdans le Calendrier le 7 mars 2005.

Figure 21-2. Le Calendrier Outlook avec le nouveau rendez-vous affiché.

Liaison statiqueDans 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 performancepar rapport à la liaison dynamique. Vous ajoutez une bibliothèque d’objets par lebiais de la commande Références du menu Outils dans Visual Basic Editor etvous pouvez alors déclarer les variables de l’objet spécifique. Cette méthode deprogrammation des objets extérieurs est plus simple puisque Visual Basic Editoraffiche 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èqued’objets Microsoft Outlook 11.0 Object Library.

Page 503: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

485

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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èqued’objets Outlook sélectionnée.

Figure 21-3. La boîte de dialogue Références présente toutes les références 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 disposezde 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 enbas dans l’ordre de tri de la boîte de dialogue Références. Si le même type d’objetest présent dans plusieurs bibliothèques, VBA se sert du premier rencontré. Vouspouvez sélectionner une bibliothèque et cliquer sur les boutons Priorité pour ladéplacer vers le haut ou le bas de la liste et modifier ainsi l’ordre de recherche. Ilest toutefois inutile de dépendre de la priorité : vous pouvez référencer l’objetavec 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 uneliaison statique. La procédure liste tous les noms du dossier Contacts d’Outlooket les place dans la colonne A de la feuille de calcul active. Veillez à ajouter uneré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

Page 504: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

486

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Next

olApp.Quit Set olApp = NothingEnd Sub

Pendant l’exécution de ce code, un avertissement similaire à celui de lafigure 21.4 s’affiche. La sécurité contre les virus a énormément augmenté depuisla dernière version d’Office XP. La tendance continue avec la versiond’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.

Figure 21-4. Le message d’avertissement qui s’affiche lorsque vous exécutez du code qui interroge votre dossier Contacts dans Outlook.

Au QuotidienLiaison statique versus liaison dynamique

Les liaisons statiques et les liaisons dynamiques possèdent chacune desavantages et des inconvénients. Les liaisons dynamiques sont plus lentes queles 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 certainsavantages : 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 neliste pas les objets de l’application que vous programmez et les constantesinté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 lesliaisons 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 choisissezla 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 departager la procédure, la liste est spécialement codée dans la version du logi-ciel installé sur le système.

Page 505: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

487

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

La morale de l’histoire est la suivante : écrivez votre code avec des liaisonsstatiques, mais avant de distribuer le fichier, modifiez le code et utilisez desliaisons dynamiques. Il peut également être intéressant de modifier vos pro-jets personnels pour y incorporer des liaisons dynamiques. Ainsi, vous neserez pas confronté à un problème lors d’une mise à jour ultérieure de votrelogiciel.

Dans la procédure DisplayOutlookContactNamesEarlyBinding, nous avonsdéclaré olApp comme type Outlook.Application. Les autres instructions Dimdéclarent également les variables objet du type demandé pour atteindre lesobjectifs. Si le même nom d’objet se trouve dans plusieurs bibliothèquesd’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 autilisé le mot-clé New pour assigner une référence à Outlook.Application à olApppour créer une nouvelle instance d’Outlook.

La procédure est contrainte d’employer les liaisons statiques, puisque les typesvariables ont été déclarés. Nous aurions pu utiliser la fonction CreateObject pourcréer la variable objet olApp, à la place du mot-clé New, sans affecter la liaisonstatique. Mais l’utilisation du mot-clé New est plus efficace.

Interaction avec d’autres applications OfficeL’utilisation de VBA pour accéder aux applications Microsoft Office revient à seservir 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 Applicationqui 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 fonctionGetObject 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 uneautre 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 commentcré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’applicationMicrosoft 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èqued’objets Microsoft Word dans l’application Excel. Pour ce faire, dans le menuOutils de Visual Basic Editor, choisissez la commande Références.

Sub CreateNewWorkbookFromExcel() Dim xlNew As Excel.Workbook

Page 506: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

488

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Set xlNew = Workbooks.Add ActiveCell.Value = "Créé le " & DateEnd 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 = NothingEnd 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. Unefois l’objet Application référencé, on ajoute des références supplémentaires auxobjets 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’objetApplication existe. Les objets dépendant des objets Application sont souventappelés objets enfants. Ces derniers peuvent à leur tour posséder des objetsenfants. Par exemple, l’objet Excel Workbook est l’enfant de l’objet Applicationd’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 niveausupérieur à certains objets enfants des objets Application. Sachant cela, nouspouvons réécrire le code de la procédure CreateWordDocumentFromExcel pourdé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 = NothingEnd Sub

Page 507: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

489

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 declasse Excel.Sheet pour créer le classeur ou du nom de classe Excel.Chart pourcréer un classeur contenant une feuille de calcul avec un objet Chart incorporé etune 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 lesnoms 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 quicontient une seule feuille de calcul :

Dim wbkSheet As Excel.WorkbookSet wbkSheet = CreateObject("Excel.Sheet")

Pour automatiser le démarrage d’Excel avec un objet Workbook qui contient unefeuille de calcul avec un graphique et une autre feuille de calcul, servez-vous ducode suivant :

Dim wbkChart As Excel.WorkbookSet wbkChart = CreateObject("Excel.Chart")

Quand on automatise Excel à partir d’un objet Workbook ou Word à partir d’unobjet Document, une référence implicite à l’objet Application se crée. Si vousdevez 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 utilisantcomme 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érentque lorsque vous référencez l’objet Application. Le tableau 21.1 liste tous lesobjets Office de niveau supérieur que l’on peut référencer ainsi que leurs nomsde 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

Page 508: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

490

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Ouvrir un document dans WordPour ouvrir directement un fichier créé à partir d’une autre application Officeque 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émarreensuite une nouvelle instance de Word, ouvre un document Word existant etcolle la plage à la fin du document. Ce code se sert d’une liaison statique, veillezdonc à 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 calculet son nom de fichier par une référence à un objet de votre ordinateur. Si vousréférencez des fichiers qui n’existent pas, une erreur se produit au moment detester cette procédure.

Sub CopyFromExcelToWord() 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 = NothingEnd Sub

Astuce Déboguer avec les objets Application masqués

Lorsqu’une procédure contient des applications qui ne sont pas visibles, vousrisquez de rencontrer des problèmes de mémoire à l’heure de déboguer lecode. Lorsqu’une procédure ouvre une copie masquée d’une application etque le code s’arrête avant l’exécution de la méthode Quit, une instance del’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 avantl’exécution de la méthode Quit, une copie supplémentaire de l’application estplacée en mémoire. Cela peut engendrer de sérieuses erreurs de mémoire survotre système. En conséquence, obligez toujours l’application masquée à sefermer en vous servant du Gestionnaire des tâches.

Page 509: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

491

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Le mot-clé New crée une nouvelle instance de Word, même si l’application estdéjà ouverte. La méthode Open de la collection Documents sert à ouvrir unfichier existant. Le code sélectionne ensuite la fin du document, crée un nouveauparagraphe vide et colle la plage. Le document est alors enregistré et la nouvelleinstance 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 dela société Garden Supply Company contient le calendrier des promotions de lasocié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 unnouveau classeur Excel :

Sub CopyWordToExcel()Dim wrdApp As Word.ApplicationDim wrdDoc As Word.DocumentDim tString As StringDim tRange As Word.RangeDim i As LongDim 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 = TrueEnd Sub

Page 510: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

492

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

Au QuotidienGetObject 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 uneinstance 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 dansun 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écutionou pour démarrer une application tout en chargeant un fichier. L’exemple sui-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 actifMaintenant que vous savez ouvrir une application Office, comment faire poursimplement 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 etd’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 copierun 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

Page 511: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

493

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Set wdApp = NothingEnd Sub

La fonction GetObject possède deux paramètres d’entrée optionnels. Le premierparamè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 coursde 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 encours de Word qui se trouve en mémoire. Mais en l’absence d’une instance deWord 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 lamé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. Pouroptimiser les performances, il est préférable d’utiliser une instance ouverted’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 WithEnd Sub

Créer un nouveau document WordPour 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 nouveaudocument.

Page 512: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

494

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

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

With wdApp.Selection .EndKey unit:=wdStory .TypeParagraph .Paste End With

Set wdApp = NothingEnd Sub

En l’absence d’une instance de Word en cours d’exécution, la fonction GetObjectsans le premier argument provoque une erreur d’exécution. La ligne On ErrorResume Next permet au code de continuer et se sert de la valeur de la variablewdApp pour déterminer si une nouvelle instance de l’application doit êtreouverte. Si l’application Word n’est pas chargée en mémoire, la code utilise lafonction GetObject avec une chaîne d’une longueur de zéro comme premierargument, ce qui ouvre une nouvelle instance de Word. Une fois l’instance deWord 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, danslesquels 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 ladate de création du fichier, ferme la fenêtre du programme et enregistre le fichiersous le nom NewWordDoc.doc.

Sub CreateNewWordDoc() Dim wrdApp As Word.Application

Page 513: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

495

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 = NothingEnd Sub

Contrôler Excel à partir d’autres applications OfficePour 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 Excelcomme le décrit le tableau 21.2.

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 devezajouter la référence Excel, saisir la procédure dans Word et créer un nouveauclasseur dans le répertoire racine du lecteur C: intitulé NewExcelWbd.xls.

Sub OpenWriteExcelWbkContents()

Dim xlApp As Excel.ApplicationDim xlWbk As Excel.WorkbookDim 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 <> ""

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

Page 514: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

496

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

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 = NothingEnd Sub

L’exemple précédent crée un classeur Excel basique. Maintenant que vous savezcréé 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.

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 laprocédure. La procédure référence un nom de fichier Projection.xls ; si vousoptez pour un nom de fichier différent, modifiez le code pour refléter le nomque 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é parla valeur pctChange. Ces valeurs ne sont pas enregistrées dans le classeurExcel avant qu’il soit fermé. On a également assigné le nom Données à laplage 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.

Page 515: EXCEL Microsoft Office Excel

Cha

pitr

e 2

1

Excel et les autres applications Office

497

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

La procédure CreateExcelChart demande deux valeurs à l’utilisateur et les insèredans la feuille de calcul. Une fois les données saisies dans la feuille de calcul, legraphique 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 .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 = NothingEnd Sub

Conjugaison des talentsExcel ne suffira pas toujours à gérer vos projets. C’est la principale raison pourlaquelle 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 suiteMicrosoft 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 nouvelobjet Application avec une liaison dynamique, mais nous vous recommandonsd’utiliser les liaisons statiques lorsque vous programmez vos procédures.

Pour automatiser les objets d’une autre application, vous créez une variableobjet 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

Page 516: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

498

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

1

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 cibleet 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 Objectgénérique, VBA se sert des liaisons dynamiques.

Les liaisons statiques produisent un code qui s’exécute plus rapidement que lesliaisons 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 lasyntaxe et de la saisie s’effectuent également pendant le codage, ce qui réduit lerisque 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 ouCreateObject 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 ouverted’une autre application au moment de l’exécution, vous pouvez exploiterGetObject avec une liaison statique.

Les techniques présentées dans ce chapitre permettent de créer des programmespuissants qui tirent avantages des capacités des différents produits. L’utilisateurnavigue dans un environnement familier comme Excel, alors que le codeexploite tout produit disposant d’une bibliothèque de types et expose ses objetsà VBA.

Page 517: EXCEL Microsoft Office Excel

499

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 22

Excel et SQLComparaison des tableurs et des bases de données . . . . . . 499Manipulation des bases de données avec SQL. . . . . . . . . 503L’instruction Select. . . . . . . . . . . 504

L’instruction Insert. . . . . . . . . . . 510L’instruction Update . . . . . . . . . 511L’instruction Delete . . . . . . . . . . 512

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 basesde données. Vous pouvez copier des informations issues d’une table de base dedonné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 ouMicrosoft SQL Server avec une feuille UserForm.

Ce chapitre constitue une brève introduction à l’utilisation des bases de donnéescomme 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 parleronspas. Il existe un certain nombre d’excellents ouvrages traitant de MicrosoftVisual Basic et de la programmation des bases de données. Dans le contexte de laprogrammation 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 pourVisual 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 lesmê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 Excelet 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 decolonnes, 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.

Page 518: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

500

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

Concepts essentiels des bases de donnéesUne base de données relationnelle se compose d’une série de tables. Chaque tablecorrespond à une feuille de calcul. Une table est structurée en séries de lignes etde 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 comportepas de numéros de ligne et les colonnes ne portent pas de noms arbitraires, telsque A, B ou C. Au lieu de cela, les tables se basent sur la théorie des jeux, ce quisignifie 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é commeune table virtuelle ou une vue. Les tables employées pour créer une vue sont ditestables de base. On peut créer une vue à partir d’une ou de plusieurs tables oud’autres vues de la base de données. De nombreuses opérations effectuées surune 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 diverstypes 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 colonnedans une ligne particulière peut contenir une valeur Null, ce qui signifiequ’aucune valeur n’a été assignée à la colonne. Remarquez qu’une chaîne vide etune valeur Null sont deux choses différentes : une chaîne vide est une chaînecontenant zéro caractère, alors que Null signifie simplement que la colonne nepossède pas de valeur.

Remarque Il est possible de créer des tables dans lesquelles les valeurs Nullne sont pas acceptables dans une ou plusieurs colonnes. Reportez-vous à ladocument de votre base de données pour plus d’informations sur la gestiondes valeurs Null.

Page 519: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

501

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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, uneautre 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 desdonnées et d’actualiser des informations stockées dans les tables.

Au QuotidienConception et administration de bases de données

La conception et l’exploitation des bases de données représentent des tâchescomplexes. 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 sielles exploitent des bases de données haute performance comme MicrosoftSQL Server, Oracle ou DB2. Si vous n’êtes pas sûr que ces bases de donnéesfonctionnent au sein de votre organisation, adressez-vous à l’administrateurdes bases de données. Il devrait être capable de répondre à de nombreusesquestions relatives à votre environnement spécifique.

Si votre entreprise exploite un système de base de données simple, commeAccess, elle n’emploie pas nécessairement d’administrateur des bases dedonné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 unebase de données à partir d’Excel.

Pour créer votre propre base de données, restez simple. Si vous ne disposezque d’une centaine de données, servez-vous de quelques feuilles de calculExcel. Elles seront plus simples à maintenir que de construire une base dedonnées réelle.

Si vous pensez qu’une base de données est indispensable, prenez le tempsde lire quelques livres sur le sujet comme Microsoft Office Access Inside Outde John L. Viescas (Microsoft Press, 2003). Rappelez-vous qu’il est facile deconcevoir une base de données assez complexe pour qu’elle ne réponde plusà vos besoins d’origine.

Clés de base de donnéesUne clé de base de données permet d’identifier un jeu de lignes dans une table. Laclé primaire d’une table identifie de manière unique une ligne particulière de latable. 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 plusieurscolonnes. Autrement dit, la combinaison de NumCommande et NumArticle

Page 520: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

502

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

identifie de manière unique un article particulier acheté dans le cadre d’unecommande.

Une clé secondaire est différente d’une clé primaire en ce qu’il n’est pas nécessairequ’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 lesclients 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 uneautre table. Les clés externes identifient un groupe de données connexes commeune collection de commandes passées par un client particulier ou le nombred’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 auxbases de données. Les concepteurs exploitent les clés pour créer des indexdans les tables, ce qui accélère significativement l’accès à un jeu de lignesparticulier. Lorsque c’est possible, utilisez les index dans les critères de vosrecherches au sein d’une base de données.

Certaines bases de données, y compris Microsoft Access, permettent de définirune colonne d’identification. Une colonne d’identification (également appeléeNuméroAuto dans Access) génère automatiquement une nouvelle valeurlorsqu’on insère une ligne dans la table. Ce type de colonne est extrêmementutile en tant que clé primaire d’une table. En effet, la base de données garantitque la valeur est unique.

Accéder aux bases de données à partir d’ExcelLes 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 estséparé du programme de boîte de dialogue qui y accède. Un programme de basede données exploite une API (Application Programming Interface) particulière,qui communique avec le serveur de bases de données.

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

ClientServeur

Page 521: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

503

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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

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 SQLSQL propose une riche collection d’instructions permettant de manipuler lesdonnées dans une base de données relationnelle. Dans la pratique, la plupart deces instructions s’appliquent à la création ou à la modification des tables oud’autres objets stockés dans la base de données. En fait, le programmeur moyenne doit réellement comprendre que quatre instructions principales pour écriredes programmes de base de données.

● L’instruction Select spécifie les lignes de données à retrouver dans la basede données.

● L’instruction Delete spécifie les lignes de données à supprimer de la base dedonnées.

● L’instruction Insert spécifie les lignes de données à ajouter à la base de don-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, PaysFrom ClientsWhere 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 deretourner chaque ligne de la table, seules celles dont la colonne Pays contient lachaîne ‘DE’ sont retournées. Les autres instructions sont aussi simples à utiliser.Les instructions possèdent un certain nombre de clauses communes, ce quisignifie que si l’on sait employer l’une des instructions, il est assez simpled’apprendre à utiliser les autres.

Page 522: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

504

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

Remarque Bien que le langage SQL soit un standard international, chaquedistributeur de bases de données est libre d’ajouter des extensions. Celasignifie généralement que la syntaxe exacte du langage SQL varie d’une basede 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 SelectL’instruction Select sert à retrouver un jeu de lignes issues d’une ou de plusieurstables et constitue dans aucun doute l’instruction la plus couramment employéedans 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<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 expressionvalide.

Remarque L’instruction Select est l’instruction la plus complexe du langageSQL. 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èted’une instruction Select. Cependant, la syntaxe que nous vous présentons estgénéralement supportée par tous les fournisseurs de bases de données etvous pourrez l’exploiter avec la majorité des applications.

Instructions Select simplesAu lieu de passer un temps inutile à tenter d’apprendre les règles de syntaxe del’instruction Select, nous allons étudier une série d’exemples de situations classi-ques qui en illustrent l’emploi.

Page 523: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

505

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Tout extraireL’instruction Select suivante extrait toutes les colonnes et lignes de la tableClients :

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 enregistrementsde la table Clients.

Extraire une liste de colonnesSupposons que vous ne vouliez pas extraire toutes les colonnes d’une table. Vouspouvez faire appel à l’instruction Select suivante pour retrouver uniquement lescolonnes de votre choix. Cette requête extrait uniquement les colonnes IdClientet Nom de la table Clients.

Select IdClient, NomFrom Clients

Astuce Juste ce qu’il faut

Même si l’utilisation de l’astérisque (*) pour retrouver des colonnes simplifiela saisie de l’instruction SQL, elle peut être source de problèmes. Plus vousextrayez de données d’une base de données, plus le traitement de la requêtesera long et plus vous exploiterez de mémoire pour conserver les résultats.Nous vous accordons que le temps et l’espace supplémentaires sont parfoisnégligeables pour certaines requêtes, mais le fait d’exploiter uniquement lesressources nécessaires constitue une bonne pratique de programmation.

Extraire des lignesLes deux précédents exemples extraient toutes les lignes de données de la base dedonnées. Si cette technique présente des avantages dans bien des situations, ellepeut également engendrer quelques problèmes. Imaginons que vous travailliezpour une grande entreprise dont les tables contiennent des millions de lignes dedonnées. L’extraction des données déborderait n’importe quel ordinateur. Sivotre 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 faireappel à la clause Where pour sélectionner les lignes de votre choix.

Page 524: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

506

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

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 lignesd’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 impactenégativement les performances du serveur.

Expressions de recherche simplesLa 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 danslesquelles IdClient est égal à 101. La colonne IdClient constituant la clé primairede la table, cette instruction retourne toujours une seule ligne.

Select *From ClientsWhere IdClient = 101

Remarquez que vous pouvez utiliser d’autres opérateurs de comparaison dans laclause Where. Outre le signe égal (=), vous pouvez faire appel au signe inférieurà (<), supérieur à (>), inférieur ou égal à (<=), supérieur ou égal à (>=) ou lesigne différent de (<>).

Expressions de recherche complexesVous disposez également d’autres opérateurs comme And, Or et Not pour créerdes expressions plus complexes. Cette requête choisit chaque client ajouté en2003.

Select *From ClientsWhere DateAjout >= '01-Jan-2003' And DateAjout <= '31-Dec-2003'

Remarque Dans la syntaxe SQL, les valeurs non numériques comme leschaînes de caractères et les dates, doivent être placées entre guillemets sim-ples (‘). Les guillemets doubles (") encadrent les noms de colonnes et detables 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 ClientsWhere DateAjout Is Null

Page 525: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

507

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Opérateur Like

L’opérateur Like constitue un outil puissant qui permet de rechercher des valeursau sein d’une colonne avec des caractères génériques. Par exemple, l’instructionSelect suivante recherche chaque client dont la valeur de la colonne Nom com-mence par les lettres Free :

Select *From ClientsWhere Nom Like 'Free*'

Le tableau 22.1 liste les caractères génériques que vous pouvez employer avecune base de données Access. Rappelez-vous que ces caractères sont utilisablesdans 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 ClientsWhere 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, ACCFalse : B, BAA*ATrue : AA, AAA, ABA, ACCAFalse : AB, AAB*A*True : A, AB, CAC, DADDFalse : B, BB, CCC

? Correspond à un seul caractère. A?True : AA, AB, ACFalse : AAA, BA

# Correspond à un seul chiffre. A#True : A0, A9False : AA, A00

[] Correspond au caractère ou à la plage de caractères spécifiés entre les crochets. Rappelez-vous que l’utilisation du point d'exclamation (!) signifie que les caractères qui se trouvent en-dehors de la plage correspondent à la valeur.

A[*]ATrue : A*AFalse : AAAA[D-F]ATrue : ADA, AFAFalse : AAA, ADAAA[!0-9]True : AA, ABFalse : A0, A9

Page 526: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

508

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

Si possible, limitez l’usage des opérateurs Like aux colonnes faisant partie d’unindex. Sans l’index, la requête doit examiner chaque ligne de la base de donnéespour trouver celles qui correspondent. En outre, même avec un index, vousobtiendrez 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 decaractères génériques. Par exemple, l’astérisque (*) utilisé par Access devientle signe pourcentage (%) dans SQL Server. Vérifiez que vous utilisez les carac-tères génériques appropriés au programme.

Trier les lignesDans une base de données relationnelle, le serveur de bases de données est librede 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 dedonné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 parordre chronologique de code postal :

Select Nom, Rue, CodePostal, VilleFrom ClientsOrder By CodePostal

L’instruction Select trie les lignes par code postal puis par nom du client au seinde chaque code postal.

Select Nom, Rue, CodePostal, VilleFrom ClientsOrder 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 queles 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) aulieu de A à Z (ordre croissant).

Select Nom, Rue, CodePostal, VilleFrom ClientsOrder By CodePostal, Nom Desc

Utilisation de plusieurs tablesPour l’instant, nous avons vu comment utiliser l’instruction Select avec une seuletable. Il est possible d’extraire des lignes issues de plusieurs tables pour créer uneunique 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 pasnécessairement les résultats attendus.

Page 527: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

509

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Jointure de deux tables : mauvaise méthodeSi vous supposez que la jointure de deux tables aboutit à une combinaison detoutes les colonnes des deux tables, vous avez raison. Toutefois, si vous supposezque 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 tableavec chaque ligne de la deuxième table. Elle prend ensuite la deuxième ligne de lapremiè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 deuxtables retourne une table de 20 000 lignes.

Jointure de deux tables : bonne méthodeAu 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 à unevaleur d’une autre table. Prenons l’exemple de deux tables : l’une contient desclients, 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èreunique, comme IdClient.

De même, la table Commandes possède un champ qui indique le client qui apassé 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-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 desorte à mettre en relation les informations relatives à un client et ses commandes.

Résoudre les noms de colonnesSi vous tentez de coder l’exemple précédent sous la forme d’une instructionSelect, vous risquez de rencontrer un problème puisque les deux tables possèdentune colonne IdClient. Heureusement, l’instruction Select permet d’exploiter lanotation par point pour combiner le nom de la table et le nom de la colonne etidentifier 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 auxcolonnes sous la forme Clients.IdClient et Commandes.IdClient. L’instructionSelect qui en découle est la suivante :

Select *From Clients, CommandesWhere Clients.IdClient = Commandes.IdClient

Page 528: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

510

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

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 detable. Un alias est un nom court que l’on peut employer à la place du nom de latable. 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 cdWhere cl.IdClient = cd.IdClient

FonctionsL’instruction Select permet d’effectuer des opérations de synthétisation sur le jeucomplet 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 valeurunique, les fonctions récapitulatives de SQL retournent une seule ligne conte-nant le résultat de la fonction. Par exemple, vous pouvez compter le nombred’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 fonctionsexploitent la valeur contenue dans chaque colonne. MAX et MIN retournent res-pectivement les pus grandes et les plus petites valeurs de la colonne. La fonctionAVERAGE totalise toutes les valeurs de la colonne puis divise le résultat par lenombre de lignes. Si vous appliquez la fonction AVERAGE à une colonne qui necontient pas de valeurs numériques, vous obtiendrez une erreur.

L’instruction InsertL’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 dela 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 debases de données. Consultez la documentation du distributeur de la base dedonnées pour découvrir le jeu complet des options de l’instruction Insert.

Page 529: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

511

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Utiliser l’instruction InsertDans l’instruction Insert, vous spécifiez le nom de la table dans laquelle vousvoulez ajouter la ligne, suivi en option, d’une liste des noms de colonnes et d’uneliste de valeurs à insérer dans la base de données. La position de chaque valeurdans la liste des valeurs correspond à la position de la colonne dans la liste descolonnes. 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 sontlistées dans le même ordre que les colonnes dans la base de données. Même si cepoint 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 avoirchangé.

Attention Si la table contient une colonne Identité, ne l’incluez pas dans laliste des colonnes quand vous exécutez une instruction Insert. La base dedonnées retourne généralement une erreur si on tente explicitement d’insérerune valeur dans la colonne Identité. Il existe des techniques permettantd’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 plusd’informations.

L’instruction suivante montre comment insérer une nouvelle ligne de donnéesdans la table Clients. On stocke la valeur 12345 dans la colonne IdClient, onstocke 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 UpdateL’instruction Update change les valeurs d’une ou de plusieurs colonnes de latable. 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 lenom de la colonne dans la table, <value> correspond à la nouvelle valeur stockéedans 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 quel’instruction Update peut contenir une clause Where. Cette dernière est identi-

Page 530: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

512

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

2

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 ? ». Sila 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 estensuite positionnée sur ‘01-Jan-2003’.

Update ClientsSet NouvelleDate = '01-Jan-2003'Where NouvelleDate Is Null

L’instruction DeleteL’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 pourtoutes les lignes à actualiser.

L’instruction Delete permet de supprimer une ou plusieurs lignes d’une table. Sivous spécifiez simplement Delete From Clients, vous supprimez toutes leslignes de la table Clients. Sauf si vous voulez réellement vider la table, évitez cetteinstruction. Pour limiter le nombre de lignes à supprimer, servez-vous d’uneclause 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 impossiblede les récupérer. Contrairement à Excel, il n’existe pas de fonction Annulerpour 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) queles 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 estpréférable de supposer qu’elles n’existent plus.

L’exemple suivant supprime toutes les lignes dont la valeur NouvelleDate estantérieure au 31 Décembre 2002.

Delete From ClientsWhere NouvelleDate <= '31-Dec-2002'

Page 531: EXCEL Microsoft Office Excel

Cha

pitr

e 2

2

Excel et SQL

513

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Dans ce chapitre, vous avez découvert le fonctionnement des bases de donnéesrelationnelles, comme Microsoft Access et Microsoft SQL Server. Nous vousavons également présenté le langage Structured Query Language, plus communé-ment appelé SQL. Ce langage définit les instructions qui permettent d’extrairedes données d’une base de données (Select), d’ajouter des données à une base dedonnées (Insert), de modifier les données d’une base de données (Update) et desupprimer les données d’une base de données (Delete).

Page 532: EXCEL Microsoft Office Excel
Page 533: EXCEL Microsoft Office Excel

515

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 23

Introduction à ADOLe modèle d'objet ADO . . . . . . . 515L’objet Connection . . . . . . . . . . . 517

L’objet Command . . . . . . . . . . . 521L’objet Recordset. . . . . . . . . . . . 525

Les objets ADO (ActiveX Data Objects) permettent d’employer Excel VBA pouraccé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 estsimilaire au modèle client/serveur, excepté que ce dernier suppose généralementque la base de données fonctionne en tant que serveur indépendant. Cette res-triction ne s’applique pas à ADO.

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éesrelatives à la requête du consommateur de données. Le fournisseur de données etle consommateur de données communiquent via le protocole OLE DB. Autre-ment dit, tant qu’un programme dispose d’une routine d’approvisionnement dedonné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 pascomme 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 AccessObjects) pour manipuler votre base de données. Ces deux API (Application Pro-gramming Interface) de programmation sont très limitées comparées à ADO etc’est la raison pour laquelle nous ne les étudions pas dans cet ouvrage. ADOest plus souple et mieux supporté que RDO, alors que DAO est spécifiquementoptimisé pour les bases de données Microsoft Access. Sauf si vous devezemployer ces API pour une raison spécifique, préférez ADO.

Le modèle d'objet ADOLe modèle d’objet ADO présente trois objets essentiels (voir figure 23.2). L’objetConnection représente les informations nécessaires à l’établissement de la con-

Fournisseur de données

Consommateur de données

Requête

Réponse

Page 534: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

516

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

nexion entre le consommateur de données et le fournisseur de données. L’objetCommand contient les informations relatives à une instruction SQL ou unecommande 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’objetCommand.

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-tent ces objets principaux, parmi lesquels on trouve l’objet Error qui contient lesinformations 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 dansl’objet Recordset.

Utiliser le modèle d'objet ADOIl existe deux scénarios de base qui dépendent de la commande à exécuter. Si lacommande ne retourne aucune ligne, servez-vous du scénario suivant.

1 Créez un objet Connection pour vous connecter à la base de données devotre choix.

2 Ouvrez l’objet Connection.

Objet Connection

Objet Connection

Collection Errors

Objet Connection

Objet Parameter

Collection Parameters

Objet Recordset

Objet Field

Collection Fields

Page 535: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

517

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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’approchesuivante :

1 Créez un objet Connection pour vous connecter à la base de données devotre 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’objetCommand 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évoyezd’employer.

7 Positionnez la propriété ActiveCommand de l’objet Recordset sur l’objetCommand 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 ConnectionL’objet Connection décrit la connexion entre l’application et le serveur de basesde données. Associé à la collection Errors et à l’objet Error, l’objet Connectioncontrôle la connexion logique à la base de données.

Principales propriétés et méthodes de l’objet ConnectionLe tableau 23.1 liste les principales propriétés et méthodes associées à l’objetConnection.

Page 536: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

518

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

La méthode Open ouvre une connexion à la base de données en se servant desinformations optionnelles. Si elles ne sont pas fournies, on utilise les informa-tions de la propriété ConnectionString. La méthode Close termine une connexionouverte 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 laprogrammation, en particulier si on utilise Access. Cependant, avec SQL Server,Oracle, DB2 ou un autre serveur de bases de données partagé, consultez votreadministrateur 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 valeuradModeRead signifie que votre programme lit uniquement les données dans labase de données et qu’il peut coexister avec d’autres applications qui spécifientadModeRead. Si vous prévoyez d’écrire uniquement dans la base de données (cequi n’est guère courant), vous pouvez vous servir de la valeur adModeWrite. Enrevanche, si vous prévoyez de lire et d’écrire des informations dans la base dedonné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 basede données avec vous. En général, si plusieurs utilisateurs partagent la même

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, UserId, Password

Méthode : établit une connexion avec la base de données 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.

Page 537: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

519

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 debase de données à utiliser.

Les chaînes de connexion se composent d’une série de mots-clés et de valeursséparés par des points-virgules qui fournissent les informations nécessaires à lalocalisation du fournisseur de données et de la base de données, ainsi que lesinformations de sécurité nécessaires.

Se connecter à des bases de données AccessAvec les bases de données Access, vous êtes rarement obligé de fournir autrechose 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. PourAccess 2000 et les bases de données plus récentes, servez-vous du fournisseurMicrosoft.Jet.OLEDB.4.0 et pour les bases de données plus anciennes, utilisezMicrosoft.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 autresproduits se basent également sur le moteur Jet. Cependant, dans la mesureoù la majorité des utilisateurs accèdent à Jet par le biais d’Access, on seré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 ledisque. 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 ServerLa chaîne de connexion qui permet de se connecter à des bases de données SQLServer est quelque peu plus complexe, mais sans doute pas autant qu’on pourraits’y attendre.

Provider=SQLOLEDB.1;Data Source=athena.justpc.com; Initial Catalog=Music;User ID=Wayne;Password=TopSecret

Page 538: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

520

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

Le mot-clé Provider référence SQLOLEDB.1, ce qui correspond au fournisseurde données SQL Server.

Le mot-clé Data Source pointe sur le serveur de bases de données auquel vousvoulez accéder et le mot-clé Initial Catalog indique le nom de la base de donnéessur le serveur de bases de données.

Pour finir, les mots-clés User ID et Password présentent les informationsd’authentification au serveur de bases de données. Pour vous servir des informa-tions d’authentification Windows (l’identificateur que vous fournissez pourouvrir une session Windows), remplacez les mots-clés User ID et Password par lemot-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éesTant que vous récupérez le fournisseur de données approprié, vous pouvez vousconnecter à de nombreux types de bases de données différents, à la principalecondition 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.

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 DBen ODBC. N’exploitez toutefois ce fournisseur que si vous ne trouvez pas defournisseur OLE DB. En effet, les performances en seront négativement impac-tées.

Utiliser la collection ErrorsLa 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 esttout à 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écouvrirla cause réelle de l’erreur. La collection ADO Errors contient un jeu complet deserreurs qui surviennent pendant l’exécution d’une commande (voirtableau 23.3).

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 OracleOracle Provider for OLE DB

Page 539: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

521

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Astuce Vider Err

L’objet Err ne fournit pas tous les détails concernant l’erreur, mais il permetd’identifier l’erreur qui s’est produite. Pensez à utiliser la méthode Clear poursupprimer les informations antérieures qui se trouvent dans l’objet Err avantd’exécuter la requête.

L’objet de collection Errors représente un objet de collection classique contenantune propriété Count et une propriété Item qui retourne un objet Error. Vouspouvez faire appel à une boucle For…Each pour traiter tous les éléments de lacollection, puis faire appel à la méthode Clear pour supprimer tous les objetsError de la collection.

Remarque La collection Errors est uniquement peuplée lorsqu’une erreur seproduit. Servez-vous de la méthode Clear avant d’exécuter une commandepour éviter de détecter une erreur déjà gérée.

Utiliser l’objet ErrorL’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 lacause exacte de l’erreur.

L’objet CommandL’objet Command contient les informations relatives à la tâche exécutée par labase 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.

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.

Tableau 23-4. Principales propriétés de l’objet Error

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.

Page 540: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

522

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

Principales propriétés et méthodes de l’objet CommandLe tableau 23.5 liste les principales propriétés et méthodes associées à l’objetCommand.

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.

Pour plus d’informations sur la syntaxe SQL, reportez-vous au chapitre 22, « Excel etSQL ».

La propriété ActiveConnection contient soit une référence à un objet Connectionouvert, soit une chaîne de connexion utilisée pour créer dynamiquement uneconnexion à 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 desinformations relatives au type de données. Une fois le nouvel objet Parametercréé, vous devez l’ajouter à la collection Parameters par la biais de la méthodeParameters.Append.

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, Direction, Size, Value) As Parameter

Méthode : crée un objet Parameter en se servant des informations de type spécifiées.

Execute(RecordsAffected, Parameters, Options) As Recordset

Méthode : exécute la commande et retourne 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.

Page 541: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

523

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Au QuotidienProcédures stockées

Les procédures stockées sont des routines précompilées disponibles sur unserveur de bases de données que l’on peut exécuter pour accomplir une tâchede 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, lefont.

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 deboucle, les instructions Print et ainsi de suite. Chaque distributeur possède sapropre syntaxe de ces instructions. En conséquence, les procédures stockéesne sont pas portables d’un système de base de données à un autre. Elles sontcependant bien plus rapides que l’exécution d’une instruction SQL. Lorsquel’on crée des procédures stockées sur un serveur de bases de données, ellessont stockées dans une forme précompilée, ce qui permet d’économiser desressources puisqu’il est inutile de compiler les instructions SQL chaque foisque 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ètreset 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, cequi constitue l’une des principales inquiétudes des administrateurs de basesde données. Pour finir, les procédures stockées offrent une autre manière desé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 sontles personnes qui considèrent que la sécurité est plus importante que la per-formance.

Utiliser la collection ParametersLa collection Parameters contient des informations relatives aux paramètresassocié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é.

Page 542: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

524

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

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 objetParameter à 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 laprocé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’uneprocédure stockée, il n’est pas indispensable de le faire chaque fois que l’onappelle la procédure stockée. La récupération des paramètres dans la base dedonnées est gourmande de temps système, d’autant plus si on appelle uneprocédure stockée à partir d’une boucle.

Utiliser l’objet ParameterL’objet Parameter contient un certain nombre de propriétés qui décrivent unparamètre spécifique passé à une requête paramétrée ou une procédure stockée(voir tableau 23.7).

Propriété/Méthode DescriptionItem(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.

Tableau 23-6. Propriétés et méthodes de la collection Parameters (Suite)

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

Page 543: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

525

Partie 6 : Excel et le monde extérieur : une collaboration simplifié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édurestocké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 à passerles informations appropriées à la procédure stockée.

L’objet RecordsetLorsqu’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 RecordsetLe tableau 23.8 liste les principales propriétés et méthodes associées à l’objetRecordset.

Propriété DescriptionType 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.

Tableau 23-7. Principales propriétés de l’objet Parameter (Suite)

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.

Page 544: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

526

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

La propriété ActiveConnection pointe vers l’objet Connection associé à l’objetRecordset ou elle contient une valeur de chaîne de connexion. Dans ce dernier

Propriété/Méthode DescriptionClose 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 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.

Tableau 23-8. Principales propriétés et méthodes de l’objet Recordset (Suite)

Page 545: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

527

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

cas, la connexion à la base de données est automatiquement ouverte lorsqu’onouvre l’objet Recordset.

La propriété Source contient soit une référence à un objet Command soit unechaîne contenant le nom de la table, une procédure stockée ou une instructionSQL. Si vous assignez un objet Command à la propriété Source, la lecture de cettepropriété retourne la valeur CommandText de l’objet Command au lieu d’uneré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 trouventdans l’objet Recordset. Une fois que vous disposez des données, servez-vous de lamé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 parligne. En interne, l’objet Recordset conserve un pointeur auquel on se réfèrecomme 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 etMoveLast) pour naviguer dans les enregistrements de l’objet Recordset. Laméthode Move permet d’avancer ou de reculer au sein de l’enregistrement dunombre 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 dupointeur de l’enregistrement en cours. BOF est l’abréviation de Beginning OfFile, 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 courspointe sur la première ligne. Si vous appelez la méthode MoveNext, le pointeurde l’enregistrement en cours parcourt chaque ligne jusqu’à la dernière ligneincluse. 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. Sivous appelez à nouveau MoveNext, bien que la propriété EOF soit positionnéesur True, vous obtenez une erreur.

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 estimpossible 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 basede données. Rappelez-vous que cette propriété peut posséder la valeur –1, ce quisignifie que le total est inconnu pour l’instant. Dans ce cas, servez-vous de la

Page 546: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

528

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

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 cellesemployées dans une clause SQL Where. Cette technique peut être intéressante sivous souhaitez restreindre l’objet Recordset au sous-ensemble de données quevous venez d’extraire.

Astuce Le strict minimum

Bien que l’on puisse utiliser la propriété Filter pour afficher un sous-ensemblede lignes retournées à partir de la base de données, il est toujours préférabled’extraire uniquement les lignes à traiter.

Pour l’essentiel, la propriété Sort est similaire à la clause Order By de l’instructionSQL 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’objetRecordset et les retourne à votre programme selon l’ordre choisi.

Pour accéder à chaque colonne individuelle, utilisez la collection Fields. Vouspouvez extraire la valeur en cours de la colonne par le biais de l’objet Field ainsiqu’en enregistrant une nouvelle valeur dans la colonne de la ligne en cours. Enmodifiant l’une de ces valeurs, vous forcez la propriété EditMove à remplacer savaleur adEditNone par la valeur adEditInProgress. Une fois que vous avez terminéd’effectuer des modifications, appelez la méthode Update pour les enregistrerdans la base de données.

À l’heure d’écrire des données dans une table, commencez par vérifier que lapropriété EditMove est positionnée sur adEditAdd. Vous pouvez ensuite utiliserla méthode AddNew pour insérer une ligne vide à la fin de l’objet Recordset, danslequel vous pouvez écrire la valeur de chaque colonne en vous servant des valeursde la collection Fields. Pour finir, utilisez la méthode Update pour enregistrer leschangements apportés à la base de données.

La méthode Delete supprime la ligne en cours et positionne la propriété Edit-Move sur adEditDelete. À nouveau, servez-vous de la méthode Update pour lesderniers changements.

L’objet Recordset propose une autre fonctionnalité intéressante : la méthodeCancelUpdate. Si vous avez modifié la ligne en cours et que vous appelez cettemé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 ligneest supprimée et le pointeur de l’enregistrement en cours est réinitialisé pourpointer vers la ligne sur laquelle il pointait avant l’appel de la méthode AddNew.

Page 547: EXCEL Microsoft Office Excel

Cha

pitr

e 2

3

Introduction à ADO

529

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Utiliser la collection FieldsLa 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).

On utilise essentiellement la collection Fields pour accéder aux différents objetsField 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 nesont pas indispensables au programmeur de bases de données moyen.

Utiliser l’objet FieldL’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.

La propriété Name contient le nom de la colonne tel qu’il a été défini dans la basede données ou l’instruction Select qui a retourné les lignes. La propriété Typedécrit le type OLE DB de la colonne.

Plusieurs propriétés différentes contiennent la valeur de la colonne de l’objetField. La propriété Value représente la valeur en cours de la colonne telle quel’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é

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.

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.

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.

Page 548: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

530

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

3

OrginalValue. Cette propriété contient toujours la valeur la colonne telle qu’ellea été extraite de la base de données.

D’autre part, la propriété UnderlyingValue contient la valeur la plus récente de lacolonne stockée dans la base de données. Dans la mesure où il est possible que labase de données ait été actualisée depuis la création de l’objet Recordset, vouspouvez utiliser la propriété UnderlyingValue pour revenir à la base de données etrécupérer une nouvelle copie de la colonne.

Remarque Servez-vous de la propriété UnderlyingValue avec précaution. Eneffet, elle oblige ADO à revenir à la base de données pour récupérer la valeurla plus récente. S’il n’y a aucun problème à effectuer cette action de temps entemps, 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 decommuniquer 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’utilisationd’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 enexécutant un objet Command, les valeurs individuelles associées à chaque ligneretournée étant exposées par le biais de la collection Fields et chaque colonneétant exposée par le biais de l’objet Field.

Page 549: EXCEL Microsoft Office Excel

531

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 24

Programme Excel QueryConnexion à une base de données . . . . . . . . . . . . . . . . 535Édition d’une requête. . . . . . . . . 539

Exécution d’une requête . . . . . . 542Utilisation du programme Excel Query . . . . . . . . . . . . . . . . 550

Le programme Excel Query, développé pour cet ouvrage, est une applicationpratique de nombreux outils et techniques étudiés tout au long de ce livre. Vouspouvez intégrer le programme sous forme de macro complémentaire oul’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 QueryLe programme Excel Query est mis en œuvre comme macro complémentairedans Microsoft Excel. Celle-ci permet d’interroger une base de données et deretourner des résultats dans une feuille de calcul. L’interface avec le programmese présente sous la forme d’une barre de commandes, intitulée Excel2k3 VBAQuery, et comporte quatre composants principaux : une liste déroulante quiregroupe 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 connexionavec la base de données (voir figure 24.1).

Page 550: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

532

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

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 trouvedans le classeur ExcelQuery.xls, téléchargeable sur le site web de Dunod àl’adresse www.dunod.fr.

Configurer le projetUne grande partie de ce code est stockée dans le module ThisWorkbook. Le pro-gramme contient également deux feuilles, DBInfo et DBQuery. Le moduleThisWorkbook est automatiquement créé à la création du classeur. On ajoute desfeuilles au projet en choisissant Insertion, UserForm dans le menu principal eten 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 leserreurs de saisie. La deuxième instruction demande à Visual Basic d’effectuertoutes les comparaisons de chaînes sans tenir compte de la casse, ce qui réduit laquantité de code à écrire lorsque vous comparez des chaînes.

Option ExplicitOption 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 caseen 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.

Page 551: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

533

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Figure 24-2. Servez-vous de la boîte de dialogue Références pour ajouter la bibliothèque d’objets ADO.

Initialiser le programmeLorsque le programme Excel Query démarre, i l utilise l ’événementWorkbook_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 deserreurs en utilisant une instruction On Error Resume Next. Elle tente ensuite decréer une référence d’objet à la barre de commandes Excel 2k3 VBA Query enréférençant son nom dans la collection CommandBars.

Private Sub AddCommandBar()

Dim c As CommandBarDim cc As CommandBarComboBoxDim cb As CommandBarButton

On Error Resume NextSet c = Application.CommandBars("Excel2k3 VBA Query")If Not c Is Nothing Then Application.CommandBars("Excel2k3 VBA Query").Delete

End If

Set c = Application.CommandBars.Add("Excel2k3 VBA Query", _ msoBarFloating, False, True)c.Enabled = Truec.Visible = True Set cc = c.Controls.Add(msoControlComboBox, 1)

Page 552: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

534

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

cc.Tag = "Excel2k3 VBA Query Statement"cc.Text = "<enter a query>"cc.Width = 200cc.OnAction = "ThisWorkbook.EnterDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)cb.Tag = "Excel2k3 VBA Query Run"cb.Style = msoButtonCaptioncb.Caption = "Run Query"cb.OnAction = "ThisWorkbook.RunDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)cb.Tag = "Excel2k3 VBA Query Edit"cb.Style = msoButtonCaptioncb.Caption = "Edit Query"cb.OnAction = "ThisWorkbook.EditDatabaseQuery"

Set cb = c.Controls.Add(msoControlButton, 1)cb.Tag = "Excel2k3 VBA Query Database"cb.Style = msoButtonCaptioncb.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 cdemeure, positionné sur Nothing. Si c est Nothing, la barre de commandesn’existe pas et est supprimée. Cette étape garantit que la barre de commandes esttoujours créée avec les contrôles appropriés.

Une fois que le programme est certain que la barre de commandes n’existe pas, ilcré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 pourgérer l’application.

Deux des actions associées aux contrôles de barre de commandes ouvrent desfeuilles. La routine ShowDatabaseInfo ci-après ouvre la feuille DBInfo sousforme modale.

Private Sub ShowDatabaseInfo()

DBInfo.Show vbModal

End Sub

La routine EditDatabaseQuery effectue la même tâche avec la feuille DBQuery.

Private Sub EditDatabaseQuery()

DBQuery.Show vbModal

End Sub

Page 553: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

535

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Terminer le programmeL’événement Workbook_BeforeClose appelle la routine DeleteCommandBar pours’assurer que tous les changements apportés aux menus Excel sont supprimésavant 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 routineAddCommandBar qui vérifie que la barre de commandes n’existe pas avant d’encréer une. La récupération des erreurs est désactivée et on crée une référenced’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 supprimed’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 NextSet 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éesPour 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 pourcollecter ces informations (voir figure 24.3).

Page 554: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

536

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

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 registreMicrosoft 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 Pagepour chaque base de données supportée. Un contrôle ComboBox, qui se trouvedans 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.

Page 555: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

537

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Astuce Gardez un œil sur les onglets

Lorsque vous développez des applications avec le contrôle Multipage, laissezles onglets visibles en mode Création, même si vous préférez les masquerpour l’utilisateur. Vous pouvez ainsi basculer rapidement sur l’onglet à modifierpendant le développement. Ensuite, au moment de charger la feuille, position-nez la propriété Style sur MultiPage1.Style = fmTabStyleNone.

Initialiser la feuille DBInfoAu moment du chargement de la feuille DBInfo, qui génère la boîte de dialogueDatabase Properties, l’événement UserForm_Initialize du prochain code sedéclenche. Dans la première phase, on peuple le contrôle ComboBox Provideravec la liste des bases de données supportées. Pour cet exemple, seules les basesde données Microsoft Access et SQL Server possèdent leurs propres pages ; nousavons 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éStyle sur fmTabStyleNone.

La fonction GetSetting extrait les valeurs de chaque champ de la feuille à partirdu 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 unevaleur par défaut pour le cas où la valeur ne se trouve pas dans le registre.

Page 556: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

538

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

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. Remarquezque la propriété ListIndex déclenche également l’événement Change associé aucontrôle.

Changer les fournisseurs de la base de donnéesL’événement Provider_Change de la feuille DBInfo se déclenche chaque fois quel’utilisateur sélectionne une nouvelle base de données dans la liste déroulante ouque la propriété ListIndex change. Cette routine se contente de sélectionner lapage 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 WindowsLa page SQL Server contient une case à cocher qui permet à l’utilisateur d’opterpour 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 leschamps userid et password lorsque la valeur du contrôle est True et les affiche sielle 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

Page 557: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

539

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Enregistrer les informationsLorsque 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.TextSaveSetting "Excel2k3 VBA", "Query", "DBPassword", DBPassword.TextSaveSetting "Excel2k3 VBA", "Query", "DBPath", DBPath.TextSaveSetting "Excel2k3 VBA", "Query", "DBServer", DBServer.TextSaveSetting "Excel2k3 VBA", "Query", "DBWindowsAuth", _ DBWindowsAuth.ValueSaveSetting "Excel2k3 VBA", "Query", "DBUserId", DBUserId.TextSaveSetting "Excel2k3 VBA", "Query", "ConnectionString", _ ConnectionString.TextSaveSetting "Excel2k3 VBA", "Query", "DBType", Provider.ListIndex

Unload Me

End Sub

Une fois les valeurs enregistrées dans le registre, on appelle la routine Unloadpour fermer la feuille. Remarquez que l’événement Click du bouton Cancelappelle la routine Unload pour décharger la feuille. Toute modification deschamps de la feuille est alors annulée.

Astuce Mot-clé Me

Les modules UserForm ressemblent aux modules de classe classiques. Vouspouvez donc vous référez à l’instance en cours de l’objet en vous servant dumot-clé Me. Cette possibilité est particulièrement intéressante avec certainesinstructions, 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 CommandButton2est appelé. Puisque l’utilisateur a choisi de ne pas modifier les informations deconnexion 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

Édition d’une requêteLes valeurs de requêtes sont stockées dans le contrôle ComboBox sur la barre decommandes Excel2k3 VBA Query. Chaque requête possède sa propre entrée, que

Page 558: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

540

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

l’on sélectionne en choisissant l’entrée appropriée dans la liste déroulante. Sil’utilisateur clique sur le bouton Edit Query de la barre de commandes, la feuilleDBQuery se charge (voir figure 24.5) complétée par la requête sélectionnée dansle 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é labarre de commandes appropriée, la méthode FindControl récupère le pointeurd’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 à plusieurslignes de la feuille.

Private Sub UserForm_Initialize()

Dim c As CommandBarDim cc As CommandBarComboBox

On Error Resume NextSet 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

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.

Page 559: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

541

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Private Sub CommandButton1_Click()

Unload Me

End Sub

Lorsque la feuille est fermée, on appelle la routine SaveData de l’événementUserForm_Terminate pour s’assurer que la requête est toujours enregistrée à lafermeture de la feuille. En plaçant ici l’appel à SaveData, on enregistre la requêtesans 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 ducontrôle CommandBarComboBox en utilisant la même technique de base quecelle employée pour charger la requête.

Sub SaveData()

Dim c As CommandBarDim cc As CommandBarComboBox

On Error Resume NextSet 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énementOnAction associé à ce contrôle, c’est-à-dire la routine EnterDatabaseQuery qui setrouve dans le module ThisWorkbook, présenté ici. Cette routine parcourt la listedes requêtes stockée dans le contrôle et ajoute la nouvelle requête à la fin, si ellene la trouve pas. L’utilisateur peut ainsi exécuter à nouveau rapidement unerequête.

Sub EnterDatabaseQuery()

Dim c As CommandBarDim cc As CommandBarComboBoxDim q As StringDim i As Long

On Error Resume NextSet c = Application.CommandBars("Excel2k3 VBA Query")Set cc = c.FindControl(, , "Excel2k3 VBA Query Statement")

Page 560: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

542

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

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 etenregistre ensuite la valeur de la propriété Text dans la variable temporaire q. Laroutine utilise ensuite une boucle Do…While pour parcourir la liste des requêtesstockées dans la liste déroulante. Si elle trouve une correspondance, l’instructionExit Sub arrête la routine sans action. Si elle ne trouve pas de correspondance, lamé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 sil’utilisateur quitte Excel. Le programme ne doit pas occuper trop de place dansle registre Windows simplement pour stocker l’historique des requêtes et, sicette 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 simpled’ajouter un jeu de boîtes de dialogue Enregistrer/Ouvrir à cette feuille pourenregistrer les requêtes sur le disque.

Exécution d’une requêteSi l’utilisateur clique sur le bouton Run Query de la barre de commandesExcel2k3 VBA Query, la requête sélectionné dans la zone de liste modifiable de labarre de commandes s’exécute.

Récupérer les informationsDans 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 dela barre de commandes via la routine GetDBQuery. La fonction Trim supprimeles 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 ».

Page 561: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

543

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Sub RunDatabaseQuery()

Dim c As StringDim 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înede connexion et la requête est différente de zéro. Si la longueur est égale à zéro, lafeuille appropriée s’affiche pour que l’utilisateur complète les informationsnécessaires. Lorsque la feuille est fermée, l’utilisateur doit cliquer sur le boutonRun 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 lesinformations nécessaires, on appelle la routine RunQuery pour exécuter larequête en passant la chaîne de connexion et la chaîne de requête en tant queparamètres.

Construire une chaîne de connexionLa routine BuildConnectionString suivante crée une chaîne de connexion à partirde informations préalablement stockées dans le registre Windows. La routine,qui se trouve dans le module ThisWorkbook, commence par déclarer un certainnombre de variables temporaires qui vont contenir les informations extraites duregistre, ainsi qu’une variable temporaire c qui va contenir la valeur retournéefinale de la fonction.

Function BuildConnectionString() As String

Dim c As String

Dim DBName As StringDim DBPassword As StringDim DBPath As StringDim DBServer As StringDim DBType As LongDim DBUserId As StringDim DBWindowsAuth As Boolean

Page 562: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

544

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

c = ""

DBType = GetSetting("Excel2k3 VBA", "Query", "DBType", 0)

Select Case DBTypeCase 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", _ "<enter connection string>")

End Select

BuildConnectionString = c

End Function

Page 563: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

545

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Après avoir positionné c sur une chaîne vide, la routine extrait le type de la basede 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 duregistre Windows via la fonction auxiliaire GetRegistryValue. Cette fonctionprend 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 dedonné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 registrepuisque sa valeur par défaut n’est pas une chaîne, alors que les valeurs deDBName, DBPassword, DBServer et DBUserId sont extraites du registre par laroutine GetRegistryValue.

Contrairement aux chaînes de connexion Access, la routine tente de substituerdes 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 supposeque l’utilisateur exécute la requête sur l’ordinateur local. Si la longueur deDBName est différente de zéro, le programme tente de construire une chaîne deconnexion partielle en se servant de DBName et DBServer. Ensuite, si on faitappel à l’authentification Windows, on ajoute Integrated Security=SSPI à lachaî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’ilscontiennent une valeur. Si les deux contiennent des informations, ces champssont attachés à la chaîne de connexion. Si l’un de ces champs ne contient pasd’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 valeurConnectionString du registre en se servant de la fonction auxiliaire GetRegis-tryValue. Aucune autre vérification n’est nécessaire puisque GetRegistryValuegarantit qu’une chaîne vide est retournée si on ne trouve pas de valeur par défautdans le registre.

Pour finir, la routine se termine en retournant la variable temporaire c commevaleur de la fonction.

La fonction auxiliaire GetRegistryValue appelle la fonction GetSetting pourextraire la clé appropriée du registre. Si la valeur retournée est la même que cellefournie 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

Page 564: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

546

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

r = GetSetting("Excel2k3 VBA", "Query", key, default)

If r = default Then r = "" End If

GetRegistryValue = r

End Function

Récupérer la requêtePour récupérer la requête qui se trouve dans la zone de liste modifiable de labarre de commandes, nous utilisons la même approche que celle employéeailleurs 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 lazone de liste modifiable. La fonction suivante se trouve également dans lemodule ThisWorkbook :

Function GetDBQuery() As String

Dim c As CommandBarDim cc As CommandBarComboBox

On Error Resume NextSet 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 estvide, la fonction retourne une chaîne vide, indiquant que l’utilisateur doit saisirune requête.

Exécuter une requêteUne fois que l’utilisateur a fourni les valeurs de la chaîne de connexion et de lachaîne de requête, qui passent quelques vérifications simples, on appelle la rou-

Page 565: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

547

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

tine RunQuery, qui se trouve dans le module ThisWorkbook, pour récupérer lesinformations dans la base de données.

Sub RunQuery(c As String, q As String)

Dim cn As ADODB.ConnectionDim cmd As ADODB.CommandDim rs As ADODB.Recordset

On Error Resume Next Set cn = New ADODB.Connectioncn.ConnectionString = ccn.OpenIf Err.Number <> 0 Then MsgBox "Connection error: " & Err.Description Exit Sub End If

Set cmd = New ADODB.CommandSet cmd.ActiveConnection = cncmd.CommandText = qcmd.CommandType = adCmdText

Set rs = New ADODB.RecordsetSet rs.Source = cmd

cn.Errors.Clearrs.Open

If Err.Number = 0 Then CopyRows rs Else MsgBox "Query error: " & Err.Description End If

rs.Closecn.Close

End Sub

Pour exécuter la requête, cette routine se sert de trois objets de base de donnéesADO (ActiveX Data Object ) : un objet Connection, un objet Command et unobjet Recordset. Chacun est déclaré au début de la routine. On désactive ensuitela récupération d’erreurs via une instruction On Error Resume Next puisque cetteroutine recherche les erreurs après une instruction décisive.

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 del’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

Page 566: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

548

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

avoir instancié l’objet Connection, on se sert de la méthode Open pour ouvrir uneconnexion 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 ducode 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 pasune énorme surcharge, il est préférable de contrôler quand exactement unobjet est instancié.

En cas de problème à l’ouverture de la connexion, un message d’erreur s’afficheet 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 assignel’objet Connection nouvellement ouvert à la propriété ActiveConnection de larequête à la propriété CommandText. Pour finir, la propriété CommandType estpositionnée sur adCmdText, ce qui signifie que l’objet Command contient uneinstruction 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 lacollection Errors de l’objet Connection puis on appelle la méthode Open del’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-routineCopyRows pour copier les lignes de l’objet Recordset dans la feuille de calcul encours.

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èmed’exploitation.

Astuce Fermez les connexions

Pour obtenir les meilleures performances possibles au niveau du serveur debases 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.

Copier des lignesUn fois que l’objet Recordset contient les lignes de la base de données, il ne resteplus 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

Page 567: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

549

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

locales : i et j, qui contiennent les pointeurs vers la ligne et la colonne de la celluleen 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 LongDim j As LongDim f As ADODB.Field

Cells.SelectSelection.ClearContents

i = 1Do 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 ensélectionnant toutes les cellules (Cells.Select) puis en vidant la sélection avecla méthode ClearContents. On positionne ensuite la variable i sur 1, qui pointesur 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 lavariable f pour extraire chaque objet Field de la collection Fields de l’objetRecordset. La valeur du champ est directement copiée de la propriété Value vers lacellule appropriée vers laquelle pointe i et j. Une fois qu’un champ est copié, onincré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 MoveNextrepositionne 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 lafeuille de calcul.

Page 568: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

550

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

Utilisation du programme Excel QueryVoici un court exemple d’utilisation du programme Excel Query. Il extrait uneliste de clients de la base de données exemple Northwind installée avecMicrosoft 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 leré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 connexionAprès avoir chargé le classeur ExcelQuery.xls, cliquez sur le bouton Database etsélectionnez Access (Jet) dans la liste déroulante qui se trouve dans la partiesupé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êteCliquez ensuite sur le bouton Edit Query, saisissez la requête suivante (voirfigure 24.7) et cliquez sur le bouton Close.

Select *From CustomersOrder By CustomerId

Page 569: EXCEL Microsoft Office Excel

Cha

pitr

e 2

4

Programme Excel Query

551

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Figure 24-7. Saisissez la requête à exécuter.

Exécuter la requêteCliquez sur le bouton Run Query pour extraire les informations de la base dedonné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 dedonnées avec des feuilles UserForm et des barres de commandes pour créer uneapplication utile qui s’exécute sous Excel. Le programme commence par chargerune barre de commandes contenant les contrôles qui manœuvrent l’application.Cliquer sur le bouton Database affiche une feuille dans laquelle l’utilisateur peutsaisir 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 larequête en cours que l’utilisateur peut modifier. Pour finir, l’utilisateur clique sur

Page 570: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

552

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

4

Run Query pour exécuter la requête par le biais d’appels à ADO et afficher lerésultat dans la feuille de calcul active.

Page 571: EXCEL Microsoft Office Excel

553

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 25

Excel et le webHTML . . . . . . . . . . . . . . . . . . . . . 554Exploitation de l'Internet comme source de données . . . . 562

Exploitation de l'Internet pour publier des résultats . . . . . 568Exploitation des solutions Internet avec Excel . . . . . . . . . . 573

À une certaine époque, les applications types basées sur Excel avaient pour toutpartenaire 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 utilisaitdifférentes feuilles de calcul et on tentait de simuler au mieux les effets d'une basede données relationnelle.

Avec les technologies développées à partir des pilotes ODBC (Open DatabaseConnectivity, 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 destocker des données dans des bases de données externes et même d'y récupérerdes 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 sertde plus en plus des tables de requête et des tableaux croisés dynamiques pourré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 étaientstockées dans des bases de données autorisées.

Depuis la sortie de Microsoft Office 97, Microsoft a progressivement étendu lescapacité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, etnotamment les requêtes Web. Tout est prévu pour que les développeurs puissentexploiter des objets externes standards, comme le contrôle ITC (Internet TransferControl), 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 celogiciel. En matière de récupération des données, de publication de résultats, desuivi 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 etmontre comment interagir avec l'Internet dans le cadre de vos applications. Vousy apprendrez à enregistrer une feuille de calcul en tant que page web, à la publier

Page 572: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

554

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

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 existantescomme sources de données. Vous verrez comment ouvrir une page web dansExcel, créer et utiliser les requêtes Web, puis analyser des pages web pour enextraire des informations spécifiques. Pour terminer ce chapitre, vous verrezcomment mettre en œuvre un serveur web et communiquer avec lui.

HTMLHTML (Hypertext Markup Language) est le langage de balisage standard desdocuments publiés sur le World Wide Web. Il emploie des balises pour indiqueraux navigateurs web la manière d'afficher les éléments de page que sont les texteset 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'unelogique simple, tant du point de vue de la disposition tabulaire des données quedes contenus calculés. Toute personne ayant déjà encodé un tableau en HTMLpeut confirmer qu'il s'agit d'une tâche particulièrement fastidieuse. Même letableau 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 nombreet 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 etles tableaux croisés dynamiques qui conviennent. Une fois que le document estprê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 lesdonnées Excel uniquement dans un navigateur web. En revanche, avec les pagesweb interactives, l'utilisateur peut manipuler les données en modifiant desvaleurs ou des mises en forme. Selon la nature des fichiers, l'utilisateur peutmê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 pageweb, il vous reste quelques aspects à prendre en considération. Par exemple, vousdevez savoir si vous souhaitez enregistrer la totalité d'un classeur ou seulementune partie d'une feuille de calcul. Dans le second cas, sélectionnez les cellulesconcernées avant de lancer le processus d'enregistrement. Rien ne vous limiteaux plages de cellules ; vous pouvez également enregistrer des graphiques.

Page 573: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

555

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Pour choisir l'emplacement de stockage de votre page web, sachez si celle-ci doitse trouver sur votre disque dur ou sur un lecteur réseau, voire même si vous sou-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, puisouvrez le dossier FTP dans lequel enregistrer la page. Les dossiers web et/ou lesemplacements FTP doivent avoir été créés avant l'enregistrement des feuilles decalcul 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 lemodifier 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 pageweb.

2 Cliquez sur le menu Fichier et choisissez Enregistrer en tant que pageWeb, 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îtede dialogue Enregistrer sous. Ce faisant, vous n’enregistrez que les élémentssouhaité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 lecas d’une sélection de cellules, le bouton prend le libellé Sélection : <adressede la plage de cellules sélectionnées>.

3 Spécifiez l’emplacement d’enregistrement de la page web.

Page 574: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

556

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

4 Indiquez la partie du classeur à enregistrer dans la nouvelle page web.Pour enregistrer le contenu de toutes les feuilles de calcul du classeur,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 à convertiren page web avant d’ouvrir la boîte de dialogue Enregistrer sous, vousdevez sélectionner l’option Sélection : Graphique, qui remplace le boutonSé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 celleactuellement 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 saisissezdans cette zone. Il s’agit de l’extension standard d’un fichier HTML. Si vousprévoyez de publier la page web sur un serveur web UNIX, n’oubliez pas que cesystème d'exploitation est sensible à la casse (majuscules et minuscules)dans le nom de fichier. Les systèmes d'exploitation Macintosh et Windows nesont 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 titredans la boîte de dialogue Enregistrer sous. Tapez le texte du titre dans laboî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’ouvrirla 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éroulanteChoisissez. 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 lebouton Publier. Sélectionnez ensuite l’option Plage de cellules dans la listedéroulante Choisissez avant de taper l’adresse de la plage de cellules dans lazone 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 decalcul.

Lorsque vous enregistrez les données de la feuille de calcul dans une nouvellepage web, Excel crée automatiquement un nouveau dossier portant le mêmenom 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 desdonnées numériques. Donc, si vous déplacez la page de votre disque dur localvers un serveur web, n’oubliez pas de copier le dossier complet, ainsi que lefichier de la page web, afin que le navigateur de l’utilisateur puisse ouvrirl’ensemble du contenu de la page.

Page 575: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

557

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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. Pourl’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’ongletFichiers. Supprimez la coche de la case Regrouper les fichiers de prise en chargedans un dossier.

Remarque Sachez que lorsque vous enregistrez un classeur complet conte-nant plusieurs feuilles de calcul et des graphiques sur des feuilles de calculdistinctes, Internet Explorer préserve l’organisation d’origine des élémentsdans la page web statique qui en résulte en ajoutant des onglets de feuille decalcul au bas de la fenêtre Internet Explorer.

Il est également possible d’enregistrer une feuille de calcul en tant que page weben 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 WithEnd 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 webUne fois la page web enregistrée, vous devez la publier sur le web afin qu’elle soitmise à la disposition de tous. Voici les étapes à accomplir :

1 Cliquez sur Fichier>Enregistrer en tant que page Web, pour ouvrir la boîtede dialogue d’enregistrement. Sélectionnez l’option Classeur entier, puiscliquez sur le bouton Publier. La boîte de dialogue Publier en tant que pageWeb s’affiche, comme le montre la figure 25.2.

Page 576: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

558

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

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 Favorisré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 figure25.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.

Page 577: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

559

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Remarque Vous pouvez retourner dans Excel après avoir terminé de configu-rer le nouvel emplacement réseau.

5 Cliquez sur le bouton Suivant, puis dans la fenêtre suivante, sélectionnezl’option Choisissez un autre emplacement réseau. Vous acceptez ainsi lacré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 exemplehttp://mondomainedetest.com/idutilisateur. Saisissez le nom choisipour 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îtede 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 defichier.

9 Ouvrez la page web dans votre navigateur.

Une fois l’opération accomplie, n’oubliez pas de vérifier le bon fonctionnementdu fichier. La phase de test doit être complète de manière à éviter les problèmeslorsque 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 œuvreles fonctionnalités recherchées.

Maintenant que vous avez vu l’essentiel du processus de publication web, il esttrè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 pageweb 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

Page 578: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

560

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

Au QuotidienStyle 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 unemise en forme visant à en faciliter la lecture. Il est intéressant de publier desinformations sous forme de tableau, mais un graphique sera peut-être plusfacile à assimiler par votre public.

Il y a également quelques règles générales à suivre lorsque vous créez un siteweb. 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 destextes également sombres, vos lecteurs ne resteront pas longtemps dans lacontemplation des informations que vous leur proposez. La mise en page estaussi importante. Elle doit s’accompagner d’outils de navigation appropriés etfaciles à utiliser. Sachez aussi qu’en dépit d’une mise en page claire, il est peupratique 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 envérifiant si les liens hypertextes fonctionnent et que le rendu correspond à vosattentes. 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 interactivesLes composants interactifs permettent aux utilisateurs de manipuler vos don-nées dans les pages web qu’ils affichent dans un navigateur. Par exemple, vouspouvez publier une feuille de calcul interactive pour calculer des informationsd’emprunt. L’utilisateur peut naviguer dans la page et y saisir des informationsfinancières, comme le montant de l’emprunt et le taux d’intérêt pour calculer sesremboursements mensuels.

Les composants interactifs du fichier HTML ne sont ni accessibles depuis, nimodifiables dans Excel. Vous devez donc assurer la viabilité d’une copie maîtredu classeur Excel publié, de manière à pouvoir la modifier et la republier siné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 lesutilisateurs pourront en faire :

● Saisir des données ;

● Les mettre en forme ;

● Effectuer des calculs ;

Page 579: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

561

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

● Analyser des données ;

● Effectuer des tris et des filtrages.

Votre feuille de calcul peut bénéficier de plusieurs types d’interactivité. LeTableau 25.1 vous en donne le détail.

Remarque Le navigateur utilisé pour afficher les composants interactifs doitêtre Microsoft Internet Explorer version 4.1 ou ultérieure et disposer de lalicence Microsoft Office permettant de travailler avec les feuilles de calcul, lesdiagrammes 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 quepage 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 lafeuille de calcul.

6 Cliquez sur le bouton Publier.

Tableau 25-1. Options d’interactivité

Interactivité Description

Fonctionnalité de feuille de calcul

Les utilisateurs peuvent modifier les données en modifiant des 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 tableau croisé dynamique

Les utilisateurs peuvent modifier la présentation des lignes et des colonnes pour afficher différents récapitulatifs des données 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 graphique

Donne à l’utilisateur la possibilité d’utiliser des fonctions interactives sur le graphique dans la page web.

Page 580: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

562

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

Remarque Une fois l’opération accomplie, vous pouvez ouvrir et utiliser despages web interactives dans votre navigateur web. Cependant, si vous avezbesoin de modifier les données sur le site web, il n’est pas possible d’ouvrir etde modifier des pages web interactives dans Excel. Enregistrez une copie desauvegarde du classeur d’origine tel que vous l’avez publié au cas où vousauriez besoin de modifier les données. Si vous apportez des changements à lafeuille 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 basesde données en réseau et l’utilisateur. Habituellement, si un élément de donnéesn’était pas disponible dans une base de données, l’utilisateur était sollicité pourle saisir et le tenir à jour. Pour ce faire, l’application devait comporter plusieursfeuilles de calcul et boîtes de dialogue afin de stocker les informations et prévoirle mécanisme de saisie des données.

L’actualisation régulière des taux de change en est un exemple type pour le casd’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. Orvous pouvez optimiser celle-ci en automatisant la récupération des informationsde 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 dechange 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.

Page 581: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

563

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 classeursLa solution la plus simple consiste à ouvrir la totalité de la page web comme s’ils’agissait d’un classeur, puis d’y rechercher les informations voulues, comme parexemple, 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 dontvous n’avez pas besoin. Ces données inutiles ralentissent les performances devitesse 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 siteweb 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 existanteau lieu de passer par un navigateur. Lorsque la page web s’affiche, elle recherchele type de devise spécifié et affiche le taux de change dans une boîte de message.

Page 582: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

564

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

On peut réutiliser cette procédure avec d’autres pages web qui affichent desinformations dans des tableaux. Il suffit de saisir l’intitulé approprié dans les cri-tères de recherche. Si vous faites régulièrement des recherches sur l’Internet,vous devez disposer d’une connexion permanente.

DépannageCadres 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 ouvrirde pages web avec des cadres.

Les cadres permettent de subdiviser les pages web en plusieurs sections quisont en fait comme autant de pages web distinctes. Chacune de ces sectionss’appelle un cadre (frame). La page de cadres est le conteneur qui accueille legroupe de cadres. Excel ne peut pas ouvrir les pages web contenant descadres.

Si vous savez travailler dans le code source HTML, servez-vous d’un éditeurHTML pour copier les informations requises, sans le code des cadres, dans unnouveau fichier que vous pourrez alors ouvrir dans Excel.

Utiliser les requêtes WebLes requêtes Web ont fait leur apparition dans Excel 97 et ont été optimisées avecchaque version successive du logiciel. Elles vous permettent de récupérer untableau 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’unpays anglo-saxon, la virgule est utilisée comme séparateur de milliers et non pascomme séparateur décimal, ce qui donne des taux de change erronés. AvantExcel 2002, il n’était pas possible d’utiliser efficacement les requêtes Web pour lespays qui n’utilisaient pas le format de séparateurs non européen. Il estaujourd'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

Page 583: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

565

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

ultérieurement. Pour exploiter les options d’actualisation automatique desrequêtes Web, définissez ces séparateurs dans l’événement BeforeRefresh et redé-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 tauxde change dans le classeur Excel. Si vous ne parvenez pas à récupérer cesdonné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 cechapitre, 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érerle troisième tableau de la page. Il s’agit en effet de la troisième occurrence d’unebalise <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 surle web dans vos feuilles de calcul. Il n’est pas nécessaire de savoir comment lapage a été créée, ni de créer un fichier de requête. Vous pouvez sélectionner les

Page 584: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

566

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

données que vous voulez et, une fois que les informations ont été importées dansla feuille de calcul, vous pouvez les actualiser d’un simple clic de souris. Vouspouvez 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 jauneapparaissant dans la page web. Lorsque vous cliquez dessus, le tableaucorrespondant 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êteWeb. Choisissez l’option Feuille de calcul existante pour afficher les don-nées dans la feuille de calcul active ; choisissez Nouvelle feuille de calculpour 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.

Page 585: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

567

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Au QuotidienQuel 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 à laproprié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êteWeb. Celle-ci doit importer le tableau dont vous avez besoin dans une nouvellefeuille de calcul, de manière à éviter les problèmes ultérieurs. Une fois larequête Web créée, arrêtez l’enregistrement de la macro.

Parcourez le code de la macro à la recherche de la propriété WebTables. Savaleur correspond au numéro de tableau que vous recherchiez.

Ainsi, le fait d’enregistrer des macros peut vous aider à retrouver des valeurset des propriétés qui autrement, seraient difficiles à localiser. Pensez-y aumoment 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 tableauxd’informations dans des pages web, mais elles sont un peu lourdes à utiliser siseules quelques informations vous intéressent. Plus simplement, vous pouvezlire 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, vousdevez cliquer sur Outils>Références, puis sélectionner la bibliothèque d’objetsMicrosoft 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

Page 586: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

568

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

Loop 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 auxcirconstances 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 dansla page web directement. Mais si vous voulez récupérer plusieurs éléments, larequête Web sera plus intéressante pour récupérer la page ou le tableau dans unclasseur, 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 devos 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 sousforme 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 partiesintéressées.

Configurer un serveur webDe 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 configurationd’un serveur web. Vous trouverez de plus amples informations sur la configura-tion d’un serveur Windows 2003 Server dans l’ouvrage Microsoft Windows Server2003 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 commencerpar installer IIS (Internet Information Server). Pour ce faire, dans le Panneau deconfiguration, choisissez Ajout/Suppression de programmes. Une fois IIS ins-tallé, localisez la console Gestion des services Internet, dans le dossier Outilsd’administration du Panneau de configuration. Depuis cette console, vous pou-

Page 587: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

569

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

vez gérer plusieurs aspects de votre serveur web.

Le dossier Répertoire de base sert à stocker votre page web. Pour configurer lespropriétés du répertoire de base de vos serveurs web, ouvrez IIS et cliquez droitsur le noeud Site Web par défaut. Choisissez Propriétés et cliquez sur l’ongletRépertoire de base. Vous obtenez plusieurs options de configuration pour le siteweb par défaut. Vérifiez que les cases Lecture et Écriture sont cochées et cliquezsur 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 serveurweb. Par défaut, il s’agit de l’emplacement C:\inetpub\wwwroot. Toute page webplacé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 webVous pouvez gagner du temps si vous créez un modèle à partir duquel actualiserles informations de votre site web. Les modèles facilitent considérablement laprésentation des résultats dans une page web. Le modèle de classeur contient lesmises 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’enregistrercelui-ci directement sur le serveur web.

Dans l’exemple suivant, vous allez voir comment utiliser un fichier de modèlepour publier directement les nouveaux résultats sur votre serveur web :

Page 588: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

570

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

Astuce Personnalisez la procédure

Vous devez personnaliser la procédure suivante de manière à ce qu’elle utiliseun 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 WebDans l’exemple précédent, vous avez vu comment publier sur votre serveur webune feuille de calcul statique au format HTML. Or les Office Web Componentsvous permettent de créer des pages web interactives. Lorsque vous enregistrezune feuille de calcul interactive (ou actualisable), plusieurs conversions seproduisent : 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 depuisl’é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 webinteractive. Le classeur en question contient une plage de données à publier dansun tableau spécifié, un tableau croisé dynamique et un graphique incorporé.

Page 589: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

571

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Astuce Personnalisez votre procédurePour exécuter cette procédure, vous devez personnaliser la procédurePublishInteractivePage afin qu’elle référence votre serveur web, remplacer lesnoms de fichiers par les vôtres, ainsi que le nom de la feuille de calcul quevous 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 plusqu’à la modifier pour réaliser une présentation de qualité.

Les Web Components de Microsoft Office constituent un moyen de publier desdocuments Office sur le web tout en préservant l’interactivité des documents telsqu’ils peuvent être affichés dans leurs applications d’origine. Il s’agit d’unensemble de contrôles ActiveX. Lorsque les utilisateurs de Microsoft Office affi-chent une page contenant un Web Component Office, ils peuvent interagir avecles données affichées dans le document directement depuis Internet Explorer. Ilspeuvent trier, filtrer, ajouter ou modifier les données, développer et masquer desvues détaillées, travailler avec les listes de tableaux croisés dynamiques et générerdes graphiques à partir des résultats de leurs modifications. En outre, les WebComponents Office sont entièrement programmables, ce qui vous permet decréer du contenu enrichi et personnalisé dans vos applications pour le web.

Remarque Les Web Components Office fonctionnent avec Internet Explorerversion 4.01 et ultérieures ; les pages d’accès aux données Microsoft Accessne fonctionnent qu’avec Internet Explorer version 5 et ultérieures. Pour êtrecertain de bénéficier des fonctionnalités complètes des Web Components, tra-vaillez avec Internet Explorer version 5 ou ultérieure.

Page 590: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

572

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

5

Communication avec un serveur webDans 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 defichiers 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 exempleparmi les plus simples (comme http://monsite.com/mapageweb.html).

Pour communiquer avec une application qui s’exécute sur un serveur web, vousdevez être en mesure de traiter des informations au niveau du serveur etd’échanger des informations avec ladite application.

La méthode FollowHyperlink de l’objet Workbook permet de communiqueravec 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 unealternative plus souple. Ce contrôle ActiveX, souvent appelé ITC, est un wrapperdu fichier wininet.dll ; il est facile à utiliser et offre des services Internet de basniveau 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 del’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 dela chaîne de l’URL. En surfant sur le web, vous avez sans doute remarqué qu’unefois que vous avez saisi une adresse, celle-ci est modifiée automatiquement et quel’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 lapage web MSN Hotmail en tapant l’adresse www.hotmail.com, et tapez surENTRÉ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 pourtantainsi 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 laquantité d’informations que vous pouvez transmettre à l’aide de cette méthode.

Page 591: EXCEL Microsoft Office Excel

Cha

pitr

e 2

5

Excel et le web

573

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Si vous choisissez d’envoyer des informations dans une section distincte de larequête HTTP, vous utiliserez le champ POST pour transférer l’information endirection du serveur web. Il n’existe pas de limitation effective de la quantité dedonnées que vous pouvez placer dans un champ POST ; c’est donc le meilleurmoyen de transférer des informations au serveur.

Mais comment retourner l’information au client ? En les présentant sous formede 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’Internetcomme une partie intégrante de leurs applications. Par exemple, il est possibled’ouvrir des classeurs sur des serveurs web et d’enregistrer des classeurs sur desserveurs 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 pagesweb. La bibliothèque d’objets Internet Explorer peut également être automatiséeafin de récupérer des éléments de données isolés dans une page web, sanss’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 contenuenrichi. 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 nouveauxtypes de solutions professionnelles dans lesquelles Excel est un élément clé dansl’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égiede 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ésitezpas à utiliser les informations disponibles sur la Toile, d’autant qu’Excel y ajoutedes 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.

Page 592: EXCEL Microsoft Office Excel
Page 593: EXCEL Microsoft Office Excel

575

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 26

Excel et XMLIntroduction aux listes de données . . . . . . . . . . . . . . . . 575Création de schémas XML . . . . . 582Création de fichiers de données XML . . . . . . . . . . . . . . . 585

Ajout manuel de XML à un classeur . . . . . . . . . . . . . . . 587Ajout de XML à une feuille de calcul par programmation. . . . . 590

La prise en charge du XML, y compris la possibilité d’enregistrer des fichiers sousforme de documents XML, a été introduite dans Microsoft Office XP, mais cettetechnologie 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 voscollègues et vos fournisseurs sans tenir compte du programme employé pourcré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 parprogrammation ;

● 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éesDans Microsoft Excel 2002 et les versions antérieures, vous deviez créer une listede 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 avecdes valeurs dans les colonnes. La figure 26.1 montre une liste de fournisseursissue de la table Suppliers de l’exemple de base de données Northwind (inclusavec Microsoft Access).

Page 594: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

576

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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 delistes de données a été codifié en un ensemble cohérent, mettant en œuvre unenouvelle 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èresuivante :

1 Saisissez les noms dans les cellules qui constituent la ligne supérieure de laliste.

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 laliste 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 ligned’insertion, dont la cellule située le plus à gauche contient un astérisque.

Page 595: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

577

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Appuyez sur la touche TAB pour vous déplacer à la colonne suivante et sur latouche 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 laligne des en-têtes) pour filtrer les valeurs de la liste de la même manière qu’avecun Filtre élaboré. Vous pouvez ajouter une ligne des totaux en cliquant dansn’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 surlaquelle vous pouvez cliquer pour sélectionner la fonction à employer dans cha-que cellule de total.

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 laliste et choisissez Données, Liste, Convertir en plage.

Créer des listes de données par programmationLes listes de données individuelles sont représentées dans le modèle d’objet Excelpar 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 Basicpour 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.

Page 596: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

578

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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.

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éthodeDelete Cette méthode supprime l’objet ListObject actif et supprime

toutes les données des cellules associées.

Tableau 26-1. Propriétés et méthodes de l’objet ListObject (Suite)

Page 597: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

579

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Toutes les listes de données d’une feuille de calcul se trouvent dans la collectionListObjects de l’objet Worksheet. La collection est vide au départ. Vous utilisez laméthode Add de la collection pour créer un nouvel objet ListObject dans la feuillede calcul qui appelle la méthode.

Voici la syntaxe de la méthode ListObjects.Add :

Propriété ou méthode Description

MéthodePublish(Target(Url, ListName, Description), LinkSource)

Cette méthode publie un objet LinkObject sur un site de services SharePoint. L’argument Target contient un tableau de 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 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 (XlListConflict)

Cette méthode met à jour la liste située sur le site SharePoint 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).

Tableau 26-1. Propriétés et méthodes de l’objet ListObject (Suite)

Page 598: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

580

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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 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 prend la valeur xlSrcRange ; obligatoire si SourceType prend la valeur xlSrcExternal

Lorsque SourceType prend la valeur xlSrcRange, cet argument fait référence à la plage utilisée pour créer l’objet ListObject. Si 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.

Page 599: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

581

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 desuffisamment de place pour insérer la nouvelle liste ; les données existantesne sont pas écrasées.

Au QuotidienUne 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 nouvelobjet et à utiliser une instruction beaucoup plus longue pour générer le mêmerésultat. En outre, si vous vous servez de la méthode Add de la manièredécrire dans l’aide, vous obtiendrez des messages d’erreurs puisque l’objetListObject que vous avez créé ne possède pas de nom. L’instruction Add del’exemple est quelque peu confuse, mais vous pouvez l’envisager comme uneforme de l’instruction suivante :

ListObjects(0).Name = namestring

Vous créez et nommez le membre de la collection ListObjects dans la mêmeinstruction, mais cela fonctionne puisque l’objet ListObject existe lorsqueVisual Basic Editor rencontre la méthode Name.

La feuille de calcul de la figure 26.3 présente un exemple de l’utilisation de laméthode Add de la collection ListObjects : une série de cellules contient desvaleurs à utilisées comme étiquettes de colonnes.

Argument Obligatoire ou optionnel DescriptionDestination Obligatoire si l’argument

SourceType est positionné sur xlSrcExternal ; ignoré si l’argument SourceType est positionné sur xlSrcRange

Un objet Range qui identifie la cellule se trouvant dans l’angle supérieur gauche du nouvel objet ListObject. La destination doit se trouver sur la feuille de calcul qui a appelé la méthode Add.

namestring Obligatoire Une chaîne qui contient un nom unique pour la liste.

Tableau 26-2. Arguments de la méthode Add de la collection ListObjects (Suite)

Page 600: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

582

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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 laprocé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 ellessont encore plus puissantes lorsqu’on les combine avec des données XML. Laprochaine section de ce chapitre présente les fondements du XML (eXtensibleMarkup Language) et explique comment Excel l’exploite pour simplifier la ges-tion des données.

Création de schémas XMLLa 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 unschéma personnalisé dans un éditeur XML, écrire le code XML vous-même dansun éditeur de texte simple comme le Bloc-notes ou laisser Excel s’en charger enenregistrant 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 cechapitre :

<?xml version="1.0" encoding="utf-8" ?><schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Root"> <complexType> <sequence>

Page 601: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

583

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

<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"/> <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 setrouvent à la fin du listing : la structure des objets de données décrite dans cesché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.

Page 602: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

584

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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èresauquel se conforment les données et la référence au document en ligne relatifaux 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">

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 langageemploie 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 (ycompris 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èresde base différentes ou des accents, vous devez utiliser huit bits de donnéessupplémentaires pour représenter tous les caractères possibles. Le schémade codage de la plupart de ces langues est utf-16.

Les quelques prochaines lignes de code identifient l’élément de base dans leschéma (souvent appelé Root) et indiquent la structure que vont prendre lesdonné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 Rootest 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 effetdes sous-éléments, dont le premier est Supplier. La balise <sequence> indiqueque 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’unetable de base de données.

La déclaration de l’élément Supplier contient un élément nouveau : le paramètremaxOccurs="unbounded". Ce paramètre indique à l’interpréteur XML qu’il peut y

Page 603: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

585

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

avoir plusieurs éléments Supplier dans tout fichier de données XML qui suit ceschéma. Si vous ignorez ce paramètre, l’interpréteur attend une seule occurrencede 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 à unfournisseur (Supplier) :

<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é à uneseule valeur) est placé entre balises simples se terminant par />. Outre le nom del’élément, la balise contient également un paramètre type, qui indique le type dedonnée que l’élément doit héberger. Les deux types employés dans l’exemplesont positiveInteger et string.

Pour enregistrer le schéma sous forme d’un fichier de schéma XML, procédezcomme 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 lenom 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 duWorld Wide Web Consortium à l’adresse http:/ www.w3.org/ et tapez xml data typedans la zone de recherche.

Création de fichiers de données XMLPour exploiter des données XML, le schéma ne représente que la moitié de vosbesoins ; l’autre moitié de l’équation concerne les données elles-mêmes. Aprèsavoir créé un schéma qui reflète la structure de vos données, vous pouvez écrireles données dans un fichier avec des balises correspondant à la structure dufichier de données. Le listing suivant, que vous pouvez saisir dans un fichier duBloc-notes, contient les données de deux premiers fournisseurs du fichierMySuppliers.xml que vous pouvez télécharger sur le site de Dunod :

Page 604: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

586

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

<?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> <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 suitdans 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 lenom du fichier à enregistrer au format fichier XML est MySuppliers.xml,tapez MySuppliers.xml.

Plusieurs aspects des données du fichier MySuppliers.xml sont à noter. Parexemple, 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">

Page 605: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

587

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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éeset le nom du fichier du schéma (MySuppliers.xsd).

Remarque Vous pouvez ajouter les deux premières lignes de l’exemple defichier 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 dansvotre fichier XML et de remplacer MySuppliers.xsd par le nom de votre fichierde schéma.

La prochaine section du fichier contient les données employées pour peupler lafeuille 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 vouspouvez télécharger à partir du site web de Dunod, à l’adresse www.dunod.fr). Parexemple, l’élément CompanyName du fichier du schéma est défini dans la lignesuivante :

<element name="CompanyName" type="string"/>

Et le fichier de données possède une ligne correspondante dans chaque jeu dedonnées fournisseur :

<CompanyName>New Orleans Cajun Delights</CompanyName>

Les éléments ne contiennent pas tous des données, mais chaque élément doit sepré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 fichierdu schéma.

Ajout manuel de XML à un classeurUne 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 demanière interchangeable.

Pour associer un mappage de données à une feuille de calcul, procédez de lamanière suivante :

1 Cliquez sur Données, XML, Source XML pour afficher le volet SourceXML.

Page 606: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

588

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

2 Cliquez sur le bouton Mappages XML pour afficher la boîte de dialoguedu même nom.

3 Cliquez sur Ajouter pour afficher la boîte de dialogue Sélectionnez unesource 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 duschéma dans le volet Source XML.

Vous pouvez ensuite faire glisser les éléments individuellement du mappage surles cellules de la feuille de calcul, à l’emplacement de votre choix. Après avoir faitglisser un élément sur la feuille de calcul, une flèche pour le filtre automatiqueapparaî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, commeCompanyName).

Remarque Les noms des éléments que vous avez mappés dans une celluleapparaissent 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 lerésultat du mappage de l’élément Supplier du schéma MySuppliers.xsd dans lacellule 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.

Page 607: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

589

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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 égalementpossible de supprimer un élément de la feuille de calcul en cliquant droit surl’élément dans le volet Source XML et en choisissant Supprimer l’élément dans lemenu contextuel.

Pour modifier l’insertion des données XML dans la feuille de calcul, cliquez surle bouton Options du volet Source XML. Vous pouvez utiliser les options pourafficher un aperçu des données dans le volet Office, masquer le texte d’aide dansle 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 menuDonné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ôlesde 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 oud’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 XMLUne fois que vous avez assigné les éléments du schéma aux cellules de la feuille decalcul, vous pouvez importer les données à partir du fichier de données XML quicorrespond à la structure du schéma.

Pour importer les données dans un schéma XML existant, procédez commesuit :

1 Cliquez sur Données, XML, Importer.

Page 608: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

590

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

2 Dans la boîte de dialogue Importer au format XML, localisez le dossierqui contient le fichier de données XML, sélectionnez-le et cliquez surImporter.

Remarque Inutile de mapper chaque élément d’un schéma sur une feuille decalcul pour que les données importées fonctionnent correctement.

Ajout de XML à une feuille de calcul par programmation

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écouvrircomment effectuer en VBA une action simple et intuitive dans l’interface. Onpeut prendre pour exemple la série d’actions à entreprendre pour créer un listede 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, vouscréez une variable qui contient une référence à un objet XmlMap, qui représenteun schéma contenu dans un fichier .xsd. Le tableau 26.3 liste les propriétés etmé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.

Page 609: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

591

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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

Tableau 26-3. Principales propriétés et méthodes de l’objet XmlMap (Suite)

Page 610: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

592

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

Propriété ou méthode Description

MéthodeExportXml(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 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.

Tableau 26-3. Principales propriétés et méthodes de l’objet XmlMap (Suite)

Page 611: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

593

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Tous les schémas assignés à un classeur sont stockés dans la collection XmlMapsde l’objet Workbook. On se réfère aux membres individuels de la collection ennotant 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 lecadre 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 unschéma à un classeur. Voici la syntaxe de la méthode Add :

Add(Schema, RootElementName)

L’argument Schema est une variable de chaîne qui contient le chemin d’accèscomplet 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 lesché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 à lavariable xSchemaFile, on utilise la commande Set pour assigner le fichier duschéma nommé à la collection Workbooks du classeur actif.

Lorsque vous liez un mappage à un classeur, le mappage se voit assigner le nomde l’élément racine suivi d’un caractère de soulignement et du mot Map. Lemappage que vous avez ajouté, dont l’élément racine est intitulé Root, se verraitassigner le nom Root_Map.

Pour supprimer l’objet XmlMap que vous venez d’ajouter au classeur, exécutez laprocédure suivante :

Sub RemoveMap() ActiveWorkbook.XmlMaps("Root_Map").DeleteEnd Sub

Remarque Si vous avez lié un mappage à un classeur et que vous tentezd’assigner à nouveau le mappage au classeur, Excel ajoute un nombre à la findu nom du mappage. Par exemple, si on ajoute plusieurs fois le mappageRoot_Map à un classeur, il sera nommé Root_Map2, Root_Map3 et ainsi desuite.

Page 612: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

594

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

Pour écrire les données qui se trouvent actuellement dans les cellules assignéesau schéma Root_Map dans un fichier intitulé SuppliersBackup.xml, servez-vousde 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." Exit Sub End IfEnd 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éduregé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. Vousdisposez 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 ; Excelignore 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 deXPath 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 dansle répertoire ExcelProg du lecteur C. La différence entre le langage XPath et lesystème de notation des chemins d’accès Windows réside dans le fait qu’il fautspécifier l’emplacement d’un élément au sein du schéma. Prenons pour exemplele 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 dusous-élément SupplierID est la suivante :

/Root/Supplier/SupplierID

Page 613: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

595

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Le modèle d’objet Excel contient un objet XPath accompagné des propriétés etmé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.

Pour plus d’informations (très techniques) sur le langage XML Path, visitez le site webXPath officiel à l’adresse http://www.w3.org/TR/xpath.

La méthode SetValue de l’objet XPath est la plus importante du lot : elle permetde mapper un élément de schéma directement sur une cellule ou une plage. Laprocé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 variableobjet 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 cefaire, exécutez la procédure ApplySchema de la section « Mapper un schémasur 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

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.

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éthodeClear Supprime le mappage du schéma des cellules mappées sur

l’objet XPath spécifié.

SetValue(Map, XPath, SelectionNamespace, Repeating)

L’argument Map (obligatoire) est une variable XmlMap qui représente le mappage du schéma dans lequel vous importez les 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).

Page 614: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

596

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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" 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 " & _

Page 615: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

597

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

"the " & xMapName & " map." Else MsgBox "There was a problem importing from " & xDataFile Exit Sub End If

End Sub

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 duschéma MySuppliers.xsd, mais la création de listes individuelles pose unproblème : lorsqu’on saisit un nouvel élément dans une liste (par exemple, dansla 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 prochainecellule de la liste. Vous remarquez que la procédure a créé une série de listes etnon 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émentSupplier depuis le volet Source XML vers la cellule B2, vous auriez créé une listeunique. La bonne nouvelle, cependant, est que si vous appliquez un filtre à uneliste en cliquant sur la flèche qui se trouve sur le bord droit de l’en-tête decolonne, vous filtrez toutes les listes. Comment créé une liste qui permette de sedéplacer d’une colonne à l’autre avec la touche de tabulation ?

Page 616: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

598

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

Au QuotidienMapper un schéma sur liste unique

Lorsque vous créez une liste à plusieurs colonnes, vous créez un objet sansséparations dans lequel vous pouvez saisir des données. Mais en créant unesé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’unecolonne à la suivante dans la collection de listes. Alors comment mapper unesérie d’éléments de schéma de sorte que vous disposiez de toutes les fonc-tionnalités d’une liste ? En créant une liste sur votre feuille de calcul et enmappant les éléments du schéma sur les en-têtes de colonnes de la liste. Laprocédure suivante crée une telle liste pour les fichiers MySuppliers.xsd etMySuppliers.xml, avec le résultat illustré par la figure 26.8.

Attention Cette procédure suppose que la feuille de calcul que vous utilisezest 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 classeurvide.

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"

Page 617: EXCEL Microsoft Office Excel

Cha

pitr

e 2

6

Excel et XML

599

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

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

Page 618: EXCEL Microsoft Office Excel

Microsoft Excel 2003 VBA

600

Partie 6 : Excel et le monde extérieur : une collaboration simplifiée

Chapitre 2

6

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 deExcel 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. Enoutre, 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 votrecollaboration avec vos clients, vos fournisseurs et vos collègues quel que soit letableur qu’ils exploitent.

Page 619: EXCEL Microsoft Office Excel

601

Index

Symboles##### (valeur d’erreur) 137

#, caractère générique 507

#DIV/0! (valeur d’erreur) 137

#N/A (valeur d’erreur) 137

#NAME? (valeur d’erreur) 137

#NULL! (valeur d’erreur) 137

#NUM! (valeur d’erreur) 137

#REF! (valeur d’erreur) 137

#VALUE! (valeur d’erreur) 137

&, opérateur 217

*, caractère générique 507

, caractère générique 507

, signe différent de 506

=, signe égal 506

>, signe supérieur à 506

>=, signe supérieur ou égal à 506

?, caractère générique 507

AA1, notation 196

Access, application

se connecter aux bases de données 519

AccessMode, paramètre 151

Accueil, volet Office 23

Activate, événement 289, 290, 430

Activate, méthode

activer un graphique 352

collection Workbooks 152

objet Workbook 160

Active, propriété 577

ActiveCell, objet

méthode End 180

propriété CurrentRegion 180

ActiveCell, propriété 121

ActiveChart, objet 355

ActiveChart, propriété 123, 154

ActiveConnection, propriété

objet Command 522, 548

objet Recordset 525

ActivePrinter, paramètre 164

Activer

objet UserForm 428

ActiveSheet, objet

référencer une plage 184

ActiveSheet, propriété 124

méthode Delete 168

ActiveWindow, propriété 126

ActiveWorkbook, propriété 128

méthode

Unprotect 159

propriété

WriteReserved 157

AdaptiveMenus, propriété 395, 396

Add, méthode 206

collection

Sheets 166

Workbooks 143

collection ListObjects 580

collection PropertyTests 308

collection XmlMaps 593

objet Chart 346

objet Collection 339

syntaxe 194

syntaxe pour l’objet AddIn 264

AddDataField, méthode 376

AddEmbeddedChart, procédure d’événement 349

AddIn, objet

afficher les valeurs 266

AddinInstance_OnConnection, méthode 272

AddinInstance_OnDisconnection, méthode 272

AddItem, méthode

objet CommandBarComboBox 407

AddItem, propriété

contrôle ListBox 443

AddNew, méthode 525

Address, paramètre de la méthode FollowHyperlink 162

AddToFavorites, méthode 161

AddToMru, paramètre

méthode Open 146

méthode SaveAs 151

AddToSearchFolders, méthode 313

AdjustColumnWidth, propriété 590

ADO (Active Data Objects) 502

ajouter la bibliothèque pour la base de données 532

modèle d’objet 515

objets de base de données 547

ADODB.Command, objet 548

ADODB.Connection, objet 547

ADODB.Recordset, objet 548

Affichage, menu

éléments 50

Afficher

constantes intrinsèques 66

feuille de calcul 166

info-bulle d’argument 56

macro 34, 47

Aide

créer des fichiers 162

volet Office 23

zone Tapez une question 22

Ajouter

module 60

Page 620: EXCEL Microsoft Office Excel

Index

602

procédure 60

Ajouter un espion, commande 53

Ajouter une procédure, boîte de dialogue

afficher 51

Alertes

désactiver 169

propriété DisplayAlerts 128

AlertStyle, propriété 205

Alias 510

Aligner

objets 52

AllowDeletingColumns, paramètre 175

AllowDeletingRows, paramètre 175

AllowFiltering, paramètre 175

AllowFormattingCells, paramètre 174

AllowFormattingColumns, paramètre 174

AllowFormattingRows, paramètre 174

AllowInsertingColumns, paramètre 174

AllowInsertingHyperlinks, paramètre 175

AllowInsertingRows, paramètre 174

AllowMultiSelect, propriété 316

AllowSorting, paramètre 175

AllowUsingPivotTables, paramètre 175

Alt (touche) 140

Ancrage, onglet 59

And, opérateur 506

Aperçu avant impression 164

API (Application Programming Interface) 502, 515

AppActivate, instruction 481

Append, méthode 523

AppendOnImport, propriété 590

Application, objet 120, 488

accéder à partir d’autres applications 495

activer la surveillance des événements 299

collection

Dialogs 415

créer 482

méthodes

ConvertFormula 196

Union 191

propriété

CalculateBeforeSave 173

DisplayAlerts 169

EnableEvents 286

ThisWorkbook 150

propriétés

ActiveChart 123

ActiveSheet 124

ActiveWindow 126

ActiveWorkbook 128

DisplayAlerts 128

RangeSelection 129

ScreenUpdating 131

Selection 129

StatusBar 130

ThisWorkbook 132

référence implicite, explicite 487

Application, propriété

collection AddIns 264

objet AddIn 265

Applications

activer 481

créer des instances de 492

créer une instance de Word 482

démarrer à partir d’Excel 477

démarrer à partir de DOS 478

état de la fenêtre 478

ouvrir une présentation PowerPoint à partir d’Excel 479

partager des informations entre 477

Appointment, objet 483

arglist, élément

procédure Function 110

procédure Sub 96

Argument

passer à une boîte de dialogue 423

passer dans une procédure 112

Arguments nommés

passer à une procédure 114

Arrêt Défil. (touche) 140

Arrière-plan

définir pour un contrôle 461

Assistant

créer avec une feuille UserForm 463

Assistant Importation de texte 147

Assistant Recherche, macro complémentaire Excel 261

Assistant Somme conditionnelle, macro complémentaire Excel 260

Assistant Tableau et graphique croisés dynamiques

créer un graphique 372

créer un tableau 370

Atteindre, boîte de dialogue

afficher 415

afficher la boîte de dialogue Sélectionner les cellules 416

constante 415

sélectionner des valeurs par défaut 419

Audit de formules, barre d’outils 18

Authentification Windows 538

Auto_Activate, macro 266

Auto_Add, macro 266

Auto_Close, macro 266

Auto_Deactivate, macro 266

Page 621: EXCEL Microsoft Office Excel

Index

603

Auto_Open, macro 266

Auto_Remove, macro 266

AutoFit, méthode 190

Automation 481

AutoSize, propriété 445

AVERAGE, fonction 225, 510

BBackColor, propriété

contrôle TextBox 471

contrôle UserForm 432

objet UserForm 428

Background, propriété 253

Barre d'outils

boutons agrandis 395

Barre d’état

afficher un message 130

désactiver les messages 130

propriété StatusBar 130

Barre d’outils

ajouter un bouton 280

déplacer 56

Mise en forme 18

personnaliser 56

Barre d’outils Voir aussi Barre de commandes

Barre de commandes

ajouter des contrôles 406

animation 395

créer 406

empêcher l'utilisateur de personnaliser 395

flottante 399

lister les barres existantes 398

supprimer 400

temporaire 399

Barre de commandes Voir aussi Barre d’outils

Barre de défilement

ajouter à un contrôle TextBox 436

définir pour un objet UserForm 428

Barre de défilement, contrôle Voir ScrollBar, contrôle

Barre de formule 21

masquer 21

Barre de titre 21

Barres de commandes 21

Base de données

accéder à partir d’Excel 502

clé externe 502

clé primaire 501

clé secondaire 502

colonne d’indentification 502

comparée aux tableurs 499

concept client/serveur 502

conception et administration 501

concepts essentiels 500

extraire une ou plusieurs ligne(s) 504

instruction

Delete 512

Insert 511

Select 504

Update 511

manipuler avec SQL 503

OLAP 373

se connecter à 535

Base_de_données, nom réservé 199

BeforeClose, événement 289, 293

BeforePrint, événement 289, 292

BeforeRightClick, événement 295, 297

BeforeSave, événement 289, 291

BeginGroup, propriété 402

Bibliothèque

Microsoft ActiveX Data Objects 2.7 Library 532

Bibliothèque d’objets

Excel 495

Outlook 484

BlackAndWhite, propriété 170

BOF, propriété 525

Boîte à outils

afficher 51

Boîte de dialogue

afficher avec du code 414

afficher la collection Dialogs 419

déterminer comment elle est fermée 416

listes d’arguments de boîte de dialogue intégrée 414

modifier les sélections par défaut 418

passer des arguments 423

récupérer le choix de l’utilisateur 417

Boîte de message

boutons par défaut 77

créer 78

icônes 76

modalité 77

syntaxe 75

Boîte de message Voir aussi MsgBox, fonction

Boîte de saisie

méthode InputBox 134

positionner 80

syntaxe 79

Boîte de saisie Voir aussi InputBox, fonction

Bold, propriété 253

BorderAround, méthode

syntaxe 257

Borders, propriété

constantes 256

Bordure

entourer une plage de cellules 257

modifier 257

BottomMargin, propriété 170

BottomRightCell, propriété 361

Boucle

For…Next 33

Boucle itérative

Page 622: EXCEL Microsoft Office Excel

Index

604

For Each...Next 87

For...Next 86

Boucle logique

Do Until…Loop 89

Do While…Loop 89

Do…Loop Until 90

Do…Loop While 90

Bouton

agrandi dans une barre d’outils 395

ajouter à la barre d’outils 280

ajouter dans un menu 464

feuille UserForm

désactiver 458, 469

navigation 456

personnalisé 406

Bouton bascule, contrôle 438

Bouton d’option, contrôle 440

Bouton de barre d’outils

affecter à une macro 36

Bouton de commande, contrôle 435

Bouton Sélectionner tout 21

Bouton toupie, contrôle Voir SpinButton, contrôle

BuildConnectionString, fonction 542

BuiltIn, propriété

objet CommandBar 396

objet CommandBarControl 402

BuiltInFace, propriété 405

CCadre, contrôle 439

Calcul de prêt, classeur 187

Calculate, méthode 132

CalculateBeforeSave, propriété 173

CalculatedFields, collection 376

CalculatedFields, méthode 376

CalculateFull, méthode 133

Calculatrice, application

démarrer 478

Calculer

intérêts d’un prêt 229

ligne précédente, suivante 456

mensualité d’un prêt 228

méthode Calculate 132

méthode CalculateFull 133

principal d’un prêt 230

taux dÕint˙r_t dÕun pr_t 232

valeur actuelle 232

valeur actuelle nette 233

Call, instruction

dans une procédure Sub 104

CancelUpdate, méthode 525

Caption, propriété

contrôle CommandButton 452

contrôle Label 451

contrôle UserForm 432

mettre à jour dans une feuille UserForm 469

objet CommandBarControl 402

objet PivotField 382

objet PivotItem 383

objet UserForm 428

objet Window 126

Caractères génériques

dans une instruction Select 507

Case à cocher, contrôle 437

Case, instruction

pièges 99

CBool(expression), fonction 69

CByte(expression), fonction 69

CCur(expression), fonction 69

CDate(expression), fonction 69

CDbl(expression), fonction 69

CDec(expression), fonction 69

Cells, méthode 453

référencer une cellule 189

Cellule

afficher les formules 18

appliquer le format Texte 213

couleur de remplissage 255

déterminer si la valeur est du texte 212

dimensionner 190

mapper des éléments de schéma sur 594

méthode Cells 189

mettre en forme 18

modifier 121

modifier la bordure 257

motif 255

non contiguës, référencer 190

propriété ActiveCell 121

référencer dans une plage 185

sélectionner une plage 19, 21

vide, détecter 192

CenterHorizontally, propriété 170

CenterVertically, propriété 170

Certificat numérique

acheter 43

Chaîne

ajouter des caractères au début ou à la fin 218

assigner une valeur 67

déclarer 67

déterminer la longueur 215

récupérer les premiers ou les derniers caractères 219

récupérer une sous-chaîne 222

retourner des caractères arbitraires 221

supprimer les caractères non imprimables 214

Change, événement 295, 296

contrôle CheckBox 438

contrôle Multipage 468

contrôle ScrollBar 442

Page 623: EXCEL Microsoft Office Excel

Index

605

contrôle SpinButton 438

contrôle TextBox 437

contrôle UserForm 432

Character, objet

propriété Font 254

Characters, propriété

syntaxe 254

Chart, modèle d’objet 350

Chart, objet

événements 353

méthode Add 346

Chart, propriété 361

ChartObject, objet 351

assigner un nom 349

créer un graphique incorporé 348

définir la position du graphique 361

définir le nom du graphique 361

retourner le graphique associé 361

ChartObjects, collection 351

Charts, collection

propriété Item 351

ChartTitle, propriété 349

ChartType, propriété 349, 361

CheckBox, contrôle 437

Chemin d’accès d’un classeur 155

CHERCHE, fonction

syntaxe 222

CInt(expression), fonction 69

Class_Initialize, événement 335

Class_Terminate, événement 335

Classe

ajouter des règles de métier 341

créer 329

définir

événements 334

méthodes 333

routines de propriété 331

définition 323

événement

Class_Initialize 335

Class_Terminate 335

définition 329

modifier le nom 329

propriétés 328

propriétés simples 330

routine

Property Get 331

Property Let 331

Property Set 331

Classeur

activer 152, 160

afficher un graphique 154

afficher/masquer des formes 154

afficher/masquer les feuilles 166

ajouter des feuilles 166

ajouter du XML manuellement 587

ajouter une feuille de graphique 167

calculer

méthode Calculate 132

méthode CalculateFull 133

collection Workbooks 143

compter les feuilles 165

copier la palette de couleurs 246

copier les feuilles 169

créer 143

créer une copie 144

créer une copie de sauvegarde 151

définition 15

déplacer les feuilles 169

détecter l’ouverture 465

détecter la fermeture 466

enregistrer 150

enregistrer comme macro complémentaire 263

enregistrer les valeurs liées 156

enregistrer tous les classeurs ouverts 152

enregistrer une copie 152

fermer 153

fermer sans sauvegarder 156

gérer les conflits 151

importer des fichiers texte 147

imprimer 162

indiquer le chemin d’accès 155

indiquer le nom complet 155

méthodes 160

modifier tous les graphiques 363

mots de passe 157

nombre de feuilles de calcul 16

nommer les feuilles 165

ouvrir 144

propriété ActiveWorkbook 128

propriété ThisWorkbook 132

propriétés 153

protégé contre les modifications 158

protégé en écriture 157

protégé en lecture 157

protéger les macros 174

recalculer les formules 172

signer numériquement 43

supprimer des feuilles 168

supprimer la protection 159

vérifier s’il est ouvert 149, 300

CLEAN, fonction 214

Clear, méthode

collection Errors 521

collection FileDialogFilters 315

contrôle ListBox 444

objet Collection 340

Page 624: EXCEL Microsoft Office Excel

Index

606

objet CommandBarComboBox 407

objet Path 595

ClearContents, méthode 549

Clés de base de données

clé externe 502

clé primaire 501

clé secondaire 502

Click, événement

contrôle CommandButton 435

contrôle UserForm 432

CLng(expression), fonction 69

CLng, fonction 454

Close, méthode

objet Connection 518

objet Recordset 526

propriété ThisWorkbook 153

CLSID, propriété

objet AddIn 265

Code

compiler 53

mettre en forme 56

règles de lisibilité 61

signature numérique 55

Code VBA

simuler une pause 480

Code, fenêtre

afficher 50

description 49

personnaliser 58

Collate, paramètre 164

Collection, objet 338

méthode Add 339

Collections 32

Colonne

actualiser les valeurs 511

autoriser les utilisateurs à

en insérer 174

en modifier 174

en supprimer 175

d’indentification, base de données 502

dans un contrôle ListBox 442

déterminer si elle contient la valeur Null 506

dimensionner 190

extraire d’une table 505

lister les noms 511

NuméroAuto 502

référencer 190

résoudre le nom 509

Color, propriété

objet Borders 257

objet Font 253

objet Interior 255

ColorIndex, propriété 253, 255, 257

Colors, propriété

copier la palette de couleurs entre classeurs 246

syntaxe 243

Column, objet

propriétés

Width 190

ColumnCount, propriété 442

ColumnFields, propriété 377

ColumnGrand, propriété 377

ColumnHeads, propriété 443

Columns, propriété 190

ColumnWidth, propriété 443

ComboBox, contrôle

adapter au contenu 445

créer 408

définir

bouton déroulant 445

largeur de la liste 446

style 445

fonctionnement comme un contrôle ListBox 461

méthodes et propriétés 407

placer sur une feuille 451

ComboBox, contrôle Voir aussi ListBox, contrôle

ComboxBox, contrôle

ajouter des éléments 408

Comma, paramètre 148

Command, objet

dans le modèle d’objet ADO 521

dans une requête de base de données 547

CommandBar, propriété 409

CommandButton, contrôle

désactiver 458

événement Click 435

placer sur une feuille 452

CommandButton_Click, événement 458, 460

CommandLineSafe, sous-clé du registre 270

CommandText, propriété

objet Command 522

objet PivotCache 379

CommandType, propriété

objet Command 522, 548

objet PivotCache 379

Commentaires dans le code VBA 352

Compiler le code 53

Complément Solveur, macro complémentaire Excel 261

Compléments COM

afficher la boîte de dialogue Modules complémentaires COM 268

créer dans Visual Basic .NET 277

entrées de registre 270

EXE ou DLL 268

générer 281

initialiser 269

installer avec Visual Basic .NET 282

interface IDTExtensibility2 268

Compléments d’automatisation

créer dans Visual Basic 6 272

entrées du registre 276

installer 275

Page 625: EXCEL Microsoft Office Excel

Index

607

interface IDTExtensibility2 271

Concaténer du texte 217

ConflictResolution, paramètre 151

Conflits

gérer pour les classeurs 151

Connection, objet

dans le modèle d’objet ADO 517

dans une requête de base de données 547

propriétés et méthodes 518

Connection, propriété 380

ConnectionString, propriété 518, 519, 547

ConsecutiveDelimiter, paramètre 148

Const, instruction 66

Constante

convertir en variable 457

déclarer 66

Constantes

couleurs de base de l’ordinateur 239

Constantes intrinsèques

afficher 66

Contents, paramètre 174

Contrôle

ajouter à une barre de commandes 406

de menu contextuel 409

personnalisé 406

positionner légende, texte 406

zone de liste modifiable 407

Controls, propriété

objet CommandBar 396

objet CommandBarPopup 409

ControlTipText, propriété

contrôle UserForm 433

Conversion, fonctions de 69

Converter, paramètre 145

ConvertFormula, méthode

constantes xlReferenceStyle et xlReferenceType 197

convertir le style de notation 196

syntaxe 197

Convertir

nombre en texte 212

types de données 68

Convertisseur 145

Copier

données entre une plage et un tableau 202

feuille 169

feuille de calcul 16

modules entre projets 64

Copies, paramètre 164

Copy, méthode

collection Sheets 169

objet CommandBarControl 403

CopyFace, méthode 405

CorruptLoad, paramètre 146

Couleur de fond

contrôle UserForm 432

objet UserForm 428

Couleurs

afficher la palette en cours, procédure 244

de base de l'ordinateur 239

onglet de la feuille de calcul 251

quadrillage 250

système additif 240

système soustractif 240

Couleurs de remplissage

modifier 255

COUNT, fonction 225, 510

Count, méthode 339

Count, propriété

collection AddIns 264

collection CommandBarControls 401

collection CommandBars 395

collection Errors 521

collection Fields 529

collection Parameters 523

collection PivotCaches 379

collection PivotTables 376

collections Sheets et Worksheets 165

COUNTA, fonction 226

COUNTIF, fonction 226

Courriels, envoyer 479

CreateBackup, paramètre 151

CreateItem, méthode 483

CreateObject, fonction 482, 483, 489

fonction GetObject versus 492

CreateParameter, méthode 522

CreatePivotTable, méthode 380

Creator, propriété

collection AddIns 264

objet AddIn 265

Critères, nom réservé 199

Cryptage

clé publique, privée 42

CSng(expression), fonction 69

Ctrl (touche) 140

CTXT, fonction

syntaxe 212

CurrentPage, propriété 382

CurrentRegion, propriété 180

CursorLocation, propriété 518

CVar(expression), fonction 69

DDAO (Data Access Objects)

515

Data Source, mot-clé 519

DataBodyRange, propriété 577

DataFields, propriété 377

DataRange, propriété

objet PivotField 382

objet PivotItem 383

Page 626: EXCEL Microsoft Office Excel

Index

608

DataType, paramètre 147

DataType, propriété 382

Date

ajouter/soustraire une unité de temps 235

année pivot 68

assigner 67

dans un champ UserForm, valider 455, 461

déterminer l’intervalle entre deux dates 236

numéros de série 233

variable 67

DateAdd, fonction

syntaxe 235

unités de temps disponibles 236

DateDiff, fonction

syntaxe 236

DB2, bases de données 520

DblClick, événement

contrôle UserForm 433

DBWindowsAuth, valeur 545

DBWindowsAuth_Click, événement 538

Deactivate, événement 289, 292

Deactivate,événement 430

Débogage

applications masquées 490

Débogage, menu

éléments 53

Déboguer

macro 38

Début (touche) 140

DecimalSeparator, paramètre 148

Déclarations, section

créer 102

Déclarer

chaînes de texte 67

constante 66

objets 326

variable 65

variable statique 70

Delay, propriété 439

Delete, méthode 206

collection Parameters 523

objet CommandBar 396

objet CommandBarControl 403

objet ListObject 578

objet Recordset 526

objet XmlMap 591

supprimer une barre de commandes 535

Delete, propriété

collections Sheets et Worksheets 168

DeleteMenu, procédure 294

Delimiter, paramètre 145

Délimiteur

sélectionner 148

Déplacer

barre d’outils 56

fenêtre 55

feuille 169

Desc, mot-clé 508

Description, propriété

objet Error 521

Description, sous-clé du registre 270

Deselect, méthode 354

Dialog, objet 415

Dialogs, collection 414

afficher les constantes disponibles 419

méthode Show 415

variable Result 416

Dim New, instruction 325

Dim, instruction

mot-clé New 325

Dimensionner

ligne, colonne 190

Direction, propriété 524

DisableCustomize, propriété 395

DisplayAlerts, propriété 128, 169

DisplayDrawingObjects, méthode 154

DisplayErrorString, propriété 377

DisplayNullString, propriété 377

DisplayRightToLeft, propriété 577

Dissocier des objets 53

Do Until…Loop, boucle

syntaxe 89

Do While…Loop, boucle

syntaxe 89

Do…Loop Until, boucle

syntaxe 90

Do…Loop While, boucle

syntaxe 90

Document, objet 489

Documents, collection

méthode Open 491

Données

ajouter dans une feuille UserForm 460

autoriser les utilisateurs à les filtrer 175

autoriser les utilisateurs à les trier 175

copier 202

créer une liste 576

déterminer la catégorie 212

extraire d’une zone de texte 453

fonctionnement de la recherche 183

importer 146

mapper 587

type dans un base de données relationnelle 500

types pour les éléments 585

valider 205

valider dans une feuille UserForm 460

DOS, fenêtre

démarrer des applications Windows 478

Page 627: EXCEL Microsoft Office Excel

Index

609

DragToColumn, propriété 382

DragToData, propriété 382

DragToHide, propriété 382

DragToPage, propriété 382

DragToRow, propriété 382

DrawingObjects, paramètre 174

DROITE, fonction

syntaxe 219

DropButtonStyle, propriété 445

DropDownLines, propriété 407

EECARTYPE, fonction 226

Écran

propriété ScreenUpdating 131

Écrire dans un fichier externe 317

Editable, paramètre 145

Éditeur, onglet 56

EditMode, propriété 526

Effacement (touche) 140

Élément de menu

affecter une macro 37

Else, clause 461

Enabled, propriété 403

contrôle CommandButton 452

contrôle UserForm 433

des boutons 458

objet CommandBar 396

objet UserForm 428

EnableEvents, propriété 286

EnableSelection, propriété 175

End, méthode 180

Enregistrer

macro 33

tous les classeurs ouverts 152

Enregistrer sous, boîte de dialogue 314

Enter, événement

contrôle UserForm 433

Entrée (pavé numérique) (touche) 140

Entrée (touche) 140

EOF, propriété 526

EPURAGE, fonction 214

Err, objet 520

propriétés Number et Description 93

vider 521

Erreur

affichage 56

afficher un message 461

commande Resume 93

description 93

récupérer avec la commande On Error 92

validation de schéma XML 592

Erreur Voir aussi Err, objet

ErrorMessage, propriété 205

Errors, propriété 518

ErrorString, propriété 377

ErrorTitle, propriété 205

Espace de travail partagé, volet Office 23

Espaces

éliminer 215

Espion

ajouter 53

commande Espion express 53

Espions, fenêtre

afficher 51

ESTERR, fonction 212

ESTERREUR, fonction 213

ESTLOGIQUE, fonction 213

ESTNA, fonction 213

ESTNONTEXTE, fonction 213

ESTNUM, fonction 213

ESTREF, fonction 213

ESTTEXTE, fonction 212, 213

ESTVIDE, fonction 212

Étiquettes de graphique

définir 359

Euro

macro complémentaire 261

EUROCONVERT 261

Événement

créer automatiquement 460

définir 460

Événements 31

activer la surveillance 299

activer, désactiver 287

Class_Initialize 335

Class_Terminate 335

de classe 329

définir dans une classe 334

définition 324

instruction RaiseEvent 334

mot-clé WithEvents 329

objet Application 298

objet Chart 353

objet Workbook 288

objet Worksheet 294

rechercher dans l’Explorateur d’objets 298

Terminate 335

Excel

description de l'interface 20

modèle d’objet 119

Excel 2003

autres applications Office et 477

bibliothèque d’objets 495

contrôler à partir d’autres applications 495

démarrer une autre application à partir de 477

nouvelles fonctionnalités 3

Excel Query, programme

copier des lignes 549

Excel Query, programme 531

changer le fournisseur de base de données 538

configurer le projet 532

configurer les informations de connexion 550

construire une chaîne de connexion 543

Page 628: EXCEL Microsoft Office Excel

Index

610

éditer une requête 540

enregistrer les informations 539

exécuter une requête 542, 547, 551

initialiser 533

initialiser une feuille 537

récupérer une requête 546

saisir une requête 550

se connecter à une base de données 535

sélectionner l’authentification Windows 538

terminer 535

utiliser le programme 550

Execute As Recordset, méthode 522

Execute, méthode

objet CommandBarControl 403

objet FileSearch 305, 307

Exécuter

macro 35

procédure 54

Exécuter jusqu’au curseur, commande 53

Exécuter Sub/UserForm, commande 54

Exécution, fenêtre

afficher 51

Exécution, menu

éléments 54

Exit, événement

contrôle UserForm 433

valider les données 461

Explorateur d’objets

afficher la collection Dialogs 419

rechercher des événements 298

Explorateur d’objets, fenêtre

afficher 51

Explorateur de projets, fenêtre

afficher 51

description 48

Export, méthode 591

Exporter un module 63

ExportXml, méthode 592

Expression, paramètre

méthode FollowHyperlink 162

méthode PrintOut 164

méthode Protect 174

Extraction, nom réservé 199

FF1 à F15 (touches) 140

FaceId, propriété 405

Favoris

ajouter le bouton à une barre d’outils 161

ajouter un fichier 161

Fenêtre

afficher 60

déplacer 55

fractionner 60

niveau de zoom 126

parcourir les fenêtres 60

propriété ActiveWindow 126

Feuille

ajouter à un projet 51

copier 169

créer 62

déplacer 169

Feuille de calcul

ajouter 166

ajouter un mappage de données 587

calculer, méthode Calculate 133

comparée aux tables 499

copier 16

déplacer 16

déterminer la dernière ligne 457

enregistrer sous 176

extraire des données vers une zone de texte 453

insérer 16

limites 17

mettre les données en forme 170

modifier la couleur de l'onglet 16

nombre par défaut 16

nommer 165

options d’impression 170

propriété Worksheet 124

protéger 173

recalculer les formules 173

référencer une plage 184

renommer 16

sélectionner 176

sélectionner tout 21

supprimer 16, 168

supprimer la protection 176

Feuille de graphique

ajouter 167

supprimer 168

Feuille UserForm

afficher 462

ajouter 425

ajouter un contrôle 426

boutons de navigation 456

collecter les entées 472

créer une feuille avancée 451

désactiver les boutons 458

événement Initialize 457

exécuter 427

modale, non modale 429

modifier la taille 427

modifier le nom d’un contrôle 427

sélectionner 427

valider les données saisies 460

Feuille Voir aussi Feuille de calcul, Feuille de graphique

Fichier

déterminer l’existence avec l’objet FileDialog 317

Page 629: EXCEL Microsoft Office Excel

Index

611

déterminer l’existence avec l’objet FileSearch 313

écrire dans un fichier externe 317

importer 52

lire un fichier externe 319

localiser 303

méthode FindFile 133

ouvrir dans Word 491

rechercher une valeur 320

Fichier de données

importer dans un schéma XML 589

XML, créer 585

Fichier texte

importer 146

Field, objet 529

FieldInfo, paramètre 148

Fields, collection 529

Fields, propriété 526

FileDialog, objet 304, 314

déterminer l’existence d’un fichier 317

méthode Show 315

propriété Filters 315

propriété SelectedItems 315

FileDialogFilters, collection

méthode Clear 315

FileDialogSelectedItems, collection 315

FileFormat, paramètre 150

FileFound, objet

propriété LastModified 306

FileName, paramètre

méthode Open 144

méthode OpenText 147

méthode SaveAs 150

FileName, propriété 304, 307

FileSearch, objet 304

déterminer l’existence d’un fichier 313

méthode Execute 307

propriété

FileType 308

TextOrProperty 307

FileSearch, propriété 304

FileType, propriété 308

FileTypes, collection 308

Filter, propriété 526

Filters, propriété 315

Fin (touche) 140

FIND, fonction

syntaxe 222

FindControl, méthode 395

objet CommandBar 396

récupérer un pointeur d’objet 540

FindFile, méthode 133

FindLastRow, fonction 458

FirstPageNumber, propriété 170

FitToPagesTall, propriété 170

FitToPagesWide, propriété 170

Flèche Bas (touche) 140

Flèche Droite (touche) 140

Flèche Gauche (touche) 140

Flèche Haut (touche) 140

Fonction

de l’instruction Select 510

marquer comme Private 335

fonctionnalités

droits relatifs à l'information 7

Fonctions

de conversion 69

Font, propriété 254, 433

FontStyle, propriété 253

FooterMargin, propriété 170

For Each...Next, boucle

syntaxe 87

For...Next, boucle

syntaxe 86

ForeColor, propriété 433

FormApp.xls, exemple d’application 450

Format de cellule, boîte de dialogue

afficher les onglets avec du code 417

modifier les sélections par défaut 418

Format de l’éditeur, onglet 58

Format, menu

éléments 52

Format, méthode 377

Format, paramètre 145

FormatDateTime, fonction 455

Forme

afficher, masquer 154

protéger contre les changements 174

Formula, propriété 383

Formula1, propriété 205

Formula2, propriété 205

Formulaire Voir Feuille UserForm

FormulaLocal, propriété

paramètres régionaux et 137

Formule

afficher dans une cellule 18

info-bulle d’argument 24

recalculer 172

FoundFiles, collection 304, 307

FoundFiles, propriété 304

Fournisseur de base de données

changer 538

Fractionner une fenêtre 60

Frame, contrôle 463

contenant des boutons d’option 469

déplacer 439

Frappes de touches

méthode SendKeys 140

FriendlyName, sous-clé du registre 270

From, clause 508

From, paramètre 164

FullName, méthode 155

FullName, propriété

objet AddIn 265

Function, procédure

Page 630: EXCEL Microsoft Office Excel

Index

612

ajouter à un module 110

comparée avec une procédure Sub 95

exécuter 111

GGAUCHE, fonction

syntaxe 219

Général, onglet (boîte de dialogue Options) 58

Gestionnaire d’erreurs

brancher une erreur 92

Gestionnaire des tâches

fermer des applications masquées 490

Get, routine 328

GetObject, fonction 482, 490, 492

fonction CreateObject versus 492

GetOpenFilename, méthode 417

GetRegistryValue, fonction auxiliaire 545

GetSaveAsFilename, méthode 417

GetSetting, fonction 538, 545

GoTo, instruction

syntaxe 91

Graphique

activer manuellement 347

ajouter 346

créer à partir d’un tableau de données 358

créer un graphique incorporé 348

définir

emplacement 349

plages tracées 349

titre 349

type 349

déterminer s’il a été activé 355

macro de mise en forme 362

mettre en forme 361

nommer 348

propriété ActiveChart 123

Graphique croisé dynamique

créer avec l’assistant 372

créer par programmation 386

présentation 372

Graphique croisé dynamique Voir aussi Tableau croisé dynamique

Graphique incorporé 346

activer 352

créer 348

définir

angles 362

hauteur 361

impression 361

largeur 362

nom 361

ombre 362

position 361, 362

visibilité 362

désélectionner, désactiver 354

imprimer 363

nommer 351

nommer l’objet ChartObjet 347

procédure d’événement 353

retourner la plage de cellules 361

Graphique Voir aussi Graphique incorporé

GridlineColor, propriété 250

GridlineColorIndex 251

GridlineColorIndex, propriété 250

Grille

aligner des objets 52

Grouper

objets 52

HHasDataLabels, propriété 360

HasDataTable, propriété 361

HasLegend, propriété 361

HasTitle, propriété 361

HeaderMargin, propriété 170

HeaderRowRange, propriété 577

Height, propriété

contrôle UserForm 433

objet ChartObject 361

objet CommandBar 396

objet CommandBarControl 403

objet UserForm 428

HelpContextId, propriété 403

HelpFile, propriété 403

Heure

assigner 67

numéros de série 233

passer les 24 heures 238

HiddenFields, propriété 377

Hide, méthode

objet UserForm 429

IIcônes

choisir pour une boîte de message 79

options pour les boîtes de message 76

Id, propriété 403

Identificateur de tâche 478

IDTExtensibility2, interface

complément COM 268

complément d’automatisation 271

If...Then...Else, instruction 217

syntaxe 83

IgnoreBlank, propriété 205

IgnoreReadOnlyRecommended, paramètre 145

Image clipart, volet Office 22

Image, contrôle

charger une image 441

formats acceptés 441

placement de l’image 441

Page 631: EXCEL Microsoft Office Excel

Index

613

redimensionner l’image 441

répéter l’image 441

Import, méthode 592

Importer

fichier 52

module 62

texte 146

ImportXml, méthode 592

Impression_des_titres, nom réservé 199

Imprimer

définir

nombre de hauteurs/largeurs de pages 170

orientation 170

première page 170

sauts de page 171

en noir et blanc 170

graphiques 363

plage Zone_d_impression 200

supprimer les caractères non imprimables 214

InCellDropdown, propriété 205

InchesToPoints, méthode 171

Index de tableau 72

Index, propriété

objet CommandBar 396

objet CommandBarControl 403

objet PivotCache 380

Info-bulle d’argument 24

afficher/masquer 56

Initial Catalog, mot-clé 520

InputBox, fonction

syntaxe 79

InputBox, méthode

syntaxe 134

InputMessage, propriété 205

InputTitle, propriété 205

Ins (touche) 140

Insérer

feuille de calcul 16

Insert, instruction 511

Insertion, menu

éléments 51

InsertRowRange, propriété 577

Installed, propriété

objet AddIn 265

Installer

complément COM 282

complément d’automatisation 275

macro complémentaire 261, 263

Integrated Security, mot-clé 520

Interface Excel

barre d’état 23

barre d’onglets 23

barre de formule 21

barre de titre 21

barres de commandes 21

bouton Sélectionner tout 21

commandes de la fenêtre du classeur 22

commandes de la fenêtre du programme 22

volets Office 22

zone Nom 21

zone Tapez une question 22

Intersect, méthode 137

Intitulé, contrôle 435

INTPER, fonction

syntaxe 229

Investissement

calculer la valeur actuelle 232

calculer la valeur actuelle nette 233

IPMT, fonction

syntaxe 229

IRM (Information Rights Management) 7

Is Nothing, test 326

Is Null, expression 506

ISBLANK, fonction 212

IsConnected, propriété 380

ISERR, fonction 212

ISERROR, fonction 213

IsExportable, propriété 590

ISLOGICAL, fonction 213

ISNA, fonction 213

ISNONTEXT, fonction 213

ISNUMBER, fonction 213

ISREF, fonction 213

ISTEXT, fonction 212, 213

Italic, propriété 253

Item(Index), propriété

collection AddIns 264

Item, méthode

collection PivotCaches 379

collection PivotTables 376

objet Collection 340

Item, propriété

accéder aux objets Chart 351

collection CommandBarControls 401

collection CommandBars 395

collection Errors 521

collection Fields 529

collection Parameters 524

JJet, moteur de base de

données 519

Jointure de tables 508

KKeyAscii, argument 472

KeyPress, événement 460, 472

LL1C1, notation 196

Label, contrôle 435

associé à un contrôle SpinButton 439

LabelRange, propriété 383

Page 632: EXCEL Microsoft Office Excel

Index

614

LargeButtons, propriété 395

LargeChange, propriété 442

LastModified, propriété 306

LastRow, constante 454

LayoutForm, propriété 382

LBound, fonction 203

LEFT, fonction

syntaxe 219

Left, propriété

contrôle UserForm 433

objet ChartObject 361

objet CommandBar 396

objet CommandBarControl 403

objet UserForm 428

LeftMargin, propriété 170

Légende de graphique

afficher 361

LEN, fonction 215

Let, routine 328

Liaison

plage de cellules 191

Liaison dynamique 486

avec le Calendrier Outlook 483

avec Word 482

Liaison statique 482, 484, 486

dossier Contacts Outlook 485

Lien hypertexte

autoriser les utilisateurs à en ajouter 175

créer 162

Ligne

ajouter à une table 511

autoriser les utilisateurs à

en insérer 174

en supprimer 175

les modifier 174

calculer la précédente, la suivante 456

copier dans une feuille de calcul 549

déterminer la dernière d’une feuille de calcul 457

dimensionner 190

extraire d’une base de données 504

extraire d’une table 505

référencer 190

supprimer d’une table 512

trier dans instruction Select 508

Like, opérateur 507

LineStyle, propriété 257

Lire un fichier externe 319

List, propriété 443

objet CommandBarComboBox 407

ListBox, contrôle

ajouter des éléments à la liste 443

définir

en-têtes des colonnes 443

largeur des colonnes 443

nombre de colonnes 443

nombre de lignes 443

style de liste 444

effectuer une recherche 444

sélection multiple 444

supprimer des lignes 444

supprimer tous les éléments de la liste 444

ListColumns, propriété 577

ListCount, propriété 443

objet CommandBarComboBox 407

Liste de données

convertir en plage 577

créer manuellement 576

créer par programmation 577

Liste des fichiers récemment utilisés

ajouter un classeur 146

ajouter un fichier 151

ListHeaderCount, propriété 407

ListIndex, propriété 444

objet CommandBarComboBox 407

ListObjects, collection 579

ListRows, propriété 577

ListStyle, propriété 444

ListWidth, propriété 446

Load, méthode

objet UserForm 429

LoadBehavior, sous-clé du registre 270

LoadData, méthode 341

Local, paramètre

méthode Open 146

méthode OpenText 149

méthode SaveAs 151

Localiser des fichiers 303

Locked, propriété 433

LookIn, propriété 304

MMacro

affecter à un bouton de barre d’outils 36

affecter à un élément de menu 37

affecter une séquence clavier 35

afficher 34, 47

créer un graphique 347

déboguer 38

déboguer pas à pas 39

définir niveau de sécurité 44

empêcher l’exécution automatique 41

enregistrer 33

exécuter 35

mettre en pause 130

mettre un graphique en forme 362

protéger 174

Page 633: EXCEL Microsoft Office Excel

Index

615

protéger avec une signature numérique 42

rechercher 49

sécurité 40

sélectionner 55

signer numériquement 43

Macro complémentaire, boîte de dialogue 260

Macros complémentaires

boîte de dialogue Macro complémentaire 260

collection AddIns 264

créer dans Excel 262

décharger 261

enregistrer 263

enregistrer du disquette, CD-ROM 264

installer 261, 263

présentation 259

Macros complémentaires Voir aussi Compléments COM, Compléments d’automation

Maj (touche) 140

MakeConnection, méthode 380

Map, propriété 595

Mappage des données 587

Marges

définir 170

Masquer

barre de formule 21

feuille de calcul 166

MatchEntry, propriété 444

MatchFound, propriété 446

MatchRequired, propriété 461

MAX, fonction 226, 510

Max, propriété

contrôle ScrollBar 442

contrôle SpinButton 438

MaxLength, propriété 437

Me, mot-clé 336, 539

MEDIAN, fonction 226

MEDIANE, fonction 226

MemoryUsed, propriété

objet PivotCache 380

objet PivotField 382

Menu

ajouter des éléments 411

Menu contextuel

afficher 409

contrôles 409

créer 409

MenuAnimationStyle, propriété 395

Menus

afficher l’intégralité 20

Menus adaptatifs

activer/désactiver 395

Méthodes 31

de classe 328

définir dans une classe 333

définition 132, 324

objet Connection 518

Mettre en forme

cellule 18, 213

code 56

plage de cellules 19

Microsoft OLE DB Provider for ODBC drivers 520

Microsoft Jet 519

MID, fonction

syntaxe 221

MIN, fonction 226, 510

Min, propriété

contrôle ScrollBar 442

contrôle SpinButton 438

Mise en forme conditionnelle

pièges 99

Mise en forme, barre d’outils 18

Mises à jour du document, volet Office 23

Modalité des boîtes de message 77

MODE, fonction 226

Mode, propriété 518

Modèle d’objet Excel

description 119

objet Application 120

Modificateurs de touche

codes 140

Modifier un espion, commande 53

Modify, méthode 206

Module

ajouter 60

ajouter à un projet 52

ajouter une procédure Function 110

ajouter une procédure Sub 96

copier entre projets 64

créer 62

exporter 63

importer 62

ouvrir 60

renommer 105

supprimer 63

Module de classe

ajouter 329

ajouter à un projet 52

créer 62

définition 325

Modules complémentaires COM, boîte de dialogue

afficher 268

Mot de passe

forts 160

pour modifier un classeur 157

pour ouvrir un classeur 157

Motif de remplissage

modifier 255

visualiser 256

Move, méthode

collection Sheets 169

objet CommandBarControl 403

objet Recordset 526

MoveFirst, méthode 526

MoveLast, méthode 526

MoveNext, méthode 549

objet Recordset 526

Page 634: EXCEL Microsoft Office Excel

Index

616

MovePrevious, méthode 526

MOYENNE, fonction 225

MsgBox, fonction

syntaxe 75

MsgBox, procédure

syntaxe 114

msoButtonState, constantes 405

msoButtonStyle, constantes 405

msoControlType, constantes 401

msoMenuAnimation, constantes 395

Multiline, propriété 436

contrôle TextBox 471

Multipage, contrôle

ajouter une page 466

contenant des informations de connexion 536

incrémenter la propriété Value 468

masquer les onglets 468, 537

transitions visuelles 448

Multipage_Change, événement 468

MultiRow, propriété 447

MultiSelect, propriété 444

Nname, élément

procédure Function 110

procédure Sub 96

Name, instruction

nommer les séries de données d’un graphique 356

Name, propriété 253

collection ScopeFolders 310

collection Sheets 165

contrôle ComboBox 451

contrôle TextBox 451

contrôle UserForm 433

objet AddIn 265

objet ChartObject 361

objet Command 522

objet CommandBar 396

objet Field 529

objet ListObject 578

objet Parameter 524

objet PivotField 382

objet PivotItem 383

objet PivotTable 377

objet UserForm 428

objet XmlMap 591

Names, propriété

plages nommées 194

NativeError, propriété 521

NB, fonction 225

NB.SI, fonction 226

NB.VIDE, fonction 226

NBA, fonction 226

NBCAR, fonction 215

NBCOUNTBLANK, fonction 226

New, mot-clé

créer une nouvelle instance de Word 491

créer une variable objet 487

dans une instruction, Dim, Public ou Private 325

NewSearch, méthode

objet FileSearch 305

NewSheet, événement 289, 291

NewWindow, paramètre de la méthode FollowHyperlink 162

NewWorkbook, événement 298

Niveau de sécurité

définir pour les macros 44

Nom complet d’un classeur 155

Nombre

convertir en texte 212

valider la saisie 461

Nommer une plage de cellules 19

directives 195

Noms réservés 199

Not, opérateur 506

Notations

convertir 196

Nothing, valeur

utiliser avec les objets 326

Notify, paramètre 145

Nouveau classeur, volet Office 23

nouveautés Excel 2003

comparer des classeurs 8

compléments Office 2003 13

documents intelligents 6

espace de travail intelligent 7

fonctions statistiques optimisées 3

mappage données avec schémas XML 12

volet Recherche 8

XML étendues 10

NPV, fonction

syntaxe 233

Null, valeur

dans une colonne de base de données 500

sélectionner des lignes contenant 506

NullString, propriété 377

Number, propriété

objet Error 521

NumberFormat, propriété

objet PivotField 382

objet Range 213

NumericScale, propriété 524

NuméroAuto, colonne 502

OObjet

accéder 325

ajuster la taille 52

aligner 52

aligner sur la grille 52

Page 635: EXCEL Microsoft Office Excel

Index

617

avec plusieurs variables objet 327

centrer 52

déclarer 326

définition 323

déterminer la création d’une nouvelle instance 325

détruire 327

dissocier 53

empilement 53

encapsulation 30

enfants 488

espacement horizontal 52

espacement vertical 52

grouper 52

rechercher dans l’Explorateur d’objets 298

uniformiser la taille 52

valeur Nothing 326

ODBC

fournisseurs de données pour 520

Office, applications 477

contrôler Excel 495

interagir avec 487

Offset, propriété

référencer une cellule 185

OLAP (Online Analytical Processing) 373

OLAP, propriété 380

OLE DB, protocole 515

types de données 529

Ombre

définir pour un graphique incorporé 362

On Error Resume Next, instruction 547

On Error, commande

récupérer les erreurs 92

OnAction, propriété 404

OnAddInsUpdate, méthode 269

OnBeginShutdown, méthode 269

OnConnection, méthode 269

OnDisconnection, méthode 269

Onglet

modifier la couleur 16, 251

Onglet, contrôle Voir TabStrip, contrôle

OnKey,méthode 138

OnStartupComplete, méthode 269

Open, événement 289, 290, 464

Open, instruction

syntaxe 317

Open, méthode

collection Documents 491

collection Workbooks 144

objet Connection 518

objet Recordset 526

ouvrir une connexion à une base de données 548

syntaxe 144

OpenText, méthode

collection Workbooks 147

syntaxe 147

Operator, propriété 205

Option Base, instruction 72

Option Private Module, instruction 102

OptionButton, contrôle 440, 463

dans un contrôle Frame 469

Options, boîte de dialogue

onglet Ancrage 59

onglet Éditeur 56

onglet Format de l’éditeur 58

onglet Général 58

Or, opérateur 506

Oracle, bases de données, se connecter 520

Order By, clause 528

dans une instruction Select 508

Ordinateur

couleurs de base et constantes 239

Ordre de tabulation, boîte de dialogue

afficher 51

Ordre des tabulations

définir pour un contrôle UserForm 433

Orientation, propriété 170

objet PivotField 382

Origin, paramètre

méthode Open 145

méthode OpenText 147

OriginalValue, propriété 529

Other, paramètre 148

OtherChar, paramètre 148

Outils pour l’Euro, macro complémentaire Excel 261

Outils, menu

éléments 55

Outlook, application

liaison dynamique avec le Calendrier 483

liaison statique avec le dossier Contacts 485

référencer la bibliothèque d’objets 484

Ouvrir

Visual Basic Editor 47

Ouvrir, boîte de dialogue 314

afficher avec du code 414

PPage, objet 466

ajouter au contrôle Multipage 466

PageBreak, propriété 171

PageFields, propriété 377

PageSetup, objet 170

Palette de couleurs

afficher les couleurs par défaut 251

afficher, procédure 244

copier entre classeurs 246

méthode ResetColors 246

Page 636: EXCEL Microsoft Office Excel

Index

618

personnaliser avec l’interface Excel 244

personnaliser avec VBA 245

réinitialiser 246

Parameter, objet 522

Parameter, propriété

objet CommandBarControl 404

Parameters, propriété 522

Paramètres régionaux

propriété FormulaLocal et 137

Parent, propriété

collection AddIns 264

objet AddIn 265

Pas à pas détaillé, commande 53

Pas à pas principal, commande 53

Pas à pas sortant, commande 53

Password, mot-clé 520

Password, paramètre

méthode Open 145

méthode Protect 174

méthode SaveAs 150

PasswordChar, propriété 437

PasteFace, méthode 405

Path, méthode 155

Path, propriété

collection ScopeFolders 310

objet AddIn 265

Pattern, propriété 255

afficher les motifs disponibles 256

PatternColor, propriété 255

PatternColorIndex, propriété 255

Pause

simuler dans le code 480

Pause (touche) 140

Personnaliser

barre d’outils 56

fenêtre Code 58

palette de couleurs à partir de l’interface Excel 244

palette de couleurs à partir de VBA 245

Visual Basic Editor 56

Pg. Préc (touche) 140

Pg. Suiv (touche) 140

Picture, propriété

contrôle Image 441

objet UserForm 428

PictureAlignment, propriété 441

PictureSizeMode, propriété 441

PictureTiling, propriété 441

Pile des appels

afficher la boîte de dialogue 51

vider 54

PivotCache, méthode 378

PivotField, objet 376

PivotFields, méthode 378

PivotItems 383

PivotTable, objet

modèle d’objet 374

PivotTableWizard, méthode

objet PivotTable 378

objet Worksheet 376

Plage de cellules

ajouter une bordure 257

étendre 180

liaison 191

méthodes

Calculate 133

Cells 189

End 180

Intersect 137

mettre en forme 19

nommer 19, 194

noms absolus et relatifs 198

propriétés

CurrentRegion 180

RangeSelection 129

référencer sur la feuille de calcul active 184

référencer sur une feuille de calcul inactive 185

référencer une cellule 185

retourner dans un graphique 361

sélectionner 19, 21, 180

tableaux et 202

Plages nommées 19

définir 194

écrire dans les cellules 203

étendre 203

lire les cellules 203

noms réservés 199

références absolues et relatives 198

PlotBy, propriété 361

PMT, fonction

syntaxe 228

Point d’arrêt

ajouter 54

effacer 54

Pointeur de l’enregistrement en cours 527

Polices, boîte de dialogue

sélectionner les options par défaut 420

Portée

procédure Sub 101

Position, propriété

objet CommandBar 397

objet PivotField 383

objet PivotItem 383

PowerPoint, application

ouvrir une présentation à partir d’Excel 479

PPMT, fonction 230

Pr_t

calculer le taux dÕint˙r_t 232

Precision, propriété 524

Preserve, mot clé 74

PreserveColumnFilter, propriété 591

Page 637: EXCEL Microsoft Office Excel

Index

619

PreserveNumberFormatting, propriété 591

Presse-papiers, volet Office 22

Prêt

calculer la mensualité 228

calculer la part des intérêts 229

calculer la part du principal 230

Preview, paramètre 164

PRINCPER, fonction 230

PrintObject, propriété 361

PrintOut, méthode 162, 363

PrintPreview, méthode 164, 363

PrintToFile, paramètre 164

Priority, propriété 404

Private, élément

procédure Function 110

procédure Sub 96

Private, instruction 328

déclarer une variable 71

mot-clé New 325

Private, mot-clé 101

variables, sous-routines et fonctions 335

Procédure

ajouter 51, 60

arrêter l'exécution 54

exécuter 54

réinitialiser les valeurs 109

séparer par une ligne 58

Procédures

ajouter aux références 107

conserver les valeurs 108

convertir de Public en Private 101

exécuter à partir d’une autre procédure 104

passer des arguments 112

passer des arguments nommés 114

récursivité 107

Procédures stockées 523

paramètres d’entrée/sortie 525

Procédures Voir aussi Sub, procédure et Function, procédure

ProgId, propriété

objet AddIn 265

Programmation

orientée objet 30

procédurale 29

Programme Excel Query Voir Excel Query, programme

Projet

ajouter un module 52

ajouter un module de classe 52

ajouter une feuille 51

copier un module 64

renommer 107

Property Get, routine 331

Property Let, routine 331

Property Set, routine 331

PropertyTests, collection 307

méthode Add 308

propriété

afficher les couleurs par défaut 251

Propriétés 30

collection Fields 529

de classe 328

définir pour une classe 330

définition 324

objet Application 121

objet Connection 518

objet Field 529

Propriétés, fenêtre

afficher 51

Protect, méthode

objets Sheet et Worksheet 173

syntaxe 158

Provider, mot-clé 519

Provider_Change, événement 538

PrToFileName 164

Public, élément

procédure Function 110

procédure Sub 96

Public, instruction 328

déclarer une variable 71

mot-clé New 325

Public, mot-clé 101

Publish, méthode 579

PV, fonction

syntaxe 232

QQuadrillage

modifier la couleur 250

QueryTable, propriété 578

QueryType, propriété 380

RRaccourcis clavier

méthode OnKey 138

Rafraîchir l’écran

propriété ScreenUpdating 131

RaiseEvent, instruction 334

Range, méthode

syntaxe 184

Range, objet

méthodes

Select 180

SpecialCells 192

propriété BorderAround 257

propriété Characters 254

propriétés

NumberFormat 213

Validation 205, 217

Range, propriété 578

RangeSelection, propriété 129

RATE, fonction

syntaxe 231

RDO (Remote Database Objects) 515

ReadOnly, paramètre 144

ReadOnlyRecommended, paramètre 151

Page 638: EXCEL Microsoft Office Excel

Index

620

Recherche

expressions complexes 506

expressions simples 506

Rechercher

dans un contrôle ListBox 444

valeur dans un fichier 320

Rechercher des fichiers

collection PropertyTests 307

limiter la recherche 307

objet FileSearch 304

Rechercher, volet Office 23

RECHERCHEV, fonction

Syntaxe 24

RecordCount, propriété

objet PivotCache 380

objet PivotItem 383

objet Recordset 526

Recordset, objet

dans le modèle d’objet ADO 525

dans une requête de base de données 547

Recordset, propriété 380

Récupération de document, volet Office 23

ReDim, instruction 74

RefEdit, contrôle 446

Référencer

absolu et relatif 198

cellule dans une plage 185

cellules non contiguës 190

cellules, plage de cellules 121

ligne, colonne 190

plage sur la feuille de calcul active 184

plage sur une feuille de calcul inactive 185

procédures 107

propriété Offset 185

Références, commande 484

Refresh, méthode

collection Parameters 524

objet ListObject 579

objet PivotCache 380

RefreshDate, propriété 380

RefreshPeriod, propriété 380

RefreshTable, méthode 378

Registre

compléments COM 270

entrées du complément d’automatisation 276

sous-clé CommandLineSafe 270

sous-clé Description 270

sous-clé FriendlyName 270

sous-clé LoadBehavior 270

Remove, méthode 339

RemoveItem, méthode

objet CommandBarComboBox 408

RemoveItem, propriété

contrôle ListBox 444

Renommer

feuille de calcul 16

module 105

projet 107

Repeating, propriété 595

Répéter du texte 218

REPT, fonction

syntaxe 218

Requête

exécuter 542, 547

modifier 540

récupérer 546

ResetAllPageBreaks, méthode 172

ResetColors, méthode 246

Resize, méthode 203, 579

Result, variable 414, 416

Résultats de la recherche, volet Office 23

Resume line, instruction 93

Resume Next, instruction 93

Resume, commande 93

Ret. Arr (touche) 140

Retour (touche) 140

Retour chariot

supprimer 215

RGB, fonction

syntaxe 240

RIGHT, fonction

syntaxe 219

RightMargin, propriété 171

RootElementName, propriété 591

RoundedCorners, propriété 362

Routine de propriété

définir dans une classe 331

Row, objet

propriété Height 190

RowFields, propriété 378

RowGrand, propriété 378

RowIndex, propriété 397

Rows, propriété 190

SSampleData, méthode 340

Saut de page

définir 171

supprimer 171

Save, méthode

propriété ThisWorkbook 150

SaveAs, méthode

objet Worksheet 176

propriété ThisWorkbook 150

syntaxe 150

SaveAsCopy, méthode

propriété ThisWorkbook 152

Saved, propriété 293

SaveData, méthode 341

SaveDataSourceDefinition, propriété 591

SaveLinkValues, méthode 156

Scénario

description 17

Scénarios

autoriser les utilisateurs à les modifier 174

Scenarios, paramètre 174

Page 639: EXCEL Microsoft Office Excel

Index

621

Schéma XML

ajouter au classeur actif 582, 593

créer un schéma personnalisé 582

documents standards 584

élément Root complexe 584

enregistrer en tant que fichier XML 585

importer des données 589

mapper des éléments sur des cellules 594

mapper sur une feuille de calcul par programmation 590

Schemas, propriété 591

ScopeFolder, objet 310

méthode AddToSearchFolders 313

ScopeFolders, collection 310

ScreenUpdating, propriété 131

Scroll, événement 442

ScrollBar, contrôle

définir

distance de déplacement de l’ascenseur 442

valeurs minimum et maximum 442

ScrollBars, propriété

contrôle TextBox 436

objet UserForm 428

ScrollColumn, propriété 126

ScrollRow, propriété 126

SEARCH, fonction

syntaxe 222

Search_SearchFolders, procédure 312

SearchFolders, collection 311

SearchScopes, collection 309

SearchSubFolders, propriété 304

Section des déclarations

créer 102

Sécurité

des macros 40, 44

Select Case, instruction

règles de création 100

syntaxe 84

Select, instruction 504

clause Order By 508

clause Where 506

extraire des enregistrements 505

mot-clé Desc 508

opérateur Like 507

utiliser des caractères génériques 507

Select, méthode 180

collection Worksheets 176

Selected, propriété 444

SelectedItems, propriété 315

Selection, objet 179

Selection, propriété 129

SelectionChange, événement 295, 297

Sélectionner les cellules, boîte de dialogue

afficher avec du code 416

constante 416

Semicolon, paramètre 148

SendKeys, méthode

syntaxe 140

Séparateur

autre que les virgules 147

de cellules 146

virgules 146

Séquence clavier

affecter à une macro 35

SERIE, formule 356

syntaxe 357

Séries de données

définir la source 361

propriété HasDataLabels 360

Series, objet 356

Set New, instruction 325

Set, commande 81

Set, instruction 135

syntaxes XE 325

Set, routine 328

SetSourceData, méthode 356

SetValue, méthode 595

Shadow 362

SharePoint

volet Office Espace de travail partagé 23

volet Office Lises à jour du document 23

SharePointUrl, propriété 578

Sheet, objet

méthode Protect 173

SheetActivate, événement 289, 298

Sheets, collection

méthode

Add 166

Copy 169

Move 169

propriété

Count 165

Delete 168

Name 165

Visible 166

Shell, fonction 478

ShellExecute, fonction 479

ShortcutText, propriété 405

Show, méthode 415

objet FileDialog 315

objet UserForm 429

ShowAllItems, propriété 383

ShowAutoFilter, propriété 578

ShowDropButtonWhen, propriété 445

ShowError, propriété 206

ShowImportExportValidationErrors, propriété 591

ShowInput, propriété 206

ShowPopup, méthode 397

ShowTotals, propriété 578

Signature numérique

fonctionnement 42

protéger macro 42

protéger une macro, un classeur 43

Page 640: EXCEL Microsoft Office Excel

Index

622

Signature numérique, boîte de dialogue 55

Size, propriété 253

SmallChange, propriété 442

contrôle SpinButton 438

SOMME, fonction 226

SOMME.SI, fonction 226

Sort, propriété 526, 528

Source XML, volet Office 23

Source, propriété 526

SourceType, propriété 578

Sous-routine

marquer comme Private 335

Space, paramètre 148

SpecialCells, méthode

syntaxe 192

SpecialEffect, propriété 433

SpinButton, contrôle

définir

incrémentation 438

intervalle entre événements Change 439

valeurs minimum et maximum 438

SQL (Structured Query Language) 501

SQL Server

se connecter à des bases de données 519

SQLState, propriété 521

Start, commande 478

StartRow, paramètre 147

StartUpPosition, propriété 428

State, propriété

objet CommandBarButton 405

objet Connection 518

statements, élément

procédure Function 110

procédure Sub 96

Static, élément

procédure Function 110

procédure Sub 96

Static, mot clé 70

Static, mot-clé 108

StatusBar, propriété 130

STDEV, fonction 226

STR, fonction

syntaxe 212

Strikethrough, propriété 253

String, variable

déclarer 67

STXT, fonction

syntaxe 221

Style, propriété

contrôle ComboBox 445, 461

contrôle Multipage 468, 537

contrôle TabStrip 447

objet CommandBarButton 405

objet CommandBarComboBox 408

Sub, procédure

ajouter à un module 96

comparée avec une procédure Function 95

définir la portée 101

exécuter à partir d’une autre procédure 104

instruction Call et 104

SubAddress, paramètre de la méthode FollowHyperlink 162

Subscript, propriété 253

SUM, fonction 226

Superscript, propriété 253

SUPPRESPACE, fonction 215

Supprimer

caractères non imprimables 214

espaces blancs 215

feuille de calcul 16

Supprimer ou Supp. (touche) 140

Syntaxe

boucles

Do Until…Loop 89

Do While…Loop 89

Do…Loop Until 90

Do…Loop While 90

For Each...Next 87

For...Next 86

fonction

RGB 240

fonctions

CHERCHE 222

CTXT 212

DateAdd 235

DateDiff 236

DROITE 219

FIND 222

GAUCHE 219

InputBox 79

INTPER 229

IPMT 229

LEFT 219

MID 221

NPV 233

PMT 228

PV 232

RATE 231

RECHERCHEV 24

REPT 218

RIGHT 219

SEARCH 222

STR 212

STXT 221

TAUX 231

TROUVE 222

VA 232

VAN 233

VPM 228

formule SERIES 357

instruction

Delete 512

Insert 510

Open 317

Select 504

Update 511

instructions

Page 641: EXCEL Microsoft Office Excel

Index

623

GoTo 91

If...Then...Else 83

Select Case 84

méthode

Add, objet AddIn 264

BorderAround 257

Calculate 172

Open 144

OpenText 147

Protect 158

SaveAs 150

méthodes

Add 194

ConvertFormula 197

InputBox 134

Range 184

SendKeys 140

SpecialCells 192

Union 191

procédure

MsgBox 114

propriété

Characters 254

Colors 243

Système d'exploitation

pour les fichiers texte 147

pour un classeur 145

TTab, paramètre 148

TabFixedHeight, propriété 447

TabFixedWidth, propriété 447

TabIndex, propriété 433

Table

actualiser les valeurs 511

ajouter des lignes 511

comparée aux feuilles de calcul 499

extraire toutes les colonnes 505

jointure 508

supprimer des lignes 512

virtuelle 500

Tableau

copier dans un document Word actif 492

créer 72

créer un graphique 358

index 72

instruction Option Base 72

limites 72

limites supérieure et inférieure 72

redimensionner 74

retrouver une valeur 74

Tableau croisé dynamique

autoriser les utilisateurs à les exploiter 175

bases de données OLAP 373

créer avec l’assistant 370

créer par programmation 384

enregistrer les positions 389

objet PivotTable 374

pivoter manuellement 386

pivoter par programmation 387

présentation 367

réinitialiser la position d’origine 389

restaurer les positions 391

Tableau croisé dynamique Voir aussi Graphique croisé dynamique

Tableau de données

afficher 361

Tableau dynamique

déclarer 73

Tableau multidimensionnel

déclarer 73

Tableaux

définir les limites 203

plages de cellules et 202

Tableur

comparé aux bases de données 499

TabOrientation, propriété 447

Tabs, collection 446

TabStop, propriété 433

TabStrip, contrôle

accepter plusieurs rangées d’onglets 447

ajouter une feuille 447

ajouter, supprimer un onglet 446

définir

style des onglets 447

orientation des onglets 447

taille des onglets 447

Tabulation (touche) 140

Tabulations

supprimer 215

Tag, propriété 465

objet CommandBarControl 404

TAUX, fonction

syntaxe 231

Terminate, événement 335, 430

Text, propriété

contrôle ListBox 444

contrôle TextBox 452

TextBox, contrôle

à plusieurs lignes 436

associé à un contrôle SpinButton 439

barres de défilement 436

définir le nombre maximum de caractères 437

masquer les caractères 437

placer sur une feuille 451

renvoi à la ligne 436

TextCodePage, paramètre 151

Texte

concaténer 217

répéter 218

TextLength, propriété 437

TextOrProperty, propriété 307

TextQualifier, paramètre 148

TextVisualLayout, paramètre

méthode OpenText 148

méthode SaveAs 151

ThisWorkbook, module 532

Page 642: EXCEL Microsoft Office Excel

Index

624

ThisWorkbook, propriété 132

méthode

AddToFavorites 161

Close 153

FullName 155

Path 155

Save 150

SaveAs 150

SaveAsCopy 152

SaveLinkValues 156

ThousandsSeparator, paramètre 148

Titre de graphique

afficher 361

To, paramètre 164

ToggleButton, contrôle 438

TooltipText, propriété 404

Top, propriété

contrôle UserForm 433

objet ChartObject 362

objet CommandBar 397

objet CommandBarControl 404

objet UserForm 428

TopIndex, propriété 444

TopMargin, propriété 171

TotalsRowRange, propriété 578

Touches

codes des modificateurs 140

méthode SendKeys 140

récupérer les frappes de 140

TrailingMinusNumbers, paramètre 149

TransactionEffect, propriété 448

TRIM, fonction 215

TROUVE, fonction

syntaxe 222

Twip, définition 80

Type d’objet

propriété Selection 129

Type de données

abstrait 30

Type de graphique

propriété ChartType 361

type, élément

procédure Function 110

Type, instruction

créer des types de données personnalisés 81

Type, paramètre

d’une balise d’élément 585

Type, propriété 206

objet CommandBar 397

objet CommandBarControl 404

objet Field 529

objet Parameter 525

Types de données

chaînes 67

conversion 68

Date 67

personnalisés 81

String 67

UUBound, fonction 203

Underline, propriété 253

UnderlyingValue, propriété 529

Union, méthode

syntaxe 191

Unlink, méthode 579

Unlist, méthode 579

Unload, méthode

objet UserForm 429

Unprotect, méthode 159, 176

Update, instruction 511

Update, méthode 526

UpdateChanges, méthode 579

UpdateLinks, paramètre 144

User ID, mot-clé 520

UserForm 51

UserForm Voir aussi Feuille UserForm

UserForm, contrôles

afficher les contrôles masqués 468

définir

aspect visuel 433

couleur de fond 432

couleur de premier plan 433

hauteur 433

largeur 433

position 433

position dans l’ordre des tabulations 433

position dans la hiérarchie d’affichage 433

texte de survol 433

texte du contrôle 432

désactiver les boutons 469

focus 433

verrouiller 433

UserForm, objet

activer 428

afficher 429

boutons de navigation 456

charger 429

construire un assistant 466

créer 451

décharger 429

définir

barres de défilement 428

couleur de fond 428

hauteur 428

image de fond 428

largeur 428

mode 429

valeur de la barre de titre 428

masquer 429

positionner 428

UserForm_Initialize, événement

créer 457

dans le programme Excel Query 537, 540

définir la variable LastRow 458

Page 643: EXCEL Microsoft Office Excel

Index

625

UserForm_Terminate, événement 541

UserInterfaceOnly, paramètre 174

utf-16, codage des schémas 584

utf-8, codage des schémas 584

Utilitaire d’analyse - VBA, macro complémentaire Excel 260

Utilitaire d’analyse, macro complémentaire Excel 260

VVA, fonction

syntaxe 232

Valeur

rechercher dans un fichier 320

Valeur actuelle nette, calculer 233

Valeur actuelle, calculer 232

Validation, propriété 205, 217

Valider

données 205

Value, propriété 206

contrôle Multipage 468

contrôle UserForm 433

objet Field 529

objet Parameter 525

objet Path 595

objet PivotField 383

objet PivotItem 383

VAN, fonction

syntaxe 233

Variable

assigner une valeur 71

déclarer 65

durée de vie 69

publique/privée 71

réinitialiser 54

visibilité 70

Variable objet

créer 81, 487

objets avec plusieurs 327

référencer des applications 483

Variable statique

déclarer 70

Variables

marquer comme Private 335

Variables de classe

définir 330

référencer 336

Variables locales, fenêtre

afficher 51

Variant, variable 68

copier des données 202

VBA pour l’Assistant Internet, macro complémentaire Excel 261

vbAbort, constante 78

vbAbortRetryIgnore, constante 76

vbApplicationModal, constante 77

vbBlack, constante 239, 241

vbBlue, constante 240, 241

vbCancel, constante 78

vbCr, constante 75

vbCritical, constante 76

vbCrLf, constante 75, 473

vbCyan, constante 240, 241

vbDefaultButton1, constante 77

vbDefaultButton2, constante 77

vbDefaultButton3, constante 77

vbDefaultButton4, constante 77

vbExclamation, constante 77

vbFirstFourDays, constante 237

vbFirstFullWeek, constante 237

vbFirstJan1, constante 237

vbFriday, constante 237

vbGreen, constante 239, 241

vbIgnore, constante 78

vbInformation, constante 77

vbLf, constante 75

vbMagenta, constante 240, 241

vbModal, valeur 462

vbModeless, valeur 462

vbMonday, constante 237

vbMsgBoxHelpButton, constante 77

vbMsgBoxRight, constante 77

vbMsgBoxRtlReading, constante 77

vbMsgBoxSetForeground, constante 77

vbNo, constante 78

vbOk, constante 78

vbOkCancel, constante 76

vbOkOnly, constante 76

vbQuestion, constante 77

vbRed, constante 239, 241

vbRetry, constante 78

vbRetryCancel, constante 76

vbSaturday, constante 237

vbSunday, constante 237

vbSystemModal, constante 77

vbThursday, constante 237

vbTuesday, constante 237

vbUseSystem, constante 237

vbWednesday, constante 237

vbWhite, constante 240, 241

vbYellow, constante 239, 241

vbYes, constante 78

vbYesNo, constante 76

vbYesNoCancel, constante 76

Verr. Maj (touche) 140

Verr. Num (touche) 140

Virus macro 40

Visible, propriété 362

collections Sheets et Worksheets 166

contrôle UserForm 433

objet ActiveWindow 354

objet CommandBar 397

Page 644: EXCEL Microsoft Office Excel

Index

626

objet CommandBarControl 404

objet PivotItem 383

VisibleFields, propriété 378

Visual Basic .NET

générer le complément 281

installer le complément COM 282

Visual Basic 6

créer un complément d’automatisation 272

installer un complément d’automatisation 275

Visual Basic Editor

afficher une macro 47

ouvrir 47

personnaliser 56

Visual Basic .NET

créer un complément COM 277

Volets Office

Accueil 23

Aide 23

Espace de travail partagé 23

Image clipart 22

Mises à jour du document 23

Nouveau classeur 23

Presse-papiers 22

Rechercher 23

Récupération de document 23

Résultats de la recherche 23

Source XML 23

afficher 584

bouton Options 589

VPM, fonction

syntaxe 228

Vue (Access) 500

WWait, méthode 130

Weight, propriété 257

Where, clause

dans une instruction Select 506

dans une instruction Update 512

opérateurs de comparaison 506

Width, propriété

contrôle UserForm 433

objet ChartObject 362

objet CommandBar 397

objet CommandBarControl 404

objet UserForm 428

Window, objet

propriété Caption 126

With...End With, commande 82

WithEvents, mot-clé 329, 353

WizardApp.xls, exemple d’application 464

Word, application

accéder à des documents actifs 492

copier des informations dans Excel 491

créer un nouveau document 493

créer une instance de l’application 482

créer une liaison dynamique avec 482

ouvrir un document 490

Workbook, objet

créer 489

créer une procédure d’événement 288

de niveau supérieur 489

événement

Activate 290

BeforeClose 293

BeforePrint 292

BeforeSave 291

Deactivate 292

NewSheet 291

Open 290

méthode

Activate 160

Protect 158

méthode ResetColors 246

propriété

Saved 293

propriété Colors 243

propriété Names 194

propriété ThisWorkbook 132

Workbook_Activate, événement 290

Workbook_Activate, macro 266

Workbook_BeforeClose

dans le programme Excel Query 535

Workbook_BeforeClose, événement 293, 466

Workbook_BeforePrint, événement 292

Workbook_BeforeSave, événement 291

Workbook_Close, macro 266

Workbook_Deactivate, événement 292

Workbook_Deactivate, macro 266

Workbook_NewSheet, événement 291

Workbook_Open, événement 289, 293

dans le programme Excel Query 533

module ThisWorkbook 465

Workbook_Open, macro 266

WorkbookOpen, événement 298

Workbooks, collection

méthode

Activate 152

Open 144

OpenText 147

propriété Colors 246

Worksheet, objet

créer une procédure d’événement 294

Page 645: EXCEL Microsoft Office Excel

Index

627

événement

BeforeRightClick 297

Change 296

SelectionChange 297

méthode

Calculate 172

Protect 173

propriété

PageSetup 170

Worksheet_BeforeRightClick, événement 297

Worksheet_Change, événement 296

appel itératif 286

Worksheet_SelectionChange, événement 297

WorksheetFunction, objet

appeler des fonctions en tant que propriétés 215

appeler la fonction PMT 229

appeler les fonctions SEARCH et FIND 223

utiliser 214

Worksheets, collection

méthode

Calculate 172

Select 176

propriété

Count 165

Delete 168

Visible 166

Write #, instruction 318

WriteReserved, propriété 157

WriteResPassword, paramètre

méthode Open 145

méthode SaveAs 151

XxlBackgroundAutomatic,

constante 253

xlBackgroundOpaque, constante 253

xlBackgroundTransparent, constante 253

xlBetween, constante 205

XlBordersIndex, constantes 257

xlBorderWeight, constantes 257

xlCalculate, constantes 173

xlChart, constante 167

XlCmdType, énumération 379

xlColorIndexAutomatic, constante 251, 257

xlColorIndexNone, constante 257

xlColumnDataType, constantes 148

xlDialog, constantes 414

xlDialogAlignment, constante 417

xlDialogBorder, constante 417

xlDialogCellProtection, constante 417, 418

xlDialogDataValidation, constante 414

xlDialogDefineName, constante 414

xlDialogFont, constante 420

xlDialogFontProperties, constante 417

xlDialogFormatNumber, constante 417

xlDialogFormulaGoto, constante 415

xlDialogOpen, constante 414

xlDialogPatterns, constante 417

xlDialogSelectSpecial, constante 416

xlDisplayShapes, constante 155

xlDot, constante intrinsèque 66

xlEqual, constante 205

xlErrors, constante 193

xlExcel4IntMacroSheet, constante 167

xlExcel4MacroSheet, constante 167

xlGreater, constante 205

xlGreaterEqual, constante 205

xlHide, constante 155

xlInputOnly, type de validation 206

xlLess, constante 205

xlLessEqual, constante 205

xlLineStyle, constantes 257

XlListConflict, constantes 579

XlListObjectSourceType, constantes 580

xlLocationAsNewSheet, propriété 347

xlLocationAsObject, propriété 347

xlLocationAutomatic, propriété 347

xlLogical, constante 193

xlNoRestrictions, constante 175

xlNoSelection, constante 175

xlNotBetween, constante 205

xlNotEqual, constante 205

xlNumbers, constante 193

XlPattern, constantes 255

XlPivotFieldDataType, énumération 382

XlPivotFieldOrientation, types 382

XlPivotFormatType, formats 377

xlPlaceHolders, constante 155

XlQueryType, constantes 380

xlReferenceStyle, constantes 197

xlReferenceType, constantes 197

XlSaveConflictResolution, constantes 151

xlSheetHidden, constante 166

xlSheetVeryHidden, constante 166

xlSheetVisible, constante 166

XlTextParsingType, constantes 147

XlTextQualifier, constantes 148

xlTextValues, constante 193

xlUnderline, constantes 253

Page 646: EXCEL Microsoft Office Excel

Index

628

xlUnlockedCells, constante 175

xlValidAlertInformation, constante 205

xlValidAlertStop, constante 205

xlValidAlertWarning, constante 205

xlValidateCustom, constante 206

xlValidateCustom, type de validation 206

xlValidateDate, constante 206

xlValidateDate, type de validation 207

xlValidateDecimal, constante 206

xlValidateDecimal, type de validation 207

xlValidateInputOnly, constante 206

xlValidateList, constante 206

xlValidateList, type de validation 207

xlValidateTextLength, constante 206

xlValidateTextLength, type de validation 207

xlValidateTime, constante 206

xlValidateTime, type de validation 207

xlValidateWholeNumber, constante 206

xlValidateWholeNumber, type de validation 207

xlWorksheet, constante 167

xlXmlExportSuccess, constante 591

xlXmlExportValidationFailed, constante 591

xlXmlImportElementsTruncated, constante 592

xlXmlImportSuccess, constante 592

xlXmlImportValidationFailed, constante 592

XML

ajouter manuellement à un classeur 587

ajouter une feuille de calcul par programmation 590

éléments 585

importer des données 589

mappage 590

supprimer un élément 589

XmlMap, propriété 578

XmlMaps, collection 593

XValues, propriété 359

ZZone de liste modifiable,

contrôle Voir ComboBox, contrôle

Zone de liste, contrôle Voir ListBox, contrôle

Zone de texte, contrôle Voir TextBox, contrôle

Zone Nom 21

Zone Tapez une question 22

Zone_d_impression, nom réservé 199

Zone_d_impression, plage 200

Zone_de_consolidation, nom réservé 199

Zoom

fenêtre, niveau de 126

Zoom, propriété 126, 171

ZOrder, méthode 433