Top Banner
382

Excel 2007 VBA

Feb 07, 2016

Download

Documents

eleve
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Excel 2007 VBA
Page 2: Excel 2007 VBA

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 de la version française : DunodDistribution : Hachette Livre DistributionCouverture : MateoAdapté de l’américain par : Fabrice LemainqueMise en page : ArclemaxISBN : 978-2-10-05 4-2

Les programmes figurant dans ce livre, et éventuellement sur la disquette ou le CD-ROM

d’accompagnement, sont fournis gracieusement sous forme de code source, à titre d’illustration.Ils sont fournis en l’état sans garantie aucune quant à leur fonctionnement une fois compilés,assemblés ou interprétés dans le cadre d’une utilisation professionnelle ou commerciale. Ils peuvent nécessiter des adaptations et modifications dépendant de la configuration utilisée.Microsoft Press ne pourra en aucun cas être tenu responsable des préjudices ou dommages 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 à la date 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, Microsoft Press, ActiveX, Calibri, Excel, Groove, InfoPath, Internet Explorer, MS-DOS,OneNote, Outlook, PivotTable, PowerPoint, SharePoint, SQL Server, Visio, Visual Basic, VisualStudio, Win32, Windows, Windows Server, et Windows Vista sont soit des marques déposées,soit des marques de Microsoft® Corporation aux États-Unis ou/et d’autres pays.

Copyright 2007 by Microsoft® Corporation.

Original English language edition Copyright © 2007 by Reed Jacobson. All rights published byarrangement with the original publisher, Microsoft Press, a division of Microsoft Corporation,Redmond, Washington, U.S.A.

Titre U.S. : Microsoft® Office Excel® 2007 Visual Basic® For Applications Step by StepISBN U.S. : 978-0-7356-2402-3

815

Page 3: Excel 2007 VBA

Sommaire

Caractéristiques et conventions de ce livre. . . . . iEmploi des fichiers d’accompagnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iii

Contenu des fichiers d’accompagnement. . . . . . . . . . . . . . . . . . . . . . . . .iii

Exigences système minimales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iv

Exercices étape par étape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iv

Système Microsoft Office 2007. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .iv

Installation des fichiers d’exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .vi

Emploi des fichiers d’exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii

Suppression et désinstallation des fichiers d’exercice . . . . . . . . . . . . . . . . . vii

Obtention d’aide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .viii

Obtention d’aide sur ce livre et les fichiers d’accompagnement . . . . .viii

Informations complémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .viii

1 Création d’une macro pour effectuer des tâches simples . . . . . . . . . . . . . . . . . . . . . . . . .1Différence entre VBA et une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Création d’une macro simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Mise en forme monétaire à l’aide d’un outil intégré . . . . . . . . . . . . . . . . 6

Exécution de la macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Affectation d’une touche de raccourci à la macro . . . . . . . . . . . . . . . . . . 9

Examen d’une macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Enregistrement du classeur de macro . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Modification simultanée de plusieurs propriétés . . . . . . . . . . . . . . . . . . . . 14

Création d’en-têtes de lignes à l’aide d’une commande . . . . . . . . . . . . 14

Enregistrement d’une macro de fusion verticale de cellules . . . . . . . . 16

Élimination des lignes superflues de la macro . . . . . . . . . . . . . . . . . . . . 18

Page 4: Excel 2007 VBA

Sommaire

Manipulation de propriétés enregistrées . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Enregistrement d’une macro de suppression d’élément de fenêtre . . 19

Exécution d’une macro depuis l’éditeur Visual Basic. . . . . . . . . . . . . . . 20

Emploi d’une macro pour inverser la valeur d’une propriété. . . . . . . . 21

Élimination des objets répétés dans une macro enregistrée . . . . . . . . 22

Exécution d’une macro depuis la barre d’outils Accès rapide. . . . . . . . 23

Enregistrement de méthodes dans une macro . . . . . . . . . . . . . . . . . . . . . . 25

Conversion d’une formule en valeur à l’aide de commandes du menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Conversion d’une formule en valeur à l’aide d’une macro . . . . . . . . . . 27

Amélioration de la lisibilité d’une longue instruction . . . . . . . . . . . . . . 29

Approbation des classeurs prenant en charge les macros . . . . . . . . . . . . . 30

Spécification d’un emplacement approuvé pour les macros . . . . . . . . 30

Désignation d’un éditeur de macros approuvé . . . . . . . . . . . . . . . . . . . 32

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

2 Création d’une macro pour effectuer des tâches complexes . . . . . . . . . . . . . . . . . . . . . 39

Tâche un : ouverture du fichier d’état . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Ouverture d’un fichier texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Examen pas à pas de l’exécution d’une macro . . . . . . . . . . . . . . . . . . . . 43

Sélection d’un fichier pendant l’exécution d’une macro . . . . . . . . . . . . 47

Tâche deux : remplissage des étiquettes manquantes . . . . . . . . . . . . . 49

Sélection uniquement des cellules vides . . . . . . . . . . . . . . . . . . . . . . . . . 50

Remplissage de la sélection à l’aide de valeurs . . . . . . . . . . . . . . . . . . . 51

Enregistrement du remplissage des valeurs manquantes. . . . . . . . . . . 52

Examen de l’exécution de la macro RemplirLibelles . . . . . . . . . . . . . . . 53

Tâche trois : ajout d’une colonne de dates . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Ajout d’une date constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Parcours de la macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Invite de saisie d’une date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Tâche quatre : ajout à la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Ajout de données à la liste maître . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Page 5: Excel 2007 VBA

Sommaire

Exécution pas à pas de la macro AjouterDonnees. . . . . . . . . . . . . . . . . 59

Enregistrement d’un mouvement relatif . . . . . . . . . . . . . . . . . . . . . . . . . 61

Choix d’enregistrer ou non les modifications lors de la fermeture d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Tâche cinq : suppression de la feuille de calcul . . . . . . . . . . . . . . . . . . . . . . 65

Création d’une macro de suppression de la feuille de calcul active . . 65

Fonctionnement silencieux de la macro . . . . . . . . . . . . . . . . . . . . . . . . . 66

Assemblage des morceaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Enregistrement d’une macro qui exécute d’autres macros . . . . . . . . . . 67

Simplification des instructions de sous-routine . . . . . . . . . . . . . . . . . . . 68

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

3 Classeurs et feuilles de calcul . . . . . . . . . . . . . . .71Définition d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Les objets appartiennent à des collections . . . . . . . . . . . . . . . . . . . . . . . 72

Un objet possède des propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Les objets possèdent des méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Une méthode peut modifier des propriétés. . . . . . . . . . . . . . . . . . . . . . 76

Une propriété peut impliquer une action . . . . . . . . . . . . . . . . . . . . . . . . 76

Classeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Ajout d’un nouveau classeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Comptage des classeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

Fermeture des classeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Référence à un unique classeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Référence à un classeur d’après son nom . . . . . . . . . . . . . . . . . . . . . . . . 86

Référence à un classeur par pointage . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Modification d’une valeur de propriété d’un classeur. . . . . . . . . . . . . . 87

Feuilles de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Ajout d’une nouvelle feuille de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Modification de nom et suppression d’une feuille de calcul . . . . . . . . 89

Examen de la valeur renvoyée par la méthode Delete . . . . . . . . . . . . . 90

Examen du résultat de la méthode Add . . . . . . . . . . . . . . . . . . . . . . . . . 90

Copie d’une feuille de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

Page 6: Excel 2007 VBA

Sommaire

Manipulation de plusieurs feuilles de calcul . . . . . . . . . . . . . . . . . . . . . . 92

Déclaration de variables pour autoriser les Auto Lists . . . . . . . . . . . . . 94

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

4 Objets de plages . . . . . . . . . . . . . . . . . . . . . . . . . 99Référence à une plage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Référence à une plage à l’aide d’une adresse . . . . . . . . . . . . . . . . . . . . 100

Référence à une plage comme collection de cellules . . . . . . . . . . . . . 104

Référence à une plage comme collection de lignes ou de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Référence à une plage d’après la cellule active . . . . . . . . . . . . . . . . . . 109

Référence aux sous-ensembles d’une plage . . . . . . . . . . . . . . . . . . . . . 113

Référence à une plage relative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Amélioration de sélections enregistrées . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

Simplification des paires Select…Selection . . . . . . . . . . . . . . . . . . . . . . 119

Simplification de la sélection de groupes . . . . . . . . . . . . . . . . . . . . . . . 120

Saisie de valeurs et de formules dans une plage . . . . . . . . . . . . . . . . . . . . 122

Références relatives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Références absolues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

Style de référence L1C1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Insertion de valeurs et de formules dans une plage . . . . . . . . . . . . . . 126

Construction de formules pour remplir une grille . . . . . . . . . . . . . . . . 129

Mise en forme d’une plage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Ajout de bordures à une plage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Mise en forme de l’intérieur d’une plage . . . . . . . . . . . . . . . . . . . . . . . 137

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

5 Objets de données . . . . . . . . . . . . . . . . . . . . . . 145Travail avec les tableaux Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Création d’un nouveau fichier à partir d’une feuille de calcul existante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Création d’un tableau à partir d’une source interne . . . . . . . . . . . . . . 149

Création d’un tableau à partir d’une source externe . . . . . . . . . . . . . . 151

Enregistrement d’une macro pour manipuler un tableau . . . . . . . . . 154

Manipulation des colonnes d’un tableau . . . . . . . . . . . . . . . . . . . . . . . 157

Manipulation des totaux et des filtres de tableau . . . . . . . . . . . . . . . . 159

Page 7: Excel 2007 VBA

Sommaire

Travail avec des tableaux croisés dynamiques . . . . . . . . . . . . . . . . . . . . . . 162

Création d’un tableau croisé dynamique à partir d’une source interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Création d’un tableau croisé dynamique à partir d’une source externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

Enregistrement d’une macro pour définir la structure du tableau croisé dynamique. . . . . . . . . . . . . . . . . . . . . . . 167

Définition de la structure du tableau croisé dynamique . . . . . . . . . . 169

Enregistrement d’une macro pour personnaliser l’aspect d’un tableau croisé dynamique. . . . . . . . . . . . . . . . . . . . . . . . . 171

Personnalisation d’un tableau croisé dynamique. . . . . . . . . . . . . . . . . 174

Enregistrement d’une macro pour personnaliser un style de tableau croisé dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . 177

Personnalisation du style d’un tableau croisé dynamique . . . . . . . . . 180

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

6 Objets de graphisme . . . . . . . . . . . . . . . . . . . . .185Objets de graphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

Emploi des cellules de feuille de calcul comme quadrillage de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

Ajout d’un dégradé à une cellule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Ajout d’une forme remplie d'un dégradé . . . . . . . . . . . . . . . . . . . . . . . 192

Référence à une forme sélectionnée . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Emploi d’une forme automatique pour créer un logo . . . . . . . . . . . . 198

Emploi de regroupement de formes pour créer des boutons de macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

Examen des objets de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Création d’un graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Synchronisation de deux graphiques. . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Mise en forme de la zone de données d’un graphique . . . . . . . . . . . 216

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

7 Contrôle de Visual Basic . . . . . . . . . . . . . . . . . .219Emploi d’expressions conditionnelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Prise de décision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Prise de décision double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

Page 8: Excel 2007 VBA

Sommaire

Poser une question . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Test de la validité d’une entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

Demande à l’aide d’un message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

Création de boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

Parcours d’une collection à l’aide d’une boucle For Each . . . . . . . . . . 230

Boucle à l’aide d’un compteur avec une boucle For . . . . . . . . . . . . . . 232

Boucle infinie à l’aide d’une boucle Do . . . . . . . . . . . . . . . . . . . . . . . . . 235

Gestion de grandes boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

Définition d’un point d’arrêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

Définir un point d’arrêt temporaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

Affichage de la progression dans une boucle . . . . . . . . . . . . . . . . . . . 243

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

8 Extension d’Excel et de Visual Basic . . . . . . . . 247Création de fonctions personnalisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

Emploi d’une fonction personnalisée de feuille de calcul. . . . . . . . . . 249

Ajout d’arguments à une fonction personnalisée . . . . . . . . . . . . . . . . 250

Fonction volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

Arguments facultatifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

Emploi d’une fonction personnalisée à partir d’une macro . . . . . . . . 255

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

Erreurs de syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

Erreurs de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

Erreurs de logique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

Erreurs d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

Ignorer une erreur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

Ignorer une erreur en toute sécurité à l’aide d’une sous-routine . . . 259

Ajout d’arguments pour généraliser une sous-routine . . . . . . . . . . . . 261

Vérification d’erreur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

Boucle jusqu’à l’élimination d’une erreur . . . . . . . . . . . . . . . . . . . . . . . 264

Capture d’une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

Page 9: Excel 2007 VBA

Sommaire

9 Lancement de macros à l’aide d’événements . . . . . . . . . . . . . . . . . . . .273Création de boutons de commande personnalisés. . . . . . . . . . . . . . . . . . 274

Essai des macros ZoomIn et ZoomOut . . . . . . . . . . . . . . . . . . . . . . . . . 274

Activation de l’onglet Développeur du ruban . . . . . . . . . . . . . . . . . . . 276

Création d’un bouton de commande personnalisé . . . . . . . . . . . . . . . 276

Liaison d’un bouton de commande à une macro . . . . . . . . . . . . . . . . 279

Création de votre propre gestionnaire d’événement . . . . . . . . . . . . . 281

Réponse d’un bouton au déplacement de la souris . . . . . . . . . . . . . . 282

Exploration du projet Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

Gestion d’événements de feuille de calcul et de classeur . . . . . . . . . . . . . 287

Exécution d’une procédure suite à une modification de la sélection287

Gestion d’un événement sur n’importe quelle feuille de calcul . . . . . 288

Supplanter un événement de classeur . . . . . . . . . . . . . . . . . . . . . . . . . 290

Annulation d’un événement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul . . . . . . . .297Emploi d’un calculateur de remboursements d’emprunt . . . . . . . . . . . . . 298

Création du modèle de Remboursement d’emprunt. . . . . . . . . . . . . . 298

Emploi du modèle de remboursement d’emprunt . . . . . . . . . . . . . . . 300

Création d’un calculateur de remboursement d’emprunt résistant aux erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

Restriction de la durée à une plage valide . . . . . . . . . . . . . . . . . . . . . . 301

Limitation de l’apport personnel à une valeur acceptable . . . . . . . . . 303

Restriction du taux d’intérêt à des valeurs valides . . . . . . . . . . . . . . . . 305

Récupération d’une valeur depuis une liste . . . . . . . . . . . . . . . . . . . . . . . . 306

Préparation d’une liste de véhicules. . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

Récupération du prix de la liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

Définition de la largeur des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . 310

Protection de la feuille de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

Création d’un gestionnaire d’événement pour la zone de liste déroulante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

Page 10: Excel 2007 VBA

Sommaire

Protection de la feuille de calcul. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315

11 Création d’un formulaire personnalisé . . . . . . 317Création de l’interface utilisateur d’un formulaire . . . . . . . . . . . . . . . . . . . 318

Création du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

Ajout de boutons d’option. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

Ajout d’une case à cocher avec une zone de texte associée . . . . . . . 323

Initialisation de la zone de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

Ajout de boutons de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

Définition de l’ordre de tabulation de contrôles . . . . . . . . . . . . . . . . . 330

Préparation de la fonctionnalité d’un formulaire. . . . . . . . . . . . . . . . . . . . 331

Création d’affichages personnalisés d’une feuille de calcul . . . . . . . . 332

Création d’une macro pour basculer entre les affichages . . . . . . . . . 334

Masquage dynamique de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

Mise en œuvre d’un formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

Mise en œuvre de boutons d’option . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

Mise en œuvre d’une case à cocher . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

Contrôle des erreurs dans une zone de texte. . . . . . . . . . . . . . . . . . . . 342

Impression du rapport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

Lancement du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Points clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

Annexe : Un système d’information d’entreprise complet. . . . . . . . . . . . . . . . . . . . . 349

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353

Page 11: Excel 2007 VBA

i

Caractéristiques et conventions de ce livre

Ce livre a été conçu pour vous guider étape par étape à travers toutes les tâchesqu’il vous faudra accomplir pour créer des macros avec Microsoft Off iceExcel 2007. Si vous commencez au début et suivez tous les exercices, vous allezacquérir assez d’expérience pour pouvoir accomplir de nombreux types différentsde tâches à l’aide de macros. Chaque sujet est autonome, mais les chapitres sup-posent généralement que vous maîtrisez les sujets abordés dans les chapitres pré-cédents. Si vous avez déjà travaillé avec une version précédente d’Excel ou si vousavez réalisé tous les exercices et cherchez par la suite à vous remémorer une pro-cédure, les caractéristiques suivantes de ce livre vous aideront à localiser lestâches spécifiques relatives aux macros Excel 2007 :

● Table des matières détaillée. Recherchez le thème concerné dans la liste desrubriques et encadrés de chaque chapitre.

● Onglets de chapitre. Repérez facilement le début du chapitre recherché.

● En-têtes spécifiques au sujet. Au sein d’un chapitre, l’en-tête qui figure surles pages impaires décrit le sujet abordé.

● Index détaillé. Recherchez des dispositifs et tâches spécifiques ainsi que desconcepts plus généraux dans l’index, conçu avec soin pour le lecteur.

● Exercices d’accompagnement (en téléchargement). Ils renferment outre lesfichiers nécessaires aux exercices étape par étape d’autres ressources utiles.

Si vous découvrez Excel 2007, vous pourriez ne pas disposer du temps nécessaireà l’exploration de l’interface utilisateur de Microsoft Office, apparue avec Micro-soft Office 2007. Les instructions étape par étape vous demanderont fréquem-ment de cliquer sur des boutons du ruban Office, en précisant l’onglet sur lequelcliquer et le groupe auquel appartient le bouton. Vous ne devriez rencontreraucune difficulté à suivre ces instructions.

Vous pourrez gagner du temps lors de l’emploi de ce livre en comprenant com-ment la collection Étape par étape signale les instructions spéciales, les touches àenfoncer, les boutons sur lesquels cliquer, etc. Le tableau suivant vous indique toutce que vous devez savoir.

Page 12: Excel 2007 VBA

ii Présentation d’Excel 2007

Convention Signification

Cette icône indique une référence vers les fichiers d’exercice.

SERVEZ-VOUS Ce paragraphe, présent avant le premier exercice de chaque chapitre, indique le ou les fichiers à employer au cours des exercices.

VEILLEZ A Ce paragraphe, présent avant le premier exercice de chaque chapitre, indique toute exigence préalable nécessaire à la réalisation de l’exercice ou toute action à effectuer pour restaurer votre système à la fin de l’exercice.

OUVREZ Ce paragraphe, présent avant le premier exercice de chaque chapitre, indique le ou les fichiers à ouvrir avant de commencer l’exercice.

FERMEZ Ce paragraphe, situé à la fin de chaque chapitre, indique les fichiers ou programmes à fermer avant de passer à un autre sujet.

1 Les étapes numérotées vous guident dans les exercices étape par étape et dans les procédures exploratoires.

➜ Une flèche indique un exercice qui ne possède qu’une unique étape

Voir aussi Ces remarques vous mènent vers des informations complémentaires, situées ou non dans le livre.

Dépannage Ces remarques proposent des astuces utiles ou des informations sur d’autres options disponibles.

Astuce Ces remarques proposent des astuces utiles pour faciliter l’accomplissement d’une tâche ou procurent des informations sur d’autres options disponibles.

Important Ces remarques insistent sur des informations indispensables à l’accomplissement d’une procédure.

Ctrl+Début Un signe plus (+) placé entre deux noms de touches signifie que vous devez appuyer sur la première touche et la garder enfoncée tandis que vous appuyez sur la seconde. Par exemple, « appuyez sur CTRL+DÉBUT » signifie « maintenez enfoncée la touche CTRL tandis que vous appuyez sur DÉBUT ».

Éléments de l’interface du programme

Dans les étapes, les noms des éléments de l’interface utilisateur du programme, comme les boutons, les commandes et les boîtes de dialogue, figurent en gris.

Entrée utilisateur Tout ce que vous devez saisir apparaît en caractères gras.

Italiques Les italiques servent à insister sur de nouveaux termes.

Page 13: Excel 2007 VBA

Présentation d’Excel 2007 iii

Emploi des fichiers d’accompagnementVous devez télécharger sur le site dunod.com associé au livre les fichiers d’exerciceque vous allez employer dans les exercices de ce livre, ainsi que d’autres ressour-ces électroniques qui vous aideront lors de l’apprentissage de l’emploi des macrosVBA avec Microsoft Office Excel 2007.

Contenu des fichiers d’accompagnementLe tableau suivant énumère les fichiers d’exercices proposés. Remarquez que cer-tains fichiers sont employés dans plusieurs chapitres.

Astuce Le dossier ExcelVBA07SBS contient un sous-dossier nommé Finis. Celui-cirenferme la version achevée du classeur de chaque chapitre. Le dossier Finis n’estjamais explicitement cité dans le texte, mais reste à votre disposition. Si vouséprouvez des difficultés à faire fonctionner correctement une macro, examinez cel-les du dossier Finis pour vous aider à résoudre le problème.

Chapitre Dans le dossier ExcelVBA07SBS

Dans le dossier Finis

Chapitre 1 : Création d’une macro pour effectuer des tâches simples

Budget.xlsx Chapitre01.xlsm

Chapitre 2 : Création d’une macro pour effectuer des tâches complexes

Nov2007.txtOrders.xlsx

Chapitre02.xlsm

Chapitre 3 : Classeurs et feuilles de calcul Néant Néant

Chapitre 4 : Objets de plages Ranges.xlsx Chapitre04.xlsm

Chapitre 5 : Objets de données Orders.xlsxOrders.accdb

Chapitre05.xlsm

Chapitre 6 : Objets graphiques Graphics.xlsxMakeLogo.txtMakeMap.txt

Chapitre06.xlsm

Chapitre 7 : Contrôle de Visual Basic Flow.xlsx Flow.txt Chapitre07.xlsm

Chapitre 8 : Extension d’Excel et de Visual Basic Structure.txt Chapitre08.xlsm

Chapitre 9 : Lancement de macros à l’aide d’événements

Events.txt Chapitre09.xlsm

Chapitre 10 : Emploi de contrôles Boîte de dialogue sur une feuille de calcul

Loan.xlsxChapitre10.xlsm

Page 14: Excel 2007 VBA

iv Présentation d’Excel 2007

Exigences système minimalesExercices étape par étapeOutre le matériel, le logiciel et les connexions nécessaires à l’exécution du systèmeMicrosoft Office 2007, vous devez disposer des éléments suivants pour réaliser lesexercices de ce livre :

● Excel 2007

● Un espace disque libre de 10 Mo pour les fichiers d’exercice

Système Microsoft Office 2007Pour ce livre, vous n’avez pas besoin de disposer de la totalité du système Micro-soft Office 2007. Seul Excel est nécessaire. Ce qui suit n’est proposé qu’à titred’information.

Le système Microsoft Office 2007 renferme les produits suivants :

● Microsoft Office Access 2007

Chapitre Dans le dossier ExcelVBA07SBS

Dans le dossier Finis

Chapitre 11 : Création d’un formulaire personnalisé

Budget.xlsx Chapitre11.xlsm

Annexe : Système d’information d’entreprise complet

EIS.xlsmOrders.accdb

Néant

Important Les fichiers d’accompagnement de ce livre ne renferment pas le logi-ciel Microsoft Office Excel 2007. Vous devez acquérir et installer ce programmeavant d’employer ce livre.

Astuce Si vous êtes un développeur Microsoft .NET et souhaitez construire uneapplication fondée sur Excel, vous trouverez les chapitres 3, 4, 5 et 6 particulière-ment utiles pour comprendre le modèle objet Excel. Pour employer Microsoft .NETpour développer des applications pour Excel, il vous faut Microsoft Visual Studio2005 avec un langage .NET, ainsi que les outils VSTO 2005 SE (Microsoft Visual Stu-dio 2005 Tools for the 2007 Microsoft Office System), téléchargeables depuis le siteWeb Microsoft.com.

Page 15: Excel 2007 VBA

Présentation d’Excel 2007 v

● Microsoft Office Communicator 2007

● Microsoft Office Excel 2007

● Microsoft Office Groove 2007

● Microsoft Office InfoPath 2007

● Microsoft Office OneNote 2007

● Microsoft Office Outlook 2007

● Microsoft Office Outlook 2007 et Business Contact Manager

● Microsoft Office PowerPoint 2007

● Microsoft Office Publisher 2007

● Microsoft Office Word 2007

Aucune édition du système Microsoft Office 2007 n’installe tous ces produits.Parmi les produits disponibles séparément figurent Microsoft Office Project 2007,Microsoft Office SharePoint Designer 2007 et Microsoft Office Visio 2007.

Pour exécuter ces programmes, votre ordinateur doit répondre aux exigencesminimales suivantes :

● Processeur 500 MHz ;

● 256 Mo de RAM ;

● Lecteur de CD ou de DVD ;

● 2 Go d’espace disque disponible pour l’installation. Une partie de cet espacesera libérée si vous choisissez de supprimer les fichiers d’installation.

● Écran avec résolution minimale de 1024 × 768 ;

● Clavier et souris ou dispositif de pointage compatible ;

● Connexion Internet d’au moins 128 Kbps, pour le téléchargement et l’activa-tion des produits, l’accès à l’aide en ligne Microsoft Office et aux rubriquesd’aide en ligne, ainsi qu’à d’autres processus dépendants d’Internet ;

● Windows Vista ou ultérieur, Microsoft Windows XP SP2 ou ultérieur ouMicrosoft Windows Server 2003 ou ultérieur ;

● Windows Internet Explorer 7 ou Microsoft Internet Explorer 6 avec ses servi-ces packs.

Astuce Les exigences en termes d’espace disque dépendent de la configurationretenue. Des choix d’installation personnalisée peuvent nécessiter plus ou moinsd’espace disque.

Page 16: Excel 2007 VBA

vi Présentation d’Excel 2007

Les suites Microsoft Off ice 2007,dont Off ice Basic 2007, Off ice Home &Student 2007, Off ice Standard 2007, Off ice Small Business 2007, Off iceProfessional 2007, Office Ultimate 2007, Office Professional Plus 2007 et OfficeEnterprise 2007, possèdent toutes des exigences analogues.

Installation des fichiers d’exerciceVous devez installer les fichiers d’exercice à l’emplacement adéquat de votre dis-que dur avant de pouvoir les employer au fil des exercices. Procédez comme suit :

1. Téléchargez les fichiers d’accompagnement depuis le site dunod.com, puiscliquez sur le fichier Setup.exe. La page Step By Step Companion CD LicenseTerms apparaît. Suivez les indications proposées à l’écran. Pour employer lesfichiers d’exercice, vous devez accepter les termes de l’accord de licenced’utilisation. Cela fait, un écran de menu apparaît.

2. Cliquez sur Install Practice Files.

3. Cliquez sur Next sur le premier écran, puis à nouveau sur Next pour accep-ter les termes de la licence d’utilisation.

4. Si vous souhaitez installer les fichiers d’exercices à un emplacement autreque le dossier par défaut (Documents\MSP\ExcelVBA07SBS), cliquez sur lebouton Change, sélectionnez la nouvelle destination (disque et dossier),puis cliquez sur OK.

5. Cliquez sur Next dans l’écran Choose Destination Location, puis cliquezsur Install dans l’écran Ready to Install the Program pour installer lesfichiers d’exercice sélectionnés.

6. Une fois les fichiers d’exercice installés, cliquez sur Finish.

7. Fermez la fenêtre Step by Step Companion CD.

Important Sur un ordinateur qui exécute Windows Vista, l’emplacement d’instal-lation par défaut des fichiers d’exercice est Documents\MSP\ExcelVBA07SBS. Sur unordinateur qui exécute Windows XP, c’est Mes Documents\MSP\ExcelVBA07SBS. Sivotre ordinateur exécute Windows XP et qu’un exercice vous demande de navi-guer jusqu’à votre dossier Documents, naviguez à la place jusqu’au dossier MesDocuments.

Important Si vous installez les fichiers d’exercices à un emplacement autre que ledossier par défaut, vous devrez substituer le nouveau chemin d’accès à celui citédans les exercices.

Page 17: Excel 2007 VBA

Présentation d’Excel 2007 vii

Emploi des fichiers d’exerciceAprès leur installation, les fichiers d’exercices se trouvent par défaut sur votre dis-que dur dans le dossier Documents\MSP\ExcelVBA07SBS. Chaque exercice estprécédé d'un paragraphe qui cite les fichiers nécessaires à cet exercice et expliquetoute action préparatoire nécessaire avant de débuter l’exercice. Voici unexemple :

Vous pouvez examiner les fichiers d’exercice à l’aide de l’Explorateur Windows enprocédant comme suit :

1. Dans la barre des tâches Windows, cliquez sur le bouton Démarrer, puis cli-quez sur Documents.

2. Dans votre dossier Documents, double-cliquez sur MSP, puis double-cli-quez sur ExcelVBA07SBS.

Vous pouvez également parcourir les fichiers d’exercices depuis une boîte de dia-logue Excel 2007 en procédant comme suit :

3. Dans le volet Regardez dans de la boîte de dialogue Ouvrir, cliquez surDocuments.

4. Dans votre dossier Documents, double-cliquez sur MSP, puis double-cli-quez sur ExcelVBA07SBS.

Suppression et désinstallation des fichiers d’exercice

Vous pouvez libérer de l’espace disque en désinstallant les fichiers d’exercice quevous aviez installés. Le processus de désinstallation supprime tous les fichiers quevous aviez créés dans le dossier Documents\MSP\ExcelVBA07SBS au cours devotre travail. Procédez comme suit :

1. Dans la barre des tâches Windows, cliquez sur le bouton Démarrer, puis cli-quez sur Panneau de configuration.

SERVEZ-VOUS du classeur Budget.xlsx et du fichier texte Nov2007.txt. Ces fichiersd’exercice se trouvent dans le dossier Documents\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer Budget.xlsx comme classeur à macros activées sous le nomChapitre04 dans le dossier approuvé créé au Chapitre 1.OUVREZ le classeur Chapitre04.xlsm.

Démarrer

Démarrer

Page 18: Excel 2007 VBA

viii Présentation d’Excel 2007

2. Dans le Panneau de configuration, dans Programmes, cliquez sur la tâcheDésinstaller un programme.

3. Dans la fenêtre Programmes et fonctionnalités, cliquez sur MicrosoftOffice Excel VBA 2007 Step by Step, puis, dans la barre d’outils située nehaut de la fenêtre, cliquez sur le bouton Désinstaller.

4. Si une boîte de message Programmes et fonctionnalités apparaît et vousdemande de confirmer la suppression, cliquez sur Oui.

Obtention d’aideNous avons porté un soin méticuleux à la pertinence de ce livre et du contenu desfichiers d’accompagnement. Si vous rencontrez des problèmes, contactez lessources citées ci-dessous.

Obtention d’aide sur ce livre et les fichiers d’accompagnementSi votre question ou votre problème concerne le contenu de ce livre ou desfichiers d’accompagnement, commencez par parcourir la Base de connaissanceen ligne Microsoft Press. Celle-ci procure des informations d’aide relatives auxerreurs connues ou corrections du livre et se trouve au site Web :

www.microsoft.com/mspress/support/search.asp

Si vous n’y trouvez pas de réponse, envoyez votre question ou vos commentairesà Microsoft Press Technical Support, à l’adresse :

[email protected]

Informations complémentairesSi votre question concerne Microsoft Office Excel 2007 ou un autre logiciel Micro-soft et que vous n’avez pu trouver de réponse dans l’Aide du produit, consultez lecentre de solution produit adapté ou la Base de connaissances Microsoft àl’adresse :

support.microsoft.com

Important Les services d’assistance aux produits Microsoft n’offrent aucune aidesur ce livre ou les fichiers d’accompagnement.

Page 19: Excel 2007 VBA

Présentation d’Excel 2007 ix

De façon générale, les sujets concernant l’aide sur les produits Microsoft qui nesont pas traités dans la Base de connaissance Microsoft concernent les servicesd’assistance aux produits Microsoft.

Les options d’aide Microsoft spécifiques à votre localisation géographique peu-vent être atteintes à l’adresse :

support.microsoft.com/gp/selfoverview/

Page 20: Excel 2007 VBA

Enregistrer une macro, page 6

Ajout d’une macro à la Barre d’outils

Accès rapide, page 23

Application d’une miseen forme avancée

à des cellules à l’aided’une macro, page 6

Conversion de formules en valeurs à l’aide d’une macro, page 25

Modification d’une macro enregistrée, page 19

Exécution d’une macro enregistrée, page 10

Affectation d’un raccourci clavier à une macro, page 9

Création de votre propre identifiant numérique

pour signer une macro,page 32

Coup d’œil sur le chapitre

Page 21: Excel 2007 VBA

1

1 Création d’une macro pour effectuer des tâches simples

Ce chapitre aborde les points suivants :✔ Enregistrer et exécuter une macro.✔ Comprendre et modifier des macros simples enregistrées.✔ Exécuter une macro à l’aide d’un raccourci clavier.✔ Gestion de la sécurité des macros.

Il y a quelques semaines, j’ai égaré la télécommande de mon magnétoscopenumérique. Un cauchemar. J’essayais de voir un épisode en temps différé parfai-tement légalement de Desperate Housewives, sans y parvenir parce que les con-trôles de navigation sont intégrés à la télécommande. Heureusement, en allantchercher un nouveau paquet de pop-corn dans un placard quelques jours plustard, j’ai découvert ce que j’avais fait de la télécommande. Je puis avec bonheurregarder à nouveau des émissions en temps différé, sans parler du plaisir de pou-voir changer de chaîne sans devoir me lever.

VBA (Visual Basic for Applications) est la télécommande de Microsoft OfficeExcel 2007. Vous pouvez sans problème employer Excel sans jamais vous servir deVBA, mais la télécommande VBA facilite l’emploi d’Excel. Elle permet égalementde tirer profit de dispositifs auxquels ne donne pas accès l’interface utilisateurstandard. Une fois familiarisé avec VBA, vous vous demanderez comment vousaviez pu vous en passer.

Important Avant d’entamer ce chapitre, vous devez télécharger les fichiersd’exercices depuis le site Dunod associé et les installer à leur emplacement pardéfaut. Reportez-vous pour plus d’information à « Emploi des fichiers d’exercices »,dans l’introduction.

Page 22: Excel 2007 VBA

2 Chapitre 1 Création d’une macro pour effectuer des tâches simples

Différence entre VBA et une macroSi VBA est la télécommande d’Excel, qu’est-ce donc qu’une macro ? Et quelle estla différence entre VBA et une macro ? Tout cela est très confus. Fondamentale-ment, une macro est un programme informatique qui donne des instructionsautomatisées à l’ordinateur. Les macros originales étaient une façon d’employerquelques caractères pour représenter un ensemble d’instructions. Elles étaientappelées macros car la sortie était bien plus imposante que l’entrée.

En fait, les premières macros de programmes de tableurs se bornaient à dévelop-per une courte chaîne de caractères en un long ensemble d’actions. Ce n’était quedes raccourcis pour des commandes de l’interface utilisateur. Par exemple, si voussaisissez dans l’interface utilisateur R (pour « Range », plage), N (pour « Name »,nom) et C (pour « Create », créer), vous saisissez dans la macro RNC pour auto-matiser le processus. Cette approche était intuitive, mais non dépourvue de fai-blesses inhérentes. Les macros de séquence de touches étaient difficiles à lire etne s’adaptaient guère à une interface utilisateur graphique. Quelle séquence detouches employer pour représenter le déplacement d’un rectangle à l’aide de lasouris ? Elles rendaient également délicate l’amélioration de l’interface utilisateur,car toute modification apportée à la structure des menus entraînait l’échec desmacros créées précédemment.

Pour résoudre ces problèmes, les premières versions d’Excel contenaient un nou-veau type de langage de programmation, indépendant des noms des comman-des de l’interface utilisateur. Par exemple, dans Microsoft Excel version 4(Excel 2007 est la version 12), vous pouviez copier une plage d’au moins troisfaçons différentes : en appuyant sur CTRL+C, en cliquant sur le bouton Copier dela barre d’outils standard ou en cliquant sur Copier dans le menu Edition. Ces troisméthodes étaient représentées par la même instruction =COPY(). Ce nouveaulangage de programmation n’était pas techniquement un langage de macro dans

SERVEZ-VOUS du classeur Budget.xlsx. Ce fichier d’exercice se trouve dans le dos-sier Documents\MSP\ExcelVBA07SBS. Ce classeur contient une unique feuille decalcul nommée Budget. Cette feuille de calcul contient un budget mensuel prévi-sionnel pour l’année 2007.VEILLEZ à enregistrer le classeur Budget.xlsx sous le nom Chapitre01 dans un nou-veau dossier nommé Travail. Vous placez le classeur dans un nouveau dossier defaçon à être certain que celui-ci ne contient rien d’autre que les fichiers que vous yplacez. Par la suite, cela vous permettra d’accorder votre confiance à tout classeurde macro de ce dossier.OUVREZ le classeur Chapitre01.xlsx.

Page 23: Excel 2007 VBA

Différence entre VBA et une macro 3

la mesure où il ne développe pas quelques caractères en une séquence d’instruc-tions. Techniquement, c’était un ensemble de fonctions, très similaires aux fonc-tions employées pour effectuer des tâches dans les cellules d’une feuille de calcul.Proclamer toutefois « vous pouvez automatiser des tâches simples en écrivant desprogrammes personnalisés fondés sur les fonctions spécialisées de feuille decalcul » pouvait paraître effrayant. L’équipe Excel a donc continué à faire réfé-rence aux programmes personnalisés sous le terme de macros. Le mot macrosignifie désormais un programme que les utilisateurs peuvent eux-mêmes écrire.

Les premières macros fondées sur des fonctions d’Excel représentaient une amé-lioration majeure sur les macros de séquence de touches, mais possédaientencore deux gros inconvénients. Tout d’abord, les macros Excel étaient très spéci-fiques à Excel : les fonctions ressemblaient trop à des formules de feuille de calculpour pouvoir être adaptées à d’autres applications, comme Microsoft OfficeWord. Ensuite, le nombre de fonctions progressait avec chaque nouvelle versionde Microsoft Office, sans qu’il n’existe de méthode efficace pour regrouper ouorganiser les milliers de possibilités.

Pour éliminer la première contrainte (la spécificité des macros fondées sur desfonctions propres à Excel), Microsoft a présenté VBA (Visual Basic for Applications)dans la version 5 de Microsoft Excel.

VBA agit comme un langage à but général indépendant de l’application. Soudai-nement, toute personne sachant travailler avec n’importe quelle version deMicrosoft Visual Basic disposait d’une avance confortable en matière d’automati-sation d’Excel et quiconque apprenait à écrire des macros Excel en VBA pouvaittransférer ses connaissances vers les autres types de programmation Visual Basic.En outre, même si Excel était la première grande application à employer VBA, cedernier n’était pas lié à Excel. Il fonctionnait tout aussi bien avec d’autres applica-tions compatibles VBA, comme Word et Microsoft Office PowerPoint.

Pour résoudre la seconde contrainte des macros fondées sur les fonctions (l’exis-tence de trop de commandes pour pouvoir les gérer efficacement), VBA fonc-tionne avec un modèle objet. Le terme modèle objet peut sembler intimidant, maisce n’est qu’une façon logique d’organiser toutes les commandes dont dispose uneapplication. Avec un modèle objet, chaque partie distincte d’une application (parexemple, un classeur, une plage ou un point sur un graphique) devient un objet,chaque objet disposant de sa propre liste de fonctions. Vous en apprendrez pluspar la suite sur ce qu’est un objet et la façon dont les objets sont liés aux fonctions.Le point essentiel est que le modèle objet organise les millions de commandespossibles selon la façon dont est employée chaque commande. Par exemple, vouscopiez et collez une plage de cellules, mais pas les points d’un graphique.

Page 24: Excel 2007 VBA

4 Chapitre 1 Création d’une macro pour effectuer des tâches simples

Grâce au modèle objet, VBA n’a besoin d’aucun accès particulier aux mécanismesinternes d’Excel. Excel expose ses capacités au monde extérieur à l’aide du modèleobjet et c’est à celui-ci que s’adresse VBA.

Cela signifie qu’une macro VBA Excel peut contrôler non seulement Excel, maiségalement toute application qui fournit un modèle objet. Toutes les applicationsMicrosoft Office ainsi que de nombreuses autres applications Microsoft ou detierce partie proposent les modèles objet adéquats.

Le VBA fourni avec Excel n’est pas le seul langage capable de communiquer avecle modèle objet. Tout langage qui prend en charge l’Automation peut contrôlerExcel. Vous pouvez donc contrôler Excel bien sûr avec le VBA hébergé par Excel,mais également avec le VBA hébergé par Word, avec Microsoft Visual Basic ver-sion 6 ou même avec un langage comme C++. Avec une unique couche de tra-duction, vous pouvez également parler au modèle objet Excel depuis desapplications Microsoft .NET écrites en C# ou en Microsoft Visual Basic .NET.

VBA et le .NET FrameworkSi .NET ne signifie rien pour vous, sautez cette explication sans plus vous enpréoccuper. Si vous connaissez bien .NET, vous pourriez vous demander enquoi les macros VBA sont apparentées aux programmes .NET.

Excel Modèle objet VBA

VBA

Word

ExcelCorelDraw

Visio

Excel Visual Basic

VBA

C++

Page 25: Excel 2007 VBA

Création d’une macro simple 5

VBA est un code intégré à Excel 2007 et le modèle objet est une interfaceCOM (Component Object Model). Je ne sais pas ce que prévoit Microsoft, maisune future version d’Excel pourrait employer du code géré comme C# ouVisual Basic .NET comme langage de macros. Si cela se produit, la plus grandepartie de ce que vous apprendrez sur cette version restera valide : les caracté-ristiques du modèle objet ne seront modifiées qu’en fonction des change-ments apportés aux dispositifs d’Excel.

Vous allez apprendre dans ce livre à créer des macros VBA pour votre proprebénéfice et pour les partager avec votre groupe de travail. Pour la plupart desutilisateurs professionnels, écrire des macros en VBA est suffisant. Si toutefoisvous souhaitez créer un module complémentaire plus sophistiqué, ou uneapplication autonome qui emploie Excel à l’arrière-plan, vous pouvez créerune application .NET dans Microsoft Visual Studio. Microsoft Visual Studio2005 contient un composant téléchargeable nommé VSTO (Visual StudioTools for Office) qui comprend le composant nécessaire PIA (Primary InteropAssembly) pour communiquer avec le modèle objet Excel. VSTO 2005 SE(Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System) con-tient également des outils qui permettent de créer des volets de tâche per-sonnalisés.

Le modèle objet expose les capacités d’Excel à VBA, mais, et cela est plus impor-tant, à vous-même. Lorsque vous savez comment lire et interpréter un modèleobjet, vous découvrez de nouvelles fonctionnalités et comprenez rapidementcomment les mettre en œuvre. La meilleure façon d’apprendre comment VBAcommunique avec les objets Excel consiste à créer quelques macros simples àl’aide de l’enregistreur de macro. Vous souhaiterez toutefois probablement dépas-ser rapidement les limites de l’enregistreur de macro.

Création d’une macro simpleExcel propose une vaste gamme d’outils, facilement accessibles depuis le rubanou les menus contextuels. Parfois cependant, un outil intégré ne se comporte pasexactement comme vous le souhaiteriez. Créer une macro pour améliorer un outilintégré est une bonne méthode pour débuter l’écriture de macros.

Page 26: Excel 2007 VBA

6 Chapitre 1 Création d’une macro pour effectuer des tâches simples

Mise en forme monétaire à l’aide d’un outil intégréSur l’onglet Accueil du ruban se trouve une liste Format de nombre dans laquellevous pouvez choisir une des mises en forme intégrées. Vous pouvez employercette liste pour appliquer une mise en forme Monétaire à des cellules sélection-nées.

1. Dans le classeur Chapitre01, sélectionnez les cellules D3:F4 de la feuille decalcul Budget.

2. Sur l’onglet Accueil du ruban, cliquez sur la flèche Format de nombre, puiscliquez sur Monétaire.

Excel met en forme les cellules sélectionnées comme Monétaire avec deuxdécimales.

Enregistrement d’une macro pour une mise en forme MonétaireLe format Monétaire standard possède deux places décimales. Cela est adapté àun suivi de compte, où vous connaissez les montants exacts concernés. Une feuillede calcul de budget prévisionnel renferme toutefois des estimations et afficher lesvaleurs estimées au centime près semble stupide. Vous pouvez créer une macroqui met en forme les cellules actuellement sélectionnées sous forme Monétaire,mais sans décimale.

Astuce Outre sélectionner Monétaire dans la liste, vous pouvez obtenir le mêmerésultat en cliquant sur le bouton de format de nombre Comptabilité. La différenceentre les formats Monétaire et Comptabilité peut être troublante, surtout en raisond’un certain manque de cohérence de l’interface utilisateur d’Excel.Voici comment cela fonctionne : Excel possède deux types de formats qui ressem-blent à du monétaire. L’un s’appelle Monétaire et l’autre Comptabilité. Le formatMonétaire place le symbole monétaire juste avant le nombre. Le format Comptabi-lité place le symbole monétaire à l’extrême gauche de la cellule. Avec Excel 2007,même si le nom qui figure sur le bouton du Ruban est Format de nombre Compta-bilité, la mise en forme appliquée par défaut est le format Monétaire. Pour que lebouton Format de nombre Comptabilité applique effectivement le format Comp-tabilité, cliquez sur la flèche et choisissez un des types monétaires spécifiques, parexemple $ Anglais (États-Unis). À l’exception d’applications comptables spécifiques,le format Monétaire est généralement plus facile à lire.

Page 27: Excel 2007 VBA

Création d’une macro simple 7

Dans la barre d’état, immédiatement à droite de l’indicateur de mode cellule(Prêt), dans le coin inférieur gauche de la fenêtre Excel, se trouve le bouton quidémarre l’enregistreur de macro.

Lorsque aucune macro n’est en cours d’enregistrement, vous pouvez le voircomme un bouton Enregistrer une macro. Si le bouton Enregistrer une macron’est pas visible dans la barre d’état, effectuez un clic droit sur la barre d’état,cochez la case à côté de Enregistrement de macro, puis cliquez dans la barred’état pour valider.

1. Dans la feuille de calcul Budget, sélectionnez les cellules D7:F8.

2. Dans la barre d’état, cliquez sur le bouton Enregistrer une macro.

3. Remplacez le nom par défaut de la macro par FormatMonétaire, puis cli-quez sur OK.

Un nom de macro doit débuter par une lettre et peut contenir des majuscu-les et des minuscules, des nombres et des traits de soulignement (unders-core), mais ni espace ni caractère spécial.

La seule modification apparente est que l’icône du bouton Enregistrer unemacro se modifie en carré. Vous pouvez le voir comme un bouton Arrêterl’enregistrement, ce qui est justement ce qu’indique son info bulle. Ce bou-ton est comme un signal « A l’antenne » dans un studio de télévision : vousenregistrez.

4. Effectuez un clic droit dans la plage sélectionnée puis cliquez sur Format decellule. Si nécessaire, cliquez sur l’onglet Nombre de la boîte de dialogueFormat de cellule.

Dépannage Le bouton Enregistrer une macro est juste à côté et ressemble beau-coup au bouton Insérer une feuille de calcul : veillez à cliquer sur le bon !

Enregistrer une macro

Page 28: Excel 2007 VBA

8 Chapitre 1 Création d’une macro pour effectuer des tâches simples

5. Sélectionnez Monétaire dans la liste Catégorie.

6. Remplacez la valeur dans la zone de texte Nombre de décimales par 0.

7. Sélectionnez Personnalisée dans la liste Catégorie et regardez la zone detexte Type.

Les caractères # ##0 € représentent un format monétaire sans décimale.C’est le format qui va être appliqué aux cellules sélectionnées.

Voir aussi Pour en apprendre plus sur les chaînes de format, cliquez sur le boutond’Aide d’Office Excel et saisissez « Codes de format de nombre » dans la zone derecherche.

8. Cliquez sur OK pour appliquer aux cellules sélectionnées une mise en formemonétaire sans décimale.

9. Dans la barre d’état, cliquez sur le bouton Arrêter l’enregistrement.

C’est fait. Vous avez enregistré une macro pour mettre en forme une sélectionavec le format monétaire souhaité.

Exécution de la macroVous souhaitez probablement maintenant tester la macro pour voir son fonction-nement.

1. Sur la feuille de calcul Budget, sélectionnez les cellules D9:F10.

Arrêter l’enregistrement

Page 29: Excel 2007 VBA

Création d’une macro simple 9

2. Dans l’onglet Affichage du ruban, cliquez sur le bouton Macros situé àdroite.

3. Sélectionnez dans la liste la macro FormatMonétaire, puis cliquez sur Exé-cuter.

Ça marche ! Vous avez exécuté votre première macro, qui a appliqué votre formatmonétaire personnalisé aux cellules sélectionnées.

Affectation d’une touche de raccourci à la macroExécuter une macro depuis la boîte de dialogue Macro n’est pas beaucoup plusfacile que d’affecter directement le format de nombre. Pour faciliter l’exécution dela macro, vous pouvez recourir à une touche de raccourci.

1. Dans l’onglet Affichage du Ruban, cliquez sur la flèche Macros, puis cliquezsur Afficher les macros.

2. Sélectionnez dans la liste la macro FormatMonétaire, puis cliquez sur lebouton Options.

La boîte de dialogue Options de macro permet de définir ou de modifier latouche de raccourci de la macro et sa description. Vous ne pouvez modifierle nom de la macro, mais à part cela cette boîte de dialogue ressemblebeaucoup à la boîte de dialogue Enregistrer une macro : vous pouvez en faitaffecter une touche de raccourci à une macro lors de son enregistrement.

3. La zone située sous Touche de raccourci étant sélectionnée, appuyez surMAJ+C.

Comme vous pouvez le voir d’après l’étiquette située à côté de la zone detexte, cela affecte CTRL+MAJ+C comme touche de raccourci.

Astuce Dans la boîte de dialogue Options Excel, sur l’onglet Standard, vous trou-verez une case à cocher nommée Afficher l'onglet Développeur dans le ruban.Vous pouvez activer le volet Développeur si vous le souhaitez, mais cela ne facilitepas réellement l’écriture de macros. Cet onglet renferme trois sections. La sectionCode propose des boutons qui sont déjà aisément accessibles, comme le boutonEnregistrer une macro de la barre d’état ou le bouton Macros de l’onglet Affichagedu ruban. La section Contrôles renferme des éléments très utiles lors de l’ajout decontrôles à une feuille de calcul. Enfin, la section XML n’a rien à voir avec la créa-tion de macros.

Page 30: Excel 2007 VBA

10 Chapitre 1 Création d’une macro pour effectuer des tâches simples

4. Cliquez sur OK pour revenir à la boîte de dialogue Macro, puis cliquez surAnnuler pour revenir à la feuille de calcul.

5. Sélectionnez les cellules D11:F12 et appuyez sur CTRL+MAJ+C pour exécu-ter la macro.

Vous avez maintenant enregistré, exécuté et amélioré une macro, tout cela sansvoir la macro elle-même. Peut-être souhaitez-vous voir ce que vous avez créé.

Examen d’une macroLa macro est masquée dans le classeur. Vous devez ouvrir l’éditeur Visual Basicpour la voir.

1. Sur l’onglet Affichage du ruban, cliquez sur la flèche Macros, puis cliquezsur Afficher les macros.

2. Cliquez sur FormatMonétaire, puis cliquez sur Modifier.

La fenêtre de l’éditeur Visual Basic s’ouvre. L’éditeur Visual Basic semble êtreun programme distinct, mais il « appartient » à Excel : si vous quittez celui-ci, l’éditeur se ferme automatiquement. Vous voyez dans l’éditeur VisualBasic une fenêtre intitulée Module1.

3. Agrandissez la fenêtre Module1 de façon à ce qu’elle remplisse la fenêtre del’éditeur, puis modifiez la taille de la fenêtre de l’éditeur afin de voir le clas-seur Excel à l’arrière-plan.

4. Fermez toute éventuelle autre fenêtre ouverte dans l’éditeur Visual Basic.

Important Excel emploie de nombreuses combinaisons à partir de la toucheCTRL comme raccourcis intégrés. Par exemple, CTRL+C correspond à Copier etCTRL+Z à Annuler. Si vous affectez un de ces raccourcis à votre macro, appuyer surla combinaison de touche de raccourci exécute votre macro plutôt que la com-mande intégrée. Si vous employez toujours la combinaison de touches CTRL+MAJlorsque vous affectez des touches de raccourci à vos macros, vous courez moins derisques de recouvrir un raccourci intégré.

Page 31: Excel 2007 VBA

Création d’une macro simple 11

La fenêtre est nommée Module1. Un module est l’endroit où l’enregistreur stockeles macros. Votre macro est dans le module Module1. Elle ressemble à ceci :

Sub FormatMonétaire()'' FormatMonétaire Macro'

' Selection.NumberFormat = "#,##0 $"End Sub

Les quatre lignes qui débutent par des apostrophes sont des commentaires. Uneapostrophe indique à Visual Basic d’ignorer le reste du texte de la ligne. La lignevierge, dépourvue même d’apostrophe, est l’endroit où l’enregistreur aurait placéla combinaison de touche de raccourci, si vous en aviez affecté une lors de l’enre-gistrement de la macro. L’enregistreur insère les commentaires pour vous rappelerd’ajouter des commentaires lorsque vous créez une macro. Vous pouvez en ajou-ter, en supprimer ou en modifier sans que cela ne change en quoi que ce soit le

Page 32: Excel 2007 VBA

12 Chapitre 1 Création d’une macro pour effectuer des tâches simples

fonctionnement de la macro. Les commentaires apparaissent en vert pour quevous les distinguiez plus facilement des instructions. En Visual Basic, tout ce quin’est pas un commentaire est une instruction. Une instruction indique à VisualBasic ce qu’il doit faire.

La première instruction de la macro débute par Sub, suivi du nom de la macro.Cette instruction indique à Visual Basic de commencer une nouvelle macro. Lemot Sub est peut-être employé parce qu’une macro est généralement cachée ouhors de vue, comme un sous-marin (submarine). Peut-être aussi est-ce parce queles rédacteurs de macros sont une sorte de bidouilleurs (hackers), connus commeétant subversifs. Ou bien Sub n’est employé que pour d’obscures raisons histori-ques. La dernière instruction de la macro est End Sub. Cette instruction indique àVisual Basic de refaire surface.

Toutes les instructions entre Sub et End Sub constituent le corps de la macro. Cesont ces instructions qui effectuent le travail réel. La première (et la seule) instruc-tion du corps de la macro FormatMonétaire débute par Selection.NumberFormat.

Le mot Selection fait référence à une chose Excel : ici, la plage de cellules actuelle-ment sélectionnée. La chose porte le nom d’objet. Souvenez-vous que les objetsne sont fondamentalement qu’un moyen d’organiser logiquement les millions decommandes proposées par Excel. Spécifier Selection comme objet indique quel’instruction va faire quelque chose avec une plage de cellules.

Le mot NumberFormat fait référence à un attribut, ou propriété de la plage de cel-lules. Une des façons dont Excel effectue une action consiste à affecter une nou-velle valeur à une propriété. Il affecte ici la nouvelle chaîne de format à lapropriété NumberFormat. Fondamentalement, cette instruction stipule : « Disdonc Excel, j’ai une plage ici. Modifie le format de nombre pour qu’il ressemble àce format monétaire personnalisé, d’accord ? ».

Cette macro suppose que la sélection active est une plage de cellules. Si voussélectionnez une forme graphique et exécutez la macro, celle-ci échoue. La macrodéclare en effet alors « Dis donc Excel, j’ai un rectangle ici. Modifie le format denombre, d’accord ? ». Ce à quoi Excel répond « Impossible ! Cela n’a aucun sensde modifier le format de nombre d’un rectangle, idiot ! ».

Bien sûr, il n’emploie pas ces termes. Il répond « Cet objet ne prend pas en chargecette propriété ou cette méthode » : la signification est la même. Plus loin, auChapitre 8, « Extension d’Excel et de Visual Basic », vous apprendrez à ajuster unemacro pour pouvoir la transmettre à vos amis sans courir le risque qu’Excel ne leursignale qu’ils sont stupides.

Page 33: Excel 2007 VBA

Création d’une macro simple 13

Enregistrement du classeur de macroSi vous avez suivi avec soin les instructions, vous n’avez pas encore enregistrévotre classeur. Si vous avez toutefois tenté de le faire, vous avez reçu un messagestipulant qu’il est impossible d’enregistrer un projet Visual Basic dans un classeursans macro. C’est un peu embêtant, mais constitue un nouveau dispositif intéres-sant de la distribution Microsoft Office 2007. Comme vous le savez certainement,des personnes mal intentionnées ont envisagé de se servir de classeurs Excel et dedocuments Word pour répandre des virus et autres vermines. Je me souviens par-faitement avoir disséminé un virus dans mon entreprise après avoir reçu un clas-seur d’un collègue « approuvé » et avoir indiqué à Excel qu’il pouvait activer lamacro. Le problème ne venait pas de ce que mon collègue n’était pas digne deconfiance. Lui-même ignorait que le classeur envoyé contenait un virus de macro.

Désormais, avec la distribution Office 2007, un classeur standard est dépourvu demacro : il est garanti ne renfermer aucune macro. Il ne peut donc en aucun casrépandre de virus. Si vous placez une macro dans un classeur, vous devez enregis-trer celui-ci comme classeur prenant en charge les macros.

1. Cliquez sur le Bouton Microsoft Office, pointez vers la flèche Enregistrersous, cliquez sur Classeur Excel (prenant en charge les macros), puis cli-quez sur Enregistrer.

Cela enregistre le classeur sous le nom Chapitre01.xlsm.

2. Fermez le classeur, puis servez-vous de la liste Fichiers récents du menuOffice pour l’ouvrir à nouveau.

Le fichier s’ouvre, mais un message d’alerte apparaît sous le ruban pour vousavertir que les macros sont désactivées par sécurité.

3. Dans la barre de sécurité, cliquez sur le bouton Options.

4. Dans la boîte de dialogue Options de sécurité Microsoft Office, sélection-nez Activer ce contenu.

Important Les classeurs sans macro possèdent une extension .xlsx et les classeursqui prennent en charge les macros l’extension .xlsm, mais l’extension de fichier n’estpas le point important.Les macros sont stockées dans une section spéciale du classeur. Excel peut facile-ment dire si le classeur renferme une macro en examinant la liste du contenu dufichier classeur : il n’a pas besoin d’ouvrir la partie du classeur qui contient la macro,ce qui pourrait être potentiellement dangereux. Si vous modifiez l’extension d’unclasseur prenant en charge les macros en .xlsx, vous obtenez une erreur en tentantd'ouvrir le classeur.

Page 34: Excel 2007 VBA

14 Chapitre 1 Création d’une macro pour effectuer des tâches simples

5. Cliquez sur OK pour activer les macros et faire disparaître la barre de sécu-rité.

6. Sélectionnez les cellules D13:F13 et appuyez sur CTRL+MAJ+C pour les met-tre en forme en monétaire personnalisé, afin de vérifier que la macro crééefonctionne.

Pour votre protection, Excel exige que vous activiez les macros à chaque ouver-ture du classeur. Si vous n’activez pas les macros et enregistrez à nouveau le clas-seur, les macros ne sont pas supprimées. Il vous sera à nouveau proposé de lesactiver lors de la prochaine ouverture du classeur. Vous apprendrez à la fin de cechapitre comment approuver des classeurs spécifiques qui prennent en charge lesmacros afin de ne pas avoir à les activer à chaque ouverture.

Modification simultanée de plusieurs propriétésSachant désormais comment enregistrer correctement votre travail, revenez à lacréation de macros. La macro FormatMonétaire créée précédemment contientune instruction qui modifie une unique propriété (le format de nombre) d’un uni-que objet (la plage de cellules actuellement sélectionnée). L’affectation d’unevaleur à la propriété modifie l’objet. Affecter une valeur à une propriété est unefaçon classique d’accomplir une action en VBA. L’enregistreur crée fréquemmentune instruction analogue lorsque vous enregistrez une action. Parfois toutefois,tandis que vous n’enregistrez qu’une unique action, l’enregistreur affecte simulta-nément des valeurs à de multiples propriétés.

Création d’en-têtes de lignes à l’aide d’une commandeUn en-tête de lignes est un en-tête situé sur le côté de plusieurs lignes, plutôtqu’au-dessus d’un groupe de colonnes. Les en-têtes sont généralement situés enhaut, ce pourquoi Excel propose dans le Ruban un bouton pour fusionner et cen-trer plusieurs cellules dans une ligne horizontale. Il s’agit du bouton Fusionner etcentrer situé dans le groupe Alignement de l’onglet Accueil. Il n’existe en revanchepas de bouton pour créer un en-tête de lignes. L’option Fusionner les cellules dela liste du bouton Fusionner et centrer permet d’effectuer une fusion verticale,tandis que l’option Texte vertical de la liste Orientation permet de placer le texteverticalement, mais aucun bouton du Ruban ne permet de créer un en-tête delignes en une seule étape. Vous pouvez toutefois enregistrer une action de créa-tion en une étape d’en-tête de lignes dans une macro.

Orientation

Page 35: Excel 2007 VBA

Modification simultanée de plusieurs propriétés 15

Pour mieux comprendre ce qui est nécessaire, examinez d’abord les étapes de lacréation du format cible. La boîte de dialogue Alignement permet de fixer à la foisl’orientation du texte et la fusion des cellules.

1. Activez la fenêtre Budget.

2. Sélectionnez la plage A6:A12. L’étiquette Variable se situe en haut de laplage sélectionnée.

3. Effectuez un clic droit dans la sélection, puis cliquez sur Format de cellule.

4. Dans la boîte de dialogue Format de cellule, cliquez sur l’onglet Aligne-ment. Celui-ci propose plusieurs contrôles pour l’alignement, le retour à laligne, l’angle d’orientation, la direction du texte, l’ajustement et la fusion.

5. Cochez la case Fusionner les cellules, puis glissez-déposez le losangerouge dans le contrôle d’orientation pour fixer celle-ci à 90 degrés.

Page 36: Excel 2007 VBA

16 Chapitre 1 Création d’une macro pour effectuer des tâches simples

6. Cliquez sur OK pour effectuer la fusion et la modification d’orientation.

Un en-tête de lignes propose quelques options de présentation intéressantes.Vous pouvez maintenant enregistrer une macro pour faciliter la création d’un en-tête de lignes à tout moment.

Enregistrement d’une macro de fusion verticale de cellulesModifiez vos fenêtres selon les besoins afin d’afficher simultanément les fenêtresModule1 et Excel.

1. Sélectionnez la plage A15:A20, puis cliquez sur le bouton Enregistrer unemacro.

2. Dans la boîte de dialogue Enregistrer une macro, remplacez le nom pardéfaut de la macro par EnTeteLignes, remplacez la description par défautpar Fusion et rotation verticale de cellules puis appuyez sur MAJ+S pourdéfinir CTRL+MAJ+S comme touche de raccourci.

3. Cliquez sur OK.

Vous pouvez voir dans la fenêtre du module que l’enregistreur insère immé-diatement dans la macro les lignes de commentaires, le raccourci clavier,ainsi que les lignes Sub et End Sub.

Astuce pour réarranger les fenêtres, réduisez toutes les applications ouvertes saufExcel et l’éditeur Visual Basic, puis activez Excel. Effectuez un clic droit dans la barredes tâches et cliquez dans le menu contextuel sur Afficher les fenêtres côte à côte(avec Microsoft Windows XP, la commande est Mosaïque horizontale).

Important Si vous affectez la même touche de raccourci à deux macros, c’estcelle qui apparaît la première dans la liste Exécuter une macro qui est exécutée. Enoutre, une touche de raccourci n’est fonctionnelle que lorsque le classeur qui con-tient la macro est ouvert.

Page 37: Excel 2007 VBA

Modification simultanée de plusieurs propriétés 17

4. Effectuez un clic droit sur la sélection, puis cliquez sur Format de cellule.

5. Dans l’onglet Alignement de la boîte de dialogue Format de cellule, sélec-tionnez l’option Fusionner les cellules, fixez l’orientation à 90 degrés puiscliquez sur OK. L’enregistreur insère simultanément plusieurs lignes dans lamacro.

6. Cliquez sur le bouton Arrêter l’enregistrement, puis enregistrez le classeurChapitre01.

La nouvelle macro dans la fenêtre Module1 (ou Module2, selon les cas) ressembleà ceci :

Sub EnTeteLignes()'' EnTeteLignes Macro' Fusion et rotation verticale de cellules'' Touche de raccourci du clavier: Ctrl+Maj+S' With Selection .HorizontalAlignment = xlGeneral .VerticalAlignment = xlBottom .WrapText = False .Orientation = 90 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = True End WithEnd Sub

La macro montre neuf propriétés différentes relatives à l’alignement des cellules.Chaque nom de propriété est suivi d’un signe égal. Ces propriétés correspondentaux contrôles de l’onglet Alignement de la boîte de dialogue Format de cellule.

Ces propriétés appartiennent toutes au même objet : la plage de cellules actuel-lement sélectionnée. C’est le même objet que celui employé par la macro Format-Monétaire. Dans cette macro toutefois, les noms des propriétés suiventimmédiatement l’objet, uniquement séparés par un point. La macro EnTeteLignes

Astuce Excel crée un nouveau module lors de l’enregistrement de la premièremacro. Il ajoute ensuite les macros enregistrées plus tard à la fin du même module.Lorsque vous fermez et réouvrez le classeur, l’enregistreur de macros place lesmacros dans un nouveau module. Il n’existe aucun moyen de contrôler où l’enre-gistreur place une nouvelle macro. Posséder des macros dans plusieurs modules nedevrait pas poser de problème.Lorsque vous employez la boîte de dialogue Macro pour sélectionner et modifierune macro, vous êtes automatiquement dirigé vers le module adéquat.

Page 38: Excel 2007 VBA

18 Chapitre 1 Création d’une macro pour effectuer des tâches simples

est différente, car chaque nom de propriété figure sur une ligne, précédé unique-ment d’un point.

L’objet de toutes ces propriétés apparaît dans une instruction qui commence parle mot With. Le groupe d’instructions entre With et End With est nommé structureWith. Dans une structure With, vous pouvez faire précéder une propriété d’unpoint : VBA considère que l’objet de l’instruction With se trouve avant. L’enregis-treur de macro procède toujours ainsi, particulièrement lorsque vous vous servezd’une boîte de dialogue dotée de nombreux contrôles. Une structure With facilitela lecture du code, car vous pouvez immédiatement savoir que toutes ces proprié-tés concernent le même objet : ici, la plage actuellement sélectionnée.

Élimination des lignes superflues de la macroLorsque vous enregistrez une macro et modifiez une boîte de dialogue dotée denombreux contrôles, l’enregistreur place généralement dans la macro toutes lespropriétés possibles, même si vous n’avez modifié les valeurs que d’une ou deuxd’entre elles. Vous pouvez rendre votre macro plus facile à comprendre en suppri-mant les affectations de propriété superflues.

Dans la macro EnTeteLignes, les seules propriétés à modifier sont Orientation etMergeCells : vous pouvez donc supprimer toutes les autres instructions de lastructure With.

1. Activez la fenêtre de l’éditeur Visual Basic, puis cliquez aussi à gauche quevous le pouvez de l’instruction HorizontalAlignment. Le pointeur de votresouris devrait se transformer en flèche blanche pointant vers le nord-est aucours de cette opération. Cette action sélectionne la totalité de la ligne, ycompris l’indentation qui précède le texte.

2. Appuyez sur la touche SUPPR.

3. Répétez les étapes 1 et 2 pour chaque propriété sauf Orientation et Merge-Cells. Si vous avez trop supprimé, cliquez sur le bouton Annuler pour res-taurer ce que vous avez supprimé.

La macro simplifiée (sans les lignes de commentaire, que vous pouvez sup-primer si vous le voulez) devrait ressembler à ceci :

Dépannage Si vous voyez dans la marge un cercle rouge après le clic, vous avezcliqué trop loin dans la zone grise, et vous devez apprendre la différence entre lenord-est et le nord-ouest. Cliquez sur le cercle rouge pour le supprimer et essayezà nouveau.

Annuler

Page 39: Excel 2007 VBA

Manipulation de propriétés enregistrées 19

Sub EnTeteLignes() With Selection .Orientation = 90 .MergeCells = True End WithEnd Sub

4. Activez la fenêtre Excel, puis sélectionnez les cellules A25:A30.

5. Appuyez sur CTRL+MAJ+M. La macro ajuste le libellé. Vous pouvez mainte-nant créer des en-têtes de lignes quand vous le voulez (pourvu que le clas-seur soit ouvert).

6. Enregistrez le classeur Chapitre01.

Avant d’enregistrer votre macro, vous l’avez modifiée. Et elle fonctionne encore.Vous allez maintenant enregistrer une macro et lui ajouter des choses.

Manipulation de propriétés enregistréesDans une macro enregistrée, vous pouvez reconnaître une instruction qui affecteune valeur à une propriété : elle comporte toujours au milieu un signe égal. Aprèsavoir identifié une propriété dans une macro enregistrée, vous pouvez facilementmodifier le comportement de la macro.

Enregistrement d’une macro de suppression d’élément de fenêtreUne feuille de calcul Excel traditionnelle comporte plusieurs dispositifs qui facili-tent son utilisation : le quadrillage gris clair qui définit les frontières des cellules,les en-têtes de lignes et de colonnes et la barre de formule. Ils sont très utiles dansla plupart des cas, mais il est parfois souhaitable de les supprimer pour disposerd’un affichage « propre ». Le ruban d’Excel 2007 rend enfantin l’activation ou ladésactivation de ces éléments, mais vous pourriez créer une macro qui modifiesimultanément ces trois éléments.

Arrangez les fenêtres du classeur et de macro afin de les afficher simultanément.

1. Cliquez sur le bouton Enregistrer une macro.

2. Remplacez le nom par défaut de la macro par AffichagePropre, puis cli-quez sur OK.

3. Sur l’onglet Affichage du ruban, décochez les options Quadrillage, Titreset Barre de formule. Ces trois éléments disparaissent de l’affichage.

4. Cliquez sur le bouton Arrêter l’enregistrement, puis enregistrez le classeurChapitre01.

Page 40: Excel 2007 VBA

20 Chapitre 1 Création d’une macro pour effectuer des tâches simples

5. Cliquez sur le bouton Macros, sélectionnez AffichagePropre, puis cliquezsur Modifier pour examiner le code résultant.

En ignorant les lignes de commentaires, voici ce à quoi il ressemble :

Sub AffichagePropre() ActiveWindow.DisplayGridlines = False ActiveWindow.DisplayHeadings = False Application.DisplayFormulaBar = FalseEnd Sub

Les instructions de cette macro ressemblent à celle de la macro FormatMonétaire.Vous devez comprendre la première comme signifiant « Mettre l’état Afficher lequadrillage de la fenêtre active à ‘Faux’ ». Vous ne modifiez pas cette fois les cel-lules sélectionnées mais la fenêtre active. La deuxième instruction modifie égale-ment quelque chose qui concerne la fenêtre active, mais la troisième modifie unobjet nommé Application. Dans chaque cas, vous modifiez une propriété d’unobjet. Une fenêtre de classeur possède des propriétés différentes de celles d’uneplage de cellules, ces deux objets possédant des propriétés différentes de cellesde l’application. Un objet n’est en réalité qu’un moyen de regrouper des proprié-tés. Il n’existe rien qui ressemble à une barre de formule pour une plage de cellu-les, tandis qu’une même feuille de calcul peut posséder plusieurs fenêtres,chacune avec ses propres réglages de quadrillage et d’en-têtes.

Exécution d’une macro depuis l’éditeur Visual BasicL’examen de la macro devrait vous permettre de deviner ce qu’il faut faire pouractiver ces dispositifs d’affichage.

1. Remplacez chacune des trois occurrences du mot False par le mot True.

Vous ne pouvez pas vous servir d’une touche de raccourci depuis l’éditeurVisual Basic, mais celui-ci dispose de son raccourci intégré pour exécuter lamacro que vous modifiez.

2. Appuyez sur F5 pour exécuter la macro.

Le quadrillage réapparaît dans la feuille de calcul Excel active. Un appui surF5 depuis l’éditeur Visual Basic est un moyen simple pour exécuter unemacro tandis que vous la testez.

Astuce Outre l’emploi de F5 pour exécuter la macro active depuis l’éditeur VisualBasic, vous pouvez cliquer sur le bouton Exécuter Sub/UserForm de la barred’outils. De même, si vous voulez pouvoir employer la boîte de dialogue Macropour sélectionner la macro à exécuter, cliquez à l’extérieur de toute macro avantd’appuyer sur F5.

Page 41: Excel 2007 VBA

Manipulation de propriétés enregistrées 21

3. Appuyez à trois reprises sur CTRL+Z pour remettre toutes les valeurs True àFalse.

4. Appuyez sur F8 pour exécuter la macro. L’instruction Sub devient jaune,mais c’est tout. F8 effectue un pas à pas dans la macro, n’exécutant qu’uneinstruction à la fois. Celle permet d’examiner ce qu’effectue la macro.

5. Appuyez à nouveau sur F8 pour sélectionner la première instruction ducorps de la macro. Placez le pointeur de la souris sur le DisplayGridlines dansl’instruction jaune. Vous devriez constater que l’état actuel de la propriétéest True.

6. Appuyez à nouveau sur F8 pour exécuter l’instruction (et sélectionner la sui-vante). Placez à nouveau le pointeur de la souris sur le mot DisplayGridlinesdans l’instruction qui vient d’être exécutée. Vous devriez constater que l’étatactuel de la propriété est maintenant False, parce que la macro vient de lemodifier.

7. Appuyez sur F5 pour exécuter le reste de la macro.

Une des choses bien sympathique à propos des propriétés est que vous pouvezemployer les mêmes termes pour connaître la valeur actuelle d’une propriété.Cela permet de modifier votre macro en une autre qui inverse, ou fait basculer, lavaleur des propriétés.

Emploi d’une macro pour inverser la valeur d’une propriétéSi une propriété emploie comme valeurs True et False, vous pouvez basculer entreces valeurs à l’aide du mot clé VBA Not. C’est une façon de dire avec sarcasme« Très drôle ! Non ! ». Vous demandez d’abord à Excel quelle est la valeur actuelle,puis inversez celle-ci et réaffecter la valeur résultante à la propriété. Voicicomment :

1. Sélectionnez ActiveWindow.DisplayGridlines, et copiez-le.

2. Sélectionnez le mot présent après le signe égal (c’est probablement False).Remplacez ce mot par Not, saisissez un espace, puis collez les mots quevous aviez copiés.

L’instruction obtenue est

ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines

Le mot clé Visual Basic Not transforme la valeur True en False et False enTrue.

Page 42: Excel 2007 VBA

22 Chapitre 1 Création d’une macro pour effectuer des tâches simples

3. Répétez le processus pour les deux autres instructions : copiez tout ce qui setrouve à gauche du signe égal et copiez-le à droite de celui-ci, en rempla-çant la constante actuelle et en ajoutant avant le mot Not.

4. Modifiez le nom de la macro de AffichagePropre en BasculeAffichagePro-pre pour mieux décrire les nouvelles capacités de la macro.

Voici ce à quoi devrait désormais ressembler la macro :

Sub BasculeAffichagePropre() ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines ActiveWindow.DisplayHeadings = Not ActiveWindow.DisplayHeadings Application.DisplayFormulaBar = Not Application.DisplayFormulaBarEnd Sub

5. Cliquez sur le bouton Enregistrer dans l’éditeur Visual Basic. Cela enregistrele classeur qui contient les macros.

6. Cliquez quelque part à l’intérieur de la macro BasculeAffichagePropre, puisappuyez plusieurs fois sur F5 pour tester la macro.

La macro lit la valeur actuelle de la propriété, inverse sa valeur grâce au mot cléNot, puis affecte la nouvelle valeur inversée à la propriété. Vous devriez déjà voirse dessiner la façon de créer une macro utilitaire simple : commencez par testerune action de façon interactive, puis répétez cette tâche après avoir lancé l’enre-gistreur de macro. Enfin, ajustez si nécessaire la macro enregistrée.

Élimination des objets répétés dans une macro enregistréeVous pourriez remarquer que votre macro contient désormais quatre fois le motActiveWindow. Il s’agit chaque fois d’un objet suivi d’une propriété. D’après ce quevous avez vu faire l’enregistreur, pouvez-vous penser à une façon de ne direqu’une fois ActiveWindow ?

Déplacez l’objet dans une structure With, puis faites précéder chaque propriétépour cet objet d’un simple point. Fermez la structure lorsque vous en avez fini.Voici comment procéder :

1. Placez le point d’insertion juste avant la première occurrence du mot Acti-veWindow, puis saisissez With suivi d’un espace.

2. Placez le point d’insertion juste avant le premier point puis appuyez surENTRÉE, pour créer une nouvelle ligne.

3. Supprimez les trois autres occurrences du mot ActiveWindow, mais laisseztoujours le point initial.

4. Juste avant le mot Application, insérez une nouvelle ligne et saisissez EndWith.

Enregistrer

Page 43: Excel 2007 VBA

Manipulation de propriétés enregistrées 23

5. Appuyez sur TAB pour augmenter l’indentation et sur RETOURARRIÈRE pourdiminuer l’indentation de façon à rendre évident quelles instructions appar-tiennent à la structure. La structure terminée devrait ressembler à ceci :

With ActiveWindow .DisplayGridlines = Not .DisplayGridlines .DisplayHeadings = Not .DisplayHeadingsEnd With

6. Appuyez sur F5 pour tester vos modifications.

La macro devrait inverser l’affichage, comme précédemment.

7. Créez une structure With pour l’objet Application, même s’il n’apparaît quedeux fois, dans la même instruction.

La structure terminée devrait ressembler à ceci :

With Application.DisplayFormulaBar = Not.DisplayFormulaBarEnd With

8. Appuyez sur F5 pour tester vos modifications, puis enregistrez le classeurChapitre01.

Les propriétés sont un outil très puissant. Lorsque vous détectez une instructiond’affectation de propriété dans une macro enregistrée, vous pouvez probable-ment identifier de magnifiques possibilités d’amélioration de la macro.

Exécution d’une macro depuis la barre d’outils Accès rapideLes raccourcis clavier sont pratiques, mais difficiles à mémoriser. Si vous voulezêtre capable d’exécuter rapidement une macro sans devoir vous souvenir de satouche de raccourci, vous pouvez ajouter un bouton personnalisé à la barred’outils Accès rapide d’Excel. Cette barre d’outil offre une sympathique possibilité :un bouton ajouté peut n’apparaître que lorsque le classeur qui contient la macroest actif. Cela évite d’encombrer la barre d’outils Accès rapide de boutons inutili-sables.

1. Dans la fenêtre principale d’Excel, effectuez un clic droit n’importe où dansla barre d’outils Accès rapide (la ligne de boutons située à côté du BoutonMicrosoft Office), puis cliquez sur Personnaliser la barre d’outils Accèsrapide.

Cela affiche l’onglet Personnaliser de la boîte de dialogue Options Excel.

2. Dans la liste Personnaliser la barre d’outils Accès rapide, sélectionnezPour Chapitre01.xlsm. Cela ne rendra le bouton visible uniquement lors-que le classeur Chapitre01 est actif.

Page 44: Excel 2007 VBA

24 Chapitre 1 Création d’une macro pour effectuer des tâches simples

3. Dans la liste Choisir les commandes dans les catégories suivantes, sélec-tionnez Macros, sélectionnez BasculeAffichagePropre, puis cliquez surAjouter.

Le nom de la macro se déplace dans la liste de droite, mais affiche une icônegénérique qui ne vous aide guère à vous souvenir du but de la macro.

4. Sélectionnez la macro BasculeAffichagePropre dans la liste de droite, puiscliquez sur Modifier.

5. Dans la boîte de dialogue Bouton Modifier, sélectionnez l’icône de boîteblanche (pour symboliser un affichage propre), puis modifiez Nom com-plet en Bascule Affichage propre, ce qui facilite la lecture de l’info bullesans affecter le nom de la macro.

6. Cliquez à deux reprises sur OK pour fermer les deux boîtes de dialogue etrevenir à Excel, qui affiche désormais un nouveau bouton Macro BasculeAffichage dans la barre d’outils Accès rapide.

7. Pour essayer le nouveau bouton Bascule Affichage propre, ajoutez unnouveau classeur (ce qui fait disparaître le bouton), puis fermez-le : le bou-ton réapparaît.Bascule

Affichage propre

Page 45: Excel 2007 VBA

Enregistrement de méthodes dans une macro 25

Enregistrement de méthodes dans une macroJusque-là, dans toutes les macros que vous avez créées, l’enregistreur de macro aemployé des affectations de propriété pour effectuer des actions. Affecter unevaleur à une propriété n’est toutefois parfois pas la meilleure façon d’effectuer uneaction. Par exemple, il est parfois indispensable d’effectuer plusieurs modifica-tions simultanément : affecter des propriétés n’est pas la meilleure façon d’avoirtout bien synchronisé.

La macro BasculeAffichagePropre est un bon exemple de ceci : comme chaquepropriété est indépendante des autres, il est très facile de se retrouver dans unétat de bascule incohérent. C’est pourquoi le modèle objet d’Excel propose unautre moyen d’effectuer une action. Cette seconde manière porte le nom deméthode. Vous pouvez examiner une méthode au travail à l’aide de l’enregistreurde macro.

Conversion d’une formule en valeur à l’aide de commandes du menuPar exemple, supposons que vous vouliez geler les formules de certaines cellulesde la feuille de calcul Budget à leurs valeurs actuelles. Transformez d’abord les for-mules en valeurs à l’aide de commandes du menu, en examinant avec soinlorsqu’Excel demande ou non des informations complémentaires. Créez ensuiteune macro capable de modifier des formules en valeurs pour une sélection quel-conque.

1. Commencez par activer la fenêtre Budget, puis sélectionnez la cellule D4.Remarquez la formule dans la barre de formule : =D3-D54.

2. Effectuez un clic droit sur la cellule, puis cliquez sur la commande Copier.

3. Effectuez à nouveau un clic droit sur la cellule, puis cliquez sur la commandeCollage spécial. La boîte de dialogue Collage spécial apparaît. Cette boîtede dialogue comporte quatre parties indépendantes : le groupe Coller, legroupe Opération et les cases à cocher Blancs non compris et Transposer.Vous ne pouvez choisir qu’une option dans chaque partie, si bien que cetteboîte de dialogue propose finalement quatre choix distincts.

Page 46: Excel 2007 VBA

26 Chapitre 1 Création d’une macro pour effectuer des tâches simples

4. Sélectionnez l’option Valeurs dans le groupe Coller, puis cliquez sur OK.Excel colle la valeur de la cellule dans la cellule active, éliminant la formulequ’elle renfermait. La bordure clignotante est encore visible autour de la cel-lule, indiquant que vous pouvez coller la valeur à nouveau ailleurs.

5. Appuyez sur la touche ECHAP pour sortir du mode copie et éliminer la bor-dure clignotante.

Dans la barre de formule, la cellule D4 contient maintenant la valeur28094,9.

Copier et coller des valeurs de cellule sont des actions qui ne se prêtent pas à desimples affectations de propriétés. Lorsque vous exécutez la commande Copier, àquelle propriété cela pourrait-il correspondre ? Remarquez également que, lorsd’une copie, vous ne voyez pas de boîte de dialogue. Excel place simplement unebordure clignotante autour de la ou des cellules. Vous n’indiquez pas à Excel com-ment effectuer la copie.

Lorsque vous exécutez la commande Collage spécial, vous voyez en revanche uneboîte de dialogue. Excel a besoin d’information complémentaire sur la façon dontvous voulez que le collage s’effectue. Souvenez-vous de l’onglet Alignement de laboîte de dialogue Formater une cellule. Cette boîte de dialogue proposait plu-sieurs options, mais celles du Collage spécial sont différentes, car elles interagis-sent mutuellement. Si vous sélectionnez simultanément les options Valeurs,Ajouter et Blancs non compris, celles-ci se combinent pour affecter une mêmeaction de collage. En raison de la nature interactive de tous les contrôles de cetteboîte de dialogue, comment serait-il possible d’y parvenir avec une simple affec-tation de propriété ? Lorsque vous enregistrez le même processus dans unemacro, vous voyez en quoi une méthode diffère d’une propriété.

Page 47: Excel 2007 VBA

Enregistrement de méthodes dans une macro 27

Conversion d’une formule en valeur à l’aide d’une macroVous pouvez apprendre comment une macro emploie des méthodes en enregis-trant une macro qui convertit des formules en valeurs. En examinant la macroenregistrée, vous pouvez comparer les instructions qui concernent les actions quiaffichent ou n’affichent pas de boîte de dialogue.

1. Dans la feuille de calcul Budget, sélectionnez la cellule E4. Remarquez la for-mule dans la barre de formule : =E3-E54.

2. Cliquez sur Enregistrer une macro, remplacez le nom par défaut par Con-versionEnValeurs, appuyez sur MAJ+V pour définir la touche de raccourcicomme CTRL+MAJ+V, puis cliquez sur OK.

3. Effectuez un clic droit sur la cellule E4, puis cliquez sur Copier.

4. Effectuez à nouveau un clic droit sur la cellule E4, puis cliquez sur Collagespécial, cliquez sur l’option Valeurs, puis cliquez sur OK.

5. Appuyez sur la touche ECHAP pour supprimer la bordure clignotante.

6. Cliquez sur le bouton Arrêter l’enregistrement, puis enregistrez le classeurChapitre01. Dans la barre de formule, la cellule E4 contient maintenant lavaleur 28332,9.

7. Passez à l’éditeur Visual Basic pour examiner la macro enregistrée.

Outre les commentaires, la macro ressemble à ceci :

Sub ConversionEnValeurs() Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = FalseEnd Sub

La structure fondamentale de cette macro est identique à celle des autres macrosprécédemment abordées dans ce chapitre : elle débute par une instruction Sub etfinit par un End Sub, avec un paquet d’instructions entre les deux. De même, ladernière instruction du corps de la macro emploie une familière affectation depropriété pour définir la valeur de la propriété CutCopyMode. Telle est la façondont Excel interprète l’appui sur ECHAP pour supprimer la bordure clignotanteautour de la sélection.

Dépannage Si vous aviez fermé l’éditeur, allez dans l’onglet Affichage du ruban,cliquez sur Macros, sélectionnez ConversionEnValeur, puis cliquez sur Modifier.

Page 48: Excel 2007 VBA

28 Chapitre 1 Création d’une macro pour effectuer des tâches simples

Ces deux instructions qui débutent par Selection sont toutefois nouvelles. Aucunene possède de signe égal.

L’instruction Selection.Copy comporte deux mots séparés par un point. Un motsuivi d’un point est probablement un objet, et tel est exactement le cas : un objetplage de cellules. Le mot Copy n’est toutefois pas une propriété : c’est uneméthode. C’est pourquoi il est dépourvu de signe égal suivant. Vous n’affectezrien à Copy : vous vous contentez de l’exécuter. Souvenez-vous qu’un objet n’esten réalité qu’une façon de regrouper les commandes disponibles. Vous pouvezcopier une plage de cellules, mais pas, par exemple, une fenêtre de classeur : iln’existe rien comme ActiveWindow.Copy.

Lorsque vous exécutez la commande Copier d’Excel, vous ne voyez pas de boîtede dialogue demandant une quelconque information complémentaire. De lamême façon, lorsque vous employez la méthode Copy dans une macro, vous nefournissez aucune autre information à la méthode.

L’instruction suivante débute par Selection.PasteSpecial. Une fois encore, le motsuivi d’un point, Selection, fait référence à un objet. De même, le mot qui suit lepoint, PasteSpecial, n’est pas suivi d’un signe égal. Ce n’est donc pas une propriété,mais une autre méthode.

Lorsque vous exécutez la commande Collage spécial d’Excel, vous voyez une boîtede dialogue qui permet de fournir des informations complémentaires à la com-mande. De la même façon, lorsque vous employez la méthode PasteSpecial dansune macro, vous procurez à la méthode les mêmes informations complémentai-res. Les éléments d’information complémentaire procurés à une méthode sontnommés arguments.

Employer une méthode ressemble à donner des instructions à votre fils de neufans. Certains ordres, comme « Viens dîner ! », ne nécessitent aucune informationcomplémentaire. D’autres, comme « Va chez l’épicier », demandent desprécisions : ce qui doit être acheté (du lait), comment y aller (à bicyclette) etquand revenir (tout de suite). Donner ces informations complémentaires à votrefils est comme procurer à Excel des précisions supplémentaires. Dans les deux cas,il s’agit d’arguments.

Les quatre arguments employés avec la méthode PasteSpecial correspondentprécisément aux quatre parties distinctes de la boîte de dialogue Collage spécial.Le nom de chaque argument est d’ailleurs le libellé de la version anglaise de laboîte de dialogue : Paste, Operation, SkipBlanks et Transpose.

Lorsque vous employez un argument, il est en fait superflu de préciser son nom.Cette instruction fonctionnerait aussi bien sous la forme

Page 49: Excel 2007 VBA

Enregistrement de méthodes dans une macro 29

Selection.PasteSpecial xlPasteValues, xlNone, False, False

Les noms ne servent qu’à faciliter la lecture, ce pourquoi l’enregistreur de macroles inclut. Si vous employez un nom d’argument, vous placez un signe deux-pointségal (:=) entre le nom de l’argument et sa valeur. Le signe deux-points égal com-prend un signe égal, mais vous ne pouvez le confondre avec une instructiond’affectation car le signe égal de celle-ci comporte obligatoirement un espace dechaque côté.

Amélioration de la lisibilité d’une longue instructionLorsque l’instruction d’une macro dépasse environ 70 caractères, l’enregistreur demacro insère un espace et un trait de soulignement ou underscore ( _) après unmot adéquat et poursuit l’instruction sur la ligne suivante. Le trait de souligne-ment indique que la macro doit traiter la seconde ligne comme partie de la mêmeinstruction. Vous pouvez manuellement répartir de longues instructions en plu-sieurs lignes, tant que vous le faites après un espace. Vous pouvez égalementindenter des lignes apparentées à l’aide de tabulations pour faciliter la lecture dela macro.

1. Dans la macro ConversionEnValeurs, placez chaque argument de l’instruc-tion PasteSpecial sur une ligne distincte, à l’aide d’un espace et d’un trait desoulignement placés à la fin de chaque ligne, sauf la dernière.

Sub ConversionEnValeurs() Selection.Copy Selection.PasteSpecial _ Paste:=xlValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False Application.CutCopyMode = FalseEnd Sub

Diviser une instruction en plusieurs lignes ne modifie pas le fonctionnementde la macro : cela ne fait que la rendre plus facile à lire par un humain.

2. Dans Excel, sélectionnez la cellule F4 et appuyez sur CTRL+MAJ+V pour exé-cuter la macro. Vérifiez dans la barre de formule que la formule a bien étéremplacée par une valeur.

3. Enregistrez le classeur Chapitre01.

La plupart des macros de ce chapitre modifient la propriété d’un objet. Celle-ciexécute en revanche la méthode d’un objet. Propriétés et méthodes sont séparéesdes objets à l’aide d’un point et permettent d’effectuer une action. Vous affecteztoutefois une valeur à une propriété pour effectuer l’action, tandis que vous exé-

Page 50: Excel 2007 VBA

30 Chapitre 1 Création d’une macro pour effectuer des tâches simples

cutez simplement une méthode, en lui fournissant éventuellement des argu-ments.

Approbation des classeurs prenant en charge les macros

Si vous employez fréquemment des classeurs qui contiennent des macros, devoiractiver les macros lors de chaque ouverture d’un classeur peut se révéler pénible.Vous pourriez être tenté de désactiver l’avertissement. Ne le faites surtout pas !Supprimer l’avertissement augmente dramatiquement la vulnérabilité de votreordinateur aux virus de macros. Excel 2007 propose deux alternatives simples quipermettent d’éliminer en toute sécurité l’avertissement pour des classeursapprouvés. Une des solutions consiste à approuver l’emplacement des classeursde macros. L’autre implique l’approbation du créateur (ou éditeur) du classeur.

Spécification d’un emplacement approuvé pour les macrosLe concept d’emplacement approuvé signif ie que vous désignez un dossiercomme approuvé, puis n’y placez que les classeurs prenant en charge les macrosque vous savez être parfaitement inoffensifs. Excel peut alors ouvrir tout classeurprenant en charge les macros stockées dans ce dossier sans avertissement. Confi-gurer un emplacement approuvé est un peu compliqué, mais vous n’avez à lefaire que lors de l’approbation d’un nouvel emplacement.

1. Fermez le classeur Chapitre01, puis ouvrez-le à nouveau.

2. Dans la barre d’avertissement, cliquez sur le bouton Options, puis cliquezsur le lien Ouvrir le centre de gestion de la confidentialité situé en bas dela fenêtre surgissante.

3. Dans la boîte de dialogue Centre de gestion de la confidentialité, sélec-tionnez le groupe Emplacements approuvés, puis cliquez sur le boutonAjouter un nouvel emplacement.

Page 51: Excel 2007 VBA

Approbation des classeurs prenant en charge les macros 31

4. Dans la boîte de dialogue Emplacement de Microsoft Office approuvé,cliquez sur le bouton Parcourir. Naviguez jusqu’au dossier créé pour le clas-seur prenant en charge les macros Chapitre01, puis cliquez sur OK pour pla-cer le nom du dossier dans la zone Chemin d’accès.

5. Cliquez à trois reprises sur le bouton OK pour ajouter le dossier et fermer lesboîtes de dialogue. Le message d’avertissement devrait disparaître.

6. Fermez le classeur, puis ouvrez-le à nouveau. Il devrait s’ouvrir sans messaged’avertissement.

7. Sélectionnez les cellules D16:F23 et appuyez sur CTRL+MAJ+C pour affecteraux cellules le format monétaire personnalisé.

Cela confirme que la macro fonctionne encore.

Lorsque vous placez un classeur dans un emplacement approuvé, vous n’avez pasà activer explicitement les macros. La responsabilité de veiller à ce que tous lesemplacements approuvés ne contiennent que des documents dignes de con-fiance vous incombe. Certains dossiers, comme le dossier Temporary InternetFiles, ne peuvent jamais devenir des emplacements approuvés. Vous pourriez

Page 52: Excel 2007 VBA

32 Chapitre 1 Création d’une macro pour effectuer des tâches simples

également souhaiter examiner la liste des dossiers approuvés par défaut par Excelet en supprimer certains, à titre de précaution.

Désignation d’un éditeur de macros approuvéSpécifier un emplacement approuvé est parfait lorsque vous pouvez stocker tousles classeurs qui prennent en charge les macros dans un nombre de dossiers trèslimité. C’est également parfait si vous recevez des classeurs prenant en charge lesmacros depuis plusieurs collègues dignes de confiance. Si en revanche vous créezdes classeurs prenant en charge les macros et devez les stocker à des emplace-ments quelconques, vous pouvez vous désigner comme éditeur approuvé.

Vous avez besoin pour cela tout d’abord d’un classeur à macro(s) qui n’est pasplacé dans un emplacement approuvé.

1. Cliquez sur le Bouton Microsoft Office, pointez vers Enregistrer sous, puiscliquez sur Classeur prenant en charge les macros.

2. Naviguez jusqu’à un dossier non approuvé (comme le dossier principal desfichiers d’exercices de ce livre), modifiez le nom du classeur enChapitre01A.xlsm, puis cliquez sur Enregistrer.

Pour vous approuver en tant que créateur (éditeur), vous devez être capable deprouver qui vous êtes. Pour ce faire, vous devez d’abord créer un identifiantnumérique. Le Bouton Microsoft Office propose un raccourci qui permet de créerl’ID numérique dont vous avez besoin.

1. Dans Excel, cliquez sur le Bouton Microsoft Office, pointez vers Préparer,puis cliquez sur Ajouter une signature numérique.

2. Dans la boîte de dialogue Obtenir une identification numérique, sélec-tionnez Créer votre propre identification numérique.

Dépannage Si vous voyez un message qui vous propose de visiter MicrosoftOffice Marketplace, cliquez sur OK pour atteindre la boîte de dialogue Obtenir uneidentification numérique.

Page 53: Excel 2007 VBA

Approbation des classeurs prenant en charge les macros 33

La création de votre propre identifiant numérique est fiable, mais cet IDn’est valide que pour vous et sur l’ordinateur actif. Si un autre utilisateurouvre une session sur votre ordinateur, cet ID ne sera pas valide pour lui. Sivous copiez le classeur sur un autre ordinateur, l’ID n’y sera plus valide. Sivous avez besoin d’un ID numérique qui puisse être employé dans de mul-tiples environnements, vous pouvez en obtenir un d’une source approuvée.Vous pouvez soit en acquérir un, soit vérifier auprès du service Informatiquede votre entreprise s’ils peuvent vous fournir un ID numérique qui puisseêtre employé au sein de l’entreprise.

3. Cliquez sur OK pour afficher la boîte de dialogue Créer un identifiantnumérique. Entrez votre nom et toute éventuelle information complémen-taire que vous jugez utile.

4. Cliquez sur Créer, puis arrêtez-vous.

5. Ne cliquez pas sur le bouton Signer. Ne passez pas la case Départ. Ne tou-chez pas 200 €. Cliquez sur Annuler.

Page 54: Excel 2007 VBA

34 Chapitre 1 Création d’une macro pour effectuer des tâches simples

6. Passez à l’éditeur Visual Basic, cliquez sur le menu Outils, puis cliquez surSignature électronique. La partie supérieure de la boîte de dialogue Signa-ture montre si le projet est actuellement signé. La partie du bas montre lessignatures numériques actuellement approuvées.

7. Cliquez sur le bouton Choisir, puis, dans la liste Sélectionnez un certificat,sélectionnez le certificat que vous venez de créer. Il devrait porter votrenom.

8. Cliquez sur OK.

9. Après avoir vérifié que le projet est désormais signé à l’aide de votre certifi-cat, cliquez à nouveau sur OK.

Important L’ajout d’une signature numérique à un classeur diffère de l’ajoutd’une signature numérique à un projet VBA stocké dans le classeur. La commandePréparer du Bouton Microsoft Office est un moyen pratique de créer un nouvelidentifiant numérique, mais si vous signez effectivement le document, vous inter-disez toute modification ultérieure des cellules du classeur. En revanche, lorsquevous ajoutez une signature à un projet VBA, seules les macros sont signées et cha-cun peut encore modifier à sa guise le classeur. Veillez à bien ajouter la signaturedepuis l’éditeur Visual Basic.

Page 55: Excel 2007 VBA

Approbation des classeurs prenant en charge les macros 35

Vous possédez maintenant un ID numérique que vous avez employé poursigner le projet. Il reste toutefois une étape : vous n’avez pas encore indiquéà Excel qui vous voulez approuver comme éditeur.

10. Repassez à Excel et fermez le classeur Chapitre01A, en enregistrant lesmodifications (la signature du projet VBA) à l’emplacement non approuvé.

11. Ouvrez à nouveau le classeur et cliquez sur Options dans la barre Avertis-sement de sécurité. Une alerte de sécurité obscure apparaît, dont le sensest en pratique « Vous n’avez pas encore choisi de vous approuver vous-même ».

12. Réfléchissez bien. Si vous décidez de vous faire confiance pour ne publierque des macros incapables de détruire votre propre ordinateur, sélectionnezApprouver tout à partir de l’éditeur, puis cliquez sur OK.

13. Fermez le classeur et ouvrez-le à nouveau. Aucun avertissement n’apparaît.

14. Sélectionnez une cellule qui contient une formule, puis appuyez surCTRL+MAJ+V pour vérifier le bon fonctionnement de la macro.

15. Pour confirmer la liste Editeurs approuvés, cliquez sur le Bouton MicrosoftOffice, puis cliquez en bas sur Options Excel.

16. Sélectionnez l’onglet Centre de gestion de la confidentialité puis cliquezsur le bouton Paramètre du centre de gestion de la confidentialité, àdroite.

17. Sélectionnez l’onglet Editeurs approuvés et constatez la présence de votrecertificat.

Dépannage Selon la façon dont vous ouvrez et fermez le classeur, une autreforme d’alerte de sécurité peut apparaître immédiatement. Cliquez simplement surle bouton Approuver tout à partir de l’éditeur dans cette alerte de sécurité et pour-suivez.

Page 56: Excel 2007 VBA

36 Chapitre 1 Création d’une macro pour effectuer des tâches simples

Vous pouvez annuler l'approbation d'un éditeur et vérifier que votre certifi-cat figure bien dans la liste.

18. Cliquez deux fois sur Annuler pour fermer les boîtes de dialogue.

La sécurité est une chose importante lors de la création de tout programme, ycompris donc les macros. Elle prend encore plus d’importance lorsque vous par-tagez des applications avec d’autres personnes. Si vous créez essentiellement desclasseurs prenant en charge les macros pour votre propre usage, un identifiantnumérique personnel est une solution aussi simple que souple. Si toutefois vouspartagez des classeurs prenant en charge les macros avec un petit groupe d’indi-vidus, l’approche par emplacements approuvés est probablement la meilleuresolution. Si vous devez créer des documents à macros activées pour une audienceplus large, mieux vaut obtenir une signature numérique authentifiée pour per-mettre aux autres de tirer profit de votre travail.

Important Vous pouvez vous servir de la commande Préparer pour créer unidentifiant numérique, mais pas pour supprimer un identifiant existant. Pour sup-primer un ID numérique de votre ordinateur, vous devez passer par les OptionsInternet du Panneau de configuration Windows. Dans l’onglet Contenu, cliquez surCertificats. La boîte de dialogue Certificats permet de supprimer ou d’importer descertificats numériques, mais pas de créer un nouvel ID numérique personnel. Lacréation d’un ID numérique personnel est une spécificité du système MicrosoftOffice 2007. Si vous supprimez un certificat numérique de votre ordinateur, cela nele supprime pas de la liste des éditeurs approuvés. Vous pourrez toujours employerle classeur prenant en charge les macros, mais toute modification apportée auxmacros détruira la signature du projet.

FERMEZ le classeur Chapitre01.xlsx.

Page 57: Excel 2007 VBA

Points clés 37

Points clés● La plus simple façon de démarrer et d’arrêter l’enregistrement de macros

consiste à employer le petit bouton de la barre d’état. Pour examiner ouexécuter des macros, servez-vous du bouton Macros de l’onglet Affichage.

● Ancrez, libérez, masquez ou affichez à volonté les fenêtres dans l’éditeurVisual Basic. C’est votre environnement de travail : faites-le travailler pourvous !

● Lorsque des macros sont relatives à un unique classeur, affectez-les à labarre d’outils Accès rapide uniquement pour ce classeur. Vous pourriez sou-haiter prendre plus de réflexion quant aux macros affectées à la barred’outils Accès rapide globale.

● N’hésitez pas à modifier ce qu’a créé l’enregistreur de macro : en enregis-trant une copie de sauvegarde de la macro originale, vous pourrez toujoursla restaurer. Supprimez les instructions et affectations de propriétés super-flues. Cela rendra votre macro plus compréhensible la prochaine fois quevous vous en servirez.

● Tirez profit des nouveaux dispositifs de sécurité pour sécuriser votre ordina-teur et le réseau de votre entreprise. Soyez prudent avant d’approuver undossier ou un éditeur. Si vous recevez un classeur prenant en charge lesmacros de quelqu’un d’autre, que vous lui fassiez confiance ou non, ouvrez-le en désactivant les macros et inspectez celles-ci avant de placer le classeurdans un emplacement approuvé.

Page 58: Excel 2007 VBA

Examen de l’exécution d’une macro en mode

pas à pas, page 43

Enregistrement d’une macro qui exécute d’autres

macros, page 67

Remplissage de cellules

vierges à l’aide d’une macro,

page 50

Saisie utilisateurd’une valeurpendant l’exécutiond’une macro,page 56

Coup d’œil sur le chapitre

Page 59: Excel 2007 VBA

39

2 Création d’une macro pour effectuer des tâches complexes

Ce chapitre aborde les points suivants :✔ Division d’un projet complexe en parties élémentaires.✔ Examen de l’exécution d’une macro instruction par instruction.✔ Saisie de valeur dans une macro pendant son exécution.✔ Enregistrement des mouvements relatifs à la cellule active.✔ Création d’une macro qui exécute d’autres macros.

Rube Goldberg s’est rendu célèbre par ses inventions de constructions complexescomprenant des centaines de morceaux qui font devenir ce qui aurait dû être unappareil simple horriblement complexe. Par exemple, son « réveil matin » à chatlaisse tomber une balle dans un seau. Le poids du seau déclenche un levier quilibère un jet d’eau qui réveille un chat. La société de jeux Milton Bradley a connudes années de triomphe avec le jeu du piège à souris (Mousetrap game), conçud’après un concept de Rube Goldberg.

Les « machins » de Rube Goldberg sont amusants à regarder. Deux énormes« machins » de Rube Goldberg en perpétuel fonctionnement situés dans le hallde l’aéroport international Logan de Boston ont amusé les voyageurs pendantdes heures.

L’amusement est une chose. Accomplir votre travail en est une autre. Par exemple,les étapes à accomplir pour obtenir un rapport mensuel peuvent être aussi com-plexes qu’une invention de Rube Goldberg. Vous commencez par importer lefichier des commandes mensuelles et y ajoutez de nouvelles colonnes. Ensuite,vous le triez et l’imprimez, puis le triez à nouveau différemment et l’imprimez ànouveau. Vous le collez ensuite à la fin du fichier d’historique cumulatif, et ainsi desuite. Chaque étape doit être effectuée avant de débuter la suivante. Vous en arri-verez rapidement à planifier vos vacances d’après le projet, parce que vous nevoulez pas entraîner quelqu’un d’autre à le faire. Non ?

Page 60: Excel 2007 VBA

40 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Un bon emploi des macros consiste à simplifier d’affreuses tâches à la Rube Gol-dberg. En plaçant les diverses étapes nécessaires à la création de ce monstrueuxrapport mensuel dans une macro, vous pouvez accomplir cette tâche d’un simpleclic.

Le secret de la création d’une macro capable de gérer un long et complexe projetconsiste à le diviser en petits morceaux, à créer une macro pour chaque morceau,puis à recoller ces morceaux. Si vous vous contentez de mettre en marche l’enre-gistreur, d’effectuer les 400 étapes, puis de croiser les doigts en espérant que toutse passe bien, vous avez environ une chance sur 400 de voir votre macro fonction-ner correctement. Examinons un exemple hypothétique.

En tant que comptable de Lucerne Publishing, vous possédez un projet de fin demois complexe que vous aimeriez automatiser pour pouvoir le déléguer à vossubordonnés lorsque vous êtes absent. Vous disposez d’un état résumé mensueldes commandes pour le mois précédent obtenu du système de gestion des com-mandes.

Cet état montre les ventes pour chaque combinaison d’état, de circuit de vente,de plage de prix et de catégorie. Le système de gestion des commandes génèrecet état sous forme de fichier texte. Vous préparez le fichier et ajoutez les com-mandes du nouveau mois dans une base de données d’historique cumulatif descommandes.

Ce chapitre montre comment enregistrer les tâches distinctes qui constituent cevaste et complexe projet en petites macros faciles à tester. Par la suite, vous com-binerez ces petites macros en une macro unique. Ce faisant, vous pourriez

Page 61: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 41

apprendre quelques techniques utiles également à l’accomplissement de vostâches quotidiennes.

Tâche un : ouverture du fichier d’étatLes commandes du mois le plus récent, Novembre 2007, se trouvent dans lefichier texte Nov2007. La première tâche consiste à ouvrir le fichier, à le répartir cefaisant en colonnes, puis à déplacer le fichier dans le classeur à l’aide de la macro.

Ouverture d’un fichier texte

1. Si la fenêtre du classeur Chapitre02 est maximisée, cliquez sur le boutonRestaurer la fenêtre (pour le classeur, pas pour l’application Excel).

2. Dans la barre d’état, cliquez sur le bouton Enregistrer une macro, saisissezcomme nom de macro ImportFichier, puis cliquez sur OK.

3. Cliquez sur le Bouton Microsoft Office, puis cliquez sur Ouvrir.

4. Sélectionnez Nov2007.txt dans la liste des fichiers, puis cliquez sur Ouvrir.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’information à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

SERVEZ-VOUS d’un nouveau classeur vierge prenant en charge les macros et desfichiers Orders.xlsx et Nov2007.txt. Ces fichiers sont situés dans le dossier Docu-ments\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer le nouveau classeur sous le nom Chapitre02.xlsx dans le dos-sier approuvé Travail créé au premier chapitre. Si vous n’avez pas créé de dossierapprouvé, vous devrez activer les macros à chaque fermeture et réouverture duclasseur. Pour plus de détail sur les classeurs prenant en charge les macros et lacréation d’un dossier approuvé, reportez-vous à « Enregistrement du classeur àmacro » dans le Chapitre 1 « Création d’une macro pour effectuer de simplestâches ».OUVREZ le classeur Chapitre02.xlsx.

Astuce Vous pourriez effectuer une première fois les étapes 3 à 6 avant d’enregis-trer la macro.

Page 62: Excel 2007 VBA

42 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

L’étape 1 de l’Assistant Importation de texte apparaît. Dans cette étape, lestrois premières lignes de l’état contiennent le titre de l’état suivi d’une lignevierge. Vous voulez sauter les trois premières lignes.

5. Modifiez la valeur Commencez l’importation à la ligne en 4.

6. Acceptez toutes les autres options par défaut, puis cliquez sur Terminer. Lefichier texte s’ouvre avec les colonnes réparties en colonnes Excel.

7. Déplacez vers le haut le bas de la nouvelle fenêtre pour pouvoir voir lesonglets situés en bas du classeur Chapitre02. Déplacez ensuite l’onglet de lafeuille Nov2007 sur l’onglet Feuille1 du classeur Chapitre02.

Page 63: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 43

La feuille de calcul Nov2007 est déplacée vers le classeur Chapitre02, tandisque le classeur Nov2007.txt disparaît : il a perdu son unique feuille de calculet un classeur ne peut exister sans au moins une feuille de calcul.

8. La ligne 2 contient des signes égal superflus. Sélectionnez la cellule A2. Surl’onglet Accueil du ruban, dans le groupe Cellules, cliquez sur la flècheSupprimer, puis cliquez sur Supprimer des lignes dans la feuille.

9. Sélectionnez la cellule A1, puis cliquez sur le bouton Arrêter l’enregistre-ment pour stopper l’enregistreur.

10. Enregistrez le classeur Chapitre02.

Vous devriez désormais disposer du fichier importé réparti en colonnes etdébarrassé des lignes superflues.

Examen pas à pas de l’exécution d’une macroPlutôt que de vous borner à lire une macro, vous pouvez suivre son exécution pasà pas. Cela permet de lire et de tester la macro tout en observant son fonctionne-

Astuce Vous posséderez plusieurs copies de la feuille de calcul Nov2007 aprèsavoir testé cette macro à plusieurs reprises. Ces copies multiples vous seront utilestandis que vous développerez les macros pour les tâches ultérieures du projet.Lorsque le classeur possède déjà une feuille de calcul nommée Nov2007, les nou-velles copies sont automatiquement nommées Nov2007 (2), Nov2007 (3), etc.

Page 64: Excel 2007 VBA

44 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

ment. Tant que vous effectuez le pas à pas, prenez des notes sur les modificationsmineures que vous pourriez vouloir apporter.

Lorsque vous suivez pas à pas l’exécution d’une macro, la fenêtre de l’éditeurVisual Basic apparaît par-dessus celle du classeur. Elle affiche la macro sélection-née et permet de voir quelle instruction va être exécutée.

1. Dans l’onglet Affichage du ruban, cliquez sur le bouton Macros. Sélection-nez ImportFichier dans la liste Nom de la macro, puis cliquez sur Pas àpas détaillé.

La fenêtre de l’éditeur Visual Basic apparaît par-dessus celle du classeur,avec la macro enregistrée visible dans le module. L’instruction qui est sur lepoint d’être exécutée est surlignée en jaune, avec une flèche jaune dans lamarge gauche. L’instruction surlignée, ici la première de la macro, contientle nom de celle-ci.

Sub ImportFichier()

2. Appuyez une ou deux fois sur F8 de façon à surligner l’instruction OpenTextsituée dans le corps de la macro.

Dans la macro que vous avez enregistrée, des détails spécifiques comme lesdivisions en lignes et les emplacements des fichiers et fenêtres différerontde ceux de cet exemple.

ChDir "C:\MSP\ExcelVBA07SBS"Workbooks.OpenText _Filename:="C:\MSP\ExcelVBA07SBS\Nov2007.txt", _Origin:=437, _StartRow:=4, _DataType:=xlFixedWidth, _FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(23, 1), _Array(28, 1), Array(43, 1), Array(53, 1)), _TrailingMinusNumbers:=True

L’instruction ChDir est présente ici parce que vous êtes passé au dossier quirenferme les fichiers d’exercice. ChDir signifie Change Directory car les dos-

Page 65: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 45

siers étaient auparavant nommés répertoires ou directories. Comme l’ins-truction OpenText contient le chemin d’accès complet vers le fichier,l’instruction ChDir est redondante. Elle pourrait toutefois se révéler pré-cieuse par la suite, si bien que nous la conservons.

La longue instruction OpenText ouvre le fichier texte. Vous pouvez proba-blement identifier l’argument qui spécifie le nom du fichier. Les argumentsOrigin et DataType sont les valeurs par défaut de la première étape del’Assistant Importation de texte. L’argument StartRow est la valeur que vousavez spécifiée comme nombre de lignes à sauter. L’argument FieldInfo spé-cifie comme répartir le fichier texte en colonnes. L’argument TrailingMinus-Numbers est sans intérêt puisque ce fichier est dépourvu de nombresnégatifs.

Soyez reconnaissant que l’enregistreur de macro crée cette instruction àvotre place ! Il répartit cette longue instruction en plusieurs lignes en pla-çant un espace et un trait de soulignement à la fin de chaque ligne partielle.Ces coupures ne s’effectuent toutefois pas aux emplacements les plus logi-ques. Lorsque vous affichez la macro, vous devriez rediviser l’instruction enlignes plus riches de signification. Vous pourriez employer comme exemplela façon dont l’instruction est divisée dans l’instruction OpenText précé-dente.

Pour ce type de processus, vous ouvrez un fichier différent chaque mois. Cemois, vous avez ouvert le fichier texte Nov2007. Le mois prochain, ce sera lefichier texte Dec2007. Notez de penser à modifier l’instruction de la macrode façon à vous laisser sélectionner le fichier spécifique à ouvrir. Vousapprendrez comment inviter l’utilisateur à saisir un nom de fichier dans laprochaine section.

3. Appuyez sur F8 pour ouvrir le fichier et surligner l’instruction, la premièreligne de cette structure With :

With ActiveWindow .Width = 452.25 .Height = 254.25End With

Ces quatre instructions ont été ajoutées lorsque vous avez déplacé la fenêtrehors du chemin. Vos propriétés Width et Height peuvent posséder desvaleurs différentes et, si vous avez déplacé la fenêtre, vous verrez des ins-tructions qui modifient également les propriétés Top et Left. Ce sont desexemples des événements accidentels qui surviennent lorsque vous enregis-trez une macro. Mieux vaut les éliminer de la macro finale.

Page 66: Excel 2007 VBA

46 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

4. Appuyez sur F8 pour parcourir pas à pas les instructions qui déplacent,modifient la taille ou activent des fenêtres. Notez de toutes les supprimer.Sélectionnez ensuite l’instruction suivante :

Sheets("Nov2007").Select

Cette instruction rend active la feuille de calcul Nov2007, bien qu’elle soitdéjà la feuille active. Un enregistreur de macro ne peut jamais être trop pru-dent. Vous pourrez également supprimer par la suite cette instruction.

5. Appuyez sur F8 pour sélectionnez la feuille déjà sélectionnée et notez desupprimer cette instruction. Cela surligne l’instruction suivante :

Sheets("Nov2007").Move _Before:=Workbooks("Chapitre02.xlsm").Sheets(1)

Cette instruction déplace la nouvelle feuille vers le classeur Chapitre02. Lors-que vous exécuterez toutefois cette macro le mois prochain, la feuille nesera pas nommée Nov2007, mais Dec2007.

6. Appuyez sur F8 pour déplacer la feuille de calcul et notez de penser à modi-fier la macro pour qu’elle fonctionne chaque mois. Cela surligne l’instructionsuivante :

Range("A2").Select

Cette instruction sélectionne la cellule A2 de la feuille de calcul.

7. Appuyez sur F8 pour sélectionner la cellule A2. Cela surligne l’instructionsuivante :

Selection.EntireRow.Delete

La plage de cellules sélectionnées ne comprend que la cellule A2. Commetoutefois cette instruction supprime la totalité de la ligne de la plage sélec-tionnée, elle supprime en pratique la ligne 2.

8. Appuyez sur F8 pour supprimer la ligne. Cela surligne la dernière instructiondu corps de la macro :

Range("A1").Select

Astuce Vous pouvez modifier de nombreuses instructions tant que vous exécutezpas à pas la macro. Par exemple, vous pourriez supprimer l’instruction Select. Cer-taines modifications peuvent toutefois vous imposer de redémarrer la macro. Parexemple, vous ne pouvez pas supprimer une structure With sans redémarrer lamacro. Vous pouvez toutefois supprimer des instructions individuelles dans unestructure With.Visual Basic vous avertit lorsque vous tentez d’effectuer une modification quinécessiterait le redémarrage de la macro.

Page 67: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 47

Cette instruction sélectionne la cellule A1. C’est juste une astuce pour laisserla macro à son emplacement « par défaut ».

9. Appuyez sur F5 pour exécuter le reste de la macro.

En résumé, voici la liste des modifications à apporter à la macro enregistrée :

● Supprimer les instructions superflues ;

● Permettre à l’utilisateur de choisir le fichier à ouvrir ;

● Permettre à la macro de fonctionner avec le fichier de n’importe quel mois.

Vous allez apprendre dans la section suivante comment effectuer ces modifica-tions.

Sélection d’un fichier pendant l’exécution d’une macroExcel propose une méthode qui invite l’utilisateur à ouvrir un fichier. Excel n’ouvrepas réellement le fichier, mais renvoie le nom de celui-ci, que vous pouvez alorstransmettre à la méthode OpenText.

1. Améliorez la lisibilité de l’instruction qui débute par Workbooks.Open en ladivisant en lignes significatives. Placez un espace et un trait de souligne-ment à la fin de chaque ligne partielle.

Suivez l’exemple de la macro ImportFichier de la section « Examen pas à pasde l’exécution d’une macro », plus tôt dans ce chapitre.

2. Insérez une nouvelle ligne immédiatement avant l’instruction Work-books.OpenText puis saisissez cette instruction :

myFile = Application.GetOpenFilename("Text Files,*.txt")

Dès que vous saisissez le point après Application, Visual Basic affiche la listede toutes les méthodes et propriétés applicables à un objet Application. Cedispositif est nommé Auto List Members. Le mot Members fait référence tantaux méthodes qu’aux propriétés. Lorsque vous saisissez la lettre G, la listedéfile pour montrer les méthodes et propriétés qui débutent par cette let-tre. Vous appuyez alors sur la touche flèche en bas pour sélectionnez GetO-penFilename, puis appuyez sur la touche TAB pour saisir le nom de laméthode dans la macro.

Lorsque vous saisissez la parenthèse ouvrante, Visual Basic affiche les argu-ments possibles pour la méthode GetOpenFilename. Ce dispositif estnommé Auto Quick Info. Ignorez cela pour le moment. Saisissez simplementles mots entre parenthèses tels que présentés au début de cette étape.

Page 68: Excel 2007 VBA

48 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

La méthode Application.GetOpenFilename affiche la boîte de dialogueOuvrir, exactement comme si vous aviez cliqué sur la commande Ouvrir dela liste du bouton Microsoft Office. Les mots entre parenthèses indiquent àla méthode de n’afficher que les fichiers texte : ceux qui se terminent parune extension .txt. Attention à bien saisir les guillemets comme présenté audébut de cette étape. Le mot myFile au début de l’instruction est une varia-ble, ou place réservée, qui va stocker le nom du fichier sélectionné.

3. Dans l’instruction Workbooks.OpenText, sélectionnez la totalité du nom defichier, y compris les guillemets, et supprimez-le. Saisissez à sa place myFile.

La première partie de l’instruction devrait alors ressembler à ceci :

Workbooks.OpenText _ Filename:=myFile, _ Origin:=xlMSDos, _ StartRow:=4, _

Lors de l’exécution de cette instruction, la variable myFile contiendra le nomdu fichier. Comme vous avez éliminé le chemin d’accès complet de laméthode OpenText, l’instruction ChDir située au début devient trèspratique : elle place automatiquement la fonction GetOpenFilename dans ledossier adéquat (en supposant que les fichiers textes concernés sont tou-jours placés au même endroit).

4. Supprimez les instructions qui modifient la taille de la fenêtre et celle quisélectionne la feuille Nov2007.

5. Modifiez les mots Sheets(“Nov2007”).Move en ActiveSheet.Move. Acti-veSheet est un mot clé qui fait référence à la feuille actuellement active.

Cela permet à votre macro de fonctionner avec la nouvelle feuille den’importe quel mois. À ce point, votre macro devrait ressembler à ceci :

Sub ImportFile() ChDir "C:\MSP\ExcelVBA07SBS" myFile = Application.GetOpenFilename("Text Files,*.txt") Workbooks.OpenText _ Filename:=myFile, _ Origin:=437, _ StartRow:=4, _ DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(23, 1), _ Array(28, 1), Array(43, 1), Array(53, 1)), _ TrailingMinusNumbers:=True ActiveSheet.Move Before:=Workbooks("Chapitre02.xlsm").Sheets(1)

Astuce Si vous voulez afficher tous les fichiers du dossier, sans vous limiter auxfichiers dotés d’une extension .txt, laissez simplement vides les parenthèses aprèsGetOpenFilename.

Page 69: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 49

Range("A2").Select Selection.EntireRow.Delete Range("A1").SelectEnd Sub

6. Enregistrez le classeur Chapitre02.

7. Appuyez sur F8 pour parcourir pas à pas la macro et examinez le fonction-nement de chaque instruction.

La macro devrait afficher la boîte de dialogue Ouvrir, en n’affichant que lesfichiers texte, puis ouvrir le fichier que vous sélectionnez, supprimer laligne 2 excédentaire et déplacer la feuille de calcul vers le classeurChapitre02.

8. Appuyez sur F5 pour exécuter la macro en mode normal. Elle devrait secomporter de la même façon.

Cela achève la macro pour la première tâche de votre projet de traitement de finde mois. Vous devriez à ce stade disposer de deux ou trois copies de la feuille decalcul Nov2007 dans le classeur Chapitre02. Vous êtes prêt à passer à la tâche sui-vante.

Tâche deux : remplissage des étiquettes manquantesLorsque le système de traitement des commandes génère un état mensuel, il neplace un libellé dans une colonne que lors de la première apparition de celui-ci.Éliminer les libellés répliqués est une façon de simplifier la lisibilité d’un état pourun humain. Pour toutefois que l’ordinateur puisse correctement trier et synthéti-ser les données, vous devez renseigner les libellés manquants.

Vous pourriez supposer qu’il va être nécessaire d’écrire une macro complexe pourexaminer chaque cellule, déterminer si elle est vide et, dans ce cas, quelle valeurdoit y être placée. Non. Vous allez exploiter les capacités intégrées d’Excel pour

Dépannage Si Option Explicit apparaît en haut de la feuille du module,supprimez-le avant de poursuivre.

Page 70: Excel 2007 VBA

50 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

que celui-ci effectue à votre place le gros du travail. Comme cette partie du projetaborde certains dispositifs puissants de feuille de calcul, procédez comme suitavant d’enregistrer la macro.

Sélection uniquement des cellules videsExaminez les emplacements où vous voulez placer les libellés manquants. Quellevaleur chaque cellule vide doit-elle renfermer ? C’est la valeur de la première cel-lule non vide située au-dessus d’elle. En pratique, en sélectionnant tour à tourchaque cellule vide et en y plaçant une formule qui pointe sur la cellule immédia-tement supérieure, vous obtenez le résultat souhaité. La plage des cellules pré-sente toutefois une forme irrégulière, ce qui rend effrayant le fait d’avoir à placerune formule dans chaque cellule vide. Excel dispose heureusement d’outil intégrécapable de sélectionner une plage irrégulière de cellules vides.

1. Dans une copie de la feuille de calcul Nov2007 du classeur Chapitre02,sélectionnez la cellule A1.

2. Dans l’onglet Accueil du ruban, dans le groupe Edition, cliquez sur la flècheRechercher et sélectionner puis cliquez sur Sélectionner les cellules.

3. Dans la boîte de dialogue Sélectionner les cellules, cliquez sur Zone encours puis cliquez sur OK.

Excel sélectionne la zone en cours ou current region : le rectangle de cellulesqui comprend la cellule active entourée de cellules vierges ou des frontièresde la feuille de calcul.

Astuce Vous pouvez également appuyer sur CTRL+* pour sélectionner la zone encours. Appuyez sur la touche CTRL et maintenez-la enfoncée en appuyant sur * surle pavé numérique ou sur MAJ+8 sur le clavier normal.

Page 71: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 51

4. Cliquez à nouveau sur la flèche Rechercher et sélectionner du ruban, cli-quez sur Sélectionner les cellules.

5. Dans la boîte de dialogue Sélectionner les cellules, cliquez sur l’optionCellules vides puis cliquez sur OK. Excel sélectionne alors uniquement lesous-ensemble des cellules vierges de la sélection précédente. Ce sont lescellules qui nécessitent de nouvelles valeurs.

Le dispositif intégré d’Excel Sélectionner les cellules peut vous épargner (ainsi qu’àvotre macro) pas mal de travail.

Remplissage de la sélection à l’aide de valeursVous voulez maintenant remplir chacune des cellules sélectionnées avec une for-mule qui pointe sur la cellule située juste au-dessus.

Normalement, lorsque vous saisissez une formule, Excel ne l’insère que dans lacellule active. Vous pouvez toutefois, en demandant poliment, obtenir d’Excelqu’il place simultanément la formule dans toutes les cellules sélectionnées.

1. Les cellules vierges étant sélectionnées et D3 étant la cellule active, saisissezun signe égal ( = ), puis appuyez sur la touche flèche en haut pour pointervers la cellule D2.

La référence de cellule D2, lorsqu’elle est employée dans une formule dansla cellule D3, signifie en fait « une cellule au-dessus dans la mêmecolonne ».

2. Appuyez sur CTRL+ENTRÉE pour placer la formule dans toutes les cellulesactuellement sélectionnées.

Lorsque la sélection comprend plus d’une cellule, si vous saisissez une for-mule et appuyez sur CTRL+ENTRÉE, la formule est copiée dans toutes les cel-lules de la sélection. Si vous appuyez sur la touche ENTRÉE sans avoir presséet gardée enfoncée la touche CTRL, la formule n’est placée que dans la cel-lule active. Chaque cellule avec la nouvelle formule pointe vers la cellulesituée immédiatement au-dessus.

Page 72: Excel 2007 VBA

52 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

3. Appuyez sur CTRL+* pour sélectionner la zone en cours.

4. Effectuez un clic droit sur n’importe quelle cellule sélectionnée puis cliquezsur Copier. Effectuez un clic droit sur n’importe quelle cellule sélectionnée,cliquez sur Collage spécial, cliquez sur l’option Valeurs puis cliquez sur OK.

5. Appuyez sur la touche ECHAP pour sortit du mode copie, puis sélectionnez lacellule A1.

Le bloc des cellules auparavant sans étiquettes contient désormais desvaleurs, si bien que le contenu ne sera pas modifié si vous triez les données.

Enregistrement du remplissage des valeurs manquantesDans cette section, vous allez sélectionner une autre copie de la feuille de calculimportée et suivre les mêmes étapes, mais après avoir démarré l’enregistreur demacro.

1. Sélectionnez une copie de la feuille de calcul Nov2007 (une dont les libelléssont encore absents) ou exécutez à nouveau la macro ImportFichier.

2. Cliquez sur le bouton Enregistrer une macro, saisissez RemplirLibellescomme nom de la macro puis cliquez sur OK.

3. Sélectionnez la cellule A1 (même si elle est déjà sélectionnée) puis appuyezsur CTRL+* pour sélectionner la zone en cours.

4. Cliquez sur la flèche Rechercher et sélectionner du ruban, cliquez surSélectionner les cellules, cliquez sur l’option Cellules vides, puis cliquezsur OK.

5. Saisissez un signe égal ( = ), appuyez sur la touche Flèche en haut, puisappuyez sur CTRL+ENTRÉE.

6. Appuyez sur CTRL+*, effectuez un clic droit et cliquez sur Copier. Effectuez ànouveau un clic droit, cliquez sur Collage spécial, cliquez sur l’optionValeurs, puis cliquez sur OK.

7. Appuyez sur la touche ECHAP pour sortir du mode copie, puis sélectionnez lacellule A1.

Page 73: Excel 2007 VBA

Tâche un : ouverture du fichier d’état 53

8. Cliquez sur le bouton Arrêter l’enregistrement puis enregistrez le classeurChapitre02.

Vous avez terminé la création de la macro RemplirLibelles.

Examen de l’exécution de la macro RemplirLibellesExaminez maintenant la macro tandis que vous l’exécutez en mode pas à pas.

1. Sélectionnez (ou créez) une autre copie de la feuille de calcul importée.

2. Dans l’onglet Affichage du ruban, cliquez sur le bouton Afficher lesmacros, sélectionnez la macro RemplirLibelles puis cliquez sur Pas à pasdétaillé. La fenêtre de l’éditeur Visual Basic apparaît avec la première ins-truction de la macro surlignée.

3. Appuyez sur F8 pour passer à la première instruction du corps de la macro :

Range("A1").Select

Cette instruction sélectionne la cellule A1. Peu importe la façon dont vousaviez atteint la cellule A1 : que ce soit par un clic sur la cellule, un appui surCTRL+DÉBUT ou des appuis successifs sur diverses touches fléchées, l’enregis-treur de macro se contente d’enregistrer le résultat du processus de sélec-tion.

4. Appuyez sur F8 pour sélectionner la cellule A1 et surligner l’instructionsuivante :

Selection.CurrentRegion.Select

Cette instruction sélectionne la zone en cours de la sélection originale.

5. Appuyez sur F8 pour sélectionner la zone en cours et passer à l’instructionsuivante :

Selection.SpecialCells(xlCellTypeBlanks).Select

Cette instruction sélectionne les cellules vierges de la sélection originale. Lemot clé SpecialCells est une méthode qui gère la plupart des options de laboîte de dialogue Sélectionner les cellules.

6. Appuyez sur F8 pour ne sélectionner que les cellules vierges et passer à l’ins-truction suivante :

Selection.FormulaR1C1 = "=R[-1]C"

Cette instruction affecte la formule =R[-1]C à la totalité de la sélection. Lors-que vous avez saisi la formule, vous avez vu =C2, pas =R[-1]C. La formule=C2 signifie en réalité « obtenir la valeur de la cellule située juste au-dessus », mais uniquement si la cellule active est la cellule C3. La formule

Page 74: Excel 2007 VBA

54 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

=R[-1]C signifie également « obtenir la valeur de la cellule située juste au-dessus », mais ce quelle que soit la cellule active.

Vous pourriez modifier cette instruction en Selection.Formula = "=C2" et lamacro fonctionnerait exactement de la même façon, tant que le fichier descommandes employé lors de l’exécution de la macro est strictement identi-que à celui employé lors de l’enregistrement de la macro et que la celluleactive est bien la cellule C3 lors de l’exécution de la macro. Si toutefois lacommande qui sélectionne les cellules vierges arrive à une cellule active dif-férente, la macro modifiée va échouer. L’enregistreur de macro a recours à lanotation R1C1 (ou L1C1, puisque le R de row correspond au L de ligne dansl’interface française : cela sera expliqué plus en détail plus loin) de façon àce que votre macro fonctionne toujours correctement.

Voir aussi Pour plus d’information sur la notation R1C1, reportez-vous à la section« Style de référence R1C1 » dans le Chapitre 4, « Objets de plages ».

7. Appuyez sur F5 pour exécuter les autres instructions de la macro :

Selection.CurrentRegion.SelectSelection.CopySelection.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=FalseApplication.CutCopyMode = FalseRange("A1").Select

Ces instructions sélectionnent la zone en cours, convertissent les formulesen valeurs, annulent le mode copie et sélectionnent la cellule A1.

Voir aussi Les dernières instructions de cette macro sont identiques à celles de lamacro CollageSpecial de la section « Conversion d’une formule en valeur à l’aided’une macro » du Chapitre 1, « Création d’une macro pour effectuer de simplestâches ».

Vous avez terminé la macro pour la deuxième tâche de votre projet de fin demois. Vous pouvez maintenant vous attaquer à la macro qui va accomplir la pro-chaine tâche : ajouter des dates.

Tâche trois : ajout d’une colonne de datesL’état de synthèse des commandes importé ne comporte pas de date sur chaqueligne, car cela serait inutile pour les personnes qui examinent ce rapport. Vousvoulez toutefois ajouter ces données à une liste générale de l’historique descommandes : celle-ci comporte des dates pour chaque ligne, puisqu’elle renfermeles données de plusieurs mois.

Page 75: Excel 2007 VBA

Tâche trois : ajout d’une colonne de dates 55

Ajout d’une date constanteVous allez d’abord créer une macro qui remplit la plage avec la date Nov-2007 eninsérant une nouvelle colonne A et en plaçant la date dans chaque ligne qui con-tient des données.

1. Sélectionnez une feuille de calcul avec les libellés remplis, cliquez sur le bou-ton Enregistrer une macro, saisissez comme nom de la macro AjoutDatespuis cliquez sur OK.

2. Sélectionnez la cellule A1. Dans l’onglet Accueil du ruban, cliquez sur la flè-che Insérer puis cliquez sur Insérer des colonnes dans la feuille. Excelinsère une nouvelle colonne A, en décalant vers la droite les autres colonnes.

3. Saisissez Date dans la cellule A1, puis appuyez sur ENTRÉE.

4. Appuyez sur CTRL+* pour sélectionner la zone en cours.

5. Sur l’onglet Accueil du ruban, cliquez sur la flèche Rechercher et sélection-ner, puis cliquez sur Sélectionner les cellules. Cliquez sur l’option Cellulesvides, puis cliquez sur OK pour ne sélectionner que les cellules vierges : cesont les cellules qui nécessitent une valeur date.

6. Saisissez Nov-2007, puis appuyez sur CTRL+ENTRÉE. Excel place la date danschaque ligne. Il affiche la date comme Nov-07, mais en stocke la totalité,comme vous pouvez le vérifier en examinant la barre de formule.

7. Sélectionnez la cellule A1, puis cliquez sur le bouton Arrêter l’enregistre-ment pour stopper l’enregistreur.

Parcours de la macroPour comprendre ce qu’a créé l’enregistreur de macro, examinez la macro tandisque vous l’exécutez pas à pas.

1. La cellule A1 étant sélectionnée, dans l’onglet Accueil du ruban, cliquez surla flèche Supprimer, cliquez sur Supprimer des colonnes dans la feuille,puis cliquez sur OK.

2. Dans l’onglet Affichage du ruban, cliquez sur le bouton Afficher lesmacros, sélectionnez la macro AjoutDates puis cliquez sur Pas à pasdétaillé.

En ignorant les commentaires, voici ce à quoi devrait ressembler la macro :

Sub AjoutDates() Range("A1").Select Selection.EntireColumn.Insert ActiveCell.FormulaR1C1 = "Date" Range("A2").Select Selection.CurrentRegion.Select

Page 76: Excel 2007 VBA

56 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Selection.SpecialCells(xlCellTypeBlanks).Select Selection.FormulaR1C1 = "Nov-2007" Range("A1").SelectEnd Sub

Cette macro est d’une grande simplicité. Remarquez que l’instruction quientre le mot Date a recours comme objet au nom ActiveCell, ce qui modifieuniquement la « formule » de la cellule active, alors que l’instruction quientre la date se sert comme objet du mot Selection, modifiant la « formule »de la totalité de la plage de cellules sélectionnée. Lorsque vous entrez uneformule uniquement à l’aide de la touche ENTRÉE, la macro se sert du motActiveCell. Lorsque vous le faites à l’aide de CTRL+ENTRÉE, la macro se sert dumot Selection. Si la sélection ne comporte qu’une unique cellule, ActiveCellet Selection sont équivalents.

En outre, n’employer que la touche ENTRÉE modifie la sélection en la cellulesituée immédiatement en dessous. C’est pourquoi l’instructionRange("A2").Select figure dans la macro. Elle ne fait aucun mal, mais n’en estpas moins superflue. La suppression des instructions superflues d’une macroenregistrée en facilite la lecture ainsi que les éventuelles futures modifica-tions.

3. Supprimez l’instruction Range("A2").Select de la macro.

4. Appuyez sur F8 de façon répétée pour parcourir la macro.

L’enregistreur enregistre toujours l’insertion d’une valeur dans une cellule à l’aidede la propriété FormulaR1C1, même si vous entrez une constante, juste au cas oùvous auriez entré une formule.

Invite de saisie d’une dateVotre macro enregistrée devrait fonctionner parfaitement, à condition que vousne l’exécutiez qu’avec le fichier texte Nov2007. Lors de la prochaine utilisation decette macro, vous travaillerez toutefois avec les commandes de décembre et nonplus avec celles de novembre. Vous devez donc modifier la macro pour qu’elleinsère la date adéquate. Une des façons de procéder consiste à faire que la macrovous demande la date lors de son exécution.

1. Insérez une nouvelle ligne après les commentaires dans la macro AjoutDa-tes, puis saisissez cette nouvelle instruction :

myDate = InputBox("Entrez la date au format MMM-AAAA")

InputBox est une fonction Visual Basic qui demande des informations pen-dant l’exécution d’une macro. Les termes entre parenthèses constituent le

Page 77: Excel 2007 VBA

Tâche trois : ajout d’une colonne de dates 57

message affiché. La variable myDate stocke la date jusqu’à ce que la macrosoit prête à s’en servir.

Voir aussi Pour plus d’information sur la fonction InputBox, y compris la façon defaire fonctionner correctement la macro lorsque vous cliquez sur Annuler, reportez-vous à la section « Posez-vous une question » du Chapitre 7, « Contrôle de VisualBasic ».

2. Sélectionnez et supprimez le texte "Nov-2007" dans la macro. Veillez àbien supprimer les guillemets.

3. Saisissez myDate à l’emplacement de l’ancienne date. L’instruction modifiéedevrait être comme ceci :

Selection.FormulaR1C1 = myDate

4. Activez une feuille de calcul encore dépourvue de la colonne des dates.Supprimez l’ancienne colonne de dates ou exécutez à nouveau la macroRemplirLibelles, selon votre préférence.

5. Dans l’onglet Affichage du ruban, cliquez sur le bouton Macros, sélection-nez la macro AjoutDates puis cliquez sur Exécuter. La macro vous invite àsaisir une date.

6. Saisissez Nov-2007, puis cliquez sur OK. La macro insère la date dans lescellules adéquates de la colonne A.

7. Enregistrez le classeur Chapitre02.

Astuce Dans cet exemple, le nom du fichier importé contient le nom du mois.Vous pourriez donc extraire le nom du mois du nom de la feuille de calcul sansavoir à déranger l’utilisateur. Pour ce faire, modifiez l’instruction qui invoque lafonction InputBox en : myDate=Left(ActiveSheet.Name,7). Left est une fonctionVBA qui est fondamentalement identique à la fonction Excel qui porte le mêmenom. Elle extrait ici les sept premières lettres du nom de la feuille de calcul en ren-voyant « Nov2007 ». Selon les réglages des Options régionales de Windows, Excelpeut interpréter cette chaîne comme une date. Inviter à saisir la date évite d’émet-tre des suppositions sur le nom du fichier ou sur le type de chaîne qu’Excel peutinterpréter comme date. Si toutefois vous pouvez émettre ces suppositions defaçon certaine, vous pouvez provoquer l’exécution de la macro avec moins d’inte-raction de l’utilisateur.

Page 78: Excel 2007 VBA

58 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Cela complète la troisième tâche. Vous êtes maintenant prêt à ajouter les nouvel-les données à la base de données.

Tâche quatre : ajout à la base de donnéesAprès avoir ajouté les dates à la feuille de calcul importée Nov2007, celle-ci pos-sède les mêmes colonnes que la liste maître de l’historique des commandes. Ilvous suffit donc de copier la feuille de calcul en l’insérant à partir de la premièreligne vierge sous la base de données. Vous voudrez bien sûr omettre la ligne desen-têtes.

Ajout de données à la liste maîtreVous allez commencer par supprimer les en-têtes et copier le reste des donnéesde la feuille de calcul Nov2007. Vous ouvrirez ensuite le classeur de la liste maître,sélectionnerez la première cellule vierge sous la liste existante pour y copier lesdonnées, puis fermerez le fichier de base de données fichier.

1. Sélectionnez une des feuilles de calcul Nov2007 avec les libellés et lacolonne de dates, cliquez sur le bouton Enregistrer une macro, saisissezcomme nom de la macro AjouterDonnees, puis cliquez sur OK.

2. Sélectionnez la cellule A1. Dans l’onglet Accueil du ruban, cliquez sur la flè-che Supprimer, puis cliquez sur Supprimer des lignes de la feuille. Celasupprime la ligne d’en-têtes, de façon à ne pas l’inclure dans la page copiéedans la base de données.

3. Appuyez sur CTRL+* pour sélectionnez la zone en cours, effectuez un clicdroit sur une cellule de la région sélectionnée et cliquez sur Copier.

4. Cliquez sur le bouton Microsoft Office, puis cliquez sur Ouvrir. Naviguez sibesoin est jusqu’au dossier ExcelVBA07SBS.

5. Dans la liste Type de fichier, sélectionnez Tous les fichiers Excel, sélection-nez Orders.xlsx dans la liste des fichiers, puis cliquez sur Ouvrir. Le classeurOrders.xlsx s’ouvre avec la cellule A1 sélectionnée.

6. Appuyez sur CTRL+FLÈCHE EN BAS pour atteindre la dernière ligne de la basede données.

7. Appuyez sur la touche FLÈCHE EN BAS pour sélectionner la première cellulesous la base de données. Ce devrait être la cellule A3267.

Page 79: Excel 2007 VBA

Tâche quatre : ajout à la base de données 59

8. Dans l’onglet Accueil du ruban, cliquez sur Coller pour ajouter les lignespréalablement copiées, puis appuyez sur la touche ECHAP pour supprimer lemessage de copie de la barre d’état.

9. Cliquez sur le bouton Microsoft Office, cliquez sur Fermer, puis cliquez surNon lorsqu’il vous est proposé d’enregistrer les modifications : vous ne vou-lez pas pour le moment enregistrer la base de données avec les nouveauxenregistrements dans le fichier texte Orders car il est préférable de d’abordtester la macro.

10. Sélectionnez la cellule A1, puis cliquez sur le bouton Arrêter l’enregistre-ment pour arrêter l’enregistreur.

Exécution pas à pas de la macro AjouterDonneesExécutez pas à pas la macro pour examiner son fonctionnement et prendre notede toute modification à y apporter.

1. Activez une feuille de calcul avec les libellés et les dates ajoutés. Exécutez sinécessaire les macros ImportFichier, RemplirLibelles et AjoutDates.

2. Cliquez sur le bouton Afficher les macros, sélectionnez la macro Ajouter-Donnees et cliquez sur le bouton Pas à pas détaillé. Examinez les cinq pre-mières lignes de la macro :

Page 80: Excel 2007 VBA

60 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Sub AjoutDonnées() Range("A1").Select Selection.EntireRow.Delete Selection.CurrentRegion.Select Selection.Copy

Ces instructions sont analogues à celles rencontrées dans les précédentesmacros.

3. Appuyez à cinq reprises sur F8 pour exécuter ces cinq instructions simplesde la macro. Dans la fenêtre de l’éditeur Visual Basic, l’instruction qui ouvrela liste maître devrait être surlignée :

Workbooks.Open Filename:="C:\MSP\ExcelVBA07SBS\Orders.xlsx"

Cette instruction ouvre le classeur de la liste maître.

4. Appuyez sur F8 pour exécuter l’instruction qui contient la méthode Open etsurligner l’instruction suivante :

Selection.End(xlDown).Select

Cette instruction équivaut à un appui sur les touches CTRL+FLÈCHE EN BAS. Ellepart de la cellule active, recherche vers le bas la dernière cellule non vide etsélectionne cette cellule.

5. Appuyez sur F8 pour sélectionner la dernière cellule de la colonne A de laliste existante et surligner l’instruction suivante :Range("A3267").Select

Cette instruction sélectionne la cellule A3267. C’est la première cellule sousla base de données ce mois-ci, mais pas le mois prochain. Telle est l’instruc-tion créée par l’enregistreur suite à un appui sur la touche FLÈCHE EN BAS.Vous voulez toutefois une instruction qui se déplace vers le bas d’une celluleà partir de la cellule active. Notez de modifier cette instruction.

6. Appuyez sur F8 pour sélectionner la cellule A3267 et surligner l’instructionsuivante. Les deux instructions suivantes fonctionnent de pair :

ActiveSheet.PasteApplication.CutCopyMode = False

Astuce Si vous supprimez le chemin d’accès au fichier, en ne laissant que sonnom, la macro recherche le fichier dans le dossier actif. Cela pourrait être utile encas de déplacement du projet dans un nouveau dossier. En revanche, si le fichier dela liste maître est toujours au même endroit, alors que le fichier source peut setrouver à différents emplacements, mieux vaut conserver le chemin d’accès aufichier maître.

Page 81: Excel 2007 VBA

Tâche quatre : ajout à la base de données 61

Ces instructions collent les nouvelles lignes dans la base de données et sup-priment le message de la barre d’état.

7. Appuyez deux fois sur F8 pour coller les données et surligner l’instructionsuivante :

ActiveWorkbook.Close

Cette instruction ferme le classeur actif. Si vous avez modifié le classeur, ellevous invite également à enregistrer les modifications. Prenez note d’ajouterun argument pour répondre automatiquement à la question.

8. Appuyez sur F8 pour fermer le classeur de la base de données. Cliquez surNon lorsqu’il vous est proposé d’enregistrer les modifications. Cela surlignel’instruction suivante.

La macro ne comporte que deux autres instructions :

Range("A1").SelectEnd Sub

9. Appuyez sur F5 pour exécuter le reste de la macro.

La macro ne fonctionne maintenant que parce que vous l’exécutez dans des cir-constances identiques à celles de son enregistrement, avec le même fichier demois et le même fichier de base de données. Voici le récapitulatif des modifica-tions à apporter :

● Sélectionner la première ligne sous la liste existante, quel que soit le nombrede lignes de la liste.

● N’afficher aucune invite lors de la fermeture de la base de données.

Enregistrement d’un mouvement relatifExaminez de plus près les deux instructions de AjoutDonnées qui identifient lapremière cellule vierge sous la base de données. Imaginez ce qui se passerait sivous exécutiez la macro le mois prochain, alors que le fichier maître compte alors3 444 lignes. L’instruction

Selection.End(xlDown).Select

va sélectionner la cellule A3444. C’est la ligne adéquate. Toutefois, l’instruction

Range("A3267").Select

sélectionne dans tous les cas la cellule absolue A3267.

Lorsque vous sélectionnez une cellule, l’enregistreur de macro ne sait pas si vousvoulez la cellule absolue sélectionnée ou une cellule relative au point de départ.Par exemple, lorsque vous sélectionnez une cellule de la ligne 1 pour modifier un

Page 82: Excel 2007 VBA

62 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

titre de colonne, vous parlez toujours de la même cellule absolue, quel que soitvotre point de départ. En revanche, lorsque vous sélectionnez la première cellulevierge à la fin d’une base de données, vous voulez que la macro sélectionne unecellule relativement à votre point de départ.

L’enregistreur de macro ne peut savoir automatiquement si vous souhaitez enre-gistrer une adresse de cellule absolue ou un mouvement relatif. Vous pouvez tou-tefois lui indiquer le type de sélection que vous voulez. La stratégie pour arrangerla macro consiste à employer l’enregistreur pour créer une nouvelle macro tem-poraire qui va contenir le mouvement relatif souhaité. Vous pourrez employercette nouvelle instruction enregistrée pour remplacer l’instruction défectueuse dela macro actuelle, puis supprimer la macro temporaire.

1. Cliquez sur le bouton Enregistrer une macro, saisissez comme nom demacro MacroTemp, puis cliquez sur OK.

2. Sur l’onglet Affichage du ruban, cliquez sur la flèche Macros, puis cliquezsur Utiliser les références relatives.

Lorsque l’option Références relatives est activée, l’enregistreur crée dessélections de nouvelle(s) cellule(s) relativement à la sélection initiale. Vousvoulez enregistrer l’action de vous déplacer d’une cellule vers le bas. Vouspouvez le faire depuis n’importe quelle cellule de n’importe quelle feuille decalcul, sauf bien sûr d’une cellule située sur la dernière ligne de la feuille decalcul.

3. Appuyez une fois sur la touche FLÈCHE EN BAS. C’est suffisant pour enregistrerle mouvement relatif dont vous avez besoin.

4. Cliquez sur le bouton Arrêter l’enregistrement. Ensuite, dans l’onglet Affi-chage du ruban, cliquez sur la flèche Macros et cliquez sur le bouton Utili-ser les références relatives pour le désélectionner.

Astuce Le bouton Utiliser les références relatives possède un arrière-plan coloréde façon légèrement différente lorsqu’il est actif, c’est-à-dire pendant l’enregistre-ment de références relatives. Vous ne pouvez toutefois voir ce bouton pendantl’enregistrement d’une macro. Si vous activez le volet Développeur, comme expli-qué dans la section « Activation du volet Développeur du ruban » au chapitre 9,« Lancement d’une macro à l’aide d’événements », le bouton Utiliser les référencesrelatives est directement visible sur le ruban, tant que le volet Développeur estactif. Pour pouvoir en permanence voir si les Références relatives sont ou non enaction et changer facilement ce réglage, ajoutez la commande Utiliser les référen-ces relatives à la barre d’Accès rapide. Pour ce faire, effectuez simplement un clicdroit sur la commande Utiliser les références relatives de la liste Macros, puis cli-quez sur Ajouter à la barre d’accès rapide.

Page 83: Excel 2007 VBA

Tâche quatre : ajout à la base de données 63

5. Éditez la macro MacroTemp et examinez-la. La nouvelle instruction enre-gistrée devrait ressembler à ceci :

ActiveCell.Offset(1,0).Range("A1").Select

Cette instruction signifie « Sélectionnez la cellule située sous la celluleactive ». C’est ce qu’elle accomplit. Vous n’avez pas besoin à ce stade decomprendre les détails de son fonctionnement. Faites simplement confianceà l’enregistreur.

Voir aussi Pour plus d’information sur les plages relatives, reportez-vous à la sec-tion « Références relatives » du Chapitre 4, « Objets de plages ».

6. Sélectionnez la nouvelle instruction et copiez-la.

Parfois, lors de l’enregistrement de nouvelles macros temporaires, il est déli-cat de retrouver la macro originale. L’éditeur Visual Basic propose une listeProcédure qui peut vous aider à retrouver une macro d’après son nom.

7. Ouvrez la liste Procédure (située sous les barres d’outils à droite de la fenê-tre Module) et sélectionnez AjoutDonnées.

8. Sélectionnez Range("A3267").Select, supprimez-le puis collez la nouvelleinstruction à sa place.

9. Supprimez la totalité de la macro MacroTemp (à l’aide de la liste Procé-dure, si nécessaire, pour la retrouver). Pour supprimer la macro, sélectionnezsimplement toutes les instructions depuis Sub MacroTemp jusqu’à End Sub,puis appuyez sur la touche SUPPR.

Le bouton Références relatives permet de contrôler si une sélection est absolueou relative par rapport à la cellule active. Vous pouvez l’activer ou le désactiverautant de fois que nécessaire lors de l’enregistrement d’une macro.

Page 84: Excel 2007 VBA

64 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Choix d’enregistrer ou non les modifications lors de la fermeture d’un fichierL’instruction qui ferme le fichier de la base de données ressemble à ceci :

ActiveWorkbook.Close

Cette instruction déclenche une invite qui propose d’enregistrer le fichier, car vousl’avez modifié depuis son ouverture. Parfois, lors de l’automatisation d’un proces-sus, vous savez que vous allez toujours (ou jamais) enregistrer les modifications.La méthode Close possède un argument facultatif qui permet de spécifier si lesmodifications doivent être enregistrées. Pour le moment, pendant le test de lamacro, fixez l’instruction pour ne pas enregistrer les modifications.

1. Modifiez l’instruction qui ferme le classeur en ceci :

ActiveWorkbook.Close SaveChanges:=False

L’argument SaveChanges répond à la question de la boîte de dialogue avantmême que celle-ci ne soit posée. Pendant le test, vous pouvez faire que lamacro n’enregistre pas le classeur. Une fois prêt à réellement employer lamacro, vous pourrez modifier l’argument en True.

2. Enregistrez le classeur Chapitre02. Trouvez une nouvelle feuille de calculsource, puis exécutez et testez la macro AjoutDonnées.

3. Après avoir terminé le test de la macro et être prêt à l’employer régulière-ment, modifiez le mot False en True.

Voici la version finale de la macro AjoutDonnées :

Sub AjoutDonnées() Range("A1").Select Selection.EntireRow.Delete Selection.CurrentRegion.Select Selection.Copy Workbooks.Open Filename:="C:\MSP\ExcelVBA07SBS\Orders.xlsx" Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Close SaveChanges:=True Range("A1").SelectEnd Sub

Vous pouvez si vous le voulez exécuter à nouveau maintenant la macro. Elle vafonctionner comme précédemment, mais est également prête pour le mois pro-chain, lorsque la base de données comportera plus d’enregistrements.

Vous avez presque fini. La seule tâche qui reste consiste à vous débarrasser de lafeuille de calcul importée.

Page 85: Excel 2007 VBA

Tâche cinq : suppression de la feuille de calcul 65

Tâche cinq : suppression de la feuille de calculVous avez importé le fichier texte dans une feuille de calcul pour pouvoir remplirles libellés et ajouter une colonne de dates avant d’ajouter les données à la basede données. Une fois les données correctement insérées, vous n’avez plus besoinde la feuille de calcul importée. Vous ne souhaitez pas supprimer le fichier duclasseur Chapitre02, car il renferme les macros qui vous seront nécessaires le moisprochain. Vous souhaitez ne supprimer que la feuille de calcul active.

Création d’une macro de suppression de la feuille de calcul activeVous allez créer dans cette section une macro qui supprime la feuille active. Celapeut être utile dans bien des situations. Pendant que vous développez et testez lamacro SupprimeFeuille, vous pouvez vous servir d’une feuille quelconque.

1. Activez une feuille quelconque sans importance, cliquez sur le bouton Enre-gistrer une macro, saisissez comme nom de macro SupprimeFeuille, puiscliquez sur OK.

2. Dans l’onglet Accueil du ruban, cliquez sur la flèche Supprimer, cliquez surSupprimer une feuille, puis cliquez sur Supprimer lorsqu’il vous estdemandé confirmation.

3. Cliquez sur le bouton Arrêter l’enregistrement pour stopper l’enregistreur.

4. Éditez la macro SupprimeFeuille. Le corps de la macro ne contient qu’uneinstruction :

ActiveWindow.SelectedSheets.Delete

L’instruction fait référence aux « feuilles sélectionnées de la fenêtre active »,car il est possible de sélectionner et de supprimer simultanément plusieursfeuilles. Appuyez sur la touche CTRL et maintenez-la enfoncé tandis quevous cliquez sur plusieurs onglets de feuilles pour voir comment sélection-ner plusieurs feuilles. Cliquez ensuite sur une feuille non sélectionnée sansemployer la touche CTRL pour désélectionner les feuilles. Comme vous nesupprimez qu’une feuille, vous pourriez modifier l’instruction en Acti-veSheet.Delete, mais ce n’est pas indispensable.

Le seul problème avec cette macro est qu’elle demande confirmation lors de cha-cune de ses exécutions. Vous préféreriez ne pas voir de message lorsque la macrosupprime la feuille importée au cours du projet complet.

Page 86: Excel 2007 VBA

66 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Fonctionnement silencieux de la macroLa méthode Delete est dépourvue d’argument facultatif capable d’éliminer l’invitede confirmation. Vous devez ajouter une nouvelle instruction pour désactiverl’invite.

1. Dans la macro SupprimeFeuille, insérez une nouvelle ligne juste avantl’unique instruction présente dans le corps de la macro, puis saisissez l’ins-truction suivante :

Application.DisplayAlerts = False

DisplayAlerts est une propriété de l’application Excel. Lorsque vous fixezcette propriété à False, toute invite de confirmation est gérée comme si vousaviez sélectionné la réponse par défaut. Le réglage DisplayAlerts ne perdureque jusqu’à la fin de l’exécution de la macro, si bien qu’il est superflu de lefixer à nouveau à True à la fin de la macro. Vous devez en revanche veiller àne jamais exécuter cette macro lorsque la feuille active est importante. Pen-sez toujours à enregistrer régulièrement votre travail et à conserver descopies de sauvegarde.

2. Enregistrez le classeur Chapitre02.

3. Sélectionnez une feuille de calcul sans importance et exécutez la macroSupprimeFeuille.

Assemblage des morceauxVous disposez désormais de toutes les macros des tâches élémentaires nécessairesà la réalisation de votre complexe projet mensuel :

● ImportFichier ouvre et analyse le fichier texte ;

● RemplirLibelles rend le fichier compatible avec la base de données ;

● AjoutDates permet de distinguer les données des différents mois dans labase de données ;

● AjoutDonnées ajoute les nouvelles lignes à la fin de la base de données ;

● SupprimeFeuille supprime la feuille de calcul temporaire.

Chaque morceau a été préparé et testé. Il ne reste qu’à les assembler.

Astuce Le dispositif Auto List Members vous aide à saisir les mots DisplayAlerts etFalse. Lorsque vous sélectionnez un mot de la liste, appuyez sur la touche TAB pourterminer la saisie du mot dans l’instruction.

Page 87: Excel 2007 VBA

Assemblage des morceaux 67

Enregistrement d’une macro qui exécute d’autres macrosLa façon la plus simple d’assembler les macros consiste à enregistrer une macroqui exécute les autres macros.

1. Cliquez sur le bouton Enregistrer une macro, saisissez comme nom Projet-Mensuel, puis cliquez sur OK.

2. Dans l’onglet Affichage du ruban, cliquez sur le bouton Afficher lesmacros, cliquez sur ImportFichier, puis cliquez sur Exécuter.

3. Sélectionnez le fichier texte à importer, puis cliquez sur Ouvrir.

4. Cliquez sur le bouton Afficher les macros, cliquez sur RemplirLibelles,puis cliquez sur Exécuter.

5. Cliquez sur le bouton Afficher les macros, cliquez sur AjoutDates, puis cli-quez sur Exécuter.

6. Saisissez une date adéquate et cliquez sur OK.

7. Cliquez sur le bouton Afficher les macros, cliquez sur AjoutDonnées, puiscliquez sur Exécuter.

8. Cliquez sur le bouton Afficher les macros, cliquez sur SupprimeFeuille,puis cliquez sur Exécuter.

9. Cliquez sur le bouton Arrêter l’enregistrement.

10. Vous pouvez maintenant examiner ce que vous avez créé. Cliquez sur lebouton Afficher les macros, sélectionnez la macro ProjetMensuel, puiscliquez sur Modifier.

Après avoir supprimé les commentaires standards, voici à quoi ressemble lamacro qui exécute les autres macros :

Page 88: Excel 2007 VBA

68 Chapitre 2 Création d’une macro pour effectuer des tâches complexes

Sub ProjetMensuel() Application.Run "Chapitre02.xlsm!ImportFichier" Application.Run "Chapitre02.xlsm!RemplirLibelles" Application.Run "Chapitre02.xlsm!AjoutDates" Application.Run "Chapitre02.xlsm!AjoutDonnées" Application.Run "Chapitre02.xlsm!SupprimeFeuille"End Sub

La macro ProjetMensuel exécute tour à tour chacune des macros secondaires. Sivous pensez à la macro ProjetMensuel comme à une routine, il est sensé de con-sidérer chaque macro secondaire comme une sous-routine. Telle est d’ailleursl’archaïque raison historique qui fait que chaque macro débute par le mot cléSub : parce qu’elle peut se comporter en sous-routine (subroutine).

Simplification des instructions de sous-routineL’instruction créée par l’enregistreur de macro pour l’exécution d’une sous-routinefonctionne, mais est parfois un peu complexe. Vous pouvez la simplifier pour lerendre plus lisible et accélérer son exécution (même si vous ne remarquerez pro-bablement pas la différence).

1. Supprimez dans chaque instruction de sous-routine tout sauf le nom de lamacro de sous-routine elle-même. Voici ce à quoi devrait alors ressembler lamacro :

Sub ProjetMensuel() ImportFichier RemplirLibelles AjoutDates AjoutDonnées SupprimeFeuilleEnd Sub

2. Enregistrez le classeur Chapitre02.

3. Appuyez sur F5 pour tester la macro ProjetMensuel. Vous pourriez égale-ment souhaiter appuyer sur F8 pour exécuter la macro principale et sessous-routines en mode pas à pas.

Vous disposez désormais d’un processus automatisé pour l’importation des don-nées de chaque mois. Vous avez travaillé dur et méritez un peu de repos. Tenez-vous en là pour aujourd’hui.

FERMEZ le classeur Chapitre02.xlsx.

Page 89: Excel 2007 VBA

Points clés 69

Points clés● Examinez ce qu’accomplit une macro en réduisant la fenêtre de l’éditeur

Visual Basic tout en exécutant pas à pas la macro.

● Enregistrez des macros par petits morceaux. Vous pourrez toujours déplacerdes instructions d’une macro à une autre ou exécuter les macros distinctescomme sous-routines.

● Après avoir enregistré une macro, cherchez des moyens de la généraliser envue d’une utilisation ultérieure. La méthode CurrentRegion est un excellentmoyen de faire référence à une plage qui peut posséder une taille différentelors de chaque exécution de la macro.

● Servez-vous de GetOpenFilename pour demander un nom de fichier ou dela fonction InputBox pour requérir des informations lors de l’exécution de lamacro.

● Servez-vous de variables pour stocker une chaîne ou toute autre valeur etpouvoir l’employer plus tard dans la macro.

● Faites basculer l’enregistreur en mode relatif pour enregistrer des mouve-ments relatifs plutôt que des adresses absolues. Cela est particulièrementutile lorsque vous ajoutez des données à la fin d’une liste.

Page 90: Excel 2007 VBA

Création de variables pour aider à l’affichage

des Auto Lists, page 94

Emploi des Auto Lists pour afficher les méthodes et

propriétés d’un objet, page 77

Sélection de groupes de feuilles de calcul,

page 92

Créationet manipulation

de classeurs, page 77

Emploi de la fenêtre Exécution pour en savoir plus sur les objets, page 77

Création et manipulation de feuilles de calcul, page 88

Coup d’œil sur le chapitre

Page 91: Excel 2007 VBA

71

3 Classeurs et feuilles de calcul

Ce chapitre aborde les points suivants :✔ Manipulation de collections de classeurs et de feuilles de calcul.✔ Manipulation d’éléments classeur et feuille de calcul individuels.✔ Emploi de la fenêtre Exécution pour exécuter des instructions individuelles.

Repensez à votre salle de classe de CE2. Votre pupitre de bois, orné de noms gros-sièrement gravés au fil des décennies, était le quatrième à partir du tableau, dansla rangée la plus proche des fenêtres. Souvenez-vous de ces gigantesques esca-liers vers le rez-de-chaussée, avec cette splendide rampe sur laquelle vous nemanquiez pas une chance de pouvoir glisser. Les portes des salles de classe du hallprincipal étaient couvertes de dessins. Chaque porte menait à une salle de classeet chaque salle de classe était emplie d’enfants.

Un classeur Microsoft Office Excel 2007 ressemble beaucoup à une école. Les cel-lules d’une feuille de calcul sont réparties en lignes et colonnes, comme les élèvesd’une classe. Les feuilles de calcul sont regroupées dans des classeurs, comme lessalles de classe d’une école. Excel peut posséder plusieurs classeurs ouverts, exac-tement comme une ville peut posséder plusieurs écoles. Exactement comme vouspouviez vous déplacer librement entre les salles de votre ancienne école primaire,vous pourrez bientôt vous déplacer à votre guise entre les objets Excel grâce à vosmacros. Microsoft Visual Basic interagit avec Excel en travaillant avec les objetsExcel. Tout ce qui peut être contrôlé dans Excel par Visual Basic (classeurs, feuillesde calcul, cellules, menus, contrôles de zone de texte) est un objet. Pour contrôlerefficacement Excel depuis Visual Basic, vous devez comprendre ce que sont lesobjets et leur fonctionnement dans Excel.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’information à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 92: Excel 2007 VBA

72 Chapitre 3 Classeurs et feuilles de calcul

Définition d’un objetLa façon la plus simple pour comprendre les objets d’Excel consiste à les comparerà des objets du monde réel. Dans ce dernier, les villes, les écoles, les salles declasse et les élèves sont tous des objets. Une ville possède plusieurs écoles, uneécole plusieurs salles de classe, une salle de classe plusieurs élèves. Tous les élèvessont répartis en lignes de pupitres impeccables. Ils sont souriants et écoutent avecattention un professeur gentil et sage. Quoique, à la réflexion, tous les pupitres nesoient peut-être pas impeccables…

Les objets appartiennent à des collectionsRegardez autour de vous. Le monde se compose d’objets regroupés dans des col-lections, qui sont elles-mêmes des objets d’autres collections : les pièces d’appar-tements d’immeubles de résidences, les fleurs dans les massifs de jardins desvoisins, les rochers de falaises de montagnes de massifs montagneux, les enfantsd’un couple d’une famille d’un clan. Chaque objet (chaque ville, chaque élève,chaque fleur, chaque montagne et chaque famille) est un élément individuel, quiappartient pourtant à une collection d’objets similaires, tandis que chaque collec-tion d’objets est elle-même un élément individuel dans une collection d’ordresupérieur.

Si vous êtes un élu municipal réfléchissant à la collection des objets Ecole, vouspouvez faire référence à la collection des écoles en tant que groupe (« toutes lesécoles posent des problèmes d’amiante ») ou à une école individuelle (« nousdevons mettre aux normes l’électricité de l’école primaire Jefferson »). Lorsquevous faites référence à une école individuelle, vous pouvez le faire d’après sonnom : « l’école primaire Jefferson, nommée d’après l’auteur de la Déclarationd’Indépendance américaine ». Ou bien faire référence à sa position dans lacollection : « la première école construite dans notre ville, en 1887, que j’ai fré-quentée pendant mon enfance ». Ou bien, si vous animez une visite guidée, vouspourriez y faire référence en la désignant du doigt : « Remarquez l’architectureclassique de cette magnifique école ».

VEILLEZ À fermer tout classeur ouvert. Servez-vous dans l’onglet Affichage duruban de la commande Afficher pour identifier tout classeur masqué.OUVREZ un nouveau classeur vierge. Restaurez sa fenêtre (pas celle de l’applica-tion Excel) de façon à ce qu’elle ne soit pas maximalisée. Effectuez ensuite un clicdroit sur l’onglet de feuille de calcul Feuil1, puis cliquez sur Visualiser le code pourouvrir l’éditeur Visual Basic.

Page 93: Excel 2007 VBA

Définition d’un objet 73

Un classeur Excel est comme une école. Exactement comme une ville peut possé-der plusieurs écoles, vous pouvez avoir plusieurs classeurs ouverts dans Excel.Chaque classeur est individuel et unique, et pourtant chacun est un objet Classeur(ou en réalité Workbook). Vous pouvez faire référence à la totalité de la collectiondes classeurs en tant que groupe (« Fermez tous les classeurs ouverts ») ou faireréférence à des classeurs individuels. Dans ce dernier cas, vous pouvez employerle nom du classeur (« Ouvrez le classeur Chapitre 3 »), sa position (« Quel est lepremier classeur de la liste des f ichiers récents ? ») ou en pointant dessus(« Enregistrez le classeur actif »).

Une feuille de calcul d’un classeur est comme une salle de classe d’une école, sescellules étant comme les écoliers de la salle de classe, organisée en petites ligneset colonnes. Excel possède bien d’autres collections d’objets : des éléments demenu dans des menus dans des barres de menu, des colonnes dans des sériesdans un groupe dans un graphique, des éléments dans un des champs dans deslignes dans un tableau croisé dynamique (PivotTable). Vous pouvez faire référenceà chaque collection, que ce soit dans Excel ou dans le monde réel, comme à unensemble ou faire référence à un unique élément de la collection. Lorsque vousfaites référence à un unique élément d’une collection, vous pouvez vous servir deson nom, de sa position ou en pointant dessus.

Un objet possède des propriétésVoyez-vous ce petit garçon dans la classe de madame Pleinchamps, celui de latroisième rangée, au quatrième siège ? Il mesure environ 1,30 mètre, possède descheveux courts, porte une chemise bleue. Il se nomme Joseph. Et ses yeux sontfermés.

La taille, la longueur des cheveux, la couleur de la chemise, le nom et l’état desyeux de ce garçon sont les propriétés de cet objet Elève précis. La petite fille assiseprès de lui possède également des propriétés Taille, LongueurCheveux, Couleur-Chemise, Nom et EtatYeux, mais les valeurs de ces propriétés sont différentes. Legarçon est un objet différent de la fille, même si chacun est un objet Elève.

Le pupitre du garçon est également un objet, un objet Pupitre. Un objet Pupitrepossède une propriété Taille, comme un objet Elève, mais pas de propriété Taille-Cheveux. De même, un objet Elève est dépourvu de la propriété Fabriquant quepossède un objet Pupitre. Puisque le garçon et le pupitre possèdent des listes depropriétés différentes, il s’agit de types ou classes d’objets différents. En revanche,puisque le garçon et la fille possèdent la même liste de propriétés, même si lesvaleurs de ces propriétés diffèrent, ils appartiennent tous deux à la même classe

Page 94: Excel 2007 VBA

74 Chapitre 3 Classeurs et feuilles de calcul

d’objets, Elève. Partager la même liste de propriétés est ce qui fait appartenir deuxobjets à la même classe d’objets.

Exactement comme Joseph est un objet (un objet Elève), la totalité de la collec-tion des élèves de madame Pleinchamps est également un objet : un objet Elèves.Celui-ci est une collection qui possède son propre ensemble de propriétés, diffé-rent de l’ensemble des propriétés des objets individuels qu’il renferme. Par exem-ple, vous n’avez que faire d’une propriété LongueurCheveux pour la collection desélèves : que voudrait dire la somme ou la moyenne de la longueur des cheveux ?Un objet collection peut toutefois posséder des propriétés qui lui sont propres.Par exemple, le nombre des objets Elève de la collection (l’Effectif) est une pro-priété de l’objet Elèves. Comme la collection des élèves de madame Pleinchampspossède une liste de propriétés différente de celle de l’élève Joseph, Elève et Elè-ves sont deux classes différentes d’objets. En revanche, puisque la collection desélèves de monsieur Osbien et celle de madame Pleinchamps possèdent la mêmeliste de propriétés (même si les valeurs de ces propriétés sont différentes), cesdeux collections appartiennent à la même classe Elèves. La classe Élèves diffère dela classe Élève parce que ces deux classes possèdent des listes de propriétés diffé-rentes.

Certaines propriétés sont faciles à modifier. Vous pourriez probablement modifierla valeur de la propriété EtatYeux de Joseph en faisant vigoureusement claquervotre règle sur son pupitre. Et, bien sûr, il pourrait le modifier à nouveau dès quevous regarderez de l’autre côté. Vous pourriez même temporairement modifier lenom de Joseph en John lors d’une initiation à l’anglais. En revanche, modifier lataille, le poids, la couleur des yeux ou le genre de Joseph sort probablement duspectre des activités normales d’une école primaire.

Chaque classe d’objets Excel possède une liste de propriétés. Certaines peuventêtre facilement modifiées, d’autres non. Un classeur possède un auteur. Unefeuille de calcul possède un nom. Une cellule possède une hauteur, une largeur etune valeur. Un menu possède un libellé. Une collection de feuilles de calcul pos-sède le décompte des feuilles de calcul de la collection. Modifier le nom d’unefeuille de calcul ou la hauteur d’une cellule est chose facile. En revanche, modifierle décompte des cellules d’une feuille de calcul excède probablement le champnormal d’activité d’une macro.

Les objets possèdent des méthodesRegardez : madame Pleinchamps demande à sa classe de se lever. Elle les dirigedans une interprétation magistrale de « Il était un petit navire ». Les objets Elèvepeuvent chanter des chansons. Chanter une chanson est une activité. Les objets

Page 95: Excel 2007 VBA

Définition d’un objet 75

Elève peuvent également accomplir d’autres activités. Ils peuvent manger, dessi-ner. Un élève peut chanter, ou manger, ou dessiner parfaitement. Un autre peutchanter, ou manger, ou dessiner maladroitement. Les deux n’en disposent pasmoins de la capacité à effectuer l’action. Les objets Pupitre, en revanche, ne chan-tent ni ne mangent ou ne dessinent. Ils peuvent toutefois grincer, ce qui n’estgénéralement pas le cas pour des objets Elève. Exactement comme des classesd’objets différentes possèdent des listes de propriétés différentes, elles peuventaccomplir des listes d’activités différentes. Les activités que peut accomplir unobjet sont nommées méthodes. Les objets qui appartiennent à une même classepeuvent effectuer les mêmes méthodes.

Comme pour les propriétés, la liste des méthodes d’une collection particulière dif-fère généralement de la liste des méthodes des objets individuels qu’elle ren-ferme. Une des méthodes les plus importantes pour la plupart des collections estl’ajout d’un nouvel élément à la collection. Lorsqu’un nouvel élève rejoint la classe,vous exécutez la méthode Ajout (Add) sur l’objet Élèves, pas sur un objet Elèveindividuel. Lorsque les budgets ont été accordés et que l’école se voit dotée d’unenouvelle aile, vous exécutez la méthode Add sur l’objet SallesDeClasse. Vousn’ajoutez pas la nouvelle salle de classe à une salle de classe individuelle, mais à lacollection des salles de classe.

La plupart des objets collection d’Excel possèdent une méthode Add pour l’ajoutd’un nouvel élément à la méthode. Ils possèdent tous une propriété Item pourétablir un lien, ou référence, vers un élément individuel de la collection. Les objetsfeuille de calcul Excel possèdent également une méthode Calculate pour imposerle recalcul de toutes les cellules, tandis que les graphiques Excel disposent d’uneméthode ChartWizard pour modifier rapidement les différents attributs d’un gra-phique.

VBA possède un nom pour la liste combinée des méthodes et propriétés d’unobjet : membres. Au lieu de dire « Quels sont les méthodes et les propriétés d’unobjet Worksheet ? », vous pouvez donc demander « Quels sont les membres d’unobjet Worksheet ? ». Le mot membres peut faire ressembler une classe d’objets àun club : vous devez être une méthode ou propriété acceptable pour faire partiedu club. D’une certaine façon, c’est exactement comme cela que fonctionne uneclasse. Cette terminologie peut paraître un peu troublante, car vous pourriez pen-ser que Joseph est un membre de la classe Elève. Tel n’est pas le cas. Les membresde la classe Elève sont ses propriétés (LongueurCheveux et CouleurYeux) et sesméthodes (PeintureAuDoigt et Manger). Joseph est une instance de la classeElève, ce qui signifie qu’il s’agit d’un exemple spécifique d’élève. Vous pourriezdire « Il y a trop de règles ici. Par exemple (for instance), ils ne me laissent pas dor-mir pendant les cours. ». Cela signifie que vous donnez un exemple spécifique

Page 96: Excel 2007 VBA

76 Chapitre 3 Classeurs et feuilles de calcul

d’une règle. De la même façon, Joseph est un exemple spécifique d’élève. Il estune instance d’Elève. Michael et Rachid et Sarah et Lucie sont tous des instancesde la classe Elève : chacun possède la même liste de méthodes et de propriétés. Sivous voulez impressionner les gens, dites simplement « Oui, mais en réalité cha-que instance possède la même liste de membres que toute autre instance de laclasse, ne croyez-vous pas ? »

La distinction entre une méthode et une propriété se limite parfois au choix duconcepteur de l’objet. Lorsque Joseph ouvre les yeux, a-t-il effectué la méthodeOuvreYeux (une action) ou affecté une nouvelle valeur à sa propreté EtatYeux ?Considérer la liste globale comme celle des membres est parfois utile. Il reste tou-tefois tout aussi utile de se rappeler parfois pourquoi il existe des membres et despropriétés. Voici certains des concepts qui peuvent vous y aider.

Une méthode peut modifier des propriétésLa plupart des méthodes peuvent modifier des propriétés et le font générale-ment. Lorsque Joseph effectue la méthode PeintureAuDoigt, cette action modifiesa propriété CouleurChemise. Lorsqu’il rentre chez lui et effectue la méthodeLaverVêtement, la propriété CouleurChemise retrouve sa valeur initiale (à quel-ques taches rebelles près). La méthode ne se souvient pas de ce qu’elle a effectué.Après avoir employé la méthode LaverVêtement, vous devez toujours recourir à lapropriété CouleurChemise pour connaître la nouvelle couleur. De même, avecExcel, la méthode Add de l’objet Workbooks modifie la valeur de la propriétéCount, sans vous dire quel est la nouvelle valeur de Count.

Une propriété peut impliquer une actionFixer une propriété implique généralement une action quelconque. Pour modifierla propriété CouleurMurs d’une salle de classe, vous sortez les rouleaux à peintureet les échafaudages, puis commencez à peindre. Vous êtes plus intéressé parl’attribut final du mur que par l’action qui a modifié cet attribut. De ce fait, à la findu travail, vous pouvez dire à vos amis que la valeur de la propriété CouleurMursest désormais JauneClair. Vous vous servez de la propriété CouleurMurs pourexpliquer l’état résultant, comme vous l’aviez employée pour effectuer l’action.Avec Excel, masquer une feuille de calcul est un exemple de fixation de propriété(parce que la feuille de calcul est toujours présente et que vous pouvez vouloirmodifier à nouveau la valeur de cette propriété ou, pendant qu’elle est masquée,signaler aux gens quel est l’état actuel). Fermez un f ichier est toutefois uneméthode car il ne reste aucune trace du fichier en mémoire lorsque vous avez fini.

Page 97: Excel 2007 VBA

Classeurs 77

Pour résumer, un élément individuel (un pupitre ou une feuille de calcul) est uneinstance d’une classe d’objets, tandis qu’une collection de ces éléments (unensemble de pupitres ou un groupe de feuilles de calcul) est une instance d’uneautre classe d’objets. Une même instance d’une collection peut renfermer une col-lection complète d’autres objets. Par exemple, une unique instance de la collec-tion des écoles de la ville peut renfermer une collection de salles de classe et uneunique instance d’une collection de classeurs Excel peut contenir une collectionde feuilles de calcul. Toute instance appartient à une classe d’objets qui possèdeune liste définie de membres (méthodes et propriétés). Une même classe d’objets(la classe Elève ou la classe Worksheet) peut comporter de nombreuses instancesindividuelles (Joseph ou Sarah ou Budget2007). Dans ce cas, chaque instance par-tage la même liste de membres, tout en conservant des valeurs individuelles pourdes propriétés spécifiques. Vous apprendrez dans ce chapitre à travailler avec denombreux types d’objets Excel.

ClasseursLes classeurs constituent l’unité structurelle fondamentale d’Excel. Vous pouvezen apprendre beaucoup sur le fonctionnement des objets et des collections Excelen vous exerçant sur les classeurs.

Excel dispose d’un puissant outil pour vous aider à explorer les objets, les proprié-tés et les méthodes : la fenêtre Exécution de l’éditeur Visual Basic. Cette fenêtrepermet l’exécution d’instruction VBA sans créer réellement de macro. Tout ce quevous effectuez dans la fenêtre Exécution est perdu lorsque vous fermez Excel.

Ajout d’un nouveau classeurVous allez dans cette section employer une instruction de macro pour créer unnouveau classeur. Cela est équivalent à cliquer sur Nouveau dans le menu du Bou-ton Microsoft Office. L’instruction de macro pour créer un nouveau classeur est

Astuce Si vous n’employez que des macros enregistrées, vous n’avez pas à vouspréoccuper des différences entre propriétés et méthodes : l’enregistreur de macrose sert toujours de la méthode ou de la propriété adéquate. Il reste toutefois utilede connaître la distinction en raison de ce qu’il convient de faire pour modifier lamacro enregistrée. S’il s’agit d’une méthode, vous modifiez la macro ou changeantles arguments de la méthode. Avec une propriété, vous modifiez la macro en chan-geant la valeur affectée à la propriété. La même distinction s’applique bien sûr sivous rédigez totalement la macro. Les outils en ligne et les rubriques d’aide d’Excelindiquent si un membre est une méthode ou une propriété.

Page 98: Excel 2007 VBA

78 Chapitre 3 Classeurs et feuilles de calcul

Workbooks.Add. Plutôt que de placer cette instruction dans une macro, vouspouvez l’exécuter directement dans la fenêtre Exécution. Et plutôt que de la saisir,vous pouvez laisser l’éditeur Visual Basic vous aider à la construire.

1. Si l’éditeur Visual Basic n’est pas déjà ouvert, effectuez un clic droit surn’importe quel onglet de feuille de calcul et cliquez sur Visualiser le code.Modifiez ensuite la taille de la fenêtre de l’éditeur Visual Basic pour pouvoirvoir l’application Excel.

2. Dans le menu Affichage, cliquez sur Fenêtre Exécution. Si la fenêtre Exé-cution est ancrée dans l’éditeur Visual Basic, double cliquez sur sa barre detitre pour la désancrer. Modifiez ensuite sa taille de façon à voir l’applicationExcel.

3. La fenêtre Exécution étant active, cliquez sur le menu Edition de l’éditeurVisual Basic, puis cliquez sur Compléter le mot. Une liste de méthodes et

Astuce Il existe plusieurs façons d’ouvrir l’éditeur Visual Basic. Si vous possédezune macro dans un classeur ouvert, modifier la macro ouvre l’éditeur. La com-mande Visualiser le code du menu contextuel de n’importe quelle feuille de calculfait de même. Si vous avez affiché le volet Développeur du ruban, celui-ci com-prend un bouton Visual Basic qui ouvre également l’éditeur. Enfin, la touche deraccourci ALT+F11 aboutit également au même résultat.

Page 99: Excel 2007 VBA

Classeurs 79

de propriétés apparaît. Il s’agit des méthodes et propriétés qui n’ont pasbesoin d’objet explicite.

4. Saisissez Wo : les deux premières lettres du mot Workbooks. Cela suffit àsélectionner le mot dans la liste. Vous pourriez simplement saisir W et poin-ter vers Workbooks ou appuyer trois fois sur la touche FLÈCHE EN BAS.

5. Saisissez un point ( ) pour afficher la liste des méthodes et propriétés dis-ponibles pour l’objet Workbooks.

Vous n’avez pas besoin de saisir la totalité du mot après avoir saisi le point.La liste qui apparaît est nommée Auto List. Elle contient toutes les méthodeset propriétés utilisables avec l’objet qui précède le point.

6. Saisissez A, la première lettre du mot Add. Cette première lettre est suffi-sante pour sélectionner le mot adéquat.

7. Appuyez sur ENTRÉE pour ajouter un nouveau classeur au-dessus du premierclasseur. La méthode Add a ajouté un nouveau classeur à la collection : vousl’avez vu faire.

Page 100: Excel 2007 VBA

80 Chapitre 3 Classeurs et feuilles de calcul

Dans la fenêtre Exécution, vous pouvez saisir des instructions de macro et envoir immédiatement l’effet. C’est un outil précieux pour examiner cequ’accomplit une instruction. Vous pouvez vous en servir lorsque vous envi-sagez de créer une nouvelle macro ou pour déboguer une macro existante.

8. Appuyez sur la touche FLÈCHE EN HAUT pour placer le point d’insertion à nou-veau dans l’instruction Workbooks.Add, puis appuyez sur ENTRÉE.

La méthode Add ajoute un nouvel objet Workbook. Lorsque vous voulezexécuter à nouveau une instruction dans la fenêtre Exécution, placez sim-plement le point d’insertion n’importe où dans la ligne et appuyez surENTRÉE.

Le mot Workbooks fait référence à l’objet Workbooks : la collection des classeursactuellement ouverts dans Excel. Le mot Add est une méthode de l’objet Work-books qui ajoute un nouvel élément à la collection. Une méthode suit un objet,séparé par un simple point (objet.méthode). La plupart des collections Excel pos-sèdent une méthode Add pour ajouter un nouvel élément à la collection.

Fenêtres ancrablesLes fenêtres de l’éditeur Visual Basic peuvent provoquer une certaine confu-sion. Vous pourriez trouver plus facile pour comprendre leur fonctionnementde les comparer aux fenêtres de l’environnement Excel.

Dans Excel, chaque classeur ouvert possède sa propre fenêtre. Une fenêtre declasseur peut être maximalisée, pour remplir la totalité de l’espace de travaild’Excel ou voir sa taille ajustée pour posséder plusieurs fenêtres visibles simul-tanément. Une fenêtre de classeur ne peut jamais sortir des frontières del’application Excel. Elle appartient totalement à la fenêtre principale d’Excel.Ce type de fenêtre porte le nom de fenêtre fille.

Un volet de tâche comme le volet Rechercher peut, en revanche, être ancré ouflotter. Un volet de tâche peut être ancré à droite ou à gauche de la fenêtreprincipale d’Excel. Pour désancrer un volet, vous le déplacez de sa positiond’ancrage. Inversement, pour ancrer un volet de tâche, vous le déplacez surune position d’ancrage. Un double-clic sur la barre de titre bascule entre lesdeux états d’ancrage. Vous pouvez placer un volet de tâche flottant n’importeoù : il ne doit pas nécessairement rester à l’intérieur de la fenêtre principaled’Excel. Si vous voulez qu’un volet de tâche reste flottant près d’une positionoù il serait normalement ancré, vous pouvez interdire l’ancrage en mainte-nant enfoncée la touche CTRL tandis que vous le déplacez. Un volet de tâcheest un type de fenêtre : une fenêtre ancrable.

Page 101: Excel 2007 VBA

Classeurs 81

L’éditeur Visual Basic possède à la fois des fenêtres ancrables et filles. Unefenêtre de module est une fenêtre fille. Elle peut être réduite, agrandie ou res-taurée, mais ne peut jamais se déplacer au-delà des frontières de la fenêtreprincipale Visual Basic.

La fenêtre Exécution est par défaut une fenêtre ancrable, analogue à un voletde tâche Excel. Vous pouvez ancrer la fenêtre Exécution en haut, en bas, adroite ou à gauche de la fenêtre Visual Basic, ou la rendre flottante en l’éloi-gnant d’une position d’ancrage. Vous pouvez également empêcher l’ancragede la fenêtre en appuyant et en gardant enfoncée la touche CTRL tandis quevous déplacez la fenêtre, comme avec un volet de tâche Excel.

Visual Basic possède six fenêtres ancrables : les fenêtres Variables locales, Exé-cution, Espions, Explorateur de projets, Propriétés et Explorateur d'objet. Vouspouvez afficher n’importe laquelle de ces fenêtres en choisissant la com-mande adéquate du menu Affichage.

Pour transformer une fenêtre ancrable Visual Basic en une fenêtre fille, effec-tuez un clic droit sur la fenêtre, puis cliquez sur la commande Ancrable pourla désélectionner. Les fenêtres Visual Basic diffèrent à cet égard des volets detâche : vous ne pouvez pas transformer un volet de tâche en fenêtre fille. Leréglage Ancrable étant désactivé, la fenêtre se comporte comme n’importequelle fenêtre fille. Vous pouvez la réduire, l’agrandir, la restaurer, la mettre encascade ou côte à côte, mais plus la déplacer en à l’extérieur de la fenêtreprincipale, tandis qu’elle ne peut plus flotter au-dessus d’une autre fenêtreactive.

Je rends généralement mes fenêtres ancrables mais non ancrées. Je déplace,masque et affiche les fenêtres selon les besoins. J’agrandis également la fenê-tre module mais en lui conservant une taille suffisamment réduite pour voir lafenêtre Excel à l’arrière-plan.

Comptage des classeursVous avez maintenant employé une méthode, Add, avec un objet Workbooks.L’objet Workbooks possède également des propriétés. Une des propriétés, Count,indique le nombre d’éléments de la collection. La propriété Count renvoie unevaleur que vous pouvez afficher dans la fenêtre Exécution.

1. Dans la fenêtre Exécution, saisissez ?Workbooks.Count et appuyez surENTRÉE. Après avoir saisi le point d’interrogation, vous pourriez employer lacommande Compléter le mot du menu Edition en conjonction avec les AutoLists automatiques pour vous aider à construire le reste de l’instruction.

Page 102: Excel 2007 VBA

82 Chapitre 3 Classeurs et feuilles de calcul

Le nombre 3 (ou un autre chiffre selon le nombre de classeurs actuellementouverts) apparaît. Dans la fenêtre Exécution, lorsque vous saisissez un pointd’interrogation suivi par toute instruction qui renvoie une valeur, cette valeurapparaît sur la ligne suivante. Comme la propriété Count renvoie une valeurnumérique, vous pouvez afficher cette valeur en employant un point d’inter-rogation.

2. Appuyez sur la touche FLÈCHE EN HAUT pour revenir à l’instruction Work-books.Add, appuyez sur ENTRÉE pour ajouter un nouveau classeur, puisappuyez à nouveau sur ENTRÉE dans l’instruction ?Workbooks.Count pourvoir le nouveau nombre de classeurs.

Le décompte devrait désormais être de 4 (ou un de plus qu’auparavant).

Le mot Count est une propriété. Vous attachez la propriété Count à son objet àl’aide d’un point, comme vous aviez attaché la méthode Add à l’objet.

Lorsque vous exécutez la méthode Add, vous ne précédez pas l’instruction d’unpoint d’interrogation car la méthode Add ne renvoie pas une simple valeur. Vouspouvez voir le résultat de la méthode Add en examinant la fenêtre de l’applicationExcel. Lorsque vous employez la propriété Count, vous voulez connaître sa valeur.Vous ne pouvez pas modifier le nombre de classeurs en changeant la propriétéCount : vous devez employer la méthode Add pour ajouter un nouveau classeur àla collection. Une propriété dont la valeur peut être examinée mais non modifiéeporte le nom de propriété en lecture seule.

Fermeture des classeursLa méthode Add de l’objet collection Workbooks ajoute un élément à la collec-tion. L’objet Workbooks possède une autre méthode, Close, qui permet de fermerla totalité de la collection.

1. Saisissez Workbooks.Close et appuyez sur ENTRÉE. Cliquez sur Non si vousêtes invité à enregistrer les modifications.

Page 103: Excel 2007 VBA

Classeurs 83

Tous les classeurs ouverts disparaissent. L’emploi de la méthode Close surl’objet Workbooks ferme la totalité de la collection. Cette méthode fermetout si rapidement que vous pourriez souhaiter la voir fonctionner à nou-veau…

2. Exécutez à nouveau à trois ou quatre reprises l’instruction Workbooks.Addpour créer quelques nouveaux classeurs.

3. Exécutez à nouveau l’instruction ?Workbooks.Count pour savoir combiende classeurs comporte la collection.

4. Exécutez à nouveau l’instruction Workbooks.Close pour fermer tous lesclasseurs. Cela ne vous procure-t-il pas une grande sensation de puissance ?En un simple clic, tous les classeurs disparaissent !

5. Exécutez à nouveau l’instruction ?Workbooks.Count pour dénombrer lesclasseurs de la collection.

Le nombre 0 apparaît puisque vous avez détruit tous les classeurs.

Add et Close sont toutes deux des méthodes d’un objet Workbooks. Count estune propriété d’un objet Workbooks. Les méthodes Add et Close modifient indi-rectement la valeur de la propriété Count : c’est en pratique le seul moyen demodifier la valeur de la propriété en lecture seule Count.

Référence à un unique classeurLa fermeture simultanée de la totalité de la collection Workbooks est une expé-rience intéressante, qui peut à l’occasion se révéler utile. Généralement, vous pré-férerez toutefois un peu plus de contrôle sur les classeurs qui disparaissent. Pourfermer un unique classeur, vous devez spécifier un élément unique de la collec-tion Workbooks.

1. Exécutez à plusieurs reprises l’instruction Workbooks.Add située en hautde la fenêtre Exécution pour créer quelques nouveaux classeurs.

2. Descendez jusqu’en bas de la fenêtre Exécution. Pour ce faire, vous pouvezappuyer sur CTRL+FIN.

3. Saisissez ?Workbooks.Item(1).Name puis appuyez sur ENTRÉE.

Le nom du premier classeur (le premier parmi l’ensemble de classeursactuellement ouvert, probablement quelque chose comme Classeur6)apparaît. En lisant cette instruction de droite à gauche, cette instructioninterroge « Le nom du premier élément de la collection Workbooks estquoi ? ».

Page 104: Excel 2007 VBA

84 Chapitre 3 Classeurs et feuilles de calcul

● Name est une propriété d’un classeur unique. Comme cette propriétérenvoie une valeur, vous pouvez afficher celle-ci en plaçant un pointd’interrogation au début de l’instruction. La propriété Name n’est pasdisponible pour un objet Workbooks : une collection de classeurs estdépourvue de nom.

● Item est une propriété d’une collection. Comme un enseignant quiétablit un dialogue en s’adressant à un élève individuel, la propriétéItem crée une référence vers un élément individuel d’une collection.Elle nécessite un unique argument : ici, la position de l’élément con-cerné.

● Workbooks établit une référence vers la totalité de la collection declasseurs (l’objet Workbooks). Dès que vous disposez d’une référencevers l’objet Workbooks, le mot Item(1) transfère la référence vers l’élé-ment spécifié de la collection (un objet Workbook). Disposant d’uneréférence vers l’objet Workbook, la propriété Name renvoie son nom.

4. Saisissez Workbooks(1).Close et appuyez sur ENTRÉE. Le premier classeurdisparaît.

5. Exécutez à nouveau l’instruction ?Workbooks.Item(1).Name. Le nom dupremier classeur apparaît. Si le premier classeur était auparavant Classeur6,le nouveau premier classeur devrait être Classeur7.

6. Exécutez à nouveau l’instruction Workbooks(1).Close pour fermer le clas-seur qui vient d’être promu premier classeur de la collection.

Voir aussi Une propriété qui n’est pas précédée d’un objet porte le nom de pro-priété globale. Vous en apprendrez plus sur les propriétés et méthodes globales dans

Astuce Récupérer un unique élément d’une collection est si fréquent que vouspouvez omettre le mot Item (et son point d’accompagnement) et placer les paren-thèses immédiatement après le nom de la collection. L’instruction ?Work-books(1).Name parvient au même résultat que ?Workbooks.Item(1).Name.L’enregistreur de macro, les fichiers d’aide d’Excel et la majorité des utilisateurs seservent de la version abrégée. S’il vous arrive toutefois fréquemment d’oublierd’employer un pluriel pour le nom de l’objet collection (en réalité une de ses pro-priétés, comme vous le verrez plus loin), vous pourriez préférer employer quelquetemps explicitement la propriété Item.

Page 105: Excel 2007 VBA

Classeurs 85

la section « Référence à une plage à l’aide d’une adresse » du Chapitre 4, « Objetsplage ».

Le mot Workbooks possède deux significations pour Excel. C’est d’abord le nomd’une classe d’objets : la classe Workbooks. C’est un nom, une « chose ». MaisWorkbooks est également le nom d’une propriété globale qui établit une réfé-rence vers la collection des classeurs ouverts. C’est alors un verbe, une « action ».Vous ne pouvez pas placer le vrai objet Workbooks (la chose) dans votre macro :l’objet Workbooks est situé dans Excel et vous pouvez le voir à l’écran. Ce quevous placez dans la macro est la propriété Workbook qui établit une référencevers la chose Workbooks.

Dès que la propriété Workbooks a établi une référence vers l’objet Workbooks,vous pouvez « parler » avec celui-ci à l’aide des méthodes et propriétés de la listedes membres compris par un objet Workbooks. Vous pouvez employer la pro-priété Count pour examiner le nombre d’éléments de la collection. Vous pouvezemployer la méthode Add pour ajouter un nouveau classeur à la collection, et laméthode Close pour fermer tous les classeurs. Count, Add et Close sont trois desmots qu’un objet Workbook peut comprendre.

Un objet Workbooks peut également comprendre la propriété Item. Celle-ci éta-blit une référence vers une chose Workbook individuel. Excel est dépourvu depropriété Workbook pour établir un lien vers un unique objet Workbook. Vousemployez la propriété Item de l’objet Workbooks (la forme abrégée) pour établirune référence vers un objet individuel.

Lorsque la propriété Item a établi une référence vers un objet Workbook indivi-duel, vous pouvez parler à celui-ci à l’aide des méthodes et propriétés qu’il com-prend. Vous pouvez vous servir de la propriété Name pour examiner le nom duclasseur et employer la méthode Close pour le fermer.

En règle générale, chaque objet collection d’Excel possède le même nom que lapropriété qui établit une référence vers l’objet. L’objet Workbooks porte le mêmenom que la propriété Workbooks car cette dernière établit une référence versl’objet Workbooks. Vous constaterez au fil de votre découverte des objets quecela est un fait constant : l’objet Windows possède le même nom que la propriétéWindows, l’objet Charts le même nom que la propriété Charts, etc.

Dans du code Visual Basic, vous ne pouvez jamais faire référence à un élémentindividuel d’une collection en omettant la lettre finale s du nom de la collection.Par exemple, vous ne pouvez pas faire référence à un classeur individuel dans unemacro à l’aide du mot Workbook. Toute classe collection d’objet possède une pro-priété Item qui permet d’établir une référence vers un élément individuel de lacollection.

Page 106: Excel 2007 VBA

86 Chapitre 3 Classeurs et feuilles de calcul

Vous pourriez vous demander quelle est la différence entre un élément d’une col-lection et une instance d’une classe. Joseph est une instance d’élève, mais égale-ment un élément de la collection d’élèves de madame Pleinchamps. Si Lucie estune élève de la collection d’élèves de monsieur Gupta, elle reste une instanced’élève, exactement comme Joseph. Ce ne sont toutefois pas les éléments de lamême collection. De façon similaire, si vous possédez un classeur Budget2008 etun classeur Budget2007, ceux-ci peuvent tous deux contenir une feuille de calculJanvier. Les deux feuilles de calcul Janvier sont des instances de la classeWorksheet. Autrement dit, les deux feuilles de calcul sont des exemples de feuillesde calcul. Comme elles se trouvent dans des classeurs différents, elles appartien-nent à des collections différentes.

Référence à un classeur d’après son nomVous avez jusqu’ici employé la propriété Item pour établir une référence vers unclasseur individuel. Vous avez spécifié un nombre pour le classeur : sa positiondans la collection. Vous pourriez tout aussi bien établir une référence vers un élé-ment d’une collection en employant son nom. Vous devez alors placer celui-cientre guillemets, dont est dépourvu le numéro de position.

1. Si vous êtes à court de classeurs, allez jusqu’en haut de la fenêtre Exécution(appuyez sur CTRL+DÉBUT) et exécutez à plusieurs reprises l’instructionWorkbooks.Add.

2. Descendez jusqu’en bas de la fenêtre Exécution (appuyez sur CTRL+FIN) etrepérez le nom d’un des classeurs, de préférence vers le milieu. Quelquechose comme Classeur14.

3. Saisissez Workbooks("Classeur14").Activate et appuyez sur ENTRÉE. Leclasseur spécifié se déplace en haut de la pile des classeurs. Le mot Activateest une méthode comprise par une unique instance de Workbook. CommeClasseur14 est le nom (name) du classeur, il apparaît entre guillemets.

4. Saisissez Workbooks("Classeur14").Close et appuyez sur ENTRÉE pour fer-mer le classeur.

5. Exécutez à nouveau l’instruction Workbooks("Book14").Close. Excel affi-che un message d’erreur car le classeur qui porte ce nom n’existe plus. Lors-que vous faites référence à un élément d’une collection d’après son nom,vous obtenez toujours le même élément, tant qu’il existe encore !

Page 107: Excel 2007 VBA

Classeurs 87

6. Cliquez sur OK pour supprimer le message d’erreur.

Vous pouvez vous servir du nom ou de la position d’un élément d’une collectionpour y faire référence. Si vous employez le numéro de position, vous pourriezobtenir un élément différent à chaque emploi de la propriété Item. Avec le nom,vous obtenez une erreur si l’élément n’existe plus.

Référence à un classeur par pointageSupposons que vous vouliez faire référence au classeur situé en haut de la pile,sans connaître ni son nom ni sa position dans la collection. Comme le classeur duhaut est le classeur actif, vous pouvez y faire référence par pointage.

➜ En bas de la fenêtre Exécution, saisissez ActiveWorkbook.Close puisappuyez sur ENTRÉE.

Le classeur du haut de la pile disparaît.

Le mot ActiveWorkbook de cette instruction établit directement une référencevers le classeur actif, outrepassant l’objet Workbooks. Si le premier classeur ouvertest le classeur actif, vous pourriez employer Workbooks(1) pour établir une réfé-rence vers le même objet classeur qu’avec ActiveWorkbook. Disposant d’une réfé-rence vers le classeur, vous pouvez examiner son nom ou le fermer. Le pointimportant est de disposer d’une référence : la façon dont vous avez obtenu celle-ci est sans importance.

Modification d’une valeur de propriété d’un classeurLa propriété Count de l’objet Workbooks et la propriété Name d’un objet Work-book sont des propriétés en lecture seule. Vous pouvez examiner les valeursqu’elles renvoient, mais pas les modifier. Un classeur possède d’autres propriétés,en lecture écriture, dont vous pouvez examiner ou modifier les valeurs.

1. Dans la fenêtre Exécution, saisissez ?ActiveWorkbook.Saved et appuyezsur ENTRÉE.

Le mot True apparaît parce que le classeur n’a subi aucune modification.Lorsque vous fermez un classeur, Excel a recours à la valeur de la propriétéSaved pour décider s’il doit vous inviter à enregistrer les modifications. Si lavaleur de la propriété Saved est True, Excel n’affiche aucune invite. Si cette

Page 108: Excel 2007 VBA

88 Chapitre 3 Classeurs et feuilles de calcul

valeur est False, il vous propose d’enregistrer le classeur. Vous modifiez nor-malement la valeur de la propriété Saved en False en modifiant le contenud’une cellule et en True en enregistrant le classeur. Vous pouvez toutefoismodifier directement la propriété Saved.

2. Saisissez ActiveWorkbook.Saved = False et appuyez sur ENTRÉE. Rien nesemble se passer, mais vous avez modifié la valeur de la propriété.

3. Exécutez à nouveau l’instruction ?ActiveWorkbook.Saved pour voir lanouvelle valeur de la propriété. Le mot False apparaît. Excel pense désormaisque le classeur comporte des modifications non enregistrées.

4. Exécutez à nouveau l’instruction ActiveWorkbook.Close. Comme vousavez fixé la propriété Saved à False, Excel vous demande si vous souhaitezenregistrer les modifications.

5. Cliquez sur le bouton Annuler pour laisser ouvert le classeur.

6. En bas de la fenêtre Exécution, saisissez ActiveWorkbook.Saved = True etappuyez sur ENTRÉE.

7. Exécutez à nouveau l’instruction ActiveWorkbook.Close. Le classeur seferme sans objection.

Si vous écrivez une macro qui modifie un classeur et souhaitez fermer celui-cisans enregistrer les modifications (et sans afficher de message d’avertissement),faites en sorte que la macro modifie la propriété Saved du classeur en True.

La propriété Saved est une propriété en lecture écriture. Vous pouvez afficher savaleur actuelle, mais également la modifier.

Feuilles de calculLes feuilles de calcul sont regroupées dans des collections, comme les classeurs.La manipulation de feuilles de calcul à l’aide de la fenêtre Exécution va vous mon-trer de nombreuses ressemblances, ainsi que quelques différences, entre cesobjets collections différents.

Ajout d’une nouvelle feuille de calculVous ajoutez une nouvelle feuille de calcul au classeur actif de la même façon quevous ajoutez un nouveau classeur à Excel : à l’aide de la méthode Add.

1. Dans Excel, fermez tous les classeurs sauf un. Ce dernier devrait comportertrois feuilles, nommées Feuille1, Feuille2 et Feuille3, avec Feuille1 commefeuille active.

Page 109: Excel 2007 VBA

Feuilles de calcul 89

2. Passez à l’éditeur Visual Basic. Dans la fenêtre Exécution, saisissezWorksheets.Add et appuyez sur ENTRÉE.

Une nouvelle feuille de calcul nommée Feuille4 apparaît avant la feuilleactive originale.

Modification de nom et suppression d’une feuille de calculUne feuille de calcul est un objet, avec des propriétés et des méthodes qui lui sontpropres. Vous pouvez employer ces méthodes et propriétés pour manipuler unefeuille de calcul. Au cours de votre travail avec les feuilles de calcul, vous remar-quez que la liste automatique (Auto List) des méthodes et propriétés n’apparaîtpas toujours après avoir saisi un point. Vous apprendrez dans la suite de ce chapi-tre comme faire pour qu’une Auto List apparaisse toujours avec un objet feuille decalcul.

1. Saisissez ?Worksheets(1).Name et appuyez sur ENTRÉE pour afficher le nomde la première feuille de calcul (probablement Feuil4).

Exactement comme lorsque vous aviez employé la propriété Item (sous saforme longue ou abrégée) sur un objet Workbooks pour établir une réfé-rence vers un unique objet Workbook, vous employez la propriété Item surun objet Worksheets pour établir une référence vers un unique objetWorksheet. Disposant d’une référence vers un objet Worksheet, vous pou-vez employer ses propriétés, comme Name. Le nom d’un classeur est unepropriété en lecture seule : vous devez enregistrer un fichier pour modifierson nom. Le nom d’une feuille de calcul est en revanche une propriété enlecture écriture : vous pouvez le modifier directement.

2. Saisissez Worksheets(1).Name = "Valeurs d’entrée" et appuyez surENTRÉE. Le nom de la feuille de calcul se modifie.

Page 110: Excel 2007 VBA

90 Chapitre 3 Classeurs et feuilles de calcul

3. Saisissez Worksheets("Feuil1").Activate et appuyez sur ENTRÉE. La feuillede calcul nommée Feuille1 devient la feuille active.

4. Saisissez ActiveSheet.Delete et appuyez sur ENTRÉE. Cliquez sur Supprimerlorsque vous êtes prévenu que la feuille peut renfermer des valeurs.

5. Saisissez Worksheets("Valeurs d’entrée").Activate et appuyez sur ENTRÉE.

Comme avec les classeurs, vous pouvez faire référence à une unique feuille de cal-cul à l’aide de sa position, de son nom ou par pointage. Si la première feuille decalcul nommée Valeurs d’entrée est activée, les expressions Worksheets("Valeursd’entrée"), Worksheets(1) et ActiveSheet établissent toutes une référence vers lemême objet Worksheet.

Examen de la valeur renvoyée par la méthode DeleteEn principe, vous vous bornez à exécuter une méthode. Avec une propriété enrevanche, vous récupérez généralement sa valeur actuelle ou la modifiez en quel-que chose de nouveau. Les méthodes renvient toutefois aussi des valeurs et vouspouvez souhaiter voir la valeur renvoyée par une méthode. Par exemple, lorsquevous employez la méthode Delete sur une feuille de calcul, l’action de la méthodeconsiste à fermer la feuille de calcul. Elle renvoie toutefois une valeur à la macro.

1. Saisissez ?ActiveSheet.Delete et appuyez sur ENTRÉE. Cliquez sur Suppri-mer lorsque vous êtes averti que la feuille contient des données.

La feuille active disparaît et le mot True apparaît après l’instruction. Lorsquela méthode Delete effectue avec succès son action, elle renvoie la valeurTrue. Éliminer la feuille de calcul est l’action de la méthode. Le mot True quiapparaît dans la fenêtre Exécution est la valeur de renvoi de la méthode. Uneméthode peut posséder à la fois une action et une valeur de renvoi.

2. Saisissez ?ActiveSheet.Delete et appuyez sur ENTRÉE. Cliquez cette fois surAnnuler lorsque vous voyez l’avertissement.

Le mot False apparaît après l’instruction. La méthode Delete n’a pas terminél’action de suppression de la feuille de calcul, ce pourquoi elle renvoie lavaleur False.

De nombreuses méthodes renvoient True en cas de réussite de l’action et False encas d’échec. Comme vous pouvez l’imaginer, cela est utile à savoir lors de la rédac-tion de macros.

Examen du résultat de la méthode AddLa méthode Delete de l’objet Worksheet renvoie True ou False, selon la réussite oul’échec de son action. La méthode Add possède également une action : créer un

Page 111: Excel 2007 VBA

Feuilles de calcul 91

nouvel élément dans la collection. Elle ne renvoie toutefois ni True ni False, maisune référence vers l’objet nouvellement créé. Vous pouvez alors vous servir decette référence comme de n’importe quelle référence créée par la propriété Itemou la propriété ActiveSheet.

1. Dans la fenêtre Exécution, saisissez Worksheets.Add.Name = "Nouvellefeuille" et appuyez sur ENTRÉE. Une nouvelle feuille de calcul apparaît dansle classeur, nommée Nouvelle feuille.

2. Saisissez Worksheets.Add.Delete et appuyez sur ENTRÉE. À l’apparition dela boîte de dialogue de confirmation, vous pouvez voir la nouvelle feuille decalcul dans Excel. Cliquez sur Supprimez et constatez la disparition de lafeuille de calcul.

Cet exemple est curieux : il supprime la feuille de calcul dans la même instructionoù il la crée. Il montre toutefois comment la méthode Add renvoie une référencevers l’objet nouvellement créé.

La méthode Add possède une action : elle crée une nouvelle feuille de calcul. Ellerenvoie en outre comme valeur de renvoi une référence vers le nouvel objet. Sivous n’employez pas immédiatement cette référence (au sein de la même instruc-tion), la référence est abandonnée. Pour communiquer avec la nouvelle feuille decalcul, vous devez établir une nouvelle référence à l’aide des propriétés Acti-veSheet ou Item. Vous n’emploierez généralement pas la référence renvoyée parWorksheets.Add car employer ActiveSheet pour établir une nouvelle référence estaussi facile que de crier « Joseph » pour attirer l’attention d’un élève somnolent.

Copie d’une feuille de calculUne autre méthode utile de feuille de calcul permet d’en effectuer une copie.Vous pouvez copier la feuille de calcul dans le même classeur ou dans un classeurdifférent.

1. Dans la fenêtre Exécution, saisissez Activesheet.Copy et appuyez surENTRÉE. Copier une feuille de calcul sans spécifier de destination crée unnouveau classeur qui renferme cette copie.

Page 112: Excel 2007 VBA

92 Chapitre 3 Classeurs et feuilles de calcul

2. Saisissez ActiveWorkbook.Close SaveChanges:=False et appuyez surENTRÉE pour supprimer le nouveau classeur.

3. Saisissez Activesheet.Copy Before:=Activesheet et appuyez sur ENTRÉE.

Cette version de la méthode Copy indique à Excel où placer la nouvelle copie :juste après la feuille de calcul spécifiée, ici la feuille de calcul originale. L’argumentBefore doit être une référence vers une feuille de calcul. Si vous voulez copier unefeuille de calcul à la fin d’un classeur, la méthode Copy dispose d’un argumentAfter à employer à la place de l’argument Before.

La méthode Copy est un moyen pratique de cloner une feuille de calcul. Elle nerenvoie pas de référence vers la nouvelle feuille de calcul, mais True ou False pourindiquer la réussite ou l’échec de l’action. Pour faire référence à la copie nouvelle-ment créée, vous devez employer ActiveSheet ou quelque autre méthode ou pro-priété.

Manipulation de plusieurs feuilles de calculLorsque vous travaillez avec des collections, vous vous intéressez généralementsoit à la totalité de la collection (comme lorsque vous fermez simultanément tousles classeurs à l’aide de l’instruction Workbooks.Close) soit à un unique élément decelle-ci (comme lorsque vous fermez un classeur individuel à l’aide de l’instructionWorkbooks(1).Close). Avec les feuilles de calcul toutefois, il est parfois nécessairede créer une sous-collection : une nouvelle collection qui renferme certaines desfeuilles de calcul de la collection, mais pas toutes.

1. Saisissez Worksheets(3).Select et appuyez sur ENTRÉE pour sélectionner latroisième feuille de calcul du classeur. La méthode Select permet de sélec-tionner une nouvelle feuille de calcul au sein du classeur.

Lorsque vous sélectionnez une feuille de calcul individuelle, celle-ci devientla feuille de calcul active. Excel peut cependant posséder plusieurs feuillesde calcul simultanément sélectionnées : par exemple, lorsque vous mainte-nez enfoncée la touche CTRL tandis que vous cliquez sur des onglets defeuille de calcul.

Page 113: Excel 2007 VBA

Feuilles de calcul 93

2. Saisissez Worksheets(Array(1,3,4)).Select et appuyez sur ENTRÉE poursélectionner les première, troisième et quatrième feuilles de calcul. Array estune fonction qui sert à traiter plusieurs valeurs comme une seule. Elle per-met ici de sélectionner simultanément plusieurs feuilles de calcul. Si troisfeuilles de calcul sont sélectionnées, seule l’une d’entre elles est la feuille decalcul active.

3. Saisissez Worksheets(3).Activate et appuyez sur ENTRÉE pour activer la troi-sième feuille de calcul du classeur, Feuille1, en laissant les trois feuilles decalcul sélectionnées.

Lorsque vous sélectionnez plusieurs feuilles de calcul, celle qui se trouve au-dessus est la feuille de calcul active. Les trois feuilles de calcul sont sélection-nées, mais une seule est active. Vous employez la méthode Activate pourspécifier la feuille de calcul qui doit être la feuille de calcul active. Si vousactivez une feuille de calcul qui n’appartient pas à la sélection actuelle (parexemple, si une seule feuille de calcul est sélectionnée), la méthode Select etla méthode Activate agissent de la même façon : elles sélectionnent et acti-vent une unique feuille de calcul.

4. Saisissez Worksheets(2).Activate et appuyez sur ENTRÉE pour ne sélection-ner que la deuxième feuille de calcul.

Lorsque vous activez une feuille de calcul qui n’est pas sélectionnée, la sélec-tion se modifie pour ne comprendre que la feuille de calcul nouvellementactivée. Vous pouvez simultanément exécuter des méthodes ou affecter desvaleurs aux propriétés de la totalité de la sous-collection de feuilles de cal-cul.

5. Saisissez ?Worksheets(Array(1,3,4)).Count et appuyez sur ENTRÉE.

Le nombre 3 apparaît. Lorsque vous sélectionnez des éléments d’une collec-tion à l’aide de la fonction Array, les éléments sélectionnés constituent unenouvelle collection.

Page 114: Excel 2007 VBA

94 Chapitre 3 Classeurs et feuilles de calcul

Toutes les collections n’autorisent pas l’emploi de la fonction Array en vue de créerdes sous-collections. Vous ne pouvez par exemple pas employer Array avec la col-lection Workbooks. Le modèle objet réfléchit généralement l’interface utilisateur.Dans cette dernière, vous pouvez sélectionner simultanément plusieurs feuilles decalcul, ce pourquoi le modèle objet autorise l’emploi de la fonction Array avec unobjet Worksheets. L’interface utilisateur ne permet toutefois pas de sélectionnersimultanément plusieurs classeurs : le modèle objet ne vous autorise en consé-quence pas à employer la fonction Array avec un objet Workbooks.

Déclaration de variables pour autoriser les Auto ListsDans une instruction Visual Basic, lorsque vous saisissez ActiveWorkbook suivid’un point, une Auto List des méthodes et propriétés d’un classeur apparaît. Enrevanche, lorsque vous saisissez ActiveSheet suivi d’un point, aucune Auto Listn’apparaît. Cela se produit parce qu’un classeur peut contenir plusieurs types defeuilles différents : la feuille active pourrait être une feuille de graphique ou unefeuille de calcul. Dans le contexte d’une macro, vous pouvez obtenir l’apparitiond’une Auto List en plaçant la référence de l’objet dans une variable spécialementdésignée.

1. Dans l’éditeur Visual Basic, fermez la fenêtre Exécution, cliquez sur Inser-tion puis cliquez sur Module.

2. Dans le module, saisissez Sub Test et appuyez sur ENTRÉE pour créer unenouvelle macro.

3. Dans le corps de la macro, saisissez mySheet puis saisissez un point ( ).

Aucune Auto List n’apparaît. Le mot mySheet se comporte comme unevariable. Lorsque vous créez un nouveau mot et l’employez comme variable,Visual Basic crée une variable avec comme type de données Variant. Variantsignifie que vous pouvez affecter ce que vous voulez à la variable, celle-ci semodifiant de Integer à String à Workbook à Range aussi vite que vous êtescapable de lui affecter différentes valeurs ou objets. Visual Basic est incapa-ble d’afficher une Auto List car il n’a aucune idée du type de valeur oud’objet qui va être affecté à la variable à tout moment. Vous pouvez toute-fois promettre à Visual Basic que vous n’affecterez jamais (promis juré !)autre chose qu’un objet Worksheet à la variable mySheet.

4. Supprimez le point que vous venez de saisir. En haut de la macro, juste endessous de l’instruction Sub Test, saisissez cette instruction : Dim mySheetAs Worksheet.

Cette instruction déclare la variable auprès de Visual Basic. Autrement dit,vous déclarez à Visual Basic que mySheet est une variable et que la seule

Page 115: Excel 2007 VBA

Feuilles de calcul 95

chose que vous lui affecterez sera une référence vers un objet Worksheet.Dim est un terme archaïque. C’est l’abréviation de Dimension et avait pourbut d’indiquer à l’ordinateur la place nécessaire à cette variable.

5. Placez le curseur à la fin de l’instruction qui débute par mySheet, puis saisis-sez un point ( ).

L’Auto List apparaît.

6. Saisissez N pour sélectionner la propriété Name.

7. Appuyez sur la barre d’espace, puis saisissez = "Feuille test". La dernièreinstruction devrait être mySheet.Name = "Feuille test".

8. Appuyez sur F5 pour exécuter la macro. Vous obtenez un message d’erreurqui dit « Variable objet ou variable de bloc With non définie ». Vous aviezpromis que mySheet ne contiendrait qu’une feuille de calcul, mais vous nelui avez pas encore affecté de référence vers une feuille de calcul.

9. Cliquez sur Fin pour fermer le message d’erreur puis, après l’instruction Dim,ajoutez l’instruction Set mySheet = ActiveSheet. L’instruction Set affecteune référence vers l’objet ActiveSheet à la variable mySheet.

10. Appuyez à plusieurs reprises sur F8 pour exécuter la macro.

La macro affecte l’objet feuille active à la variable puis modifie le nom decette feuille.

Vous pouvez créer une variable « à la volée » en lui affectant simplement unevaleur ou un objet. Si toutefois vous employez Dim pour déclarer comment vouscomptez employer la variable, Visual Basic est en mesure d’afficher des Auto Listsqui facilitent beaucoup l’écriture du code et le rendent moins susceptible de ren-fermer des erreurs.

FERMEZ Excel.

Page 116: Excel 2007 VBA

96 Chapitre 3 Classeurs et feuilles de calcul

Points clés● Servez-vous de la fenêtre Exécution pour tester des instructions avant de les

placer dans une macro. Cette fenêtre est particulièrement utile pour par-courir pas à pas une macro qui ne contient que des déclarations de varia-bles.

● Tirez le meilleur profit des macros enregistrées qui affectent des valeurs àdes propriétés d’objets. Vous pouvez facilement les convertir en macros quiactualisent la valeur actuelle d’une propriété.

● Recherchez les arguments complémentaires lorsque l’enregistreur a recoursà une méthode. Vous pourriez y découvrir des capacités intéressantes dontvous ignoriez l’existence.

● Repérez les objets collections. Ils possèdent très probablement une pro-priété Item (pour récupérer un élément), une propriété Count (pour savoircombien d’éléments contient la collection) et une méthode Add (pour créerun nouvel élément).

● La méthode Add de la plupart des collections renvoie une référence versl’élément qu’elle a créé. Stockez cet élément dans une variable pour pouvoirl’employer plus facilement dans le reste de la macro.

Page 117: Excel 2007 VBA
Page 118: Excel 2007 VBA

Emploi de l’Explorateur d’objets pour en savoir

plus sur les objets, page 100

Création de formules avec des références absolues et relatives, pages 122 et 123

Emploi d’une macro pour naviguer n’importe où dans une feuille de calcul, page 129

Application de bordures à des

plages, page 134

Application de couleurs et de styles à des plages,page 137

Coup d’œil sur le chapitre

Page 119: Excel 2007 VBA

99

4 Objets de plagesCe chapitre aborde les points suivants :

✔ Emploi de plusieurs propriétés pour faire référence à des objets Range depuis des instructions de macro ;

✔ Placer des valeurs et des formules dans des cellules ;✔ Simplification des macros qui enregistrent des sélections ;✔ Application de mises en forme à des plages ;✔ Emploi de l’Explorateur d’objets pour en savoir plus sur les objets,

propriétés et méthodes.

Le monde serait bien plus simple si tous les gens possédaient la même taille. Plusbesoin de sièges réglables dans les voitures. Personne ne se cognerait plus la têtesur un encadrement de porte. Les pieds ne pendraient plus jamais d’une chaise.Cela n’irait bien sûr pas sans quelques inconvénients : impossible d’échanger lehideux chandail offert pour votre anniversaire sous prétexte qu’il n’est pas de labonne taille !

Lorsque vous employez Microsoft Visual Basic for Applications (VBA) pour écriredes macros pour Microsoft Office Excel, vous n’avez pas à vous préoccuperd’objets plage (ou Range) tant que toutes vos feuilles de calcul et vos fichiers dedonnées sont de la même taille. Par exemple, si vous n’insérez jamais de nouvelleslignes dans un budget, si vous placez toujours les totaux annuels dans la colonneM et si chaque fichier des opérations mensuelles possède exactement 12 colon-nes et 120 lignes, vous pouvez sauter ce chapitre : l’enregistreur de macro peut secharger des plages à votre place.

Dans le monde réel, les humains possèdent des tailles différentes, si bien qu’ilexiste des tailles pour les vêtements et des sièges réglables pour les voitures. Demême, dans le monde réel des feuilles de calcul, les modèles et les fichiers dedonnées possèdent des tailles différentes et variables : vos macros doivent s’yadapter. Excel propose de nombreuses méthodes et propriétés pour travailleravec des objets plage. Ce chapitre s’intéresse à ces objets. Ce faisant, vous appren-drez à employer l’Explorateur d’objets pour en savoir plus sur tout nouvel objetpeu familier.

Page 120: Excel 2007 VBA

100 Chapitre 4 Objets de plages

Référence à une plageUne macro qui doit travailler avec des plages de différentes tailles doit être sou-ple. Cette section montre plusieurs moyens de faire référence à une plage. Lesexemples qui y sont présentés ne font rien d’autre que de référencer des plagesdans une liste, mais il s’agit de techniques que vous emploierez fréquemment lorsdu travail avec des plages. Vous vous servirez dans la suite du chapitre de cestechniques dans des contextes plus concrets.

Référence à une plage à l’aide d’une adresseLa propriété Range est un moyen aussi souple qu’utile de récupérer une référencevers une plage. Elle permet de spécifier l’adresse de la plage concernée. Vouspouvez vous servir de l’Explorateur d’objets pour voir comment employer la pro-priété Range.

1. Dans le classeur Chapitre04, effectuez un clic droit sur un onglet de feuillede calcul, puis cliquez sur Visualiser le code dans le menu contextuel pourafficher l’éditeur Visual Basic. Modifiez la position et la taille des fenêtresd’Excel et de l’éditeur Visual Basic pour voir les fenêtres côte à côte.

2. Dans l’éditeur Visual Basic, cliquez dans la barre d’outils sur le boutonExplorateur d’objets.

Voir aussi Si vous voulez faire de l’Explorateur d’objets une fenêtre ancrable, repor-tez-vous à l’encadré « Fenêtres ancrables » du Chapitre 3, « Classeurs et feuilles decalcul ».

L’Explorateur d’objets apparaît dans l’espace habituellement occupé par lafenêtre de code. Il se compose fondamentalement de deux listes. La liste degauche est celle des noms de classes d’objets. Celle de droite est la liste des

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’information à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

SERVEZ-VOUS du classeur Ranges.xlsx. Ce fichier d’exercice se trouve dans le dos-sier Documents\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer une version prenant en charge les macros du classeur Ran-ges.xlsx sous le nom Chapitre04.xlsm dans le dossier approuvé créé au Chapitre 1.OUVREZ le classeur Chapitre04.xlsm.

Explorateur d’objets

Page 121: Excel 2007 VBA

Référence à une plage 101

membres (méthodes et propriétés) disponibles pour la classe actuellementsélectionnée. En haut de la liste des classes figure une classe spéciale nom-mée <globales>. Il ne s’agit pas en réalité d’une vraie classe, mais elleregroupe dans sa liste de membres toutes les méthodes et propriétés quevous pouvez employer sans spécifier d’objet. Ce sont les méthodes et pro-priétés que vous employez pour débuter une instruction.

3. Dans la liste Classes, sélectionnez l’objet <globales>, cliquez dans la listeMembres de '<globales>', et appuyez sur la touche R pour atteindre lepremier membre qui commence par la lettre R. Sélectionnez alors la pro-priété Range.

La zone en bas de l’Explorateur d’objets affiche des informations sur la pro-priété Range. Celle-ci possède deux arguments. Les crochets autour dusecond argument signalent que celui-ci est facultatif. La propriété Rangerenvoie une référence vers un objet Range.

Page 122: Excel 2007 VBA

102 Chapitre 4 Objets de plages

4. Effectuez un clic droit sur le nom de la propriété Range dans la liste Mem-bres, puis cliquez sur Copier dans le menu contextuel.

5. Cliquez sur le menu Affichage, puis cliquez sur Fenêtre Exécution.

6. Effectuez un clic droit dans la fenêtre Exécution et cliquez sur Coller. Celaéquivaut à employer la commande Compléter le mot pour entrer le nom dela fonction.

7. Après la propriété Range, saisissez une parenthèse ouvrante (Visual Basic vaafficher la liste des arguments) puis saisissez "B2" suivi d’une parenthèsefermante et d’un point. Saisissez ensuite Select.

L’instruction complète est Range("B2").Select. Les guillemets autour de ladéfinition de la page sont indispensables car il s’agit du nom de la plage, pasdu numéro d’élément d’un membre d’une collection.

8. Appuyez sur ENTRÉE pour sélectionner la cellule B2 de la feuille de calculactive.

9. Saisissez Range("B2:H2").Select et appuyez sur ENTRÉE.

Le premier argument de la propriété Range peut être une plage multicellu-les. Ce peut être en réalité toute chose que Excel est capable de reconnaître.

Page 123: Excel 2007 VBA

Référence à une plage 103

10. Saisissez Range("H14").Select et appuyez sur ENTRÉE pour sélectionner lecoin inférieur droit de la liste des valeurs. Saisissez ensuite Range(Selection,"B2").Select et appuyez sur ENTRÉE.

Cela sélectionne la plage de la cellule H14 (la sélection actuelle) à la celluleB2 (la cellule supérieure gauche de la liste). Les arguments de la propriétéRange ne doivent pas forcément être des chaînes : il peut également s’agirde références vers des objets plage. Un emploi fréquent de la forme à deuxarguments de la propriété Range consiste à sélectionner la plage qui s’étendde la plage actuellement sélectionnée à un point fixe du haut de la feuille decalcul.

11. Saisissez ?Selection.Count et appuyez sur ENTRÉE.

Le nombre 91 apparaît dans la fenêtre Exécution. La plage actuellementsélectionnée comporte 91 cellules. Si vous ne spécifiez pas autre chose,Excel traite un objet plage comme une collection de cellules. Si vous voulezconnaître le nombre de lignes ou de colonnes de la plage, vous recourez àdes propriétés spécialisées, comme vous l’apprendrez dans la section« Référence à une plage comme collection de lignes ou de colonnes », plusloin dans ce chapitre.

La propriété Range est un moyen souple d’établir un lien vers un objet Rangequelconque. Vous pouvez vous servir comme argument de la propriété Range soit

Astuce Comme vous l’avez appris au Chapitre 3, la saisie d'un point d’interroga-tion avant une expression dans la fenêtre Exécution permet d’afficher la valeur decette expression.

Page 124: Excel 2007 VBA

104 Chapitre 4 Objets de plages

d’une simple chaîne de texte qui contient une référence valide soit de deux argu-ments qui définissent les points extrêmes d’une plage rectangulaire. Disposantd’une référence résultante vers un objet plage, vous pouvez employer n’importequel membre proposé dans l’Explorateur d’objets pour la classe Range.

Référence à une plage comme collection de cellulesUn classeur peut comporter plusieurs feuilles de calcul : la collection Worksheetsest définie comme classe d’objets. Un objet Worksheets dispose d’une liste deméthodes et propriétés distinctes de celle d’un objet Worksheet.

De même, une feuille de calcul possède de nombreuses cellules. Vous pourriezvous attendre à ce qu’Excel propose un objet collection Cells. Une collection decellules est toutefois plus complexe qu’une collection de feuilles de calcul car lescellules s’expriment en deux dimensions : lignes et colonnes. Vous pourriez parexemple penser à la plage A1:B3 comme à une collection de six cellules, à une col-lection de trois lignes ou à une collection de deux colonnes.

Excel dispose par conséquent de trois propriétés qui considèrent cette plagecomme collection. La première d’entre elles, la propriété Cells, renvoie une collec-tion de cellules. Ce n’est toutefois pas une classe distincte. Le résultat de la pro-priété Cells est toujours un objet Range qui peut employer toute méthode oupropriété d’un objet Range. Comme Excel considère par défaut toute plagecomme une collection de cellules, vous employez généralement la propriété Cellscomme alternative à la propriété Range, en employant des nombres plutôt quedes chaînes de texte.

1. Dans l’Explorateur d’objets, sélectionnez l’objet <globales> dans la listedes classes, puis sélectionnez la propriété Cells dans la liste des membres.

Page 125: Excel 2007 VBA

Référence à une plage 105

La description affichée en bas de l’Explorateur d’objets indique que la pro-priété Cells renvoie un objet Range.

2. Dans la fenêtre Exécution, saisissez Cells.Select et appuyez sur ENTRÉE. Celasélectionne toutes les cellules de la feuille de calcul. Cela équivaut à cliquersur le carré situé au coin supérieur gauche d’une feuille de calcul, entre lesen-têtes de la colonne A et de la ligne 1.

3. Saisissez Cells.Item(5).Select et appuyez sur ENTRÉE.

Cela sélectionne la cellule E1, la cinquième cellule de la première ligne. Lapropriété Cells renvoie la plage de toutes les cellules de la feuille de calculsous forme de collection. Un élément individuel de la collection est une cel-lule.

4. Saisissez Cells.Item(16383).Select et appuyez sur ENTRÉE.

Cela sélectionne la cellule XFC1, l’avant-dernière cellule de la première ligne.Excel 2007 autorise désormais 16384 cellules par ligne.

Page 126: Excel 2007 VBA

106 Chapitre 4 Objets de plages

5. Saisissez Cells.Item(16385).Select et appuyez sur ENTRÉE.

Cela sélectionne la cellule A2, la première cellule de la deuxième ligne. Lors-que vous sélectionnez un élément de la collection Celles à l’aide d’un uniquenombre, le passage à la ligne s’effectue automatiquement. Comme chaqueligne de la feuille de calcul contient 16384 cellules, la cellule 16385 est lapremière cellule de la deuxième ligne.

6. Saisissez Cells.Item(3,2).Select et appuyez sur ENTRÉE.

Cela sélectionne la cellule B3, celle-ci située sur la troisième ligne à ladeuxième colonne de la feuille de calcul. Contrairement à la plupart desautres collections, la collection Cells permet de spécifier un élément enemployant à la fois les valeurs de ligne et de colonne.

7. Saisissez Cells.Item(1048576,16384).Select et appuyez sur ENTRÉE.

Cela sélectionne la cellule XFD1048576, celle située en bas à droite de lafeuille de calcul. Au cas où vous vous interrogeriez, ces nombres curieux nesont que des puissances de 2. Vous pourriez sélectionner la même cellule enemployant l’expression Cells.Item(2^20,2^14). Vous pourriez égalementvous servir de la propriété Range propriété : Range("XFD1048576").

Important Dans les précédentes versions d’Excel, l’expression Cells.Item(257) fai-sait référence à la cellule A2. Avec Excel 2007, cela fait maintenant référence à lacellule IW1, la 257e cellule de la première ligne. Pour écrire des macros qui fonc-tionnent avec les diverses versions, vous devez toujours employer les spécificationsde ligne et de colonne dans la fonction Cells. Autre conséquence de la plus grandetaille des feuilles de calcul, vous ne pouvez plus employer l’expression Cells.Countpour récupérer le nombre de cellules d’une feuille de calcul, car celui-ci est tropélevé. Cela ne devrait pas poser de problème, mais illustre l’augmentation de lataille de la feuille de calcul.

Page 127: Excel 2007 VBA

Référence à une plage 107

8. Saisissez Cells(1).Select et appuyez sur ENTRÉE pour sélectionner la celluleA1.

Comme avec d’autres collections, lorsque vous employez la propriété Cells pourobtenir une collection de cellules, vous pouvez omettre la méthode Item et placersimplement l’argument après la propriété Cells. L’expression Cells(1) est équiva-lente à Cells.Item(1), ainsi qu’à Range("A1"). Ces expressions peuvent êtreemployées indifféremment.

Référence à une plage comme collection de lignes ou de colonnesSi vous pouvez faire référence à une plage de feuille de calcul comme à une col-lection de cellules, vous pouvez également la voir comme une collection de lignesou de colonnes. Similaire à la propriété Cells, la propriété Rows renvoie une col-lection de lignes et la propriété Columns renvoie une collection de colonnes. Cestrois propriétés renvoient des collections, ne possèdent pas leur propre classed’objets mais renvoient des objets Range.

1. Dans l’Explorateur d’objets, l’objet <globales> étant sélectionné dans laliste des classes, sélectionnez la propriété Columns dans la liste des Mem-bres.

La description confirme que cette propriété, analogue aux propriétés Rangeet Cells, renvoie un objet Range.

2. Dans la fenêtre Exécution, saisissez Columns.Select et appuyez sur ENTRÉE.

Cela sélectionne toutes les cellules de la feuille de calcul, exactementcomme avec Cells.Select. La différence entre ces deux propriétés apparaît

Page 128: Excel 2007 VBA

108 Chapitre 4 Objets de plages

lorsque vous employez la propriété Item pour faire référence à un uniqueélément de la collection.

3. Saisissez Columns(3).Select et appuyez sur ENTRÉE. Cela sélectionne lacolonne C, la troisième colonne de la feuille de calcul.

4. Saisissez Columns("D").Select et appuyez sur ENTRÉE. Cela sélectionne lacolonne D. Lorsque vous spécifiez une colonne par sa lettre, vous donnez lenom de l’élément et devez le placer entre guillemets.

5. Saisissez Columns("B:H").Select et appuyez sur ENTRÉE. Cela sélectionne laplage de colonnes de B à H. La seule façon de spécifier une plage de colon-nes au sein de la collection consiste à employer les noms de lettre des colon-nes.

6. Saisissez Rows(2).Select et appuyez sur ENTRÉE. Cela sélectionne la ligne 2.Avec les lignes, le nom d’un élément est aussi un nombre. Les expressionsRows(2) et Rows("2") sont fonctionnellement identiques.

Page 129: Excel 2007 VBA

Référence à une plage 109

7. Saisissez Rows("3:14").Select et appuyez sur ENTRÉE. Cela sélectionne uneplage de lignes. La seule façon de spécifier une plage de lignes au sein de lacollection est d’employer comme noms les numéros de ligne, en les plaçantentre guillemets.

L’objet <globales> de l’Explorateur d’objets comprend trois propriétés qui ren-voient toutes les cellules d’une feuille de calcul : Cells, Columns et Rows. Vousobtenez dans chaque cas une référence vers un objet Range, mais cet objet estrenvoyé par ces propriétés respectivement comme collection de cellules, colon-nes ou lignes. Il n’existe pas de classe d’objet Cells, Columns ou Rows. Ce sont sim-plement des moyens alternatifs de représenter le même objet Range.

Référence à une plage d’après la cellule activeVous voudrez très souvent lors de l’écriture d’une macro faire référence à uneplage apparentée d’une certaine façon à la cellule ou à la sélection active. L’enre-gistreur de macro a recours à la propriété Selection pour effectuer la référence àla plage sélectionnée et à la propriété ActiveCell pour faire référence à une celluleactive. Un objet Range possède des propriétés utiles qui peuvent étendre la cel-lule ou la sélection active pour y inclure des plages particulièrement intéressantes.

1. Dans la fenêtre Exécution, saisissez Range("B2").Select et appuyez surENTRÉE. Cela sélectionne la cellule supérieure gauche de la liste exemple.

2. Dans l’Explorateur d’objets, l’objet <globales> étant sélectionné dans laliste Classes, sélectionnez la propriété ActiveCell.

Page 130: Excel 2007 VBA

110 Chapitre 4 Objets de plages

La description en bas de l’Explorateur d’objets confirme que cette propriétérenvoie un objet Range.

3. Dans la fenêtre Exécution, cliquez sur le menu Edition, puis cliquez surCompléter le mot. Dans la liste des membres, cliquez sur ActiveCell.

4. Saisissez un point ( . ), puis saisissez CurrentRegion.Select pour créer l’ins-truction ActiveCell.CurrentRegion.Select. Appuyez sur ENTRÉE.

Cela sélectionne la totalité de la liste exemple. La propriété CurrentRegionsélectionne une forme rectangulaire qui comprend la cellule originaleentourée de cellules vierges ou des bords de la feuille de calcul. Il est impos-sible de trop insister sur l’utilité de la propriété CurrentRegion.

5. Saisissez ActiveCell.EntireColumn.Select et appuyez sur ENTRÉE.

Cela sélectionne toute la colonne B, puisque la cellule active était la celluleB2. Comme la plage de départ est la cellule active et non la totalité de lasélection, la propriété EntireColumn ne renvoie une référence que pour une

Astuce Lorsque vous employez la commande Compléter le mot au début d’uneinstruction, que ce soit dans une macro ou dans la fenêtre Exécution, l’Auto Listaffiche tous les membres de l’objet <globales>. Si vous préférez vous servir du cla-vier, vous pouvez appuyer sur CTRL+BARRE D’ESPACE pour afficher la liste des mem-bres, saisir des mots partiels et vous servir des touches fléchées pour sélectionner lemembre désiré, puis appuyer sur la touche TAB pour insérer le membre dans l’ins-truction.

Page 131: Excel 2007 VBA

Référence à une plage 111

colonne. La cellule active initiale B2 étant encore dans la sélection, elle restela cellule active.

6. Dans l’Explorateur d’objets, l’objet <globales> étant sélectionné, sélec-tionnez dans la liste des membres la propriété Selection.

La description du bas indique que la propriété Selection renvoie un objet,pas un objet Range. Elle ne renvoie un objet Range que lorsque des cellulessont sélectionnées. Si la sélection concerne des formes ou des parties degraphique, cette propriété globale renvoie un type d’objet différent. Puisquela propriété Selection peut renvoyer un type d’objet différent en différentesoccasions, elle n’affiche pas d’Auto List comme la propriété ActiveCell.

7. Dans la fenêtre Exécution, saisissez Selection.CurrentRegion.Select etappuyez sur ENTRÉE.

Cela sélectionne la plage B1:H14, la totalité de la liste exemple plus uneligne au-dessus. Cette instruction se comporte comme si la sélection activene comportait que la cellule B1. Lorsque vous employez la propriété Curren-tRegion avec une plage multicellules comme le point de départ, elle ignore

Page 132: Excel 2007 VBA

112 Chapitre 4 Objets de plages

tout sauf la cellule supérieure gauche de la plage pour le calcul de la régionactive.

8. Saisissez Range("A2").Activate et appuyez sur ENTRÉE.

Comme la cellule spécifiée est à l’extérieur de la sélection active, la méthodeActivate se comporte comme la méthode Select.

9. Saisissez Selection.EntireRow.Select et appuyez sur ENTRÉE.

Cela sélectionne toute la ligne 2. Puisque la sélection ne comporte qu’unecellule, vous obtiendriez exactement le même résultat avec ActiveCell.Entire-Row.Select.

10. Saisissez Range("B2").Activate et appuyez sur ENTRÉE.

Comme la cellule spécifiée est à l’intérieur de la sélection active, cette ins-truction ne modifie pas la sélection mais déplace la cellule active vers unautre emplacement de la plage. Si vous activez une cellule qui n’appartientpas à la sélection active, la méthode Activate se comporte comme laméthode Select.

Page 133: Excel 2007 VBA

Référence à une plage 113

Les propriétés Selection et ActiveCell sont utiles comme points de départ d’oùfaire dériver d’autres plages. La propriété ActiveCell renvoie toujours une réfé-rence vers un objet plage Range et affiche donc une bien pratique Auto List lors-que vous saisissez une instruction. La propriété Selection ne renvoie une référencevers un objet Range que si une plage est auparavant sélectionnée : elle n’affichedonc pas d’Auto List.

Référence aux sous-ensembles d’une plageLorsque vous référencez une plage à l’aide d’une propriété de l’objet <globales>,par exemple Range, Cells, Columns ou Rows, vous obtenez une plage fondée surla totalité de la feuille de calcul active. Ces propriétés existent également commepropriétés d’un objet Range. La façon la plus simple de travailler avec les proprié-tés d’un objet Range consiste à déclarer une variable comme Range. L’Auto Listaffiche alors les méthodes et propriétés lorsque vous saisissez une instruction,même avec la propriété Selection (qui n’affiche normalement pas d’Auto List)pour affecter la plage à une variable.

1. Dans l’éditeur Visual Basic, cliquez sur Insérer, puis cliquez sur Module.

2. Saisissez Sub TestRange et appuyez sur Entrée. Visual Basic ajoute desparenthèses et une instruction End Sub.

3. Saisissez Dim myRange As Range et appuyez deux fois sur F8 pour initiali-ser la variable.

4. Dans la fenêtre Exécution, saisissez Set myRange = Range("B2") etappuyez sur ENTRÉE. Saisissez ensuite myRange.Select et appuyez à nou-veau sur ENTRÉE. Cela sélectionne la cellule B2, confirmant que la variablecontient une référence vers cette cellule.

5. Cliquez sur le bouton de l’Explorateur d’objets. Dans la liste des classes,sélectionnez la classe Range. Dans la liste des membres de cette classe,sélectionnez la propriété Range.

Cette propriété Range ressemble beaucoup à la propriété Range de l’objet<globales>. Elle se comporte toutefois relativement par rapport à une plageinitiale.

6. Dans la fenêtre Exécution, saisissez myRange.Range("A1:G1").Select etappuyez sur ENTRÉE.

Cela ne sélectionne pas la plage A1:G1, mais la plage B2:H2. Si vous consi-dérez la cellule B2 comme la cellule supérieure gauche d’une feuille de cal-cul imaginaire, la plage A1:G1 de cette feuille de calcul correspondrait à laplage B2:H2 de la vraie feuille de calcul.

Page 134: Excel 2007 VBA

114 Chapitre 4 Objets de plages

7. Saisissez Set myRange = myRange.CurrentRegion et appuyez sur ENTRÉE.Saisissez ensuite myRange.Select et appuyez à nouveau sur ENTRÉE.

Puisque myRange fait déjà référence à la cellule B2 qui appartient à la listeexemple, la première instruction référence la totalité de la liste exemple et laseconde confirme que la variable renferme une référence vers la plageappropriée.

8. Saisissez myRange.Cells.Item(2,6).Select et appuyez sur ENTRÉE.

Cela sélectionne la première valeur de données dans la colonne Units : ligne2 et colonne 6 de la région de données.

9. Saisissez myRange.Rows(2).Select et appuyez sur ENTRÉE.

Cela sélectionne la deuxième ligne de valeurs de la liste, bien qu’elles setrouvent dans la ligne 3 de la feuille de calcul. Une unique ligne de la collec-tion référencée par la propriété globale Rows comprend la totalité de lafeuille de calcul. La propriété Rows d’un objet Range ne comprend que lescellules de la plage.

10. Saisissez myRange.Rows(myRange.Rows.Count).Select et appuyez surENTRÉE.

Cela sélectionne la dernière ligne de la liste. Comme la propriété Rows ren-voie une collection, vous pouvez vous servir de la propriété Count pourobtenir le nombre d’éléments de la collection. Ce nombre peut servird’index dans la même collection.

Page 135: Excel 2007 VBA

Référence à une plage 115

Lorsque vous employez les propriétés Range, Cells, Columns ou Rows commemembres d’un objet Range, les plages résultantes sont relatives à la cellule supé-rieure gauche de la plage initiale. Opposez ceci à l’emploi des mêmes fonctionsdu groupe global, ou comme membres d’un objet Application ou Worksheet.Avec quoi que ce soit d’autre qu’un objet Range, ces fonctions renvoient des pla-ges relatives à la cellule supérieure gauche de la feuille de calcul.

Référence à une plage relativeExcel possède d’autres propriétés qui peuvent calculer une nouvelle plage d’aprèsune ou plusieurs plages existantes. Deux de ces propriétés n’existent pas dans laliste des membres globaux, mais uniquement comme membres d’un objetRange : la propriété Offset référence une plage décalée vers le bas, le haut, ladroite ou la gauche d’une plage initiale tandis que la propriété Resize référenceune plage avec un nombre de lignes et/ou de colonnes différent de ceux de laplage initiale. Une autre propriété, Intersect, apparaît dans la liste des membresglobaux. Elle est particulièrement utile lorsque vous devez « éliminer » une partied’une plage, comme pour supprimer la ligne d’en-tête de la région active.

1. Dans l’Explorateur d’objets, sélectionnez Range dans la liste Classes. Dansla liste Membres, sélectionnez la propriété Offset.

La description indique que cette propriété possède deux arguments faculta-tifs, RowOffset et ColumnOffset et renvoie un objet Range.

Page 136: Excel 2007 VBA

116 Chapitre 4 Objets de plages

2. Dans la fenêtre Exécution, saisissez myRange.Offset(1).Select et appuyezsur ENTRÉE.

Cela sélectionne une plage identique en forme et en taille à la plage stockéedans la variable, mais décalée vers le bas d’une cellule. Le premier argumentde la propriété Offset indique le nombre de lignes du décalage vers le bas,le second le nombre de colonnes de décalage vers la droite de la plage.Omettre un argument équivaut à spécifier zéro et ne décale pas la plagedans cette direction.

Astuce Pour comprendre la propriété Offset, imaginez-vous placé à la cellulesupérieure gauche de la plage initiale. Regardez le bas de la feuille de calcul, etavancez du nombre de pas spécifié dans le premier argument. Zéro pas signifie pasde mouvement. Les pas négatifs correspondent à un recul. Tournez-vous ensuitevers la droite de la feuille de calcul et procédez de la même façon en vous dépla-çant du nombre de pas stipulé dans le second argument. La plage résultante pos-sède la même taille et la même forme que la plage originale, mais débute sur lacellule sur laquelle vous vous trouvez.

Page 137: Excel 2007 VBA

Référence à une plage 117

3. Dans l’Explorateur d’objets, sélectionnez Range dans la liste Classes.Sélectionnez ensuite la propriété Resize dans la liste des membres.

La description indique que cette propriété possède deux arguments faculta-tifs, RowSize et ColumnSize, et renvoie un objet Range.

4. Dans la fenêtre Exécution, saisissez myRange.Offset(1).Resize(5).Selectet appuyez sur ENTRÉE.

Cela sélectionne les cinq premières lignes de données. La propriété Offsetdécale la plage d’une ligne pour omettre la ligne d’en-têtes. La fonctionResize modifie la taille de la plage résultante. Le premier argument de lapropriété Resize est le nombre de lignes de la plage résultante. Le second estle nombre de colonnes de la plage résultante. Omettre un argument équi-vaut à conserver la taille de la plage originale dans cette direction.

5. Saisissez myRange.Offset(1,5).Resize(1,2).Select et appuyez sur ENTRÉE.

Cela sélectionne la plage G3:H3, les valeurs numériques de la première lignedu corps de la liste.

Astuce La combinaison des fonctionnalités des propriétés Offset et Resize estéquivalente aux fonctionnalités de la fonction OFFSET disponible pour les feuillesde calcul.

Page 138: Excel 2007 VBA

118 Chapitre 4 Objets de plages

6. Dans l’Explorateur d’objets, l’objet <globales> étant sélectionnée dans laliste des classes, sélectionnez la méthode Intersect dans la liste Membres.

La description montre que cette méthode renvoie un objet Range, maiségalement qu’elle peut accepter jusqu’à 30 arguments ! Vous n’emploierezgénéralement que deux arguments, les deux seuls arguments obligatoires.L’Explorateur d’objets montre que les deux premiers arguments doivent êtredes objets Range. Les arguments facultatifs doivent également être des pla-ges. Vous pouvez employer la méthode Intersect en combinaison avec laméthode Offset pour supprimer les en-têtes de la région active.

7. Dans la fenêtre Exécution, saisissez Intersect(myRange, myRange.Off-set(1)).Select et appuyez sur ENTRÉE.

Cela sélectionne la plage B3:H14 : la totalité de la liste moins la ligne d’en-têtes. Il est souvent nécessaire de manipuler le corps d’une liste indépen-damment de ses en-têtes. L’emploi d’une plage comme premier argumentde la méthode Intersect, puis d’une version décalée de la plage commesecond argument permet d’éliminer une portion de la plage.

Page 139: Excel 2007 VBA

Amélioration de sélections enregistrées 119

8. Appuyez sur F5 pour arrêter la macro.

Les propriétés Offset et Resize, ainsi que les propriétés EntireRow, EntireColumn etCurrentRegion et la méthode Intersect, constituent des outils souples pour le cal-cul de nouveaux objets Range fondés sur une plage de départ initiale. La façon laplus simple de travailler avec une plage consiste souvent à employer d’abord lapropriété CurrentRegion pour définir la plage de base, puis à employer la pro-priété Offset et la méthode Intersect pour manipuler la plage.

Amélioration de sélections enregistréesLorsque vous enregistrez une macro, l’enregistreur de macro suit consciencieuse-ment vos actions, y compris la sélection des plages avant tout travail sur eux. Vouspouvez alléger le travail d’une macro (et la rendre plus facile à lire) en éliminantles modifications de sélection superflues. Une technique efficace pour éliminer lesmodifications superflues de sélection commence par l’identification d’une ins-truction terminée par Select, suivie d’une ou de plusieurs instructions qui débu-tent par Selection ou ActiveCell. Ce que vous faites ensuite dépend de si uneunique instruction Selection (ou ActiveCell) suit l’instruction Select ou s’il s’agitd’un groupe d’instructions.

Simplification des paires Select…SelectionLorsqu’une unique instruction Selection suit une instruction Select, vous pouvezcondenser les deux instructions en une seule. Enregistrez et simplifiez une macroqui place le nom des mois en haut d’une feuille de calcul.

1. Dans Excel, insérez une feuille de calcul vierge et commencez à enregistrerune macro nommée NomsMois. Saisissez les libellés Janvier, Février etMars dans les cellules B1, C1 et D1.

2. Arrêtez l’enregistreur puis affichez la macro.

Elle devrait ressembler au code qui suit. Votre macro peut toutefois en dif-férer un peu, selon les touches pressées lors de la saisie des valeurs dans lescellules.

Sub NomsMois() Range("B1").Select ActiveCell.FormulaR1C1 = "Janvier" Range("C1").Select ActiveCell.FormulaR1C1 = "Février"

Page 140: Excel 2007 VBA

120 Chapitre 4 Objets de plages

Range("D1").Select ActiveCell.FormulaR1C1 = "Mars" Range("D2").SelectEnd Sub

Pour chaque cellule, le mot Select apparaît à la fin d’une instruction, suivi dumot Selection ou ActiveCell au début de l’instruction suivante. Vous pouvezsupprimer chacun de ces mots, en ne laissant qu’un point. Si une instructionSelect est la dernière instruction d’une macro, vous pouvez la supprimertotalement.

3. Supprimez les sélections superflues de la macro NomsMois, en éliminantchaque occurrence de Select et de ActiveCell.

La macro finale devrait ressembler à ceci :

Sub NomsMois() Range("B1").FormulaR1C1 = "Janvier" Range("C1").FormulaR1C1 = "Février" Range("D1").FormulaR1C1 = "Mars"End Sub

4. Insérez une nouvelle feuille de calcul vierge et testez la macro.

Les libellés apparaissent dans les cellules, sans modifier la sélection origi-nale.

Pourquoi éliminer les paires Select…Selection ? Une des raisons est que celal’accélère. Une autre est qu’exécuter une macro peut paraître moins dérangeant sielle ne sélectionne pas au final d’autres cellules que la sélection initiale. La raisonla plus importante est toutefois que la présence de paires Select…Selection cons-titue une preuve indéniable de ce que vous êtes un débutant qui a recours àl’enregistreur de macro pour créer des macros. Il n’y a rien de mal à employerl’enregistreur de macro : pensez juste à effacer les preuves !

Simplification de la sélection de groupesLorsque vous éliminez une paire Select…Selection, veillez bien à ce qu’une seuleinstruction se sert de la sélection. Si une instruction Select est suivie d’au moinsdeux instructions qui se servent de la sélection, vous pouvez encore éviter demodifier celle-ci, mais vous devez vous y prendre différemment.

1. Dans Excel, sélectionnez une feuille avec des libellés dans la première ligne,puis commencez à enregistrer une macro nommée GrasItalique.

2. Cliquez sur la cellule B1, cliquez sur le bouton Gras, cliquez sur le boutonItalique, puis cliquez sur le bouton Arrêter l’enregistrement.

Gras Italique

Page 141: Excel 2007 VBA

Amélioration de sélections enregistrées 121

3. Modifiez la macro comme suit :

Sub GrasItalique() Range("B1").Select Selection.Font.Bold = True Selection.Font.Italic = TrueEnd Sub

De toute évidence, si vous supprimez la première paire Select…Selection, lamacro ne contrôlera pas les cellules placées en italique.

4. Modifiez la macro pour affecter la plage à une variable nommée myRange.Remplacez ensuite l’objet Selection par l’objet myRange. La macro modi-fiée devrait ressembler à ceci :

Sub GrasItalique() Dim myRange As Range Set myRange = Range("B1") myRange.Font.Bold = True myRange.Font.Italic = TrueEnd Sub

5. Modifiez "B1" en "C1" dans la macro, puis appuyez à plusieurs reprises surF8 pour parcourir la macro. Remarquez comme la mise en forme de la cel-lule se modifie sans changer la cellule active (sélectionnée).

6. Enregistrez le classeur Chapitre04.

Éliminer une sélection en présence d’un groupe ne semble pas être une vraie sim-plification. Avec uniquement deux instructions, c’est probablement vrai. Lorsquetoutefois vous possédez de nombreuses instructions qui ont recours à la mêmesélection, le stockage de la plage dans une variable peut fortement faciliter la lec-ture de la macro.

Arrêter l’enregistrement

Astuce Vous pourriez également remplacer le groupe Select par une structureWith, comme ceci :With Range("B1") .Font.Bold = True .Font.Italic = TrueEnd WithLa structure With crée secrètement à l’arrière-plan une variable masquée, récupèrel’objet de l’instruction With et l’affecte à la variable masquée. Elle place ensuite lavariable masquée devant chaque point initial. L’instruction End With élimine lavariable masquée. L’intérêt de l’emploi d’une variable objet explicite est que vouspouvez la déclarer avec un type d’objet spécifique, comme Dim myRange asRange. VBA vérifie alors la pertinence de toute méthode ou propriété employée.Le recours à une variable explicitement déclarée permet également de tirer profitdes Auto Lists VBA lors de la modification de la macro.

Page 142: Excel 2007 VBA

122 Chapitre 4 Objets de plages

Saisie de valeurs et de formules dans une plageDans certains cas, vous voudrez créer une macro qui entre dynamiquement desformules dans des cellules. Vous devez pour cela d’abord comprendre le fonction-nement des références dans Excel, puis examiner comment créer des formulesdans une macro.

Voir aussi Cette section s’intéresse aux références de formules standards d’Excel. Voustrouverez des informations sur l’emploi de formules structurées dans un tableau dans lasection « Enregistrement d’une macro pour manipuler un tableau » du Chapitre 5, « Objetsde données ».

Références relativesLa plupart des formules effectuent des opérations mathématiques sur des valeursrécupérées depuis d’autres cellules. Les formules Excel ont recours à des référen-ces de cellule pour en récupérer des valeurs. Imaginez par exemple une liste deprix Retail (prix de vente au détail) et de coûts Wholesale (prix de revient en gros).

Supposez que vous vouliez ajouter une colonne pour calculer la marge brute (ladifférence entre le prix de revient et le prix de vente) pour chaque article. Vousplaceriez le libellé Marge dans la cellule D1 puis saisiriez la première formule dansla cellule D2. La formule soustrait le premier prix de revient (Wholesale) de la cel-lule C2 au premier prix de vente Retail (cellule B2). Vous entreriez donc =B2-C2dans la cellule D2.

Pour chaque élément du groupe High, la marge brute est égale à $ 2,75. Vousdevez maintenant copier cette formule dans les autres lignes. La formule saisiedans la cellule D2 fait explicitement référence aux cellules C2 et B2. Lorsque vouscopiez la formule dans la cellule D3, vous souhaitez que celle-ci s’ajuste automa-tiquement pour faire référence à C3 et B3. Heureusement, lorsque vous copiezune formule, Excel ajuste les références : par défaut, des références sont toujoursrelatives à la cellule qui contient la formule. La feuille de calcul Prices du classeurChapitre04 contient ces formules.

Page 143: Excel 2007 VBA

Saisie de valeurs et de formules dans une plage 123

Si la référence =C2 est présente dans la cellule D2, elle signifie en réalité « unecellule vers la gauche ». Lorsque vous copiez la formule dans la cellule D3, celle-ci signifie toujours « une cellule vers la gauche », ce qui est désormais représentépar la référence =C3.

Références absoluesLes références relatives sont parfois gênantes. Imaginez par exemple une feuillede calcul qui renferme des quantités diverses dans la colonne B et des prix dans laligne 3. La feuille de calcul Revenue du classeur Chapitre04 contient ces prix et cesquantités.

Supposez que vous vouliez ajouter des formules pour calculer les recettes pourchaque combinaison. Pour calculer la première valeur de recette (cellule C4), vousdevez multiplier la première quantité (cellule B4) par le premier prix (cellule C3).En saisissant = B4*C3 dans la cellule C4, vous obtenez la bonne réponse : $ 50.

Si toutefois vous copiez cette formule dans la cellule C5, vous obtenez l’aberranteréponse de $ 1000. Les références de la cellule sont en effet relatives. Dans cetteversion de la formule, vous ne référencez pas réellement les cellules B4 et C3. Vousfaites référence à « une cellule à gauche » et à « une cellule au-dessus ». Lorsquevous placez cette formule dans la cellule C5, « une cellule au-dessus » correspondà la cellule C4, pas à la cellule C3.

Vous souhaitez dans le tableau Revenue que les références à la cellule s’ajustentde ligne en ligne et que les références à la cellule Price s’ajustent de colonne encolonne, mais la quantité doit toujours provenir de la colonne B et le prix de laligne 3. La solution dans l’interface utilisateur consiste à placer un signe dollar ($)

Page 144: Excel 2007 VBA

124 Chapitre 4 Objets de plages

devant le B de la première référence Quantity ($B4), ainsi qu’avant le 3 de la pre-mière référence Price (C$3). La formule à placer dans la cellule C4 est =$B4*C$3.Le signe dollar « ancre » cette portion de la formule en la rendant absolue. Lors-que vous copiez la formule dans le reste de la plage C4:E8, vous obtenez les résul-tats corrects. La feuille de calcul RevenueFormulas du classeur Chapitre04 contientles formules correctes.

La partie relative de la formule se modifie avec la ligne ou la colonne de la cellulequi contient la formule, mais la partie absolue reste fixe.

Si vous voulez modifier la formule de façon à ce qu’elle également compte de lavaleur de remise de la cellule G3, vous devez rendre absolue la totalité de la réfé-rence à la remise : ligne et colonne. La formule adéquate est =$B4*C$3*(1-$G$3).Vous pouvez affecter un nom à une cellule, par exemple en affectant le nom Dis-count à la cellule G3. Dans ce cas, par défaut, l’emploi de ce nom dans une for-mule agit comme une référence totalement absolue. La feuille de calculRevenueFormulas du classeur Chapitre04 contient ces formules. Vous créerez plusloin dans ce chapitre une macro qui peuple la grille à l’aide des formules adéqua-tes, quels que soient le contenu de la feuille de calcul et le nombre de lignes et decolonnes qu’elle possède.

Style de référence L1C1Par défaut, Excel affiche des lettres comme en-têtes des colonnes et des nombrescomme en-têtes des lignes. Le nom par défaut de la cellule supérieure gauche dela feuille de calcul est donc la cellule A1. Faire référence aux cellules à l’aide de let-tres et de nombres porte le nom de style de référence A1. Avec le style de réfé-rence A1, les références de cellules ne disent toutefois ce qu’elles signif ientréellement. Par exemple, la référence =C4 dit « cellule C4 », mais, si elle est situéedans une formule dans la cellule E4, elle signifie réellement « deux cellules àgauche », tandis que placée dans une formule de la cellule C5, elle signifie « unecellule au-dessus ». Vous ne connaissez la réelle signification d’une référence quesi vous connaissez la cellule qui la contient.

Excel possède un style de référence alternatif qui a recours à des nombres pour lesen-têtes des lignes et des colonnes. Dans ce style alternatif, pour faire référence à

Page 145: Excel 2007 VBA

Saisie de valeurs et de formules dans une plage 125

une cellule vous employez la lettre L suivie du numéro de ligne et à C suivi dunuméro de colonne. De ce fait, la cellule supérieure gauche de la feuille de calculest la cellule L1C1. Faire référence aux cellules à l’aide de nombre à la fois pour leslignes et les colonnes porte le nom de style de référence L1C1. Avec le style deréférence L1C1, toute référence de cellule dit exactement ce qu’elle signifie. Dansdes macros, lorsque VBA doit comprendre et employer des formules, il est doncgénéralement plus pratique d’employer le style de référence L1C1. Lorsqu’unhumain doit comprendre la formule, il est en revanche souvent plus simpled’employer le style de référence A1 : c’est pour cette raison que le style de réfé-rence A1 est employé par défaut.

Vous pouvez toutefois modifier l’interface utilisateur pour employer le style deréférence L1C1, si vous voulez l’essayer. Pour activer le style de référence L1C1, cli-quez sur le Bouton Microsoft Office puis cliquez sur Options Excel. Dans la pageFormules, cochez la case Style de référence L1C1 puis cliquez sur OK. Pour désac-tiver le style de référence L1C1, supprimez la coche. Le réglage de la boîte de dia-logue des Options Excel est sans effet sur les macros : une macro peut entrer desformules indifféremment à l’aide d’un quelconque de ces styles de référence.

Avec le style de référence L1C1, pour spécifier une référence relative sur la mêmeligne ou colonne que la cellule qui comporte la formule, vous employez simple-ment un L ou un C, sans nombre. Par exemple, la référence =LC3 signifie « la cel-lule de la colonne 3 sur ma ligne » et la référence =L2C signifie « la cellule de laligne 2 de ma colonne ».

Pour spécifier une référence vers une autre ligne ou colonne, vous indiquez lavaleur de la différence placée entre crochets, après le L ou le C. Par exemple, laréférence =L5C[2] signifie « deux colonnes à ma droite sur la ligne 5 » et la réfé-rence =L[-1]C signifie « une cellule au-dessus de moi ».

Page 146: Excel 2007 VBA

126 Chapitre 4 Objets de plages

La formule correcte pour calculer la marge brute de la feuille de calcul Prices était=B2-C2, mais uniquement si la formule était saisie dans la cellule D2. Avec le stylede référence L1C1, la formule équivalente est =LC[-2]-LC[-1] : peu importe quelleligne contient la formule. La formule de calcul du prix après remise de la feuille decalcul Revenue était =$B4*C$3*(1-$G$3), du moins pour la cellule C4. Avec lestyle de référence L1C1, la formule devient =LC2*L3C*(1-L3C7), indépendam-ment de la cellule qui contient la formule.

Insertion de valeurs et de formules dans une plageVous pouvez examiner les propriétés de l’insertion de valeurs et de formules dansune plage en créant une simple liste de nombres incrémentiels.

1. Dans l’éditeur Visual Basic, activez la fenêtre Exécution, saisissezWorksheets.Add, et appuyez sur ENTRÉE pour créer une nouvelle feuille decalcul vierge dans le classeur actif.

2. Saisissez Range("B2:B6").Select et appuyez sur ENTRÉE pour sélectionnerune plage initiale de cellules exemple.

3. Saisissez Selection.Value = 100 et appuyez sur ENTRÉE pour remplir toutesles cellules de la sélection avec le nombre 100.

Value est une propriété de la plage. Lorsque vous fixez la valeur de la pro-priété Value en combinaison avec une sélection multicellules, vous modifieztoutes les cellules de la plage.

Important Lorsque vous employez le style de référence A1, la formule se modifieselon la plage dans laquelle vous la copiez. Avec le style de référence L1C1, la for-mule reste identique quelle que soit la cellule dans laquelle elle est placée. Le stylede référence n’a d’importance que lorsque vous placez la même formule dans plu-sieurs cellules.

Page 147: Excel 2007 VBA

Saisie de valeurs et de formules dans une plage 127

4. Saisissez ActiveCell.Value = 0 et appuyez sur ENTRÉE pour modifier la valeurde la cellule B2 en 0.

Seule la cellule active est modifiée, pas l’ensemble des cellules sélectionnées.Entrer une valeur dans la cellule active est équivalent à saisir une valeur et àappuyer sur ENTRÉE. Entrer une valeur dans la sélection équivaut à saisir unevaleur et à appuyer sur CTRL+ENTRÉE.

Supposez que vous vouliez entrer une valeur dans la cellule située au-dessusde la cellule active, quelle que puisse être cette dernière.

5. Saisissez ActiveCell.Offset(-1).Value = 1 et appuyez sur ENTRÉE pour modi-fier la valeur de la cellule B1 en 1.

Cette instruction part de la cellule active, a recours à la propriété Offset pouractiver une cellule située juste au-dessus de la cellule initiale, puis fixe lapropriété Value de la cellule résultante.

6. Saisissez Selection.FormulaR1C1 = "=R[-1]C*5" et appuyez sur ENTRÉE.

Astuce Lorsque vous affectez une valeur constante à une plage, la propriété For-mula est équivalente à la propriété Value : Selection.Formula = 100 est identique àSelection.Value = 100. La propriété Formula correspond à ce que vous voyez dansla barre de formule lorsque la cellule est sélectionnée. La barre de formule peutcontenir des constantes ou des formules : il en va de même pour la propriété For-mula. Lorsque vous affectez une valeur à une cellule, les propriétés Formula etValue ont le même effet.

Page 148: Excel 2007 VBA

128 Chapitre 4 Objets de plages

Maintenant, chacune des cellules sélectionnées renferme une formule, pasune constante. La propriété FormulaR1C1 attend une formule dans le stylede référence L1C1. La référence R[-1]C signifie toujours « une cellule au-dessus », quelle que soit la cellule qui reçoit la formule.

7. Saisissez ?ActiveCell.Value et appuyez sur ENTRÉE.

Cette instruction affiche la valeur 5 dans la fenêtre Exécution. La propriétéValue récupère le résultat de toute formule d’une cellule. Lorsque vous récu-pérez le contenu d’une cellule qui renferme une formule, cette propriétévous donne le résultat de la formule.

8. Saisissez ?ActiveCell.Formula et appuyez sur ENTRÉE.

Cette instruction affiche la formule =B1*5 dans la fenêtre Exécution. Lors-que vous récupérez le contenu d’une cellule qui renferme une formule, lapropriété Formula vous donne la formule à l’aide du style de référence A1.Le réglage de la boîte de dialogue des Options Excel est ignoré. Si vous vou-lez récupérer la formule à l’aide du style de référence L1C1, servez-vous dela propriété FormulaR1C1.

Toutes les cellules disposent des propriétés Formula, FormulaR1C1 et Value. Lespropriétés Value et Formula se comportent de la même façon lorsque vous écri-vez dans la cellule. Lorsque vous lisez la valeur d’une cellule, la propriété Valuevous procure la valeur et la propriété Formula la formule à l’aide du style de réfé-rence A1. La propriété FormulaR1C1 est analogue à la propriété Formula, si cen’est qu’elle emploie le style de référence L1C1 (ou plus exactement R1C1, commenous l’avons vu) pour toutes les références, que ce soit pour affecter une formuleà une cellule ou pour en lire une formule.

Important Vous devriez être surpris du nom de la propriété, FormulaR1C1 et nonFormulaL1C1, ainsi que du fait que vous saisissez R[-1] et non L[-1] comme dansl’interface utilisateur pour faire référence à la ligne immédiatement supérieure. Lestyle de référence L1C1 se nomme R1C1 dans la version anglophone (Row à laplace de Ligne) et les méthodes et propriétés VBA, ainsi que leurs arguments, con-servent leurs noms anglophones.

Page 149: Excel 2007 VBA

Saisie de valeurs et de formules dans une plage 129

Construction de formules pour remplir une grilleVous aurez parfois besoin d’une macro pour créer des formules qui contiennentdes références. Par exemple, imaginez que vous vouliez créer une macro qui entreles formules adéquates dans la grille Revenue. Vous pourriez simplement enregis-trer une macro, mais une macro enregistrée se sert d’adresses de cellules spécifi-ques. La grille pourrait se trouver n’importe où sur la feuille de calcul, pasforcément à partir de la cellule A1 et posséder une taille quelconque. Votre macroenregistrée ne pourrait gérer ce type de variations.

Si vous êtes en mesure d’effectuer quelques affirmations simples, vous pouvezcréer une macro qui identifie le quadrillage, sélectionne la région active pour endéterminer la taille, puis ajoute la formule correcte.

Vous pouvez même faire en sorte que la macro identif ie automatiquementl’emplacement de la cellule Discount et lui affecte un nom de façon à ce que laformule puisse la référencer d’après son nom. Les affirmations qu’il est nécessaired’effectuer ont très utiles pour la plupart des macros simples :

● Les mots employés comme libellés sont toujours les mêmes, si bien que lamacro peut les rechercher.

● La grille comporte toujours le même nombre de lignes et de colonnes d’en-tête.

● Les plages distinctes sont séparées par au moins une ligne ou une colonnevierge de façon à ce que la méthode CurrentRegion puisse détecter le rec-tangle.

Sur la feuille de calcul Revenue, les libellés à rechercher sont Price et Discount, lagrille comporte deux lignes et une colonne d’en-têtes, tandis que les plages sontséparées par la colonne F.

Astuce La propriété Value vous donne toujours la valeur non mise en forme d’unnombre situé dans une cellule. Une cellule possède également une propriété Text,qui renvoie la valeur mise en forme de la cellule. La propriété Text est en lectureseule : il s’agit d’une combinaison des propriétés Value et NumberFormat.Une plage possède en outre une propriété Value2. La différence entre Value etValue2 concerne des nombres de très grande taille à très forte précision, commeen comptabilité ou en banque. La propriété Value emploie un type de données àvirgule flottante et double précision capable de gérer soit de très grands nombressoit des nombres très précis, mais pas les deux à la fois. La propriété Value2 se sertdu type de données monétaire, capable de gérer la précision et la plage de valeursnécessaires aux institutions financières.

Page 150: Excel 2007 VBA

130 Chapitre 4 Objets de plages

Si ces simples conditions sont respectées, vous pouvez créer une macro qui bâtitautomatiquement la formule adéquate et la place dans la plage appropriée.

1. Effectuez une copie de la feuille de calcul Revenue du classeur Chapitre04,avec la cellule A1 sélectionnée.

Copier la feuille de calcul va permettre de tester la macro en déplaçant lagrille et en modifiant sa taille.

2. Dans l’éditeur Visual Basic, entrez le squelette de macro suivant puisappuyez deux fois sur F8 pour atteindre l’instruction End Sub.

Sub RemplirFormules() Dim myOuter as Range Dim myInner as Range Dim myFormula as StringEnd Sub

La déclaration au début de variables va faciliter le travail avec des plages dif-férentes. La plage myOuter va faire référence à la totalité de la région activede la grille Revenue, en-têtes compris. La plage myInner correspondra auxcellules vides du milieu, qui nécessitent des formules. La chaîne myFormulava contenir la formule de façon à pouvoir la construire morceau par mor-ceau dans la macro.

3. Dans l’Explorateur d’objets, sélectionnez Range dans la liste Classes.Sélectionnez ensuite dans la liste des membres la méthode Find.

La description indique que cette propriété ne possède qu’un argument obli-gatoire (la chaîne que vous recherchez) et qu’elle renvoie une référence versune plage.

4. Dans la fenêtre Exécution, saisissez Set myOuter = Cells.Find("Price").CurrentRegion puis appuyez sur ENTRÉE. Lorsque vous pouvez confirmer

Page 151: Excel 2007 VBA

Saisie de valeurs et de formules dans une plage 131

que la plage est correcte à l’aide de myOuter.Select, copiez l’instructiondans la macro.

Voir aussi Les fonctions Intersect et Offset sont décrites dans la section « Référenceà une plage relative », plus tôt dans ce chapitre.

Pour la plage myInner, vous devez supprimer les deux lignes d’en-tête duhaut ainsi que la colonne d’en-têtes de gauche. Vous employez pour ce faireune combinaison des fonctions Intersect et Offset.

5. Dans la fenêtre Exécution, saisissez Set myInner = Intersect(myOu-ter,myOuter.Offset(2,1)) et appuyez sur ENTRÉE. Confirmez la plage cor-recte en saisissant myOuter.Select, puis copiez l’instruction dans la macro.

Pour la plage Discount, vous pouvez vous servir du libellé de la cellule supé-rieure pour définir le libellé de la cellule du bas. Cela crée un nom dans lafeuille de calcul, et non une variable Visual Basic. Vous affectez le nom àl’aide de la méthode CreateNames. Celle-ci possède quatre arguments : Top,Bottom, Left et Right. Ils identifient le côté de la plage qui contient les libel-lés qui doivent être employés comme noms. Le libellé Discount est situé au-dessus de la valeur de remise, si bien qu’il suffit de stipuler Top comme True.Puisque Top est le premier argument, vous pouvez simplement omettre lesautres.

6. Dans la fenêtre Exécution, saisissez Cells.Find("Discount").CurrentRe-gion.CreateNames True et appuyez sur ENTRÉE. Confirmez la plage cor-recte en saisissant Range("Discount").Select, puis copiez l’instruction dansla macro.

Page 152: Excel 2007 VBA

132 Chapitre 4 Objets de plages

Pour la première partie de la formule, il vous faut une référence vers la pre-mière cellule Price, actuellement la cellule C3. En pensant à myOuter commeà une feuille de calcul, vous voulez la cellule « B2 » de cette feuille de calculimaginaire, avec une adresse en notation L1C1, avec un numéro de ligneabsolu et un numéro de colonne relatif, du point de vue de la première cel-lule de formule. La méthode Address vous procure l’adresse d’une cellule,avec des arguments qui contrôlent son aspect. Visual Basic vous invite à sai-sir chaque argument.

7. Dans la fenêtre Exécution, saisissez myFormula = myOu-ter.Range("B2").Address(True,False,xlR1C1,False,myInner) et appuyezsur ENTRÉE. Déplacez le pointeur de la souris sur le mot myFormula pourvérifier que l’adresse est R3C, puis copiez l’instruction dans la macro.

8. Dans la fenêtre Exécution, saisissez myFormula = "=" & myFormula &"*". Déplacez le pointeur de la souris sur le mot myFormula pour vérifierque sa valeur est =R3C*, puis copiez l’instruction dans la macro.

Astuce Lorsque vous employez la méthode Range, Visual Basic affiche des astu-ces pour les méthodes et propriétés qui suivent. Il ne le fait pas pour la méthodeCells. Même si Range("B2") et Cells(2,2) sont fonctionnellement identiques,employer la méthode Range facilite la saisie de l’instruction. Si vous trouvez laméthode Cells plus facile à comprendre, vous pourrez effectuer la modificationaprès avoir correctement créé l’instruction.

Page 153: Excel 2007 VBA

Mise en forme d’une plage 133

9. Saisissez les trois instructions suivantes dans la macro, en les testant si vousle souhaitez d’abord individuellement dans la fenêtre Exécution.

myFormula = myFormula & _ myOuter.Range("A3").Address(False, True, xlR1C1, False, myInner)myFormula = myFormula & " * ( 1 - Discount ) "myInner.FormulaR1C1 = myFormula

Ces instructions ne proposent rien de fondamentalement nouveau. La pre-mière ajoute l’adresse de la quantité, avec une colonne relative et une ligneabsolue. La deuxième ajoute la partie Discount de la formule. Celle-ci n’a pasà être convertie en adresse car il s’agit déjà d’un nom de la feuille de calcul.La troisième instruction affecte la formule terminée à la plage intérieure.

10. Créez une nouvelle copie de la feuille de calcul Revenue et testez la macro.Créez ensuite une nouvelle copie, modifiez la taille et la position de la grille,puis testez à nouveau la macro.

Remplir des plages de taille variable de formules est une puissante technique.Vous pouvez employer les méthodes et propriétés de l’objet Range pour créer laformule et identifier la plage à remplir.

Mise en forme d’une plageLa mise en forme contribue fortement à l’employabilité d’une feuille de calcul. Desbordures et des couleurs d’arrière-plan peuvent faire ressortir les parties d’un état,tandis que des mises en forme conditionnelles peuvent mettre en évidence descas particuliers dans une plage. Les mises en forme de cellule peuvent être com-binées en styles de cellule pour faciliter le réemploi des mêmes combinaisons demise en forme.

Page 154: Excel 2007 VBA

134 Chapitre 4 Objets de plages

Ajout de bordures à une plageLes bordures aident à délimiter une région au sein d’un bloc de cellules. Il est par-fois souhaitable de placer des bordures autour de chaque cellule d’une plage.Dans d’autres situations, vous préférerez encadrer la totalité d’une plage de cellu-les. Vous pourriez souhaiter une bordure différente le log d’un des côtés d’uneplage. Un objet Range dispose de méthodes et de propriétés qui permettent decontrôler parfaitement le type de bordure souhaité.

1. Dans Excel, effectuez une copie de la feuille de calcul RevenueFormulas.Dans l’éditeur Visual Basic, copiez la macro TestRange, nommez la copieAjoutBordures, puis appuyez deux fois sur F8 pour initialiser la variablemyRange.

2. Dans la fenêtre Exécution, saisissez Set myRange = Range("B2").CurrentRegion et appuyez sur ENTRÉE pour affecter la plage qui renferme le calculdes recettes à la variable.

3. Dans la fenêtre Exécution, saisissez myRange.Borders.LineStyle =. Tandisque vous saisissez chaque point de l’instruction, une Auto List affiche lesmembres disponibles. Après avoir saisi le signe égal, aucune Auto Listn’apparaît. Vous pouvez toutefois employer l’Explorateur d’objets pour iden-tifier les options possibles.

4. Dans l’Explorateur d’objets, dans la zone de texte Rechercher située au-dessus de la liste Classes, saisissez LineStyle puis cliquez sur le boutonRechercher.

5. Dans le volet Résultats de la recherche qui apparaît, sélectionnez XlLine-Style dans la liste Class. La liste Membre affiche toutes les constantes quevous pouvez employer avec la propriété LineStyle.

Dépannage Si vous ne voyez pas de macro TestRange, reportez-vous aux deuxpremières étapes de la section « Référence à une plage relative » précédente de cechapitre.

Rechercher

Page 155: Excel 2007 VBA

Mise en forme d’une plage 135

XlLineStyle n’est pas réellement une classe, bien qu’elle apparaisse dans laliste des classes de l’Explorateur d’objets. Il n’existe rien de tel qu’un objetXlLineStyle. C’est en réalité une liste d’énumérations. Une liste d’énuméra-tions, ou tout simplement énumération, est employée lorsqu’une propriétéou un argument ne peut accepter que certaines valeurs. Elle permet au con-cepteur du modèle objet d’attribuer un nom spécial à chacune de cesvaleurs : par exemple, xlContinuous. Les énumérations figurent dans la listedes classes, mais avec une icône spéciale.

6. Dans la fenêtre Exécution, saisissez xlContinuous pour compléter l’instruc-tion, puis appuyez sur ENTRÉE.

Cela ajoute une bordure continue autour de chaque cellule de la plage.Lorsque vous affectez une valeur à la propriété LineStyle de l’objet Borders,la propriété modifie la bordure de chaque cellule de la plage.

7. Dans la fenêtre Exécution, saisissez myRange.Borders.LineStyle = xlNoneet appuyez sur ENTRÉE pour supprimer les bordures.

La valeur xlNone n’apparaît pas dans l’énumération de LineStyle : c’est uneconstante globale employée dans de nombreux objets Excel. Vous pouvez la

Page 156: Excel 2007 VBA

136 Chapitre 4 Objets de plages

rechercher dans l’Explorateur d’objets si vous voulez voir la liste complètedes constantes globales.

L’objet Borders est en réalité une collection, parmi laquelle vous pouvezsélectionner des bordures spécifiques. Vous modifiez généralement les bor-dures cellule par cellule, mais placer une bordure autour d’une plage est uneopération si fréquente qu’une méthode spéciale lui a été consacrée.

8. Dans la fenêtre Exécution, saisissez myRange.BorderAround Wei-ght:=xlThick et appuyez sur ENTRÉE.

Cela place une bordure épaisse autour de la plage. Comme Weight n’est pasle premier argument, vous devez saisir son nom si vous omettez LineStyle.Fixer la propriété Weight de la bordure à Thick implique une ligne continue.

Supposez que vous vouliez une bordure sur le côté droit des quantités. Pourspécifier une unique bordure, vous pouvez employer un nom énuméré encombinaison avec la collection Borders. Les Auto Lists peuvent vous aideravec la syntaxe, mais vous devez être un peu subtil.

9. Dans la fenêtre Exécution, saisissez myRange.Borders(xlEdgeRi-ght).LineStyle = xlContinuous, mais n’appuyez pas sur ENTRÉE. Juste aprèsmyRange, saisissez un point ( ), saisissez Columns(1), puis appuyez surENTRÉE.

Dès que vous employez la propriété Columns dans une instruction, vous nevoyez plus d’Auto Lists. En omettant temporairement la propriété Columns,vous obtenez des Auto Lists pour tout sauf pour le style de ligne. Après avoirobtenu la syntaxe correcte pour l’instruction, revenez en arrière et ajoutez lapropriété Columns.

Page 157: Excel 2007 VBA

Mise en forme d’une plage 137

10. Dans la fenêtre Exécution, saisissez myRange.Rows(2).Borders(xlEdge-Bottom).LineStyle = xlContinuous et appuyez sur ENTRÉE. Une bordureapparaît sous la ligne des prix.

11. Appuyez sur F5 pour arrêter la macro. Copiez les instructions depuis la fenê-tre Exécution dans la macro AjoutBordures, puis supprimez les deux instruc-tions qui ajoutent et suppriment toutes les bordures.

La macro achevée devrait ressembler à ceci :

Sub AjoutBordures() Dim myRange As Range Set myRange = Range("B2").CurrentRegion myRange.BorderAround Weight:=xlThick myRange.Columns(1).Borders(xlEdgeRight).LineStyle = xlContinuous myRange.Rows(2).Borders(xlEdgeBottom).LineStyle = xlContinuousEnd Sub

12. Créez une nouvelle copie de RevenueFormulas et testez la macro terminée.

Les bordures peuvent mettre en évidence des parties d’un état. La collection Bor-ders permet de modifier simultanément toutes les bordures ou de choisir le typeparticulier de bordure à modifier. La méthode BorderAround est un raccourci pra-tique pour affecter une bordure à tous les côtés d’une plage multicellules.

Mise en forme de l’intérieur d’une plagePour améliorer la lisibilité d’une feuille de calcul, vous pourriez souhaiter appli-quer différentes couleurs de fond à différentes parties. Par exemple, vous pourriezappliquer une mise en forme à toutes les cellules qui contiennent des valeurs quipeuvent être saisies par l’utilisateur et une mise en forme différente à toutes lescellules qui contiennent des formules.

Page 158: Excel 2007 VBA

138 Chapitre 4 Objets de plages

1. Dans Excel, créez une nouvelle copie de la feuille de calcul RevenueFormu-las. Dans l’éditeur Visual Basic, copiez la macro TestRange, nommez lacopie AjoutCouleurs, puis appuyez deux fois sur F8 pour initialiser la varia-ble myRange.

2. Dans la fenêtre Exécution, saisissez Set myRange = Range("B2").CurrentRegion et appuyez sur ENTRÉE pour affecter la plage qui contient les calculsdes recettes à la variable.

3. Dans la fenêtre Exécution, saisissez myRange.Interior.Color =.

Tandis que vous saisissez chaque point de l’instruction, une Auto List afficheles membres disponibles. Tel n’est toutefois pas le cas lorsque vous saisissezle signe égal : la propriété Color est dépourvue de liste énumérée. Vouspouvez entrer n’importe quel nombre compris entre 0 (qui correspond à dunoir) et 16777215 (qui correspond à du blanc), si bien qu’il existe plus de16 millions de valeurs possibles. C’est une amélioration sensible par rapportaux versions précédentes d’Excel, pour lesquelles la palette des couleurspossibles sur une feuille de calcul se limitait à 56 couleurs.

Les couleurs d’un écran d’ordinateur correspondent aux faisceaux rouge,vert et bleu d’un tube cathodique. Les écrans à cristaux liquides ont recoursà une technologie différente, mais avec les mêmes couleurs fondamentales.Visual Basic possède une fonction RGB qui permet de spécifier les compo-santes rouge, verte et bleue. Excel propose toutefois une façon plus simplepour spécifier la couleur souhaitée : une liste énumérée qui procure desnoms significatifs pour les 140 couleurs les plus fréquentes.

Voir aussi Excel 2007 a également recours à des thèmes colorés pour vous aider àemployer des ensembles prédéfinis de couleurs compatibles. Les thèmes de couleurssont décrits plus en détail dans la section « Ajout d’un fond dégradé à une cellule »du Chapitre 6, « Objets graphiques ».

4. Dans la fenêtre Exécution, saisissez rgbMediumVioletRed pour terminerl’instruction, puis appuyez sur ENTRÉE (après avoir saisi rgbM, appuyez surCTRL+BARRE D’ESPACE pour atteindre le milieu des valeurs des couleurs rgb).

La couleur d’arrière-plan de la totalité de la plage devient un rouge violacémoyen.

Dépannage Si vous ne possédez pas de macro TestRange, reportez-vous auxdeux premières étapes de la section « Référence à une plage relative » précédentede ce chapitre.

Page 159: Excel 2007 VBA

Mise en forme d’une plage 139

Puisque Excel peut désormais gérer des millions de couleurs, il dispose de lanouvelle capacité à spécifier l’intensité, c’est-à-dire la luminosité ou l’assom-brissement d’une couleur sans modifier la teinte de la couleur.

5. Dans la fenêtre Exécution, saisissez myRange.Interior.TintAndShade = -0.2 et appuyez sur ENTRÉE. La couleur est désormais une nuance plus sombrede rouge violacé.

Un objet Range dispose d’une méthode spéciale nommée SpecialCells quipermet d’isoler certaines cellules de la plage d’après divers attributs. Vouspouvez par exemple référencer toutes les cellules à formule de la plage.

6. Dans la fenêtre Exécution, saisissez myRange.SpecialCells(xlCellTypeFor-mulas).Interior.TintAndShade = 0.3 et appuyez sur ENTRÉE.

Le bloc des formules se modifie en adoptant une teinte plus claire de rougeviolacé. Les cellules de cette plage constituent un bloc contigu, mais Spe-cialCells peut tout aussi bien renvoyer une plage de cellules non contiguës.

Excel permet de nommer un ensemble de caractéristiques de mise enforme. Cela porte le nom de style de cellule. Un classeur dispose de plusieursstyles intégrés. L’un d’entre eux se nomme Entrée : vous pouvez l’employerpour mettre en forme les cellules qui peuvent accepter une saisie utilisateur.Ce sont généralement les cellules qui renferment des constantes numéri-ques.

Page 160: Excel 2007 VBA

140 Chapitre 4 Objets de plages

7. Dans la fenêtre Exécution, saisissez myRange.SpecialCells(xlCellType-Constants, xlNumbers).Style = "Entrée" et appuyez sur ENTRÉE.

Les cellules avec les prix et les quantités se modifient en un brun clair, avecdes bordures autour de chaque cellule. La constante xlNumbers n’apparaîtpas dans l’Auto List, mais vous pouvez obtenir cette liste depuis l’Explorateurd’objets en recherchant SpecialCells.

Vous pouvez modifier le format du style exactement comme vous modifiezdirectement la mise en forme d’une plage.

8. Entrez les deux instructions suivantes dans la fenêtre Exécution :

ActiveWorkbook.Styles("Entrée").Interior.Color = rgbMediumVioletRedActiveWorkbook.Styles("Entrée").Interior.TintAndShade = 0.5

Cela modifie le style Entrée de façon à lui donner une version plus claire durouge violacé des autres cellules. Lorsque vous appliquez un style aux cellu-les susceptibles de recevoir des valeurs d’entrée, vous pourriez souhaiterrechercher les constantes numériques dans la totalité de la feuille de calcul.Pour ce faire, vous commencez avec la propriété globale Cells.

9. Dans la fenêtre Exécution, saisissez Cells.SpecialCells(xlCellTypeCons-tants, xlNumbers).Style = "Entrée" et appuyez sur ENTRÉE.

Cela affecte le style Entrée à la cellule de la valeur Discount. Si la feuille decalcul comportait des centaines de cellules d’entrée disséminées çà et là,cette instruction les identifierait toutes. Les libellés texte de la plage Reve-nue sont devenus difficiles à lire, avec un texte noir sur un fond sombre.Vous pouvez vous servir de SpecialCells pour isoler toutes les cellules quirenferment des constantes texte.

10. Dans la fenêtre Exécution, saisissez myRange.SpecialCells(xlCellType-Constants, xlTextValues).Font.Color = rgbWhite et appuyez sur ENTRÉE.

Cela modifie la couleur de la police des libellés. À la réflexion, ils seraientencore mieux en gras. D’ailleurs, toutes les constantes de la plage de formu-les gagneraient à être en gras.

Page 161: Excel 2007 VBA

Mise en forme d’une plage 141

11. Dans la fenêtre Exécution, saisissez myRange.SpecialCells(xlCellType-Constants).Font.Bold = True et appuyez sur ENTRÉE. Cela met en gras tou-tes les constantes de la plage myRange. En omettant le second argument deSpecialCells, vous obtenez tout ce qui correspond au type général. Vouspouvez également recourir à un style spécial pour annuler toute la mise enforme.

12. Dans la fenêtre Exécution, saisissez Cells.Style = "Normal" et appuyez surEntrée. Cela supprime toutes les mises en forme, y compris celles des nom-bres. Lorsque vous éliminez les formats d’une feuille de calcul, vous appli-quez en réalité le style Normal à toutes les cellules. Vous pouvez enmodifiant le style Normal changer l’apparence par défaut des cellules d’unclasseur.

13. Appuyez sur F5 pour arrêter la macro. Copiez les instructions de la fenêtreExécution dans la macro AjoutCouleurs et supprimez l’instruction qui sup-prime toutes les mises en forme. La macro finale, en ignorant les sauts deligne facultatifs, devrait ressembler à ceci :

Sub AjoutCouleurs() Dim myRange As Range Set myRange = Range("B2").CurrentRegion myRange.Interior.Color = rgbMediumVioletRed myRange.Interior.TintAndShade = -0.2 myRange.SpecialCells(xlCellTypeFormulas). _ Interior.TintAndShade = 0.3 myRange.SpecialCells(xlCellTypeConstants, xlNumbers). _ Style = "Entrée" ActiveWorkbook.Styles("Entrée").Interior _ .Color = rgbMediumVioletRed

Page 162: Excel 2007 VBA

142 Chapitre 4 Objets de plages

ActiveWorkbook.Styles("Entrée").Interior _ .TintAndShade = 0.5 Cells.SpecialCells(xlCellTypeConstants, xlNumbers) _ .Style = "Entrée" myRange.SpecialCells(xlCellTypeConstants, xlTextValues) _ .Font.Color = rgbWhite myRange.SpecialCells(xlCellTypeConstants).Font.Bold = TrueEnd Sub

14. Créez une nouvelle copie de RevenueFormulas et testez la macro achevée.

Les objets Range sont des objets puissants. Ils constituent l’essence d’Excel. Lesplages permettent d’organiser les informations, de créer des formules et d’appli-quer des mises en forme. Vous pouvez en sus accomplir tout cela sous le contrôlede macros VBA.

Points clés● Servez-vous de l’Explorateur d’objets pour identifier les membres (métho-

des et propriétés) disponibles pour un objet, ainsi que ce que renvoie cha-que méthode ou propriété.

● Évitez de modifier la sélection pendant vos macros. Une macro s’exécuteplus rapidement et semble plus professionnelle si vous n’avez pas à redessi-ner l’écran.

● Au cours du débogage, servez-vous de la fenêtre Exécution pour tester laréférence actuelle d’un objet plage.

● De nombreuses fonctions relatives aux plages partent d’une plage et ren-voient une autre plage. Ces fonctions sont précieuses pour naviguer d’uneplage à une autre. La plus importante de ces fonctions est CurrentRegion.

● Servez-vous toujours de références L1C1 lorsque vous construisez des for-mules à partir de macros. Tirez profit des nombreuses options (relative,absolue, interne, externe) que vous propose la propriété Address.

● Servez-vous de la collection Borders pour contrôler simultanément les bor-dures de chaque cellule d’une plage. Employez la méthode BorderAroundpour traiter une plage comme une unique entité.

● Servez-vous de la fonction RGB ou de l’énumération des constantes RGBpour sélectionner une couleur. Pour créer des dégradés harmonieux desteintes et luminosités d’une couleur, tirez profit de la propriété TintAndShade.

FERMEZ le classeur Chapitre04.xlsm.

Page 163: Excel 2007 VBA
Page 164: Excel 2007 VBA

Application d’un filtre à un tableau, page 159

Ajout de formules structurées à un tableau, page 159

Ajout de formules de totaux, page 159

Navigation entre projets de différents classeurs, page 150

Création d’un tableau (une liste d’objet) à partir d’une source interne

de données, page 149

Personnalisation des formats de Style pour

un tableau croisé dynamique, page 177

Regroupement de dates dans un tableau croisé dynamique, page 171

Emploi d’une source externe de données pour un tableau,

page 151,et pour un tableau

croisé dynamique, page 165

Coup d’œil sur le chapitre

Page 165: Excel 2007 VBA

145

5 Objets de donnéesCe chapitre aborde les points suivants :

✔ Récupération de données depuis des listes Excel et des sources de données externes ;

✔ Création et mise en forme d’un objet tableau ;✔ Création et mise en forme d’un objet tableau croisé dynamique ;✔ Emploi de l’enregistreur de macro pour en apprendre plus sur les objets

Excel.

Le 29 mai 1913, au Théâtre des Champs-Élysées à Paris, une scène de chaos totals’est produite. C’était la première représentation du ballet d’Igor Stravinsky, « Lesacre du printemps ».

La musique de Stravinsky et la chorégraphie de Nijinsky étaient d’une telle origi-nalité que le public a été incapable de les comprendre. « Le sacre du printemps »est joué de nos jours sans soulever d’émotion particulière, mais Igor Stravinskyreste encore considéré comme un des compositeurs les plus innovants. Il a toute-fois reconnu avoir été influencé par d’autres musiciens.

Il a déclaré en une occasion « Les artistes médiocres empruntent, les grands artis-tes volent ». Le terme volent était bien sûr employé dans un but dramatique, maisl’idée est que lorsque vous empruntez, l’élément appartient toujours à son pro-priétaire légitime tandis que lorsque vous le volez, il devient votre propriété.

Certains considèrent l’enregistreur de macro comme un outil destiné aux débu-tants, et tel est bien le cas. Vous pouvez employer l’enregistreur de macro pourconstruire des macros fonctionnelles sans comprendre grand chose au fonction-nement réel des objets Microsoft Office Excel 2007. L’enregistreur de macro esttoutefois également un puissant outil de référence pour les développeurs avan-cés. Le secret consiste à savoir si vous allez emprunter son travail, en le laissantglobalement en l’état, ou le voler en vous l’appropriant totalement.

Vous allez voir dans ce chapitre comment il est possible d’employer l’enregistreurde macro comme outil de référence pour apprendre à travailler avec des objetsExcel. Vous allez enregistrer des actions, mais, lorsqu’il sera temps d’écrire lesmacros, vous n’allez pas modifier les macros enregistrées. Vous allez à la place

Page 166: Excel 2007 VBA

146 Chapitre 5 Objets de données

créer vos propres macros pour tirer le profit maximum des variables, propriétés etméthodes des objets non employées par l’enregistreur. En d’autres termes, vousallez apprendre à voler.

Travail avec les tableaux ExcelFondamentalement, un tableau Excel est une liste. C’est toutefois une liste puis-sante, qui permet les tris, les filtres, les calculs et les totaux. Les données d’untableau Excel proviennent normalement de deux sources possibles : vous les récu-pérez d’une feuille de calcul existante ou vous employez une connexion quelcon-que pour les obtenir d’une source externe. Vous pouvez penser à ces deuxméthodes comme à des sources de données internes et externes.

Vous allez créer dans cette section des macros pour importer des données dansun tableau Excel depuis une feuille de calcul Excel et depuis une base de donnéesAccess. Cela va vous permettre de voir la différence entre une source interne etexterne. Vous apprendrez ensuite à employer des macros pour effectuer desmanipulations fondamentales sur un tableau.

Création d’un nouveau fichier à partir d’une feuille de calcul existanteLe but de la première macro consiste à créer une copie de la feuille de calculOrders du fichier Orders.xlsx vers un nouveau fichier non enregistré. Excel ne per-met pas de déplacer directement une unique feuille de calcul visible d’un fichierdans un nouveau fichier. Vous pouvez contourner cette restriction en déplaçant

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

SERVEZ-VOUS du classeur Orders.xlsx comme source interne et de la base de don-nées Orders.accdb comme source externe. Ces fichiers d’exercice se trouvent dansle dossier Documents\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer un nouveau classeur vierge prenant en charge les macros etnommé Chapitre05.xlsm dans le dossier approuvé créé au Chapitre 1.OUVREZ le classeur Chapitre05.xlsm. Sélectionnez ensuite la plage A1:F5, et appli-quez aux cellules un fond rouge. Vous allez créer et fermez plusieurs classeurs aucours de ce chapitre : les cellules rouges vont vous permettre de vous souvenir dequel classeur contient les macros, de façon à ne pas le fermer accidentellement etperdre votre travail.

Page 167: Excel 2007 VBA

Travail avec les tableaux Excel 147

d’abord la feuille de calcul dans le classeur Chapitre05, puis en la déplaçant de cetemplacement dans un nouveau fichier. Vous allez d’abord employer l’enregistreurde macro pour créer la macro et apprendre les méthodes et propriétés adéquates.Vous emploierez ensuite les indices des macros enregistrées pour créer votre pro-pre macro, en obtenant lorsque possible une aide complémentaire du dispositifAuto Lists tandis que vous saisissez chaque instruction. Vous allez ajouter la lettrez comme préfixe devant le nom de chaque macro enregistrée, de façon à bien lesdistinguer des macros que vous allez créer.

1. Commencez à enregistrer une macro avec comme nom zOuvreFichierOr-ders.

2. Cliquez sur le Bouton Microsoft Office puis cliquez sur Ouvrir. Naviguezjusqu’au dossier qui renferme les fichiers d’exercice du livre, sélectionnezOrders.xlsx, puis cliquez sur Ouvrir.

3. Effectuez un clic droit sur l’onglet Orders, cliquez sur Déplacer ou copier,sélectionnez Chapter05.xlsm dans la liste Dans le classeur, puis cliquez surOK.

4. Dans le classeur Chapitre05, effectuez un clic droit sur l’onglet Orders, cli-quez sur Déplacer ou copier, sélectionnez (nouveau classeur) dans la listeDans le classeur, puis cliquez sur OK. Arrêtez alors l’enregistreur.

5. Dans l’onglet Affichage du ruban, cliquez sur le bouton Macros, sélection-nez la macro Chapitre05.xlsm!zOuvreFichierOrders, puis cliquez surModifier pour l’examiner.

Bouton Microsoft Office

Important Les exercices de ce chapitre emploient des blocs de code grisés pouridentifier les lignes qui proviennent de macros enregistrées. Cela vous permetd’examiner les lignes enregistrées tandis que vous créez la macro de remplace-ment, sans confondre les deux. Les macros enregistrées complètes, ainsi que leursversions réécrites, figurent dans le fichier Chapitre05.xlsm du dossier Finis desfichiers d’accompagnements.

Page 168: Excel 2007 VBA

148 Chapitre 5 Objets de données

ChDir "C:\MSP\ExcelVBA07SBS"Workbooks.Open Filename:= " C:\MSP\ExcelVBA07SBS\Orders.xlsx"

L’instruction ChDir ne figure dans la macro que si vous avez dû changer dedossier. Elle est redondante de toute façon, puisque l’argument Filenamerenferme le chemin complet. Le problème avec l’inclusion d’un chemind’accès complet est que si vous déplacez le projet vers un nouvel emplace-ment le chemin devient erroné. Tout classeur possède une propriété Pathqui donne le chemin d’accès actuel complet pour ce classeur. En plaçant lapropriété Path avant le nom du fichier, votre macro fonctionne même sivous déplacez tout vers une nouvelle destination.

Parfois, le classeur actif n’est pas celui qui contient les macros : la propriétéspéciale ThisWorkbook renvoie le classeur de macro. De ce fait, l’expressionThisWorkbook.Path renvoie le chemin d’accès complet au dossier qui con-tient le classeur de macro, quel que soit le répertoire actif actuel ou le clas-seur actif. Comme le fichier de données se trouve un dossier au-dessus decelui du classeur de macro, vous devez insérer une barre oblique inversée,deux points puis une autre barre oblique inversée (\..\) avant le nom dufichier.

6. Dans la fenêtre Exécution, saisissez Workbooks.Open ThisWork-book.Path & "\..\Orders.xlsx" puis appuyez sur ENTRÉE.

Cela ouvre le classeur Orders. Cette instruction fonctionne si le fichier de lamacro se trouve dans un sous-dossier du dossier de données, quel que soitle dossier actuel ou l’emplacement actuel dans la structure de fichiers.

Sheets("Orders").Move Before:=Workbooks("Chapitre05.xlsm").Sheets(1)

7. Dans la fenêtre Exécution, saisissez ActiveSheet.Move ThisWork-book.Sheets(1) et appuyez sur ENTRÉE.

La feuille active est déplacée vers le classeur de macro. Peu importe si elleest placée avant ou après la première feuille, car vous allez la déplacer ànouveau.

Sheets("Orders").Move

8. Dans la fenêtre Exécution, saisissez ActiveSheet.Move et appuyez surENTRÉE pour déplacer la feuille Orders dans son propre classeur.

9. Dans un module Visual Basic, créez une nouvelle macro nommée OuvreFi-chierOrders. Insérez les trois instructions de la fenêtre Exécution dans lamacro. Testez ensuite la macro en appuyant sur F5 ou sur F8.

Cette macro procure un simple fichier de données qui peut être employé commesource interne, sans risque d’endommager votre classeur Orders.xlsx original. Ce

Page 169: Excel 2007 VBA

Travail avec les tableaux Excel 149

fichier n’est pas enregistré : vous pouvez librement l’éliminer, ce qui est particuliè-rement utile au cours de la création et du test d’une macro. Vous avez employél’enregistreur de macro pour apprendre des indices importants sur la syntaxe,mais avez ensuite créé votre propre macro.

Création d’un tableau à partir d’une source interneDisposant désormais d’une feuille de calcul qui contient une liste de données,vous pouvez convertir celle-ci en un tableau. Le processus est très simple, maisvous pouvez encore généraliser et apurer la macro enregistrée. Vous pourrezensuite comparer ce processus à celui de la création d’un tableau à partir d’unesource externe. Lorsque vous enregistrez la macro, celle-ci est stockée dans lenouveau classeur. Si vous voulez la conserver, veillez à la copier dans le module duclasseur Chapitre05 avant de fermer le fichier.

1. Commencez avec un classeur qui contient la feuille Orders. Exécutez sinécessaire la macro OuvreFichierOrders.

2. Commencez à enregistrer une macro nommée zTableDepuisInterne.

3. Dans l’onglet Insertion du ruban, cliquez sur Tableau. Dans la boîte de dia-logue Créer un tableau, conservez les options par défaut et cliquez sur OK.

Cela convertit la liste en un tableau Excel, comme vous pouvez le dired’après les flèches qui figurent à côté de chaque en-tête de colonne.

4. Arrêtez l’enregistreur et affichez la macro pour pouvoir l’employer commeréférence lors de la création de votre propre macro.

La macro que vous venez d’enregistrer se trouve dans le nouveau classeur,qui contient la feuille Order. Lorsque vous allez fermer ce classeur tempo-raire, la macro enregistrée sera perdue. Puisqu’il s’agit d’une macro tempo-raire, cela est sans importance. Lorsque toutefois vous allez créer votremacro permanente, veillez à la stocker dans le classeur permanentChapitre05. Visual Basic propose un outil pour vous aider à naviguer entredes macros stockées dans différents classeurs.

5. Dans le menu Affichage de Visual Basic, cliquez sur Explorateur de pro-jets.

L’Explorateur de projets montre que le module actif est stocké dans un clas-seur temporaire. Vous pouvez toutefois également voir la feuille de macroModule1 du classeur Chapitre05.

Page 170: Excel 2007 VBA

150 Chapitre 5 Objets de données

6. Dans l’Explorateur de projets, double-cliquez sur Module1 du classeurChapitre05. Ensuite, dans la fenêtre Exécution, saisissez OuvreFichierOr-ders et appuyez sur ENTRÉE pour créer un nouveau fichier source.

7. Créez une nouvelle macro qui ressemble à ce qui suit, puis appuyez deuxfois sur F8 pour initialiser la variable, de façon à pouvoir obtenir l’aide AutoList avec les propriétés de ActiveSheet.

Sub TableDepuisInterne() Dim mySheet As Worksheet Set mySheet = ActiveSheetEnd Sub

Ensuite, en vous guidant d’après la macro enregistrée, commencez à écrire lanouvelle macro.

ActiveSheet.ListObjects.Add(xlSrcRange, _Range("$A$1:$G$3266"), , xlYes).Name = "Tableau1"

8. Dans la fenêtre Exécution, saisissez mySheet.ListObjects.Add( puis exami-nez la liste des arguments.

Tous les arguments sont facultatifs. La valeur par défaut du premier argu-ment est xlSourceRange : ce qu’a inséré l’enregistreur. En pratique, toutes lesvaleurs par défaut des arguments sont adaptées.

9. Supprimez la parenthèse ouvrante. Renommez mySheet en ActiveSheet.

L’instruction ActiveSheet.ListObjects.Add est tout ce qui est nécessaire danscette macro.

10. Appuyez sur F5 pour arrêter la macro. Supprimez ensuite le corps actuel dela macro et copiez-le dans l’instruction Add de la fenêtre Exécution.

Page 171: Excel 2007 VBA

Travail avec les tableaux Excel 151

11. Exécutez la macro OuvreFichierOrders, puis testez la macro TableDepuisI-nterne en appuyant sur F5 ou F8.

Cette macro montre essentiellement comme il est simple de créer un tableau àpartir d’une liste Excel. La partie la plus délicate consistait à placer la liste dans unfichier distinct (la macro OuvreFichierOrders). Vous allez par la suite créer desmacros pour manipuler cette liste simple. Commencez toutefois par créer uneversion du même tableau à partir d’une connexion à des données externes.

Création d’un tableau à partir d’une source externeLes listes de données Excel sont des sources de tableaux très pratiques. Elles sonttoutefois limitées à un million de lignes et ne peuvent récupérer des donnéesdepuis des bases de données partagées. Vous allez dans cette section employerMicrosoft Office Access comme connexion de données externes, mais les mêmestechniques fonctionnent avec des modifications mineures pour une base de don-nées Microsoft SQL Server ou toute autre source de données prise en charge.

1. Commencez l’enregistrement d’une nouvelle macro nommée zTableDepui-sExterne.

2. Appuyez sur CTRL+N pour créer un nouveau classeur. Sur l’onglet Donnéesdu ruban, cliquez sur le bouton A partir du fichier Access. Naviguezjusqu’au dossier qui contient les fichiers d’accompagnement de ce livre,sélectionnez Orders.accdb, puis cliquez sur Ouvrir. Dans la boîte de dialo-gue Importation de données, conservez les options par défaut et cliquezsur OK. Arrêtez ensuite l’enregistreur.

3. Affichez la macro zTableDepuisExterne.

Celle-ci semble bien complexe, mais cette complexité provient essentielle-ment de la chaîne de connexion, qu’il est possible de grandement simplifier.L’autre partie qui rend imposante la macro est la structure With qui encadretout. Voici ce qui se passe : La méthode Add renvoie une instance du ListOb-ject qu’elle a créée. Cela n’a rien d’exceptionnel : la méthode Add de la plu-part des collections renvoie la nouvelle instance qu’elles ont créée.L’enregistreur emploie ensuite cette référence pour accéder à la propriétéQueryTable du ListObject. L’objet QueryTable contient le lien aux donnéesexternes du ListObject. Comme toutefois l’objet QueryTable possède plu-sieurs propriétés et une méthode, l’enregistreur le place dans une structureWith. L’instruction With englobe la totalité de la méthode Add. Il y a beau-coup à faire dans cette unique structure. En ajoutant des variables pour lesobjets ListObject et QueryTable, vous pouvez séparer l’ensemble en tron-çons distincts plus facilement gérables.

Page 172: Excel 2007 VBA

152 Chapitre 5 Objets de données

4. Videz la fenêtre Exécution, créez un squelette de macro similaire à ce quisuit, puis appuyez deux fois sur F8 pour avancer jusqu’à l’instruction EndSub et initialiser les variables.

Sub TableDepuisExterne() Dim l As ListObject Dim q as QueryTable Dim s as StringEnd Sub

Workbooks.Add

5. Dans la fenêtre Exécution, saisissez Workbooks.Add et appuyez sur ENTRÉE.

Une nouvelle feuille de calcul vierge apparaît dans Excel.

With ActiveSheet.ListObjects.Add( _ SourceType:=0, _ Source:=Array( _ "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;", _ "Data Source=C:\MSP\ExcelVBA07SBS\Orders.accdb;", _

La valeur Source de la méthode Add semble très compliquée. Pour unesource de données externe, cette chaîne peut être très longue, si bien que laméthode Add permet sa division en sous-chaînes à l’aide de la fonctionArray. La méthode Add concatène ensuite tous les morceaux de la fonctionArray. L’enregistreur coupe arbitrairement la chaîne environ tous les 128caractères. La chaîne Source contient essentiellement des valeurs pardéfaut : les seules parties indispensables sont le type de données source, lefournisseur de données (Provider) et la source de données (Data Source). Sila totalité de la chaîne possède moins de 128 caractères, la fonction Arrayest totalement superflue.

6. Saisissez (sur une seule ligne) s = ThisWorkbook.Path & "\..\Orders.accdb" puis appuyez sur ENTRÉE. Placez ensuite le pointeur de la souris sur lavariable s pour confirmer que le chemin d’accès complet au fichier de basede données est correct. Par exemple, si les fichiers d’exercices se trouventdans le dossier C:\Practice Files, la chaîne doit être C:\PracticeFiles\New\..\Orders.accdb.

Astuce Mieux vaut généralement donner aux variables des noms descriptifs. Lors-que toutefois vous développez une macro, des noms courts sont parfois suffisants.Vous pouvez employer des noms courts pendant la création de la macro, puis lesconvertir par la suite en noms plus descriptifs à l’aide de la commande Remplacerdu menu Edition. Veuillez à bien sélectionner les options Procédure en cours, Motentier et Respecter la casse pour l’opération de remplacement.

Page 173: Excel 2007 VBA

Travail avec les tableaux Excel 153

7. Saisissez (sur une seule ligne) s = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;DataSource=" & s et appuyez sur ENTRÉE. Cette chaîne esttrop longue pour s’afficher dans une info bulle : saisissez ?s et appuyez surENTRÉE pour voir la chaîne dans la fenêtre Exécution. Supprimez ensuite lesdeux chaînes employées pour cette vérification.

8. Saisissez (sur une seule ligne) Set l = ActiveSheet.ListObjects.Add(xlSrcExternal, s, , xlYes, ActiveCell) et appuyez sur ENTRÉE.

Ces quelques lignes remplacent la très longue instruction de la macro enre-gistrée. L’acte suivant accompli par la macro dans cette longue instructionest d’affecter la connexion à l’objet liste.

Destination:=Range("$A$1")).QueryTable .CommandType = xlCmdTable .CommandText = Array("Orders") … .Refresh BackgroundQuery:=FalseEnd With

La plupart des réglages des propriétés de l’objet QueryTable sont égalementfacultatifs. Les seules propriétés critiques sont CommandType et Command-Text. Même l’argument de la méthode Refresh est celui par défaut.

9. Saisissez les quatre instructions suivantes dans la fenêtre Exécution, enappuyant après chacune sur ENTRÉE.

Set q = l.QueryTableq.CommandType = xlCmdTableq.CommandText = "Orders"q.Refresh

L’affectation de l’objet QueryTable à une variable remplace la structure Withde la macro enregistrée. Après avoir exécuté la méthode Refresh, la feuillede calcul se peuple de données.

10. Appuyez sur F5 pour arrêter la macro en cours d’exécution, puis copiez lesinstructions de la fenêtre Exécution dans la macro TableDepuisExterne.Testez ensuite la macro TableDepuisExterne en appuyant sur F5 ou F8.

Page 174: Excel 2007 VBA

154 Chapitre 5 Objets de données

De façon surprenante, cette nouvelle et courte macro possède toutes les fonc-tionnalités de celle créée par l’enregistreur. Lors du travail avec des sources dedonnées externes, l’enregistreur crée des macros avec d’énormes chaînes et denombreuses propriétés. Si vous créez une application sophistiquée qui travailleavec une énorme et complexe base de données d’entreprise distante et haute-ment sécurisée, ces options sont plus que précieuses. Lorsqu’en revanche vouscréez des macros simples pour accéder à une base de données locale, vous pou-vez éliminer la plus grande partie de la complexité.

Vous pourriez remarquer que, lors de la création initiale du tableau, la colonneDate était mise en forme comme dates. Après l’exécution de la macro (la nouvelleou la version enregistrée), les dates ne sont plus mises en forme. Excel accomplitune étape supplémentaire qui n’est pas comprise dans la macro. Vous apprendrezplus loin à faire référence à des parties du tableau, de façon à facilement ajouterune mise en forme à la colonne Date.

Enregistrement d’une macro pour manipuler un tableauUn tableau figure sur une feuille de calcul. Il partage donc de nombreuses pro-priétés avec une plage, mais possède également des comportements qui lui sontpropres. Par exemple, la façon de faire référence à des régions d’un tableau estpropre aux tableaux, de même que la façon de créer des formules qui font réfé-rence à d’autres cellules du tableau. Les tableaux permettent également l’ajout detotaux structurés. Vous pouvez en outre filtrer un tableau d’après les valeurs descolonnes. L’enregistrement d’une macro peut vous aider à apprendre à manipulerun tableau. Si toutefois vous appliquez vos connaissances sur les objets collectionclassiques (et effectuez quelques essais) vous pourrez grandement simplifier etaméliorer une macro qui manipule un tableau.

1. Exécutez les macros OuvreFichierOrders et TableDepuisInterne pour dis-poser d’un tableau simple frais. Commencez ensuite l’enregistrement d’unemacro nommée zManipulerTable.

Parmi ce qu’il est possible de faire avec un tableau figure l’insertion d’unenouvelle colonne en son milieu. Par exemple, supposez que vous vouliezinsérer une colonne nommée Year qui ne contient que l’année de la date decommande. Cette nouvelle colonne devrait idéalement être placée à côtéde la colonne Date.

2. Effectuez un clic droit sur la cellule B1, pointez vers Insérer, puis cliquez surInsérer des colonnes de tableau à gauche. Dans la cellule B1, remplacezColonne1 par Year.

Page 175: Excel 2007 VBA

Travail avec les tableaux Excel 155

3. Dans la cellule B2, saisissez =Année(, cliquez sur la cellule A2, saisissez ),puis appuyez sur ENTRÉE pour remplir la colonne avec les années.

4. Déplacez la souris au-dessus de l’étiquette Year. Lorsque le pointeur setransforme en flèche noire pointant vers le bas, cliquez pour sélectionner lescellules du corps de la colonne. Effectuez un clic droit sur la cellule B2 puiscliquez sur Format de cellule. Dans l’onglet Nombre, sélectionnez Nom-bre sans décimale ni séparateur de milliers, puis cliquez sur OK. Appuyez surCTRL+A pour sélectionner la totalité du tableau.

Cette instruction enregistrée va servir de marqueur dans la macro finale.

5. Dans la cellule I1 ( juste à droite des en-têtes de colonne), saisissez Avg Priceet appuyez sur ENTRÉE.

Dans la nouvelle colonne Avg Price, il vous faut une formule qui divise lacolonne Net par la colonne Units. En pointant simplement sur les cellulespour créer la formule, vous obtenez la formule =Table_ExternalData_1[[#This Row],[Net]]/Table_ExternalData_1[[#This Row],[Units]]. Laseule partie capitale de cette formule est =[Net]/[Units]. Tandis que vous sai-sissez la version abrégée de la formule dans la cellule, remarquez que Excelvous aide pour le nom des colonnes. Comme avec le dispositif Auto Lists deVisual Basic, vous pouvez sélectionner un nom de colonne et appuyer surTAB pour insérer ce nom dans la formule.

6. Dans la cellule I2, saisissez =[Net]/[Units] et appuyez sur ENTRÉE.

7. Placez le pointeur de la souris sur le libellé Avg Price jusqu’à ce qu’il setransforme en une flèche noire pointant vers le bas, puis cliquez pour sélec-tionner les cellules du corps de la colonne. Effectuez un clic droit surn’importe quelle cellule de la colonne, puis cliquez sur Format de cellule.Sur l’onglet Nombre, sélectionnez Monétaire, puis cliquez sur OK. Appuyezsur CTRL+A pour sélectionner la totalité du tableau et insérer un marqueurdans la macro.

Page 176: Excel 2007 VBA

156 Chapitre 5 Objets de données

8. Dans l’onglet Options de style de tableau du ruban, cliquez sur la case àcocher Ligne des totaux.

9. Cliquez sur la cellule Total située en bas de la colonne Units, cliquez sur laflèche, puis sélectionnez Somme. Recommencez pour la colonne Net.

10. Dans la cellule Total de la colonne Avg Price, saisissez un signe égal, cliquezsur la cellule de total de Net, saisissez un signe de division ( ), cliquez surla cellule de total de Units, puis appuyez sur ENTRÉE. Appuyez sur CTRL+Apour sélectionner la région active. Cela insère un marqueur dans la macropour pouvoir facilement en différencier les différentes parties.

11. Cliquez sur la flèche de la cellule d’en-tête Avg Price, pointez vers Filtresnumériques, puis cliquez sur Les 10 meilleurs. Sélectionnez Bas dans lapremière liste, puis cliquez sur OK. Cela sélectionne les dix lignes qui possè-dent les prix moyens les plus faibles.

12. Sélectionnez la cellule d’en-tête Avg Price. Ensuite, dans l’onglet Accueil duruban, cliquez sur Trier et filtrer, puis cliquez sur Effacer.

13. Arrêtez l’enregistreur et affichez la macro enregistrée.

Chaque fois que vous voyez une instruction Range("Tableau1").Selectionsuivie d’une instruction d’activation d’une cellule, supprimez ces deux ins-tructions pour les remplacer par une ligne vierge. Ces sauts de ligne vousaideront de repérer les sections principales de la macro enregistrée.

Astuce La macro enregistrée complète figure dans le classeur de macrosChapitre05 du dossier Finis.

Page 177: Excel 2007 VBA

Travail avec les tableaux Excel 157

Vous êtes maintenant prêt à convertir la macro enregistrée en quelque chose deplus élégant. Vous pouvez vous servir des indices de la macro enregistrée, mais nevous limitez pas aux méthodes et propriétés qui y figurent.

Manipulation des colonnes d’un tableauVous êtes déjà familier avec l’objet ListObject pour un tableau. Affecter un tableauà une variable va simplifier les instructions et vous procurer une aide Auto List. Lamacro enregistrée manipule également fréquemment des colonnes du tableau.Vous pouvez également employer un objet ListColumn.

1. Dans l’Explorateur de projets Visual Basic, double-cliquez sur Module1dans le classeur Chapitre05 s’il n’est pas déjà actif. Exécutez ensuite lesmacros OuvreFichierOrders et TableDepuisInterne. Créez le squeletted’une macro qui ressemble à ce qui suit, puis appuyez trois fois sur F8 pourinitialiser les variables :

Sub ManipulerTable() Dim l as ListObject Dim lc as ListColumn Set l = ActiveCell.ListObjectEnd Sub

Vous êtes maintenant prêt à commencer à entrer les instructions du corpsde la macro.

Selection.ListObject.ListColumns.Add Position:=2

2. Dans la fenêtre Exécution, saisissez Set lc = l.ListColumns.Add(2) etappuyez sur ENTRÉE.

L’enregistreur se sert de la collection ListColumns pour créer une nouvellecolonne, mais ne stocke pas le nouvel objet ListColumn dans une variable.En stockant l’objet créé dans une variable, vous pouvez tirer parti de l’aideAuto List.

ActiveCell.FormulaR1C1 = "Year"

3. Saisissez lc.Name = "Year" et appuyez sur ENTRÉE.

L’enregistreur de macro place simplement le libellé dans la cellule active. Enemployant une propriété de l’objet ListColumn, vous n’avez pas à vousinquiéter de l’endroit où se trouve la cellule active lors de l’exécution de lamacro.

ActiveCell.FormulaR1C1 = "=ANNEE(Tableau1[[#This Row],[Date]])"

4. Saisissez lc.DataBodyRange="=Année([Date])" et appuyez sur ENTRÉE.

Page 178: Excel 2007 VBA

158 Chapitre 5 Objets de données

L’enregistreur place une référence parfaitement structurée dans la formule.Si la cellule qui contient la formule est sur la même ligne du même tableau,l’identifiant de la colonne est la seule chose réellement nécessaire. Remar-quez qu’un tableau se sert de crochets pour identifier les régions nomméesau sein du tableau. Cela permet d’éviter toute confusion avec les plagesnommées Excel.

Range("Tableau1[Year]").SelectSelection.NumberFormat = "0"

5. Saisissez lc.DataBodyRange.NumberFormat = "0" et appuyez sur ENTRÉE.

L’enregistreur emploie une expression chaîne pour référencer la colonneYear. Si toutefois vous créez un tableau avec un nom différent, la macroenregistrée ne fonctionne plus. En employant le dispositif Auto List pourexaminer les méthodes et propriétés disponibles pour un objet ListColumn,vous découvrirez DataBodyRange : une façon bien plus robuste pour accé-der à la même plage.

ActiveCell.FormulaR1C1 = "Avg Price"

6. Saisissez Set lc = l.ListColumns.Add et appuyez sur ENTRÉE.

Cela affecte un autre objet ListColumn à la même variable objet, remplaçantl’ancien. L’enregistreur crée une nouvelle colonne et place un libellé à côtédu tableau. Vous ne voulez toutefois pas que votre macro dépende d’adres-ses de cellules spécifiques. Vous avez déjà vu qu’il était possible d’employerla méthode Add de la collection ListColumns pour insérer une colonne. Enemployant l’aide Auto List tandis que vous saisissez l’instruction, vous pou-vez voir que l’argument Position de la méthode Add est facultatif. L’omettreajoute une nouvelle colonne à droite du tableau. Cette approche est facile àlire et peut être employée plusieurs fois pour ajouter plusieurs colonnes.

7. Saisissez lc.Name = "Avg Price" et appuyez sur ENTRÉE.

Cela ajoute le libellé de la colonne. Lorsque vous avez enregistré la macro,vous avez saisi le libellé, ce qui crée une colonne de liste. Lorsque vous cons-truisez votre propre macro, vous créez la colonne puis ajoutez le libellé àl’objet.

ActiveCell.FormulaR1C1 = "=[Net]/[Units]"

Astuce Dans la section précédente « Création d’un tableau à partir d’une sourceexterne », vous avez vu que les formats de date n’étaient pas importés d’une sourcede données externe. Pour appliquer le format numérique à la colonne Date, vouspouvez employer l’instruction l.ListColumns("Date")).DataBodyRange.NumberFor-mat = "mmm-yy".

Page 179: Excel 2007 VBA

Travail avec les tableaux Excel 159

8. Saisissez lc.DataBodyRange = "=[Net]/[Units]" et appuyez sur ENTRÉE.

En construisant avec précaution la formule dans l’interface utilisateur, vouspouviez obtenir une formule simple dans la macro enregistrée. Si vous aviezsimplement pointé vers les cellules référencées, la formule aurait compris lenom du tableau et [#This Row] comme qualificateurs. Même si vous avezenregistré la macro avec les noms complexes, vous pouvez simplifier la for-mule lorsque vous rédigez votre propre macro.

Range("Tableau1[Avg Price]").SelectSelection.NumberFormat = "$#,##0.00"

9. Saisissez lc.DataBodyRange.NumberFormat = "$#,##0.00" et appuyezsur ENTRÉE.

Lorsque vous employez le modèle objet, vous n’avez pas à sélectionner laplage.

Un objet ListObject (autrement dit, un tableau Excel) possède un modèle objettrès complet, avec d’excellentes collections pour les colonnes et les lignes. Mêmesi l’enregistreur de macro ne tire pas profit de ces collections, si vous comprenezle fonctionnement classique des collections vous pouvez raisonnablement devi-ner comment les collections fonctionnent dans un objet ListObject. Tandis quevous saisissez les instructions, des Auto Lists vous donnent de précieux indices surles méthodes et propriétés disponibles.

Manipulation des totaux et des filtres de tableauLorsque vous avez enregistré la macro, vous avez également enregistré les ins-tructions qui modifient les totaux et les filtres du tableau Excel. La conversion deces instructions dans votre propre macro consiste essentiellement en des simpli-fications évidentes. Parfois, comme pour placer une formule dans la ligne Total, ilpourra être nécessaire d’effectuer quelques essais pour découvrir ce qui fonc-tionne et ce qui échoue.

ActiveSheet.ListObjects("Tableau1").ShowTotals = True

1. Dans la fenêtre Exécution, saisissez l.ShowTotals = True et appuyez surENTRÉE.

Important Avant d’exécuter chaque étape de cette procédure, vous devez avoirparcouru pas à pas les instructions de déclaration de la macro ManipulerTable de laprocédure précédente et devriez vous référer aux instructions de la macro enregis-trée dans la section précédente « Enregistrement d’une macro pour manipuler untableau ».

Page 180: Excel 2007 VBA

160 Chapitre 5 Objets de données

Une ligne Total apparaît en bas du tableau, même si vous ne pouvez encorela voir. Cette instruction convertit simplement l’instruction enregistrée pouremployer la variable de référence objet.

Range("Tableau1[[#Totals],[Units]]").Select

2. Saisissez l.TotalsRowRange.Select et appuyez sur ENTRÉE.

Cette instruction rend visible la ligne des totaux. Vous pouvez l’omettre sivous le souhaitez dans la macro finale.

ActiveSheet.ListObjects("Tableau1").ListColumns("Units") _ .TotalsCalculation = xlTotalsCalculationSumRange("Tableau1[[#Totals],[Net]]").SelectActiveSheet.ListObjects("Tableau1").ListColumns("Net") _ .TotalsCalculation = xlTotalsCalculationSum

3. Saisissez les deux instructions suivantes, en appuyant après chacune surENTRÉE.

l.ListColumns("Units").TotalsCalculation = xlTotalsCalculationSuml.ListColumns("Net").TotalsCalculation = xlTotalsCalculationSum

Ces deux instructions sont fondamentalement identiques aux instructionsenregistrées. Elles ajoutent Sum comme calcul de la ligne des totaux de cha-que colonne. Remarquez qu’elles se servent de la propriété TotalsCalcula-tion. Celle-ci place une formule dans la cellule de total, à condition quecette formule appartienne à la liste des formules prédéfinies.

Range("Tableau1[[#Totals],[Avg Price]]").SelectActiveCell.FormulaR1C1 = _ "=Tableau1[[#Totals],[Net]]/Tableau1[[#Totals],[Units]]"

4. Saisissez l.ListColumns("Avg Price").Total.Formula = "=[[#Totals],[Net]]/[[#Totals],[Units]]" et appuyez sur ENTRÉE.

Lorsque vous faites référence à des cellules du corps du tableau, vous pou-vez n’employer que le nom de la colonne. Lorsque vous devez faire réfé-rence aux cellules de la ligne total, vous devez ajouter le mot clé spécial[#Total]. Dans la référence [[#Totals],[Net]], la partie [#Totals] identifie laligne et la partie [Net] la colonne. Vous les séparez par une virgule, puisdevez placer la totalité de la référence dans une autre paire de crochets.L’enregistreur avait également ajouté le nom du tableau. Comme la réfé-rence est à l’intérieur du tableau, celui-ci est superflu. Cette référence struc-turée est logique, même si un peu curieuse. Elle n’en fonctionne pas moinsoù que se trouve le tableau dans la feuille de calcul et s’ajuste automatique-ment si vous ajoutez ou supprimez des lignes du tableau.

5. Saisissez l.HeaderRowRange.Select et appuyez sur ENTRÉE.

Page 181: Excel 2007 VBA

Travail avec les tableaux Excel 161

Cette instruction vous ramène simplement en haut du tableau sans avoir àrevenir dans Excel. Vous pouvez l’omettre de la macro finale si vous le sou-haitez.

ActiveSheet.ListObjects("Tableau1").Range.AutoFilter _ Field:=9, Criteria1:="10", Operator:=xlBottom10Items

6. Saisissez l.Range.AutoFilter l.ListColumns("Avg Price").Index, 10,xlBottom10Items et appuyez sur ENTRÉE.

L’enregistreur fait référence à la colonne par son nombre. Vous pourriez pré-férer employer son nom, mais l’argument exige le nombre. De nombreuxéléments de collection possèdent une propriété Index qui donne la positionde l’élément dans la collection. Vous pouvez employer cette propriété Indexpour convertir le nom en nombre. L’enregistreur de macro comprend lesnoms des arguments. Vous pouvez les inclure ou les omettre à votre guise.

ActiveSheet.ShowAllData

7. Saisissez l.AutoFilter.ShowAllData et appuyez sur ENTRÉE.

L’enregistreur avait employé la méthode ShowAllData de la feuille active.Comme vous avez employé la propriété AutoFilter pour créer le filtre, vouspouvez rechercher si un AutoFilter dispose d’une méthode ShowAllData. Telest le cas. En employant la méthode ShowAllData de l’objet AutoFilter plutôtque celle de la feuille, vous pouvez disposer de différents états de filtragepour différents tableaux de la même feuille de calcul.

8. Appuyez sur F5 pour arrêter la macro. Copiez les instructions de la fenêtreExécution dans la macro ManipulerTable. Exécutez les macros OuvreFi-chierOrders et TableDepuisInterne, puis exécutez la macro ManipulerTa-ble pour la tester.

La conversion des informations d’une macro enregistrée dans votre propre macroexige parfois un peu d’expérimentation. Par exemple, lorsque vous examinez laformule de total générée par l’enregistreur pour la colonne Avg Price, vous pour-riez tenter de la convertir en =[Net]/[Units], parce cette version simple fonction-nait pour les autres lignes. Mais cela ne marche pas. Vous devez donc tenterd’ajouter un peu plus de la formule enregistrée jusqu’à ce que cela fonctionne.Vous pourriez bien sûr conserver la version de l’enregistreur, mais la macroéchouerait si vous l’exécutiez sur un tableau qui porte un nom différent. Si vouslaissez le nom du tableau dans une référence d’une macro, vous devez auparavantexplicitement fixer le nom du tableau plus tôt dans la macro.

Page 182: Excel 2007 VBA

162 Chapitre 5 Objets de données

Travail avec des tableaux croisés dynamiquesUn tableau Excel est comme une photographie aux rayons X. C’est une image,mais elle est statique. Si les lignes et les colonnes ne sont pas correctement défi-nies, la personne qui examine l’état peut ne pas remarquer des relations impor-tantes. Un état de tableau croisé dynamique, ou PivotTable, est en revanchecomme un scan tomodensitométrique. C’est une vue pluridimensionnelle desdonnées qui vous permet de trouver la perspective la plus signif icative. Lestableaux croisés dynamiques sont particulièrement utiles pour des états analyti-ques.

Voir aussi Les macros de cette section de tableau croisé dynamique ont été employées lorsde la création de l’application EIS (Enterprise Information System) décrites dans l’Annexe.

Création d’un tableau croisé dynamique à partir d’une source interneComme avec un tableau simple, vous pouvez faire en sorte qu’un tableau croisédynamique récupère ses données depuis une liste Excel ou une source de don-nées externe. La récupération de données depuis une liste est relativement sim-ple, mais un tableau croisé dynamique gère les données de façon relativementdifférente d’un tableau.

1. Fermez tous les classeurs sauf Chapitre05, qui devient donc le classeur actif.Exécutez la macro OuvreFichierOrders pour obtenir une nouvelle liste descommandes.

2. Commencez l’enregistrement d’une macro nommée zTableauDepuisIn-terne.

3. Sur l’onglet Insertion du ruban, cliquez sur Tableau croisé dynamique,puis cliquez sur OK pour accepter les options par défaut.

Par défaut, un nouveau tableau croisé dynamique affiche une place réservéevierge sur la feuille de calcul, la liste des champs du tableau croisé dynami-que apparaissant sur la droite.

Dépannage Si vous ne possédez pas de macro OuvreFichierOrders, reportez-vous à la section « Création d’un nouveau fichier à partir d’une feuille de calculexistante », plus tôt dans ce chapitre.

Page 183: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 163

4. Arrêtez l’enregistreur et examinez la macro dans l’éditeur Visual Basic.

5. Dans l’Explorateur de projets, double-cliquez sur Module1 du classeurChapitre05. Ensuite, dans la fenêtre Exécution, saisissez OuvreFichierOr-ders et appuyez sur ENTRÉE.

Une nouvelle copie du fichier Orders s’ouvre. Vous pouvez exécuter unemacro depuis Visual Basic en stipulant simplement le nom de la macro.

6. Effacez le contenu de la fenêtre Exécution, créez le squelette d’une macrosimilaire à ce qui suit, puis appuyez deux fois sur F8 pour atteindre l’instruc-tion End Sub.

Sub TableauDepuisInterne() Dim pc As PivotCacheEnd Sub

Vous êtes maintenant prêt à commencer à entrer les instructions du corpsde la macro.

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _ SourceData:= "Orders!R1C1:R3266C7", _ Version:=xlPivotTableVersion12).CreatePivotTable _

En ignorant l’instruction qui crée une nouvelle feuille, l’instruction suivantede la macro enregistrée (qui s’étend sur plusieurs lignes) se décompose enréalité en deux parties. La première ajoute un nouvel élément à la collectionPivotCaches, à l’aide du mot clé Create plutôt que du classique Add. Remar-quez la parenthèse ouvrante après la méthode Create.

Recherchez alors la parenthèse fermante correspondante, juste après le motxlPivotTableVersion12. Vous voyez après celle-ci une méthode CreatePivot-Table, avec ses propres arguments.

Page 184: Excel 2007 VBA

164 Chapitre 5 Objets de données

7. Saisissez (sur une seule ligne) Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase,Range("A1").CurrentRegion) et appuyez sur ENTRÉE.

Rien ne semble se produire. Vous possédez toutefois un cache en mémoirechargé et prêt à créer un tableau croisé dynamique. Plutôt que d’employerune adresse de plage explicite pour la source, comme le fait la macro enre-gistrée, vous employez la région active qui entoure la cellule A1.

Un tableau croisé dynamique stocke ses données dans un cache mémoire.Cela diffère d’un tableau. Un tableau possède toutes ses données dans letableau lui-même : rien n’est caché. En revanche, un tableau croisé dynami-que stocke toutes ses données dans le cache mémoire. Le terme cache estadapté, car il signifie « un emplacement de stockage masqué ». Vous pou-vez créer plusieurs tableaux croisés dynamiques qui emploient le mêmecache mémoire.

8. Saisissez Worksheets.Add et appuyez sur ENTRÉE.

Cela crée une nouvelle feuille de calcul vierge. Dans la macro enregistrée,l’ajout d’une nouvelle feuille de calcul s’effectue au début. Elle n’est pasnécessaire pour la création du cache mémoire : vous pouvez déplacer lacréation de la feuille plus loin dans la macro.

Version:=xlPivotTableVersion12).CreatePivotTable _TableDestination:="Feuil2!R3C1", _TableName:="Tableau croisé dynamique1", _DefaultVersion:=xlPivotTableVersion12

9. Saisissez pc.CreatePivotTable ActiveCell et appuyez sur ENTRÉE.

Cela crée le squelette du tableau croisé dynamique. Le seul argument obli-gatoire de la méthode CreatePivotTable est TableDestination. Comme vouspouvez créer plusieurs tableaux croisés dynamiques à partir d’un mêmecache, vous devez spécifier un emplacement pour chacun.

10. Dans la fenêtre Exécution, exécutez une seconde fois les instructionsWorksheets.Add et pc.CreatePivotTable ActiveCell.

Vous disposez alors de deux feuilles de calcul différentes, qui contiennenttoutes deux le squelette d’un tableau croisé dynamique. Ces deux tableauxsont connectés au même cache mémoire.

11. Appuyez sur F5 pour arrêter la macro actuelle. Copiez ensuite les instruc-tions de la fenêtre Exécution dans la macro, puis appuyez sur F5 pour testerla macro.

Un des dispositifs les plus puissants d’un tableau croisé dynamique est sa capacitéà créer des vues multiples des mêmes données, sans nécessiter de multiplescopies de ces données.

Page 185: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 165

Création d’un tableau croisé dynamique à partir d’une source externeCréer un tableau croisé dynamique fondé sur une source externe est analogue àcréer un tableau simple fondé sur une source externe. Avec un tableau toutefois,vous affectez la chaîne de connexion à la source à l’objet ListObject et le nom dutableau à l’objet QueryObject qui lui appartient. Avec un tableau croisé dynami-que, vous affectez à la fois la chaîne de connexion source et le nom du tableau àl’objet PivotCache.

1. Dans Excel, fermez tous les autres classeurs pour ne laisser que le classeurChapitre05 actif.

2. Commencez à enregistrer une nouvelle macro nommée zTableauCroisé-DExterne.

3. Appuyez sur CTRL+N pour ouvrir un nouveau classeur. Dans l’onglet Don-nées du ruban, cliquez sur A partir du fichier Access, naviguez jusqu'audossier qui contient les fichiers d’exercices de ce livre, sélectionnezOrders.accdb, puis cliquez sur Ouvrir. Dans la boîte de dialogue Importa-tion de données, sélectionnez l’option Rapport de tableau croisé dyna-mique, puis cliquez sur OK.

4. Arrêtez l’enregistreur et examinez la macro.

La partie supérieure de la macro possède une fonction Array analogue àcelle vue lors de la création d’un tableau à partir d’une source de donnéesexterne. Cette fois toutefois, elle appartient à la création de l’objet PivotCa-che. Outre créer un cache mémoire pour le tableau croisé dynamique, cettemacro ajoute un élément à la collection Connections du classeur. Le nomd’un unique élément de la collection Connections n’est pas Connection,comme vous pourriez vous y attendre, mais WorkbookConnection. Commed’habitude, affecter les objets à des variables rend la macro plus lisible.

5. Videz le contenu de la fenêtre Exécution, créez le squelette de la macrocomme présenté ci-dessous, puis appuyez deux fois sur F8 pour atteindrel’instruction End Sub.

Page 186: Excel 2007 VBA

166 Chapitre 5 Objets de données

Sub TableauCroiséDExterne() Dim wc As WorkbookConnection Dim pc As PivotCache Dim s As StringEnd Sub

Vous êtes maintenant prêt à commencer à entrer les instructions du corpsde la macro.

Workbooks.Add

6. Dans la fenêtre Exécution, saisissez Workbooks.Add et appuyez sur ENTRÉE.

Workbooks("Book2").Connections.Add "Orders", "", Array( _ ..."Support Complex Data=False"), Array("Orders"), 3

7. Saisissez les deux instructions suivantes en appuyant après chacune surENTRÉE.

s = ThisWorkbook.Path & "\..\Orders.accdb"s = "OLEDB;Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" & s

Ces instructions sont exactement les mêmes que celles qui définissent lachaîne source dans la macro TableDepuisExterne, plus tôt dans ce chapitre.Remarquez que, dans la macro enregistrée, certains des arguments de laméthode Add précèdent la fonction Array tandis que certains la suivent. Enplaçant la source de données dans une chaîne, il est plus facile de voir lastructure complète de la méthode Add.

8. Saisissez (sur une seule ligne) Set wc = ActiveWorkbook.Connec-tions.Add("", "", s,"Orders", 3) et appuyez sur ENTRÉE.

Le premier argument de la méthode Add est l’argument Name. Il est obliga-toire, et l’enregistreur a inséré "Orders" comme nom. Si toutefois vousemployez une chaîne vide pour l’argument, Add génère un nom par défaut.Il génère automatiquement un nouveau nom unique si vous créez plusieursconnexions dans le même classeur. Les arguments après la chaîne sourcesont identiques à ceux de l’instruction enregistrée.

Astuce Créer une connexion explicite dans la macro est une façon dont untableau croisé dynamique diffère d’un tableau. Lorsque vous créez un tableau àpartir d’une connexion externe, l’objet QueryTable crée effectivement un nouvelobjet WorkbookConnection, mais de façon implicite, sans le placer dans la macro.Lorsque vous créez un tableau croisé dynamique à partir d’une connexion externe,la macro crée explicitement un objet WorkbookConnection puis lui lie l’objet Pivot-Cache.

Page 187: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 167

ActiveWorkbook.PivotCaches.Create( _ SourceType:=xlExternal, _ SourceData:=ActiveWorkbook.Connections("Orders"), _ Version:=xlPivotTableVersion12).CreatePivotTable

9. Saisissez (sur une seule ligne) Set pc = ActiveWorkbook.PivotCa-ches.Create(xlExternal, wc) et appuyez sur ENTRÉE.

Comme pour la méthode Create de création d’un cache mémoire à partird’une source interne, la plupart des arguments sont facultatifs. Pour unesource externe, vous employez comme source la référence à la connexiondu classeur. En affectant le cache mémoire à une variable, vous pouvez divi-ser la méthode CreatePivotTable en une nouvelle instruction.

Version:=xlPivotTableVersion12).CreatePivotTable _TableDestination:="Feuil1!R1C1", _TableName:="Tableau croisé dynamique4", _DefaultVersion:=xlPivotTableVersion12

10. Saisissez les deux instructions suivantes, en appuyant après chacune surENTRÉE.

Worksheets.Addpc.CreatePivotTable ActiveCell

Créer un objet PivotTable à partir d’une connexion externe est strictementidentique à sa création à partir d’une connexion interne : c’est le cachemémoire qui diffère lors de l’accès à une source externe.

11. Appuyez sur F5 pour arrêter la macro actuelle. Copiez ensuite les instruc-tions de la fenêtre Exécution dans la macro puis appuyez sur F5 pour testerla macro.

Plusieurs tableaux croisés dynamiques peuvent accéder au même cache mémoireet donc à la même connexion de classeur. Pour modifier la source de la con-nexion, il suffit de changer un des objets connexion : tous les tableaux croisésdynamiques qui en dépendent se modifieront en conséquence.

Enregistrement d’une macro pour définir la structure du tableau croisé dynamiqueLors de la première création d’un tableau croisé dynamique, vous voyez sur lafeuille de calcul un champ vide, ainsi qu’un volet des tâches Liste des champs pourvous aider à créer la présentation. L’enregistreur de macro peut vous aider àdécouvrir les méthodes et propriétés de définition de la structure d’un objetPivotTable.

1. Exécutez la macro TableauCroiséDExterne pour créer un nouveau classeuravec le squelette d’un tableau croisé dynamique.

Page 188: Excel 2007 VBA

168 Chapitre 5 Objets de données

2. Commencez l’enregistrement d’une macro nommée zFixerStructureTa-bleau.

3. Dans la liste Liste de champs du tableau croisé dynamique, sélectionnezla case à cocher Net.

Comme ce champ est numérique, il génère un champ de données dans laliste Valeurs nommée Somme de Net. Le nom Somme de Net apparaît éga-lement dans la cellule A1, avec le total général dans la cellule A2. Vous pou-vez modifier le nom du champ de données en saisissant simplement unnouveau libellé.

4. Dans la cellule A1, saisissez Net suivi d’un espace, puis appuyez sur ENTRÉE.

Vous pouvez renommer un champ en saisissant un nouveau nom dans letableau, mais il est interdit de lui attribuer un nom qui corresponde à unquelconque des noms des champs de la base de données. En ajoutant unespace après le nom, vous pouvez faire en sorte que le nom semble êtreidentique au nom du champ.

5. Dans la liste des champs, sélectionnez la case à cocher Category.

Les noms des catégories apparaissent dans la colonne A. Comme ce champcontient du texte, il est par défaut la région Etiquettes de lignes.

6. Dans la liste des champs, glissez-déposez le champ State dans la zone Filtredu rapport.

Le champ se déplace au-dessus du tableau et le reste du rapport se décalevers le bas pour lui faire place. Si vous souhaitez qu’un champ texte ailleailleurs que dans la région Etiquettes de lignes, vous devez explicitement l’yglisser-déposer.

7. Dans la liste des champs, glissez-déposez le champ Date dans la zone Eti-quettes de colonnes.

Les dates apparaissent en haut du tableau. Un tableau croisé dynamiquereconnaît les dates et permet de créer des regroupements automatiquespour celles-ci.

8. Effectuez un clic droit sur n’importe lequel des en-têtes de la colonne dateet cliquez sur Grouper. Effacez Mois, sélectionnez Trimestres et Années,puis cliquez sur OK.

Remarquez qu’il existe sept niveaux de regroupement possibles et que vousavez sélectionné les deux derniers.

Page 189: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 169

9. Dans l’onglet Actions du ruban Outils de tableau croisé dynamique, cli-quez sur Sélectionner, puis cliquez sur Tableau croisé dynamique com-plet. Cliquez à nouveau sur Sélectionner puis cliquez sur Valeurs. Ensuite,sur l’onglet Accueil du ruban, cliquez sur Format de cellules puis cliquezun format numérique sans décimale.

Cela applique un format numérique de base dépourvu de décimale unique-ment à la zone des données du tableau croisé dynamique.

10. Arrêtez l’enregistreur et examinez la macro.

Vous pouvez maintenant rédiger une nouvelle macro à l’aide des informa-tions glanées dans la macro enregistrée.

Définition de la structure du tableau croisé dynamiqueLa possibilité de contrôler la structure d’un tableau croisé dynamique depuis unemacro est une puissante capacité, surtout si vous voulez automatiser des étatsanalytiques. L’enregistreur montre comment manipuler le tableau croisé dynami-que, mais, comme d’habitude, n’effectue pas toujours les modifications de lafaçon la plus simple.

Page 190: Excel 2007 VBA

170 Chapitre 5 Objets de données

1. Exécutez la macro TableauCroiséDExterne. Videz la fenêtre Exécution,créez un squelette de macro similaire à ce qui suit, puis appuyez trois fois surF8 pour initialiser la variable.

Sub FixerStructureTableau() Dim pt as PivotTable Set pt = ActiveCell.PivotTableEnd Sub

Vous êtes maintenant prêt à saisir les instructions du corps de la macro.

ActiveSheet.PivotTables("Tableau croisé dynamique5").AddDataField _ActiveSheet.PivotTables("Tableau croisé dynamique5"). _PivotFields("Net"), "Sum of Net", xlSum

2. Dans la fenêtre Exécution, saisissez pt.PivotFields("Net").Orientation =xlDataField et appuyez sur ENTRÉE.

La macro enregistrée a recours à AddDataField pour convertir le champ Neten un champ de données. Affecter simplement xlDataField à la propriétéOrientation (par analogie avec les autres champs) fonctionne toutefois aussibien et rend plus cohérentes les instructions de la macro.

ActiveSheet.PivotTables("Tableau croisé dynamique5"). _DataPivotField.PivotItems("Somme de Net").Caption = "Net "

3. Saisissez pt.DataFields(1).Caption = "Net " et appuyez sur ENTRÉE.

Plutôt que de faire directement référence au champ de données commePivotItem de l’objet DataPivotField, vous pouvez simplement y faire réfé-rence comme champ de la collection DataFields. Cette option simplifiéerend la macro plus facile à lire.

With ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotFields("State") .Orientation = xlPageField .Position = 1End With

4. Saisissez les trois instructions suivantes, en appuyant après chacune surENTRÉE.pt.PivotFields("Category").Orientation = xlRowFieldpt.PivotFields("State").Orientation = xlPageFieldpt.PivotFields("Date").Orientation = xlColumnField

La macro enregistrée emploie trois structures With différentes pour dépla-cer les champs aux emplacements adéquats. Comme il n’y a qu’un champsur chaque axe, il est superflu de spécifier la propriété Position et doncd’employer une structure With ou une variable.

Range("B4").SelectSelection.Group Start:=True, End:=True, _ Periods:=Array(False, False, False, False, False, True, True)

Page 191: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 171

5. Saisissez pt.ColumnFields("Date").DataRange.Cells(1).Group Periods:=Array(False,False, False, False, False, True, True) et appuyez sur ENTRÉE.

Les groupes Année et Trimestre apparaissent. La fonction Array correspondaux sept niveaux de la boîte de dialogue de regroupement. Vous voulez lesdeux derniers éléments (trimestre et année), ce pourquoi les deux derniersarguments sont fixés à true. L’enregistreur emploie l’adresse de la cellulepour identifier le champ de la colonne, ce qui est un moyen bien fragiledans une macro. Employer directement le champ Date est bien plus robuste.

ActiveSheet.PivotTables("Tableau croisé dynamique5").PivotSelect "", xlDataOnly, TrueSelection.Style = "Comma [0]"

6. Saisissez pt.DataBodyRange.Style = "Comma [0]" et appuyez sur ENTRÉE.

La macro enregistrée parvient à la plage de données à l’aide de la méthodePivotSelect. Vous avez déjà employé une propriété DataBodyRange pourl’objet ListObject d’un tableau Excel. Grâce à l’aide des Auto Lists, vous pou-vez rapidement constater qu’un objet PivotTable possède également unepropriété DataBodyRange qui, puisqu’il s’agit d’un objet Range, possèdeune propriété Style.

7. Appuyez sur F5 pour arrêter la macro. Copiez ensuite les instructions de lafenêtre Exécution dans la macro FixerStructureTableau. Exécutez la macroTableauCroiséDExterne, puis exécutez la macro FixerStructureTableaupour la tester.

La macro enregistrée ne se sert pas de la propriété Orientation pour le champ dedonnées. Comme elle est employée pour les autres champs, vous pouvez vérifierla liste d’énumérations de la propriété Orientation pour voir si elle dispose d’uneoption pour le champ de données. Enregistrer une action peut parfois procurerdes indices pour la simplification de la rédaction d’autres instructions.

Enregistrement d’une macro pour personnaliser l’aspect d’un tableau croisé dynamiquePar défaut, un tableau croisé dynamique s’ajuste automatiquement en fonctiondes données spécifiques qu’il renferme : il ajuste automatiquement la largeur descolonnes et masque les lignes et colonnes dépourvues de données. Vous voudrezparfois toutefois disposer d’un état qui présente toujours le même aspect, quellesque soient les données qu’il renferme. Conserver un aspect identique peut parexemple faciliter la comparaison de résultats lorsque vous basculez le tableau d’unétat à un autre.

Dépannage Si vous ne possédez pas actuellement de tableau croisé dynamique,exécutez les macros TableauCroiséDExterne et FixerStructureTableau.

Page 192: Excel 2007 VBA

172 Chapitre 5 Objets de données

1. Commencez l’enregistrement d’une macro nommée zFixerAspectTableau.

2. Cliquez sur la flèche de filtrage State de la cellule B2, sélectionnez Idaho,puis cliquez sur OK.

Lucerne Publishing n’a commencé que récemment à commercialiser sesproduits en Idaho, si bien que seules certaines des catégories et des datespossèdent des valeurs. En sélectionnant un état à données limitées, vouspouvez vous assurer de disposer toujours du même quadrillage quel quesoit l’état sélectionné.

3. Effectuez un clic droit sur n’importe laquelle des libellés de ligne (par exem-ple Dinosaur) et cliquez sur Paramètres de champ. Cliquez sur l’onglet Dis-position et impression, sélectionnez Afficher les éléments sansdonnées, puis cliquez sur OK.

La catégorie Seattle apparaît désormais, bien que la ligne soit dépourvue dedonnées.

4. Effectuez un clic droit sur le libellé de la colonne 2007, puis cliquez surParamètres de champ. Cliquez sur l’onglet Disposition et impression,sélectionnez Afficher les éléments sans données, puis cliquez sur OK.

Toutes les années disponibles apparaissent. Vous ne voulez jamais voir lesoptions inférieur à et supérieur à automatiquement générées par le regrou-pement des dates et, dans le cadre des besoins actuels, souhaitez n’afficherque les deux dernières années.

5. Cliquez sur la flèche Etiquettes de colonnes et éliminez <1/1/2005, 2005et >10/2/2007. Autrement dit, décochez toutes les options sauf les deuxdernières années complètes.

Page 193: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 173

6. Sur l’onglet Création du ruban Outils de tableau croisé dynamique, cli-quez sur Totaux généraux, puis cliquez sur Activer pour les colonnes uni-quement.

Les totaux à droite de 2007 disparaissent. Le total pour uniquement cesdeux années n’est pas un nombre intéressant.

Un tableau croisé dynamique ajuste automatiquement la taille de toutes sescolonnes. Cela d’évite de devoir constater la présence de dièses lorsque lenombre est trop grand, mais est dérangeant lorsque vous basculez d’un étatà un autre. En fixant toutes les colonnes à une largeur immédiatement supé-rieure à la largeur de la plus grande colonne, vous obtenez une cohérenceagréable.

7. Cliquez sur la flèche de filtrage State de la cellule B2, puis cliquez sur Tous.Sélectionnez ensuite les colonnes de B à I, puis double-cliquez sur la bor-dure entre les colonnes C et D pour ajuster automatiquement la largeur detoutes les colonnes. Glissez-déposez légèrement vers la droite la bordureentre les colonnes C et D pour attribuer la même taille à toutes lescolonnes : un peu plus grand que le minimum détecté par l’ajustementautomatique.

Page 194: Excel 2007 VBA

174 Chapitre 5 Objets de données

8. Effectuez un clic droit sur n’importe quelle cellule du tableau croisé dynami-que, puis cliquez sur Options de tableau croisé dynamique. Dans l’ongletDisposition et mise en forme, décochez les options Ajuster automati-quement la largeur des colonnes lors de la mise à jour et Conserver lamise en forme des cellules lors de la mise à jour, puis cliquez sur OK.

Si vous ne désélectionnez pas l’option d’ajustement automatique de la lar-geur des colonnes, l’ajustement sera effectué automatiquement à chaquebasculement entre états.

9. Sur l’onglet Options du ruban Outils de tableau croisé dynamique, cli-quez sur Boutons+/- pour désactiver les boutons, puis cliquez sur En-têtesde champ pour désactiver les en-têtes.

Lorsqu’un tableau ne propose qu’une navigation limitée, les dispositifs sup-plémentaires proposés dans l’interface utilisateur pour un tableau croisédynamique sont superflus.

10. Arrêtez l’enregistreur et affichez la macro zFixerAspectTableau.

Vous pouvez maintenant vous servir des informations fournies par la macroenregistrée pour créer votre propre macro de définition de l’aspect dutableau croisé dynamique.

Personnalisation d’un tableau croisé dynamiqueL’enregistreur de macro effectue un excellent travail lors de l’ajustement del’aspect d’un tableau croisé dynamique. Vous préférez évidemment employer unevariable objet pour l’objet PivotTable. Cette macro se sert en plusieurs endroits dechamps du tableau, si bien qu’il peut être utile de créer une variable pour un objetPivotField. Plutôt que d’employer des références vers des plages (qui pourraientdifférer), vous pouvez vous servir de points de référence dans l’objet PivotTable.

1. Exécutez les macros TableauCroiséDExterne et FixerStructureTableau.Créez ensuite dans l’éditeur Visual Basic le squelette d’une macro analogueà ce qui suit, puis appuyez quatre fois sur F8 pour initialiser les variables.

Sub FixerAspectTableau() Dim pt As PivotTable Dim pf as PivotField Set pt = ActiveCell.PivotTable Set pf = pt.ColumnFields("Années")End Sub

Vous êtes maintenant prêt à créer les instructions pour le corps de la macro.

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("State"). _ ClearAllFilters ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("State"). _ CurrentPage = "Idaho"

Page 195: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 175

2. Saisissez pt.PageFields("State").CurrentPage = "Idaho" et appuyez surENTRÉE.

Cela permet de voir le tableau réduit et de pouvoir vérifier l’effet des ins-tructions suivantes. Vous pourrez omettre cette instruction dans la macrofinale si vous le souhaitez.

ActiveSheet.PivotTables("Tableau croisé dynamique1"). _ PivotFields("Category").ShowAllItems = True ActiveSheet.PivotTables("Tableau croisé dynamique1")._ PivotFields("Années").ShowAllItems = True

3. Saisissez les deux instructions suivantes, en appuyant après chacune surENTRÉE.

pt.RowFields("Category").ShowAllItems = Truepf.ShowAllItems = True

Ces instructions sont fondamentalement identiques. Elles affichent tous leséléments des champs de ligne et de colonne. Elles diffèrent de celles de lamacro enregistrée en ce qu’elles ont recours à des variables objet.

With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Années") .PivotItems("<1/1/2005").Visible = False .PivotItems("2005").Visible = False .PivotItems(">10/2/2007").Visible = FalseEnd With

4. Saisissez les trois instructions suivantes, en appuyant après chacune surENTRÉE.

pf.PivotItems(1).Visible = Falsepf.PivotItems(2).Visible = Falsepf.PivotItems(pf.PivotItems.Count).Visible = False

Elles masquent les deux premiers et le dernier élément du champ Year, nelaissant que les deux dernières années complètes. En employant la propriétéCount de PivotItems pour identifier le dernier élément, la macro s’adapteplus efficacement à un ensemble de données qui possède plus de troisannées.

ActiveSheet.PivotTables("Tableau croisé dynamique1").RowGrand = FalseActiveSheet.PivotTables("Tableau croisé dynamique").HasAutoFormat = False

5. Saisissez les deux instructions suivantes, en appuyant après chacune surENTRÉE.

pt.RowGrand = Falsept.HasAutoFormat = False

Il s’agit d’affectations de propriétés toutes simples. La seule modification parrapport à la macro enregistrée est l’emploi de la variable objet.

Page 196: Excel 2007 VBA

176 Chapitre 5 Objets de données

ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("State")._ ClearAllFiltersActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("State").CurrentPage _ = "(All)"

6. Saisissez pt.PageFields("State").CurrentPage = "(All)" et appuyez surENTRÉE.

Cette instruction garantit que les valeurs du tableau seront aussi grandesque possible. C’est une partie importante de la macro : vous ne voudriez pasfixer accidentellement la largeur des colonnes d’après un filtre qui en com-porte que de petites valeurs. L’enregistreur ajoute une autre instruction pouréliminer les filtres existants, mais elle est superflue.

Columns("B:I").SelectColumns("B:I").EntireColumn.AutoFit

7. Saisissez pt.DataBodyRange.Columns(2).AutoFit et appuyez sur ENTRÉE.

Le but de cette instruction est d’identifier la largeur à employer pour toutesles colonnes. L’enregistreur de macro a modifié toutes les colonnes. Vousn’avez besoin de modifier que celle que vous allez employer dans l’instruc-tion suivante, tandis que modifier la sélection est parfaitement superflu.

Selection.ColumnWidth = 9.43

8. Saisissez (sur une seule ligne) pt.DataBodyRange.ColumnWidth =pt.DataBodyRange.Columns(2).ColumnWidth + 1 et appuyez surENTRÉE.

Cela ajuste toutes les colonnes de la plage du corps des données de façon àêtre légèrement plus large que la colonne ajustée automatiquement àl’étape précédente. Il serait dangereux d’employer une largeur absolue :mieux vaut vous fonder sur la largeur obtenue grâce à l’ajustement automa-tique de l’instruction précédente.

ActiveSheet.PivotTables("Tableau croisé dynamique1").DisplayFieldCaptions = FalseActiveSheet.PivotTables("Tableau croisé dynamique1").ShowDrillIndicators = False

9. Saisissez les deux instructions suivantes, en appuyant après chacune surENTRÉE.

pt.DisplayFieldCaptions = Falsept.ShowDrillIndicators = False

Ces instructions ne diffèrent de celles de la macro enregistrée que parl’emploi d’une variable objet.

10. Appuyez sur F5 pour arrêter la macro. Copiez ensuite les instructions de lafenêtre Exécution dans la macro FixerAspectTableau. Exécutez les macros

Page 197: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 177

TableauCroiséDExterne et FixerStructureTableau, puis exécutez la macroFixerAspectTableau pour la tester.

11. Après avoir exécuté la macro, basculez entre différentes valeurs de la listeState pour vérifier que le tableau conserve le même aspect.

Rendre les colonnes toujours visibles avec une largeur homogène facilite la com-paraison par les utilisateurs des valeurs pour les différents états.

Enregistrement d’une macro pour personnaliser un style de tableau croisé dynamiqueExcel 2007 dispose d’un outil puissant pour l’application d’un style homogène àun tableau ou à un tableau croisé dynamique Excel. Vous pouvez sélectionner l’undes 60 styles intégrés d’un tableau ou des 84 styles intégrés d’un tableau croisédynamique. Vous pouvez également créer de nouveaux styles, avec des mises enforme distinctes pour les différentes parties du tableau ou du tableau croisé dyna-mique. Les styles de tableau sont également intégrés aux thèmes de classeur :lorsque vous appliquez un style, vous pouvez modifier l’apparence de façonimportante mais toujours homogène en sélectionnant simplement un nouveauthème.

1. Commencez l’enregistrement d’une macro nommée zFixerStyleTableau.

2. Sur l’onglet Création du ruban Outils de tableau croisé dynamique, cli-quez sur la flèche Autres de Styles de tableau croisé dynamique.

3. Sans cliquer dessus, déplacez le pointeur de la souris sur Style de tableaucroisé dynamique moyen 23 (deuxième colonne de la ligne du bas de lasection Moyen) puis sur Style de tableau croisé dynamique foncé 2(deuxième colonne de la ligne du haut de la section Sombre).

Le style moyen met en évidence la première colonne, mais pas la ligne destotaux. Le style foncé met en évidence la ligne des totaux, mais pas la pre-mière colonne. Vous voulez les deux. La solution consiste à créer une copie

Page 198: Excel 2007 VBA

178 Chapitre 5 Objets de données

du style foncé, puis à la modifier pour mettre aussi en évidence la premièrecolonne.

4. Effectuez un clic droit sur Style de tableau croisé dynamique foncé 2 puiscliquez sur Dupliquer. Saisissez NouveauStyleTableau comme nom dustyle dupliqué, puis cliquez sur OK.

Cela crée une copie du style, sans l’appliquer au tableau. Vous devez expli-citement affecter le style au tableau.

5. Cliquez à nouveau sur la flèche Autres de Styles de tableau croisé dyna-mique, puis cliquez sur NouveauStyleTableau.

Vous êtes désormais prêt à modifier le style personnalisé.

6. Effectuez un clic droit sur NouveauStyleTableau puis cliquez sur Modifier.Dans la liste Elément de tableau, sélectionnez Première colonne.

7. Cliquez sur le bouton Format. Dans l’onglet Remplissage, cliquez sur lerectangle coloré de la quatrième ligne et de la cinquième colonne du blocprincipal de couleurs.

Les info bulles n’apparaissent pas dans cette palette, mais dans une palettede couleurs standard une info bulle dirait pour ce rectangle Bleu, Accentua-tion 1, Plus sombre 25%.

Cela affecte à la première colonne une couleur plus sombre, ce qui rend letexte difficile à lire.

8. Sur l’onglet Police, dans la liste Style, cliquez sur Gras. Dans la liste Couleur,cliquez sur Blanc. Cliquez ensuite à deux reprises sur OK.

Page 199: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 179

Cela place la police en blanc gras, la rendant parfaitement lisible sur le fondfoncé.

Les styles sont alignés sur les thèmes Office. En basculant d’un thème à unautre sur l’onglet Mise en page du ruban, vous pouvez modifier la totalité del’aspect du tableau. La police n’est toutefois pas modifiée en même tempsque le thème. Le style emploie le style Normal pour définir la police. Pardéfaut, le style Normal a recours à Arial. En modifiant le style de cellule Nor-mal de façon à employer une police de thème, vous pouvez totalement syn-chroniser votre tableau croisé dynamique avec le thème actif.

9. Sur l’onglet Accueil du ruban, cliquez sur la flèche Styles de cellules, effec-tuez un clic droit sur Normal, puis cliquez sur Modifier. Cliquez sur Format.Dans l’onglet Police, sélectionnez dans la liste des polices Calibri (Corps).Cliquez ensuite deux fois sur OK.

Même si le nom de la police dit Calibri (si vous employez le thème Office pardéfaut), vous fixez en réalité la police à la police du corps du thème actif :elle sera modifiée si vous changez de thème.

10. Arrêtez l’enregistreur.

11. Avant d’examiner la macro, appliquez de nouveaux thèmes au tableaucroisé. Insérez une nouvelle colonne A et donnez-lui une largeur d’environ45 de façon à pouvoir voir le tableau derrière la liste des thèmes. Ensuite, surl’onglet Mise en page du ruban, cliquez sur le bouton Thèmes et déplacezle pointeur de la souris sur les différents thèmes pour voir les modificationsdes styles du tableau croisé dynamique.

12. Examinez la macro zFixerStyleTableau.

Vous pouvez maintenant employer les informations de la macro enregistrée pourcréer une macro qui modifie le style d’un tableau croisé dynamique.

Page 200: Excel 2007 VBA

180 Chapitre 5 Objets de données

Personnalisation du style d’un tableau croisé dynamiqueLa meilleure amélioration que vous puissiez apporter au code produit par l’enre-gistreur de macro pour modifier un style consiste à éliminer les instructions quiredéfinissent des propriétés non modifiées.

Simplifier une macro pour n’y laisser que les propriétés réellement modifiées nonseulement la raccourcit, mais clarifie également son objectif : vous n’avez plus àvous demander lesquelles de ces centaines de propriétés sont importantes pour lamacro.

1. Exécutez les macros TableauCroiséDExterne et FixerStructureTableau.L’exécution de la macro FixerAspectTableau n’est pas indispensable avant lacréation d’une macro qui personnalise le style, mais ne peut faire aucun mal.Videz ensuite la fenêtre Exécution, créez le squelette d’une macro analogueà ce qui suit, puis appuyez trois fois sur F8 pour initialiser les variables.

Sub FixerStyleTableau() Dim pt As PivotTable Dim ts As TableStyle Set pt = ActiveCell.PivotTableEnd Sub

Vous êtes maintenant prêt à commencer à saisir dans la fenêtre Exécutionles instructions du corps de la macro.

ActiveWorkbook.TableStyles("PivotStyleDark2").Duplicate ("NouveauStyleTableau")

2. Dans la fenêtre Exécution, saisissez (sur une seule ligne) Set ts = ActiveWorkbook.TableStyles( "PivotStyleDark2").Duplicate("NouveauStyle-Tableau") et appuyez sur ENTRÉE.

Elle ne diffère de l’instruction enregistrée que par l’affectation du style résul-tant à une variable.

La macro enregistrée comporte ensuite quelque 26 blocs With qui recréenttous les éléments du style dupliqué. Vous pouvez ignorer toutes ces instruc-tions, jusqu’à celle qui affecte NouveauStyleTableau au tableau croisé dyna-mique actif.

ActiveSheet.PivotTables("Tableau croisé dynamique1").TableStyle2 = "NouveauStyleTableau"

3. Saisissez pt.TableStyle2 = ts.Name et appuyez sur ENTRÉE.

Cette instruction emploie les objets plutôt que la longue référence. L’emploide la propriété Name du style de tableau stocké dans la variable TableStylerend la macro utilisable même si vous changez d’avis quant au nom employédans la première instruction de la macro.

Page 201: Excel 2007 VBA

Travail avec des tableaux croisés dynamiques 181

With ActiveWorkbook.TableStyles("NouveauStyleTableau").TableStyleElements( _ xlFirstColumn).Font .FontStyle = "Gras" .TintAndShade = 0 .ThemeColor = xlThemeColorDark1End With

4. Saisissez les deux instructions suivantes (chacune sur une seule ligne), enappuyant après chacune sur ENTRÉE.

ts.TableStyleElements(xlFirstColumn).Font.FontStyle = "Gras"ts.TableStyleElements(xlFirstColumn).Font.ThemeColor = xlThemeColorDark1

Ces instructions fixent simplement le style de la police à gras et la couleur àblanc. Un des intérêts de la fenêtre Exécution par rapport à l’interface utili-sateur est que vous pouvez voir l’effet de chaque modification tandis quevous l’effectuez, sans avoir à attendre la fermeture de la boîte de dialogue.

With ActiveWorkbook.TableStyles("NouveauStyleTableau").TableStyleElements( _ xlFirstColumn).Interior .ThemeColor = xlThemeColorAccent1 .TintAndShade = -0.249946592608417End With

5. Saisissez les deux instructions suivantes (chacune sur une seule ligne), enappuyant après chacune sur ENTRÉE.

ts.TableStyleElements(xlFirstColumn).Interior.ThemeColor = xlThemeColorAccent1ts.TableStyleElements(xlFirstColumn).Interior.TintAndShade = -0.25

Il faut deux instructions pour mettre en œuvre un unique rectangle coloréde la palette de couleurs de thème. En effet, les couleurs d’une colonne dela palette ne sont en réalité que des éclaircissements ou des assombrisse-ments de la couleur présente en haut. Cela implique que, dans une macro,vous n’êtes pas limité aux cinq variations d’éclaircissement et d’assombrisse-ment de la palette. Vous pouvez affecter à la propriété TintAndShaden’importe quel niveau entre -1 et 1 : la couleur se modifiera encore de façonadéquate lors d’un changement de thème pour le classeur.

6. Saisissez ActiveWorkbook.Styles("Normal").Font.ThemeFont = xlThe-meFontMinor et appuyez sur ENTRÉE.

Astuce Il est un peu paradoxal que le nom d’un thème de couleurs blanches soitxlThemeColorDark1. La raison en tient à ce que les thèmes de couleurs ont étédéveloppés à l’origine pour Microsoft Office PowerPoint 2007. Avec PowerPoint,des couleurs claires sur un fond sombre sont fréquentes, si bien que dans un thèmePowerPoint classique cette couleur serait effectivement sombre.

Page 202: Excel 2007 VBA

182 Chapitre 5 Objets de données

La macro enregistrée possède presque deux douzaines d’instructions uni-quement pour définir la police du thème. Dans la boîte de dialogue Style,vous avez spécifié comme police Calibri (Corps), mais l’identifiant de lapolice dans le modèle objet est le terme générique xlThemeFontMinor. C’estce qui permet à la police de se modifier en la police définie dans le thèmeactif.

7. Appuyez sur F5 pour arrêter la macro. Copiez ensuite les instructions de lafenêtre Exécution dans la macro FixerStyleTableau. Exécutez les macrosTableauCroiséDExterne, FixerStructureTableau et FixerAspectTableau,puis exécutez la macro FixerStyleTableau pour la tester.

Après avoir testé la macro, essayez de changer de thème pour vérifier queles couleurs et les polices se modifient en conséquence.

Les tableaux et les tableaux croisés dynamiques Excel sont de puissants outils pourl’exploration et l’analyse de données provenant de sources tant internes qu’exter-nes. La possibilité d’employer des macros VBA pour créer et manipuler destableaux et des tableaux croisés dynamiques permet de développer des tableauxet tableaux croisés dynamiques étonnants (et étonnamment utiles) pour vous ouau bénéfice d’autres.

FERMEZ le classeur Chapitre05.xlsm.

Page 203: Excel 2007 VBA

Points clés 183

Points clés● Lorsque vous voulez rapidement identifier les méthodes et propriétés qui

accomplissent une tâche simple, enregistrez une macro puis servez-vous dela sortie de l’enregistreur de macro comme source rapide d’aide.

● Lorsque vous devez trier ou filtrer une liste, pensez à la transformer entableau. Servez-vous de la collection de feuille de calculs ListObjects pourcréer un tableau et y accéder.

● Servez-vous de ThisWorkbook.Path comme base pour vous aider à ouvrirdes fichiers qui sont toujours proches du classeur de la macro.

● L’enregistreur est idéal pour déterminer la chaîne de connexion vers uneréférence externe, comme une base de données. Un grand nombre desparamètres d’une chaîne de connexion enregistrée ne sont que des valeurspar défaut : vous pouvez les omettre si vous le souhaitez dans votre macro.

● La création de formules qui font référence aux cellules d’un tableau aboutità des références structurées. Si la formule est située dans le tableau, vouspouvez fréquemment simplifier la formule par défaut obtenue pour ne con-server que ce qui est strictement nécessaire à vos besoins.

● Lorsque vous créez un tableau croisé dynamique, vous créez d’abord lecache mémoire de stockage des données. Vous pouvez ensuite créer plu-sieurs tableaux croisés dynamiques qui partagent le même cache mémoire.Pour accéder à celui-ci, servez-vous de la propriété PivotCache d’un objetPivotTable.

● Pour modifier le style d’un tableau croisé dynamique ou d’un tableau nor-mal, vous devez d’abord dupliquer un style existant. Servez-vous de la col-lection TableStyleElements pour identifier et sélectionner la partie que vousvoulez modifier.

Page 204: Excel 2007 VBA

Emploi des rubriques d’aide pour en apprendre plus sur les

objets, page 186

Synchronisation de l’échelle de graphiques distincts,

page 213

Application de mise en forme avancée à des parties de graphiques, page 216

Emploi d’une macro pour appliquer une mise en forme avancée à des formes et à du texte, page 198

Emploi d’une macro pour créer des boutons graphiques capables de

lancer des macros, page 205

Coup d’œil sur le chapitre

Page 205: Excel 2007 VBA

185

6 Objets de graphismeCe chapitre aborde les points suivants :

✔ Manipulation de remplissage avancé de cellules de feuille de calcul ;✔ Manipulation de formes graphiques sur une feuille de calcul ;✔ Manipulation d’objets graphiques ;✔ Emploi de l’aide comme outil de référence.

Il y a quelques semaines, j’avais demandé à une amie de me rejoindre pour déjeu-ner ensemble dans un restaurant situé près de chez moi. Environ une demi-heureaprès l’heure de rendez-vous chez moi, j’ai reçu un appel téléphonique de sa part.Elle était à l’autre bout de la ville. Le problème venait de ce que je lui avais donnél’itinéraire vers mon domicile. Ce dont elle avait réellement besoin était de monadresse, pour pouvoir l’entrer dans le GPS de sa voiture. Celui-ci lui aurait alorsindiqué comment arriver jusqu’à chez moi. J’ai entendu dire qu’un GPS était undon des dieux. Il ne conduit pas à votre place, mais vous procure les informationsnécessaires tandis que vous conduisez. Si toutefois vous vous trouvez dans unerégion distante, non cartographiée, où aucune connexion satellite n’est disponi-ble, ou si vous conduisez un véhicule de location ou avez emprunté un véhiculedépourvu de système de navigation, mieux vaut savoir lire une carte ordinaire etcomprendre les signaux de signalisation routière, même si vous employez géné-ralement un GPS.

L’enregistreur de macro de Microsoft Office Excel 2007 est comme un système denavigation GPS. Il peut vous fournir de précieuses informations sur la façon deconcevoir les macros que vous écrivez. Il peut toutefois parfois être indisponible,si bien qu’il est important de savoir comment tirer profit des autres sources d’aide,comme l’Explorateur d’objets, les Auto Lists et l’Aide. Vous pourrez ainsi atteindrevotre but même si l’enregistreur de macro n’est pas présent pour vous guider.

Vous allez employer dans ce chapitre VBA pour travailler avec divers objets gra-phiques dans Excel 2007. Parmi les objets graphiques figurent les formes, lesobjets WordArt, les graphiques et même les nouvelles mises en forme évoluéescomme les dégradés disponibles pour des cellules ordinaires. Vous allez employercomme référence l’enregistreur de macro, mais apprendrez également à travaillersans l’enregistreur lorsque celui-ci est indisponible.

Page 206: Excel 2007 VBA

186 Chapitre 6 Objets de graphisme

Objets de graphismeLes objets graphiques flottent sur une couche située au-dessus de la grille de lafeuille de calcul. Les capacités graphiques d’Excel ont toujours été excellentes et,avec Excel 2007, virent à l’exceptionnel. Vous pouvez en pratique employer Excelcomme un programme graphique complet. Malheureusement, l’enregistreur demacro ne fonctionne pas encore avec ces nouveaux objets forme améliorés, sibien que cette section va constituer un excellent exercice pour vos talents d’explo-rateur. L’enregistreur de macro fonctionne heureusement avec certaines des misesen forme avancées de feuille de calcul et peut procurer des indices pour vos aven-tures en terrain non cartographié.

Emploi des cellules de feuille de calcul comme quadrillage de dessinDe nombreux programmes graphiques disposent d’un dispositif « ajuster à lagrille » pour aider le concepteur à aligner parfaitement les objets. Il est générale-ment possible d’ajuster l’échelle de la grille. Excel possède également un dispositifd’ajustement à la grille : c’est la grille des cellules de la feuille de calcul. Lors dutravail avec les graphiques, il est utile de pouvoir contrôler la taille de la grille etemployer celle-ci pour aligner des objets.

1. Dans Excel, activez l’onglet Shapes du classeur Chapitre06, puis, dans lafenêtre Exécution de l’éditeur Visual Basic, saisissez Cells.RowHeight = 72et appuyez sur ENTRÉE.

La hauteur de toutes les lignes de la feuille de calcul se modifie en environ2,5 cm, exactement un pouce. La hauteur d’une ligne est exprimée en points,et un pouce contient exactement 72 points.

2. Saisissez Cells.ColumnWidth = 13 et appuyez sur ENTRÉE.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

SERVEZ-VOUS du classeur Graphics.xlsx situé dans le dossier Docu-ments\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer Graphics.xlsx sous le nom Chapitre06.xlsm dans le dossierapprouvé créé au Chapitre 1. OUVREZ le classeur Chapitre06.xlsm.

Page 207: Excel 2007 VBA

Objets de graphisme 187

La largeur de toutes les colonnes de la feuille active se modifie en 2,5 cm (unpouce). Vous spécifiez la largeur d’une colonne en employant la largeurmoyenne du caractère zéro (0) dans la police standard Arial 10-point : lapolice employée par le style de cellule Normal. Dans cette police,13 caractères zéro (0) occupent un pouce.

3. Placez le point d’insertion dans le mot ColumnWidth, puis appuyez sur latouche F1.

La rubrique d’aide pour la propriété ColumnWidth d’un objet Range appa-raît. Elle détaille les qualités uniques de cette propriété. Comme Colum-nWidth est une propriété d’un objet Range, vous voyez en bas de la page unlien vers la liste complète des membres de l’objet Range.

4. Cliquez sur le lien Membres de l’objet Range.

Page 208: Excel 2007 VBA

188 Chapitre 6 Objets de graphisme

Une page apparaît avec les descriptions et des liens vers toutes les métho-des et propriétés disponibles pour un objet Range. Chaque objet du modèleobjet Excel possède une page de membres analogue.

L’Aide est un outil important, surtout lorsque vous vous trouvez en territoireinconnu. Une des caractéristiques agréables de l’Aide est la liste annotée desmembres d’un objet. Les Auto Lists ou l’Explorateur d’objets peuvent vous donnerla liste des membres, mais il est plus facile de s’informer sur une nouvelleméthode ou propriété depuis l’Aide.

Ajout d’un dégradé à une celluleLes cellules Excel contenaient traditionnellement des couleurs unies. Excel 2007permet d’ajouter des fonds dégradés et d’autres mises en forme spéciales aux cel-lules. Pouvoir contrôler la mise en forme avancée des cellules est utile en soi, maisenregistrer et créer des dégradés de cellule peut également vous aider à com-prendre comment ajouter des dégradés à d’autres formes.

1. Dans Excel, commencez à enregistrer une macro nommée zDegradeCel-lule. Effectuez un clic droit sur la cellule B1, puis cliquez sur Format de cel-lule. Dans l’onglet Remplissage, cliquez sur Motifs et textures. Dans Typede dégradé, sélectionnez Vertical. Laissez la première Variante sélection-née, puis cliquez deux fois sur OK.

Page 209: Excel 2007 VBA

Objets de graphisme 189

2. Arrêtez l’enregistreur et examinez la macro. Elle devrait ressembler à ceci :

Sub rDegradeCellule() Range("B1").Select With Selection.Interior .Pattern = xlPatternLinearGradient .Gradient.Degree = 0 .Gradient.ColorStops.Clear End With With Selection.Interior.Gradient.ColorStops.Add(0) .ThemeColor = xlThemeColorDark1 .TintAndShade = 0 End With With Selection.Interior.Gradient.ColorStops.Add(1) .ThemeColor = xlThemeColorAccent1 .TintAndShade = 0 End WithEnd Sub

La partie capitale de cette macro est l’affectation de la propriété Pattern.Vous pouvez parvenir au même résultat en une seule étape.

Voir aussi Pour plus de détails sur les thèmes de couleur, reportez-vous à la section« Enregistrement d’une macro pour personnaliser le style d’un tableau croisédynamique », au Chapitre 5, « Objets de données ».

3. Sélectionnez la cellule B2. Dans l’éditeur Visual Basic, créez le squelette demacro suivant et appuyez trois fois sur F8 pour initialiser la variable.

Sub DegradeCellule() Dim myInterior as Interior Set myInterior = Selection.InteriorEnd Sub

Lorsque vous déclarez une variable objet, vous pouvez le faire au niveau leplus utile. Lorsque vous devez travailler essentiellement avec des cellules,vous pouvez créer une variable objet Range. Si vous travaillez essentielle-ment avec un objet subordonné, vous pouvez simplifier le reste de la macroen créant une variable objet spécifique à l’objet de niveau inférieur.

Page 210: Excel 2007 VBA

190 Chapitre 6 Objets de graphisme

4. Dans la fenêtre Exécution, saisissez myInterior.Pattern = xlPatternLi-nearGradient et appuyez sur ENTRÉE.

La cellule B2 adopte le même dégradé que la cellule B1. L’enregistreur incor-pore de nombreuses instructions qui se bornent à spécifier des propriétéspar défaut. Heureusement, ces instructions vous en apprennent beaucoupsur le fonctionnement d’un dégradé. L’une d’entre elles comporte une pro-priété nommée ColorStops. Comme avec la plupart des collections, vouspouvez spécifier un unique élément de la collection.

5. Saisissez myInterior.Gradient.ColorStops(1).ThemeColor = xlThemeColorAccent6 et appuyez sur ENTRÉE.

Le côté gauche du dégradé passe du blanc à l’orange. La boîte de dialogueMotifs et textures ne permet de choisir qu’un dégradé à deux couleurs, maisColorStops est une collection que vous pouvez compléter.

6. Saisissez myInterior.Gradient.ColorStops.Add 0.75 et appuyez sur ENTRÉE.

Une nouvelle bande blanche apparaît environ aux trois quarts du bord droitde la cellule. La collection ColorStops possède désormais trois éléments.Lorsque vous ajoutez un nouvel élément à la collection ColorsStops, vousdevez lui attribuer une position comprise entre 0 et 1. Les éléments de lacollection sont ensuite triés par position, si bien que pour accéder au nouvelélément vous employez comme index 2 et non 3.

7. Saisissez MyInterior.Gradient.ColorStops(2).Position = 0.25 et appuyezsur ENTRÉE.

La bande blanche se déplace vers le premier quart de la cellule.

Page 211: Excel 2007 VBA

Objets de graphisme 191

8. Appuyez sur F5 pour arrêter la macro. Copiez le contenu de la fenêtre Exé-cution et collez-le dans la macro DegradeCellules. Dans Excel, sélectionnezla cellule B3, puis, dans Visual Basic, appuyez plusieurs fois sur F8 pour tes-ter la macro.

9. Dans Excel, sélectionnez la plage C1:E2, puis, dans Visual Basic, appuyez surF5 pour tester la macro.

Chaque cellule est mise en forme individuellement. Dans Excel, les mises enformes comme un dégradé sont appliquées cellule après cellule. La macroterminée devrait ressembler à ceci:

Sub DegradeCellule() Dim myInterior As Interior Set myInterior = Selection.Interior myInterior.Pattern = xlPatternLinearGradient myInterior.Gradient.ColorStops(1).ThemeColor = xlThemeColorAccent6 myInterior.Gradient.ColorStops.Add (0.75) myInterior.Gradient.ColorStops(2).Position = 0.25End Sub

L’enregistreur de macro peut vous aider à comprendre les méthodes et propriétésqui permettent de gérer les dégradés de cellule. Vous pouvez toutefois accomplirbien plus de choses à l’aide d’une instruction de macro qu’avec l’interface utilisa-teur, si bien que certaines possibilités n’apparaîtront jamais dans une macro enre-gistrée. Par exemple, il est impossible dans l’interface utilisateur de créer desétapes multicolores dans le dégradé d’une cellule, de même que vous ne pouvezdéfinir la position d’une étape du dégradé. Une macro permet d’accomplir lesdeux.

Astuce Avec Excel 2007, la mise en forme conditionnelle fonctionne de façonsimilaire aux dégradés. Chaque mise en forme conditionnelle appartient à une col-lection que vous pouvez manipuler. En appliquant une mise en forme condition-nelle lors de l’enregistrement d’une macro, vous pourrez découvrir les noms despropriétés critiques.

Page 212: Excel 2007 VBA

192 Chapitre 6 Objets de graphisme

Ajout d’une forme remplie d'un dégradéUne cellule est rigidement rectangulaire. Lorsque vous appliquez un dégradé à unensemble de cellules, un dégradé individuel s’applique à chaque cellule. Lerecours à des formes permet de créer des graphismes avec plus de souplesse. Lesméthodes et propriétés de création d’un objet Shape diffèrent quelque peu decelles d’un objet Range, mais présentent suffisamment de similitudes pour auto-riser le recours à l’Aide et aux autres techniques pour en découvrir les spécificités.En employant des instructions de macro pour créer un objet Shape rectangulairepuis lui appliquer la mise en forme donnée à la cellule de feuille de calcul, vouspouvez comparer la façon dont un dégradé fonctionne avec une forme avec samise en œuvre dans une plage.

1. Créez le squelette de macro suivant, puis appuyez deux fois sur F8 pour ini-tialiser les variables.

Sub DegradeForme() Dim myShapes as Shape Dim myFill as FillFormatEnd Sub

2. Dans la fenêtre Exécution, saisissez Set myShape = Sheet1.Shapes.AddShape( msoShapeRectangle, 0, 0, 72, 72) et appuyez sur ENTRÉE.

Un rectangle apparaît, qui remplit exactement la cellule A1. Le nom Sheet1est le nom de code de la feuille de calcul Shapes. L’emploi de ce nom decode permet d’obtenir l’aide des Auto Lists tandis que vous construisez l’ins-truction. Si vous voulez que la macro crée une forme sur une feuille de calculquelconque, remplacez ce nom de code par ActiveSheet après avoir terminéle test de la macro. Les valeurs top, left, height et width d’une forme sonttoutes spécifiées en points (à raison de 72 points dans un pouce, ou d’envi-ron 29 points par centimètre).

3. Saisissez Set myFill = myShape.Fill et appuyez sur ENTRÉE.

Astuce Pour identifier le nom de code de la feuille de calcul active, saisissez dansla fenêtre Exécution ?ActiveSheet.CodeName et appuyez sur ENTRÉE.

Page 213: Excel 2007 VBA

Objets de graphisme 193

Le nom d’un objet diffère parfois du nom de la propriété qui renvoie cetobjet. Ici, la propriété Fill renvoie un objet FillFormat. Le FillFormat d’uneforme est analogue à l’objet Interior d’une plage.

4. Saisissez myFill.TwoColorGradient msoGradientVertical,1 et appuyez surENTRÉE.

La forme se remplit d’un dégradé vertical semblable à celui de la cellule defeuille de calcul, mais avec des couleurs inversées. Dans une plage, vousajoutez un dégradé en affectant une valeur à la propriété Pattern. Avec uneforme, vous exécutez une méthode pour obtenir le même effet.

5. Saisissez myFill.GradientStops(1).Color.ObjectThemeColor = msoThemeColorAccent6 et appuyez sur ENTRÉE.

Le côté gauche du rectangle adopte la même couleur que le côté gauche dela cellule, orange avec le thème par défaut. Vous spécifiez avec une plage lapropriété ColorStops pour définir les parties du dégradé. Le nom de cettepropriété est assez proche de GradientStops pour que, simplement à l’aidedes Auto Lists, vous puissiez facilement identifier la nouvelle propriété. Uneforme permet également de diviser Color en un autre objet et d’employerObjectThemeColor à la place de simplement ThemeColor.

6. Saisissez myFill.GradientStops(2).Color.ObjectThemeColor = msoThemeColorAccent1 et appuyez sur ENTRÉE.

Le côté droit du rectangle adopte la même couleur que le côté droit de lacellule, bleu dans le thème par défaut.

7. Saisissez myFill.GradientStops.Insert rgbWhite,0.75 et appuyez surENTRÉE.

Une bande blanche apparaît aux trois-quarts vers la droite du rectangle.Avec une cellule, vous aviez employé la méthode Add pour ajouter unenouvelle valeur à la collection ColorStops. Vous employez avec une forme laméthode Insert pour ajouter une valeur à la collection GradientStops.

Astuce Il existe plusieurs façons de découvrir l’objet renvoyé par une propriété.Pour vous servir de l’Aide, cliquez sur le nom de la propriété, dans une instructionou dans l’Explorateur d’objets, puis appuyez sur F1 pour voir la rubrique consacréeà la propriété. Celle-ci renferme un lien vers l’objet renvoyé par la propriété, tandisque la rubrique de l’objet contient un lien vers la liste annotée des membres del’objet. Si un lien de l’Aide est rompu, essayez de saisir le nom de l’objet dans lazone Rechercher. En outre, vous pouvez saisir la fonction TypeName accompagnéede l’expression qui emploie la propriété dans la fenêtre Exécution. Par exemple,pour découvrir le nom de l’objet renvoyé par la propriété Fill d’une forme nomméemaForme, vous pourriez saisir ?TypeName(maForme.Fill).

Page 214: Excel 2007 VBA

194 Chapitre 6 Objets de graphisme

8. Saisissez myFill.GradientStops(3).Position = 0.25 et appuyez sur ENTRÉE.

La bande blanche se déplace vers la gauche. Avec une cellule, les étapescolorées sont triées selon leur position dans le dégradé. Avec une forme,elles sont triées selon leur ordre d’ajout dans la collection.

Le dégradé du rectangle ressemble maintenant énormément au dégradé dela cellule. Comme il s’agit d’une forme, vous pouvez toutefois modifier tota-lement son aspect.

9. Saisissez myShape.AutoShapeType = msoShapeRightArrow et appuyezsur ENTRÉE pour transformer le rectangle en une flèche pointant vers ladroite.

Vous pouvez choisir parmi près de 200 formes ! Des formes peuvent être placéessur votre feuille de calcul pour une raison quelconque : ajouter de l’intérêt, attirerl’attention sur une valeur de cellule, constituer des boutons originaux pour lancerdes macros ou pour créer un logo d’entreprise sophistiqué.

Astuce Lorsque vous créez une nouvelle forme sur une feuille de calcul, Excel luiattribue un nom par défaut, généralement quelque chose comme Rectangle 2 ouOvale 5. Vous pouvez voir le nom de la forme dans la zone Nom, au gauche de laBarre de formule. Vous pouvez également vous servir de la zone Nom pour attri-buer un nouveau nom à une forme. Lorsque vous faites référence à la forme dansune macro, vous pouvez rendre celles-ci plus lisibles et moins sujettes aux erreursen modifiant le nom des formes en quelque chose de significatif.

Page 215: Excel 2007 VBA

Objets de graphisme 195

Référence à une forme sélectionnéeLes premières versions d’Excel étaient dépourvues de formes, mais disposaienttoutefois de quelque chose nommé objets graphiques (drawing objects). Les for-mes ont été développées comme objets graphiques pouvant être employés danstoutes les applications Microsoft Office et sont bien plus puissantes que leurs pré-décesseurs. Les formes de la version 2007 de la famille Microsoft Office sontencore plus puissantes que celles des versions précédentes.

Les anciens objets graphiques possédaient déjà un imposant ensemble d’objets.Pour maintenir une compatibilité descendante, Excel n’a pas supprimé les anciensDrawingObjects. Ils sont toujours là, mais masqués. Vous pourriez parfois surpren-dre des vestiges de ces anciens objets. Une de ces occasions est lors du travailavec la propriété Selection, pour faire référence à l’objet actuellement sélectionné.Lorsque vous saurez comment affecter l’objet actuellement sélectionné à unevariable objet Shape, vous n’aurez plus beaucoup à vous préoccuper des anciensobjets graphiques.

1. Dans Excel, sélectionnez une forme : celle créée dans la section précédentesera parfaite. Créez ensuite le squelette de macro suivant dans Visual Basic,puis appuyez deux fois sur F8 pour initialiser la variable.

Sub SélectionForme() Dim s As ShapeEnd Sub

2. Dans la fenêtre Exécution, saisissez Set s = Selection et appuyez sur Entrée.

Vous obtenez un message d’erreur qui stipule « Incompatibilité de type ».Lors de sa création, vous avez affecté l’objet à une variable Shape. Pourquoicela est-il donc impossible maintenant ?

3. Saisissez ?TypeName(Selection) et appuyez sur Entrée.

Le mot Rectangle apparaît. Tous les AutoShapeTypes, à l’exception de quel-ques rares types de formes fondamentales, appartiennent à la classe objetRectangle. Si vous recherchez toutefois la classe Rectangle dans l’Explorateurd’objets, vous ne la trouverez pas. En plaçant le point d’insertion sur le motRectangle et en appuyant sur F1, vous obtenez un message générique quine parle aucunement de Rectangle.

4. Placez le point d’insertion dans le mot Shape (dans la déclaration de varia-ble), et appuyez sur F1. Lorsque vous êtes invité à préciser, laissez sélec-tionné Shape (Objet) et cliquez sur Aide.

Page 216: Excel 2007 VBA

196 Chapitre 6 Objets de graphisme

Cette rubrique d’aide vous explique que, pour travailler avec des formes dela sélection, vous devez employer une collection ShapeRange.

5. Descendez jusqu’en bas de la rubrique, puis cliquez sur le lien vers la rubri-que ShapeRange, objet. Descendez jusqu’en bas, jusqu’au sous-titre Ren-voi de toutes ou de quelques formes sélectionnées d’un document.

Cette section propose un exemple d’emploi de ShapeRange avec la sélec-tion. L’objet ActiveWindow du début n’a aucun effet.

L’explication recommande d’employer la propriété ShapeRange de l’objetSelection. Il n’existe toutefois pas d’objet Selection : Selection est une pro-priété qui renvoie le type d’objet actuellement sélectionné. L’explication dela rubrique d’aide passe simplement sous silence l’existence de l’objet Rec-tangle.

6. Dans Visual Basic, appuyez deux fois sur F2 pour afficher l’Explorateurd’objets. Effectuez un clic droit dans la liste des classes et cliquez sur Affi-cher les membres masqués. Sélectionnez ensuite sur la gauche la classeRectangle et sur la droite la propriété ShapeRange.

Dépannage Si vous n’êtes pas connecté à l’Internet, vous pouvez tout de mêmeaccéder à l’aide sur votre ordinateur. Dans l’Aide Excel, cliquez sur la flèche du bou-ton Rechercher et cliquez sur Aide du développeur hors connexion, en bas de laliste (dans la section Contenu de cet ordinateur).

Page 217: Excel 2007 VBA

Objets de graphisme 197

7. Dans la fenêtre Exécution, saisissez Set s = Selection.ShapeRange(1) etappuyez sur Entrée.

C’est fondamentalement la même expression que dans la rubrique d’aide, etelle fonctionne. Si vous prétendez que Selection est un objet, comme le sug-gère la rubrique d’aide, vous pouvez alors considérer ShapeRange commeune propriété de cet objet imaginaire.

8. Saisissez s.AutoShapeType = msoShapePentagon et appuyez sur Entréepour confirmer que la forme sélectionnée est correctement affectée à lavariable.

9. Appuyez sur F5 pour arrêter la macro.

La seule raison pour devoir connaître l’existence des objets masqués est que sélec-tionner un objet dans l’interface utilisateur puis saisir ?TypeName(Selection) dansla fenêtre Exécution est une façon très utile de déterminer la classe d’objet appro-prié pour une variable. Connaître les objets masqués peut également rendre lerésultat moins troublant.

Classes objets apparentées aux formesIl est facile de confondre les trois classes objet visibles relatives aux formes.

L’objet Shapes est la collection de tous les objets Shape d’une feuille de calcul.Pour faire référence à l’objet Shapes, vous employez la propriété Shapes d’unefeuille de calcul. Comme avec la plupart des collections, vous pouvez spécifierun unique élément de la collection à l’aide de son nom ou de son numérod’index. Un unique élément d’une collection Shapes est un objet Shape (ausingulier).

Page 218: Excel 2007 VBA

198 Chapitre 6 Objets de graphisme

Un objet Shape est le mécanisme primaire d’interaction avec une forme surune feuille de calcul. Vous pouvez le déplacer, modifier sa taille, le renommer,le mettre en forme et même le supprimer.

Un objet ShapeRange est comme un objet Shape, si ce n’est qu’il peut renfer-mer plusieurs formes. En d’autres termes, c’est une collection. Pour créer uneplage de formes à partir d’un objet Shapes, vous employez la propriété Rangecombinée avec la fonction Visual Basic Array. La syntaxe est identique à celleemployée pour la sélection de plusieurs feuilles de calculs à l’aide de la fonc-tion Array combinée avec la propriété Worksheets. La fonction Array trans-forme une liste d’éléments en l’unique argument nécessaire à la propriétéRange.

Voir aussi Pour plus d’informations sur l’emploi de la fonction Array avec des feuillesde calcul, reportez-vous à la section « Manipulation de plusieurs feuilles de calcul » duChapitre 3, « Classeurs et feuilles de calcul ».

Lorsque vous voulez modifier plusieurs formes, servez-vous d’une plage deformes. Pour ne modifier qu’une forme, il est plus simple de n’employer d’unobjet Shape, même si une plage peut ne comporter qu’un élément. Quel-ques-unes des propriétés d’une unique forme ne fonctionnent pas avec uneplage de formes. Par exemple, il est superflu de donner un nom à un ensem-ble arbitraire de formes, si bien que la propriété Name génère un messaged’erreur si vous l’employez avec une plage de formes qui contient plusieursformes.

Les formes permettent de créer des effets graphiques très puissants. Bien dif-férencier les différents types d’objets peut toutefois parfois être délicat. Voiciun résumé :

● Objet collection Shapes. Servez-vous de l’objet collection Shapes poursélectionner toutes les formes d’une feuille de calcul, pour accéder à uneunique forme ou pour ajouter une nouvelle forme. Vous ne pouvez appli-quer qu’une mise en forme limitée à l’ensemble de la collection Shapes.

● Objet Shape. Servez-vous de l’objet Shape pour manipuler une uniqueforme.

● Objet collection ShapeRange. Servez-vous de l’objet ShapeRange pourmanipuler simultanément plusieurs formes.

Emploi d’une forme automatique pour créer un logoExcel propose une très grande collection de formes que vous pouvez insérer surune feuille de calcul. Ce qui les rend toutefois remarquables est le point auquel

Page 219: Excel 2007 VBA

Objets de graphisme 199

vous pouvez améliorer et modifier ces formes. Vous pouvez même leur ajouter dutexte et mettre celui-ci en forme avec la même souplesse que pour la forme elle-même.

1. Dans Excel, activez la feuille de calcul Logo, actuellement vierge. Ensuite,dans Visual Basic, créez le squelette de macro suivant et appuyez deux foissur F8 pour initialiser les variables.

Sub MakeLogo() Dim s As Shape Dim tf As TextFrame2 Dim tr As TextRange2 Dim sf As ShadowFormatEnd Sub

Certaines des classes objet peuvent vous être inconnues, mais il ne s’agit quede sous-objets pour des parties détaillées de la mise en forme de la forme.TextFrame2 et TextRange2 possèdent un 2 à la fin car il s’agit de nouvellesversions améliorées d’objets existants. Les anciennes macros qui accèdentaux objets TextFrame ou TextRange, désormais masqués, fonctionneronttoujours, tandis que les nouvelles macros peuvent tirer profit des nouvellescapacités.

2. Saisissez les instructions suivantes dans la fenêtre Exécution.

Set s = Main.Shapes.AddShape(msoShapeUpArrowCallout, 0, 0, 72, 72)s.SelectSet tf = s.TextFrame2Set tr = tf.TextRangeSet sf = tr.Font.Shadows.Name = "Logo"

La première instruction crée une nouvelle forme, comme vous aviez créé unnouveau rectangle plus tôt dans ce chapitre. La taille et l’emplacement sontsans importance car vous allez les aligner sur les frontières de cellules dans

Astuce La macro MakeLogo est proposée dans le fichier MakeLogo.txt des fichiersd’accompagnement. Vous pouvez la copier dans un module et la parcourir si vousle souhaitez. Les Auto Lists rendent toutefois très simple la saisie de ses instructionset peuvent vous aider à comprendre son fonctionnement. À tout moment, pen-dant l’exécution des instructions, vous pouvez basculer vers l’interface utilisateur ety examiner les propriétés correspondantes.

Page 220: Excel 2007 VBA

200 Chapitre 6 Objets de graphisme

des instructions ultérieures. L’instruction Select facilite simplement l’affi-chage de la forme que vous modifiez. Vous n’en aurez pas besoin dans lamacro achevée. Les autres instructions affectent des références à des sous-objets relatifs à la mise en forme. L’instruction finale se borne à attribuer unnom à l’objet, au cas où vous voudriez y faire référence dans une autremacro.

3. Saisissez les instructions suivantes dans la fenêtre Exécution.

s.Left = Range("C6").Lefts.Top = Range("C6").Tops.Width = Range("C:F").Widths.Height = Range("6:15").Height

Ces instructions montrent comme il est facile d’aligner une forme sur lafeuille de calcul. Remarquez que les propriétés Left, Top, Width et Heightd’une plage sont en lecture seule : vous devez employer d’autres propriétésou méthodes pour modifier leurs valeurs. Elles sont toutefois très utiles pouraligner des formes.

Vous disposez désormais d’une forme fondamentale sur la feuille de calcul.Avant de poursuivre, vous pourriez souhaiter explorer cette forme dansExcel. Elle possède quatre triangles jaunes nommés poignées de redimen-sionnement. Celles-ci permettent d’ajuster la taille relative des différentesportions de la forme, ce qui transforme les centaines de formes disponiblesen millions de variantes possibles. En déplaçant les poignées de redimen-sionnement depuis Excel, grâce à la propriété Adjustments, vous compren-drez mieux ce qu’effectuent les instructions suivantes de la macro.

4. Saisissez les instructions suivantes dans la fenêtre Exécution.

s.Adjustments(1) = 1.2s.Adjustments(2) = 0.6s.Adjustments(3) = 0.15s.Adjustments(4) = 0.7

Page 221: Excel 2007 VBA

Objets de graphisme 201

Une forme Up Arrow Callout possède quatre poignées deredimensionnement : la première ajuste la largeur de la tige de la flèche, ladeuxième la largeur de la tête de flèche, la troisième la hauteur de la tête deflèche et la quatrième la hauteur du corps rectangulaire principal. Différen-tes formes possèdent des poignées différentes. La meilleure façon d’identi-fier les valeurs appropriées est simplement d’essayer.

5. Dans Excel, effectuez un clic droit sur la forme, puis cliquez sur Format de laforme. Saisissez ensuite les instructions suivantes dans la fenêtre Exécution.

s.Line.Visible = msoFalses.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2s.Fill.ForeColor.TintAndShade = -0.3s.Fill.Transparency = 0.25

Page 222: Excel 2007 VBA

202 Chapitre 6 Objets de graphisme

Ces instructions suppriment la bordure et modifient la couleur de remplis-sage. Une transparence supérieure à 0 permet de voir la grille de la feuille decalcul à travers la forme. La boîte de dialogue Format de la forme peut restervisible pendant que vous exécutez des instructions de macro, si bien quevous pouvez immédiatement voir l’effet de l’instruction.

6. Saisissez les instructions suivantes dans la fenêtre Exécution.

tr = "Lucerne" & vbCrLf & "Publishing"tr.Font.Size = 28tr.Font.Bold = msoTrue

Ces instructions ajoutent le nom de l’entreprise à la forme et rendent celui-ci large et gras. vbCrLf est une constante spéciale de Visual Basic qui signifieCarriage Return Line Feed : la description d’une nouvelle ligne lors del’invention de Visual Basic (retour chariot, saut de ligne). Les caractères éper-luette assemblent les différentes parties du nom, ce qui permet de placer lanouvelle ligne au milieu du nom.

7. Dans Excel, effectuez un clic droit au milieu du texte, puis cliquez sur Effetsde mise en forme d’un texte. Saisissez ensuite les instructions suivantesdans la fenêtre Exécution.

tr.Font.Spacing = 2tf.VerticalAnchor = msoAnchorBottomtf.MarginBottom = 20

Page 223: Excel 2007 VBA

Objets de graphisme 203

L’espacement des caractères (Font.Spacing) appartient à la boîte de dialo-gue Police, qui ne peut rester ouverte tandis que vous exécutez des instruc-tions de macro. L’espacement par défaut est 0, ce qui signifie ni écartementni rapprochement. Alignement apparaît sur la boîte de dialogue Effets demise en forme d’un texte, qui peut rester ouverte pendant l’exécution d’ins-tructions. Pour centrer du texte dans une forme irrégulière, la meilleureapproche consiste à choisir un côté adéquat auquel ancrer le texte, puis àajuster la marge selon les besoins pour obtenir un aspect centré. Ici, le basest un bon point de référence. Vous spécifiez dans la macro les tailles enpoints, mais la boîte de dialogue les affiche en centimètres.

8. Dans Excel, cliquez sur la page Contour du texte de la boîte de dialogueEffets de mise en forme d’un texte. Saisissez ensuite les instructions sui-vantes dans la fenêtre Exécution.

tr.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2tr.Font.Fill.ForeColor.TintAndShade = -0.6tr.Font.Line.Visible = msoTruetr.Font.Line.ForeColor.ObjectThemeColor = msoThemeColorAccent2tr.Font.Line.ForeColor.TintAndShade = 0.3

Ces instructions vous donnent un avant goût des mises en forme qu’il estpossible d’appliquer à une police, indépendamment de son conteneurforme. Comme l’objet Font Format est distinct de l’objet Shape Format, ilpeut employer les mêmes propriétés Fill et Line que celles de la forme elle-même. Par conséquent, vous pouvez appliquer la plus grande partie de ceque vous avez appris à propos de la mise en forme de la forme pour mettreen forme la police.

9. Dans Excel, cliquez sur la page Ombre de la boîte de dialogue Effets demise en forme d’un texte. Saisissez ensuite les instructions suivantes dansla fenêtre Exécution.

sf.Style = msoShadowStyleOuterShadowsf.ForeColor.ObjectThemeColor = msoThemeColorLight1sf.OffsetX = 5sf.OffsetY = 5sf.Blur = 8

Page 224: Excel 2007 VBA

204 Chapitre 6 Objets de graphisme

Ces instructions montrent ce que vous pouvez faire avec une police ombrée.Vous devez créer l’ombre, lui affecter une couleur puis la décaler horizonta-lement et verticalement. L’ajout d’un effet de flou la rend plus naturelle.

10. Dans Excel, effectuez un clic droit sur la forme, cliquez sur Format de laforme, puis cliquez sur Format 3D. Saisissez ensuite les instructions suivan-tes dans la fenêtre Exécution.

s.ThreeD.BevelTopDepth = 12s.ThreeD.BevelTopInset = 24s.ThreeD.BevelTopType = msoBevelSoftRounds.ThreeD.PresetMaterial = msoMaterialMetal2s.ThreeD.PresetLighting = msoLightRigFlood

Ces instructions vous donnent un aperçu de la mise en forme 3D. Mêmesans employer l’enregistreur de macro, vous pouvez voir les possibilités enexpérimentant cette mise en forme depuis l’interface utilisateur. Vous pou-vez appliquer un effet 3D à la forme (à l’aide de la boîte de dialogue Formatde la forme) ou au texte (grâce à la boîte de dialogue Effets de mise enforme d’un texte). Après avoir ajouté des effets 3D à une forme, vous pouvezjouer sur des options d'éclairage et de transparence qui n’étaient disponi-bles il y a encore peu que sur des outils graphiques spécialisés.

11. Dans Excel, cliquez sur la page Rotation 3D de la boîte de dialogue Formatde la forme. Saisissez s.ThreeD.RotationX = 40 dans la fenêtre Exécution,puis appuyez sur ENTRÉE pour voir le logo avec une orientation 3D différente.Vous pouvez également faire pivoter la forme selon les axes Y et/ou Z.

Page 225: Excel 2007 VBA

Objets de graphisme 205

12. Appuyez sur F5 pour arrêter la macro. Copiez ensuite le contenu de la fenê-tre Exécution dans la macro, en remplaçant Main par ActiveSheet. Créezune nouvelle feuille de calcul dans Excel et testez la macro.

Ce logo vous procure un bon aperçu des mises en forme qu’il est possible d’appli-quer à une forme, ainsi que comment créer les instructions dans une macro. Lespropriétés du modèle objet correspondent étroitement aux options de l’interfaceutilisateur. Vous pourriez même découvrir dans le modèle objet des propriétés quicorrespondent à des options que vous n’aviez pas remarquées dans l’interface uti-lisateur.

Voir aussi La macro MakeLogo a été employée pour créer le logo animé employé dansl’application Enterprise Information System (EIS) de l’Annexe.

Emploi de regroupement de formes pour créer des boutons de macroIl est possible de regrouper plusieurs formes. Par exemple, sur la page Map duclasseur Chapitre06, vous voyez une carte qui présente les états de l’Ouest desÉtats-Unis où Lucerne Publishing commercialise ses produits.

Page 226: Excel 2007 VBA

206 Chapitre 6 Objets de graphisme

La carte se compose d’un groupe de formes, à raison d’une forme par état. Vouspouvez depuis une macro faire référence à chaque composant individuel dugroupe. Chaque état peut même se comporter comme un bouton qui exécuteune macro.

1. Dans Excel, glissez déposez vers la droite l’onglet de la feuille de calcul Map.Tandis que vous relâchez le bouton de la souris, appuyez sur CTRL pour créerune copie de cette feuille de calcul.

2. Dans Visual Basic, créez le squelette de macro suivant.

Sub BoutonEtat()MsgBox "Hello"End Sub

Une forme d’état va exécuter cette macro.

3. Créez le squelette de macro suivant, puis appuyez deux sur F8 pour initiali-ser la variable.

Sub CréerBoutonsCarte()Dim s As ShapeEnd Sub

4. Saisissez les instructions suivantes dans la fenêtre Exécution.

myNumber = 4myName = "Washington"myCaption = "WA"myColor = 6

Ces attributs sont propres à l’état de Washington. Washington est le qua-trième élément du groupe. Seuls des essais successifs permettent de déter-miner l’ordre des éléments d’un groupe. Après avoir écrit la macro, vouspouvez en modifier les valeurs et l’exécuter à nouveau pour appliquer lamise en forme adéquate à un autre état.

5. Saisissez les instructions suivantes dans la fenêtre Exécution.

Set s = ActiveSheet.Shapes(1).GroupItems(myNumber)s.Selects.Name = myName

Astuce La macro MakeMapButtons est proposée dans le même dossier queMakeMap.txt. Vous pouvez la copier dans un module et la parcourir pas à pas, maisles Auto Lists facilitent beaucoup la saisie des instructions et vous aident à com-prendre le fonctionnement des objets. Cette macro a été employée pour créerl’interface utilisateur ide l’application Enterprise Information System (EIS) del’Annexe.

Page 227: Excel 2007 VBA

Objets de graphisme 207

La carte de l’état de Washington est sélectionnée et le nom dans la zone detexte Nom passe du nom par défaut à Washington.

Un objet Shape possède une propriété GroupItems qui renvoie la collectionde toutes les formes du groupe. Vous pouvez employer un nombre pourfaire référence à un unique élément de la collection. L’élément regroupén’appartient pas à la collection Shapes de la feuille de calcul, mais à la col-lection GroupItems de la forme qui constitue ce groupe. L’instruction Selectpermet de découvrir l’état référencé. Vous pouvez omettre cela de la macrofinale. Rien n’impose d’attribuer un nom aux formes individuelles, mais pro-céder ainsi facilite par la suite toute référence à un état depuis une autremacro. Si vous modifiez le nom, vous pouvez le voir dans la zone de texteNom d’Excel.

6. Saisissez les instructions suivantes dans la fenêtre Exécution.

s.Fill.ForeColor.ObjectThemeColor = myColors.ThreeD.BevelTopDepth = 6

L’état de Washington change de couleur et adopte un aspecttridimensionnel : comme un bouton.

Vous pouvez modifier les propriétés de couleur et 3D d’une forme regrou-pée, comme avec une forme simple. Les formes possèdent une propriétéThreeD qui permet d’accéder à un grand nombre d’effets de mise en formetridimensionnels, dont BevelTopDepth. Fixer la propriété BevelTopDepth dela forme accentue sa ressemblance avec un bouton.

7. Saisissez les instructions suivantes dans la fenêtre Exécution.s.TextFrame2.TextRange = myCaptions.TextFrame2.HorizontalAnchor = msoAnchorCenters.TextFrame2.VerticalAnchor = msoAnchorMiddle

Page 228: Excel 2007 VBA

208 Chapitre 6 Objets de graphisme

Lorsque vous ajoutez pour la première fois du texte à une forme, celui-ci estattaché au coin supérieur gauche. Les propriétés HorizontalAnchor et Verti-calAnchor permettent de centrer le texte dans la forme. Comme la formeWashington est pratiquement rectangulaire, centrer le texte marche parfai-tement. Il sera nécessaire pour certains états d’ajuster manuellementl’emplacement du texte pour le faire paraître centré.

8. Saisissez les instructions suivantes dans la fenêtre Exécution.

s.TextFrame2.TextRange.Font.Size = 20s.TextFrame2.TextRange.Font.Bold = msoTrues.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorLight1s.Fill.OneColorGradient msoGradientHorizontal, 1, 0s.TextFrame2.TextRange.Font.Reflection.Type = msoReflectionType5

Les trois premières instructions facilitent simplement la lecture du texte.L’ajout d’un dégradé à la forme et d’un reflet au texte donne au bouton unaspect plus classique.

Une forme possède une propriété OnAction qui permet de lier la forme àune macro. Il devrait théoriquement être possible de fixer la propriétéOnAction de n’importe quelle forme, y compris si elle appartient à ungroupe. En pratique, vous ne pouvez l’employer qu’avec une forme de cou-che supérieure. Il est heureusement facile de dégrouper et de regrouper desformes.

9. Saisissez les instructions suivantes dans la fenêtre Exécution.

s.Parent.Parent.Ungroups.OnAction = "BoutonEtat"s.DrawingObject.ShapeRange.Regroup

La propriété Ungroup d'une forme ne fonctionne que si la forme contientdes éléments regroupés. Le Parent d’une forme individuelle regroupée n’estpas une forme, mais un objet GroupShapes. Le parent des formes regrou-pées est la forme dont vous avez réellement besoin. Il n'existe pas de pro-priété "grand parent", si bien que vous employez simplement deux fois lapropriété Parent. Regroup est une méthode d'une plage de formes, pasd'une forme, même si elle ne prend en compte que le premier élément de lacollection lorsqu'elle décide de ce qui doit être regroupé. Une forme estdépourvue de propriété ShapeRange. Pour passer d'une forme (comme laforme actuelle de l'état de Washington) à sa plage de formes, vous pouvezemprunter un raccourci via la propriété masquée DrawingObject.

Page 229: Excel 2007 VBA

Objets de graphisme 209

10. Appuyez sur F5 pour arrêter la macro MakeMapButtons, puis copiez danscelle-ci les instructions de la fenêtre Exécution.

11. Supprimez les instructions qui sélectionnent la forme dans la macro, puissélectionnez n’importe quelle cellule de la feuille de calcul, pour désélec-tionner la carte. Modifiez comme suit les constantes du début de la macro,puis appuyez sur F5 pour la tester.

myNumber = 3myName = "Oregon"myCaption = "OR"myColor = 9

La macro devrait mettre en forme la forme de l’Orégon sans modifier lasélection.

Voir aussi Vous apprendrez dans la section « Création de fonctions personnalisées »du Chapitre 8 « Extension d’Excel et de Visual Basic » à créer et à employer des argu-ments pour vos macros, ce qui les rend encore plus réutilisables.

12. Dans Excel, essayez de cliquer sur les états mis en forme.

Vous devriez voir le message.

Travailler avec des formes regroupées est presque aussi simple qu’avec des formessimples. L’affectation d’une macro à la propriété OnAction est une des quelquesraisons qui imposent d’explicitement dégrouper une forme avant de l’employer.Remarquez également que l’emploi de variables explicites au début d’une macropour stocker des valeurs susceptibles de varier facilite le réemploi futur de lamacro : il suffit de modifier les valeurs des variables en un emplacement.

Voir aussi La macro MakeMapButtons a servi à créer l’interface de carte de l’applicationEnterprise Information System (EIS) de l’annexe.

Astuce Si vous ne souhaitez pas employer la propriété masquée DrawingObject etque vous avez affecté un nom à la forme, vous pouvez accéder à la plage de for-mes depuis la collection Shapes. Par exemple, pour regrouper une forme nomméeWashington, vous pouvez employer l'instruction ActiveSheet.Sha-pes.Range("Washington").Regroup.

Page 230: Excel 2007 VBA

210 Chapitre 6 Objets de graphisme

Sélection de plusieurs élémentsIl peut être très pratique de travailler dans une macro avec des formes regrou-pées. Pour créer votre propre groupe dans l’interface utilisateur, vous devezsélectionner plusieurs éléments. Une des façons de sélectionner plusieurs élé-ments est de maintenir enfoncée la touche CTRL lors de clics successifs sur leséléments concernés. Une autre est de glisser déposer un rectangle autour desobjets. Lorsque toutefois vous tracez un rectangle sur une feuille de calcul,vous ne sélectionnez qu’une plage de cellules.

Excel dispose d’un mode spécial qui permet de glisser déposer un rectanglepour sélectionner plusieurs objets. Sur l’onglet Accueil du ruban, dans legroupe Edition, cliquez sur la flèche Rechercher et sélectionner, puis cliquezsur Sélectionner les objets. Lorsque Sélectionner les objets est activé, un clicou un glisser déposer sur la feuille de calcul ne sélectionne pas les cellules.

Si vous oubliez d’activer Sélectionner les objets, le comportement d’Excel peutêtre déconcertant. En cas d’emploi fréquent de Sélectionner les objets, vouspourriez souhaiter ajouter le bouton à la Barre d’accès rapide de façon à voirl’état actuel et pouvoir facilement l’activer ou le désactiver.

Examen des objets de graphiquesLes graphiques incorporés à Excel sont des formes. Vous pouvez ajouter, manipu-ler et supprimer des objets Chart comme vous le faites avec des rectangles. Lesobjets Chart possèdent bien sûr des propriétés complémentaires propres aux gra-phiques. L’enregistreur de macro capture parfaitement la création ou la modifica-tion de la structure fondamentale d’un graphique, mais pas les nouvelles mises enforme avancées. Vous pouvez tirer profit de l’enregistreur là où cela est utile etemployer ce que vous avez appris sur les autres formes pour la mise en formeavancée de graphiques.

Création d’un graphiqueLa feuille de calcul ChartData du classeur Chapitre06 dispose de suffisamment dedonnées pour créer un graphique simple. Vous commencez dans cette section parenregistrer une macro, puis écrirez votre propre macro de création du graphique.

1. Activez la feuille de calcul ChartData du classeur Chapitre06 et sélectionnezla cellule A1.

2. Commencez à enregistrer une macro nommée zCréerGraphique.

Page 231: Excel 2007 VBA

Examen des objets de graphiques 211

3. Dans l’onglet Insertion du ruban, dans le groupe Charts, cliquez sur la flè-che Colonne, puis sélectionnez dans la liste le graphique en haut à gauche(Histogramme groupé).

4. Arrêtez l’enregistreur de macro, supprimez le graphique et affichez la macroenregistrée.

La macro devrait ressembler à ce qui suit :

Sub zCréerGraphique () ActiveSheet.Shapes.AddChart.Select ActiveChart.SetSourceData Source:=Range("ChartData!$A$1:$C$4") ActiveChart.ChartType = xlColumnClusteredEnd Sub

Après avoir enregistré la macro de création d’un graphique, vous pouvezcréer votre propre macro pour créer le type de graphique que vous souhai-tez.

5. Dans Excel, sélectionnez la cellule A1.

6. Dans Visual Basic, créez le squelette de macro suivant, puis appuyez deuxfois sur F8 pour initialiser la variable.

Sub CréerGraphique() Dim myChart As ChartEnd Sub

7. Dans la fenêtre Exécution, saisissez Set myChart = ActiveSheet.Sha-pes.AddChart.Chart et appuyez sur ENTRÉE.

Cela crée un graphique par défaut à partir des données de la zone actuellede la cellule active. Si celle-ci se trouve dans la zone actuelle adéquate, laméthode SetSourceData est superflue.

8. Saisissez myChart.ChartType = xlCylinderColStacked et appuyez surENTRÉE.

Page 232: Excel 2007 VBA

212 Chapitre 6 Objets de graphisme

Après la saisie du signe égal, l’Auto List affiche la liste de tous les types degraphiques possibles : il suffit de sélectionner le type souhaité. L’orientationdes lignes et des colonnes est toutefois incorrecte : il est illogique d’empilerdes dollars sur des unités.

9. Saisissez myChart.PlotBy = xlRows et appuyez sur ENTRÉE pour placer lesen-têtes de colonne dans les étiquettes de catégorie.

10. Appuyez F5 pour arrêter la macro. Copiez ensuite les instructions de la fenê-tre Exécution dans la macro CréerGraphique et appuyez sur F8 pour par-courir la macro et la tester.

Voici l’aspect de la macro achevée :

Sub CréerGraphique () Dim myChart As Chart Set myChart = ActiveSheet.Shapes.AddChart.Chart myChart.ChartType = xlCylinderColStacked myChart.PlotBy = xlRowsEnd Sub

La création d’un nouveau graphique sur une feuille de calcul, sans passer par leprocessus de sélection de l’enregistreur, ne présente aucune difficulté. Vous devezsimplement penser à employer la méthode AddChart de la collection Shapes puisà référencer explicitement l’objet Chart de l’objet Shape résultant.

Sélection active et graphiquesAvec la plupart des formes, il est facile de faire référence à un objet de la col-lection Shapes, mais plus délicat de faire référence à l’objet actuellementsélectionné. Dans la section précédente de ce chapitre « Référence à uneforme sélectionnée », vous aviez appris à référencer une forme sélectionnée.Le problème se pose de façon contraire avec les graphiques. Lorsque vous cli-quez sur un graphique, vous ne sélectionnez ni celui-ci ni même l’ancien objet

Page 233: Excel 2007 VBA

Examen des objets de graphiques 213

graphique ChartObject qui le contient, mais uniquement un des objets dugraphique. Quel que soit l’objet sélectionné dans le graphique, la propriétéActiveChart renvoie l’objet Chart. Vous souhaitez toutefois fréquemmentmanipuler un objet depuis une macro sans avoir à le sélectionner d’abord.

Pour obtenir le graphique sans le sélectionner d’abord, vous devez naviguervers l’objet Chart. Il existe deux façons d’y parvenir. La première consiste àemployer l’ancienne collection ChartObjects : c’est ce qu’accomplit l’enregis-treur. L’autre consiste à se servir de la nouvelle collection Shapes. Ces deuxclasses objet, ChartObject et Shapes, possèdent une propriété Chart qui ren-voie l’objet graphique actuel souhaité. En supposant que la feuille de calcul nepossède qu’une forme, vous pouvez affecter ActiveSheet.ChartOb-jects(1).Chart ou ActiveSheet.Shapes(1).Chart à une variable déclarée commeobjet Chart.

Un effet secondaire de ne jamais sélectionner directement l’objet Chart deChartObject ou de Shape est qu’il est pratiquement impossible d’employerl’interface utilisateur pour renommer le graphique actif, comme vous le faitesavec d’autres formes. Avec la plupart des formes, il suffit de sélectionnerl’objet, de saisir le nom dans la zone Nom située à gauche de la Barre de for-mule, puis d’appuyer sur Entrée. Cette technique ne fonctionne pas avec ungraphique. Une instruction de macro permet toutefois d’affecter le nom Mon-Graphique au graphique actif à l ’aide de l’ instruction ActiveChart.Parent.Name = "MonGraphique". Cela renomme le graphique et vous permetd’y faire référence à l’aide de l’expression ActiveSheet.Shapes("MonGraphi-que").

Synchronisation de deux graphiquesLa feuille de calcul TwoCharts du classeur Chapitre06 contient deux graphiquesqui montrent les commandes totales pour deux régions différentes. Celle de gau-che se nomme West et celle de droite East.

Un rapide coup d’œil aux deux graphiques pourrait laisser penser que les perfor-mances des deux régions sont sensiblement équivalentes. Cette conclusion esttoutefois erronée. La performance de la région East est plus faible que celle de la

Page 234: Excel 2007 VBA

214 Chapitre 6 Objets de graphisme

région West, mais Excel ajuste automatiquement l’échelle aux données. Vous vou-lez créer une macro pour ajuster les données. Elle doit modifier la valeur de l’axedu graphique East en celle de la valeur de l’axe du graphique West.

1. Activez la feuille TwoCharts et appuyez plusieurs fois sur F9.

Les valeurs des données des graphiques proviennent de formules qui ajus-tent aléatoirement l’échelle, de façon à modifier l'échelle relative des deuxgraphiques. La macro devrait faire en sorte que l’échelle maximale des deuxgraphiques corresponde toujours à l’échelle automatique du graphique quicontient les plus grandes valeurs.

2. Commencez à enregistrer une macro nommée zFixerAxeGraphique. Effec-tuez un clic droit sur l’axe des valeurs du graphique West, puis cliquez surMise en forme de l’axe. Dans Options d’axe, pour Maximum, cliquez surl’option Fixe, puis cliquez sur l’option Automatique. Arrêtez l’enregistreuret affichez la macro.

Elle devrait ressembler à ce qui suit, même si la valeur maximum peutdifférer :

Sub zFixerAxeGraphique() ActiveSheet.ChartObjects("ChartWest").Activate ActiveChart.Axes(xlValue).Select ActiveChart.Axes(xlValue).MaximumScale = 20000 ActiveChart.Axes(xlValue).MaximumScaleIsAuto = TrueEnd Sub

3. Dans Visual Basic, videz la fenêtre Exécution, créez le squelette de macrosuivant et appuyez trois fois sur F8 pour initialiser les variables et recalculerles valeurs des graphiques.

Sub SynchroniserGraphiques Dim myWest As Axis Dim myEast As Axis Application.CalculateEnd Sub

La macro a recours à la collection ChartObjects pour récupérer l’objet Char-tObject de la feuille active. Vous pourriez tout aussi bien employer la collec-tion Shapes. En employant le nom de code de la feuille active, ici Sheet3,vous pouvez obtenir une aide Auto List tandis que vous saisissez les instruc-tions.

4. Videz la fenêtre Exécution, puis saisissez les deux instructions suivantes enappuyant après chacune sur ENTRÉE.

Set myWest = Sheet3.Shapes("ChartWest").Chart.Axes(xlValue)Set myEast = Sheet3.Shapes("ChartEast").Chart.Axes(xlValue)

Ces instructions affectent les axes concernés aux variables objet.

Page 235: Excel 2007 VBA

Examen des objets de graphiques 215

5. Saisissez les deux instructions suivantes de façon à être certain que l’échellede l’axe des valeurs est fixée à automatique.

myWest.MaximumScaleIsAuto = TruemyEast.MaximumScaleIsAuto = True

La propriété MaximumScaleIsAuto figurait dans la macro enregistrée.

6. Saisissez (sur une seule ligne) myMax = WorksheetFunction.Max( myWest.MaximumScale,myEast.MaximumScale ) et appuyez sur ENTRÉE

pour calculer la plus grande valeur maximale des deux axes.

La plupart des fonctions de feuille de calcul sont disponibles dans unemacro. Elles sont regroupées dans l’objet WorksheetFunction. Même sil’échelle maximale d’un axe est fixée à automatique, vous pouvez lire lavaleur actuelle depuis la propriété MaximumScale.

7. Saisissez les deux instructions suivantes pour affecter le même maximumaux deux axes.

myEast.MaximumScale = myMaxmyWest.MaximumScale = myMax

Cela affecte aux deux graphiques la même valeur maximale. Fixer la valeurde la propriété MaximumScale modifie automatiquement la valeur de lapropriété MaximumScaleIsAuto en False.

8. Appuyez F5 pour arrêter la macro. Copiez ensuite le contenu de la fenêtreExécution dans la macro et appuyez sur F8 ou F5 pour la tester.

9. Dans Excel, effectuez un clic droit sur le graphique West, puis cliquez surAffecter une macro. Sélectionnez SynchroniserGraphiques dans la liste etcliquez sur OK.

10. Appuyez sur ECHAP pour désélectionnez le graphique, puis cliquez plusieursfois sur le graphique pour voir la macro synchroniser les graphiques selondiverses échelles.

Les différences entre les deux régions sont désormais évidentes. Les deux graphi-ques possèdent la même échelle maximale, quelle que soit celle qui possède lesvaleurs les plus grandes. Vous pourriez ajouter à cette macro d’autres tâches desynchronisation. Par exemple, vous pourriez également rendre identique la valeurminimale de chaque axe.

Page 236: Excel 2007 VBA

216 Chapitre 6 Objets de graphisme

Mise en forme de la zone de données d’un graphiqueComme avec la plupart des nouvelles capacités de mise en forme, vous ne pouvezpas enregistrer une macro pour en apprendre plus sur le fonctionnement dumodèle objet. Avec Excel 2007, les graphiques ont toutefois recours exactementaux mêmes sous-objets que les formes : vous pouvez leur appliquer sans craintetout ce que vous avez appris sur la mise en forme des formes. Il vous suffit decomprendre comment naviguer du graphique à l’objet que vous voulez mettre enforme. Vous allez dans cette section découvrir cela en appliquant un dégradé à lazone de données des graphiques de la feuille TwoCharts.

1. Créez le squelette de macro suivante, puis appuyez deux fois sur F8 pour ini-tialiser les variables.

Sub FormatZoneTracage() Dim myPlot As PlotArea Dim myFormat as FillFormatEnd Sub

2. Videz la fenêtre Exécution, saisissez Set myPlot = Sheet3.Shapes("ChartEast").Chart.PlotArea et appuyez sur ENTRÉE.

En employant le nom de code de la feuille active, vous obtenez l’aide AutoList. Si vous voulez que la macro fonctionne avec n’importe quelle feuille,remplacez le nom de code par ActiveSheet après avoir testé la macro.Remarquez que vous employez la propriété Chart pour naviguer de la formeau graphique qu’elle contient. À partir de ce moment, Auto List vous aide àidentifier tous les sous-objets d’un graphique.

3. Saisissez Set myFormat = myPlot.Format.Fill et appuyez sur ENTRÉE.

Vous avez déclaré la variable myFormat comme objet FillFormat. C’est laclasse que vous aviez employée lors de la création d’une forme dans unesection précédente de ce chapitre, « Ajout d’un dégradé à une forme ». Dis-posant d’une référence vers l’objet FillFormat, mettre en forme un compo-sant du graphique est analogue au travail avec n’importe quelle forme. Pourrécupérer l’objet FillFormat, vous devez d’abord passer par la propriété For-mat. Il existe une propriété masquée Fill pour la zone de traçage elle-même,mais elle renvoie un ancien objet ChartFillFormat que vous ne voudriez pasemployer.

4. Saisissez myFormat.OneColorGradient msoGradientHorizontal, 2, 0 etappuyez sur ENTRÉE.

Cette instruction applique un dégradé, comme elle le ferait avec une forme.

5. Saisissez myFormat.GradientStops(2).Color.ObjectThemeColor = msoThemeColorAccent1 et appuyez sur ENTRÉE.

La couleur du dégradé s’ajuste à un thème de couleur standard.

Page 237: Excel 2007 VBA

Points clés 217

6. Appuyez F5 pour arrêter la macro. Copiez le contenu de la fenêtre Exécu-tion dans la macro, modifiez West en East dans le nom de l’objet, puis tes-tez la macro.

Même si vous ne pouvez pas enregistrer les étapes de la mise en forme d’un gra-phique, tout ce que vous avez appris sur la mise en forme des formes s’appliqueaux graphiques, et réciproquement.

Les nouvelles capacités de mise en forme d’Excel 2007 sont réellement stupéfian-tes. Bien que vous ne puissiez employer l’enregistreur de macro, vous pouvezapprendre à naviguer jusqu’aux objets pour pouvoir les mettre en forme. Heureu-sement, les capacités de mise en forme de l’interface utilisateur et du modèleobjet correspondent étroitement. Vous pouvez même parfois vous servir dumodèle objet pour découvrir de nouvelles fonctionnalités passées inaperçuesdans l’interface utilisateur.

Points clés● Servez-vous de l’aide pour découvrir des listes annotées de tous les mem-

bres d’un objet. Même hors connexion, votre ordinateur dispose d’une aide.

● Ajoutez de nouveaux éléments à la collection ColorStops d’une mise neforme de dégradé de cellules pour obtenir plusieurs couleurs indisponiblesdepuis l’interface utilisateur.

● Tirez profit des propriétés Adjustments des formes pour multiplier le nom-bre de formes disponibles.

● Lorsqu’une forme contient des objets regroupés, vous pouvez vous servir dela collection GroupShapes pour accéder aux formes individuelles sans devoirles dégrouper et les regrouper.

● Lorsque l’enregistreur de macro ne vous montre pas les méthodes et pro-priétés d’un objet, recherchez des pistes dans l’interface utilisateur.

FERMEZ le classeur Chapitre06.xlsm.

Page 238: Excel 2007 VBA

Éviter les erreurs à l’aide d’une

instruction If, page 220

Boucles sur des plages parallèles à l’aide d’une boucle For, page 232

Débogage de grosses boucles à l’aide d’un point

d’arrêt, page 239

Boucle infinie à l’aide d’une boucle Do,page 235

Poser une question à l’aide d’une boîte de message, page 227

Affichage de la progression à l’aide de la barre d’état,page 243

Coup d’œil sur le chapitre

Page 239: Excel 2007 VBA

219

7 Contrôle de Visual Basic

Ce chapitre aborde les points suivants :✔ Emploi d’instructions conditionnelles ;✔ Création de boucles à l’aide de trois blocs différents ;✔ Récupération des noms de fichiers dans un dossier.✔ Création de points d’arrêt pour déboguer de grandes boucles ;✔ Affichage de la progression lorsque la macro exécute une boucle.

La construction du premier tunnel sous l’eau réussi a débuté en 1825. C’est le tun-nel sous la Tamise. Ce fut à l’époque un désastre financier, mais, de façon surpre-nante, il sert toujours comme composant du réseau de métro souterrain deLondres. L’ingénieur génial à l’origine du tunnel se nomme Marc Brunel. Vingt ansavant de se lancer dans l’aventure du tunnel sous la Tamise, Brunel s’était renducélèbre en concevant une méthode économique de construction des palans (oumoufles) nécessaires à la construction navale britannique. La technique de Brunela rapidement porté le nom de « chaîne d’assemblage » et Henry Ford a fait decette invention une industrie, en fournissant à l’Amérique les véhicules Model Tqui ne coûtaient que 3 500 $ actuels.

La répétition peut avoir des conséquences incroyables sur l’efficacité. Les pro-grammes informatiques, y compris les macros que vous écrivez, deviennent pluspuissants lorsque vous ajoutez un effet multiplicateur. Vous allez apprendre dansce chapitre à ajouter des boucles à vos macros. Pour rendre ces boucles plus effi-caces, vous allez apprendre à créer des expressions conditionnelles qui permet-tent à une macro de prendre des décisions.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiers d’exer-cices à leur emplacement par défaut. Reportez pour plus d’informations à la sec-tion « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 240: Excel 2007 VBA

220 Chapitre 7 Contrôle de Visual Basic

Emploi d’expressions conditionnellesLes macros enregistrées ne sont pas très malignes. Elles sont capables de répéterce que vous avez fait lors de l’enregistrement de la macro, mais ne peuvent secomporter différemment selon les circonstances. Elles sont incapables de prendreune décision. La seule façon dont vous pouvez doter vos macros d’un peu d’intel-ligence consiste à ajouter vous-même cette capacité de prise de décision.

Prise de décisionLe fichier texte Flow contient une macro nommée MoveRight, qui ressemble àceci :

Sub MoveRight() ActiveCell.Offset(0, 1).SelectEnd Sub

Cette macro sélectionne la cellule située à droite de la cellule active et marcheparfaitement. Au moins dans la plupart des cas.

1. Copiez la macro MoveRight depuis le fichier texte et copiez-la dans unmodule VBA module du classeur Chapitre07.

2. La cellule A1 étant sélectionnée dans le classeur, activez l’éditeur VisualBasic, cliquez dans la macro MoveRight, et appuyez sur F5.

La macro sélectionne la cellule B1 du classeur.

3. Dans Excel, appuyez sur CTRL+FLÈCHE À DROITE pour sélectionner la celluleXFD1, la cellule située à l’extrême droite de la première ligne.

SERVEZ-VOUS du classeur Flow.xlsx, du fichier texte Flow.txt et du classeurOrders.xlsx. Ces fichiers d’exercices se trouvent dans le dossier Docu-ments\MSP\ExcelVBA07SBS. Le fichier texte Flow contient certaines macros initialesque vous allez copier dans votre classeur et modifier au cours de ce chapitre. Ellessont stockées dans un fichier texte pour que vous puissiez vérifier qu’elles sontdépourvues de tout code malveillant avant de les placer dans un emplacementapprouvé.VEILLEZ À enregistrer le classeur Flow.xlsx sous le nom Chapitre07.xlsm dans ledossier approuvé créé au Chapitre 1. OUVREZ le fichier texte Flow. Ouvrez ensuite le classeur Chapitre07, effectuez unclic droit sur un onglet de feuille de calcul quelconque et cliquez sur Visualiser lecode pour ouvrir l’éditeur Microsoft Visual Basic. Dans celui-ci, dans le menu Inser-tion, cliquez sur Module pour créer un nouveau module pour vos macros, puisenregistrez le fichier. Arrangez les fenêtres de Microsoft Office Excel 2007 et del’éditeur Visual Basic pour pouvoir les voir simultanément côte à côte.

Page 241: Excel 2007 VBA

Emploi d’expressions conditionnelles 221

4. Dans l’éditeur Visual Basic, appuyez sur F5.

Visual Basic affiche une erreur.

Vous ne pouvez pas sélectionner la cellule à droite de la cellule la plus àdroite. Si votre macro ne peut se déplacer vers la droite, mieux vaudraitqu’elle ne fasse rien plutôt que d’afficher un message d’erreur.

5. Dans la boîte de message d’erreur, cliquez sur le bouton Débogage pouratteindre la macro, puis cliquez sur le bouton Réinitialiser pour arrêter lamacro.

6. Insérez l’instruction If ActiveCell.Column < Columns.Count Then aprèsl’instruction Sub. Indentez l’instruction qui modifie la sélection, puis insérezl’instruction End If avant la fin de la macro.

Veillez à indenter les instructions de façon à rendre clair quelle instructiondépend de l’instruction If. Visual Basic n’a besoin d’aucune indentation, maiscela est capital pour vous aider (ou aider toute personne qui prend votresuite) à interpréter la macro comme Visual Basic.

La macro modifiée devrait ressembler à ceci:

Sub MoveRight() If ActiveCell.Column < Columns.Count Then ActiveCell.Offset(0, 1).Select End IfEnd Sub

Une instruction If (une instruction qui débute par le mot If) est toujoursappariée à une instruction End If. Le groupe d’instructions entre If et End Ifest nommé bloc If.

Visual Basic examine l’expression qui suit le mot If et détermine si celle-cis’évalue en Vrai (True) ou en Faux (False). Cette expression vrai ou faux estnommée expression conditionnelle. Dans un bloc If simple, comme celui decet exemple, si la valeur de l’expression est True Visual Basic exécute toutesles instructions entre les instructions If et End If. Si l’expression est False,Visual Basic passe directement à l’instruction End If. Vous devez toujoursplacer le mot Then à la fin de l’instruction If. L’expression conditionnelle véri-fie ici si l’index de la colonne courante est inférieur au nombre total decolonnes de la feuille de calcul. Vous pourriez également le comparer à une

Page 242: Excel 2007 VBA

222 Chapitre 7 Contrôle de Visual Basic

constante, comme 16384 ou 2^14, mais employer les propriétés d’objetspermet à la macro de fonctionner aussi bien avec d’anciennes versionsd’Excel (avec 256 colonnes) qu’avec Excel 2007 (avec 16384 colonnes).

7. Repassez à Excel, sélectionnez la cellule XFA1, activez Visual Basic, puisappuyez sur F5 quatre ou cinq fois.

La macro déplace la cellule active vers la droite jusqu’à atteindre la dernièrecellule. Elle ne fait alors plus rien, exactement comme le stipulent vos ins-tructions.

L’enregistreur de macro ne crée jamais de bloc If. Ce type de décision est dupur Visual Basic, que vous devez ajouter vous-même. Il est heureusementfacile d’ajouter un bloc If.

8. Imaginez une question dont la réponse est de type « oui » ou « non ». Danscet exemple, la question est « le numéro de la colonne active est-il inférieurau nombre total de colonnes de la feuille de calcul ? ». Vous pouvez trans-former cette question en une expression conditionnelle vrai ou faux d’uneinstruction If.

9. Placez le mot If devant l’expression conditionnelle, puis placez après le motThen.

10. Déterminez les instructions à exécuter si l’expression conditionnelle renvoiela valeur True.

11. Placez une instruction End If après la dernière instruction qui doit être con-trôlée par le bloc If.

L’emploi de blocs If permet de rendre intelligentes vos macros.

Prise de décision doubleParfois, comme pour éviter une erreur, vous souhaitez que la macro ne s’exécuteque si l’expression conditionnelle est True. Dans d’autres situations, vous voudrezqu’elle se comporte d’une certaine façon si l’expression est True et d’une autrefaçon si elle est False.

Par exemple, supposez que vous vouliez une macro qui déplace la cellule activevers la droite uniquement dans les cinq premières colonnes de la feuille de calcul.Lorsque la cellule active atteint la cinquième colonne, vous voulez revenir à la pre-mière cellule de la ligne suivante. Vous souhaitez donc ici que la macro effectueune action si le numéro de la colonne de la cellule est inférieur à cinq (déplace-ment vers la droite) et une action différente (déplacement vers le bas et vers la

Page 243: Excel 2007 VBA

Emploi d’expressions conditionnelles 223

gauche) dans le cas contraire. Vous pouvez demander à la macro de choisir entredeux options en ajoutant une seconde partie au bloc If.

1. Repassez à l’éditeur Visual Basic, puis copiez la macro MoveRight. Modifiezle nom de la nouvelle copie en FiveColumnWrap.

2. Dans la macro FiveColumnWrap, modifiez l’expression Columns.Count del’instruction If en 5.

3. Ajoutez l’instruction Else avant l’instruction End If, puis appuyez sur ENTRÉE.

4. Appuyez sur TAB, puis ajoutez l’instruction Cells(ActiveCell.Row + 1, 1).Select après l’instruction Else.

La macro modifiée devrait ressembler à ceci :Sub FiveColumnWrap If ActiveCell.Column < 5 Then ActiveCell.Offset(0, 1).Select Else Cells(ActiveCell.Row + 1, 1).Select End IfEnd Sub

L’instruction Else indique seulement à Visual Basic quelle instruction ou blocd’instructions exécuter si l’expression conditionnelle est False.

5. Appuyez plusieurs fois sur F5 pour exécuter la macro.

Vous pouvez voir la sélection se déplacer vers la droite, puis repasser à lacolonne A, comme un traitement de texte passe à la ligne suivante.

Un bloc If peut renfermer une unique partie et n’exécuter des instructions que sil’expression conditionnelle est True, ou plusieurs parties. Il exécute alors unensemble d’instructions si l’expression conditionnelle est True et un ensemble dif-férent si elle est False.

Astuce Plusieurs instructions différentes permettent de sélectionner la premièrecellule de la ligne suivante. Par exemple, voici quelques possibilités :Rows(ActiveCell.Row + 1).Cells(1).SelectActiveCell.EntireRow.Cells(2, 1).SelectActiveCell.Offset(1, 0).EntireRow.Cells(1).Select.

Elles partent toutes du même point (ActiveCell) pour parvenir à la même destina-tion. Lors de l’écriture de macros, vous disposez souvent de plusieurs possibilités.Retenez celle qui vous semble la plus facile à comprendre.

Page 244: Excel 2007 VBA

224 Chapitre 7 Contrôle de Visual Basic

Poser une questionVous avez rédigé dans le Chapitre 2, « Création d’une macro pour effectuer destâches complexes » une macro qui vous demandait de saisir une date. Pour cefaire, vous avez employé la fonction Visual Basic InputBox. La fonction InputBoxest parfaite pour poser une question, mais vous devez prendre garde à ce qui sepasse si vous cliquez sur le bouton Annuler.

Le fichier texte Flow contient une macro nommée TestInput qui vous invite à saisirla date. Vous devriez reconnaître le code de cette macro.

Sub TestInput() Dim myDate As String myDate = InputBox("Saisissez le mois au format MMM-YYYY ") MsgBox "Poursuite de l’exécution de la macro"End Sub

La macro invite à saisir une date. Elle affiche ensuite une boîte de message simplequi indique que le reste de la macro s’exécute.

1. Copiez la macro TestInput depuis le fichier texte et collez-la dans unmodule du classeur Chapitre07, dans l’éditeur Visual Basic.

2. Cliquez dans la macro TestInput. Appuyez sur F5 pour exécuter la macro,saisissez Nov-2007 comme date, puis cliquez sur OK.

La boîte de message apparaît, simulant le reste de la macro.

3. Cliquez sur OK pour fermer la boîte de message.

4. Appuyez sur F5 pour exécuter à nouveau la macro, mais cliquez cette foissur Annuler lorsque vous êtes invité à saisir la date.

La boîte de message apparaît encore, alors qu’en principe en cliquant surAnnuler vous vouliez annuler ce que vous aviez commencé.

Astuce Dans la plupart des cas, If et Else sont suffisants. Vous pouvez toutefoisemployer un bloc If pour créer des conditions multiples en ajoutant une instructionElseIf. Pour en apprendre plus sur les blocs If, sélectionnez le mot If dans la macropuis appuyez sur F1.

Page 245: Excel 2007 VBA

Emploi d’expressions conditionnelles 225

5. Cliquez sur OK pour fermer la boîte de message.

Vous avez besoin d’une expression conditionnelle, où un résultat True signi-fie que vous voulez poursuivre l’exécution de la macro. La question adé-quate est « L’utilisateur a-t-il saisi quelque chose dans la boîte ? », puisquecliquer sur Annuler est identique à laisser vierge la boîte de message : quevous cliquiez sur Annuler ou laissiez vide cette boîte, la fonction InputBoxrenvoie une chaîne vide (deux guillemets séparés par rien). L’opérateur <>(un signe inférieur à suivi d’un signe supérieur à) signifie « différent de ».C’est le contraire du signe égal.

6. Avant l’instruction MsgBox, saisissez l’instruction If myDate <> "" Then.Avant l’instruction End Sub, saisissez End If. Indentez l’instruction à l’inté-rieur du bloc If.

La macro modifiée devrait ressembler à ceci:

Sub TestInput() Dim myDate As String myDate = InputBox("Saisissez le mois au format MMM-YYYY") If myDate <> "" Then MsgBox "Poursuivre l’exécution de la macro" End IfEnd Sub

7. Appuyez sur F5 et vérifiez que la macro gère correctement une valeurd’entrée. Saisissez une date, puis cliquez sur OK.

La macro « continue ».

8. Cliquez sur OK pour fermer la boîte de message.

9. Exécutez à nouveau la macro, mais cliquez cette fois sur Annuler lorsquevous êtes invité à saisir une date. La macro s’arrête docilement.

Lorsque vous autorisez une saisie utilisateur dans une macro, vous devez veiller àvérifier si l’utilisateur n’a pas choisi d’annuler totalement la macro.

Test de la validité d’une entréeRechercher une chaîne vide permet de vérifier si l’utilisateur a cliqué sur le boutonAnnuler, mais ne vous aide aucunement à déterminer si la valeur entrée dans laboîte est valide. Vous pouvez ajouter un autre test pour vérifier la validité de lavaleur d’entrée.

1. Exécutez à nouveau la macro TestInput, mais saisissez cette fois hippopo-tame dans la boîte de saisie, puis cliquez sur OK.

La macro continue son exécution, comme si vous aviez entré une date.

Page 246: Excel 2007 VBA

226 Chapitre 7 Contrôle de Visual Basic

2. Cliquez sur OK pour fermer la boîte de message.

Ce comportement pourrait poser problème. Vous devez vérifier si la boîtede saisie est vide, mais également que la valeur entrée est une date valide.Visual Basic dispose d’une fonction IsDate qui vous indique si Visual Basicpeut interpréter une valeur comme date. Vous ne souhaitez toutefois effec-tuer ce test que si l’utilisateur n’a pas cliqué sur Annuler. Cela nécessite lerecours à des blocs If imbriqués.

3. Modifiez comme suit la macro :

Sub TestInput() Dim myDate As String myDate = InputBox("Saisissez un mois au format MMM-YYYY ") If myDate <> "" Then If IsDate(myDate) Then MsgBox "Poursuite de l’exécution de la macro" Else MsgBox "Vous n’avez pas saisi une date valide" End If End IfEnd Sub

Veillez à indenter chaque instruction de façon à rendre clair quelle instruc-tion est régie par quelle instruction If ou Else.

4. Exécutez la macro au moins trois fois. Testez-la avec une date valide, avecune saisie invalide et en cliquant sur Annuler.

Les entrées valides et invalides devraient afficher les messages appropriés.Cliquer sur Annuler ou laissez la boîte de saisie vide devrait n’afficher aucunmessage.

L’emploi de la fonction InputBox peut être une façon intéressante de rendre unemacro utile dans des circonstances très variées. Vous devez toutefois veiller à véri-fier le résultat de InputBox avant de poursuivre la macro. Vous devez traditionnel-lement tester trois possibilités : une entrée valide, une entrée invalide et un clic sur

Astuce Visual Basic peut interpréter plusieurs formats comme dates. Essayez plu-sieurs formats de saisie de date, comme 11/07, pour voir ceux que Visual Basicinterprète comme dates.

Page 247: Excel 2007 VBA

Emploi d’expressions conditionnelles 227

Annuler. Un bloc If, avec parfois un bloc If imbriqué, peut rendre votre macro suf-fisamment intelligente pour répondre à toutes les situations.

Demande à l’aide d’un messageLa fonction Visual Basic MsgBox est pratique pour l’affichage de messages sim-ples. Comme son nom l’indique, cette fonction affiche une boîte de message. Ellepeut toutefois faire beaucoup plus : par exemple, poser des questions. Très sou-vent, une question posée par une macro n’exige qu’une réponse de type oui-non.La fonction MsgBox est parfaite pour de telles questions.

Supposez que vous disposiez de deux macros. La première est une macro longueet lente nommée PrintMonth, tandis que la seconde est une macro courte etrapide nommée ProcessMonth. Vous constatez qu’il est fréquent de lancer acci-dentellement la macro lente alors que vous vouliez exécuter la macro rapide. Unesolution possible pourrait être d’ajouter une boîte de message au début de lamacro lente pour demander confirmation du lancement de cette longue macro.

Le fichier texte Flow contient une macro nommée CheckRun. Vous allez l’amélio-rer pour voir comment employer la fonction MsgBox pour poser une question. Lamacro ressemble actuellement à ceci :

Sub CheckRun() MsgBox "Cela demande un certain temps. Continuer ?" MsgBox "Poursuite de l’exécution de la macro lente..."End Sub

1. Copiez la macro CheckRun depuis le fichier texte dans un module du clas-seur Chapitre07.

2. Cliquez dans la macro CheckRun puis appuyez sur F5 pour l’exécuter. Cli-quez deux fois sur OK pour fermer chaque boîte de message.

La première boîte de message apparaît et pose une question. Elle ne pos-sède toutefois qu’un bouton. Pour poser une question, vous devez ajouterd’autres boutons.

3. Déplacez le curseur à la fin de la première instruction MsgBox. Saisissez unevirgule immédiatement après le dernier guillemet.

Dès que vous saisissez la virgule, Visual Basic affiche l’info bulle pour lafonction MsgBox. Le premier argument se nomme Prompt. C’est celui dans

Page 248: Excel 2007 VBA

228 Chapitre 7 Contrôle de Visual Basic

lequel vous saisissez le message à afficher. Le second argument se nommeButtons. C’est une énumération de valeurs. Sa valeur par défaut est vbO-KOnly, ce pourquoi vous ne voyez qu’un unique bouton OK lors de l’exécu-tion de la macro.

À côté de l’info bulle, Visual Basic affiche également une Auto List desvaleurs possibles pour l’argument Buttons. Vous voulez que les boutonsposent une question en termes de oui ou non.

4. Descendez presque jusqu’en bas de la liste, sélectionnez vbYesNo, appuyezsur TAB, puis appuyez sur F5 pour exécuter la macro.

La première boîte de message possède maintenant deux boutons.

5. Cliquez sur Oui pour fermer la première boîte de message, puis cliquez surOK pour fermer la seconde.

La boîte de message pose une question, mais ignore totalement votreréponse. Vous devez récupérer la réponse de la fonction MsgBox et vous enservir pour contrôler l’exécution de la macro.

6. Saisissez l’instruction Dim myCheck As VbMsgBoxResult au début de lamacro.

Lorsque vous savez qu’une variable ne va contenir que la valeur d’une énu-mération, vous pouvez employer le nom de celle-ci lors de sa déclaration.Lorsque vous rédigez par la suite une instruction pour tester la valeur de lavariable, Visual Basic affiche la liste des valeurs possibles.

7. Au début de la première instruction MsgBox, saisissez myCheck = puis pla-cez des parenthèses autour de la liste des arguments de la fonction Msg-Box.

L’instruction modifiée devrait être analogue à ceci :

myCheck = MsgBox("Cela demande un certain temps. Continuer ?", vbYesNo)

Page 249: Excel 2007 VBA

Emploi d’expressions conditionnelles 229

8. Insérez ces trois instructions avant la seconde instruction MsgBox :

If myCheck = vbNo ThenExit SubEnd If

L’instruction Exit Sub impose à Visual Basic d’arrêter immédiatement lamacro active. Pour éviter de rendre vos macros difficiles à comprendre, vousdevez employer Exit Sub avec parcimonie. Un bon emploi de Exit Sub estlorsque vous annulez la macro au début, comme ici. La macro achevéedevrait ressembler à ceci :

Sub CheckRun() Dim myCheck As VbMsgBoxResult myCheck = MsgBox("Cela demande un certain temps. Continuer ?", vbYesNo) If myCheck = vbNo Then Exit Sub End If MsgBox "Poursuite de l’exécution de la macro lente..."End Sub

9. Testez la macro. Exécutez-la et cliquez sur Oui, puis exécutez-la à nouveauet cliquez sur Non. Vérifiez que le reste de la macro ne s’exécute que si vouscliquez sur Oui.

Une boîte de message est un outil puissant pour poser des questions simples. Lafonction MsgBox est également un bon exemple d’emploi des parenthèses autourde la liste des arguments : employez des parenthèses si vous vous servez de lavaleur de renvoi. Sinon, n’en placez pas.

Important Lorsque vous employez la valeur renvoyée par une fonction commeMsgBox, vous devez placer des parenthèses autour de la liste des arguments. Cesparenthèses sont superflues si vous ne vous servez pas de la valeur de renvoi.

Important Lorsque vous créez une expression conditionnelle à l’aide du résultatde la fonction MsgBox, vous ne devez pas tester True ou False. MsgBox possède denombreux types de boutons et donc de nombreux types de réponses. Si vousemployez vbYesNo comme argument Buttons, MsgBox renvoie toujours vbYes ouvbNo. Aucune des valeurs de l’énumération n’est égale à False, si bien que compa-rer le résultat à False sera toujours identique à un clic sur Oui. Lorsque vous testezune valeur qui provient d’une énumération, prenez garde à toujours employer laconstante d’énumération adéquate.

Page 250: Excel 2007 VBA

230 Chapitre 7 Contrôle de Visual Basic

Création de bouclesBien avant Henry Ford et même Marc Brunel, l’économiste Adam Smith avaitdéterminé qu’en une journée un unique ouvrier fabriquait une unique épingle,mais que dix ouvriers permettraient une répartition du travail et la fabricationdans le même délai de 48 000 épingles : une productivité multipliée par presque5 000. Vous pouvez obtenir de la même façon des augmentations de productivi-tés fantastiques en convertissant une macro qui s’exécute une fois en une macroqui s’exécute en boucle des milliers de fois.

Parcours d’une collection à l’aide d’une boucle For EachExcel permet de protéger une feuille de calcul pour que les utilisateurs ne puis-sent modifier que les cellules explicitement débloquées. Vous devez toutefoisprotéger individuellement chaque feuille. Supposez que vous possédiez un clas-seur qui renferme les budgets de dix services différents et que vous vouliez pro-téger toutes les feuilles de calcul. Le f ichier texte Flow contient une macronommée ProtectSheets. Voici ce à quoi elle ressemble :

Sub ProtectSheets() Dim mySheet As Worksheet Set mySheet = Worksheets(1) mySheet.Select mySheet.Protect "Password", True, True, TrueEnd Sub

Cette macro affecte une référence vers la première feuille de calcul à la variablemySheet, sélectionne cette feuille, puis la protège. Sélectionner la feuille n’est pasindispensable mais facilite le suivi des actions de la macro. Regardez maintenantcomment il est possible de convertir cette macro pour protéger toutes les feuillesde calcul du classeur.

1. Copiez la macro ProtectSheets depuis le fichier texte et collez-le dans unmodule VBA du classeur Chapitre07.

2. Cliquez dans la macro ProtectSheets et appuyez de façon répétée sur F8pour exécuter pas à pas la macro. Vérifiez que vous comprenez bien cequ’accomplit la macro originale.

3. Dans la troisième ligne, remplacez Set par For Each, remplacez le signe égalpar In, puis supprimez les parenthèses et le nombre qu’elles encadrent.

4. Indentez les deux instructions qui débutent par mySheet, ajoutez une nou-velle ligne et saisissez l’instruction Next mySheet.

Page 251: Excel 2007 VBA

Création de boucles 231

La macro achevée devrait ressembler à ceci :

Sub ProtectSheets() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Select mySheet.Protect "Password", True, True, True Next mySheetEnd Sub

L’instruction For Each agit exactement comme Set : elle affecte une réfé-rence vers un objet à une variable. Plutôt cependant que d’affecter un sim-ple objet à la variable, elle lui affecte chaque élément d’une collection. Ainsi,pour chaque (for each) objet de la collection, Visual Basic exécute toutes lesinstructions jusqu’à l’instruction Next. Techniquement parlant, il n’est pasnécessaire de placer le nom de la variable après Next. Si vous le faites, VisualBasic exige que ce nom corresponde à celui de la variable après For Each.Placez toujours le nom de la variable de boucle après Next de façon à ce queVisual Basic vous aide à empêcher certains bogues dans vos macros. Les ins-tructions qui commencent par For Each et finissent par Next portent le nomde boucles ou de blocs For Each.

5. Appuyez de façon répétée sur F8 pour exécuter pas à pas la macro et obser-ver son travail tour à tour sur chaque feuille de calcul.

6. Passez à Excel et tentez de saisir une valeur dans une cellule de n’importequelle feuille de calcul. Fermez ensuite la boîte de message d’erreur qui s’estaffichée.

7. Créez une nouvelle macro nommée UnprotectSheets qui enlève la protec-tion de toutes les feuilles de calcul. Essayez d’écrire la macro sans vousreporter au code qui suit. Indice : vous devez employer la méthode Unpro-tect de l’objet Worksheet, avec un unique argument qui fournit le mot depasse.

Astuce Une boucle For Each est un moyen pratique pour parcourir des collectionsdans la fenêtre Exécution. Dans celle-ci toutefois, ce que vous saisissez doit tenirsur une unique ligne. Vous pouvez placer plusieurs instructions sur une mêmeligne en les séparant par un signe deux points. Par exemple, voici que vous saisiriezpour voir les noms de toutes les feuilles de calcul du classeur actif : For Each x InWorksheets: ?x.Name: Next x. Dans la fenêtre Exécution, il n’y a aucun mal àemployer des noms de variable courts dépourvus de signification.

Page 252: Excel 2007 VBA

232 Chapitre 7 Contrôle de Visual Basic

Voici l’aspect de la macro UnprotectSheets :

Sub UnprotectSheets() Dim mySheet As Worksheet For Each mySheet In Worksheets mySheet.Select ' Cette instruction est facultative. mySheet.Unprotect "Password" Next mySheetEnd Sub

8. Enregistrez le classeur, appuyez sur F5 pour exécuter la macro Unpro-tectSheets, puis testez-la en modifiant une valeur d’une feuille de calcul.

Parcourir une collection à l’aide d’une boucle est presque aussi simple que d’affec-ter un unique objet à une variable. Les seules différences sont que vous employezFor Each plutôt que Set, que vous spécifiez la collection concernée et ajoutez uneinstruction Next à la fin de la boucle.

Boucle à l’aide d’un compteur avec une boucle ForVous voulez parfois exécuter une action répétée sans pouvoir employer une bou-cle For Each. Par exemple, une boucle For Each ne fonctionne qu’avec une uniquecollection. Si vous voulez comparer deux collections parallèles, comme deux pla-ges, vous ne pouvez employer de boucle For Each. Dans cette situation, VisualBasic propose une autre boucle plus généraliste, la boucle For.

La feuille de calcul Compare du classeur Chapitre07 contient deux plages nom-mées. Celle de gauche se nomme Old et celle de droite New. Vous pouvez les con-sidérer comme une première prévision et une prévision révisée. Les cellules de laplage Old contiennent des valeurs, tandis que celles de la plage New renfermentune formule qui calcule un nombre aléatoire à chaque appui sur F9 pour recalcu-ler le classeur. Cette formule est précisément =ROUND(RAND()*50+100,0), ce quiindique à Excel de calculer un nombre aléatoire compris entre 0 et 1, de le multi-plier par 50, de lui ajouter 100 et de l’arrondir au nombre entier le plus proche. Enraison de la génération aléatoire des nombres de la plage New, ceux que vousverrez différeront de ceux présentés dans cette figure.

Le fichier texte Flow contient une macro nommée CompareCells :

Sub CompareCells() Dim i As Integer Calculate If Range("New").Cells(i) > Range("Old").Cells(i) Then

Page 253: Excel 2007 VBA

Création de boucles 233

Range("New").Cells(i).Interior.Color = rgbLightGreen Else Range("New").Cells(i).Interior.Color = rgbLightSteelBlue End IfEnd Sub

La macro exécute d’abord la méthode Calculate, qui génère de nouvelles valeurspour toutes les cellules de la plage New. Elle compare ensuite uniquement la der-nière cellule de la plage New à la dernière cellule de la plage Old. Si la valeur dela cellule New est supérieure à celle de la cellule Old, la cellule passe en vert clair.Si ce n’est pas le cas, elle adopte une teinte gris bleu clair. La macro affecte le nom-bre de cellules (Count) de la plage à la variable i, un simple entier.

Voir aussi Si les blocs If vous mettent mal à l’aise, reportez-vous à la première moitié de cechapitre. Pour plus d’informations sur les couleurs de cellule, reportez-vous à la section« Mise en forme de l’intérieur d’une plage » du Chapitre 4, « Objets de plages »

Regardez maintenant comme il est possible de convertir cette macro pouremployer une boucle pour comparer et colorer toutes les cellules de la plageNew.

1. Copiez la macro CompareCells du fichier texte et collez-la dans un moduleVBA du classeur Chapitre07.

2. Cliquez dans la macro CompareCells et appuyez de façon répétée sur F8pour exécuter pas à pas la macro. Vérifiez que vous comprenez tout cequ’accomplit la macro originale.

3. Dans l’instruction qui affecte Count à la variable, insérez le mot For avant lavariable, puis insérez 1 To après le signe égal.

4. Saisissez Next i avant l’instruction End Sub, puis indentez toutes les instruc-tions entre For et Next.

La macro achevée devrait ressembler à ceci :

Sub CompareCells() Dim i As Integer Calculate For i = 1 To Range("New").Cells.Count If Range("New").Cells(i) > Range("Old").Cells(i) Then Range("New").Cells(i).Interior.Color = rgbLightGreen Else Range("New").Cells(i).Interior.Color = rgbLightSteelBlue End If Next iEnd Sub

Page 254: Excel 2007 VBA

234 Chapitre 7 Contrôle de Visual Basic

Le mot clé For fonctionne exactement comme une instruction d’affectation :il affecte un nombre à la variable. L’instruction For affecte un nombre à unevariable entière tandis que l’instruction For Each affecte une référence à unevariable objet. La variable qui contient le nombre est nommée compteur deboucle. Vous spécifiez la valeur initiale du compteur de boucle (ici, 1) et lavaleur de fin (ici, le nombre total de cellules de la plage).

La boucle For affecte la valeur initiale au compteur de boucle, exécute tou-tes les instructions jusqu’à l’instruction Next, ajoute 1 au compteur de bou-cle puis compare celui-ci à la valeur de fin. Si la valeur du compteur deboucle est supérieure à la valeur de fin, la boucle For saute après l’instruc-tion Next. Si la valeur du compteur de boucle est inférieure ou égale à lavaleur finale, la boucle For s’exécute à nouveau.

5. Appuyez de façon répétée sur F8 pour observer le fonctionnement de lamacro. Parcourez pas à pas au moins deux ou trois boucles, puis appuyez surF5 pour terminer la macro.

Employer une boucle For Each est très souvent plus pratique que d’employer uneboucle For. Une boucle For est toutefois un outil plus généraliste : vous pouveztoujours reproduire le comportement d’une boucle For Each à l’aide d’une boucleFor. Par exemple, voici comment vous pourriez écrire la macro ProtectSheets sansemployer For Each :

Sub ForProtectSheets() Dim mySheet As Worksheet Dim i As Integer For i = 1 to Worksheets.Count Set mySheet = Worksheets(i) mySheet.Select mySheet.Protect "Password", True, True, True Next iEnd Sub

Une boucle For est un peu plus dangereuse qu’une boucle For Each, car vousdevez veiller à ce que les valeurs initiale et de fin soient correctes. Si la valeur

Dépannage Si vous exécutez une macro qui contient une boucle infinie, arrêtezla macro en appuyant sur CTRL+BREAK.

Page 255: Excel 2007 VBA

Création de boucles 235

finale est inférieure à la valeur initiale, la boucle s’exécutera sans fin : une condi-tion connue sous le nom de boucle infinie. Il est impossible d’aboutir à une boucleinfinie avec une boucle For.

Boucle infinie à l’aide d’une boucle DoUne boucle For Each fonctionne sur une collection. Une boucle For parcourt desnombres depuis un point initial jusqu’à un point final. Dans certaines situations,aucune de ces deux options ne fonctionne.

Par exemple, supposez que vous vouliez récupérer les noms de tous les classeursExcel du dossier actif. Visual Basic dispose d’une fonction qui récupère les nomsdes fichiers d’un dossier (ou répertoire). Cette fonction se nomme Dir, d’après lacommande du même nom de l’ancien système d’exploitation MS-DOS. Lors dupremier emploi de Dir, vous lui fournissez comme argument le type de fichierrecherché. Pour récupérer le nom du premier classeur Excel du dossier actif, vousemployez l’instruction myFile = Dir("*.xlsx"). Pour obtenir le prochain fichier quirépond au même motif, vous employez à nouveau Dir, mais sans argument. Vousdevez exécuter Dir de façon répétée car il ne renvoie qu’un nom de fichier à lafois. lorsque Visual Basic ne peut trouver d’autre fichier, la fonction Dir renvoieune chaîne vide.

Comment donc créer une macro qui récupère les noms de tous les fichiers Exceldu dossier courant ? La liste des fichiers d’un dossier n’est pas une collection, sibien qu’il est impossible d’employer une boucle For Each.

Vous ne pouvez pas employer non plus une boucle For, car vous ne savez pascombien de fichiers comporte le dossier avant d’avoir terminé. Visual Basic pro-pose heureusement une autre façon de contrôler une boucle : la boucle Do.

La macro ListFiles du fichier texte Flow récupère les deux premiers fichiers Exceldu dossier actif et les place dans les deux premières cellules de la premièrecolonne de la feuille de calcul active. Voici la macro originale :

Sub ListFiles() Dim myRow As Integer Dim myFile As String myRow = 1 myFile = Dir("*.xlsx") Cells(myRow, 1) = myFile myRow = myRow + 1 myFile = Dir Cells(myRow, 1) = myFileEnd Sub

Outre les instructions de déclaration de variable, cette macro se compose de deuxgroupes de trois instructions. Dans chaque groupe, la macro affecte un numéro

Page 256: Excel 2007 VBA

236 Chapitre 7 Contrôle de Visual Basic

de ligne à myRow, récupère un nom de fichier à l’aide de la fonction Dir, puisplace celui-ci dans la cellule adéquate. Lors du premier emploi de dir, la macrospécifie le motif recherché. Elle emploie ensuite Dir sans argument pour récupérerle prochain fichier correspondant. Regardez comment modifier cette macro pourqu’elle effectue une boucle jusqu’à avoir identifié tous les fichiers du dossier.

1. Copiez la macro ListFiles du fichier texte et collez-la dans un module VBAdu classeur Chapitre07.

2. Dans le classeur Chapitre07, activez la feuille de calcul Files.

3. Vérifiez que le classeur actif est celui qui renferme les fichiers d’exercicespour ce livre. Cliquez sur le Bouton Microsoft Office, cliquez sur Ouvrir,naviguez jusqu’au dossier correct puis cliquez sur Annuler.)

4. Dans l’éditeur Visual Basic, cliquez dans la macro ListFiles et appuyez defaçon répétée sur F8 pour exécuter la macro en mode pas à pas. Les nomsdes fichiers récupérés peuvent différer de ceux de ces figures. Vérifiez quevous comprenez la macro originale.

5. À la fin de la première instruction qui contient une fonction Dir, insérez unenouvelle ligne et saisissez Do Until myFile = "" (sans espace entre lesguillemets).

Cette instruction débute la boucle. La boucle commence après la premièrefonction Dir car vous n’employez qu’une fois Dir avec un argument.

6. À la fin de la seconde instruction qui contient une fonction Dir, insérez unenouvelle ligne et saisissez Loop.

Cette instruction termine la boucle et renvoie Visual Basic au début de celle-ci, pour vérifier s’il faut quitter la boucle.

7. Supprimez la seconde instruction Cells(myRow, 1) = myFile.

Cette instruction est devenue superflue car la boucle répète l’affectationautant de fois que nécessaire.

Astuce Tandis que vous parcourez la macro, placez le pointeur de la souris sur unnom de variable pour voir la valeur qui y est actuellement stockée.

Page 257: Excel 2007 VBA

Création de boucles 237

8. Juste avant l’instruction myRow = 1, insérez une ligne puis saisissez l’ins-truction Cells.Clear.

Cela garantit que la feuille de calcul est vide, en cas d’exécution multiple dela macro alors que certaines listes sont plus courtes que d’autres.

9. Indentez les trois instructions entre les instructions Do et Loop.

La macro modifiée devrait ressembler à ceci :

Sub ListFiles() Dim myRow As Integer Dim myFile As String Cells.Clear myRow = 1 myFile = Dir("*.xlsx") Do Until myFile = "" Cells(myRow, 1) = myFile myRow = myRow + 1 myFile = Dir LoopEnd Sub

L’expression myFile = "" située à la fin de l’instruction Do Until est uneexpression conditionnelle, exactement comme celles des instructions If. Elledoit être quelque chose que Visual Basic peut interpréter comme True ouFalse. Visual Basic répète simplement la boucle encore et encore jusqu’à ceque l’expression conditionnelle soit True. Remarquez que la condition peutne jamais être fausse, auquel cas la boucle ne s’exécute pas. Par exemple, sile dossier est dépourvu de fichier .xlsx, la condition d’arrêt est vraie dès lapremière exécution.

Si vous voulez incrémenter un nombre pendant la boucle, vous devez écrireune instruction à cet effet. Vous devez toujours veiller à ce que se produisedans la boucle un événement qui lui permette de prendre fin. Ici, vous récu-pérez un nouveau nom de fichier depuis la fonction Dir.

10. Appuyez à plusieurs reprises sur F8 pour observer le fonctionnement de lamacro. Exécutez pas à pas au moins deux ou trois boucles, puis appuyez surF5 pour terminer la macro.

Astuce Lorsque vous vous servez d’une macro pour écrire une liste dans unefeuille de calcul, vérifiez toujours que la feuille de calcul ne contient pas uneancienne liste. Vous pouvez recourir à Cells.Clear pour effacer la feuille de calcul ouemployer Worksheets.Add pour en créer une nouvelle.

Page 258: Excel 2007 VBA

238 Chapitre 7 Contrôle de Visual Basic

La boucle Do est la plus souple de toutes les structures de boucles. Elle permetd’accomplir tout ce que vous pouvez faire avec des boucles For Each ou For. Sivous deviez vous retrouver échoué sur une île déserte avec une seule structure deboucle, la boucle Do serait la plus utile.

Par exemple, voici comment vous pourriez écrire la macro ProtectSheets à l’aided’une boucle Do.

Sub ProtectSheets() Dim mySheet As Worksheet Dim i As Integer i = 1 Do Until i > Worksheets.Count Set mySheet = Worksheets(i) mySheet.Select mySheet.Protect "Password", True, True, True i = i + 1 LoopEnd Sub

Cette souplesse rend la boucle Do un peu plus compliquée que les autres : vousdevez créer et incrémenter votre propre variable de boucle et fournir une condi-tion de fin. Cela rend la boucle Do particulièrement prône à devenir une boucleinfinie. Par exemple, si vous oubliez d’ajouter l’instruction qui récupère un nou-veau nom de fichier ou placez l’instruction de la fonction Dir avec l’argument ausein de la boucle (si bien que Dir renverrait sans cesse le nom du premier fichier),vous avez une boucle infinie.

Dépannage Si vous exécutez une macro qui contient une boucle infinie, arrêtezla macro en appuyant sur CTRL+BREAK.

Astuce Les boucles Do possèdent plusieurs variantes intéressantes. Vous pouvezaffecter la boucle jusqu’à (until) que l’expression conditionnelle soit True ou pen-dant (while) que l’expression est True. Vous pouvez placer l’expression condition-nelle en haut de la boucle (dans l’instruction Do) ou en bas de la boucle (dansl’instruction Loop). Pour en apprendre plus sur les structures Do Loop, sélectionnezle mot Do dans la macro et appuyez sur F1.

Page 259: Excel 2007 VBA

Gestion de grandes boucles 239

Gestion de grandes bouclesUne boucle qui s’exécute deux ou trois fois ne diffère pas beaucoup d’un pro-gramme sans boucle. Elle s’exécute rapidement et il est facile de la parcourir enmode pas à pas pour voir le fonctionnement de chaque instruction.

Lorsqu’en revanche vous exécutez la même boucle des centaines ou des milliersde fois, vous devez recourir à quelques autres techniques pour être certain que lamacro fonctionne comme elle le devrait.

Définition d’un point d’arrêtLe fichier texte Flow comprend une macro nommée PrintOrders. Vous pouvez lavoir comme une macro rédigée par votre prédécesseur, juste avant qu’il ne quittel’entreprise, ou comme un travail que vous avez réalisé il y a plus de trois mois.Dans tous les cas, vous êtes en présence d’une macro que vous ne comprenez pasparfaitement et qui fonctionne moyennement.

La macro PrintOrders est censée imprimer une copie de la totalité du classeurOrders, et plus précisément une copie triée par catégorie de produits. Vous voulezremettre au responsable de chaque catégorie la section de l’état qui ne montreque les commandes pour sa catégorie : il faut une nouvelle page à chaque chan-gement de catégorie. Malheureusement, la macro ne fonctionne pas comme ellele devrait. Vous devez identifier le problème et y remédier. Voici la macro telle quevous l’avez reçue :

Sub PrintOrders() Dim myRow As Long Dim myStop As Long Workbooks.Open FileName:="orders.xls" Columns("E:E").Cut Columns("A:A").Insert Shift:=xlToRight Range("A1").CurrentRegion.Sort Key1:="Category", _ Order1:=xlAscending, Header:=xlYes myStop = Range("A1").CurrentRegion.Rows.Count For myRow = 3 To myStop If Cells(myRow, 1) <> Cells(myRow + 1, 1) Then Cells(myRow, 1).Select ActiveCell.PageBreak = xlPageBreakManual End If Next myRow Cells(myRow, 1).Select ActiveSheet.PageSetup.PrintTitleRows = "$1:$1" ActiveSheet.PrintPreview ActiveWorkbook.Close SaveChanges:=FalseEnd Sub

La meilleure approche est sans doute d’exécuter pas à pas la macro.

Page 260: Excel 2007 VBA

240 Chapitre 7 Contrôle de Visual Basic

1. Copiez la macro PrintOrders depuis le fichier texte et collez-la dans unmodule VBA du classeur Chapitre07.

2. Vérifiez que le dossier actif est celui qui contient les fichiers d’exercice de celivre. Cliquez sur le Bouton Microsoft Office, cliquez sur Ouvrir, naviguezjusqu’au dossier correct puis cliquez sur Annuler.)

3. Dans l’éditeur Visual Basic, cliquez dans la macro PrintOrders puis appuyeztrois fois sur F8 pour passer les déclarations de variables et ouvrir le classeurOrders.

4. Appuyez à nouveau trois fois sur F8.

Ces instructions déplacent le champ Category dans la colonne A puis trientla liste par catégorie.

5. Appuyez deux fois sur F8 pour affecter un nombre à myStop et démarrer laboucle. Placez le pointeur de la souris sur myStop puis sur myRow pourvoir les valeurs affectées.

La valeur de myStop est 3266 et la valeur de myRow est 3. Ces valeurs sontcorrectes : la boucle va s’exécuter de la ligne 3 à la ligne 3266.

6. Appuyez à plusieurs reprises sur F8.

Visual Basic continue à vérifier si la cellule de la ligne active correspond àcelle de la cellule supérieure. Combien la catégorie Art comporte-t-elle delignes ? Appuyer de façon répétée sur F8 jusqu’à ce que la macro identifie ladernière ligne de la catégorie pourrait demander un temps certain. Enrevanche, appuyer sur F5 exécute le reste de la macro sans permettred’observer ce qui se passe lorsque la condition de l’instruction If est True. Siseulement il existait un moyen d’exécuter rapidement toutes les instructionsjusqu’à ce que la macro atteigne le bloc If….

Page 261: Excel 2007 VBA

Gestion de grandes boucles 241

7. Cliquez sur la zone grise à gauche de l’instruction qui débute par Active-Cell.

Un cercle rouge sombre apparaît dans la marge et l’arrière-plan de l’instruc-tion vire au rouge foncé. C’est un point d’arrêt. Lorsque vous définissez unpoint d’arrêt, la macro s’arrête lorsqu’elle atteint l’instruction du pointd’arrêt.

8. Appuyez sur F5 pour poursuivre la macro.

La macro s’arrête au point d’arrêt. Lorsqu’elle atteint celui-ci, la cellule activeest la première déterminée par l’instruction If comme étant différente de lacellule immédiatement supérieure.

9. Appuyez sur F8 pour exécuter l’instruction qui affecte un saut de pagemanuel.

Le saut de page apparaît au-dessus de la ligne, pas en dessous. C’est un pro-blème. Le saut de page ne devrait pas être fixé par la macro sur la dernièrecellule d’une catégorie, mais sur la première cellule d’une catégorie. L’ins-truction If devrait d’abord vérifier si la cellule est différente de celle situéeau-dessus.

10. Modifiez le signe plus (+) de l’instruction If en un signe moins (-). L’instruc-tion modifiée est la suivante : If Cells(myRow, 1) <> Cells(myRow - 1, 1) Then

11. Cliquez sur le bouton Réinitialiser, appuyez sur F5, puis cliquez sur Ouipour rouvrir le fichier Orders. Appuyez ensuite sur F8 pour observer le fonc-tionnement (cette fois correct) de l’instruction critique : elle affecte le sautde page après la catégorie Art.

12. Cliquez sur le cercle rouge dans la marge pour désactiver le point d’arrêt.

Page 262: Excel 2007 VBA

242 Chapitre 7 Contrôle de Visual Basic

Définir un point d’arrêt est un outil précieux pour identifier un problème aumilieu d’une longue boucle. Vous allez apprendre dans la section suivante unmoyen facile de définir un point d’arrêt temporaire si vous devez ne l’employerqu’une fois.

Définir un point d’arrêt temporaireUn point d’arrêt arrête la macro chaque fois que celle-ci atteint l’instruction. Lepoint d’arrêt demeure jusqu’à ce que vous le supprimiez. Et si vous vouliez créerun point d’arrêt temporaire, qui ne serve qu’une fois ? Par exemple, supposez quevous exécutiez en mode pas à pas la macro PrintOrders jusqu’à son milieu. Lecode d’affectation d’un saut de page semble fonctionner correctement. Il restetoutefois quelques instructions à la fin de la macro que vous aimeriez parcourir.

1. Si vous n’exécutez pas déjà la macro en mode pas à pas, appuyez sur F8 pourdémarrer la macro.

2. Cliquez n’importe où dans l’instruction Cells(myRow, 1).Select après la finde la boucle pour placer le point d’insertion dans cette instruction.

Vous voulez un point d’arrêt dans cette instruction, mais de façon à pouvoirne l’employer qu’une fois.

3. Dans le menu Débogage, cliquez sur la commande Exécuter jusqu’au cur-seur.

La macro s’exécute sur toutes les pages de l’état puis s’arrête sur l’instructionoù se trouve le curseur.

4. Appuyez trois fois sur F8 pour descendre jusqu’en bas de la liste, définir lestitres d’impression et obtenir l’aperçu avant impression de l’état. Lorsque lamacro s’est arrêtée sur une instruction, vous pouvez poursuivre le mode pasà pas à partir de cette instruction.

Page 263: Excel 2007 VBA

Gestion de grandes boucles 243

5. Examinez l’état. Cliquez à plusieurs reprises sur Page suivante pour attein-dre la page 10 et voir la fin de la catégorie Art.

6. Fermez l’Aperçu avant impression, et appuyez deux fois sur F8 pour termi-ner la macro.

7. Enregistrez le classeur Chapitre07.

Désactiver un point d’arrêt est aussi simple que l’activer : cliquez simplement dansla marge gauche de l’éditeur Visual Basic. Si toutefois activer et désactiver unpoint d’arrêt est trop fastidieux, vous pouvez créer un point d’arrêt temporaire enexécutant la macro jusqu’au curseur.

Affichage de la progression dans une boucleMême si la boucle d’une macro fonctionne parfaitement, vous pourriez supposerque quelque chose se passe mal si la macro nécessite beaucoup de temps pours’exécuter. La meilleure façon de garantir une tranquillité parfaite lors de l’exécu-tion d’une longue boucle (surtout si vous vous demandez si vous avez le tempsd’aller boire un café) consiste à afficher la progression de la boucle.

Vous pouvez afficher la progression de n’importe quel type de boucle. Une bou-cle For se prête toutefois particulièrement bien à cet exercice : votre macro peutdéterminer à tout moment de la boucle la valeur actuelle du compteur de boucleet la comparer à la valeur finale.

1. Dans la macro PrintOrders, insérez l’instruction suivante immédiatementaprès l’instruction For :

Application.StatusBar = "Traitement de la ligne " & myRow & " sur " & myStop

Dépannage Si vous ne voyez pas la fin de la catégorie Art à la page 10, cliquezsur Page suivante ou sur Page précédente pour localiser la page correcte. Le pilotede votre imprimante par défaut peut avoir placé la fin de la catégorie sur une autrepage.

Page 264: Excel 2007 VBA

244 Chapitre 7 Contrôle de Visual Basic

La barre d’état en bas de la fenêtre Excel dit généralement « Prêt ». La pro-priété StatusBar de l’objet Application permet de lui faire dire ce que vousvoulez. Le meilleur message est celui qui indique la progression et donneune idée du temps nécessaire à la tâche.

L’instruction que vous avez ajoutée crée ce message de la première entréedans la boucle : « Traitement de la ligne 3 sur 3300 ». En employant uneéperluette (&) pour concaténer le texte du message avec les nombres desvariables myRow et myStop, vous pouvez créer un message utile. Veillezseulement à bien ajouter un espace avant et après les nombres.

2. Appuyez sur F5 pour exécuter la macro. Examinez la barre d’état pour voir laprogression de la macro.

3. Fermez la page Aperçu avant impression pour laisser se terminer la macro.

La barre d’état indique que la macro est toujours en cours d’exécution. Ellen’est pas automatiquement réinitialisée à la fin de votre macro. Pour redon-ner le contrôle de la barre d’état à Excel, vous devez lui affecter la valeurFalse.

4. Après l’instruction Next, insérez l’instruction :

Application.StatusBar = False

5. Exécutez à nouveau la macro, fermez la fenêtre Aperçu avant impressionau moment adéquat et examinez la barre d’état : elle est redevenue nor-male.

6. Enregistrez le classeur Chapitre07.

Visual Basic propose des outils particulièrement puissants pour répéter des ins-tructions dans une boucle. Combinés avec les décisions que vous pouvez prendreà l’aide des blocs If, ces outils permettent de concevoir des macros aussi intelli-gentes que puissantes.

FERMEZ le classeur Chapitre07.xlsm.

Page 265: Excel 2007 VBA

Points clés 245

Points clés● Servez-vous d’une structure If pour prendre une décision. Ajoutez une

clause Else si vous avez besoin d’actions différentes pour les conditions Trueet False.

● Lorsque vous employez une boîte de message MsgBox, servez-vous del’argument Buttons pour créer des choix explicites. Lorsque vous vérifiez lerésultat de MsgBox, veillez à effectuer le test à l’aide de la constante adé-quate.

● Lorsque vous employez InputBox, pensez à envisager tous les types de sai-sies possibles : valide, invalide, inexistante. Créez une structure If pour gérertoutes les conditions possibles.

● Lorsque vous devez parcourir une collection, une boucle For Each estl’option la plus simple.

● Lorsqu’un compteur doit vous aider au cours de votre travail dans une bou-cle, par exemple pour synchroniser deux objets, servez-vous d’une boucleFor.

● Lorsque vous devez effectuer une boucle tant qu’une condition est True oujusqu’à ce qu’elle le soit, servez-vous d’une boucle Do. Une boucle Do esttrès souple, mais prenez garde à ne pas créer une boucle infinie.

● Définissez des points d’arrêts permanents et temporaires lorsque vous devezdépanner de grandes macros ou boucles.

Page 266: Excel 2007 VBA

Créer une fonction de feuille de calcul personnalisée, page 249

Capturer les erreurs d’exécution, page 266

Répéter une commande jusqu’à la fin d’une erreur, page 264

Créer un message d’erreur personnalisé, page 269

Coup d’œil sur le chapitre

Page 267: Excel 2007 VBA

247

8 Extension d’Excel et de Visual Basic

Ce chapitre aborde les points suivants :✔ Création et emploi de fonctions personnalisées ;✔ Gestion des erreurs au cours de l’exécution d’une macro.

Une cellule de bactérie est dépourvue de noyau. Une cellule sans noyau est nom-mée procaryote. Les procaryotes sont capitaux. Les premiers fossiles connus, datésde trois milliards d’années et demie, sont tous des procaryotes. Ils sont égalementde très faible taille. En 1999, Heide Schulz a découvert l’espèce de procaryotesThiomargarita namibiensis, dont la taille des individus pouvait atteindre 0,75millimètre : la tête d’un moucheron à fruit (ou drosophile). C’est une taille énormepour une bactérie, mais bien faible comparée par exemple à celle d’un chiot. Unorganisme unicellulaire pourvu d’un noyau est nommé eucaryote. Les eucaryotespeuvent atteindre une taille bien supérieure à celle des procaryotes car ils possè-dent une structure interne. L’organisme unicellulaire de plus grande taille connuest la Caulerpa taxifolia. Cette algue marine toxique envahit la Méditerranéedepuis 1984. Elle a été découverte en Californie, au large de San Diego enjuin 2000. Un pied de Caulerpa, composé d’une unique cellule, peut atteindre unmètre de long. Vous pourriez penser que la Caulerpa unicellulaire n’est pas sigrande, mais sa taille reste phénoménale par rapport à celle de l’unicellulaireThiomargarita. La différence est due à sa structure interne. La Caulerpa est uneucaryote doté d’un noyau, avec la structure qui accompagne celui-ci. C’est lastructure qui conditionne la taille fonctionnelle.

Les macros enregistrées sont comme des procaryotes. L’enregistreur de macroplace toutes vos actions dans une unique procédure non structurée. Comme lesprocaryotes, les macros à procédure unique sont généralement de faible taille.Les grandes applications sophistiquées ressemblent plus à des eucaryotes. Pourqu’une application complexe fonctionne correctement, vous devez lui donnerune structure interne : la diviser en procédures élémentaires. En outre, exacte-ment comme les organismes complexes nécessitent un système immunitaire pour

Page 268: Excel 2007 VBA

248 Chapitre 8 Extension d’Excel et de Visual Basic

lutter contre les maladies, les applications sophistiquées nécessitent un méca-nisme pour gérer les conditions d’erreur.

Vous allez apprendre dans ce chapitre à créer des fonctions personnalisées, àemployer des arguments dans des procédures et à gérer les erreurs : tous outilsindispensables à la création d’applications puissantes.

Création de fonctions personnaliséesAprès avoir affecté une valeur à une variable, vous pouvez employer cette valeurdans n’importe quelle expression. Par exemple, après avoir affecté le nombre 25 àla variable monAge, la valeur de l’expression conditionnelle monAge > 20 seraTrue puisque 25 est supérieur à 20. Vous employez la variable comme s’il s’agissaitde la valeur qu’elle contient.

Une fonction est similaire à une variable, mais est plus intelligente. Une fonctionest une variable qui calcule sa propre valeur lorsque vous vous en servez. Parexemple, Microsoft Visual Basic possède une fonction nommée Time. Lorsquevous employez l'expression conditionnelle Time > #8:00 PM#, la fonction Timeregarde si l’heure de l’horloge de votre ordinateur est postérieure à 8 heures dusoir.

Visual Basic dispose de nombreuses fonctions intégrées. Il en va de même deMicrosoft Office Excel 2007. Ces fonctions sont utiles, mais ne peuvent être per-sonnalisées. Même si vous identifiez une fonction très proche de ce que vousrecherchez, vous ne pouvez pas pénétrer à l’intérieur de Visual Basic pour modi-fier son comportement. Vous pouvez en revanche créer votre propre fonction.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

SERVEZ-VOUS d’un nouveau classeur vierge prenant en charge les macros et dufichier texte Structure.txt, situé dans le dossier Documents\MSP\ExcelVBA07SBS. Lefichier texte Structure contient certaines macros initiales que vous allez copier dansvotre classeur et modifier au cours de ce chapitre. Elles sont stockées dans unfichier texte pour que vous puissiez vérifier qu’elles sont dépourvues de tout codemalveillant avant de les placer dans un emplacement approuvé.VEILLEZ À enregistrer le nouveau classeur prenant en charge les macros sous lenom Chapitre08.xlsm dans le dossier approuvé créé au Chapitre 1. OUVREZ le classeur Chapitre08, puis renommez Feuil1 en TestFonction.

Page 269: Excel 2007 VBA

Création de fonctions personnalisées 249

Comme votre fonction peut s’appuyer sur toute fonction interne Excel ou VisualBasic et que vous pouvez personnaliser à loisir vos propres fonctions, vous arrive-rez au même résultat que si vous aviez modifié directement les fonctions inté-grées.

Emploi d’une fonction personnalisée de feuille de calculExcel et Visual Basic disposent tous deux de fonctions qui renvoient un nombrealéatoire compris entre 0 et 1. La fonction Excel se nomme RAND() et la fonctionVisual Basic Rnd. Vous pouvez employer la fonction Excel dans une cellule defeuille de calcul, mais la fonction Visual Basic ne peut être employée que dans unemacro.

Vous ne pouvez pas personnaliser la fonction Visual Basic Rnd ou la fonction ExcelRAND(). Vous pouvez toutefois créer une fonction personnalisée de générationde nombres aléatoires (nommons-la Random) utilisable depuis Excel. Pourquoivouloir créer votre propre fonction de nombres aléatoires alors que vous pourriezemployer la fonction intégrée d’Excel ? Uniquement parce que vous voulez quevotre fonction Random se comporte un peu différemment de celle d’Excel. Aprèsavoir créé votre propre fonction, vous pouvez en faire ce que vous voulez.

1. Entrez la formule =Random() dans la cellule A3 de la feuille TestFonction.

Excel affiche la valeur d’erreur #NOM?. La fonction Random n’existe pasencore.

2. Cliquez sur le bouton Macros, saisissez Random dans la zone Nom de lamacro, puis cliquez sur Créer.

3. Double-cliquez sur le mot Sub au début de la macro et remplacez-le parFunction.

L’instruction End Sub se modifie en End Function. Vous avez créé une fonc-tion. Vous devez maintenant indiquer à Excel quelle doit être la valeur de lafonction.

4. Saisissez l’instruction Random = Rnd comme corps de la fonction.

Page 270: Excel 2007 VBA

250 Chapitre 8 Extension d’Excel et de Visual Basic

La fonction modifiée devrait ressembler à ceci :

Function Random() Random = RndEnd Function

Vous indiquez à une fonction la valeur qu’elle doit renvoyer en affectant unevaleur au nom de la fonction, comme si la fonction était une variable. Cettefonction récupère simplement la valeur de la fonction Visual Basic Rnd etl’affecte à la fonction Random.

5. Repassez à Excel, sélectionnez la cellule A3, puis cliquez sur le bouton Insé-rer une fonction situé à côté de la barre de formule.

Excel affiche la fenêtre Arguments de la fonction, qui explique que la fonc-tion Random n’accepte aucun argument.

6. Cliquez sur OK pour entrer le nombre aléatoire dans la cellule A3.

C’est tout ce qui est nécessaire pour créer une fonction de feuille de calculsimple. Dans l’éditeur Visual Basic, vous remplacez le mot Sub par le motFunction, puis, quelque part dans la fonction, vous affectez une valeur aunom de la fonction. Dans Excel, vous placez le nom de la fonction dans uneformule, suivi de parenthèses.

Ajout d’arguments à une fonction personnaliséeSupposez que dans votre feuille de calcul vous vouliez une formule qui génèredes nombres entiers aléatoires compris entre 75 et 125. Ou entre 900 et 1 100. Lafonction Excel RAND() ne peut produire ce genre de nombre aléatoire. La vôtrenon plus, d’ailleurs. Mais comme il s’agit d’une fonction personnalisée, vous pou-vez augmenter ses fonctionnalités en la dotant d’arguments.

Lorsque vous ajoutez des arguments à une fonction, vous devez décider ce quiconstituerait de bons arguments. De bons arguments procurent uniquement lesinformations nécessaires, mais sont assez généraux pour permettre d’accomplirde nombreuses choses avec la fonction, et enfin ne se recouvrent pas de façontroublante. Un bon ensemble d’arguments pour votre fonction Random seraitcomposé des trois arguments suivants : un pour spécifier le point médian, un

Page 271: Excel 2007 VBA

Création de fonctions personnalisées 251

pour spécifier la plage d’écart et un pour spécifier si le nombre final doit être ounon arrondi.

Vous pouvez ajouter ces arguments à votre fonction.

1. Dans l’éditeur Visual Basic, saisissez Midpoint, Range, Round entre lesparenthèses après le nom de la fonction.

L’instruction qui contient le nom de la fonction et ses arguments est nom-mée instruction de déclaration de fonction. Dans une instruction de déclara-tion de fonction, vous déclarez le nom de la fonction ainsi que les noms detous les arguments. Votre instruction de déclaration de fonction modifiéedevrait ressembler à ceci :

Function Random(Midpoint, Range, Round)

Ces trois mots sont les arguments de la fonction. Vous pouvez les employerdans la fonction comme des variables préremplies avec des valeurs.

2. Modifiez l’instruction qui affecte une valeur au nom de la fonction commesuit :

Random = Rnd * (Range * 2) + (Midpoint – Range)

Pour comprendre cette formule, supposez que l’écart souhaité est 25 et lepoint médian 100. Cela signifie que vous voulez un nombre égal à 100 plusou moins 25, ou, en d’autres termes, compris entre 75 et 125. La dispersiontotale est de 50, le double de l’écart. La fonction Visual Basic Rnd renvoie unnombre aléatoire compris entre 0 et 1. Multiplier Rnd par Range * 2 donneun nombre aléatoire compris entre 0 et 50. Pour obtenir des nombres com-pris entre 75 et 125, vous devez ajouter 75. Soustraire Range de Midpointdonne le 75 nécessaire.

3. Insérez ces trois instructions pour arrondir le nombre si cela est demandé :

If Round Then Random = CLng(Random)End If

En Visual Basic, un Long est un entier qui peut contenir de grands nombres.La fonction Visual Basic CLng convertit un nombre en Long en l’arrondissantau passage. Vous n’arrondissez le nombre aléatoire que si la valeur de l’argu-ment Round est True. Comme la valeur de cet argument est déjà égale àTrue ou à False, vous n’avez pas besoin de la comparer à quoi que ce soitpour obtenir une expression conditionnelle. La fonction terminée devraitressembler à ceci :

Function Random(Midpoint, Range, Round) Random = Rnd * (Range * 2) + (Midpoint – Range) If Round Then

Page 272: Excel 2007 VBA

252 Chapitre 8 Extension d’Excel et de Visual Basic

Random = CLng(Random) End IfEnd Function

4. Dans Excel, saisissez 100 dans la cellule B3, 25 dans la cellule C3, puis VRAIdans la cellule D3.

Vous allez employer ces valeurs pour les arguments Midpoint, Range etRound de votre fonction. La formule de la cellule C3 va générer une erreurcar elle ne correspond plus à la déclaration de la fonction.

5. Sélectionnez la cellule A3 et cliquez sur le bouton Insérer une fonctionsitué à côté de la barre de formule. La fenêtre Arguments de la fonctionapparaît, montrant les trois nouveaux arguments de votre fonction.

6. Cliquez dans la zone de texte Midpoint, puis cliquez sur la cellule B3. Cli-quez dans la zone Range, puis cliquez sur la cellule C3. Cliquez dans la zoneRound et cliquez sur la cellule D3. Cliquez enfin sur OK.

Après l’ajustement de la formule, la cellule A3 contient un nombre aléatoirecompris entre 75 et 125. Vous employez des arguments pour transmettredes valeurs à une fonction.

7. Modifiez la cellule B3 en 1000 et la cellule C3 en 100.

Astuce Pour découvrir d’autres fonctions de conversion de types de données,dans l’éditeur Visual Basic, cliquez sur CLng, appuyez sur F1 puis recherchez Fonc-tions de conversion de types de données.

Page 273: Excel 2007 VBA

Création de fonctions personnalisées 253

La valeur de la cellule A3 se modifie en un nombre aléatoire compris entre900 et 1 100. Lorsque vous modifiez la valeur d’une cellule à laquelle lafonction fait référence, celle-ci calcule une nouvelle réponse.

L’ajout d’arguments est une façon de rendre plus souples les fonctions.

Fonction volatileLa plupart des fonctions ne se recalculent que lorsque la valeur d’une des cellulesd’entrée de la fonction est modifiée. D’autres fonctions, comme la fonction ExcelRAND(), portent le nom de fonctions volatiles : elles se recalculent suite à la modi-fication de n’importe quelle cellule de la feuille de calcul ou à un appui sur F9.Vous pouvez rendre volatile votre fonction de façon à ce qu’elle calcule un nou-veau nombre à chaque appui sur F9.

1. Dans Excel, appuyez à plusieurs reprises sur F9 de façon à vérifier que lenombre aléatoire de la cellule A3 ne change pas.

2. Dans l’éditeur Visual Basic, insérez l’instruction suivante après l’instructionde déclaration de fonction :

Application.Volatile True

3. Revenez à Excel et appuyez sur F9.

Le nombre aléatoire de la cellule A3 change. Appuyez plusieurs fois sur F9pour vérifier que la fonction calcule des nombres aléatoires compris dans laplage spécifiée par les arguments.

Vous souhaiterez rarement qu’une fonction personnalisée soit volatile : vous pré-férerez qu’elle ne se recalcule qu’après la modification d’une de ses valeursd’entrée. Dans les rares cas où vous voudrez disposer d’un recalcul automatique,servez-vous simplement de la méthode volatile de l’objet Application aveccomme argument True.

Arguments facultatifsLe seul problème avec cette nouvelle fonction Random améliorée est qu’elle estplus complexe à employer dans les cas simples où les nouveaux arguments sontsuperflus. Si vous saisissez =Random() sans les arguments dans une cellule, Excelaffiche la valeur d’erreur #VALEUR!.

Page 274: Excel 2007 VBA

254 Chapitre 8 Extension d’Excel et de Visual Basic

Pour éviter cette erreur, vous pouvez signaler à Visual Basic que les argumentssont facultatifs. Vous spécif iez ensuite des valeurs par défaut, employéeslorsqu’un argument n’est pas spécifié.

1. Dans l’éditeur Visual Basic, saisissez le mot Optional devant chacun des troisnoms d’argument. Vous pouvez si vous le souhaitez insérer un caractère depoursuite de ligne pour répartir l’instruction sur deux lignes.

L’instruction devrait se présenter comme suit :

Function Random(Optional Midpoint, _Optional Range, Optional Round)

Il n’est pas obligatoire de rendre facultatifs tous les arguments. Toutefois,tous les arguments qui suivent un argument facultatif doivent l’être égale-ment. Autrement dit, vous devez placer les arguments facultatifs à la fin dela liste des arguments.

2. Dans l’éditeur Visual Basic, saisissez = 0.5 après le mot Midpoint, = 0.5 aprèsle mot Range et = False après le mot Round. Divisez l’instruction en deuxlignes après la première virgule.

L’instruction obtenue devrait être la suivante :

Function Random(Optional Midpoint = 0.5, _Optional Range = 0.5, Optional Round = False)

Vous pouvez spécifier une valeur par défaut à n’importe quel argumentfacultatif. Vous affectez la valeur par défaut au nom de l’argument exacte-ment comme vous affectez une valeur à une variable, à l’aide d’un simplesigne égal.

3. Dans Excel, saisissez =Random() dans la cellule A4. Un nombre aléatoirecompris entre 0 et 1 apparaît.

4. Supprimez les formules de la feuille de calcul qui emploient la fonction Ran-dom (cellules A3 et A4) de façon à pouvoir parcourir les autres macros de lasuite de ce chapitre sans devoir parcourir la fonction Random.

Les arguments facultatifs permettent d’ajouter de puissantes fonctionnalités à unefonction tout en la conservant d’emploi simple lorsque ces fonctionnalités avan-cées sont superflues. Pour rendre facultatif un argument, ajoutez le mot Optionaldevant son nom. Pour ajouter une valeur par défaut, affectez une valeur au nomde l’argument comme s’il s’agissait d’une variable.

Page 275: Excel 2007 VBA

Création de fonctions personnalisées 255

Emploi d’une fonction personnalisée à partir d’une macroVous pouvez employer une fonction personnalisée dans une macro aussi facile-ment que dans une cellule de feuille de calcul.

1. Dans l’éditeur Visual Basic, saisissez Sub TestRandom en bas du module,puis appuyez sur ENTRÉE pour commencer à créer une macro.

2. Saisissez MsgBox et un espace. Visual Basic affiche la bulle d’Info Expressavec les arguments de MsgBox.

3. Appuyez sur CTRL+BARRE D’ESPACE pour voir la liste des méthodes et proprié-tés globales, puis appuyez sur la touche R pour atteindre les mots qui com-mencent par R.

Votre fonction Random est automatiquement ajoutée à la liste. Elle arborel’icône d’une méthode. Les méthodes Excel sont simplement des fonctionsintégrées à Excel. Vous créez de nouvelles méthodes globales en écrivant denouvelles fonctions.

4. Appuyez sur la touche TAB pour insérer le nom de la fonction dans l’instruc-tion, puis saisissez une parenthèse ouvrante pour débuter la liste des argu-ments.

Visual Basic affiche la bulle d’Info Express avec les arguments de votre fonc-tion personnalisée. Elle montre même les valeurs par défaut des argumentsfacultatifs !

5. Saisissez 200, 5, True comme liste des arguments, puis saisissez une paren-thèse fermante.

6. Appuyez sur F5 pour exécuter la macro, puis cliquez sur OK à l’apparition devotre nombre aléatoire.

Page 276: Excel 2007 VBA

256 Chapitre 8 Extension d’Excel et de Visual Basic

Une fonction est une procédure comme une procédure Sub, si ce n’estqu’elle renvoie une valeur lorsque vous l’employez tant dans une celluled’Excel ou dans une macro.

Gestion des erreursCroyez-le ou non, les programmes informatiques ne fonctionnent pas toujoursparfaitement. Il pourra vous arriver d’écrire une macro qui ne fonctionne pascomme elle le devrait. Ces erreurs se répartissent en plusieurs types.

Erreurs de syntaxeIl s’agit d’erreurs comme l’omission d’un guillemet fermant, après avoir saisi leguillemet ouvrant. Lorsque vous saisissez l’instruction dans une procédure, l’édi-teur Visual Basic vérifie l’instruction à la recherche des erreurs de syntaxe dès quevous quittez celle-ci.

Erreurs de compilationCertaines erreurs ne peuvent être détectées sur une unique ligne. Par exemple,vous pourriez débuter une boucle For Each et oublier de placer une instructionNext à la fin. Lors de la première tentative d’exécution d’une procédure, VisualBasic traduit celle-ci (ainsi que les autres procédures du module) dans le langageinterne de l’ordinateur. Cette traduction en langage informatique est nomméecompilation et les erreurs détectées par Visual Basic au cours de la traduction sontnommées erreurs de compilation. Les erreurs de syntaxe et de compilation sontgénéralement faciles à identifier et à régler.

Important Une fonction employée dans une cellule de feuille de calcul ne peutcomprendre que les actions qui peuvent être exécutées lorsque Excel recalcule unefeuille de calcul. Souvenez-vous que certaines cellules peuvent être recalculéesplusieurs fois. Des actions comme l’ouverture de fichier ou l’affichage d’une boîtede message ne peuvent être placées que dans une fonction appelée depuis unemacro. Si vous les placez dans une fonction appelée depuis une feuille de calcul, lafonction renvoie simplement la valeur d’erreur #VALEUR!.

Astuce Visual Basic peut rechercher les fautes d’orthographe lorsque vousemployez des variables. Dans le menu Outils de Visual Basic, cliquez sur la com-mande Options, cochez la case Déclaration des variables obligatoire, puis cliquezsur OK. Visual Basic ajoute alors l’instruction Option Explicit à tout nouveaumodule. Lorsque Option Explicit apparaît en haut du module, Visual Basic afficheune erreur de compilation lors de tout emploi d’une variable non déclarée.

Page 277: Excel 2007 VBA

Gestion des erreurs 257

Erreurs de logiqueL’ordinateur peut ne jamais détecter certaines erreurs. Par exemple, si vous voulezmodifier le titre d’un classeur en Mon Classeur, mais l’écrivez par erreur Mon Cla-seur, l’ordinateur ne se plaindra pas. Si vous comparez de nouvelles valeurs avec lacopie erronée d’anciennes valeurs, l’ordinateur ne trouvera pas cette erreur à votreplace. Vous pouvez activer et désactiver des points d’arrêts, parcourir pas à pas lesprocédures et examiner les valeurs, mais l’identification du problème reste devotre ressort.

Erreurs d’exécutionIl arrive qu’une instruction d’une procédure fonctionne dans certaines conditionset échoue dans d’autres. Par exemple, vous pourriez posséder une instruction quiefface un fichier de votre disque dur. Tant que le fichier existe et peut être sup-primé, l’instruction fonctionne. En revanche, si le fichier n’existe pas, Visual Basicne sait pas faire autrement que de s’arrêter avec un message d’erreur.

Ces erreurs ne peuvent être détectées avant l’exécution de la procédure : c’estpourquoi elles sont nommées erreurs d’exécution. Certaines erreurs d’exécutionsignalent un problème. D’autres sont des situations que vous pouvez anticiper etprogrammer Visual Basic pour qu’il les gère automatiquement. Visual Basic pro-pose des outils qui peuvent vous aider à gérer n’importe quel type d’erreur d’exé-cution.

Ignorer une erreurSupposez que vous vouliez créer une macro qui crée une feuille de calcul d’étattemporaire. La macro doit ajouter une feuille de calcul nommée Report au clas-seur actif, en remplaçant toute feuille de calcul existante nommée Report. Lefichier texte Structure contient la macro MakeReport, qui crée et nomme la feuillede calcul Report. Voici la macro originale :

Sub MakeReport() Dim mySheet As Worksheet Set mySheet = Worksheets.Add mySheet.Name = "Report"End Sub

La macro ajoute une feuille de calcul et affecte une référence vers la nouvellefeuille de calcul à la variable mySheet. Elle modifie ensuite la propriété Name dela feuille.

1. Copiez la macro MakeReport depuis le fichier texte Structure et collez-ladans un module du classeur Chapitre08.

Page 278: Excel 2007 VBA

258 Chapitre 8 Extension d’Excel et de Visual Basic

2. Placez le point d’insertion n’importe où dans la macro MakeReport, puisappuyez sur F5 pour exécuter la macro.

Vous devriez voir une nouvelle feuille de calcul nommée Report dans le clas-seur Excel actif. La macro fonctionne parfaitement, ou du moins paraît lefaire. Que se passe-t-il toutefois si vous l’exécutez à nouveau ?

3. Appuyez à nouveau sur F5 pour exécuter la macro une seconde fois.

Visual Basic affiche un message d’erreur qui vous signale que vous ne pou-vez pas nommer une feuille à l’aide du nom d’une feuille existante. La solu-tion est simple : il vous suffit d’effacer l’ancienne feuille Report avant derenommer la nouvelle feuille.

4. Cliquez sur le bouton Fin pour supprimer le message d’erreur, puis insérezces deux instructions avant celle qui renomme la feuille de calcul :Application.DisplayAlerts = FalseWorksheets("Report").Delete

Fixer DisplayAlerts à False désactive les messages d’alerte, si bien que Excelne demande pas confirmation de la suppression de la feuille.

5. Appuyez plusieurs fois sur F8 pour parcourir pas à pas la macro.

La macro crée une nouvelle feuille de calcul, supprime l’ancienne feuille decalcul Report, puis renomme la nouvelle feuille de calcul. Une fois encore, lamacro fonctionne parfaitement, ou du moins semble le faire. Que se passe-t-il toutefois si le classeur est dépourvu de feuille de calcul Report ?

6. Repassez à Excel, supprimez la feuille de calcul Report, revenez dans l’édi-teur Visual Basic et appuyez sur F5 pour exécuter la macro.

Dépannage Si la macro parcourt la fonction Random, arrêtez-la et éliminez tou-tes les formules du classeur qui se servent de la fonction Random (en principe lescellules A3 et A4 de la feuille de calcul TestFonction). Si la macro a déjà supprimé lafeuille de calcul Report, poursuivez à l’étape 7.

Page 279: Excel 2007 VBA

Gestion des erreurs 259

Vous obtenez à nouveau un message d’erreur qui vous informe que l’indexn’appartient pas à la collection. Autrement dit, il n’existe pas d’élémentnommé Report dans la collection Worksheets.

Seule chose intéressante à propos de cette erreur, c’est qu’elle vous indiffère.Vous alliez justement supprimer cette feuille de calcul. Si elle est déjà inexis-tante, tant mieux !

7. Cliquez sur le bouton Fin pour fermer le message d’erreur, puis insérez cetteinstruction avant celle qui supprime la feuille de calcul :

On Error Resume Next

Cette instruction ordonne à Visual Basic d’ignorer toute erreur d’exécutionet de simplement poursuivre avec l’instruction suivante.

8. Appuyez sur F5 pour tester la macro. Testez-la encore pour voir ce qui sipasse si la feuille de calcul Report existe.

La macro semble enfin fonctionner correctement. Certaines erreurs gagnentà être ignorées.

Ignorer une erreur en toute sécurité à l’aide d’une sous-routineLorsque vous employez une instruction On Error Resume Next, Visual Basic ignoretoutes les erreurs d’exécution jusqu’à ce que vous activiez à nouveau la vérifica-tion des erreurs ou que Visual Basic atteigne une instruction End Sub ou EndFunction. Lorsque vous indiquez à Visual Basic d’ignorer les erreurs, vous devezprendre garde à ne pas ignorer des erreurs importantes.

1. Dans la macro MakeReport créée dans la section précédente, supprimez lesguillemets autour du mot "Report" dans l’instruction qui renomme la feuillede calcul.

La suppression de ces guillemets crée une erreur d’exécution. L’instructionmodifiée (erronée) devrait être la suivante :

mySheet.Name = Report

Page 280: Excel 2007 VBA

260 Chapitre 8 Extension d’Excel et de Visual Basic

2. Appuyez sur F5 pour tester la macro.

La macro semble fonctionner parfaitement, mais vous ne pouvez voir defeuille de calcul Report lorsqu’elle s’achève. Visual Basic a interprété le motReport sans guillemets comme une nouvelle variable vide et a été incapabled’affecter un nom vide à la feuille de calcul. Comme malheureusement vousaviez dit à Visual Basic d’ignorer les erreurs, celui-ci ne vous avertit pas duproblème. Bien sûr, si vous aviez inséré Option Explicit en haut du module,Visual Basic se serait plaint de l’emploi d’une variable non définie.

La meilleure façon d’ignorer les erreurs pour une ou deux instructions con-siste à les placer dans une procédure Sub qui leur est propre. Lorsque VisualBasic atteint une instruction End Sub ou End Function, il annule l’effet del’instruction On Error Resume Next.

3. Créez une nouvelle macro nommée SupprimeFeuille.

4. Déplacez les trois instructions qui suppriment la feuille de calcul dans lamacro SupprimeFeuille.

La nouvelle procédure devrait ressembler à ceci :

Sub SupprimeFeuille() Application.DisplayAlerts = False On Error Resume Next Worksheets("Report").DeleteEnd Sub

L’instruction On Error Resume Next perd son effet en atteignant l’instructionEnd Sub, si bien que vous ignorez une erreur possible uniquement dansl’instruction Delete.

Vous ne voudrez jamais exécuter la procédure SupprimeFeuille depuis laboîte de dialogue Macros. Elle sera toujours (et uniquement) appelée depuis

Dépannage Si l’instruction Option Explicit apparaît en haut du module, suppri-mez-la.

Important Vous pouvez de façon générale penser à une macro comme à quel-que chose que vous pouvez exécuter depuis la boîte de dialogue Macros etemployer le terme plus général procédure pour tout ce qui doit être exécuté depuisdu code.

Page 281: Excel 2007 VBA

Gestion des erreurs 261

une autre procédure, comme une fonction personnalisée. Pour la placer endehors de la boîte de dialogue Macros, vous pouvez la déclarer comme pri-vée.

5. Insérez le mot Private avant Sub SupprimeFeuille(). Déplacez ensuite lepoint d’insertion à l’extérieur de toute macro et appuyez sur F5 pour vérifierqu’elle n’apparaît plus dans la liste.

6. Dans la macro MakeReport, saisissez SupprimeFeuille là où se trouvaientles trois instructions.

La macro MakeReport, encore avec son erreur, devrait être comme suit :

Sub MakeReport() Dim mySheet As Worksheet Set mySheet = Worksheets.Add SupprimeFeuille mySheet.Name = ReportEnd Sub

Elle ne contient plus d’instruction On Error Resume Next, si bien que VisualBasic devrait être en mesure de vous avertir de l’erreur. La procédure Suppri-meFeuille est désormais une sous-routine.

7. Appuyez sur F5 pour exécuter la macro, puis cliquez sur le bouton Fin pourfermer la boîte d’erreur.

8. Replacez les guillemets autour du nom de la feuille dans la dernière ligne dela macro MakeReport, puis testez la macro avec une feuille de calcul Reportprésente et absente.

La macro fonctionne désormais réellement correctement. Elle ignore l’erreurque vous souhaitez ignorer et vous avertit de toute autre éventuelle erreur.

Ajout d’arguments pour généraliser une sous-routineLa procédure SupprimeFeuille créée dans la section précédente supprime silen-cieusement la feuille de calcul Report si elle est présente. Elle ne supprime toute-fois que la feuille de calcul Report. Vous pourriez avoir besoin de supprimerparfois une feuille nommée Report et parfois une feuille nommée Analysis. Laprocédure SupprimeFeuille possède trop de potentiel pour se limiter à la suppres-

Page 282: Excel 2007 VBA

262 Chapitre 8 Extension d’Excel et de Visual Basic

sion d’une unique feuille spécifique. Vous pouvez ajouter un argument pourgénéraliser la procédure SupprimeFeuille, d’une façon très proche de celle parlaquelle vous aviez ajouté un argument à la fonction Random, plus tôt dans cechapitre.

1. Saisissez NomFeuille comme nom d’argument entre les parenthèses aprèsle nom de la procédure SupprimeFeuille.

2. Remplacez “Report” par NomFeuille dans le corps de la procédure Suppri-meFeuille. NomFeuille ne doit pas être placé entre guillemets.

3. Dans la macro MakeReport, saisissez "Report" après SupprimeFeuille.

Voici quel devrait être l’aspect des deux procédures :

Sub MakeReport() Dim mySheet As Worksheet Set mySheet = Worksheets.Add SupprimeFeuille "Report" mySheet.Name = "Report"End Sub

Private Sub SupprimeFeuille(NomFeuille) Application.DisplayAlerts = False On Error Resume Next Worksheets(NomFeuille).DeleteEnd Sub

La procédure SupprimeFeuille ne sait désormais rien sur le nom de la feuillequ’elle doit supprimer. Elle supprime la feuille dont on lui indique le nom,sans poser de question ni se plaindre si elle s’aperçoit que ses servicesn’étaient pas nécessaires.

4. Appuyez sur F5 pour tester la macro MakeReport.

5. Créez une nouvelle macro nommée MakeAnalysis. Faites-en une copieexacte de la macro MakeReport, si ce n’est qu’elle crée une feuille nomméeAnalysis.

Elle devrait ressembler à ceci :

Sub MakeAnalysis() Dim mySheet As Worksheet Set mySheet = Worksheets.Add SupprimeFeuille "Analysis" mySheet.Name = "Analysis"End Sub

6. Testez la macro MakeAnalysis.

Page 283: Excel 2007 VBA

Gestion des erreurs 263

La procédure SupprimeFeuille évite désormais tous les inconvénients liés àla suppression d’une feuille de calcul et constitue en sus un outil généraliste,une amélioration par rapport aux capacités intégrées d’Excel, que vous pou-vez employer à votre guise depuis n’importe quelle macro.

Vérification d’erreurLorsque vous employez l’instruction On Error Resume Next, Visual Basic permetde faire plus que de simplement ignorer l’erreur. Visual Basic contient un objet dedébogage spécial nommé Err. Cet objet possède des propriétés que vous pouvezvérifier pour savoir s’il s’est produit une erreur et, le cas échéant, laquelle.

Supposez que vous vouliez créer une feuille de calcul Report sans supprimer unequelconque feuille Report préexistante. Vous voulez à la place ajouter un suffixeau nom de la feuille de calcul, comme le fait Excel lorsque vous ajoutez une nou-velle feuille de calcul. Le fichier texte Structure contient une macro nomméeMakeNextReport. Elle crée une feuille nommée Report1. Voici la macro MakeNex-tReport originale :

Sub MakeNextReport() Dim mySheet As Worksheet Dim myBase As String Dim mySuffix As Integer Set mySheet = Worksheets.Add myBase = "Report" mySuffix = 1 On Error Resume Next mySheet.Name = myBase & mySuffixEnd Sub

Cette macro crée une nouvelle feuille de calcul puis essaye de la nommer enemployant comme nom de base Report et comme suffixe 1. L’instruction On ErrorResume Next indique à Visual Basic de ne pas s’arrêter si Excel est incapable derenommer la feuille.

1. Copiez la macro MakeNextReport depuis le fichier texte Structure dans unmodule du classeur Chapitre08. Appuyez de façon répétée sur F8 pourobserver le fonctionnement de la macro.

La macro devrait renommer correctement la nouvelle feuille de calcul.

Astuce Lorsque vous ajoutez des arguments à une procédure Sub, celle-ci n’appa-raît plus dans la boîte de dialogue Exécuter une macro, puisqu’il est impossible detransmettre des arguments à la procédure depuis la boîte de dialogue.

Page 284: Excel 2007 VBA

264 Chapitre 8 Extension d’Excel et de Visual Basic

2. Exécutez en mode pas à pas une nouvelle fois la macro.

Celle-ci s’arrête alors tranquillement, en laissant la nouvelle feuille avec unnom erroné. Il serait agréable que la macro soit suffisamment intelligentepour incrémenter le suffixe si le nom initial ne convient pas. L’objet Err, quiexamine les erreurs même lorsque la macro les ignore, possède une pro-priété Number. Cette propriété est la clé de la connaissance de l’échec d’uneinstruction.

3. Ajoutez les instructions suivantes immédiatement avant l’instruction EndSub :

If Err.Number <> 0 Then mySuffix = mySuffix + 1 mySheet.Name = myBase & mySuffixEnd If

L’instruction If regarde si le numéro d’erreur est quelque chose d’autre que 0.Un numéro d’erreur différent de zéro indique l’échec d’une instruction. Siune instruction a échoué, autrement dit ici si l’instruction qui tentait derenommer la feuille a échoué, la macro incrémente le suffixe et essaye ànouveau.

4. Exécutez la macro en mode pas à pas.

Le code détecte l’erreur de modification de nom et essaye à nouveau, enrenommant avec succès la feuille en Report2.

5. Appuyez sur F5 pour exécuter à nouveau la macro.

Elle s’arrête en silence, car le code d’erreur ne s’exécute qu’une fois.

Boucle jusqu’à l’élimination d’une erreurIl serait bien que la macro soit suffisamment intelligente pour poursuivre l’incré-mentation du suffixe jusqu’à en identifier un qui fonctionne. Cela semble être untravail pour une structure de boucle. Puisque vous ne savez pas quand commence

Page 285: Excel 2007 VBA

Gestion des erreurs 265

la boucle ni combien de fois elle doit se répéter, vous devez vous servir d’une bou-cle Do.

Voir aussi Pour plus d’informations sur les boucles Do, reportez-vous à la section « Bouclesinfinies à l’aide d’une boucle Do » du Chapitre 7, « Contrôle de Visual Basic ».

1. Remplacez le mot If par Do Until, supprimez le mot Then à la fin de l’ins-truction, modifiez le signe différent de (<>) en un signe égal (=), puis rem-placez End If par Loop.

Les dernières lignes de la macro devraient se présenter comme suit :

On Error Resume NextmySheet.Name = myBase & mySuffixDo Until Err.Number = 0 mySuffix = mySuffix + 1 mySheet.Name = myBase & mySuffixLoop

La boucle Do regarde si la modification de nom a réussi. Si tel n’est pas lecas, la boucle incrémente le suffixe, essaye à nouveau de modifier le nom,puis vérifie à nouveau si cela a réussi. Du moins, c’est ce que vous voulezqu’elle fasse.

2. Appuyez de façon répétée sur F8 pour parcourir la macro en mode pas àpas.

La première tentative de modification du nom de la macro échoue, car lafeuille Report1 existe déjà. La macro entre par conséquent dans la boucle. Àla fin de la boucle, la macro tente à nouveau de renommer la feuille etéchoue puisque Report2 existe déjà également. La macro exécute donc unedeuxième fois la boucle. À la fin de celle-ci, la macro tente à nouveau demodifier le nom de la feuille. Elle y parvient correctement enfin.

3. Continuez à parcourir la macro.

Quelque chose ne va pas. La macro entre à nouveau dans la boucle, etrenomme la feuille Report4 puis Report5. Cela pourrait se poursuivre indé-finiment…

Dépannage Veillez à exécuter la macro en mode pas à pas, car elle comportepour le moment une boucle infinie. Si vous avez exécuté la macro, appuyez surECHAP pour arrêter la boucle. Il peut être nécessaire d’appuyer plusieurs fois surECHAP.

Page 286: Excel 2007 VBA

266 Chapitre 8 Extension d’Excel et de Visual Basic

La macro n’a pas réalisé que l’erreur était terminée. La valeur de Err.Numberne revient pas automatiquement à 0 lorsque la macro a renommé avec suc-cès la feuille de calcul. Vous devez indiquer à la macro que l’erreur a disparu.

4. Cliquez sur le bouton Réinitialiser pour arrêter la macro.

5. Sur la ligne qui suit immédiatement l’instruction Do, saisissez l’instructionErr.Clear. Clear est le nom d’une méthode de l’objet Err. Elle réinitialise à 0 lenuméro d’erreur et fait oublier à Visual Basic qu’une erreur s’est produite unjour.

6. Appuyez sur F5 pour tester la macro. Testez-la encore. Et encore.

La macro est désormais capable de créer une nouvelle feuille d’état, enincrémentant le suffixe du nom autant de fois que nécessaire, mais pas plus !

Vérifier la valeur de Err.Number n’a de sens qu’en cas d’emploi de l’instruction OnError Resume Next. Les erreurs qui se produisent en dehors de l’instruction OnError Resume Next font que Visual Basic arrête la macro et affiche un messaged’erreur. Examiner les propriétés de l’objet Err est un bon moyen de contrôler lafaçon dont votre macro gère les erreurs.

Capture d’une erreurVous avez découvert jusqu’ici trois façons de gérer une erreur d’exécution : laisserVisual Basic afficher la boîte de dialogue de message d’erreur standard, ignorertotalement l’erreur ou vérifier la présence d’un numéro d’erreur non nul aprèschaque instruction.

La première option, laisser Visual Basic afficher un message d’erreur, peut être unebonne solution si vous écrivez des macros à votre seul usage. Si toutefois voussouhaitez donner cette macro à quelqu’un, vous souhaiterez probablement plusde contrôle sur ce que dit le message d’erreur. La deuxième option, ignorer leserreurs, est quelque chose à ne faire que dans des cas particuliers. La troisième,vérifier que la valeur du numéro d’erreur est différente de zéro après chaque ins-

Important Certaines instructions de macro réinitialisent automatiquement à 0 lavaleur Err.Number lorsqu’elles s’exécutent avec succès. D’autres ne le font pas. Parprécaution, mieux vaut réinitialiser l’objet Err immédiatement avant l’instructioncritique puis inspecter la valeur de Err.Number juste après l’exécution de cette ins-truction.

Page 287: Excel 2007 VBA

Gestion des erreurs 267

truction, peut rendre vos macros difficiles à lire. Il existe heureusement une qua-trième option : Visual Basic peut surveiller pour vous la valeur d’erreur encapturant les erreurs.

Supposez, par exemple, que vous possédiez une macro qui ouvre, imprime etferme plusieurs classeurs. Il est possible qu’un des classeurs soit absent lorsquevous exécutez la macro. Le fichier texte Structure contient une macro CheckFilesqui ouvre et ferme plusieurs des classeurs exemples d’accompagnement de celivre. Pour préserver les forêts, la macro n’imprime pas réellement les classeurs.

Le nom d’un des fichiers de classeurs a été mal orthographié. Voici la macrooriginale :

Sub CheckFiles() Workbooks.Open "Graphics" ActiveWorkbook.Close Workbooks.Open "Ranges" ActiveWorkbook.Close Workbooks.Open "Nom de fichier erroné" ActiveWorkbook.Close Workbooks.Open "Budget" ActiveWorkbook.CloseEnd Sub

Vous ne pouvez bien sûr pas savoir quels fichiers seront identifiés avant d’exécuterréellement la macro.

1. Dans Excel, cliquez sur le Bouton Microsoft Office, puis cliquez sur Ouvrir.Naviguez jusqu’au dossier qui renferme les fichiers d’exercice de ce livre,puis cliquez sur Annuler. Cela fait du dossier adéquat le dossier actif.

2. Copiez la macro CheckFiles depuis le fichier texte Structure dans un moduledu classeur Chapitre08, puis appuyez sur F5 pour exécuter la macro Check-Files. Vous voyez le message d’erreur standard Visual Basic.

3. Cliquez sur le bouton Fin pour fermer la boîte de message.

Vous devez ajouter un code spécial, que Visual Basic exécute lorsque sur-vient une erreur.

4. Juste avant l’instruction finale End Sub, saisissez l’instruction ErrorHan-dler:.

Page 288: Excel 2007 VBA

268 Chapitre 8 Extension d’Excel et de Visual Basic

L’instruction ErrorHandler: poste le nom d’étiquette de ligne. Une étiquettede ligne est un unique mot suivi d’un signe deux points. Vous pouvezl’indenter si vous le souhaitez, mais l’habitude est de le laisser aligné avec lesinstructions Sub et End Sub car elle se comporte comme une annexe de lamacro. Une étiquette doit toujours se terminer par un signe deux points.

5. Insérez une ligne après l’étiquette de gestion des erreurs, puis saisissez l’ins-truction MsgBox Err.Number.

Les instructions situées sous l’étiquette sont celles exécutées par la macrolorsqu’elle détecte une erreur. Elles portent le nom de gestionnaire d’erreur.Le gestionnaire d’erreur le plus simple est une boîte de message qui affichele numéro de l’erreur.

6. Immédiatement avant l’étiquette de gestion d’erreur, saisissez l’instructionExit Sub. Vous ne voulez pas que les instructions du gestionnaire d’erreurs’exécutent si la macro se termine normalement. Si la macro atteint l’instruc-tion Exit Sub, aucune erreur n’a été détectée.

7. En haut de la macro, juste après l’instruction Sub, saisissez l’instruction OnError GoTo ErrorHandler.

Cette instruction impose à Visual Basic, lorsqu’il rencontre une erreur d’exé-cution, d’abandonner ce qu’il fait pour sauter immédiatement à l’étiquettespécifiée. Vous ne placez pas ici de signe deux points après le nom del’étiquette : celle-ci n’est employée que lorsque vous créez l’étiquette.

La macro devrait ressembler à ceci :

Sub CheckFiles() On Error GoTo ErrorHandler Workbooks.Open "Graphics" ActiveWorkbook.Close Workbooks.Open "Ranges" ActiveWorkbook.Close Workbooks.Open "Nom de fichier erroné " ActiveWorkbook.Close Workbooks.Open "Budget"

Astuce Vous pouvez employer le nom de votre choix comme étiquette d’unemacro. Employer toujours le même nom, comme ErrorHandler, en guise d’éti-quette d’erreur dans toutes vos macros facilite toutefois la copie de code de ges-tion d’erreur d’une macro dans une autre.

Dépannage Veillez à bien employer dans l’instruction On Error le nom del’étiquette employée pour le gestionnaire d’erreur.

Page 289: Excel 2007 VBA

Gestion des erreurs 269

ActiveWorkbook.Close Exit SubErrorHandler: MsgBox Err.NumberEnd Sub

8. Appuyez sur F5 pour tester la macro.

Visual Basic devrait afficher une simple boîte de message qui ne montre quele numéro de l’erreur.

9. Cliquez sur OK pour fermer la boîte de message.

Vous pouvez améliorer le message. L’objet Err dispose d’une propriété Des-cription qui procure une description texte plus détaillée de l’erreur. Cettedescription est souvent un ajout utile à une boîte de message d’erreur. Vouspouvez même compléter la description avec le texte de votre choix.

10. Supprimez l’instruction MsgBox Err.Number et remplacez-la avec cetteinstruction :

MsgBox "Merci de prévenir Reed Jacobson de l’erreur " _& Err.Number & vbCrLf & vbCrLf _& Err.Description

Vous pouvez assembler de nombreux morceaux de texte pour constituer unmessage d’erreur. placez simplement une éperluette entre chaque élément.Le mot vbCrLf est une constante intégrée de Visual Basic qui signifie« Carriage Return/Line Feed ». Ce terme est un ancien terme informatiquepour une nouvelle ligne et est souvent abrégé en CRLF. Vous pouvez placervbCrLf dans une chaîne chaque fois que vous voulez imposer au message depasser à une nouvelle ligne. Lorsque vous créerez vos propres macros, mercide substituer dans le message d’erreur votre nom au mien !

11. Appuyez sur F5 pour exécuter la macro et voir le message d’erreur plus éla-boré.

Si vous créez une application qui va être employée par quelqu’un d’autre et quevous ne souhaitez pas que cette personne voie un jour la boîte de dialogued’erreur standard de Visual Basic, placez un gestionnaire d’erreur dans chaque

Page 290: Excel 2007 VBA

270 Chapitre 8 Extension d’Excel et de Visual Basic

macro lancée directement par l’utilisateur. Si, pour certaines instructions, l’erreurdoit être gérée différemment (ignorée ou vérifiée sur une base instruction par ins-truction), placez ces instructions dans une procédure indépendante dotée d’uneinstruction On ErrorResume Next. Visual Basic réactive automatiquement le ges-tionnaire d’erreur à la fin de la procédure secondaire.

Les erreurs sont une partie frustrante mais inévitable du quotidien lors du travailinformatique, et particulièrement lorsque le facteur d’erreur humaine se combineavec les autres sources d’erreur possibles. Toutes les erreurs ne sont bien sûr paségales : certaines sont sérieuses, d’autres anodines et certaines peuvent mêmeêtre utiles. C’est une bonne chose que Visual Basic fournisse des outils souplespour gérer tous ces types d’erreur.

FERMEZ le classeur Chapitre08.xlsm.

Page 291: Excel 2007 VBA

Points clés 271

Points clés● Pour créer une nouvelle fonction qui puisse être appelée depuis une feuille

de calcul, modifiez simplement le mot Sub en Function. Vous pouvez égale-ment ajouter des arguments, comme avec des fonctions de feuille de calculnormale.

● Servez-vous de l’instruction Application.DisplayAlerts = False pour indiquerà Excel de ne pas afficher de message d’avertissement, par exemple lors dela suppression d’une feuille de calcul.

● Pour ignorer simplement une erreur dans une ou deux instructions, parexemple lors de la suppression d’un fichier ou d’une feuille de calcul, placezces instructions dans une sous-routine et ajoutez l’instruction On ErrorResume Next en haut de la sous-routine.

● Servez-vous de l’objet Err, et surtout de ses propriétés Number et Descrip-tion, pour obtenir des informations sur une erreur survenue lors de l’exécu-tion d’une instruction de macro.

● Servez-vous de On Error GoTo accompagné du nom d’une étiquette pourimposer à toute erreur de sauter jusqu’à un gestionnaire d’erreur qui débutepar l’étiquette spécifiée.

Page 292: Excel 2007 VBA

Création de macros qui s’exécutent lorsque l’utilisateur déplace la souris, page 282

Navigation dans un projet VBA à l’aide de l’Explorateur de projets, page 284

Création de macros qui s’exécutent lorsque l’utilisateur modifie la sélection, page 287

Ajout d’un bouton de commande à une feuille de calcul, page 276

Fixation des propriétés d’un contrôle ActiveX, page 278

Activation de l’onglet Développeur

du ruban, page 276

Fixation des propriétés d’objets de projet VBA,

page 286

Coup d’œil sur le chapitre

Page 293: Excel 2007 VBA

273

9 Lancement de macros à l’aide d’événements

Ce chapitre aborde les points suivants :✔ Création de boutons de commande ;✔ Ajout de gestionnaires d’événement supplémentaires à un bouton de

commande ;✔ Création de gestionnaires d’événement de feuille de calcul et de classeur.

Ma grand-mère avait l’habitude de broder nos noms sur nos vêtements à l’aide dela machine à coude. Elle possédait une puissante ancienne machine à coudre,dotées de nombreux leviers, poulies et boucles. Lorsqu’elle changeait de fil, elledevait passer le nouveau fil à travers un interminable cheminement dans des bou-cles, des guides et des bobineaux avant même d’arriver à l’aiguille. Je ne com-prends toujours pas comment elle arrivait à broder nos noms. Elle devait agir surdes leviers et tortiller le tissu, et les noms apparaissaient. Elle était très habile et lerésultat était magnifique. Elle était une professionnelle expérimentée.

De nos jours, même quelqu’un comme moi est capable de broder des noms surdu tissu. Je fais passer le fil sur quelques guides et la machine est prête. Je saisis lenom, choisis le type de caractères et appuie sur un autre bouton pour broder lenom. La machine rend évident de coudre dans toutes les directions : il n’est mêmeplus nécessaire de tourner le tissu ! N’importe qui est désormais capable de seservir d’une machine à coudre.

Les macros peuvent vous simplifier la vie. Vous ne souhaitez toutefois pas queleurs intérêts soient limités à quelques professionnels expérimentés comme vous.En ajoutant les boutons, contrôles et gestionnaires d’événement que vous allezdécouvrir dans ce chapitre et dans les suivants, vous pourrez créer de puissantesmacros utilisables par n’importe qui.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 294: Excel 2007 VBA

274 Chapitre 9 Lancement de macros à l’aide d’événements

Création de boutons de commande personnalisés

Vous pourriez vous sentir parfaitement à l’aise à devoir appuyer sur une combi-naison de touches de raccourci ou même à appuyer sur F5 dans l’éditeur Micro-soft Visual Basic pour exécuter une macro. Si toutefois vous voulez donner cettemacro à quelqu’un d’autre, vous préférerez probablement rendre son exécutionaussi simple que possible. Dans le Chapitre 1, « Création d’une macro pour destâches simples », vous avez découvert deux méthodes pour faciliter l’exécutiond’une macro : lui affecter un raccourci clavier et l’affecter à un bouton de la Barred’outils Accès rapide. La plupart des gens ne connaîtront toutefois pas la combi-naison de touches de raccourci et vous voudrez parfois quelque chose de plusévident qu’un bouton sur la Barre d’outils Accès rapide.

Vous allez apprendre dans cette section à lancer une macro depuis un bouton decommande situé sur une feuille de calcul. Cela constitue un moyen simple et évi-dent d’exécuter une macro d’un simple clic. Un bouton de commande peut tou-tefois également répondre à d’autres actions. Par exemple, une macro peut êtreexécutée suite au simple déplacement de la souris sur un bouton. Puisqu’un bou-ton de commande peut répondre à un ensemble complexe d’événements, ilnécessite une nouvelle façon d’exécuter une macro. Cette nouvelle approche arecours à ce qui est nommé des procédures de gestionnaire d’événement. Les pro-cédures de gestionnaire d’événement sont des macros spéciales liées à un objet,tel un bouton de commande.

Avant de créer des boutons de commande, commencez par mettre en place quel-ques macros simples que pourront exécuter les boutons.

Essai des macros ZoomIn et ZoomOutToute fenêtre de feuille de calcul Excel possède un niveau de Zoom. Vous pouvezmodifier ce niveau de façon interactive.

SERVEZ-VOUS du fichier texte Events.txt, situé dans le dossier Docu-ments\MSP\ExcelVBA07SBS. Ce fichier contient certaines macros initiales que vousallez copier dans votre classeur et modifier au cours de ce chapitre. Elles sont stoc-kées dans un fichier texte pour que vous puissiez vérifier qu’elles sont dépourvuesde tout code malveillant avant de les placer dans un emplacement approuvé.VEILLEZ A enregistrer un nouveau classeur prenant en charge les macros sous lenom Chapitre09.xlsm dans le dossier approuvé créé au Chapitre 1. OUVREZ le fichier texte Events.

Page 295: Excel 2007 VBA

Création de boutons de commande personnalisés 275

1. Glissez déposez le contrôle Zoom situé dans le coin inférieur droit de lafenêtre Excel vers la droite et vers la gauche pour voir l’effet de Zoom.Remettez ensuite le zoom à 100 %.

Le fichier texte Events contient deux macros simples, ZoomIn et ZoomOut,qui effectuent la même chose que le contrôle Zoom. Ce sont les macros quevous allez exécuter à l’aide de différents événements. Elles se présententcomme suit :

Sub ZoomIn() Dim myZoom As Integer myZoom = ActiveWindow.Zoom + 10 If myZoom <= 400 Then ActiveWindow.Zoom = myZoom End IfEnd Sub

Sub ZoomOut() Dim myZoom As Integer myZoom = ActiveWindow.Zoom - 10 If myZoom >= 10 Then ActiveWindow.Zoom = myZoom End IfEnd Sub

Chaque macro récupère la valeur actuelle de la propriété Zoom de la fenêtreactive. Si elle peut modifier la valeur en restant dans la plage acceptable(entre 10 et 400, ce qui correspond aux limites en pourcentage du zoomExcel), elle modifie la propriété. Sinon, elle ne fait rien.

2. Copiez les deux macros du fichier texte Events et copiez-les dans un nou-veau module du classeur prenant en charge les macros Chapitre09.

3. Dans la barre d’outils Visual Basic, cliquez dans la macro ZoomIn etappuyez sur F5 à plusieurs reprises pour voir comment la feuille de calculs’agrandit. Parcourez pas à pas la macro pour vous familiariser avec sonfonctionnement.

4. Cliquez dans la macro ZoomOut. Appuyez sur F5 autant de fois que néces-saire pour revenir au niveau normal de zoom.

Ce sont des macros « typiques ». Vous allez découvrir dans ce chapitre de nouvel-les façons de les exécuter. La première technique consiste à la faire à l’aide deboutons de commande.

Page 296: Excel 2007 VBA

276 Chapitre 9 Lancement de macros à l’aide d’événements

Activation de l’onglet Développeur du rubanComme vous le savez, le ruban possède un onglet spécial destiné aux déve-loppeurs. Vous pouvez écrire, exécuter et modifier facilement des macros sansemployer l’onglet Développeur, mais vous avez besoin de celui-ci pour ajouterdes contrôles personnalisés comme des boutons de commande à une feuille decalcul. Si vous ne l’avez pas déjà fait, voici comment afficher l’onglet Développeur.

1. Cliquez sur le Bouton Microsoft Office, puis cliquez sur Options Excel.

2. Sur la page Standard, cochez l’option Afficher l’onglet Développeur dansle ruban.

3. Cliquez sur OK pour fermer la boîte de dialogue Options Excel, puis cliquezsur l’onglet Développeur.

Le groupe Code de l’onglet propose des commandes pour la création de macros.Toutes ces commandes sont facilement accessibles depuis d’autres emplacements.Le groupe XML n’a rien à voir avec les macros. Le groupe Contrôles est celui dontvous allez vous servir pour ajouter un bouton de commande à une feuille de cal-cul.

Création d’un bouton de commande personnaliséUn bouton de commande est utile pour l’exécution de macros relatives à unefeuille de calcul spécifique. Les boutons de commande sont généralement debonne taille et arborent un libellé qui décrit ce qu’ils accomplissent : il est facile decliquer dessus.

La liste Insertion de l’onglet Développeur contient plusieurs contrôles utilisablessur une feuille de calcul ou un formulaire (aussi nommé feuille). Ces contrôles sontnommés contrôles ActiveX. Il s’agit de types particuliers d’objets graphiques qui

Bouton Microsoft Office

Page 297: Excel 2007 VBA

Création de boutons de commande personnalisés 277

peuvent accomplir une action lorsque vous cliquez dessus. Le contrôle ActiveXavec lequel vous allez travailler dans ce chapitre est le contrôle Bouton de com-mande.

Voir aussi Dans le Chapitre 11, « Création d’un formulaire personnalisé », vous emploierezd’autres contrôles ActiveX sur une feuille de calcul. Dans le Chapitre 10, « Emploi de con-trôles Boîte de dialogue sur une feuille de calcul », vous emploierez des contrôles ActiveXdans une boîte de dialogue personnalisée.

1. Dans le groupe Contrôles de l’onglet Développeur, cliquez sur la flècheInsérer, puis cliquez sur Bouton de commande dans le groupe ContrôlesActiveX.

2. Glissez déposez un rectangle sur la feuille de calcul du coin supérieur gau-che de la cellule A1 au coin inférieur droit de la cellule B2.

Un bouton de commande apparaît sur la feuille de calcul. Les poignéesblanches sur les côtés indiquent qu’il est actuellement sélectionné.

Tandis que le bouton de commande est sélectionné, vous pouvez modifierses propriétés. Exactement comme vous pouvez employer Visual Basic pourmodifier les propriétés d’un objet dans une macro, vous pouvez vous servirde la fenêtre Propriétés pour modifier de façon interactive les propriétésd’un objet.

Astuce Vous pouvez facilement imposer à un objet graphique de s’aligner sur lescoins d’une cellule en appuyant sur la touche ALT tandis que vous glissez déposezle rectangle pour l’objet. Vous pouvez aligner les côtés d’un objet graphique exis-tant sur le quadrillage en maintenant enfoncée la touche ALT tandis que vousdéplacez ou modifiez la taille de l’objet.

Page 298: Excel 2007 VBA

278 Chapitre 9 Lancement de macros à l’aide d’événements

3. Dans le groupe Contrôles du ruban, cliquez sur le bouton Propriétés.

La fenêtre Propriétés apparaît. La zone du haut indique l’objet dont les pro-priétés sont affichées. Il s’agit ici de CommandButton1, un objet CommandButton.

La fenêtre Propriétés montre diverses propriétés du bouton de commande.Une importante propriété d’un bouton de commande est son nom, quiapparaît comme (Name) dans la fenêtre Propriétés. Les parenthèses ontpour objectif de placer la propriété Name en haut de liste. Cette propriétéaffecte le mode d’emploi du bouton dans vos macros. Le nom doit répondreaux mêmes exigences qu’un nom de macro, ce qui signifie qu’il ne peutcomprendre ni espace ni caractère spécial.

4. Remplacez la valeur par défaut de la propriété Name par btnZoomIn.

Lorsque vous nommez un contrôle, la coutume est d’employer un préfixe detrois lettres pour identifier le type de contrôle. Ici, btn signifie bouton.

Modifier le nom d’un bouton ne modifie pas son libellé. Cela est du ressortde la propriété Caption.

5. Remplacez la valeur par défaut de la propriété Caption par Zoom In.

Rien n’interdit de placer un espace dans un libellé. Dès que vous modifiez lapropriété Caption, le texte affiché par le bouton se modifie. Il existe uneautre propriété à définir lors de la création d’un bouton de commande per-sonnalisé. Elle contrôle la façon dont le bouton de commande interagit avecla cellule active d’Excel.

Supposez que, lors du clic sur le bouton de commande, la cellule B4 est lacellule active. Vous vous attendez à ce que normalement, la cellule B4 restela cellule active même après un clic sur le bouton, sauf si celui-ci exécute unemacro qui modifie la cellule active. Le comportement par défaut d’un bou-ton de commande est toutefois de supprimer la bordure noire autour de lacellule active, rendant impossible de voir quelle cellule est active.

Page 299: Excel 2007 VBA

Création de boutons de commande personnalisés 279

6. Double-cliquez sur la propriété TakeFocusOnClick pour modifier sa valeuren False.

TakeFocusOnClick est un nom compliqué pour une propriété simple. La fixerà False signifie simplement « Laisser la cellule active telle qu’elle estlorsqu’on clique sur ce bouton ».

Vous avez maintenant créé et personnalisé le bouton de commande. Il ne resteplus qu’à le lier à une macro pour exécuter celle-ci.

Liaison d’un bouton de commande à une macroVous n’affectez pas une macro à un bouton de commande. Vous créez à la placeune macro dotée d’un nom spécial, placée à un emplacement spécial, qui estautomatiquement liée au bouton.

Heureusement, le groupe Contrôle de l’onglet Développeur dispose d’un boutonqui accomplit à votre place tout ce travail de dénomination.

1. Le bouton de commande étant encore sélectionné, cliquez sur le boutonVisualiser le code.

La fenêtre de l’éditeur Visual Basic affiche une nouvelle macro. Le mot Pri-vate qui précède le nom de la macro signifie que cette macro n’apparaît pasdans la boîte de dialogue Exécuter une macro. Le nom de la macro estbtnZoomIn_Click. Il est important. La partie du nom qui précède le trait desoulignement correspond au nom du bouton de commande. Celle qui suitle trait de soulignement correspond au nom de l’événement géré par lamacro. Ici, la macro s’exécute lorsque vous cliquez sur le bouton. Une macroainsi liée à un événement est nommée gestionnaire d’événement.

Vous pourriez copier le code de la macro ZoomIn dans la procédurebtnZoomIn_Click, mais il est plus simple d’exécuter cette macro, puisqu’elleexiste déjà, depuis la nouvelle procédure.

2. Saisissez ZoomIn comme corps de la procédure.

La procédure achevée devrait ressembler à ceci :

Private Sub btnZoomIn_Click() ZoomInEnd Sub

Important Le mot procédure est techniquement synonyme de macro. Excel sesert du mot macro parce qu’enregistreur de macro est moins intimidant qu'enregis-treur de procédure. D’une façon générale, ce livre se sert du terme macro pour lesprocédures qui peuvent être exécutées depuis la boîte de dialogue Macro et deprocédure pour faire référence aux fonctions et aux gestionnaires d’événement.

Page 300: Excel 2007 VBA

280 Chapitre 9 Lancement de macros à l’aide d’événements

Vous êtes maintenant prêt à tenter de cliquer sur le bouton.

3. Revenez à Excel, cliquez dans n’importe quelle cellule de la feuille de calculpour désélectionner le bouton, , puis cliquez sur celui-ci.

La procédure ne s’exécute pas. Vous avez simplement sélectionné à nouveaule bouton. Vous devez disposer d’un moyen de faire savoir à Excel si un clicsur un contrôle ActiveX doit exécuter le gestionnaire d’événement ou sim-plement sélectionner le contrôle. Vous y parvenez en contrôlant le modecréation. Lorsque Excel est en mode création, un clic sur un contrôle le sélec-tionne. Lorsque Excel n’est pas en mode création, il est en mode exécution :un clic sur un contrôle exécute la procédure du gestionnaire d’événement.

Lorsque vous placez un contrôle ActiveX sur une feuille de calcul, Excelpasse automatiquement en mode création. Lorsque Excel est en mode créa-tion, le bouton Mode Création de l’onglet Développeur est en surbrillance.

4. Cliquez sur le bouton Mode Création pour désactiver le mode création.

Les poignées de sélection disparaissent du bouton de commande.

5. Pour tester le bouton Zoom In, cliquez dessus.

6. Cliquez sur le bouton Mode Création pour revenir en mode création, puiscliquez sur le bouton de commande.

Les poignées de sélection apparaissent sur le bouton de commande, mais le codene s’exécute pas.

Contrôles ActiveX et contrôles de formulaireLe bouton Insérer de l’onglet Développeur propose deux ensembles decontrôles : les contrôles ActiveX et les contrôles de formulaire. À premièrevue, ces ensembles paraissent identiques. Quelle est donc la différence ? Lescontrôles de formulaire sont plus simples. Ils ne possèdent qu’un faibleensemble de propriétés et sont dépourvus de gestionnaires d’événement.Vous pouvez voir les contrôles de formulaire comme appartenant directe-ment à Excel, tandis que les contrôles ActiveX appartiennent à Visual Basic.Les contrôles de formulaire ne sont pas affectés par le bouton Mode Création.Pour sélectionner un contrôle de formulaire existant, vous maintenez enfon-cée la touche CTRL tandis que vous cliquez sur le contrôle.

Vous apprendrez dans ce livre à employer des contrôles ActiveX pour deuxraisons. Tout d’abord, pour créer une boîte de dialogue personnalisée, vousemployez des contrôles ActiveX. Ensuite, les contrôles de formulaire sont plussimples. Si vous apprenez à créer un contrôle ActiveX, il vous sera facile detransférer vos connaissances pour un contrôle de formulaire. Si vous ne

Page 301: Excel 2007 VBA

Création de boutons de commande personnalisés 281

demandez à un contrôle que d’exécuter une simple macro, un contrôle de for-mulaire peut être préférable. En revanche, pour disposer de plus de« contrôle » sur le contrôle, un contrôle ActiveX peut être mieux adapté. Sivous devez créer une application capable de travailler avec différents jeux decaractères (comme l’Arable ou le Chinois), il existe une différence fondamen-tale entre les deux types de contrôles. Les contrôles de formulaire appartien-nent à Excel et, comme celui-ci prend en charge Unicode, peuvent doncafficher des libellés dans toute langue prise en charge par votre systèmed’exploitation et ses polices. En revanche, les contrôles ActiveX appartiennentà Visual Basic for Applications. Comme VBA prend en charge les pages decode pour la localisation, les contrôles ActiveX ne peuvent prendre en chargeque la langue de la page de code active. Si les termes page de code et Unicodene signifient rien pour vous, vous devriez pouvoir employer indifféremmentdes contrôles ActiveX ou des contrôles de formulaire.

Création de votre propre gestionnaire d’événementMême s’il est possible de créer un gestionnaire pour l’événement clic d’un con-trôle en cliquant simplement sur le bouton Visualiser le code, vous pourriez trou-ver instructif de voir comment créer un gestionnaire d’événement directementdans l’éditeur Visual Basic.

1. Pour créer un bouton de commande Zoom Out sur les cellules A3 et A4,glissez déposez un rectangle sur la feuille de calcul depuis le coin supérieurgauche de la cellule A3 jusqu’au coin inférieur droit de la cellule B4. Dans lafenêtre Propriétés, affectez le nom btnZoomOut et le libellé Zoom Out,puis fixez la propriété TakeFocusOnClick à False. Ne cliquez pas sur le bou-ton Visualiser le code.

Voir aussi Pour des instructions plus détaillées, reportez-vous aux étapes 2 à 6 de lasection « Création d’un bouton de commande personnalisé ».

2. Sur l’onglet Développeur du ruban, cliquez sur le bouton Mode Créationpour désactiver le mode Création.

Vous pouvez créer le gestionnaire d’événement dans Visual Basic même si lemode création est désactivé.

3. Repassez à l’éditeur Visual Basic, cliquez n’importe où dans la procédurebtnZoomIn_Click et examinez la barre située juste au-dessus du code.

Page 302: Excel 2007 VBA

282 Chapitre 9 Lancement de macros à l’aide d’événements

Au-dessus de la partie code de la fenêtre figurent deux zones. La zone degauche contient la première moitié du nom de la procédure (btnZoomIn),tandis que la zone de droite affiche la seconde partie de son nom (Click).Ces deux zones se nomment respectivement Objet et Procédure.

4. Cliquez sur la flèche Objet.

Cette liste affiche tous les objets apparentés à la feuille de calcul active etqui peuvent posséder des gestionnaires d’événement. Il s’agit ici de btnZoo-mIn, btnZoomOut et Worksheet.

5. Sélectionnez dans la liste btnZoomOut.

Une nouvelle procédure apparaît. Click est l’événement par défaut d’unbouton, si bien que la nouvelle procédure est nommée btnZoomOut_Click :c’est exactement ce qu’il vous faut.

6. Saisissez ZoomOut comme corps de la procédure.

7. Repassez à Excel et essayez les deux boutons.

Les listes du haut de la fenêtre de code peuvent vous aider à construire desgestionnaires d’événement en combinant un nom d’objet avec un nomd’événement.

Réponse d’un bouton au déplacement de la sourisUn bouton de commande peut reconnaître plusieurs événements différents. Troisdes événements les plus importants sont un clic (l’événement Click), un doubleclic (l’événement DblClick) et un déplacement de la souris (l’événement Mouse-Move). Il est particulièrement amusant d’écrire un gestionnaire d’événement pource dernier événement, car il dispose d’arguments qui permettent de contrôler lefonctionnement de la procédure.

Astuce Vous pouvez également créer un gestionnaire d’événement en saisissantsimplement le nom correct pour la macro. Si les noms de l’objet et de l’événementsont correctement orthographiés, la gestionnaire d’événement fonctionnera. Leslistes objet et procédure ne servent qu’à éviter des erreurs.

Page 303: Excel 2007 VBA

Création de boutons de commande personnalisés 283

1. Dans l’éditeur Visual Basic, sélectionnez btnZoomOut dans la liste Objet,puis sélectionnez MouseMove dans la liste Procédure.

La déclaration de la nouvelle procédure est relativement longue. Voici sonaspect après division en plusieurs lignes plus courtes :

Private Sub btnZoomOut_MouseMove( _ByVal Button As Integer, _ByVal Shift As Integer, _ByVal X As Single, _ByVal Y As Single)

Cette procédure de gestionnaire d’événement possède quatre arguments :Button, Shift, X et Y. Le mot byVal signifie qu’Excel doit ignorer toute modi-fication apportée par la procédure à un argument. Les arguments commu-niquent des informations dont vous pouvez tirer parti lors de l’écriture de lamacro. L’argument Button indique qu’un bouton de la souris est enfoncépendant son déplacement. L’argument Shift indique si une ou plusieurs destouches MAJ, CTRL ou ALT sont enfoncées. Les arguments X et Y indiquent laposition horizontale et verticale de la souris.

2. Insérez ZoomOut comme corps de la nouvelle procédure, repassez à Excel,puis déplacez la souris sur le bouton Zoom Out. Vous n’avez pas à cliquerdessus : le simple déplacement de la souris au-dessus du bouton provoquel’exécution de la procédure. Un événement peut se produire rapidement…

Vous pouvez employer les arguments de l’événement MouseMove pourcontrôler la procédure. L’argument le plus utile est Shift. Sa valeur est égaleà 1 si la touche MAJ est enfoncée, à 2 s’il s’agit de la touche CTRL et à 4 pourla touche ALT. Si plusieurs touches sont enfoncées, la valeur de l’argumentest égale à la somme des valeurs individuelles. Autrement dit, si la valeur del’argument est 3, les touches MAJ et CTRL sont toutes deux enfoncées. Encréant un bloc If fondé sur la valeur de Shift, vous pouvez modifier la procé-dure pour qu’elle effectue un zoom avant si la touche SHIFT est enfoncée, unzoom arrière si la touche CTRL est enfoncée, et rien dans les autres cas.

3. Remplacez le corps de la procédure btnZoomOut_MouseMove par cesinstructions:

If Shift = 1 Then ZoomInElseIf Shift = 2 Then ZoomOutEnd If

Astuce Le mot clé ElseIf permet de combiner des instructions Else et If en uneseule instruction.

Page 304: Excel 2007 VBA

284 Chapitre 9 Lancement de macros à l’aide d’événements

4. Repassez dans Excel et essayez le gestionnaire d’événement. Déplacezd’abord seulement la souris. Essayez ensuite d’appuyer sur MAJ et de gardercette touche enfoncée tandis que vous déplacez la souris sur le bouton. Pro-cédez ensuite de même, mais avec la touche CTRL.

Tandis que vous déplacez la souris sur le bouton, vous pouvez voir la procédures’exécuter encore et encore. Le bouton détecte chaque mouvement de la souris,déclenche un autre événement et la procédure du gestionnaire d’événements’exécute à nouveau. Les procédures de gestionnaire d’événement peuvent êtreun puissant moyen de faire se produire des choses.

Exploration du projet Visual BasicVous pourriez vous demander où sont stockés tous ces gestionnaires d’événe-ment et de quelle façon ils sont apparentés aux macros créées avec l’enregistreurde macro. Lorsque vous employez l’enregistreur de macro pour créer une macro,celle-ci est stockée dans un module. Un module peut comporter plusieursmacros, et un classeur posséder plusieurs modules. Chaque fois que vous fermezet réouvrez un classeur, l’enregistreur de macro crée un nouveau module pour lesnouvelles macros que vous enregistrez. Les procédures de gestionnaire d’événe-ment d’un bouton de commande sont attachées à la feuille de calcul qui contientce bouton. Visual Basic fait référence à tout le code d’un unique classeur, que cecode se trouve dans un module ou soit attaché à une feuille de calcul, comme àun projet. L’éditeur Visual Basic possède une fenêtre spéciale qui permet d’explo-rer le projet. Dans un fichier Excel, le projet Visual Basic est stocké indépendam-ment de tout le reste du classeur. Cela permet à Excel de refuser facilementd’ouvrir un classeur qui contient des macros à moins que ce fichier ne soit expli-citement enregistré comme classeur prenant en charge les macros.

1. Dans l’éditeur Visual Basic, cliquez sur le bouton Explorateur de projets.

La fenêtre Projet apparaît. C’est une fenêtre ancrable, si bien que vous pou-vez la déplacer vers un côté de la fenêtre de l’éditeur Visual Basic ou la lais-ser flotter. Vous voyez dans la fenêtre que le nom du projet est VBAProject.Le nom du classeur (Chapitre09.xlsm) apparaît entre parenthèses. Les procé-dures peuvent être stockées dans des modules ordinaires (regroupés sousl’en-tête Modules de la fenêtre Projet) ou attachées aux classeurs et auxfeuilles de calcul (regroupées sous Microsoft Excel Objets dans la fenêtreProjet).

Explorateur de projets

Page 305: Excel 2007 VBA

Création de boutons de commande personnalisés 285

Chaque feuille de calcul possède une page associée qui contient le code decette feuille et/ou de ses objets. Lorsque vous créez une nouvelle feuille decalcul, une nouvelle page de code apparaît dans la fenêtre Projet. Lorsquevous supprimez une feuille de calcul, sa page de code associée disparaît.

2. Double-cliquez sur l’entrée intitulée Module1.

La fenêtre principale de l’éditeur Visual Basic affiche les macros stockéesdans Module1.

3. Double-cliquez sur l’entrée intitulée Feuil1.

La fenêtre principale de l’éditeur Visual Basic affiche les gestionnaires d’évé-nement des objets de Feuil1.

4. Dans Excel, glissez déposez l’onglet Feuil1 vers la droite, puis appuyez surCTRL et maintenez cette touche enfoncée tandis que vous relâchez le boutonde la souris.

Excel crée une copie de la feuille. Cette copie est nommée Feuil1 (2) et pos-sède sa propre copie des boutons de commande.

5. Repassez à l’éditeur Visual Basic et examinez la fenêtre Projet. La liste pré-sente une nouvelle feuille dans Microsoft Excel Objets.

Page 306: Excel 2007 VBA

286 Chapitre 9 Lancement de macros à l’aide d’événements

Le nom entre parenthèses, Feuil1 (2), correspond au nom de l’onglet defeuille de calcul. Le nom avant les parenthèses, Feuil4, est un nom uniquegénéré par Visual Basic. Puisque vous possédez maintenant une feuille aveccomme nom interne Feuil4, si vous employez Insert Worksheet pour créerune nouvelle Feuil4, Visual Basic lui attribuera Feuil5 comme nom interne.Vous pouvez employer la fenêtre Propriétés pour modifier le nom interned’une feuille.

6. Cliquez sur le bouton Propriétés. Dans la fenêtre Propriétés, modifiez lavaleur de la propriété (Name) en MyNewSheet.

7. Double-cliquez sur l’élément feuille de calcul MyNewSheet dans la fenêtreProjet.

La fenêtre principale de l’éditeur Visual Basic montre maintenant les procé-dures de gestionnaire d’événement des copies des boutons de commande.Ces procédures ressemblent exactement aux procédures liées aux boutonsde commande de Feuil1, mais il s’agit de copies distinctes. Si vous modifiezla procédure btnZoomIn_Click de MyNewSheet, la procédurebtnZoomIn_Click de Feuil1 restera inchangée.

8. Dans Excel, supprimez la feuille de calcul Feuil1 (2). Revenez ensuite à l’édi-teur Visual Basic et examinez la fenêtre Projet.

Comme vous l’aviez probablement anticipé, l’entrée de MyNewSheet a dis-paru, ainsi que les procédures qui lui étaient associées.

Propriétés

Important Lorsque vous supprimez une feuille de calcul qui possède des procé-dures de gestionnaire d’événement associées, toutes les procédures sont détruitesen même temps que la feuille de calcul. Enregistrez fréquemment votre travail lors-que vous rédigez des gestionnaires d’événement de façon à pouvoir retrouvervotre travail si vous supprimez accidentellement une feuille de calcul.

Page 307: Excel 2007 VBA

Gestion d’événements de feuille de calcul et de classeur 287

Gestion d’événements de feuille de calcul et de classeur

Les contrôles ActiveX ne sont pas les seuls objets Excel à posséder des événe-ments. Il en va de même des feuilles de calcul et des classeurs. Chacun de cesobjets peut répondre à différents événements.

Exécution d’une procédure suite à une modification de la sélectionUn des événements auxquels vous pouvez répondre depuis un classeur est lors-que l’utilisateur modifie la sélection. Vous pouvez créer un gestionnaire d’événe-ment qui s’exécute à chaque changement de sélection.

1. Dans l’éditeur Visual Basic, activez la fenêtre de code Feuil1 (dans la fenêtreProjet, double-cliquez sur Feuil1).

2. Dans la liste Objets, en haut à gauche de la fenêtre de code, sélectionnezWorksheet.

Une nouvelle procédure apparaît avec comme nom Worksheet_SelectionChange. Cet événement se produit lorsque vous modifiez la sélection sur lafeuille de calcul. Peu importe que vous cliquiez sur une cellule ou employiezles touches fléchées pour vous déplacer : l’événement se produit dans tousles cas.

3. Uniquement pour découvrir les événements de feuille de calcul, cliquez surla flèche Procédure, en haut à droite de la fenêtre de code. La liste montreles neuf événements auxquels peut répondre une feuille de calcul. Selection-Change est l’événement par défaut d’une feuille de calcul, exactementcomme Click est l’événement par défaut d’un bouton de commande.

4. Appuyez sur ECHAP pour fermer la liste des événements, puis saisissez les ins-tructions suivantes comme corps de la procédure Worksheet_SelectionChange :

If ActiveCell.Interior.Color = rgbLightBlue ThenSelection.Interior.Color = rgbLightGreenElseSelection.Interior.Color = rgbLightBlueEnd If

Page 308: Excel 2007 VBA

288 Chapitre 9 Lancement de macros à l’aide d’événements

La procédure modifie maintenant la cellule nouvellement sélectionnée enbleu clair, sauf si celle-ci est déjà en bleu clair, auquel cas elle devient vertclair.

5. Activez Feuil1 dans Excel, puis cliquez plusieurs cellules différentes.Appuyez sur les touches fléchées pour vous déplacer entre cellules. Glissezdéposez un rectangle de sélection sur plusieurs cellules. La couleur des cel-lules se modifie chaque fois que vous modifiez la sélection.

6. Activez maintenant Feuil2 et sélectionnez une cellule.

Rien ne se passe. Le gestionnaire d’événement Worksheet_SelectionChangen’est actif que pour sa feuille de calcul associée.

Gestion d’un événement sur n’importe quelle feuille de calculLorsque vous créez un gestionnaire d’événement pour l’événement Selection-Change de Feuil1, ce gestionnaire ne s’applique qu’à cette feuille de calcul. Sivous activez Feuil2 et modifiez la sélection, rien ne se passe. Les gestionnairesd’événement de feuille de calcul ne répondent qu’aux événements de leur proprefeuille de calcul. Pour gérer un événement sur n’importe quelle feuille de calcul,vous devez employer un gestionnaire d’événement de niveau classeur.

1. Dans l’éditeur Visual Basic, activez la fenêtre Projet et double-cliquez surl’élément ThisWorkbook.

2. Dans la liste Objet, sélectionnez Workbook.

Une nouvelle procédure apparaît, nommée Workbook_Open. Open estl’événement par défaut d’un classeur. C’est l’événement que vous employezsi vous voulez exécuter une procédure à chaque ouverture du classeur.

3. Cliquez sur la liste Procédures pour voir les événements disponibles pourun classeur. Descendez jusqu’à ceux qui débutent par la lettre S.

Page 309: Excel 2007 VBA

Gestion d’événements de feuille de calcul et de classeur 289

Un classeur peut répondre à n’importe lequel parmi 29 événements diffé-rents. Remarquez que neuf d’entre eux débutent par Sheet. Et que ces neufévénements Sheet de classeur correspondent exactement aux neuf événe-ments de feuille de calcul, si ce n’est qu’ils s’appliquent à toutes les feuillesde calcul du classeur, même à celles qui n’existent pas encore.

4. Sélectionnez l’événement SheetSelectionChange. Cela crée une nouvelleprocédure Workbook_SheetSelectionChange.

5. Supprimez la procédure Workbook_Open. Vous n’en aurez pas besoin.

6. Saisissez Selection.Interior.Color = rgbLightSalmon comme corps de lanouvelle procédure.

7. Repassez à Excel, activez Feuil2, puis cliquez sur diverses cellules. La couleurde ces cellules passe à un rose saumoné clair.

8. Activez Feuil1, puis cliquez sur diverses cellules.

Les cellules de cette feuille passent également au rose saumoné. Qu’est-ilarrivé à la procédure du gestionnaire d’événement SelectionChange deFeuil1 ? Il semblerait que le gestionnaire d’événement du classeur remplacecelui d’une feuille individuelle, mais ce n’est pas totalement exact. En prati-que, les deux gestionnaires s’exécutent, mais celui du classeur en dernier. Lapropriété de la couleur de l’intérieur de chaque cellule passe au bleu clair(ou au vert clair) puis passe rapidement au saumon clair. Vous ne voyez pasla couleur intermédiaire car Windows ne rafraîchit pas l’écran avant la fin dela macro. Vous ne voyez donc que la couleur finale. Si vous ne me croyezpas, placez des points d’arrêt dans les procédures du classeur et de la feuillede calcul, puis cliquez sur une cellule de Feuil1.

Page 310: Excel 2007 VBA

290 Chapitre 9 Lancement de macros à l’aide d’événements

Pour résumer, vous pouvez créer des procédures de gestionnaire d’événementpour n’importe lequel des neuf événements d’une feuille de calcul. Vous pouvezplacer ces procédures de gestionnaire d’événement au niveau feuille de calcul ouau niveau classeur. Si la procédure est au niveau classeur, il gère les événementspour toutes les feuilles de calcul, qu’une feuille particulière possède ou non sonpropre gestionnaire d’événement.

Supplanter un événement de classeur Il pourrait sembler curieux qu’un gestionnaire d’événement de feuille de calculn’outrepasse pas un gestionnaire d’événement de classeur pour le même événe-ment. En pratique, l’exécution d’abord de l’événement de la feuille de calcul vousprocure un contrôle fin sur des façons de tirer profit de ces événements.

Si vous voulez que les deux gestionnaires d’événement s’exécutent, vous n’avezrien à faire. Par exemple, le gestionnaire du classeur peut définir les bordures dela sélection tandis que le gestionnaire de la feuille de calcul définit la couleur del’intérieur. Si en revanche vous souhaitez que le gestionnaire d’événement defeuille de calcul supplante le gestionnaire d’événement de classeur, vous pouvezle configurer à cette fin. Il suffit de faire en sorte que le gestionnaire d’événementde feuille de calcul indique au gestionnaire d’événement de classeur de ne rienfaire. Vous le faites en créant une très simple propriété au niveau classeur.

1. Double-cliquez sur ThisWorkbook dans la fenêtre Projet. Saisissez en hautde la fenêtre code cette instruction, au-dessus de la procédure de gestion-naire d’événement :

Public ProcessingEvent As Boolean

Cela déclare ProcessingEvent comme une variable public de ThisWorkbook.Lorsque vous déclarez une variable avant toutes les procédures d’unmodule, celle-ci devient visible pour toutes les procédures de ce module etporte le nom de variable de niveau module. En employant le mot Publicpour déclarer une variable de niveau module, celle-ci devient visible pourtoutes les procédures du classeur. Une variable publique est fondamentale-ment une propriété simple. Déclarer la variable comme Boolean signifiequ’elle ne peut être que True ou False. Si vous ne lui affectez rien, elle seraFalse.

2. Modifiez le corps du gestionnaire d’événement Workbook_SheetSelec-tionChange en ceci :

If ProcessingEvent = True Then ProcessingEvent = FalseElse Selection.Interior.Color = rgbLightSalmonEnd If

Page 311: Excel 2007 VBA

Gestion d’événements de feuille de calcul et de classeur 291

Le gestionnaire d’événement ne changera maintenant la couleur de la sélec-tion que si la variable ProcessingEvent n’est pas True. Si ProcessingEvent estTrue, le gestionnaire d’événement modifie la variable à nouveau en False. Sivous ne modifiiez pas à nouveau ProcessingEvent en False, supplanter unefois le gestionnaire d’événement le désactiverait jusqu’à la fermeture duclasseur.

3. Double-cliquez sur Feuil1 dans la fenêtre Projet. Dans le gestionnaired’événement Worksheet_SelectionChange, saisissez ThisWorkbook.Pro-cessingEvent = True juste avant l’instruction End Sub.

Remarquez que la nouvelle propriété ProcessingEvent figure dans la listedes membres. Elle arbore même une icône standard Propriété. Avec cetteinstruction, le gestionnaire d’événement de feuille de calcul indique au ges-tionnaire d’événement de classeur qu’il est en train de traiter l’événementlui-même. Le code du gestionnaire d’événement du classeur se sert de cetteinformation pour décider s’il accomplit ou non quelque chose.

4. Activez Feuil1 dans Excel et modifiez la sélection.

La sélection devrait se modifier en bleu ou vert clair. Le gestionnaire d’évé-nement de feuille de calcul supplante le gestionnaire d’événement du clas-seur.

5. Activez Feuil3 et modifiez la sélection.

La sélection devrait passer en rose saumoné. Le gestionnaire d’événementde classeur fonctionne encore correctement tant qu’il n’est pas supplantépar la feuille de calcul.

Créer une variable publique dans ThisWorkbook crée une propriété personnaliséetrès simple qui permet de supplanter le gestionnaire d’événement classeur. Vousdisposez désormais d’un contrôle total sur les gestionnaires d’événement qui

Dépannage Si vous aviez placé des points d’arrêt dans une quelconque de cesprocédures, mieux vaut les supprimer avant de poursuivre.

Page 312: Excel 2007 VBA

292 Chapitre 9 Lancement de macros à l’aide d’événements

s’exécutent à tout moment. Vous pouvez disposer d’un gestionnaire d’événementqui s’exécute uniquement au niveau feuille de calcul, uniquement au niveau clas-seur ou aux deux niveaux. Vous êtes le maître.

Annulation d’un événementCertains événements sont faits pour être annulés. Par exemple, Excel affiche unmenu contextuel et une barre d’outils de mise en forme comme fenêtres surgis-santes lorsque vous effectuez un clic droit sur une feuille de calcul.

Comment faire pour interdire leur apparition ? Vous pouvez créer une procédurede gestionnaire d’événement qui annule cet événement.

Les événements qui peuvent être annulés possèdent tous le mot Before devant lenom de l’événement. Une feuille de calcul possède un événement BeforeDouble-Click et un événement BeforeRightClick. Un classeur possède des événementsSheetBeforeDoubleClick et SheetBeforeRightClick correspondants, ainsi que desévénements BeforeClose, BeforeSave et BeforePrint. Chaque procédure d’événe-ment qui peut être annulée possède un argument Cancel. Annuler un événementsupplante le gestionnaire d’événement normal qu’exécuterait Excel pour cet évé-nement. Pour annuler un événement, affectez True à l’argument Cancel dansvotre procédure de gestionnaire d’événement.

1. Dans la fenêtre de code Feuil1, sélectionnez Worksheet dans la liste Objet,puis BeforeRightClick dans la liste Procédures.

2. Dans la procédure de gestionnaire d’événement qui apparaît, saisissezcomme corps l’instruction Cancel = True.

3. Activez Excel, puis sélectionnez Feuil1. Essayez d’effectuer un clic droit surune cellule.

La couleur se modifie à cause de la procédure SelectionChange, mais lafenêtre habituelle ne surgit pas. Votre gestionnaire d’événement personna-lisé s’exécute avant le gestionnaire intégré et empêche l’exécution de celui-ci.

Page 313: Excel 2007 VBA

Gestion d’événements de feuille de calcul et de classeur 293

4. Sélectionnez Feuil2 et effectuez un clic droit sur une cellule. La couleur semodifie et la fenêtre surgissante apparaît.

5. Appuyez sur ECHAP pour fermer la fenêtre surgissante. Enregistrez et fermezle classeur Chapitre09.

Vous pouvez lier des barres d’outils et des menus à des macros. Les boutons decommande, les feuilles de calcul et les classeurs peuvent être liés à des gestion-naires d’événement. Tous ces outils permettent la création d’applications que cha-cun peut facilement employer.

Le ruban et Visual Basic for ApplicationsDans les précédentes éditions d’Excel, il était possible d’employer des macrosVBA pour modifier les menus et les barres d’outils. Menus et barres d’outilssont remplacés dans Excel 2007 par le ruban.

Il est possible de contrôler par programmation le ruban, mais vous ne pouvezpas le faire depuis VBA. Vous devez à la place créer un code parfaitement géréà l’aide d’un langage comme C# ou Visual Basic .NET. Pour des raisons decompatibilité descendante, tout menu ou barre d’outil créé dans une macroVBA est placé dans l’onglet Compléments du ruban. Vous ne souhaiterez pro-bablement pas créer de nouvelles macros qui placent des contrôles dansl’onglet Compléments.

Le nouveau ruban propose plus d’options d’interface utilisateur que les menuset les barres d’outils. Un développeur peut ajouter de nombreux contrôles dif-férents à un onglet du ruban. Celui-ci est toutefois plus complexe, ce pour-quoi vous ne pouvez pas le personnaliser depuis VBA. Concrètement, lorsquevous créez un contrôle de ruban, vous devez créer également des événementspersonnalisés pour ce contrôle. VBA permet la création d’une procédure pourn’importe quel événement prédéfini, mais pas de définir un nouvel événe-ment.

FERMEZ le classeur Chapitre09.xlsm.

Page 314: Excel 2007 VBA

294 Chapitre 9 Lancement de macros à l’aide d’événements

Points clés● Ajoutez un bouton de commande personnalisé à une feuille de calcul pour

offrir un moyen simple de lancer une macro. Attribuez au bouton un nomsignificatif avant de créer un gestionnaire d’événement pour lui.

● Affectez un gestionnaire d’événement MouseMove à un contrôle pour dis-poser d’événements très fréquents qui ne nécessitent pas de clic. Servez-vous de l’argument Shift de l’événement MouseMove pour ajuster finementle comportement du gestionnaire d’événement.

● Si vous voulez qu’un gestionnaire d’événement de feuille de calcul s’exécutepour n’importe quelle feuille de calcul du classeur, y compris de nouvellesfeuilles de calcul, créez le gestionnaire d’événement au niveau classeur.

● Tout gestionnaire d’événement dont le nom débute par Before peut êtreannulé. Ajoutez simplement l’instruction Cancel=True dans le corps du ges-tionnaire d’événement pour annuler ce qu’Excel ferait sinon automatique-ment de cet événement.

Page 315: Excel 2007 VBA
Page 316: Excel 2007 VBA

Ajout d’une zone de liste à une feuille de calcul, page 306

Ajout d’un bouton toupie à une feuille de calcul, page 301

Ajout d’une barre de

défilement à une feuille de calcul,

page 305

Peuplement d’une zone de liste depuis une plage, page 307

Emploi de propriétés pour ajuster le comportement

d’un contrôle de feuille de calcul, page 307

Création de gestionnairesd’événement pour des

contrôles de feuille de calcul, page 312

Faire fonctionner des contrôles de feuille de calcul sur une feuille de calcul protégée, page 313

Coup d’œil sur le chapitre

Page 317: Excel 2007 VBA

297

10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

Ce chapitre aborde les points suivants :✔ Ajout de contrôles ActiveX à une feuille de calcul ;✔ Liaison de la valeur d’un contrôle à une cellule de feuille de calcul ;✔ Liaison d’une zone de liste à une plage de feuille de calcul ;✔ Création d’une zone de liste à multiples colonnes ;✔ Protection d’une feuille de calcul qui emploie des contrôles ActiveX.

Microsoft Office Excel 2007 est un excellent programme. Nombreux sont ceux àl’acheter pour leur travail. Plus exactement, ils disent qu’ils vont l’employer au tra-vail. Nous savons bien sûr que le principal motif de cet achat est en réalité pourcalculer les remboursements d’emprunts automobiles (ou, pour certains, desemprunts immobiliers). C’est après l’achat que nous découvrons qu’il peut égale-ment servir à gérer quelques autres projets.

Supposez qu’un de vos amis vienne d’acquérir Excel, sans savoir encore commentbien s’en servir. Vous voulez l’aider en construisant un modèle que votre amipourra employer pour calculer le montant des remboursements de son empruntautomobile. Vous voulez qu’il soit capable de tester différents prix, taux d’intérêtset durées d'emprunts, tout en minimisant les risques d’erreur. Excel propose depuissants outils pour vous aider à y parvenir.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 318: Excel 2007 VBA

298 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

Emploi d’un calculateur de remboursements d’emprunt

Lorsque vous interagissez avec Excel, vous le faites grâce à son interface graphi-que utilisateur. Une interface graphique utilisateur comprend des boutons, desvolets de tâche, des boîtes de dialogue, des zones de listes, des barres de défile-ment et d’autres objets graphiques. Une interface graphique utilisateur facilitel’emploi du programme et aide à réduire les erreurs en limitant les choix auxoptions valides.

Historiquement, créer une interface graphique utilisateur était le rôle de profes-sionnels spécialistes de l’informatique. Plus récemment, les utilisateurs d’applica-tions avancées ont été capables d’ajouter des contrôles graphiques à des boîtesde dialogue personnalisées. Désormais, avec Excel, vous pouvez tirer parti descontrôles de style boîte de dialogue directement sur une feuille de calcul, sansaucune programmation.

Vous allez créer dans ce chapitre un modèle de feuille de calcul pour calculer lesremboursements d’un emprunt automobile. Vous allez ajouter à la feuille de cal-cul des contrôles ActiveX pour la rendre facile d’emploi, même pour un ami peuhabitué aux tableurs. Ce faisant, vous allez vous familiariser avec le fonctionne-ment des contrôles ActiveX, ce qui vous sera utile lors de la création de formulai-res personnalisés.

Création du modèle de Remboursement d’empruntLes cellules B2 à B7 de la feuille Loan du classeur Chapitre10 contiennent les inti-tulés Price, Down, Loan, Interest, Years et Payment. Ces libellés vont vous aider àcréer un modèle qui a recours à une fonction de feuille de calcul Excel pour cal-culer les remboursements mensuels d’un emprunt automobile.

SERVEZ-VOUS du classeur Loan.xlsx, situé dans le dossier Docu-ments\MSP\ExcelVBA07SBS.VEILLEZ A enregistrer une copie prenant en charge les macros de Loan.xlsx sous lenom Chapitre10.xlsm dans le dossier approuvé créé au Chapitre 1. OUVREZ le classeur Chapitre10.xlsm.

Page 319: Excel 2007 VBA

Emploi d’un calculateur de remboursements d’emprunt 299

Les étapes suivantes créent un calculateur de remboursement d’emprunt parfaite-ment fonctionnel.

1. Saisissez 5000 dans la cellule C2 (à droite de Price), saisissez 0,2 dans la cel-lule C3 (à droite de Down), saisissez 8 dans la cellule C5 (à droite d’Interest)et saisissez 3 dans la cellule C6 (à droite de Years).

2. Sélectionnez la plage B2:C7, puis sur l’onglet Formules du ruban, dans lasection Noms définis, cliquez sur le bouton Créer à partir de la sélection,en veillant à ce que seule l’option Colonne de gauche soit sélectionnée,puis cliquez sur OK.

Cela emploie le libellé de la colonne B pour nommer la cellule correspon-dante de la colonne C. Cela va rendre les formules plus faciles à comprendre.

3. Dans la cellule C4 (à droite de Loan), saisissez =Price*(1-Down) et appuyezsur ENTRÉE. La valeur $ 4 000 apparaît dans la cellule.

Page 320: Excel 2007 VBA

300 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

4. Dans la cellule C7 (à droite de Payment), saisissez =VPM(Interest/12;Years*12;Loan) et appuyez sur ENTRÉE.

Le montant du paiement, $ (125), apparaît dans la cellule.

Le résultat est le remboursement mensuel pour le véhicule hypothétique.Les parenthèses autour du nombre de la feuille de calcul indiquent un nom-bre négatif. Malheureusement, vous ne percevez pas cette somme maisdevez la verser. Si vous voulez transformer le remboursement mensuel en unnombre positif, placez un signe moins avant Loan dans la formule.

Emploi du modèle de remboursement d’empruntPuisque vous disposez désormais de toutes les formules du modèle de rembour-sement d’emprunt, vous pouvez remplacer les valeurs des cellules pour voir l’effetsur les montants. Par exemple, vous pouvez voir ce que seraient les rembourse-ments pour une voiture plus onéreuse.

1. Saisissez 12000 dans la cellule C2 et appuyez sur ENTRÉE.

Le montant de l’emprunt s’ajuste à $ 9 600 et le remboursement à $ 301.

Ce modèle simple calcule automatiquement les remboursements mensuelsd’emprunt pour un ensemble donné de variables d’entrée. Vous modifiez lesvariables d’entrée et les montants s’ajustent en conséquence. Vous pouvezmême saisir des valeurs délirantes.

2. Saisissez 1500000 comme prix de la voiture.

C’est un véhicule très onéreux. La formule de calcul génère sans faillir lemontant du remboursement mensuel, mais vous ne pouvez le lire car il esttrop grand (au cas où cela vous intéresserait, le montant serait pour ce véhi-cule de 37 604 $).

Page 321: Excel 2007 VBA

Création d’un calculateur de remboursement d’emprunt résistant aux erreurs 301

3. Cliquez sur le bouton Annuler de la barre d’accès rapide pour revenir auprix de 12 000 $.

Un des problèmes de ce modèle est qu’il est trop souple. Vous pourriez entrer unprix ridiculement trop élevé ou un taux d’intérêt prohibitif, comme 500 %. Vouspourriez même entrer quelque chose de totalement inutile comme le nombred’années ou Chien. L’immense étendue des choix possibles, dont seuls certainspossèdent une signification, pourrait troubler votre ami.

Vous pouvez ajouter des contrôles à la feuille de calcul pour éviter de provoquerce type de confusion.

Création d’un calculateur de remboursement d’emprunt résistant aux erreurs

Excel dispose d’outils qui vous permettent de rendre votre calculateur de rem-boursement d’emprunt résistant aux erreurs. En limitant les options aux élémentsvalides, vous pouvez rendre votre modèle moins susceptible de générer des résul-tats erronés ainsi que plus facile à employer. La liste Insérer de l’onglet Déve-loppeur du ruban propose divers contrôles ActiveX que vous pouvez placer surune feuille de calcul.

Voir aussi Pour plus d’informations sur les contrôles ActiveX ou sur la façon d’activerl’onglet Développeur du ruban, reportez-vous à la section « Création de boutons de com-mande personnalisés » du chapitre 9, « Lancement de macros à l’aide d’événements ».

Restriction de la durée à une plage valideCommencez par rendre difficile la saisie d’une durée d’emprunt invalide. Unemprunt automobile s’étend en principe sur une durée maximale de cinq ans, parincrément d’un an. Par sécurité, autorisons un nombre d’années compris entre 1 et6. Un bouton toupie est un excellent moyen de spécifier de telles valeurs entières.

1. Sur l’onglet Développeur du ruban, cliquez sur la flèche Insérer, puis cli-quez sur le bouton Toupie (Contrôle ActiveX).

Annuler

Toupie (Contrôle ActiveX)

Page 322: Excel 2007 VBA

302 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

2. Appuyez sur la touche ALT et maintenez-la enfoncée, puis cliquez sur le coinsupérieur gauche de la cellule E6. Appuyez sur la touche ALT pendant quevous cliquez sur le contrôle l’aligne sur le quadrillage des cellules.

3. Libérez la touche ALT, puis glissez déposez le coin inférieur droit du nouveaubouton toupie vers le milieu du bas de la cellule E6. Le bouton toupie pivoteet s’adapte à la ligne.

4. Sur l’onglet Développeur du ruban, cliquez sur le bouton Propriétés pourouvrir la fenêtre Propriétés.

Un contrôle ActiveX possède de nombreuses propriétés. Pour la plupartd’entre elles, les valeurs par défaut sont parfaites. Ne modifiez que les pro-priétés pour lesquelles il vous faut une valeur personnalisée.

5. Saisissez 6 comme valeur de la propriété Max, puis saisissez 1 comme valeurde la propriété Min.

Vous voulez que le bouton toupie contrôle la valeur de la cellule C6, dont lenom est Years. La propriété LinkedCell détermine la cellule qui va être modi-fiée par le contrôle.

6. Saisissez Years pour la propriété LinkedCell et appuyez sur ENTRÉE.

Page 323: Excel 2007 VBA

Création d’un calculateur de remboursement d’emprunt résistant aux erreurs 303

7. Cliquez sur le bouton Mode Création pour désactiver le mode création,puis cliquez sur le bouton toupie sur la feuille de calcul.

Le nombre situé dans la cellule C6 se modifie tandis que vous cliquez sur lebouton toupie, et le montant des remboursements se modifie en consé-quence. Votre ami trouvera maintenant facile de ne sélectionner que desdurées d’emprunt valides.

Limitation de l’apport personnel à une valeur acceptableMalheureusement, votre ami peut encore saisir une valeur invalide pour le pour-centage d’apport personnel (–50 %, par exemple, ou Chien). Vous devez l’aider.

Vous devez spécifier l’apport personnel (nommé ici down payment) comme unpourcentage. Les valeurs admissibles vont de 0 à 100 %, par incrément de 5 %.L’incrément minimum d’un bouton toupie est un entier. Bien que la valeurd’apport personnel soit une fraction et non un entier, vous pouvez employer unbouton toupie en vous servant d’une autre cellule pour stocker la valeur intermé-diaire.

1. Cliquez sur le bouton Mode Création pour activer le mode création.

2. Appuyez sur les touches ALT et CTRL et maintenez-les enfoncées tandis quevous glissez déposez le bouton toupie de la cellule E6 à la cellule E3.

Lorsque vous relâchez le bouton de la souris, une copie s’aligne sur le coinsupérieur gauche de la cellule E3. Copier le contrôle donne aux deux con-trôles exactement la même taille.

Dépannage Veillez à bien relâcher le bouton de la souris avant de relâcher lestouches CTRL et ALT.

Page 324: Excel 2007 VBA

304 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

3. Dans la fenêtre Propriétés, saisissez 100 comme valeur de la propriétéMax, 0 (zéro) comme valeur de la propriété Min et H3 comme valeur de lapropriété LinkedCell.

La cellule H3 contient une valeur intermédiaire entière, car le bouton toupiene peut accepter que des incréments entiers. Vous diviserez par la suite par100 la valeur de la cellule H3 pour convertir l’entier créé par le bouton tou-pie en un pourcentage acceptable comme apport personnel.

4. Saisissez 5 comme valeur de la propriété SmallChange et appuyez surENTRÉE. Cette propriété contrôle l’incrément du nombre à chaque appui surles flèches du bouton toupie.

5. Cliquez sur le bouton Mode création pour sortir du mode création, puis cli-quez sur le bouton toupie.

La valeur de la cellule H3 se multiplie en multiple de 5 compris entre 0 et100. Vous avez maintenant besoin d’une valeur correspondante dans la cel-lule C3, comprise entre 0 et 100 %.

Dépannage Si vous tentez d’entrer H3 comme valeur de la propriété LinkedCellavant de fixer la valeur de Min à 0, vous obtenez un message d’erreur. En effet, lavaleur actuelle de Min est 1 tandis que H3 est vide, ce qui est équivalent à unevaleur de 0.

Page 325: Excel 2007 VBA

Création d’un calculateur de remboursement d’emprunt résistant aux erreurs 305

6. Sélectionnez la cellule C3, saisissez =H3/100 et appuyez sur ENTRÉE. Unevaleur de pourcentage adéquate apparaît dans la cellule.

7. Cliquez sur le bouton toupie pour voir la modification simultanée de l’entierde la cellule H3 et du pourcentage de la cellule C3. Comme les cellules Loan(l’emprunt) et Payment (les remboursements) contiennent des formules quidépendent de l’apport personnel, elles changent également. Un simple clic,beaucoup de conséquences.

Restriction du taux d’intérêt à des valeurs validesLe taux d’intérêt est encore une valeur d’entrée que votre ami pourrait saisir incor-rectement. Comme l’apport personnel, le taux d’intérêt est un pourcentage. Voussouhaiterez probablement que le taux d’intérêt puisse être ajusté tout les 0,25 %,avec une plage allant de 0 à 20 %. Comme vous autorisez des valeurs bien plusnombreuses que pour l’apport personnel, vous allez préférer un contrôle barre dedéfilement à un bouton toupie. Comme un bouton toupie, la barre de défilementne renvoie que des entiers : vous allez donc lier le contrôle à une cellule intermé-diaire.

1. Sur l’onglet Développeur du ruban, cliquez sur la flèche Insérer, puis cli-quez sur le bouton Barre de défilement (Contrôle ActiveX).

2. Appuyez sur la touche ALT et maintenez-la enfoncé tandis que vous cliquezsur le coin supérieur gauche de la cellule E5, puis maintenez enfoncée latouche ALT tandis que vous glissez déposez le coin inférieur droit de la nou-velle barre de défilement sur le coin inférieur droit de la cellule E5. Relâchezle bouton de la souris avec de libérer la touche ALT.

3. Dans la fenêtre Propriétés, saisissez 2000 comme valeur de la propriétéMax, 25 comme valeur de la propriété SmallChange, 100 comme valeur de

Barre de défilement (Contrôle ActiveX)

Page 326: Excel 2007 VBA

306 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

la propriété LargeChange, puis H5 comme valeur de la propriété Linked-Cell. Appuyez ensuite sur ENTRÉE.

4. Cliquez sur le bouton Mode création pour désactiver le mode création, puistestez le contrôle barre de défilement en cliquant sur ses flèches ainsi quesur la zone située entre les deux.

Si vous cliquez sur une des flèches des extrémités, le nombre de la cellule H5se modifie de 25 (la valeur SmallChange). Si vous cliquez entre le curseur etl’extrémité, le nombre change de 100 (la valeur LargeChange). Vous pouvezégalement glisser déposer le curseur de la barre de défilement pour obtenirn’importe quelle valeur entre 0 et 2000.

5. Sélectionnez la cellule C5, saisissez =H5/10000 et appuyez sur ENTRÉE.

Vous divisez par 100 pour transformer le nombre de H5 en un pourcentageet encore par 100 (100 * 100 = 10000 au total) pour disposer de centièmes.

Votre ami peut maintenant facilement modifier la durée de l’emprunt (à l’aided’un bouton toupie), le pourcentage d’apport personnel (avec l’autre bouton tou-pie) ou le taux d’intérêt (grâce au contrôle barre de défilement).

Récupération d’une valeur depuis une listeVous pourriez spécifier le prix d’un véhicule en créant une autre barre de défile-ment. Le prix d’une voiture est toutefois déterminé par le véhicule que vous vou-lez acquérir. Vous savez que votre ami a examiné les petites annonces et disposed’une liste de véhicules d’occasion envisageables.

Vous pourriez faciliter l’emploi de la feuille de calcul en permettant à votre ami desélectionner la description de la voiture pour afficher automatiquement le prixdans la cellule Price.

Page 327: Excel 2007 VBA

Récupération d’une valeur depuis une liste 307

Préparation d’une liste de véhiculesLe classeur Chapitre10 contient la liste des voitures qui intéressent votre ami, ainsique leurs prix. La liste débute à la cellule K2. Vous pouvez créer une zone de listequi affiche la liste de ces véhicules.

Pour rendre plus simple les formules, commencez par nommer la plage qui con-tient la liste.

1. Sélectionnez la plage K2:L8. Effectuez ensuite un clic droit sur la plage et cli-quez sur Nommer une plage dans le menu contextuel. Dans la boîte dedialogue Nouveau nom, saisissez CarList comme nom de la liste et cliquezsur OK.

Le nom défini contient à la fois la liste des noms des voitures et la liste desprix correspondants.

2. Sur l’onglet Développeur du ruban, cliquez sur la flèche Insérer, puis cli-quez sur Zone de liste déroulante (Contrôle ActiveX). Appuyez et main-tenez enfoncée la touche ALT, puis glissez déposez un rectangle du coinsupérieur gauche au coin inférieur droit de la cellule E2.

Une zone de liste déroulante peut posséder un style parmi deux. Ce peutêtre une zone de liste simple, qui ne permet de sélectionner que les élé-

Zone de liste déroulante (Contrôle ActiveX)

Page 328: Excel 2007 VBA

308 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

ments de la liste, ou une zone de liste combinée avec une zone d’édition, quipermet outre une sélection dans la liste la saisie d’une valeur. Comme vousvoulez limiter votre ami à la liste existante de voitures et de prix, la zone deliste déroulante doit être une zone de liste simple.

3. Dans la fenêtre Propriétés, sélectionnez 2 – fmStyleDropDownListcomme valeur de la propriété Style.

La zone de liste présente une apparence gravée. Sur une feuille de calcul,elle aurait un meilleur aspect s’il ne semblait y avoir qu’une flèche dans unecellule. Vous pouvez obtenir cet aspect en modifiant quelques propriétés ducontrôle.

4. Dans la fenêtre Propriétés, modifiez la valeur de la propriété SpecialEffecten 0 – fmSpecialEffectFlat et la valeur de la propriété BackStyle en 0 –fmBackStyleTransparent. Cliquez n’emporte où sur la feuille de calcul defaçon à voir les effets des modifications des propriétés du bouton.

5. Sélectionnez le contrôle ComboBox. Modifiez la valeur de la propriété Lin-kedCell en Price et appuyez sur ENTRÉE.

Le prix de la cellule C2 apparaît comme valeur de la zone de liste déroulante.Vous pouvez maintenant modifier la zone de liste déroulante pour récupé-rer la liste des voitures.

6. Modifiez la valeur de la propriété ListFillRange en CarList et appuyez surENTRÉE.

Page 329: Excel 2007 VBA

Récupération d’une valeur depuis une liste 309

Rien ne semble se passer, car la valeur de la cellule C2 ne correspond àaucune des valeurs de la liste. La zone de liste déroulante sait toutefois com-ment obtenir sa liste de valeurs depuis la plage CarList. Vous pouvez obser-ver la valeur de la cellule C2 se modifier lorsque vous sélectionnez une autrevoiture dans la zone de liste déroulante.

7. Cliquez sur le bouton Mode création pour l’activer. Cliquez ensuite sur laflèche de la zone de liste déroulante et sélectionnez dans celle-ci 90 ToyotaCamry.

Le nom de la voiture apparaît dans la zone de liste déroulante, mais égale-ment dans la cellule C2 : les formules ne marchent pas bien lorsqu’un nomde voiture est fourni à la place d’un prix !

Récupération du prix de la listeVous pouvez maintenant sélectionner un nom de voiture dans la zone de listedéroulante, mais vous voulez que celle-ci place le prix du véhicule et pas son nomdans la cellule C2. Comme la plage CarList qui vous sert à peupler la liste contientune colonne avec les prix des voitures, vous pouvez indiquer à la zone de listedéroulante d’obtenir la valeur depuis cette colonne.

1. Cliquez sur le bouton Mode création, puis cliquez sur la zone de listedéroulante.

2. Dans la fenêtre Propriétés, modifiez la propriété ColumnCount en 2 etappuyez sur ENTRÉE.

La propriété ColumnCount informe la zone de liste déroulante qu’il existedeux colonnes de valeurs dans la plage ListFillRange.

3. Modifiez la propriété BoundColumn en 2 et appuyez sur ENTRÉE.

La propriété BoundColumn indique à la zone de liste déroulante quellevaleur de colonne placer dans la cellule liée. Et, en effet, le prix de la Toyota,$ 5 950, apparaît dans la cellule.

Page 330: Excel 2007 VBA

310 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

4. Désactivez le mode création, puis cliquez sur la flèche de la zone de listedéroulante.

5. Sélectionnez 87 BMW 325 dans la liste des véhicules.

Le prix se modifie en $ 4 959, et les autres formules se recalculent égale-ment.

Désormais, votre ami ne calculera plus accidentellement les remboursementspour un véhicule de 1 500 000 $. Il peut simplement sélectionner divers véhiculesdans la liste et Excel insère automatiquement le prix correct dans la cellule Price.

Définition de la largeur des colonnesLa zone de liste déroulante fonctionne parfaitement. Toutefois, lors de son affi-chage, la liste comporte en bas une barre de défilement horizontale et les nomsde certaines voitures sont tronqués. En outre, la colonne des prix est aussi largeque la colonne des noms. Par défaut, une zone de liste déroulante emploie la

Page 331: Excel 2007 VBA

Protection de la feuille de calcul 311

même largeur pour chaque colonne. Si, comme dans cet exemple, vous voulezque les colonnes possèdent des largeurs différentes, vous pouvez contrôlermanuellement ces largeurs.

1. Glissez déposez vers la droite l’en-tête de la colonne E pour fixer la largeurà 30.

2. Repassez en mode création, puis sélectionnez la zone de liste déroulante.Ajustez-la si nécessaire pour qu’elle occupe toute la largeur de la cellule.

3. Dans la fenêtre Propriétés, modifiez la valeur de ColumnWidths en 3,8cm; 0,5 in, et appuyez sur ENTRÉE.

Cela spécifie une largeur de 3,8 cm pour la première colonne et de0,5 pouce (inches) pour la seconde. La valeur affichée de la propriété semodifie en 107,7 pt; 36,8 pt, l’équivalent exprimé en points (un point estégal à 1/72 de pouce, soit environ 0,35 millimètre). Vous pouvez saisir lavaleur de la propriété en pouces (in), centimètres (cm) ou points (pt), mais lafenêtre Propriétés affiche toujours cette valeur en points.

4. Désactivez le mode création, puis cliquez sur la flèche de la zone de listedéroulante.

La zone de liste déroulante, avec ses nouvelles largeurs de colonne person-nalisées, rend très bien !

Protection de la feuille de calculLe modèle fonctionne, n’exige aucune saisie dans une cellule, et vous avez pu lecréer sans employer aucune macro ! Il n’est toutefois encore pas à toute épreuve.Rien dans le modèle n’empêche votre ami de saisir accidentellement Chiencomme prix de la voiture dans la cellule C2, ce qui créerait des erreurs dans toutesles formules.

Vous pouvez protéger la feuille de calcul pour éviter que votre ami ne saisisse unevaleur invalide dans le modèle. Cela empêcherait malheureusement les contrôlesActiveX de modifier les valeurs des cellules liées. Vous pouvez toutefois définir laprotection de feuille de calcul de telle façon que les procédures VBA puissent

Page 332: Excel 2007 VBA

312 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

encore modifier les cellules. Il suffit de quelques procédures de gestionnaired’événement pour protéger efficacement le modèle.

Création d’un gestionnaire d’événement pour la zone de liste déroulantePour le moment, chacun des quatre contrôles ActiveX est lié directement à unecellule. Une fois la feuille de calcul protégée, les liens directs ne fonctionnentplus : vous devez créer des procédures de gestionnaire d’événement pour placerles nouvelles valeurs dans les cellules.

1. Activez le mode création et sélectionnez la zone de liste déroulante.

2. Dans la fenêtre Propriétés, modifiez la propriété Name en cboPrice. Lepréfixe cbo correspond à ComboBox, le nom de l’objet zone de liste dérou-lante. Videz la zone de la propriété LinkedCell, puis effectuez un clic droitsur le contrôle et cliquez sur Visualiser le code.

Une nouvelle procédure de gestionnaire d’événement nomméecboPrice_Change apparaît. Change est l’événement par défaut d’une zonede liste déroulante.

3. Insérez l’instruction suivante comme corps de la macro :

Range("Price").Value = cboPrice.Value

Cette procédure de gestionnaire d’événement modifie la cellule C2 de façonà correspondre à la nouvelle valeur de la zone de liste déroulante, lorsquecette valeur change.

4. Activez Excel, désactivez le mode création, puis testez la zone de liste dérou-lante.

La valeur de la cellule C2 devrait adopter le prix correct chaque fois que voussélectionnez une nouvelle voiture, comme elle le faisait lorsque la propriétéLinkedCell connectait le contrôle directement à la cellule.

5. Répétez les étapes 1 à 4 pour le bouton toupie qui définit le pourcentaged’apport personnel. Donnez-lui comme nom spnDown, videz la valeur de la

Astuce Remarquez que, jusqu’à ce point, vous pouviez enregistrer le classeurcomme classeur standard. Vous pouvez employer des contrôles ActiveX dans unclasseur standard tant qu’ils ne possèdent pas de code associé. Dès que vous ajou-tez du code, vous devez enregistrer le classeur comme classeur prenant en chargeles macros. Si vous avez déjà enregistré le classeur comme prenant en charge lesmacros, vous n’avez rien à faire de plus.

Page 333: Excel 2007 VBA

Protection de la feuille de calcul 313

propriété LinkedCell. Saisissez dans sa procédure événementielle l’instruc-tion suivante :

Range("Down").Value = spnDown.Value / 100

6. Répétez les étapes 1 à 4 pour la barre de défilement qui spécifie le tauxd’intérêt. Donnez-lui comme nom scrInterest et videz la valeur de la pro-priété LinkedCell. Saisissez dans sa procédure événementielle l’instructionsuivante :

Range("Interest").Value = scrInterest.Value / 10000

7. Répétez les étapes 1 à 4 pour le bouton toupie qui définit la durée del’emprunt. Nommez-le spnYears et videz la valeur de la propriété Linked-Cell. Saisissez dans sa procédure événementielle l’instruction suivante :

Range("Years").Value = spnYears.Value

8. Sur la feuille de calcul, videz les cellules H3 et H5, car leurs valeurs sontdésormais superflues.

Vous disposez désormais d’une procédure de gestionnaire d’événement pourchaque contrôle. Aucun des contrôles n’est lié à une cellule. Vous êtes maintenantprêt à protéger la feuille de calcul.

Protection de la feuille de calculVous protégez normalement une feuille de calcul en cliquant sur la commandeProtection du menu Révision, puis en cliquant sur la commande Protéger lafeuille. Lorsque vous protégez ainsi une feuille de calcul, vous ne pouvez plusmodifier la valeur de toute cellule protégée, même depuis une macro ou une pro-cédure de gestionnaire d’événement.

En revanche, en employant une macro pour protéger la feuille de calcul, laméthode Protect dispose d’un argument spécial qui indique à Excel de permettreà une macro ou à un gestionnaire d’événement de modifier les cellules protégées.Ce type spécial de protection ne persiste pas lorsque vous fermez et réouvrez le

Page 334: Excel 2007 VBA

314 Chapitre 10 Emploi de contrôles de boîte de dialogue sur une feuille de calcul

classeur, si bien que vous devez protéger la feuille de calcul à chaque ouverturedu classeur. Vous pouvez établir la protection dans le gestionnaire de l’événementOpen du classeur.

1. Dans l’éditeur Visual Basic, cliquez sur le bouton Explorateur de projets,puis double-cliquez sur l’objet ThisWorkbook.

2. Dans la liste Objet (au-dessus de la fenêtre de code), sélectionnez Work-book.

3. Insérez l’instruction suivante comme corps de la procédureWorkbook_Open :

Worksheets("Loan").Protect UserInterfaceOnly:=True

L’argument UserInterfaceOnly de la méthode Protect est ce qui permet àune macro d’effectuer des modifications là où en est incapable un contrôleou un utilisateur.

4. Enregistrez et fermez le classeur Chapitre10. Ouvrez-le à nouveau pour per-mettre à Excel d’activer les macros.

5. Essayez de saisir des nombres dans le modèle.

Excel explique poliment que la feuille de calcul est protégée.

6. Essayez de modifier le modèle à l’aide des contrôles ActiveX, pour vérifierque tout fonctionne correctement.

Le modèle de calculateur de remboursement d’emprunt est maintenant robusteet prêt à être confié à votre ami. Celui-ci peut tester divers scénarios sans avoir àcraindre de saisir une entrée invalide dans le modèle. Votre ami ne peut en faitrien saisir dans le modèle, car la feuille de calcul est protégée. D’ailleurs, il n’y arien à saisir. Votre ami peut tout contrôler sur la feuille de calcul en cliquant sim-plement sur des contrôles à l’aide de la souris. Un des grands intérêts d’une inter-face graphique utilisateur est la possibilité de limiter les choix à des valeursvalides, ce qui réduit ou élimine les erreurs utilisateur tout en facilitant l’emploi dumodèle.

Explorateur de projets

FERMEZ le classeur Chapitre10.xlsm.

Page 335: Excel 2007 VBA

Points clés 315

Points clés● Servez-vous d’un contrôle toupie pour choisir parmi une petite plage de

nombres et d’une barre de défilement pour choisir parmi une plage plusimportante.

● Servez-vous d’un contrôle de zone de liste déroulante pour sélectionner unélément dans une liste. Si la liste comporte plusieurs colonnes, servez-vousde la propriété BoundColumn pour déterminer celle qui est renvoyée par lazone de liste déroulante.

● Servez-vous de l’argument UserInterfaceOnly de la méthode Protect pourprotéger une feuille de calcul tout en accordant à vos macros de privilègesspéciaux.

● Servez-vous de procédures de gestionnaire d’événement pour permettreaux contrôles ActiveX de modifier les cellules protégées.

Page 336: Excel 2007 VBA

Créer un formulaire utilisateur personnalisé,

page 318Contrôle de l’ordre de

tabulation sur un formulaire utilisateur,

page 330

Créer des procédures pour masquer des lignes et colonnes sélectionnées, page 335

Emploi d’une étiquette comme

bouton configurable, page 345

Trouver le premier jour du mois courant, page 325

Emploi de l’Explorateur de projets pour gérer un projet, page 339

Créer des affichages personnalisés pour afficher des lignes sélectionnées, page 322

Coup d’œil sur le chapitre

Page 337: Excel 2007 VBA

317

11 Création d’un formulaire personnalisé

Ce chapitre aborde les points suivants :✔ Création d’un formulaire personnalisé ;✔ Initialisation d’un formulaire ;✔ Vérification des valeurs d’entrées invalides dans une zone de texte ;✔ Exécution de macros depuis un formulaire.

Prenez un morceau de contreplaqué de 90 par 120 centimètres et quelques potsde peinture bleue, jaune et orange. Versez, arrosez, éclaboussez et mélangez lapeinture sur le bois. Vous obtenez un joli gâchis. Placez toutefois un encadrementà 500 € autour du contreplaqué : vous possédez maintenant une œuvre d’art !Même une œuvre réelle ne paraît pas sérieuse sans un bon encadrement. Mêmela plus belle des broches en diamants a l’air quelconque offerte enveloppée dansdu papier d’emballage.

De la même façon, vous pouvez écrire des macros utiles, pratiques et efficaces.Sans cadre autour d’elles (en les peaufinant, en les rendant d’emploi facile et en lesempaquetant), vous ne disposez pas d’une application réellement intéressante.Une des meilleures façons de faciliter l’emploi d’une macro fonctionnelle consisteà créer une boîte de dialogue personnalisée, ou formulaire utilisateur.

Vous allez apprendre dans ce chapitre à créer l’interface utilisateur d’un formu-laire utilisateur, à créer la fonctionnalité de ce formulaire et à la mettre en œuvreen liant les deux en un outil intégré.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez pour plus d’informations à lasection « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 338: Excel 2007 VBA

318 Chapitre 11 Création d’un formulaire personnalisé

Création de l’interface utilisateur d’un formulaire

La feuille de calcul Budget du classeur Chapitre11 montre le budget prévisionneldétaillé pour l’année 2007. Elle possède des lignes de détail et de synthèse.

Supposez que vous deviez imprimer différentes versions de ce budget. La direc-tion veut une version qui ne présente que les lignes de synthèse. Le responsablede la saisie des données souhaite une version qui ne comprenne que les lignes dedétail, sans les totaux. Le contrôleur de gestion veut à la fois les lignes de détail etde synthèse, mais pas les mois révolus.

Pour faciliter l’impression des différentes versions du rapport, vous pouvez créerun formulaire utilisateur. Voici la stratégie globale de création du formulaire :

● Conception du formulaire. L’aspect du formulaire est la première choseque perçoit l’utilisateur. Il doit lui suggérer comment se servir du formulaire.L’aspect du formulaire et la façon dont il réagit porte le nom d’interface uti-lisateur. La façon la plus simple de concevoir un formulaire en VBA (Micro-soft Visual Basic for Applications) consiste simplement à s’y essayer.

● Création des macros qui font fonctionner le formulaire. Il s’agit des pro-cédures qui interagissent avec les objets Microsoft Office Excel. Les tâchesqu’effectue le formulaire constituent ses fonctionnalités. L’ajout de fonction-nalités peut impliquer de modifier la feuille de calcul pour que les macrosfonctionnent.

SERVEZ-VOUS du classeur Budget.xlsx, situé dans le dossier Docu-ments\MSP\ExcelVBA07SBS.VEILLEZ À enregistrer une copie prenant en charge les macros de Budget.xlsx sousle nom Chapitre11.xlsm dans le dossier approuvé créé au Chapitre 1. OUVREZ le classeur Chapitre11.xlsm.

Page 339: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 319

● Faire exécuter les macros par le formulaire et fournir un moyen d’affi-cher celui-ci. L’intégration de l’interface utilisateur avec les fonctionnalitésdu formulaire constitue l’étape finale, nommée mise en œuvre ou implé-mentation.

Création du formulaireLe processus de conception de l'interface utilisateur peut vous aider à identifierles fonctionnalités que vous devez développer.

1. Le classeur Chapitre11 étant ouvert, effectuez un clic droit sur l’onglet de lafeuille de calcul Budget, et cliquez sur Visualiser le code pour ouvrir l’édi-teur Visual Basic.

2. Dans le menu Insertion, cliquez sur UserForm pour créer un nouveau for-mulaire utilisateur vide.

Celui-ci est stocké dans votre projet, exactement comme un module. Vouspouvez l’exécuter depuis VBA comme vous exécutez une macro.

3. Cliquez sur le bouton Exécuter Sub/UserForm pour afficher le formulaire,puis cliquez sur le bouton Fermer pour le fermer.

Astuce Si vous voulez créer une interface utilisateur plus sophistiquée pour uneapplication Excel, vous pouvez vous servir de Microsoft Visual Studio 2005 com-biné avec VSTO (Visual Studio Tools for Office) pour créer une application en codegéré (Microsoft .NET) capable de contrôler le modèle objet d’Excel.

Exécuter Sub/UserForm

Page 340: Excel 2007 VBA

320 Chapitre 11 Création d’un formulaire personnalisé

Par défaut, le titre du formulaire est UserForm1. Si vous créez un second for-mulaire, il possédera comme titre UserForm2, et ainsi de suite, de la mêmefaçon que lorsque Excel crée le nouveau nom par défaut d’une feuille de cal-cul. Ce libellé est une propriété : vous pourrez le modifier depuis la fenêtrePropriétés.

4. Cliquez sur le bouton Fenêtre Propriétés et modifiez la valeur de la pro-priété Caption en Options d’impression.

Le libellé du formulaire se modifie tandis que vous modifiez la valeur dans lafenêtre Propriétés.

5. Modifiez la valeur de la propriété (Name) en frmImprimer.

La propriété Name est entourée de parenthèses de façon à apparaître enhaut de la liste. Le préfixe frm est l’abréviation de formulaire. La partie Impri-mer du nom donne le but du formulaire. Si vous devez faire référence à ceformulaire dans une procédure, vous pourrez employer ce nom explicite.

C’est tout ce qu’il faut pour créer un formulaire utilisateur ! Celui-ci ne sert toute-fois pas à grand chose tant que vous n’y avez rien placé.

Fenêtre Propriétés

Page 341: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 321

Ajout de boutons d’optionL’objectif de la création de ce formulaire est de permettre à un utilisateur de choi-sir parmi une des trois présentations lors de l’impression du rapport : toutes leslignes, uniquement les lignes de synthèse ou uniquement les lignes de détail. Lesboutons d’option permettent de sélectionner un unique élément dans une courteliste prédéfinie. Les boutons d’options sont généralement regroupés dans uncadre.

Lorsque VBA a affiché le formulaire utilisateur, il a automatiquement affiché laBoîte à outils pour les formulaires. Celle-ci contient les mêmes contrôles que ceuxde la collection des contrôles ActiveX de l’onglet Développeur du ruban Excel.Vous pouvez vous servir de la Boîte à outils pour ajouter des contrôles ActiveX àun formulaire.

Voir aussi Pour plus d’informations sur l’insertion de contrôles ActiveX sur une feuille decalcul, reportez-vous à la section « Création d’un calculateur de remboursement d’empruntrésistant aux erreurs » du Chapitre 10, « Emploi de contrôles de boîte de dialogue sur unefeuille de calcul. »

1. Activez la fenêtre Objet. Si vous ne voyez pas la Boîte à outils, cliquez sur lebouton Boîte à outils de la barre d’outil Standard pour l’afficher.

2. Dans la Boîte à outils, cliquez sur le bouton Cadre, puis cliquez près du coinsupérieur gauche du formulaire.

Un grand contrôle cadre apparaît sur le formulaire. Vous pourrez déplacerou modifier la taille du cadre par la suite.

La tâche suivante consiste à ajouter les boutons d’option. Vous pouvez éviterd’avoir à cliquer sur le bouton de contrôle de la Boîte à outils à chaque ajoutd’un bouton en effectuant un double-clic sur le bouton de contrôle. Ce dou-ble-clic active le bouton, jusqu’à ce que vous cliquiez à nouveau dessus.

3. Double-cliquez sur le bouton OptionButton, cliquez à trois emplacementsdu formulaire pour créer trois boutons, puis cliquez à nouveau sur le boutonOptionButton pour le désactiver.

Vous n’avez pas besoin de placer les boutons avec précision.

Boîte à outils

Cadre

OptionButton

Page 342: Excel 2007 VBA

322 Chapitre 11 Création d’un formulaire personnalisé

4. Activez la fenêtre Propriétés et sélectionnez Frame1 depuis la liste du haut.

5. Saisissez Lignes comme valeur de la propriété Caption et grpLignescomme valeur de la propriété Name.

Le préfixe grp est l’abréviation de groupe, l’ancien nom pour un cadre.

6. Dans la liste située en haut de la fenêtre, sélectionnez OptionButton1.

7. Saisissez Tout comme valeur de la propriété Caption et optTout commevaleur de la propriété Name.

8. Le contrôle optTout étant encore sélectionné, saisissez True comme valeurde la propriété Value.

Fixer la propriété Value à True en fait l’option par défaut.

9. Attribuez au deuxième bouton d’option le libellé Synthèse et le nom opt-Synthèse.

10. Attribuez au troisième bouton d’option le libellé Détail et le nom optDétail.

11. Sélectionnez les trois boutons d’option entre le bouton d’option du bas et lebas du cadre puis en glissant déposant un rectangle qui encadre les troisboutons d’option et leurs libellés.

Le menu Format propose de puissants outils pour aligner correctement lescontrôles sur un formulaire.

12. Dans le menu Format de l’éditeur Visual Basic, pointez vers Espacementvertical, puis cliquez sur Supprimer.

13. Dans le menu Format, pointez vers Aligner, puis cliquez sur Gauche.

14. Dans le menu Format, cliquez sur Ajuster à la taille.

15. Glissez déposez enfin le groupe de contrôles dans le coin supérieur gauchedu cadre et modifiez la taille de celui-ci pour qu’il encadre correctement lestrois boutons d’option.

Page 343: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 323

16. Enregistrez le classeur, appuyez sur F5 pour voir l’aspect des boutonsd’option (en cliquant sur ceux-ci) puis fermez la fenêtre Options d’impres-sion.

Un cadre avec un groupe de boutons d’option est une bonne interface utilisateurpour sélectionner une unique option dans une liste prédéfinie.

Ajout d’une case à cocher avec une zone de texte associéeVotre formulaire a besoin d’un moyen de préciser s’il faut imprimer tous les moisou uniquement les mois à venir. C’est fondamentalement un choix « oui ou non ».Le meilleur contrôle pour un tel choix « oui ou non » est une case à cocher. Lors-que la case à cocher est sélectionnée, la macro lance l’impression à partir du moisen cours.

Même si le contrôleur de gestion dit que le rapport doit débuter avec le mois encours, vous savez que des exceptions se produiront inévitablement. De ce fait,outre la case à cocher, vous voudrez ajouter une zone de texte qui permet de spé-cifier un autre mois de départ – juste au cas où….

1. La fenêtre du formulaire étant encore visible, cliquez sur le bouton Check-Box de la Boîte à outils, puis cliquez sur le formulaire sous le cadre, là oùvous voulez voir apparaître la case à cocher.CheckBox

Page 344: Excel 2007 VBA

324 Chapitre 11 Création d’un formulaire personnalisé

2. Dans la fenêtre Propriétés, modifiez le libellé de la case à cocher en Com-mencer au mois de et modifiez le nom en chkMois.

3. Double-cliquez sur la poignée droite du rectangle de sélection de la case àcocher pour que la taille du rectangle s’ajuste à celle du libellé.

Vous allez ajouter la zone de texte pour le mois immédiatement après lelibellé de la case à cocher, de façon à ce que son contenu semble compléterle libellé Commencer au mois de.

E 4. Cliquez sur le bouton TextBox de la Boîte à outils, puis cliquez à droite dulibellé de la case à cocher.

5. Modifiez le nom de la zone de texte en txtMois, fixez la propriété Value à7/1/2007, puis modifiez la propriété Enabled en False.

Vous n’avez pas à modifier la valeur du mois si la case à cocher est décochée.Fixer la propriété Enabled à False fait apparaître en gris le contenu de lazone de texte. Vous voulez que la zone de texte devienne active lorsquel’utilisateur sélectionne la case à cocher. C’est un travail pour un événement.

TextBox

Page 345: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 325

6. Double-cliquez sur le contrôle de case à cocher chkMois.

Une nouvelle fenêtre intitulée frmImprimer (Code) apparaît. Elle contientune nouvelle procédure de gestionnaire d’événement, chkMois_Click. L’évé-nement Click est l’événement par défaut d’une case à cocher.

7. Insérez l’instruction suivante comme corps de la nouvelle procédurechkMois_Click :

txtMois.Enabled = chkMois.Value

Cette instruction active la zone de texte lorsque la case à cocher est sélec-tionnée et la désactive si elle est décochée.

8. Enregistrez le classeur, appuyez sur F5 pour exécuter le formulaire, puis cli-quez à quelques reprises sur la case à cocher pour confirmer que l’activationde la zone de texte correspond toujours à la sélection de la case à cocher.

Lorsque la case à cocher est décochée, vous ne pouvez pas modifier la date.Lorsqu’elle est cochée, vous le pouvez.

9. Fermez le formulaire.

L’ajout d’un événement au contrôle de case à cocher fait mieux fonctionnerl’interface utilisateur, mais ne change pas grand chose dans Excel. Même si l’évé-nement est du code VBA, il appartient toujours à l’interface utilisateur du formu-laire et non à ses fonctionnalités.

Dépannage Si la zone de texte ne s’active pas, vérifiez que vous avez bien ajoutéle gestionnaire d’événement à la case à cocher et non à la zone de texte.

Page 346: Excel 2007 VBA

326 Chapitre 11 Création d’un formulaire personnalisé

Initialisation de la zone de texteLorsque vous avez créé la zone de texte mois, vous avez affecté 7/1/2007 commedate par défaut. Comme vous souhaiterez y voir dans la plupart des cas le moisactuel, vous pouvez faciliter l’emploi du formulaire en initialisant la zone de texteavec le mois actuel. Pour ce faire, vous devez calculer la date adéquate pour lazone de texte au moment de l’affichage du formulaire.

1. Double-cliquez sur l’arrière-plan du formulaire.

Une nouvelle procédure nommée UserForm_Click apparaît.

Le nom d’un objet formulaire est toujours UserForm. Peu importe le nomque vous lui avez attribué, les procédures de gestionnaires d’événement seservent toujours du nom UserForm. L’événement par défaut d’un formulaireest Click, mais comme vous ne voulez pas attendre que l’utilisateur cliquesur le formulaire pour initialiser le mois, il vous faut un événement différent.

2. Dans la liste Procédures, sélectionnez l’événement Initialize. Après l’appa-rition de la procédure UserForm_Initialize, supprimez la procédureUserForm_Click.

3. Entrez l’instruction suivante comme corps de la procédure :

txtMois.Value = Date

Date est une fonction intégrée de Visual Basic qui renvoie la date actuelle,fondée sur l’horloge interne de l’ordinateur.

4. Appuyez sur F5 pour exécuter le formulaire.

La date à pour but d’identifier le mois à partir duquel doit débuter le rap-port. Vous allez créer une macro qui recherche la première ligne de la feuillede calcul pour identifier une date qui correspond à celle de la zone de texte.

Page 347: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 327

Les dates de la ligne supérieure de la feuille de calcul concernent toutes lepremier jour du mois. Pour trouver une correspondance, la date de la zonede texte doit donc aussi être le premier jour du mois. La date placée par lamacro dans la zone de texte est toutefois la date actuelle. Comme il est hau-tement improbable que cette date soit le premier du mois, vous devez dis-poser d’un moyen de convertir la date actuelle en le premier jour du moisactuel.

5. Fermez le formulaire, puis double-cliquez sur l’arrière-plan pour revenir à laprocédure UserForm_Initialize.

Vous allez maintenant créer une fonction personnalisée qui va convertirn’importe quelle date en le premier jour du mois.

6. Sous la procédure UserForm_Initialize, ajoutez cette fonctionpersonnalisée :

Function DebutDuMois(InputDate) If IsDate(InputDate) Then DebutDuMois = DateSerial _ (Year(InputDate), Month(InputDate), 1) Else DebutDuMois = Empty End IfEnd Function

Cette fonction accepte comme argument une entrée date. Elle vérified’abord que l’entrée est bien une date ou peut être convertie en une date. Sitel est le cas, la fonction extrait l’année et le mois de l’entrée date et se sertde la fonction DateSerial pour créer une nouvelle date. Vous fournissez à lafonction DateSerial une année, un mois et un jour et celle-ci vous renvoie ladate adéquate. La fonction DebutDuMois ignore la partie jour de l’entréedate et emploie à la place toujours 1 comme jour. Si pour une raison quel-conque l’entrée ne peut pas être interprétée comme date, la fonction ren-voie la valeur spéciale Empty. La valeur Empty est la valeur employéelorsqu’une variable n’a jamais été initialisée. La fonction Visual Basic Date dela procédure UserForm_Initialize renvoie toujours une date valide : si vousn’appelez la fonction DebutDuMois que depuis la procédureUserForm_Initialize, elle n’a pas besoin de gérer une date invalide. Lorsquetoutefois vous écrivez une fonction personnalisée, mieux vaut faire en sortequ’elle puisse fonctionner dans de nombreuses situations. Renvoyer unevaleur Empty lorsque l’argument est une date invalide est une des façons derendre plus souple votre fonction.

Page 348: Excel 2007 VBA

328 Chapitre 11 Création d’un formulaire personnalisé

7. Modifiez l’instruction de la procédure UserForm_Initialize en txt-Mois.Value = DebutDuMois(Date).

8. Appuyez sur F5 pour exécuter la boîte de dialogue, vérifiez la date dans lazone mois, puis fermez le formulaire.

La date devrait être le premier jour du mois actuel.

Les contrôles doivent souvent être initialisés. Certains, comme les boutonsd’option, peuvent l’être lors de la création du formulaire. Pour d’autres, comme lazone de texte mois, cela doit être accompli à l’exécution du formulaire : le ges-tionnaire d’événement Initialize est l’endroit où initialiser les contrôles lorsquevous exécutez le formulaire.

Ajout de boutons de commandeVotre formulaire permet de spécifier l’aspect que doivent posséder les lignes etcolonnes du rapport. Il faut encore un moyen de lancer l’impression. Pour ce faire,vous ajoutez un bouton de commande. En théorie, un bouton Annuler estsuperflu : vous pouvez cliquer sur le bouton Fermer de sa fenêtre pour fermer leformulaire. Un bouton Annuler est toutefois plus facile à comprendre et àemployer, et tel est le but d’une bonne interface utilisateur.

1. Activez la fenêtre Objet.

2. Cliquez sur le bouton CommandButton de la Boîte à outils, puis cliquez àdroite du cadre Lignes du formulaire.

3. Appuyez sur la touche CTRL et maintenez-la enfoncée, puis glissez déposezle nouveau bouton pour en faire une copie. Cliquer sur le bouton du haut

Astuce Si vous voulez tester une fonction d’un formulaire, vous pouvez le fairedepuis la fenêtre Exécution. Comme la fonction appartient au code d’un objet for-mulaire, vous devez placer le nom de l’objet formulaire avant le nom de la fonc-tion. Par exemple, vous pouvez tester la fonction DebutDuMois dans la fenêtreExécution en saisissant l’instruction suivante : ?frmImprimer.DebutDuMois("May 23,2007").

CommandButton

Page 349: Excel 2007 VBA

Création de l’interface utilisateur d’un formulaire 329

imprimera le rapport, mais pas cliquer sur celui du bas. Un clic sur n’importequel bouton ferme le formulaire.

4. Modifiez le libellé du bouton supérieur en Imprimer, modifiez le nom enbtnImprimer et modifiez la propriété Default en True.

Un seul bouton de commande d’un formulaire peut être le bouton pardéfaut. Un bouton par défaut est celui qui est « cliqué » lorsque vousappuyez sur la touche ENTRÉE.

5. Modifiez le libellé du bouton du bas en Annuler, modifiez son nom enbtnAnnuler et modifiez la propriété Cancel en True.

Un seul bouton de commande d’un formulaire peut être un bouton d’annu-lation. Un bouton Annuler est celui qui est « cliqué » lorsque vous appuyezsur la touche ECHAP. En principe, lorsque vous cliquez sur un bouton Annu-ler, vous vous attendez à ce que le formulaire se ferme. En lui-même, unbouton Annuler ne ferme toutefois pas le formulaire. Vous devez d’abord ledoter d’un gestionnaire d’événement.

6. Double-cliquez sur le bouton Annuler pour créer un gestionnaire d’événe-ment nommé btnAnnuler_Click et saisissez l’instruction Unload Mecomme corps de la procédure.

La commande Unload supprime un formulaire de la mémoire. Le mot cléMe fait référence au formulaire actif. L’instruction de macro Unload Me sup-prime donc de la mémoire le formulaire qui contient le contrôle dont le ges-tionnaire d’événement est en cours d’exécution.

Page 350: Excel 2007 VBA

330 Chapitre 11 Création d’un formulaire personnalisé

7. Sélectionnez btnImprimer dans la liste Objets située en haut de la fenêtrecode pour créer une nouvelle procédure nommée btnImprimer_Click, puisentrez les deux instructions suivantes comme corps de la procédure :

Unload MeMsgBox "Impression"

La première instruction supprime le formulaire, la seconde est une placeréservée jusqu’à l’ajout de la fonctionnalité d’impression du rapport.

8. Enregistrez le classeur, puis exécutez plusieurs fois le formulaire. Essayez decliquer sur les boutons Annuler et Imprimer. Essayez également d’appuyersur les touches ECHAP et ENTRÉE.

Un appui sur ENTRÉE ou un clic sur le bouton Imprimer devrait afficher lemessage Impression. Un appui sur la touche ECHAP ou un clic sur le boutonAnnuler devrait faire disparaître le formulaire.

Définition de l’ordre de tabulation de contrôlesCertaines personnes préfèrent employer la touche Tab du clavier plutôt que lasouris pour déplacer le focus de contrôle en contrôle. Vous devez donc vous assu-rer de la logique de l’ordre de tabulation.

1. Exécutez encore une fois le formulaire. Sélectionnez la case à cocher Com-mencer au mois de pour activer la zone de texte. Appuyez sur la touche TAB

à plusieurs reprises. Observez le petit rectangle gris passer de contrôle encontrôle. Ce rectangle gris identifie le contrôle qui possède le focus.

2. Cliquez sur Annuler pour fermer le formulaire.

Pour ce formulaire, l’ordre de tabulation devrait être optTout, optSynthèse,optDétail, chkMois, txtMois, btnImprimer et btnAnnuler. Si ce n’est pasl’ordre de tabulation de vos contrôles, l’éditeur Visual Basic propose unmoyen simple de modifier cet ordre de tabulation.

3. Cliquez sur l’arrière-plan du formulaire. Dans le menu Affichage, cliquez surOrdre de tabulation.

La boîte de dialogue Ordre de tabulation affiche cinq contrôles : grpLignes,chkMois, txtMois, btnImprimer et btnAnnuler. Elle traite le contrôle de cadregrpLignes (et les contrôles qu’il contient) comme un unique élément. Si un

Page 351: Excel 2007 VBA

Préparation de la fonctionnalité d’un formulaire 331

contrôle n’est pas à sa place dans la séquence, sélectionnez-le et cliquez surles boutons Monter ou Descendre pour le placer à l’emplacement adéquat.

4. Après avoir procédé à tous les ajustements nécessaires, cliquez sur OK pourfermer la boîte de dialogue.

En présence de contrôles imbriqués, comme les boutons d’option situés àl’intérieur du cadre, vous devez définir séparément l’ordre de tabulation descontrôles imbriqués.

5. Sélectionnez le cadre (ou un quelconque des boutons d’option), puis, sur lemenu Affichage menu, cliquez à nouveau sur Ordre de tabulation.

La boîte de dialogue Ordre de tabulation n’affiche cette fois que les contrô-les du cadre.

6. Si les contrôles ne sont pas dans l’ordre optTout, optSynthèse et optDétail,procédez aux ajustements nécessaires puis cliquez sur OK pour fermer laboîte de dialogue.

7. Enregistrez le classeur.

Il est facile de définir l’ordre de tabulation. Souvenez-vous toutefois que vousdevez définir séparément l’ordre des contrôles de chaque cadre.

Préparation de la fonctionnalité d’un formulaireLe formulaire présente désormais bien. L’étape suivante consiste à construire lafonctionnalité d’impression du rapport. Vous devez disposer d’un moyen de bas-

Page 352: Excel 2007 VBA

332 Chapitre 11 Création d’un formulaire personnalisé

culer entre les différentes vues de lignes, ainsi que d’un moyen de masquer lescolonnes superflues. Excel peut stocker différents affichages personnalisés d’unefeuille de calcul. Vous pouvez ensuite les afficher selon les besoins. En construi-sant quelques vues dans la feuille de calcul, créer une macro pour basculer entrecelles-ci sera facile.

Création d’affichages personnalisés d’une feuille de calculUn affichage personnalisé, parfois nommé vue, permet de masquer des lignes et/ou colonnes d’une feuille de calcul, puis d’attribuer un nom à cet affichage pourpouvoir le retrouver facilement. Vous devez créer trois affichages. Le premier affi-che toutes les lignes et colonnes. Il est facile à créer. Le suivant n’affiche que leslignes de totaux, tandis que le troisième ne présente que les lignes de détail. Mas-quer des lignes peut être un processus fastidieux. Heureusement, vous n’avez à lefaire qu’une fois et pouvez recourir à la commande Sélectionner les cellulesd’Excel pour accélérer la sélection des lignes.

1. Activez Excel. Sur l’onglet Affichage du ruban, cliquez sur Affichages per-sonnalisés.

2. Dans la boîte de dialogue Affichages personnalisés, cliquez sur le boutonAjouter, saisissez Tout comme nom du nouvel affichage, décochez l’optionParamètres d’impression et laissez la case à cocher Paramètres masquésdes lignes, colonnes et filtres sélectionnée, puis cliquez sur OK.

Vous venez de créer le premier affichage : celui qui affiche toutes les ligneset colonnes. Vous devez maintenant créer l’affichage Synthèse, qui n’afficheque les lignes de totaux. Cela signifie que vous devez masquer les lignes dedétail, les seules lignes qui possèdent un libellé dans la colonne B.

3. Sélectionnez la colonne B. Sur l’onglet Accueil du ruban, cliquez sur la flè-che Rechercher et sélectionner, puis cliquez sur Sélectionner les cellules.

4. Sélectionnez l’option Constantes puis cliquez sur OK. Seules les cellules deslignes de détail sont encore sélectionnées.

Affichages personnalisés

Page 353: Excel 2007 VBA

Préparation de la fonctionnalité d’un formulaire 333

5. Sur l’onglet Accueil du ruban, cliquez sur la flèche Format, pointez versMasquer et afficher, puis cliquez sur Masquer les lignes pour masquer leslignes sélectionnées.

Les autres lignes qu’il convient de masquer possèdent toutes des cellulesvierges dans la colonne D. Cela ne vous donne-t-il pas une idée ?

6. Sélectionnez la colonne D. Cliquez sur la flèche Rechercher et sélectionner,puis cliquez sur Sélectionner les cellules.

7. Sélectionnez l’option Cellules vides puis cliquez sur OK. Masquez ensuiteles lignes sélectionnées comme vous l’avez fait à l’étape 5.

C’est l’affichage pour la direction.

8. Pour créer un autre affichage qui n’affiche que les lignes de totaux, surl’onglet Affichage du ruban cliquez sur Affichages personnalisés, cliquezsur Ajouter, saisissez Synthèse, décochez Paramètres d’impression puiscliquez sur OK.

Vous devez maintenant créer l’affichage de détail, qui masque toutes leslignes de totaux. Les lignes à masquer possèdent une étiquette dans la plageA4:A54.

Page 354: Excel 2007 VBA

334 Chapitre 11 Création d’un formulaire personnalisé

9. Sur l’onglet Affichage, cliquez sur Affichages personnalisés. SélectionnezTout puis cliquez sur Afficher pour afficher toutes les lignes.

10. Sélectionnez la plage A4:A54, servez-vous de Sélectionner les cellulespour sélectionner les cellules qui possèdent des constantes, puis masquezces lignes.

11. Sélectionnez la colonne D et masquez toutes les lignes qui possèdent descellules vierges.

12. Seules les lignes de détail étant visibles, créez un nouvel affichage nomméDétail, en décochant une fois encore l’option Paramètres d’impression.

13. Enregistrez le classeur, et essayez d’afficher chacun des trois affichages. Ter-minez par Tout.

Créer les affichages est pénible, mais vous n’avez à le faire qu’une fois.

Création d’une macro pour basculer entre les affichagesUne fois les affichages créés, rédiger une macro pour basculer entre ceux-ci estfacile.

1. Commencez à enregistrer une macro nommée AfficheVue.

2. Affichez la vue Synthèse, arrêtez l’enregistreur puis examinez la macro. Àl'exclusion des commentaires, elle devrait ressembler à ceci :

Sub AfficheVue() ActiveWorkbook.CustomViews("Synthèse").ShowEnd Sub

Un objet Workbook possède une collection nommée CustomViews. Vousemployez le nom de l’affichage pour récupérer un élément CustomView dela collection. Un objet CustomView possède une méthode Show. Pour bas-culer entre les affichages, il suffit de modifier le nom de l’affichage placéentre parenthèses. Plutôt que de créer trois macros différentes, vous pouveztransmettre le nom de l’affichage comme argument.

3. Saisissez NomAffichage entre les parenthèses après AfficheVue, puis rem-placez "Synthèse" (y compris les guillemets) par NomAffichage.

La macro modifiée ressemble maintenant à ceci :

Page 355: Excel 2007 VBA

Préparation de la fonctionnalité d’un formulaire 335

Sub AfficheVue(NomAffichage) ActiveWorkbook.CustomViews(NomAffichage).ShowEnd Sub

Testez la macro et son argument depuis la fenêtre Exécution.

4. Appuyez sur CTRL+G pour afficher la fenêtre Exécution.

Assurez-vous que la fenêtre Excel reste visible à l’arrière-plan.

5. Dans la fenêtre Exécution, saisissez AfficheVue "Détail" et appuyez surENTRÉE.

La feuille de calcul devrait se modifier et afficher la vue détaillée.

6. Saisissez AfficheVue "All" et appuyez sur ENTRÉE.

7. Saisissez AfficheVue "Synthèse" et appuyez à nouveau sur ENTRÉE.

La macro fonctionne avec les trois arguments.

8. Fermez la fenêtre Exécution, puis enregistrez le classeur.

Vous disposez désormais de la fonctionnalité d’affichage des trois affichages. Lacréation des affichages n'était pas très amusante, mais facilite grandement l’écri-ture de la macro. En outre, si vous décidez de modifier un affichage (par exempleen ajoutant des lignes vierges), vous n’avez pas à modifier la macro. Toute modi-fication apportée à l’affichage ajuste automatiquement le mode de fonctionne-ment de la macro.

Masquage dynamique de colonnesVous devez maintenant créer la fonctionnalité de masquage des colonnes quirenferment des dates antérieures à celle du mois de départ souhaité. Vous nevoulez pas créer pour ce faire des affichages personnalisés, car il faudrait en créer36 : un pour chacun des douze mois multiplié par les trois différents paramètresde lignes. Mieux vaut modifier dynamiquement les colonnes d’après les choixeffectués dans la boîte de dialogue. Si l’utilisateur choisit de masquer des colon-nes, vous allez masquer les colonnes depuis C jusqu’au mois qui contient le moisspécifié. Une bonne façon de trouver le mois consiste à employer la méthodeFind d’Excel.

1. Dans Excel, sélectionnez toute la ligne 1, puis commencez l’enregistrementd’une nouvelle macro nommée MasquerMois.

2. Sur l’onglet Accueil du ruban, cliquez sur Rechercher et sélectionner, cli-quez sur Rechercher, puis cliquez sur le bouton Options pour développerla boîte de dialogue.

Page 356: Excel 2007 VBA

336 Chapitre 11 Création d’un formulaire personnalisé

3. Saisissez 01/05/2007 dans la zone Rechercher, cochez l’option Totalité ducontenu de la cellule et vérifiez que la zone de liste Regardez dans indi-que Formules.

Lorsque vous recherchez dans une formule, vous regardez la date sousjacente de la cellule. Cette date sous-jacente emploie le format de date sys-tème, quelle que soit la façon dont la cellule est mise en forme.

4. Cliquez sur Suivant, fermez la boîte de dialogue Rechercher, arrêtez l’enre-gistreur puis affichez la macro MasquerMois. Placez une suite de ligne (unespace, un trait de soulignement et une nouvelle ligne) après chaque virgulepour rendre l’instruction plus lisible.

À l'exclusion des commentaires, la macro devrait se présenter comme suit :

Sub MasquerMois() Selection.Find(What:="01/05/2007", _ After:=ActiveCell, _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=False).ActivateEnd Sub

La macro recherche dans la sélection (ici la ligne 1) à partir de la celluleactive (ici, la cellule A1) la date spécifiée et active la cellule correspondante.Vous ne voulez pas que la macro modifie la sélection, ni qu’elle active la cel-lule identifiée. Elle doit plutôt affecter la cellule identifiée à une variableplage pour pouvoir y faire référence par la suite.

5. Modifiez comme suit la macro : déclarez la variable myFind comme Range,modifiez Selection en Rows(1) et ActiveCell en Cells(1), ajoutez SetmyFind = au début de l’instruction Find puis supprimez à la fin .Activate.

Dépannage Si votre système emploie un format de date autre que jj/mm/aaaa(le format de date européen par défaut), vous devrez procéder à quelques expé-riences pour trouver le format de date qui vous est adapté.

Page 357: Excel 2007 VBA

Préparation de la fonctionnalité d’un formulaire 337

La macro modifiée doit ressembler à ceci :

Sub MasquerMois() Dim myFind as Range Set myFind = Rows(1).Find(What:="5/1/2007", _ After:=Cells(1), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=False)End Sub

Si la méthode Find réussit, myFind contient une référence vers la cellule quicontient le mois. Vous voulez masquer toutes les colonnes depuis la colonneC (la colonne Rates) jusqu’à une colonne à gauche de myFind.

6. Avant l’instruction End Sub, insérez l’instruction suivante :

Range("C1",myFind.Offset(0,-1)).EntireColumn.Hidden = True

Cela sélectionne une plage qui débute à la cellule C1 et finit une cellule àgauche de la cellule avec le nom du mois. L’instruction masque ensuite lescolonnes qui contiennent cette plage.

7. Enregistrez le classeur et appuyez plusieurs fois sur F8 pour parcourir enmode pas à pas la macro. Observez la disparition des colonnes C à H.

Vous allez modifier cette sous-routine pour pouvoir masquer des colonnesjusqu’à n’importe quelle date. Vous devez disposer d’un moyen de savoir sila méthode Find a trouvé ou non une correspondance. Si la méthode Findtrouve une correspondance, elle affecte une référence à la variable. Dans lecas contraire, elle lui affecte la référence à l’objet spécial Nothing. Vousdevez regarder si l’objet référencé est Nothing. Comme vous comparez desréférences à des objets et non des valeurs, vous n’employez pas un signeégal pour effectuer la comparaison, mais le mot spécial de comparaisond’objets, Is.

8. Ajoutez les instructions If et End If autour de l’instruction qui masque lescolonnes, pour obtenir cette structure If :

Important Une variable déclarée comme étant de type variant contient la valeurEmpty lorsque rien d’autre ne lui est affecté. Une variable déclarée comme objetcontient la référence Nothing lorsque aucune autre référence objet ne lui est affec-tée. Empty signifie « pas de valeur », tandis que Nothing signifie « pas de référencevers un objet ». Pour savoir si la variable maValeur contient la valeur Empty, servez-vous de l’expression IsEmpty(maValeur). Pour savoir si la variable monObjet con-tient une référence vers Nothing, servez-vous de l’expression monObjet Is Nothing.

Page 358: Excel 2007 VBA

338 Chapitre 11 Création d’un formulaire personnalisé

If Not myFind Is Nothing Then Range("C1", myFind.Offset(0, -1)) _ .EntireColumn.Hidden = TrueEnd If

Si la méthode Find échoue, elle affecte Nothing à myFind : l’expression con-ditionnelle est False et aucune colonne n’est masquée.

9. Testez la capacité de la macro à gérer une erreur en modifiant la valeurrecherchée par la méthode Find de 01/05/2007 en Chien.

10. Exécutez pas à pas la macro et observez ce qui se passe lorsque vous attei-gnez la structure If. Placez le pointeur de la souris au-dessus de la variablemyFind et vérifiez que sa valeur est Nothing.

Si vous recherchez une date présente dans la ligne 1, myFind va contenirune référence vers la cellule qui contient cette date : la macro va masquerles mois qui la précèdent. Si vous recherchez n’importe quoi d’autre, myFindcontient une référence vers Nothing et la macro ne masque aucunecolonne.

11. Appuyez sur F5 pour terminer la macro.

La dernière étape consiste à convertir la date en un argument, de façon àpouvoir chercher un mois autre que mai.

12. Saisissez MoisDébut entre les parenthèses après MasquerMois, puis rem-placez "5/1/2007" ou "Chien" (y compris les guillemets) par MoisDébut.

La procédure modifiée (et terminée) devrait être la suivante :

Sub MasquerMois(MoisDébut) Dim myFind As Range Set myFind = Rows(1).Find(What:=MoisDébut, _ After:=Cells(1), _ LookIn:=xlFormulas, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=False) If Not myFind Is Nothing Then Range("C1", myFind.Offset(0, -1)) _ .EntireColumn.Hidden _ = True End IfEnd Sub

Page 359: Excel 2007 VBA

Mise en œuvre d’un formulaire 339

13. Testez maintenant la macro. Appuyez sur CTRL+G pour afficher la fenêtreExécution.

14. Entrez AfficheVue "Tout" puis entrez MasquerMois "01/08/2007".

15. Fermez la fenêtre Exécution, puis enregistrez le classeur.

Vous disposez maintenant de macros en mesure de gérer les fonctionnalités duformulaire en masquant les lignes et colonnes adéquates. Il est temps d’assemblerle formulaire et ses fonctionnalités.

Mise en œuvre d’un formulaireVous avez créé une interface utilisateur qui permet de spécifier les lignes et colon-nes à imprimer. Vous avez également créé la fonctionnalité du formulaire. Lesmacros AfficheVue et MasquerMois affichent les lignes et colonnes adéquates.Vous devez maintenant faire en sorte que l’interface utilisateur pilote la fonction-nalité. Vous devez mettre en œuvre le formulaire.

Sur ce formulaire, c’est le bouton Imprimer qui met en forme et imprime le rap-port. Vous allez placer tout le code qui lie le formulaire à la fonctionnalité dans laprocédure btnImprimer_Click.

Mise en œuvre de boutons d’optionPour mettre en œuvre les boutons d’option, vous devez disposer d’un moyen desavoir quel bouton d’option possède une valeur égale à True. Un contrôle cadredispose d’une propriété Controls qui renvoie une collection de tous ses contrôles.Vous pouvez parcourir ces contrôles et déterminer quel est le bouton d’optiondont la valeur est True.

1. Dans l’éditeur Visual Basic, cliquez sur le bouton de barre d’outil Explora-teur de projets, double-cliquez sur le formulaire frmImprimer, puis fermezla fenêtre Projet.Explorateur de

projets

Page 360: Excel 2007 VBA

340 Chapitre 11 Création d’un formulaire personnalisé

Lorsqu’un projet comporte plusieurs composants, la fenêtre Projet est sou-vent la façon la plus simple de parvenir au bon endroit.

2. Double-cliquez sur le bouton Imprimer pour afficher la procédure du ges-tionnaire d’événement btnImprimer_Click.

Voir aussi Pour plus de détails sur l’emploi d’une boucle For Each, reportez-vous à lasection « Parcours d’une collection à l’aide d’une boucle For Each » du Chapitre 7,« Contrôle de Visual Basic ».

3. Insérez ces instructions au début de la procédure, avant l’instruction UnloadMe :

Dim monControle As ControlDim maVueFor Each monControle In grpLignes.Controls If monControle.Value = True Then maVue = monControle.Caption End IfNext monControleAfficheVue maVue

Cette boucle For Each inspecte tour à tour chaque contrôle du cadre,recherchant la valeur True. Vous devez déclarer la variable de boucle commeControl (et non comme OptionButton) car un cadre peut contenir d’autrestypes de contrôles outre des boutons d’option.

La boucle stocke le libellé de l’option sélectionnée dans une variable. Lamacro se sert par la suite de cette variable comme argument pour l’exécu-tion de la macro AfficheVue. Quelle coïncidence : vous avez employé lesmêmes noms pour les affichages personnalisés et les libellés des boutonsd’option !

Astuce Si vous parcourez les contrôles d’un cadre qui contient des contrôlesautres que des boutons d’option, vous devez vérifier si le contrôle est un boutond’option. Vous pouvez employer l’expression conditionnelle TypeName(monCon-trole) = "OptionButton" pour déterminer si le contrôle est un bouton d’option.

Page 361: Excel 2007 VBA

Mise en œuvre d’un formulaire 341

4. Enregistrez le classeur, puis appuyez sur F8 pour exécuter le formulaire.Appuyez à plusieurs reprises sur F8 pour parcourir les procédures d’initiali-sation jusqu’à l’apparition du formulaire.

En appuyant sur F8 pour exécuter le formulaire, vous pouvez parcourir touteprocédure de gestionnaire d’événement déclenchée par les contrôles duformulaire.

5. Dans le formulaire, cliquez sur l’option Synthèse, puis cliquez sur Imprimer.

6. Appuyez plusieurs fois sur F8 pour parcourir la procédurebtnImprimer_Click.

7. Fermez la fenêtre de message comme demandé.

Les boutons d’option sont faciles à mettre en œuvre avec un peu de planification.Dans cet exemple, donner aux affichages personnalisés de la feuille de calcul lesmêmes noms que les libellés des boutons d’option rend ceux ci faciles à mettre enœuvre. Pour ajouter une quatrième option de vue, il vous suffit de définir unenouvelle vue sur la feuille de calcul et d’ajouter un bouton d’option avec le libelléadéquat au formulaire. Vous n’avez aucune procédure à modifier.

Mise en œuvre d’une case à cocherSi la case à cocher est sélectionnée, le gestionnaire d’événement du bouton Impri-mer doit exécuter la macro MasquerMois. La macro MasquerMois ne fait rien sivous lui donnez une date qu’elle ne peut trouver. Vous pouvez profiter de ce faiten affectant à une variable soit la date de la zone mois, soit une valeur invalide.

1. Dans le formulaire, double-cliquez sur le bouton Imprimer pour afficher laprocédure btnImprimer_Click et ajoutez les instructions suivantes aprèsDim maVue.

Dim monMoisIf chkMois.Value = True Then monMois = txtMois.ValueElse monMois = "rien"End If

Ces instructions affectent à la variable monMois soit la valeur de la zone detexte mois, soit une valeur manifestement invalide.

Dépannage Vérifiez que la fenêtre de code du formulaire est active lorsque vousappuyez sur F8. Vous pouvez exécuter le formulaire en appuyant sur F5 alors qu’estactive soit la fenêtre de conception du formulaire ou sa fenêtre de code, mais c’estla fenêtre de code qui doit être active pour employer F8.

Page 362: Excel 2007 VBA

342 Chapitre 11 Création d’un formulaire personnalisé

2. Insérez l’instruction MasquerMois monMois après l’instruction Affiche-Vue maVue.

Vous placez cette instruction après l’instruction AfficheVue car vous voulezmodifier l’affichage avant de masquer les mois. Afficher un affichage per-sonnalisé fait réapparaître toutes les colonnes masquées.

3. Enregistrez le classeur, puis appuyez sur F5 pour exécuter le formulaire.

4. Sélectionnez la case à cocher, saisissez 1/9/2007 dans la zone mois, puis cli-quez sur Imprimer. La feuille de calcul n’affiche maintenant que les mois àpartir de septembre.

5. Cliquez sur OK pour fermer la boîte de message.

Contrôle des erreurs dans une zone de texteQue se passe-t-il si vous exécutez le formulaire et saisissez comme date Chien ? Lamacro ne devrait masquer aucune colonne, mais signaler l’erreur. De même, quese passe-t-il si vous saisissez comme date 15/4/2007 ? Dans l’idéal, la macrodevrait convertir 4/15/2007 en le premier jour du mois : 1/4/2007. Pensez à tou-tes les fonctions que vous avez créées au cours de ce projet et regardez si vouspouvez en trouver une capable de convertir une date quelconque en le premierjour du mois.

1. Double-cliquez sur le bouton Imprimer.

2. Dans la procédure btnImprimer_Click, remplacez monMois = txt-Mois.Value par monMois = DebutDuMois(txtMois.Value).

La fonction DebutDuMois convertit une date ne le premier jour du mois. Sila date d’entrée n’est pas une date valide, la fonction renvoie la valeur Empty.Quelle clairvoyance de votre part d’avoir écrit la fonction DebutDuMois defaçon à pouvoir gérer des dates invalides… Lorsque la fonction DebutDu-Mois a terminé son travail, si la variable monMois contient la valeur Empty,vous voudrez afficher un message et faciliter la correction de la valeur.

3. Insérez ces instructions avant l’instruction Else :

If monMois = Empty Then MsgBox "Mois invalide" txtMois.SetFocus txtMois.SelStart = 0 txtMois.SelLength = 1000

Page 363: Excel 2007 VBA

Mise en œuvre d’un formulaire 343

Exit SubEnd If

Lorsque vous exécutez le formulaire, la macro affiche un message d’erreuradapté qui explique le problème si vous saisissez une date invalide. Aprèsavoir fermé la boîte de message, vous devriez être capable de saisir unevaleur corrigée. Pour que cela se produise, vous devez toutefois faire ensorte que la macro se déplace vers la zone de texte et présélectionne le con-tenu actuel invalide.

La méthode SetFocus déplace le focus vers la zone de texte. Fixer la pro-priété SelStart à 0 (zéro) fait débuter la sélection du texte depuis le toutdébut de la zone de texte. Fixer la propriété SelLength à 1000 étend la sélec-tion du texte à tout le texte éventuellement présent dans la zone de texte.Employer une valeur arbitraire très grande comme 1000 évite simplementd’avoir à calculer la longueur actuelle du contenu de la zone de texte.

4. Enregistrez le classeur, puis appuyez sur F5 pour exécuter le formulaire.

5. Activez la zone de texte mois, saisissez Chien et cliquez sur Imprimer.

6. Cliquez sur OK pour fermez la boîte d’erreur.

7. Saisissez 23 juin 07 et cliquez sur Imprimer.

8. Cliquez sur OK pour fermer la boîte de message Impression.

Lorsque vous placez une zone de texte sur un formulaire, vous devez prévoir ceque doit accomplir la macro si l’utilisateur entre une valeur invalide. La meilleurestratégie est très souvent d’afficher un message d’erreur et de présélectionnerl’entrée erronée. La méthode SetFocus et les propriétés SelStart et SelLength sontles outils qui vous permettent de mettre en place cette stratégie.

Impression du rapportLe formulaire Imprimer accomplit désormais tout ce qu’il doit faire – sauf impri-mer. En affichant le rapport en mode aperçu avant impression, vous pouvez déci-der de l'imprimer ou de vous contenter de l’admirer.

1. Double-cliquez sur le bouton Imprimer.

2. Dans la procédure btnImprimer_Click, remplacez MsgBox "Impression"par ActiveSheet.PrintPreview.

Une fois le rapport imprimé, vous devez restaurer les lignes et colonnes dela feuille de calcul.

3. Après l’instruction ActiveSheet.PrintPreview, saisissez l’instruction Affi-cheVue "Tout".

Page 364: Excel 2007 VBA

344 Chapitre 11 Création d’un formulaire personnalisé

La routine du gestionnaire d’événement du bouton Imprimer devrait, unefois achevée, ressembler à ceci :

Private Sub btnImprimer_Click() Dim monControle As Control Dim maVue Dim monMois

If chkMois.Value = True Then monMois = DebutDuMois(txtMois.Value) If monMois = Empty Then MsgBox "Mois invalide" txtMois.SetFocus txtMois.SelStart = 0 txtMois.SelLength = 1000 Exit Sub End If Else monMois = "rien" End If For Each monControle In grpLignes.Controls If monControle.Value = True Then maVue = monControle.Caption End If Next monControle AfficheVue maVue MasquerMois monMois Unload Me ActiveSheet.ImprimerPreview AfficheVue "Tout"End Sub

4. Enregistrez le classeur, appuyez sur F5 pour exécuter le formulaire, sélec-tionnez l’option Synthèse, limitez les mois pour qu’ils débutent à août, cli-quez sur le bouton Imprimer, puis cliquez sur Zoom pour admirer lerapport.

5. Fermez la fenêtre Aperçu avant impression.

Page 365: Excel 2007 VBA

Mise en œuvre d’un formulaire 345

L’interface utilisateur du formulaire est désormais liée à ses fonctionnalités. Il nereste plus qu’à permettre à l’utilisateur d’exécuter le formulaire depuis Excel plutôtque depuis Visual Basic.

Lancement du formulairePour lancer le formulaire, vous pouvez ajouter un bouton à la feuille de calcul. Lecoin supérieur gauche de la feuille de calcul Budget est toujours visible, puisqueles volets sont figés. Vous pouvez donc placer un bouton dans le côté droit de lacellule B1. Plutôt que d’employer un bouton ActiveX, vous pouvez employer uneétiquette ActiveX de façon à rendre son arrière-plan transparent et définir la cou-leur de la police.

1. Dans Excel, activez l’onglet Développeur du ruban, cliquez sur la flècheInsérer, puis cliquez sur Etiquette (Contrôle ActiveX).

2. Glissez déposez un petit rectangle sur la moitié droite de la cellule B1.

3. Cliquez sur le bouton Propriétés du ruban, puis fixez les propriétéssuivantes : modifiez (Name) en lblImprimer, modifiez BackStyle en 0 –fmBackStyleTransparent, modifiez Caption en Imprimer, modifiez Fore-Color en une couleur bleu, modifiez PrintObject en False, puis modifiezTextAlign en 2 – fmTextAlignCenter.

4. Effectuez un clic droit sur l’étiquette, puis cliquez sur Visualiser le code.

5. Dans le gestionnaire d’événement lblImprimer_Click, insérez l’instructionfrmImprimer.Show.

La procédure va ressembler à ceci :

Private Sub lblImprimer_Click() frmImprimer.ShowEnd Sub

La méthode Show d’un formulaire affiche celui-ci. Pour faire référence auformulaire, servez-vous simplement du nom que vous lui avez donné lors desa création.

Etiquette (Contrôle ActiveX)

Astuce Vous ne pouvez en principe pas activer une feuille de calcul pendantqu’un formulaire est affiché. Lorsqu’un formulaire vous empêche de sélectionner lafeuille de calcul, il porte le nom de formulaire modal. Si vous voulez que l’utilisa-teur puisse employer la feuille de calcul pendant que le formulaire est affiché,ajoutez l’argument False après la méthode Show. Cela crée ce qui est appelé unformulaire non modal.

Page 366: Excel 2007 VBA

346 Chapitre 11 Création d’un formulaire personnalisé

6. Repassez dans Excel, désactivez le mode création, enregistrez le classeur,puis cliquez sur l’étiquette Imprimer.

7. À l’apparition de la boîte de dialogue Options d’impression, cliquez surAnnuler.

Créer un formulaire parfaitement utilisable nécessite trois étapes principales :création de l’interface utilisateur, création des fonctionnalités, puis assemblagedes deux en un outil fonctionnel. Après avoir créé ce formulaire, vous pouvez encréer des dizaines pour vos projets !

Astuce Plutôt que de placer un contrôle ActiveX sur la feuille de calcul, vouspourriez également créer une macro ordinaire qui affiche le formulaire et ajoutercette macro à la barre d’Accès rapide pour ce classeur. Certains utilisateurs pour-raient ne pas remarquer l’icône de la barre d’Accès rapide, si bien qu’une étiquetteest préférable lorsqu’un volet est figé et est toujours visible.

FERMEZ le classeur Chapitre11.xlsm.

Page 367: Excel 2007 VBA

Points clés 347

Points clés● Vous pouvez créer une boîte de dialogue personnaliser en employant un

UserForm en Visual Basic. Les contrôles d’un UserForm sont les contrôlesActiveX que vous pouvez placer sur une feuille de calcul.

● Lorsque vous créez une application, concevoir d’abord l’interface aide àidentifier les fonctionnalités dont vous avez besoin.

● Lorsque vous créez une boîte de dialogue, veillez toujours à ce que l’ordrede tabulation des contrôles soit logique pour les utilisateurs qui préfèrent seservir du clavier.

● Réduisez le travail que doit accomplir votre macro en employant des fonc-tionnalités de feuille de calcul, comme les affichages personnalisés.

● Amusez-vous à construire des applications avec Visual Basic depuis Excel !

Page 368: Excel 2007 VBA
Page 369: Excel 2007 VBA

349

Annexe

Un système d’information d’entreprise completDans le Chapitre 5, « Objets de données », vous avez appris à récupérer des don-nées externes dans un rapport de tableau croisé dynamique. Le Chapitre 6,« Objets graphiques » vous a appris à travailler avec des objets graphiques. Dansle Chapitre 7, « Contrôle de Visual Basic », vous avez appris à créer des boucles.Dans le Chapitre 8, « Extension d’Excel et de Visual Basic », vous avez découvertcomment créer des sous-routines. Enfin, le Chapitre 9, « Lancement de macros àl’aide d’événements » expliquait comment employer des contrôles ActiveX et desgestionnaires d’événements. Cette annexe va vous montrer ce qui peut se passersi vous employez Microsoft Office Excel 2007 et VBA (Microsoft Visual Basic forApplications) pour assembler tous ces morceaux.

Vous trouverez dans les fichiers d’accompagnement de ce livre une applicationbonus. C’est un système d’information d’entreprise (EIS, Enterprise InformationSystem) simple. Elle se sert d’une des bases de données de Lucerne Publishingd’une façon simple et visuellement puissante pour afficher les informations sur lescommandes de chaque état du territoire commercial de Lucerne Publishing.

Important Avant de suivre ce chapitre, vous devez avoir installé les fichiersd’exercices à leur emplacement par défaut. Reportez-vous pour plus d’informationsà la section « Emploi des fichiers d’accompagnement » de l’Introduction.

Page 370: Excel 2007 VBA

350 Annexe

Le classeur EIS une fois ouvert, l’application modifie la taille de la fenêtre Excel etaffiche une animation introductive qui vous mène à une carte en couleurs del’Ouest des États-Unis.

1. À la fin de l’animation, cliquez sur l’étiquette Replay du coin inférieur gau-che. Pendant l’exécution de l’animation, cliquez sur le bouton Cancel.

L’animation s’arrête. La procédure qui la contrôlait passe directement à sa finet affiche la carte. Les animations sont parfaites pour attirer l’attention, maispeuvent agacer un utilisateur pressé. Mieux vaut toujours proposer unmécanisme qui permette d’interrompre une animation trop longue.

2. Cliquez dans la carte sur California.

L’écran se modifie et affiche les commandes trimestrielles sur deux ans,accompagnées d’un graphique.

SERVEZ-VOUS du classeur EIS.xlsm, situé dans le dossier Docu-ments\MSP\ExcelVBA07SBS.VEILLEZ A enregistrer une copie prenant en charge les macros de EIS.xlsm dans ledossier approuvé créé au Chapitre 1. OUVREZ le classeur EIS.xlsm.Important Lorsque vous recevez un classeur prenant en charge les macros de quique ce soit, même quelqu’un en qui vous avez confiance, ouvrez toujours d’abordle classeur sans activer les macros. Servez-vous ensuite de l’Explorateur de projetsVisual Basic pour examiner le code, surtout les procédures de gestionnaire d’évé-nement attachées à des feuilles de calcul ou au classeur. Après avoir vérifié l’inno-cuité du code, vous pouvez activer les macros ou placer le classeur dans unemplacement approuvé.

Page 371: Excel 2007 VBA

Un système d’information d’entreprise complet 351

3. Examinez le libellé en haut de l’application.

Le titre dit Lucerne Publishing EIS et non Excel. Il contribue à l’apparence per-sonnalisée de l’application.

4. Examinez le texte affiché dans le coin supérieur gauche de la feuille de cal-cul et repérez le libellé Main. Déplacez votre souris sur ce mot.

La police se modifie pour montrer à l’utilisateur où cliquer. C’est une façonsimple de naviguer dans l’application. Plutôt que de modifier le ruban, ceque vous ne pouvez pas accomplir directement en VBA, vous pouvez ajou-ter une étiquette.

5. Cliquez sur l’étiquette Main pour revenir à la carte.

6. Déplacez la souris sur l’imbrication entre le Nevada et l’Arizona. Placez lasouris au-dessus de la partie Nevada de l’imbrication et cliquez pour affi-cher les données du Nevada. Revenez ensuite à la feuille principale, puis cli-quez à nouveau lorsque la souris est au-dessus de la partie Arizona del’imbrication.

Vous pouvez cliquer n’importe où à l’intérieur des frontières d’un état pourafficher les données de cet état.

7. Essayez de sélectionner une cellule de la feuille de calcul.

C’est un écran « à ne toucher qu’avec les yeux ». L’application a recours àune feuille de calcul mais, pour l’utilisateur, ce pourrait être une applicationtotalement personnalisée.

8. Appuyez sur CTRL+N pour créer un nouveau classeur.

La fenêtre Excel reprend l’apparence normale qu’elle possédait avant ledémarrage de l’application.

Vous ne pouvez pas empêcher avec les macros VBA l’utilisateur d’ouvrir unnouveau classeur, mais vous pouvez faire en sorte que votre application secomporte correctement si cela se produit.

Page 372: Excel 2007 VBA

352 Annexe

9. Modifiez la bordure de l’application Excel en quelque chose d’une forme etd’une taille significativement différente.

10. Sur l’onglet Affichage du ruban, cliquez sur Changement de fenêtre, puiscliquez sur Lucerne Publishing EIS.

La fenêtre reprend l’apparence de l’application.

11. Appuyez sur CTRL+TAB (le raccourci pour basculer entre fenêtres) pour voirl’application reprendre la taille et la forme que vous lui aviez donnée.Appuyez à nouveau sur CTRL+TAB pour revenir à l’application.

12. Cliquez sur Main pour revenir à la feuille principale. Cliquez ensuite sur l’éti-quette Exit située dans le coin supérieur gauche du classeur pour fermer leclasseur de l’application.

Cette application va bien plus loin que ce que vous accomplirez probablement àl’aide de macros, mais peut vous donner une idée des limites des capacités desmacros. Explorez son code. Une partie de celui-ci est nouvelle, mais, après avoireffectué les exercices des chapitres de ce livre, la plus grande partie vous paraîtrafamilière. Cette application peut vous donner quelques idées intéressantes àexploiter dans les macros que vous créez. Amusez-vous bien !

Astuce Comme cela était signalé dans le Chapitre 1, « Création d’une macro poureffectuer des tâches simples », si vous voulez créer une application complète enemployant comme plate-forme Excel, mieux vaut probablement employer Micro-soft Visual Studio plutôt que VBA.

Page 373: Excel 2007 VBA

353

Index

Symboles#NOM?, valeur d'erreur 249#VALEUR!, valeur d'erreur 253.NET Framework 4 [#Total], mot clé 160<globales>, objet 101

Intersect, méthode 118

AAction 76ActiveCell, mot clé

EntireColumn, propriété 110EntireRow, propriété 112

ActiveCell, objet 56ActiveSheet, mot clé 48

Delete, méthode 66ShowAllData, méthode 161

ActiveWindow, objet 45Height, propriété 45Left, propriété 45Top, propriété 45Width, propriété 45

ActiveWorkbook, mot clé 87ActiveX 277Add, méthode 80, 88

valeur de renvoi 90AddChart, méthode 212Adjustments, propriété 201Affichage personnalisé 332Aide 188Ajouter

arguments à une fonction personnalisée 250

bouton de commande 328bouton d’option 321classeur 77feuille de calcul 88

Application, objet 47DisplayAlerts, propriété 66, 258StatusBarre, propriété 244Volatile, propriété 253

Approbation des classeurs prenant en charge les macros 30Argument 28

ajouter à une fonction personnalisée 250

ajouter à une sous-routine 261facultatif de fonction 253

Arguments de la fonction, boîte de dialogue Excel 250Array, fonction 93, 152Auto List 79

variables pour autoriser les 94Auto List Members 47AutoFilter, objet 161Automation 4AutoShapeTypes, collection 195

BBackStyle, propriété 308, 345Barre d’Accès rapide

exécution d’une macro depuis 23Barre de défilement, contrôle ActiveX 305Boolean, type de données 290BorderAround, méthode 136Borders, collection 136Borders, objet 135

LineStyle, propriété 135Boucle 230

afficher la progression d’une 243Do… Loop 235For Each…Next 230For…Next 232grande, gérer 239infinie 235, 238

BoundColumn, propriété 309

Page 374: Excel 2007 VBA

354 Index

Bouton de commandelier à une macro 279personnalisé, créer 276

Bouton de commande, contrôle ActiveX 328Bouton d’option, contrôle ActiveX 321

mettre en œuvre 339ButtonCommand, objet

Click, événement 282DblClick, événement 282MouseMove, événement 282

byVal, mot clé 283

CCache mémoire 164Cadre, contrôle ActiveX 321Calculate, méthode 233Cancel, argument 292Cancel, propriété 329Caption, propriété 320, 322, 345Case à cocher, contrôle ActiveX 323

mettre en œuvre 341Cells, propriété globale 104Cellule

absolue et relative 61active

référencer une plage depuis la 109ajouter un dégradé 188style de 139vide, sélectionner uniquement les 50

Certificats, boîte de dialogue 36Change, événement 312Chart, objet 210

SetSourceData, méthode 211ChartObjects, collection 213, 214ChDir, instruction 44, 148CheckBox, objet 323

Click, événement par défaut 325Classe 74

apparentées aux formes 197instance 75

Classeur 77ajouter 77compter 81de macro, enregistrer 13fermer 82gestionnaire d’événement de 288modifier la valeur d’une propriété 87prenant en charge les macros,

approbation 30référence à un unique 83référence d’après son nom 86référence par pointage 87

Clear, méthode 266Click, événement 282, 325, 326CLng, fonction 251Close, méthode 82

SaveChange, argument 64Collage spécial, commande 26Collection 72Colonne

insérer dans un tableau 154masquer dynamiquement 335

ColorStops, collection 190ColumCount, propriété 309Columns, propriété globale 107ColumnWidth, propriété 186ColumnWidths, propriété 311COM (Component Object Model) 5ComboBox, objet 307

BackStyle, propriété 308BoundColumn, propriété 309Change, événement par défaut 312ColumnCount, propriété 309ColumnWidths, propriété 311LinkedCell, propriété 308ListFillRange, propriété 308SpecialEffect, propriété 308Style, propriété 308

CommandButton, objet 278, 328Cancel, propriété 329Caption, propriété 278Default, propriété 329

Page 375: Excel 2007 VBA

Index 355

Name, propriété 278TakeFocusOnClick, propriété 279

Commentaire 11Compilation, erreur de 256Compléter le mot, commande 110Comptabilité, format 6Connections, collection 165

WorkbookConnection, objet 165Control, objet 340Contrôle

ActiveX 277, 280barre de défilement (ScrollBar) 305bouton de commande

(CommandButton) 328bouton d’option (OptionButton)

321cadre (Frame) 321case à cocher (CheckBox) 323toupie (SpinButton) 301zone de liste déroulante

(ComboBox) 307zone de texte (TextBox) 324

aligner sur un formulaire 322de formulaire 280ordre de tabulation 330

Controls, propriété 339Convertir une formule en valeur 25Copier une feuille de calcul 91Copy, méthode 28

arguments Before et After 92Count, propriété 81Create, mot clé 163CreatePivotTable, méthode 163Créer

affichage personnalisé 332bouton de commande personnalisé

276cache mémoire 164fonction personnalisée 248formulaire utilisateur 318gestionnaire d’événement 281graphique 210ID numérique 36

logo avec une forme automatique 198macro simple 5nouveau fichier à partir d’une feuille de

calcul existante 146tableau

à partir d’une source externe 151à partir d’une source interne 149

tableau croisé dynamiqueà partir d’une source externe 165à partir d’une source interne 162

current region Voir Zone en coursCurrentRegion, propriété 110CustomViews, collection 334

DDataFields, collection 170DataPivotField, objet 170DataType, argument 45Date, fonction 326DateSerial, fonction 327DblClick, événement 282Déclaration de fonction 251Default, propriété 329Dégradé

appliquer à un graphique 216appliquer à une forme 192dans une cellule 188

Delete, méthode 66, 90Description, propriété 269Développeur, onglet du ruban 62, 276Dim, instruction 94Dir, fonction 235DisplayAlerts, propriété 66, 258Do… Loop, boucle 235DrawingObject, propriété masquée 208DrawingObjects, objets 195

EEditeur Visual Basic 10

exécuter une macro depuis 20Explorateur de projets 149

Page 376: Excel 2007 VBA

356 Index

Explorateur d’objets 100fenêtre ancrable 80

Exécution 77ouvrir 78

Else, instruction 223Emplacement approuvé 30Empty, valeur spéciale 327, 337Enabled, propriété 324End Function, instruction 249End If, instruction 221End Sub, instruction 12End With, mot clé 18Enregistrer

classeur de macro 13macro 6mouvement relatif 61

EntireColumn, propriété 110EntireRow, propriété 112Err, objet 263

Clear, méthode 266Description, propriété 269Number, propriété 264

Erreurcapturer 266contrôler dans une zone de texte 342de compilation 256de logique 257de syntaxe 256d’exécution 257gérer 256gestionnaire d’ 268ignorer 257

à l’aide d’une sous-routine 259objet Err 263

Etiquette de ligne 268Evénement

annuler 292Cancel, argument 292gestionnaire d’ 279

ExcelAide 188classeur 77

Collage spécial, commande 26contrôle Zoom 275graphiques 210mode création 280onglet Développeur 276Références relatives, option 62Sélectionner les objets, commande 210styles intégrés 177thèmes 177

Exécuterfonction personnalisée

à partir d’une feuille de calcul 249à partir d’une macro 255

macrodepuis la barre d’outils Accès

rapide 23depuis l’éditeur Visual Basic 20mode pas à pas 43

macros par une macro 67procédure

suite à une modification de la sélection 287

Exécutionerreur d’ 257fenêtre 77

Exit Sub, instruction 229Explorateur de projets 149Explorateur d’objets 100Expression conditionnelle 220

FFenêtre ancrable 80Fermer un classeur 82Feuille de calcul

affichage personnalisé 332ajouter 88ajuster la taille de la grille 186copier 91exécuter une fonction personnalisée à

partir d’une 249gestionnaire d’événement de 287

Page 377: Excel 2007 VBA

Index 357

manipuler plusieurs 92protéger 311supprimer 65, 89

Fichiernouveau, créer à partir d’une feuille de

calcul existante 146texte, ouvrir 41

FieldInfo, argument 45Fill, propriété 193FillFormat, objet 193Find, méthode 336Fonction 248

arguments facultatifs 253déclaration de 251personnalisée

ajout d’arguments 250créer 248exécuter à partir d’une feuille de

calcul 249exécuter à partir d’une macro 255

RGB 138volatile 253

For Each…Next, boucle 230For…Next, boucle 232ForeColor, propriété 345Format

comptabilité 6monétaire 6

Formeajouter un dégradé 192appliquer un effet tridimensionnel 204appliquer un ombrage 203lier une macro à une 208regrouper 205sélectionnée, référencer 195

Formula, propriété 127Formulaire

aligner les contrôles 322Boîte à outils 321lancer 345mettre en œuvre 339modal 345

utilisateur, créer 318FormulaR1C1, propriété 128Formule

convertir en valeur 25insérer dans une plage 126

Frame, objet 321Caption, propriété 322Controls, propriété 339

Function, instruction 249

GGestion des erreurs 256Gestionnaire

d'erreur 268d’événement 279

créer 281de niveau classeur 288de niveau feuille de calcul 287

GetOpenFilename, méthode 47GradientStops, collection 193

Insert, méthode 193Graphique

créer 210mettre en forme 216sélectionner 212synchroniser deux 213

GroupItems, propriété 207

HHeight, propriété 45

IID numérique, créer 36If… Then, instruction 221Importer un fichier texte 41Index, propriété 161Initialize, événement 326InputBox, fonction 56, 224

Page 378: Excel 2007 VBA

358 Index

Insérer une valeur/formule dans une plage 126Insert, méthode 193Instance 75Instruction 12Intersect, méthode 118IsDate, fonction 226Item, propriété 84

LLabel, objet 345

BackStyle, propriété 345Caption, propriété 345ForeColor, propriété 345Name, propriété 345PrintObject, propriété 345TextAlign, propriété 345

LargeChange, propriété 306Left, fonction 57Left, propriété 45LineStyle, propriété 135LinkedCell, propriété 302, 305, 308ListColumn, objet 157

DataBodyRange, propriété 158ListColumns, collection 157Liste d’énumérations 135ListFillRange, propriété 308ListObject, objet

Add, méthode 151AutoFilter, propriété 161ListColumn, propriété

TotalsCalculation, propriété 160ListColumns, collection

ListColumn, objet 157QueryTable, propriété 151ShowTotals, propriété 160TotalsRowRange, propriété 160

Logique, erreur de 257Logo, créer avec une forme automatique 198Long, type de données 251

MMacro

amélioration de sélections enregistrées 119

approbation des classeurs prenant en charge les 30

classeur de, enregistrer 13commentaire 11définition 2emplacement approuvé 30enregistrer 6étiquette de ligne 268examiner 10exécuter

depuis la barre d’outils Accès rapide 23

depuis l’éditeur Visual Basic 20en mode pas à pas 43

expression conditionnelle 220Instruction 12lier à un bouton de commande 279lier à une forme 208point d’arrêt 239qui exécute d’autres macros 67simple, créer 5touche de raccourci 9

Max, propriété 302, 305Membre 75Méthode 25, 74

argument 28modification de propriété 76valeur de renvoi 90

Microsoft Visual Studio 5Min, propriété 302, 305Mise en forme

conditionnelle 191de l’intérieur d’une plage 137d’une plage 133

Mode création d’Excel 280Modèle objet 3Modifier simultanément plusieurs propriétés 14

Page 379: Excel 2007 VBA

Index 359

Module 11Monétaire, format 6MouseMove, événement 282Mouvement relatif, enregistrer 61MsgBox, fonction 227

Buttons, argument 227Prompt, argument 227

NName, propriété 84, 89, 320, 322, 345Not, mot clé 21Nothing, objet spécial 337Number, propriété 264

OObjet

<globales> 101classe 74

instance 75collection 72de graphisme 186définition 72membre 75méthode 25, 74modèle 3propriété 12, 73

Offset, propriété 115On Error Goto, instruction 268On Error Resume Next, instruction 259OnAction, propriété 208OpenText, instruction 44

DataType, argument 45FieldInfo, argument 45Origin, argument 45TrailingMinusNumbers, argument 45

Option Explicit, instruction 49, 256Optional, mot clé 254OptionButton, objet

Caption, propriété 322Name, propriété 322

Value, propriété 322Ordre de tabulation 330Origin, argument 45Ouvrir

éditeur Visual Basic 78fichier texte 41

PParent, propriété 208Pas à pas, exécution en mode 43PasteSpecial, méthode 28Path, propriété 148Personnaliser

aspect d’un tableau croisé dynamique 171

style d’un tableau croisé dynamique 180

PivotCaches, collection 163PivotFields, collection 170PivotItems, collection

Count, propriété 175PivotSelect, méthode 171PivotTable, objet 162

DatBodyRange, propriété 171PivotFields, collection

Orientation, propriété 170PivotSelect, méthode 171

Plageinsérer valeurs et formules dans une

126mettre en forme 133

l’intérieur d’une 137nommer 307référencer

à l’aide d’une adresse 100comme collection de cellules 104comme collection de lignes ou de

colonnes 107d’après la cellule active 109relativement 115sous-ensembles d’une 113

Page 380: Excel 2007 VBA

360 Index

Point d’arrêt 239temporaire 242

PrintObject, propriété 345Private, mot clé 261, 279Procédure 260

de gestionnaire d’événement 274exécuter suite à une modification de la

sélection 287privée 260Sub 263

Propriété 12, 73action 76en lecture seule 82globale 84modifier avec une méthode 76modifier la valeur 87modifier simultanément plusieurs 14

Protect, méthode 313Protéger une feuille de calcul 311Public, mot clé 290

QQueryTable, objet

CommandText, propriété 153CommandType, propriété 153Refresh, méthode 153

RRAND(), fonction Excel 249Range, objet

BorderAround, méthode 136ColumnWidth, propriété 186Offset, propriété 115référencer

à l’aide d’une adresse 100comme collection de cellules 104comme collection de lignes ou de

colonnes 107d’après la cellule active 109relativement 115

sous-ensembles d’un 113Resize, propriété 115, 117RowHeight, propriété 186SpecialCells, méthode 139TintAndShade, propriété 139

Range, propriété globale 101Rectangle, classe 195Référence

à un classeur d’après son nom 86à un classeur par pointage 87à un unique classeur 83à une forme sélectionnée 195à une plage

à l’aide d’une adresse 100comme collection de cellules 104comme collection de lignes ou de

colonnes 107d’après la cellule active 109relative 115

absolue 123aux sous-ensembles d’une plage 113relative 122

Resize, propriété 115, 117RGB, fonction 138Rnd, fonction Visual Basic 249RowHeight, propriété 186Rows, propriété globale 109Run, méthode 68

SSaveChange, argument 64Saved, propriété 87ScrollBar, objet 305

LargeChange, propriété 306LinkedCell, propriété 306Max, propriété 306Min, propriété 306SmallChange, propriété 306

Select, méthode 92Sélection

enregistrée, améliorer 119

Page 381: Excel 2007 VBA

Index 361

Selection, propriété globale 111Sélectionner

une ou plusieurs feuilles de calcul 92uniquement des cellules vides 50

Sélectionner les objets, commande 210SelLength, propriété 343SelStart, propriété 343SetFocus, méthode 343SetSourceData, méthode 211Shape, objet 192, 198

Adjustments, propriété 201Fill, propriété 193

GradientStops, collection 193GroupItems, propriété 207OnAction, propriété 208ThreeD, propriété 207Ungroup, propriété 208

ShapeRange, collection 196, 198Shapes, collection 197

AddChart, méthode 212Shape, objet 198

Sheets, objet 46Show, méthode 335, 345ShowAllData, méthode 161SmallChange, propriété 304, 305Source de données

chaîne de connexion 152externe

créer un tableau à partir d’une 151créer un tableau croisé dynamique

à partir d’une 165interne

créer un tableau à partir d’une 149créer un tableau croisé dynamique

à partir d’une 162Sous routine 259Sous-routine

ajout d’arguments 261SpecialCells, méthode 53, 139SpecialEffect, propriété 308SpinButton, objet 301

LinkedCell, propriété 302

Max, propriété 302Min, propriété 302SmallChange, propriété 304

StatusBarre, propriété 244Structure With 18Style de cellule 139Style de référence L1C1 54, 124Style, propriété 308Sub, instruction 12Supprimer une feuille de calcul 65, 89Syntaxe, erreur de 256

TTableau 146

créerà partir d’une source externe 151à partir d’une source interne 149

filtrer 159insérer une colonne 154manipuler les colonnes d’un 157totaux 159

Tableau croisé dynamique 162cache mémoire 164créer

à partir d’une source externe 165à partir d’une source interne 162

personnaliser l’aspect 171personnaliser le style 180

TableStyleElements, collection 180TextAlign, propriété 345TextBox, objet 324

Enabled, propriété 324SelLength, propriété 343SelStart, propriété 343SetFocus, méthode 343

ThreeD, propriété 207TintAndShade, propriété 139Top, propriété 45Touche de raccourci 9Toupie, contrôle ActiveX 301TrailingMinusNumbers, argument 45

Page 382: Excel 2007 VBA

362 Index

UUngroup, propriété 208Unicode 281Unload, commande 329Up Arrow Callout, forme 201UserForm, objet 319

Caption, propriété 320Click, événement par défaut 326Initialize, événement 326Name, propriété 320Show, méthode 345

UserInterfaceOnly, argument 314

VValeur

convertir une formule en 25insérer dans une plage 126

Value, propriété 126, 322Variable 94

publique 290Variant, type de données 94VBA (Visual Basic for Applications) 1

éditeur 10vbCrLf, constante Visual Basic 202, 269Volatile, propriété 253VSTO (Visual Studio Tools for Office) 5Vue Voir Affichage personnalisé

WWidth, propriété 45With, structure 18, 45Workbook, objet

Add, méthode 88Close, méthode

SaveChanges, argument 64

CustomViews, collection 334Show, méthode 335

Open, événement 288Path, propriété 148Saved, propriété 87TableStyles, collection

TableStyleElements, collection 180WorkbookConnection, objet 165Workbooks, objet 46, 80

Add, méthode 80Close, méthode 82Count, propriété 81Worksbook, propriété 85

Workbooks, propriété 85Worksheet, objet

Name, propriété 89Protect, méthode

UserInterfaceOnly, argument 313Select, méthode 92SelectionChange, événement 287

WorksheetFunction, objet 215

XXlLineStyle, énumération 135xlNone, constante globale 135xlThemeFontMinor 182

ZZone de liste déroulante, contrôle ActiveX 307Zone de texte, contrôle ActiveX 324

contrôle des erreurs dans une 342initialiser 326

Zone en cours 50