Livre Cours VBA Excel Débutant PDF: Accueil Blog
Livre Cours VBA Excel Débutant PDF: Accueil Blog
Blog
Informatique
Comptabilité
Economie
Marketing
Management
Gestion
Statistiques
Finance
Commerce
Electronique
Electricité
Cours Excel
Télécharger aussi :
Formation VBA Excel 2003 pdf
Cours VBA Excel 2000 Complet
Excel VBA Cours
Excel VBA 2007 cours
Aide Excel VBA
Aide Excel VBA Pdf
Cours de programmation VBA pour Excel 2016
Programme de Formation VBA Excel 2010 en pdf
Programme de Formation VBA Excel 2007 en pdf
Résumé
MAÎTRISEZ TOUS LES ASPECTS DE LA PROGRAMMATION
EXCEL
Qu’il s’agisse de faire face à un besoin immédiat ou de créer des
programmes
durables, cet ouvrage vous aidera à tirer pleinement profit d’Excel
grâce à la
programmation VBA.
Vous y apprendrez les principes de la programmation orientée
objet, le
langage VBA et découvrirez en détail Visual Basic Editor,
l’environnement de
programmation Excel.
Du simple enregistrement de macros à la conception d’interfaces
utilisateur et
au débogage de vos programmes, vous trouverez ici toutes les
informations
nécessaires au développement d’applications VBA pour Excel.
DÉVELOPPEZ UNE APPLICATION EXCEL
PROFESSIONNELLE
Vous finirez l’ouvrage par la création d’un programme complet de
génération
de contrats et de feuilles de paie via une série d’interfaces utilisateur
qui vous
permettront de récapituler et mettre en œuvre toutes les
connaissances acquises
lors de votre lecture.
À qui s’adresse cet ouvrage ?
• Aux utilisateurs d’Excel désireux d’améliorer leur productivité
• Aux responsables qui souhaitent créer des solutions sûres et
efficaces pour
leurs équipes
• Aux personnes qui souhaitent s’initier à la programmation via le
tableur de
Microsoft
Des compléments web à télécharger
Tous les exemples de programmes du livre sont en
téléchargement sur notre
site Internet
Sommaire
Biographie auteur
Éditeur et développeur indépendant, Mikaël Bidault développe
des
compléments Word et Excel pour des maisons d’édition et des sites
Internet. Il
est le créateur de l’articho, un complément VBA pour Word
dédié à l’édition
print et numérique ().
Mikaël Bidault
Programmation
Excel avec VBA
ÉDITIONS EYROLLES
61, bd Saint-Germain
7524 0 Paris Cedex 05
Atte ntion : pour lire les exemples de lignes de code, réduisez la
police de votre support au maximum.
En application de la loi du 11 mars 1957, il est interdit de
reproduire intégralement ou partiellement le
présent ouvrage, sur quelque support que ce soit, sans
l’autorisation de l’Éditeur ou du Centre Français
d’exploitation du droit de copie, 20, rue des Grands Augustins, 75006
Paris.
© Groupe Eyrolles, 2017, ISBN : 978-2-212-674 01-9
Améliorer la macro
Structure de la macro
Exécution de la macro
Accéder aux macros d’un classeur spécifique
Références relatives et références absolues
Référence aux plages de cellules nommées
L’Explorateur d’objets
Contrôle SpinButton
Supprimer des contrôles
Grouper ou séparer des contrôles
Ajouter/supprimer une page
ControlTipText
Visible
WordWrap
LargeChange
TabStop
Tag
StartUpPosition
PictureTiling
Font
Les événements
Exploiter les informations d’une feuille VBA
Création de procédures événementielles de niveau application
Introduction
Visual Basic pour Applications, VBA, est la solution de
programmation
intégrée aux applications de la suite Office. La connaissance de VBA
permet à
l’utilisateur d’Excel de tirer pleinement profit du tableur de
Microsoft en en
développant les capacités et les fonctionnalités pour ses besoins
spécifiques.
Maîtriser VBA, c’est à coup sûr améliorer sa productivité.
L’intégration dans Excel de Visual Basic pour Applications, un
environnement
de développement intégré complet et professionnel, remonte à
sa version 97.
Office 2013 et Office 2016 intègrent la version 7.1 de Visual
Basic, tandis
qu’Office 2010 propose la version 2010 et que XP, 2003 et 2007
fournissent
Visual Basic 6.3. Entre ces versions, les différences sont quasi-
inexistantes.
Cet ouvrage traite de la programmation des versions 97 à 2016
d’Excel. Sauf
exception signalée, les explications et les exemples proposés sont
valides pour
toutes les versions d’Excel. En effet, de l’une à l’autre, il n’y a
pas eu de
révolution. Le modèle d’objets s’est affiné et les nouvelles fonctions
d’Excel,
apparues au cours des différentes versions du logiciel, peuvent
également être
manipulées via la programmation VBA. Cependant, le langage, la
gestion des
programmes, l’environnement et les outils au service du
développeur – bref,
tout ce que vous devez savoir pour programmer Excel et que
cet ouvrage se
propose de vous apprendre – restent inchangés d’une version à l’autre.
Donc, sachez que vous pourrez appliquer les connaissances acquises
lors de la
lecture de ce livre, aussi bien avec Excel 2003 sous Windows XP
qu’avec la
version 2016 et un système Windows 10. Mieux, les programmes
développés
pour Excel 97 fonctionnent avec toutes les versions ultérieures
du tableur et,
dans la très grande majorité des cas, les programmes
développés dans Excel
2016 devraient fonctionner avec les versions antérieures.
Dans cet ouvrage, vous découvrirez les différentes méthodes de
création de
projets VBA pour Excel, Visual Basic (le langage de
programmation
proprement dit) et les outils de développement et de gestion intégrés
de Visual
Basic pour Applications. Votre initiation à la programmation VBA
se fera au
moyen d’exemples de programmes détaillés et commentés.
Définition
Vous rencontrerez le terme « projet » tout au long de cet
ouvrage. C’est ainsi que l’on nomme un
ensemble de programmes développés avec Visual Basic pour
Applications.
Compléments VBA et compléments Office
Avec Office 2013, Microsoft a introduit un nouveau type de
compléments, les
compléments Office. Contrairement à ceux développés en VBA,
les
compléments Office ne sont pas installés sur l’ordinateur de
l’utilisateur, mais
hébergés sur un serveur distant à partir duquel ils s’exécutent.
Ils sont
développés à partir de technologies Web, telles que HTML 5,
JavaScript, CSS
3, XML et des API REST.
En termes d’expérience utilisateur, les compléments Office
s’apparentent à des
applications mobiles auxquelles on s’abonne via l’Office store et
s’exécutent
systématiquement dans un panneau qui leur est dédié.
Cependant, si vous
souhaitez développer des solutions professionnelles dans le cadre
d’une
entreprise et non dans le but de les commercialiser via l’Office
store, VBA
reste presque toujours la solution la plus simple et la plus souple à
mettre en
œuvre et à déployer.
VBA, pour quoi faire ?
Excel offre des possibilités très étendues. Pourtant, quelle que soit la
puissance
de ses fonctions, elles ne peuvent répondre à toutes les
situations. La
programmation VBA est la solution de personnalisation offerte par
Excel, afin
d’ajouter des caractéristiques, des fonctions et des commandes
qui répondent
précisément à vos besoins.
La programmation VBA peut être définie comme la
personnalisation d’un
logiciel afin de s’assurer gain de temps, qualité des documents et
simplification
des tâches complexes ou fastidieuses. Voici quelques exemples
de ce que
permettent les programmes VBA :
• Combiner un nombre indéterminé de commandes. Nous sommes
souvent
amenés à répéter ou à associer certaines commandes plutôt que
d’autres et à
ignorer certaines fonctionnalités selon l’usage personnel que nous
avons
d’un logiciel. VBA permet d’associer un nombre illimité de
commandes à
une seule. Vous pouvez ainsi ouvrir simultanément plusieurs
documents
Excel stockés dans des dossiers ou sur des serveurs différents, y
insérer des
Définition
La hiérarchie d’objets d’une application, encore appelée modèle
d’objets, est le rapport qu’entretiennent
entre eux les différents objets d’une application. Ce concept ainsi
que les notions spécifiques aux
langages orientés objet seront développés au chapitres 1, «
Notions fondamentales de la
programmation orientée objet ».
Ce livre présente et illustre d’exemples commentés l’ensemble
des structures
de contrôle qui servent à créer très simplement des macros
évoluées. Nous
vous fournirons les bases du langage Visual Basic. Elles suffisent
pour créer
une infinité de macros et répondre à vos besoins spécifiques.
Lorsque les principes du développement de projets VBA vous seront
acquis et
que vous créerez vos propres macros, il vous arrivera sûrement
d’avoir
besoin d’instructions que vous n’aurez pas rencontrées lors de la
lecture de cet
ouvrage ; vous pourrez alors utiliser l’Enregistreur de macro ou
encore les
rechercher dans l’aide de Visual Basic pour Applications ou dans
l’Explorateur d’objets – étudié au chapitres 4. Vous verrez que l’aide de
VBA
fournit une référence complète du langage, facilement accessible
et
consultable.
Si vous n’avez aucune expérience de programmation, peut-être ce
Visual Basic
vous apparaît-il comme un langage barbare ou inaccessible. Ne vous
inquiétez
pas : le développement de projets VBA ne requiert ni expérience
préalable de
la programmation, ni connaissance globale du langage. Contentez-
vous, au
cours de votre lecture, d’utiliser les fonctions nécessaires aux
exercices et que
nous vous détaillerons. Cet ouvrage propose un apprentissage
progressif et
concret : vous développerez vos premiers projets VBA dès les
premiers
chapitres.
Un environnement de travail
VBA dispose d’un environnement de développement à part
entière : Visual
Basic Editor.
Nous vous faisons ici part de notre expérience, en vous
prodiguant des conseils qui vous aideront à
développer des projets VBA de qualité.
Codes sources des exemples du livre
Les exemples du livre sont proposés en téléchargement sur le site des
éditions
Eyrolles. Vous pouvez ainsi tester tous les exemples à partir des
fichiers Excel
qui les intègrent. Cela vous évitera également de saisir le code
dans Visual
Basic Editor. Avant de poursuivre la lecture de ce livre,
téléchargez les
exemples à l’adresse suivante :
PREMIÈRE PARTIE
Découvrir la
programmation Excel
1
Notions fondamentales de la
programmation orientée objet (POO)
Visual Basic est un langage de programmation orienté objet. En tant
que tel, il
repose sur des concepts communs à tous les langages de POO. Avant
de vous
lancer dans la programmation pour Excel, il est important de vous
familiariser
avec ces concepts et le vocabulaire qui les décrit. Plus
concrètement, ce
chapitre vous fera découvrir les différents composants de Visual Basic
en tant
que langage orienté objet et comment ils s’articulent pour créer
des
programmes VBA puissants.
Vous ne trouverez pas dans ce chapitre de programmes VBA. Il
est destiné à
vous donner les bases et la terminologie sur lesquelles nous nous
appuierons
tout au long de cet ouvrage. Alors, patience ! Les connaissances
qu’il vous
apportera permettront d’appréhender vos premiers programmes
dès le
chapitres 2.
Comprendre le concept d’objet
Comme pour tous les langages de POO, les objets sont le fondement
de Visual
Basic. Quelle que soit la fonction d’un programme VBA, presque
toutes les
actions qu’il exécute s’apparentent à la modification d’objets.
Les ouvrages présentant la POO le font presque toujours par analogie
avec les
objets de la vie réelle. Nous ne dérogerons pas à cette règle. La
programmation orientée objet repose en effet sur une structure
qui rappelle,
par de nombreux points, les objets de la vie courante et les
rapports qu’ils
entretiennent. Cette analogie rend simples et faciles d’accès des
concepts qui,
abordés de façon abstraite, vous apparaîtraient probablement obscurs.
Objets et collections d’objets
Dans la vie, un objet peut être tout et n’importe quoi. Ce qui
caractérise un
objet, c’est son existence physique, ses propriétés spécifiques,
son
comportement et les actions que l’on peut exécuter sur celui-ci. Une
voiture est
un objet. Lorsque vous parlez de l’objet Voiture, vous pouvez faire
référence à
un objet abstrait (« Je vais acheter une voiture ») comme à une
voiture bien
concrète (« Regarde un peu ma belle 504 verte »). Les objets
que vous
utiliserez dans vos programmes VBA répondent à une même définition.
Dans le premier cas, vous évoquez un objet Voiture imprécis et
pourtant tout le
monde comprend de quoi vous parlez. Il vous suffit de prononcer
le mot
« voiture » pour que chacun imagine et visualise un véhicule bien
spécifique,
en fonction de ses goûts, de ses aspirations, de ses souvenirs,
etc. Cependant,
en tant qu’objet Voiture, elle possède un certain nombre de
propriétés (une
carrosserie, des roues, un moteur) et autorise un certain nombre de
méthodes
(démarrer, freiner, tourner) qui permettent d’en maîtriser le
comportement.
Ce sont ces propriétés et ces méthodes, communes à toutes les
voitures, qui
définissent l’objet Voiture. Elles sont sous-entendues, évidentes et
essentielles. Il
existe donc des milliers de voitures différentes, toutes reconnaissables
par un
certain nombre de caractéristiques communes définies dans le concept
(l’objet)
Voiture. En POO, cet objet abstr ait est appelé la classe Voitures et est
la définition
formelle des objets Voiture (leurs propriétés et leurs méthodes).
Il s’agit du
modèle à partir duquel vous pouvez imaginer et créer des milliers de
voitures
différentes. L’ensemble des véhicules appartenant à la classe
Voitures (parce
qu’ils possèdent les propriétés et les méthodes définies dans
cette classe) est
appelé la collectiond’objets Voitures.
Info
Une collection porte le nom pluriel des objets qu’elle rassemble.
Ainsi, la collection WorkBooks renvoie tous les objets Workbook,
soit tous les
classeurs ouverts, la collection Sheets, toutes les feuilles d’un objet
WorkBook, la
propriété Worksheets, toutes les feuilles de calcul d’un objet
Workbook, etc. La
section « Le modèle d’objets d’Excel » située en fin de chapitre
vous fera
découvrir les objets Excel les plus importants.
Définition
Le terme Classe désigne la définition commune d’un ensemble
d’objets (qu’est-ce qu’une voiture ?),
tandis qu’une Collection désigne l’ensemble des objets appartenant à
une classe (toutes les voitures en
circulation).
Lorsque vous parlez d’acheter la Peugeot 504 verte de vos
rêves, vous
évoquez une voiture concrète, bien spécifique. Vous créez une
instance – on
parle aussi d’une occurrence – de l’objet Voiture. Elle possède
toutes les
propriétés de la classe Voitures, mais ces propriétés sont attachées à
des valeurs
précises. La carrosserie est verte, la vitesse maximale est de x km/h,
etc. Vous
pouvez maîtriser le comportement de votre voiture à l’aide des
méthodes
définies dans la classe Voitures (Accélérer, Freiner), mais l’effet
précis de ces
méthodes est étroitement lié aux propriétés de votre véhicule. La
puissance du
moteur ne permet pas d’atteindre 200 km/h (mais vous pouvez
décapoter !) ;
les freins ne sont pas équipés du système ABS, il faut donc telle
distance pour
freiner, etc.
Un programme VBA peut ainsi créer une feuille de calcul Excel en
appliquant
la méthode Add (ajouter) à la collection WorkBooks et déterminer les
propriétés de
ce classeur (son nom, ses options de protection, le nombre des feuilles
qui le
composent, etc.)
Info
Lorsque vous créez une instance, cet objet possède toutes les
propriétés et méthodes définies dans la
classe. Ce principe essentiel de la programmation orientée objet est
appelé instanciation.
Le grand intérêt de la programmation orientée objet, c’est qu’il
n’est pas
indispensable de savoir comment fonctionne un objet pour
l’utiliser. Lorsque
vous achetez une voiture, vous n’avez pas besoin de savoir
comment la
carrosserie et le moteur ont été fabriqués, ni comment les
différents
composants sont assemblés ; vous vous contentez de choisir un
modèle, une
couleur, etc. Il vous suffit de connaître les méthodes propres à la
classe Voitures
pour l’utiliser. Avec VBA, lorsque vous créez une instance d’un objet,
vous en
définissez les propriétés sans vous préoccuper de la façon dont celles-
ci seront
appliquées. Il en va de même pour les méthodes que vous
utilisez pour
maîtriser le comportement d’un objet. Lorsque vous tournez la clé de
contact,
le moteur de la voiture démarre, sans que vous ayez à vous soucier du
détail
des événements et des technologies mises en œuvre.
VBA permet, par exemple, de créer des interfaces graphiques
pour vos
programmes, en déposant simplement les objets dont vous avez
besoin (cases à
cocher, zones de texte, boutons de commandes), sur une feuille. Ces
objets ont
des comportements spécifiques que votre programme exploitera,
sans que
vous ayez besoin de vous soucier de leur mécanisme interne.
Application hôte et modèles d’objets
Lorsque vous développerez des programmes VBA, vous agirez sur des
objets
qui varieront en fonction des actions que vous souhaitez que votre
programme
exécute. Vous définirez et associerez ces objets de façon à créer
une
application complète. Là encore, l’analogie avec les objets de la vie
courante
est révélatrice. Les objets que nous utilisons sont généralement
ordonnés selon
leurs fonctions. Lorsque vous souhaitez vous laver, vous vous dirigez
vers la
salle de bains ; il s’agit du lieu consacré à la toilette. Vous y trouvez un
certain
nombre d’objets tels que savon, gant de toilette, dentifrice, brosse à
dents, etc.
Vous utilisez le savon avec le gant de toilette, le dentifrice avec
la brosse à
dents, et vous pouvez faire une toilette complète.
Si vous souhaitez manger, c’est dans la cuisine que vous vous
orienterez. Vous
y trouverez quelques objets disponibles dans la salle de bains (savon,
robinet,
placard). Vous ne devriez cependant pas y trouver de brosse à dents,
ni aucun
des objets spécifiques à la toilette. En revanche, vous pourrez utiliser
le four,
ouvrir le réfrigérateur et utiliser tous les objets spécifiques de la
cuisine.
Les applications du Pack Office sont comparables aux pièces de votre
maison.
Lorsque vous choisissez de développer un projet VBA, vous
choisissez une
application hôte. Il s’agit de l’application Office qui contient les
objets sur
lesquels vous souhaitez agir. C’est dans cette dernière que vous
développerez
vos programmes, et c’est uniquement à partir de cette
application qu’ils
pourront être exécutés. Si vous souhaitez travailler sur des
textes, vous
choisirez d’entrer dans Word. Pour faire des calculs, vous savez que
c’est dans
Excel que vous trouverez les objets dont vous avez besoin.
Access sert au
développement et au maniement des bases de données, et
PowerPoint à la
création de présentations.
Cependant, à l’image des pièces de votre maison, les
applications Office ne
sont pas hermétiques. Vous pouvez parfaitement vous préparer un
plateau repas
dans la cuisine et choisir de manger au lit. De façon semblable,
des projets
VBA évolués sont capables d’utiliser des objets de différentes
applications
Office. Un programme développé dans Excel peut utiliser des
données
stockées dans une base de données Access ou des objets Word pour
imprimer
un courrier qui accompagnera une facture, et envoyer un message
Outlook de
confirmation.
Vous devez choisir une application hôte pour votre projet. Deux
critères
doivent la déterminer :
• valeur booléenne ;
• constante.
Chaînes de caractères
Une chaîne de caractères est une suite de caractères contigus –
lettres, chiffres,
espaces ou signes de ponctuation. Ces données sont aussi
qualifiées de type
Chaîne ou String. Une chaîne peut contenir jusqu’à environ deux
milliards de
caractères. En Visual Basic, les chaînes sont placées entre guillemets :
• "Paul" ;
• "1254" ;
• "Je suis une chaîne de caractères composée de 59 caractères".
Les chaînes sont interprétées en tant que caractères, et non en
tant que valeur
numérique. Autrement dit, la chaîne "1254" est interprétée
comme la
combinaison des caractères 1, 2, 5 et 4.
La propriété Modèle d’un objet Voiture est toujours une chaîne
de caractères.
Celle-ci ne peut être composée que de chiffres – par exemple
"2000" – sans
que vous puissiez pour autant diviser cette valeur par un nombre
quelconque.
Valeurs numériques
Une valeur numérique est une suite de chiffres. Elle peut être un
nombre entier
ou décimal, positif ou négatif :
• 0 ;
• 1 548 972 ;
• ? 1 245,4542 ;
• 100E4.
Info
Le caractère E dans une variable numérique signifie « exposant
» et représente une puissance de 10.
Ainsi, la valeur numérique 100E4 est égale à 100 × 104.
Les valeurs numériques sont interprétées comme des chiffres. Il peut
s’agir de
valeurs comme d’expressions conjuguant valeurs numériques et
opérateurs
arithmétiques (* / – +). Par exemple, les propriétés
Contenu_Réservoir et
Consommation d’un objet Voiture sont des valeur s numér iques.
Leur combinaison
détermine combien de kilomètres peuvent être parcourus avant la
panne sèche,
cette voiture.
La syntaxe pour appliquer une méthode à un objet est la suivante :
Expression.Méthode
où Expression est une expression renvoyant un objet – un référentiel
d’objet – et
Méthode est le nom de la méthode que l’on souhaite exécuter
(toujour s sépar ée de
l’objet auquel elle se réfère par un point).
Une méthode peut aussi s’appliquer à une collection d’objets :
Collection.Méthode
Vous pouvez, par exemple, arrêter tous les objets de la collection
Voitures :
êter
Pour fermer tous les classeurs ouverts dans une session Excel, vous
utiliserez
l’instruction suivante :
[Link]
Cette syntaxe est aussi utilisée pour créer une occurrence d’un objet
dans une
collection. La méthode utilisée est alors généralement Add –
l’équivalent Visual
Basic de l’onglet Fichier. Par exemple, pour créer un nouveau classeur
Excel,
vous ferez appel à .
Vous définissez ensuite les propriétés de l’objet ainsi créé,
comme nous
l’avons vu dans la section « Les propriétés » de ce chapitre.
Les événements
Un événement est une action reconnue par un objet et qui déclenche
l’exécution
d’un programme lorsqu’elle survient. On parle alors de procédure
événementielle. Un clic de souris ou la frappe d’une touche sont des
exemples
d’événements pouvant être interprétés par un programme VBA.
Définition
Une procédure événementielle est une procédure attachée à un
événement utilisateur tel qu’un clic de
souris, la frappe d’une touche, l’activation d’une feuille de calcul, etc.
La procédure s’exécute lorsque
l’événement auquel elle est attachée est reconnu par l’application.
Les objets de la collection Voitures reconnaîtront par exemple
l’événement Choc,
dont la détection entraînera l’ouverture de l’objet Airbag,
autrement dit
l’application de la méthode Ouvrir à ce dernier.
2
Premières macros
L’enregistrement de macros constitue certainement le meilleur
apprentissage
de Visual Basic pour Applications. Les commandes de l’application
hôte
accessibles par les onglets ou les raccourcis clavier, le
déplacement (à l’aide
du clavier ou de la souris) dans un classeur et la modification
de ce dernier
peuvent être enregistrés dans une macro. Il suffit simplement de
déclencher
l’Enregistreur de macro et d’exécuter ces commandes, sans qu’il
soit
nécessaire d’écrire la moindre ligne de code. Ensuite, vous
répétez autant de
fois que vous le souhaitez la série d’instructions ainsi mémorisée en
exécutant
simplement la macro. Vous visualisez le codage de la macro
dans la fenêtre
Code de Visual Basic Editor. Vous découvrez ainsi la structure et la
syntaxe des
programmes VBA par la pratique.
Définition
Le code est le texte, écrit dans le langage de programmation,
constituant le programme. Le codage
désigne le fait de générer du code, soit en utilisant l’Enregistreur
de macro, soit en l’écrivant
directement dans la fenêtre de code de Visual Basic Editor.
À travers des exemples simples, ce chapitre vous initiera à
l’enregistrement et
à la création de macros. Vous créerez une première macro, puis
en
améliorerez très simplement la fonctionnalité. Vous verrez que
cette méthode
est relativement souple et qu’il existe plusieurs possibilités, plus
ou moins
efficaces et plus ou moins rapides, pour créer une macro. Vous
apprendrez
rapidement à utiliser l’une ou l’autre des méthodes disponibles
(voire à les
combiner), en fonction de l’objet de votre macro.
Créer une macro GrasItalique
Lorsque vous souhaitez enrichir le contenu d’une cellule
d’attributs de
caractères, une solution consiste à choisir le Format de cellule
du bouton
Format (onglet Accueil) et à sélectionner l’onglet Police. On définit
ensuite les
attributs voulus et on valide en cliquant sur OK. Nous utiliserons
ici cette
méthode pour créer une macro enrichissant la cellule ou la plage
de cellules
active des attributs gras et italique.
Cette macro est fort simple, puisque composée de seulement deux
commandes,
mais elle aidera à découvrir comment les programmes VBA sont
structurés. Le
but de ce chapitre est de vous initier aux différentes méthodes
de création et
d’optimisation de macros. Prenez donc le temps de le lire dans sa
totalité ; les
principes acquis seront valables pour l’ensemble des macros que vous
créerez
par la suite, quel que soit leur niveau de complexité.
Afficher l’onglet Développeur
Avant toute chose, vous devez afficher l’onglet Développeur dans
le ruban
pour accéder aux fonctions de programmation VBA. Cliquez sur
l’onglet
Fichier du ruban, puis sur la commande Options. Dans la fenêtre
Options
Excel, sélectionnez Personnaliser le ruban. Cochez ensuite la case
Développeur
de la liste Onglets principaux (voir figure 2-1), puis validez.
L’onglet
Développeur apparaît sur le ruban.
Attention
Lorsque vous attribuez un raccourci clavier à une macro, aucune
indication ne vous est fournie quant à
l’affectation ou non de ce raccourci à une commande. Si le
raccourci choisi était déjà affecté à une
commande Excel, il sera réattribué à la macro sans que vous en soyez
informé. Veillez donc à ne pas
attribuer à votre macro un raccourci clavier déjà utilisé par Excel,
particulièrement si d’autres utilisateurs
sont amenés à utiliser vos macros.
Figure 2-4 –La boîte de dialogue Enregistrer une macro complétée.
6. Enfin, cliquez sur OK.
Le libellé du bouton Enregistrer une macro devient Arrêter
l’enregistrement, indiquant que la macro est en cours
d’enregistrement.
Figure 2-5 –La commande Enregistrer une macro devient Arrêter
l’enregistrement.
Enregistrer les commandes de la macro
Info
Les commentaires sont des indications ajoutées dans le code
d’un programme afin d’en faciliter la
lecture.
Certains éléments du code apparaissent en couleur. Cette mise
en valeur
distingue aisément les éléments constitutifs du code. Par défaut,
Visual Basic
Editor applique le vert aux commentaires et le bleu aux mots-clés du
langage.
Définition
Un mot-clé est un mot ou un symbole reconnu comme élément
du langage de programmation Visual
Basic. Il peut s’agir d’une structure de contrôle, d’une fonction
ou de tout autre élément du langage
indépendant du modèle d’objets de l’application hôte. Les
structures de contrôle sont des instructions
qui servent à diriger le comportement d’une macro (par exemple,
répéter une opération en boucle,
n’effectuer une instruction que dans un contexte spécifique). Vous
apprendrez à utiliser les structures de
contrôle de Visual Basic au chapitres 7.
Entre les instructions Sub GrasItalique() et End Sub se trouvent
les instructions
qu’exécutera la macro :
With
.Name = "Arial"
.FontStyle = "Gras italique"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With
Info
Si vous utilisez une version antérieure à Excel 2007, les trois
lignes ThemeColor, TintAndShade et
ThemeFont sont remplacées par une seule ligne de code :
.ColorIndex = xlAutomatic
Il s’agit des commandes effectuées lors de l’enregistrement : ces
lignes
indiquent à la macro les actions à accomplir. Leur structure peut vous
dérouter,
mais vous vous y habituerez rapidement :
• L’expression indique à la macro qu’il s’agit d’appliquer un
format de police aux cellules sélectionnées :
– Selection est une propriété qui renvoie un objet Selection
représentant la
indice) 2.
Subscript
Case à cocher
SubScript
Indice
Les attributs Indice et Exposant ne pouvant être appliqués à
une même sélection, lorsque vous affectez la valeur True à
la propriété SubScript, la propriété SuperScript prend la
valeur
2
False .
True ou False (sans effet).
Ces propriétés indiquent respectivement si la police possède
OutlineFont et
[Aucune
une mise en forme Relief et Ombré. Elles ne correspondent à
Shadow
correspondance]
aucune option de la boîte de dialogue Format de cellule,
mais ont été conservées comme propriétés de l’objet Font
d’Excel. Elles sont sans effet sur la police.
Liste déroulante
Une des cinq constantes xlUnderlineStyleNone représentant
Underline
Soulignement
les cinq types de soulignement disponibles dans Excel 1.
Respectivement une des constantes xlThemeColor (la couleur
ThemeColor,
de motif), une valeur numérique comprise entre –1 et 1
Onglet
TintAndShade
représentant la teinte appliquée à cette couleur (de sombre à
et
Remplissage
ThemeFont
lumineux) et une des constantes xlThemeFont qui correspond
à la police du thème.
1. Si vous demandez la valeur d’une propriété pour une plage
contenant des cellules dont les attributs
correspondants sont différents, la valeur Null sera renvoyée. Par
exemple, si vous cherchez la valeur
de la propriété Name de l’objet Font d’une plage de cellules contenant
à la fois des cellules en police
Arial et d’autres en police Times, la valeur Null sera renvoyée.
2. Notez que cet état est le reflet de ce qui se passe dans la boîte de
dialogue Police. En effet, vous ne
pouvez pas cocher à la fois l’option Indice et l’option Exposant.
Comme le montre le tableau précédent, les actions exécutées sont
codées selon
des principes récurrents auxquels l’enregistrement de macros
vous
familiarisera.
La macro GrasItalique ouvre donc (virtuellement) la boîte de dialogue
Format
de cellule sur l’onglet Police et y définit les options telles
qu’elles l’ont été
lors de l’enregistrement. Elle applique ensuite ces propriétés au
texte
sélectionné.
Fermez la fenêtre Visual Basic Editor, en sélectionnant la commande
Fermer et
retourner à Microsoft Excel du menu Fichier.
Améliorer la macro
Sélectionnez maintenant une cellule dont la police et le corps sont
différents de
ceux de la plage sélectionnée lors de l’enregistrement de la
macro. Tapez le
raccourci clavier affecté à la macro (Ctrl+B). Celle-ci s’exécute.
À la figure 2-9, on constate que les attributs Gras et Italique ont
bien été
appliqués, mais la police et le corps du texte ont changé. Tous les
arguments en
cours dans la boîte de dialogue Police ont en effet été pris en compte
lors de
l’enregistrement de la macro.
Cela apparaît clairement dans la fenêtre de code (voir figure 2-7)
: les
arguments .Size = 10 et .Name = "Arial" correspondent à la police
et au corps du
texte sélectionnés lors de l’enregistrement de la macro.
Figure 2-9 –L’ensemble des arguments en cours lors de
l’enregistrement de la
macro est appliqué.
Pour remédier à ce problème, supprimez les attributs indésirables
directement
à partir de la fenêtre de code de la macro :
1. Activez l’onglet Développeur du ruban, puis cliquez sur le bouton
Macros
du groupe Code. Sélectionnez GrasItalique, puis cliquez sur le
bouton
Modifier.
2. Supprimez toutes les propriétés de l’objet Font que la macro
ne doit pas
modifier (toutes les instructions sauf .FontStyle = "GrasItalique").
Dans le
menu Fichier, choisissez Enregistrer ou cliquez sur le
bouton Enregistrer de la barre d’outils Standard.
Le texte de la macro doit se présenter ainsi :
Sub GrasItalique()
With
Nom de la macro
macro existante, l’application hôte affichera une boîte de dialogue
vous
demandant de confirmer le remplacement de l’ancienne.
Touche de
Affecte un raccourci clavier à la macro que l’on souhaite enregistrer.
raccourci
Enregistrer la
Désigne le classeur où sera stockée la macro 1. Le lieu de stockage
détermine à
macro dans
partir de quels documents la macro sera disponible, c’est-à-dire où elle
pourra
être exécutée, modifiée ou supprimée.
Destinée à la saisie d’une description de la macro. Par défaut, la date
de création
Description
et le créateur apparaissent dans cette zone.
Bouton OK
Démarre l’enregistrement de la macro sans qu’aucun raccourci ne lui
soit attribué.
Bouton Annuler
Ferme la boîte de dialogue sans déclencher l’Enregistreur de macro.
1. Le stockage et la disponibilité des macros sont traités à la fin de ce
chapitre.
Une autre méthode d’enregistrement
L’Enregistreur de macro est un instrument souple qui mémorise
l’ensemble
des commandes que vous exécutez, en utilisant n’importe
laquelle des
méthodes que propose l’application hôte pour ce faire.
Dans le cas de la macro GrasItalique, il est plus simple de
cliquer
successivement sur les icônes Gras et Italique de la barre d’outils que
de passer
par la boîte de dialogue Format de cellule. Rien ne vous empêche
d’enregistrer
votre macro de la même façon.
Enregistrement
Pour réenregistrer la macro GrasItalique :
1. Sélectionnez une cellule.
2. Cliquez sur le bouton Enregistrer une macro de l’onglet
Développeur. Dans
la zone Nom de la macro de la boîte de dialogue, saisissez
GrasItalique.
3. Affectez un raccourci clavier à la macro et saisissez une brève
description.
4. Cliquez sur le bouton OK. Une boîte de dialogue s’affiche, vous
demandant
de confirmer le remplacement de la macro existante. Confirmez.
création ; il est modifiable par la suite. Une macro peut
également être créée
directement à partir de Visual Basic Editor, sans passer par les
boîtes de
dialogue Macros ou Enregistrer une macro. Son stockage est alors
déterminé
dans l’Explorateur de projet. Ce dernier et la création à partir de Visual
Basic
Editor sont respectivement présentés aux chapitres 4 et 5.
Lors de l’enregistrement d’une macro, son affectation à un
document
s’effectue par la zone de liste Enregistrer la macro dans (voir figure 2-
12). Les
sections suivantes présentent les possibilités de stockage des macros
Excel.
Figure 2-12 –Sélectionnez le document de stockage de la macro lors
de son
enregistrement.
Classeurs et modèles
Les macros enregistrées dans Excel sont stockées dans des
classeurs ou dans
des modèles. Pour accéder à une macro, il faut que le classeur dans
lequel elle
est stockée soit ouvert. Si plusieurs classeurs sont ouverts, vous
pouvez
accéder aux macros de l’un d’entre eux à partir de n’importe
quel autre
classeur.
Les macros enregistrées dans un modèle sont accessibles lorsque
vous créez
un nouveau classeur fondé sur ce modèle (en choisissant la
commande
Nouveau de l’onglet Fichier et en sélectionnant un modèle).
Lorsque vous
enregistrez le nouveau classeur, les macros du modèle sont «
copiées » dans
celui-ci et restent donc disponibles par la suite, lorsque vous
rouvrez le
classeur.
Notez cependant que les classeurs Excel n’entretiennent pas de
lien avec le
modèle à partir duquel ils ont été créés. Si vous ajoutez,
modifiez ou
Conseil
Le classeur de macros personnel est stocké dans le dossier
XLSTART. Ce classeur contiendra
probablement l’essentiel de vos macros. Il est donc conseillé d’en
effectuer régulièrement une
sauvegarde. Par défaut, l’emplacement de ce fichier est :
\Users\Nom_utilisateur\AppData\Roaming\Microsoft\Excel\XLSTART
Les macros complémentaires
Les macros peuvent également être attachées à un classeur
enregistré en tant
que complément Excel (extension XLAM). Ce type de classeur est
particulièrement adapté à la distribution de macros. Les compléments
peuvent
en effet être « chargés » dans Excel. Les macros qui y sont contenues
sont alors
rendues accessibles au lancement de l’application. Contrairement
au classeur
de macros personnel, les compléments ne sont pas « ouverts » :
les macros
qu’ils contiennent sont chargées en mémoire et les onglets d’Excel
sont mis à
jour pour intégrer les fonctionnalités qu’elles apportent.
L’enregistrement au format de complément est indéniablement la
solution
adaptée si vous développez des solutions complètes par modules.
Vous évitez
ainsi de surcharger le classeur de macros personnel et pouvez
regrouper les
macros par classeur, tout en leur assurant une accessibilité
globale. Les
principaux avantages des macros complémentaires sont les suivants :
• distribution et gestion simplifiées ;
• possibilité d’activation/désactivation très simple ;
• économie de ressources mémoire ;
• exécution plus rapide des macros ;
• ajout de commandes à l’application de façon transparente pour
l’utilisateur ;
• les macros complémentaires chargées n’apparaissent pas dans
la liste des
macros.
Enregistrer un complément Excel
Pour enregistrer un classeur en tant que complément, commencez par
préparer
le projet VBA lui-même. Accédez à Visual Basic Editor :
1. Commencez par vous assurer que vos programmes VBA
fonctionnent
correctement et ne contiennent pas de bogues.
2. Dans Visual Basic Editor, ouvrez un module du projet et
choisissez
3
Déplacement et sélection dans une macro
Excel
Le déplacement et la sélection de cellules dans un classeur sont
primordiaux
lors de l’enregistrement de macros. Il est indispensable d’en
connaître les
techniques et de comprendre les concepts de référence relative ou
absolue aux
cellules, pour créer des macros qui se comportent comme vous le
souhaitez.
Pour enregistrer des déplacements dans une feuille Excel, vous pouvez
utiliser
indifféremment le clavier ou la souris. L’emplacement de la cellule
active est
enregistré lorsque vous effectuez une opération (mise en forme,
saisie, etc.)
qui modifie la feuille Excel. Autrement dit, si vous vous
contentez de vous
déplacer dans la feuille – par des clics de souris ou en utilisant les
flèches du
clavier – sans jamais intervenir sur le contenu ou la mise en
forme de la
cellule, ces déplacements ne seront pas enregistrés dans la macro.
La sélection d’éléments dans une feuille Excel repose sur l’objet
Range qui
représente une cellule, une ligne, une colonne ou une
combinaison de ces
éléments. Comme vous le verrez dans cette section, les
propriétés utilisées
varient selon le type de sélection effectué, mais toutes renvoient un
objet Range.
Le codage en Visual Basic de vos déplacements varie selon que
vous activez
ou non la référence relative aux cellules, en cliquant sur le
bouton
correspondant de la barre d’outils Arrêt de l’enregistrement (voir figure
3-1)
ou dans la zone Code de l’onglet Développeur si vous utilisez Excel
2007.
Figure 3-1 –Vous pouvez enregistrer vos déplacements par référence
relative
Figure 3-2 –Dans une plage de cellules Excel, une seule est la cellule
active.
Si vous appliquez une mise en forme (une police particulière, par
exemple),
elle concernera l’ensemble des cellules de la plage sélectionnée.
Si vous
appuyez sur la touche Suppr, le contenu de toutes les cellules de la
plage sera
supprimé. Plus généralement, si vous effectuez une opération pouvant
affecter
simultanément plusieurs cellules, elle s’appliquera à l’ensemble de
la plage
sélectionnée.
Cependant, certaines opérations – comme la saisie de texte ou de
formules – ne
peuvent s’appliquer qu’à une cellule à la fois. C’est alors la cellule
active qui
est affectée. Par exemple, si la plage de cellules A5+F10 est
sélectionnée et si
A5 est la cellule active, le texte saisi au clavier sera inséré dans A5 et
la plage
A5+F10 restera sélectionnée.
Pour nommer une plage, on indique la cellule située à l’angle
supérieur
gauche (A5), puis celle située à l’angle inférieur droit (F10).
La cellule active d’une plage dépend de l’ordre dans lequel vous
avez
sélectionné les différentes cellules qui la composent. Vous verrez
dans les
sections qui suivent comment le mode de sélection détermine la
cellule active
et comment cette dernière est codée en Visual Basic.
Références relatives et références absolues
Par défaut, l’enregistrement s’effectue par référence absolue à
des cellules.
Cela signifie que, lorsque vous vous déplacez dans une feuille
Excel,
l’Enregistreur de macro mémorise l’adresse de la cellule de
destination
(combinaison du numéro de ligne et de la lettre de colonne).
Ainsi, si vous
enregistrez un déplacement vers B6, l’exécution de la macro
entraînera
l’activation de cette dernière, quelle que soit la cellule active au
moment du
lancement de la macro.
Le bouton Référence relative de la barre d’outils Arrêt de
l’enregistrement sert
à enregistrer les déplacements dans la feuille Excel relativement
à la cellule
initialement active. Ce n’est plus l’adresse de la cellule qui est
prise en
considération, mais le déplacement dans la feuille. Ainsi, le passage de
B5 à C7
sera enregistré comme un déplacement d’une colonne vers la droite et
de deux
lignes vers le bas. Si, au moment de l’exécution de la macro, la cellule
active
est D1, alors E3 (située une colonne à droite et deux lignes en dessous
de D1)
sera à son tour activée.
Lors de l’enregistrement de macros dans Excel, vous pouvez
combiner les
références relatives et absolues, en cliquant sur le bouton
Référence relative
chaque fois que vous voulez changer. Observez le classeur
représenté à la
figure 3-3. La colonne D contient les chiffres d’affaires effectués
par les
représentants. La colonne E doit contenir les primes.
Figure 3-3 –La combinaison des références relatives et absolues
permettra de
calculer les primes des représentants.
Pour calculer la prime, il suffit de procéder comme suit :
1. Se placer dans la première cellule contenant un chiffre d’affaires
(D4).
2. Calculer la prime – vous apprendrez au chapitres 5 à créer
des fonctions
personnalisées et à les exploiter dans vos programmes VBA.
3. Se déplacer d’une cellule vers la droite (E4).
Rappel
Pour sélectionner une colonne ou une ligne dans une feuille
Excel, cliquez sur son en-tête ou utilisez
l’un des raccourcis clavier présentés dans le tableau 3-1. Pour
des colonnes ou des lignes contiguës,
sélectionnez la première ligne/colonne, puis enfoncez la touche
Maj et cliquez sur la dernière
ligne/colonne de la plage.
Lignes contiguës
La syntaxe de la propriété Rows est la suivante :
Rows("ligne1:ligne2").Select
Range("cell_active").Activate
où les arguments ligne1 et ligne2 représentent respectivement
les index de la
première et de la dernière ligne de la plage. La méthode Select
sélectionne
l’objet Range défini par la propriété Rows.
Notez que l’expression Range("cell_active").Activate est omise si la
cellule active
est celle située à l’angle supérieur gauche de la plage sélectionnée.
Info
Lorsque vous définissez une plage de lignes, la cellule active est
la première cellule de la première
ligne que vous sélectionnez. Par exemple, si, lors de l’enregistrement
d’une macro, vous sélectionnez
la ligne 5, puis maintenez la touche Maj enfoncée et sélectionnez la
ligne 10, c’est la cellule A5 (située
à l’angle supérieur gauche de la plage) qui sera active. En revanche, si
vous sélectionnez la ligne 10,
puis la 5, c’est la cellule A10 qui sera active.
Si la sélection ne porte que sur une ligne, les arguments ligne1
et ligne2 ont la
même valeur et l’expression Range("cell_active").Activate est omise.
Par exemple,
si vous enregistrez dans une macro la sélection de la ligne 5 de
la feuille
active, le code Visual Basic correspondant se présentera ainsi :
Rows("5:5").Select
Columns("col1:col2").Select
Range("cell_active").Activate
Dans l’expression Range("cell_active").Activate, cell_active
représente l’adresse de
la cellule active dans la plage sélectionnée. Cette expression est
omise si la
cellule active est celle située à l’angle supérieur gauche de la plage.
Si la sélection ne porte que sur une colonne, les arguments col1
et col2 ont la
même valeur et l’expression Range("cell_active").Activate est
omise. Ci-dessous
est présenté le code généré lors de l’enregistrement d’une macro
consistant à
sélectionner la colonne B de la feuille active :
Columns("B:B").Select
Si vous sélectionnez les colonnes B à E en commençant par B, le code
Visual
Basic correspondant se présentera ainsi :
Columns("B:E").Select
Si vous sélectionnez la même plage, mais en commençant par E, le
code Visual
Basic correspondant se présentera ainsi :
Columns("B:E").Select
Range("E1").Activate
Lorsque vous sélectionnez une colonne, la cellule active est par
défaut la
première de la colonne. Si vous modifiez la cellule active – dans ou
hors de la
plage sélectionnée – en maintenant la touche Ctrl enfoncée et en
cliquant sur la
cellule que vous souhaitez activer, la propriété Range se substitue à la
propriété
Columns. Votr e code se pr ésente alor s ainsi :
Range("col1:col2, cell_active").Select
Range("cell_active").Activate
où l’argument cell_active représente l’adresse de la cellule active. Par
exemple,
si vous sélectionnez la colonne E, puis maintenez la touche Ctrl
enfoncée et
cliquez sur la cellule E5 lors de l’enregistrement d’une macro, le code
Visual
Basic correspondant se présentera ainsi :
Range("E:E, E5").Select
Range("E5").Activate
La propriété End
La propriété End renvoie un objet Range qui représente la dernière
cellule d’une
zone. Cela revient à employer dans un tableau Excel la
combinaison clavier
Fin+flèche de direction. Utilisez la propriété End selon la syntaxe
suivante :
(Direction)
où Range renvoie l’objet Range à partir duquel on recherche la
dernière cellule
non vide et où Direction représente le sens dans lequel on se
déplace. Il peut
s’agir de l’une des constantes xlDirection suivantes :
• xlDown. Déplacement vers le bas ;
• xlToRight. Déplacement vers la droite ;
• xlToLeft. Déplacement vers la gauche ;
• xlUp. Déplacement vers le haut.
Appliquées au tableau de la figure 3-11, les quatre instructions
suivantes
renvoient respectivement l’objet Range représentant les cellules
E4, E12, C8 et
H8.
Range("E8").End(xlUp).select ’renvoie la cellule E4
Range("E8").End(xlDown).select ’renvoie la cellule E12
Range("E8").End(xlToLeft).select ’renvoie la cellule C8
Range("E8").End(xlToRight).select ’renvoie la cellule H8
Vous pouvez évidemment utiliser la propriété End pour sélectionner
des plages
de cellules, comme nous l’avons vu précédemment dans ce
chapitre.
Considérez les exemples suivants.
• Sélection d’une plage de la première à la dernière cellule non
vide d’une
colonne :
Range("A1", Range("A1").End(xlDown)).Select
Range(ActiveCell, (xlDown)).Select
• Sélection d’une plage de la dernière cellule non vide jusqu’à la
première :
Range("A32", Range("A32").End(xlUp)).Select
Range(ActiveCell, (xlUp)).Select
Si vous souhaitez sélectionner la première cellule vide d’une zone
plutôt que la
dernière cellule non vide, utilisez la propriété Offset pour décaler la
sélection.
La première instruction, ci-après, sélectionne la première cellule
vide au bas
de la colonne, tandis que la seconde sélectionne la première
cellule vide à
droite :
Range("A1").End(xlDown).Offset(1,0).Select
Range("A1").End(xltoRight).Offset(0,1).Select
La propriété UsedRange
La propriété UsedRange retourne la plage de cellules contenant les
données d’une
feuille. Cette propriété est donc particulièrement pratique pour
identifier les
cellules sur lesquelles doivent s’appliquer des traitements lors de
l’exécution
d’un programme. La plage retournée par UsedRange est un ensemble
de cellules
contiguës dont les limites sont définies par :
• la cellule dont l’index de colonne est le plus élevé ;
• la cellule dont l’index de colonne est le plus faible ;
• la cellule dont l’index de ligne est le plus élevé ;
• la cellule dont l’index de ligne est le plus faible.
L’instruction suivante sélectionne la plage de cellules utilisée sur
la feuille
active du classeur actif :
[Link]
Référence aux plages de cellules nommées
Pour faire référence à une plage de cellules nommée dans Excel,
utilisez la
syntaxe suivante :
Range("[NomClasseur]NomFeuille!NomPlage")
L’exemple suivant passe en gras les cellules de la plage
nommée MaPlage,
située sur la feuille Feuil1 du classeur :
Range("[]Feuil1!MaPlage") = True
Figure 3-12 –La propriété UsedRange retourne une plage qui englobe
toutes
les cellules contenant des données.
Pour sélectionner une plage nommée, utilisez la méthode GoTo
qui active
successivement le classeur et la feuille si nécessaire, puis sélectionne
la plage
voulue. Les deux instructions suivantes sélectionnent la plage
nommée
MaPlage, puis en effacent le contenu :
Reference:="[]Feuil1!MaPlage"
[Link]
4
Découvrir Visual Basic Editor
Visual Basic Editor est l’environnement de développement intégré
de VBA.
C’est dans cet environnement que vous passerez l’essentiel de votre
temps lors
du développement de projets VBA. Les chapitres précédents vous
ont fait
découvrir la fenêtre Code à travers la modification et la création
de macros.
Toutefois, Visual Basic Editor ne se résume pas à un simple éditeur de
code. Il
s’agit d’un logiciel complet proposant des outils d’aide au
développement, que
ce chapitre vous propose de découvrir.
Accéder à Visual Basic Editor
Lorsque vous choisissez de modifier une macro existante ou d’en
créer une
nouvelle, selon les procédures étudiées au chapitres 2, vous
accédez à la
fenêtre Code de Visual Basic Editor. Vous pouvez aussi
développer un projet
VBA en accédant directement à Visual Basic Editor, sans passer par la
boîte de
dialogue Macro.
On accède toujours à l’environnement de développement à partir
d’une
application hôte. Autrement dit, une session Visual Basic Editor peut
être liée à
Word, PowerPoint ou encore Excel, mais ne permet d’accéder qu’aux
projets
de l’application à partir de laquelle il a été exécuté.
Info
Lorsque vous êtes dans Visual Basic Editor, vous pouvez accéder
à l’ensemble des éléments
constitutifs des projets accessibles, y compris aux macros disponibles
dans la boîte de dialogue Macro.
Attention
Pour qu’un projet soit accessible dans Visual Basic Editor, il faut
que le document dans lequel il est
stocké soit ouvert dans l’application hôte.
Activez l’onglet Développeur du ruban, puis sélectionnez Visual Basic
Editor,
Figure 4-7 –Lorsque l’affichage des dossiers est désactivé, les icônes
distinguent les éléments du projet.
Accéder aux objets et au code des projets
Outre le bouton Basculer dossiers, l’Explorateur de projet
présente deux
boutons facilitant l’accès au code et aux objets constitutifs d’un projet :
Afficher le
Affiche le code de l’élément sélectionné dans l’Explorateur de projet
pour
code
l’écrire ou le modifier.
Affiche l’objet sélectionné dans l’Explorateur de projet. Il peut s’agir
d’une
Afficher
feuille (dossier UserForm) ou d’un document. Ce bouton est désactivé
si l’objet
l’objet
sélectionné est un module de code.
L’Explorateur d’objets
Lorsqu’on commence à développer en VBA, la difficulté essentielle
consiste à
manipuler les objets de l’application hôte (dans notre cas les
objets Excel).
Comment, par exemple, accéder à une plage de cellules d’une
feuille
spécifique d’un classeur et y insérer une formule ? L’Enregistreur de
macro est
dans de nombreux cas la solution à ce problème. Vous
manipulez les objets
Excel après avoir activé l’Enregistreur de macro, puis vous
visualisez dans
Visual Basic Editor les mots-clés Visual Basic utilisés pour accéder aux
objets,
à leurs propriétés et à leurs méthodes.
Cependant, certains éléments de code d’un programme VBA ne
peuvent être
générés à l’aide de l’Enregistreur de macro et doivent être saisis
dans la
fenêtre Code du programme. Il vous faut alors connaître la position de
l’objet
auquel vous souhaitez accéder dans la hiérarchie de classes de
l’application.
Vous devez aussi connaître les méthodes et propriétés associées
à cet objet
pour pouvoir le manipuler ou en extraire des informations.
Les chapitres précédents vous ont initié à la syntaxe VBA permettant
d’accéder
à un objet. Pour autant, lorsque vous commencerez à développer
dans Visual
Basic Editor, vous ne connaîtrez pas toujours le chemin à
emprunter pour
accéder à tel ou tel objet, ni la méthode à lui appliquer pour effectuer
telle ou
telle opération. L’Explorateur d’objets constitue pour cela une
aide très
appréciable pour le développeur, en supplément de l’Aide de VBA. Il
recense
en effet l’ensemble des objets disponibles dans les bibliothèques
d’objets
accessibles pour un projet, ainsi que les propriétés, constantes,
méthodes et
événements associés.
Définition
Une bibliothèque d’objets est un fichier contenant toutes les
données des objets (leurs propriétés,
méthodes, événements, constantes, etc.). Ce fichier porte
l’extension .OLB, et c’est à lui que se réfère
Visual Basic lorsque vous manipulez des objets Excel. Le nom de
fichier de la bibliothèque d’objets
d’Excel ainsi que son emplacement varient d’une version à
l’autre. Pour le localiser, effectuez une
recherche sur *.olb.
Lorsque vous recherchez un objet ou souhaitez en connaître les
membres –
c’est ainsi que l’on nomme les éléments Visual Basic (méthodes,
propriétés,
événements, constantes) associés –, l’Explorateur d’objets vous
fournit une
documentation complète. Il donne accès au modèle d’objets de
l’application
hôte, mais aussi à ceux d’autres applications et aux objets,
procédures et
constantes que vous avez créés dans le cadre de votre projet,
ainsi qu’aux
rubriques d’aide associées à chacun de ces éléments.
Afficher et masquer l’Explorateur d’objets
Pour afficher l’Explorateur d’objets, vous pouvez :
• sélectionner la commande Explorateur d’objets du menu Affichage ;
• taper le raccourci clavier F2 ;
• cliquer sur le bouton Explorateur d’objets de la barre d’outils
Standard de
Visual Basic Editor.
Bibliothè que
De scription
<Toutes
Lorsque cette option est sélectionnée, les objets sont affichés, toutes
bibliothèques
bibliothèques>
confondues.
Contient les objets accessibles dans la fenêtre UserForm, tels que les
boutons
MSForms
d’options, cases à cocher, listes déroulantes, etc.
Contient les objets Microsoft Office. Il s’agit des objets communs aux
applications
Office
Office.
Il s’agit de la bibliothèque Visual Basic pour Applications. Les objets y
sont
classés par thème. Par exemple, le module Information contient les
procédures
VBA
pour renvoyer et vérifier des informations et le module String contient
les
procédures effectuant des opérations sur des chaînes de caractères.
Excel
Contient les objets d’Excel.
Contient les objets des autres applications référencées dans votre
projet.
Référencer une autre application donne accès à ses objets à partir
d’Excel. Vous
Autres applications
verrez au chapitres 6 comment créer une référence à la bibliothèque
d’objets d’une
autre application et comment en manipuler les objets.
Affiche les objets propres au projet, tels que les feuilles, les modules
de classe et
Projets
les modules de code que vous avez créés.
Les zones Classes et Membres de
Lorsque vous sélectionnez un item dans la liste déroulante
Bibliothèque/Projet,
la zone Classes affiche l’ensemble des classes disponibles dans
cette
bibliothèque. Elles sont affichées par type et par ordre alphabétique au
sein de
chaque type. Chaque type de classe (feuille, module de code, module
de classe)
est symbolisé par une icône. Lorsqu’une classe contient du code
rédigé par
l’utilisateur, son nom apparaît en gras (voir figure 4-9).
Rechercher du texte
L’Explorateur d’objets offre un outil pour rechercher des chaînes de
caractères
dans les bibliothèques de votre choix. Procédez comme suit :
1. Dans la zone Bibliothèque/Projet, sélectionnez la bibliothèque
ou le projet
dans lequel vous souhaitez que la recherche s’effectue.
Si vous ne savez pas où chercher, sélectionnez <Toutes
bibliothèques>.
2. Dans la zone Rechercher texte, saisissez la chaîne de
caractères que vous
voulez.
Astuce
Si vous n’êtes pas certain de l’orthographe du texte à
rechercher, utilisez les caractères génériques
suivants :
• * toute chaîne ;
• ? tout caractère.
3. Cliquez sur le bouton Rechercher. La zone Résultats de la
recherche
s’affiche. Pour chacun des éléments trouvés, la bibliothèque, la classe
et le
membre sont indiqués (voir figure 4-12).
4. Si vous souhaitez afficher les résultats pour d’autres
bibliothèques,
modifiez simplement la sélection dans la zone Bibliothèque/Projet.
Les
résultats sont automatiquement mis à jour.
La fenêtre UserForm
La fenêtre UserForm sert à dessiner des boîtes de dialogue pour
vos projets.
Dans Visual Basic pour Applications, ces boîtes sont appelées
feuilles – on
parle aussi de formulaires. Une feuille peut être très simple, ou
présenter un
grand nombre de fonctionnalités (figure 4-14).
Le développement de feuilles est un aspect essentiel de la
programmation
VBA. Les chapitres 12 à 14 sont entièrement consacrés à ce sujet.
Cette section
présente sommairement les possibilités de développement dans la
fenêtre
UserForm.
On peut distinguer deux phases essentielles dans la création
d’une interface
utilisateur :
• le développement visuel de la feuille – traité au chapitres 12 ;
• l’association de code aux différents éléments de la feuille –
traitée aux
chapitres 13 et 14.
Figure 4-14 –Une feuille développée dans Visual Basic Editor.
Figure 4-15 –Les contrôles à placer sur une feuille sont les mêmes
que ceux
que vous rencontrez dans les applications Office.
Par défaut, la boîte à outils propose les contrôles les plus
couramment
rencontrés dans l’application hôte (voir figure 4-16)l’ordonnancement.
Figure 4-17 –Chacun des modules d’un projet possède une fenêtre
Code.
Figure 4-18 –La fenêtre Code est le cœur de Visual Basic Editor.
Pour masquer la fenêtre Code, cliquez sur la case de fermeture
ou cliquez-
droit dans la fenêtre et sélectionnez la commande Masquer du menu
contextuel
qui s’affiche.
Vous recherchez du texte dans la fenêtre Code comme vous le
feriez dans un
logiciel de traitement de texte tel que Word. Procédez comme suit :
1. À partir d’une fenêtre Code, sélectionnez la commande Rechercher
du menu
Édition, tapez le raccourci clavier Ctrl+F ou cliquez sur le bouton
Rechercher de la barre d’outils Standard de Visual Basic Editor.
La boîte de dialogue représentée à la figure 4-24 s’affiche.
Figure 4-24 –La boîte de dialogue Rechercher de Visual Basic Editor
propose
des options communes à l’essentiel des traitements de texte.
2. Dans la zone Rechercher, saisissez le texte voulu.
3. Dans la zone Dans, sélectionnez la portée de la recherche :
– Procédure en cours. La recherche ne porte que sur le texte de
la
procédure en cours, c’est-à-dire celle dans laquelle se trouve le
curseur ;
– Module en cours. La recherche porte sur l’ensemble du module en
cours,
c’est-à-dire le texte de la fenêtre Code active ;
– Projet en cours. La recherche porte sur l’ensemble des modules
du
projet, que leurs fenêtres de code respectives soient ouvertes ou non ;
– Texte sélectionné. La recherche porte sur la plage de texte
sélectionnée
dans la fenêtre active.
4. Dans la liste déroulante, sélectionnez le sens dans lequel
s’effectuera la
recherche par rapport à l’emplacement du curseur : vers le haut, vers
le bas
ou dans les deux sens.
5. Cochez éventuellement les cases des options de recherche :
– Mot entier. Le mot est recherché en tant que mot entier et non en
tant que
suite de caractères faisant partie d’un autre mot ;
– Respecter la casse. La recherche porte sur le texte dont la
casse
(majuscules ou minuscules) est identique à celle du texte saisi
dans la
zone Rechercher ;
– Critères spéciaux. Lorsque cette case est cochée, vous pouvez
utiliser les
caractères génériques (?, *, #, [listedecar] et [!listedecar]) dans
la zone
Rechercher.
6. Cliquez sur le bouton Suivant.
Si la recherche aboutit, le texte trouvé s’affiche en surbrillance
dans la
fenêtre Code. Si la recherche porte sur le projet entier et si la
chaîne est
trouvée dans un autre module, la fenêtre de Code de ce module est
ouverte.
Pour atteindre une autre occurrence du texte, cliquez de nouveau
sur le
bouton Suivant.
Si le texte recherché n’est pas trouvé, un message vous l’indique.
Pour fermer la boîte de dialogue, cliquez sur le bouton Annuler
ou sur sa
case de fermeture.
Astuce
Une pression sur la touche F3 ou la commande Suivant du menu
Édition relance la dernière recherche
effectuée sans ouvrir la boîte de dialogue Rechercher.
Pour remplacer du texte, procédez comme suit :
1. Sélectionnez la commande Remplacer du menu Édition ou
tapez le
raccourci clavier Ctrl+H. Si la boîte de dialogue Rechercher est
ouverte,
cliquez sur le bouton Remplacer. La boîte de dialogue de la
s’affiche.
Figure 4-25 –La boîte de dialogue Remplacer.
2. Indiquez le texte à rechercher et définissez l’étendue, le sens et les
options
de recherche. Dans la zone Remplacer par, saisissez le texte de
remplacement.
3. Si vous souhaitez effectuer le remplacement sur toutes les
occurrences du
texte recherché, cliquez sur Remplacer tout.
Une boîte de dialogue vous indique le nombre de remplacements
effectués.
4. Pour visualiser les occurrences de texte trouvées avant
d’effectuer le
remplacement, cliquez sur le bouton Suivant pour lancer la
recherche.
Lorsque le texte est trouvé, il apparaît en surbrillance dans la fenêtre
Code.
Pour remplacer l’occurrence sélectionnée, cliquez sur le bouton
Remplacer.
Le texte est remplacé et la recherche se poursuit. Pour
poursuivre sans
remplacement, cliquez sur le bouton Suivant.
Affichage de plusieurs fenêtres Code
Lorsque vous développerez dans Visual Basic Editor, vous vous
déplacerez
souvent entre les codes de différents éléments de votre projet,
voire
échangerez des instructions d’une fenêtre à l’autre pour vous
épargner une
nouvelle saisie. Pour passer d’une fenêtre Code à l’autre, ouvrez
le menu
Fenêtre de la barre de menus de Visual Basic Editor et sélectionnez
celle que
vous souhaitez passer au premier plan.
Pour afficher simultanément plusieurs fenêtres Code, procédez comme
suit :
1. Placez-vous dans l’Explorateur de projet et ouvrez les fenêtres
de code
concernées.
2. Sélectionnez Mosaïque horizontale (voir figure 4-26) ou
Mosaïque
verticale (voir figure 4-27) du menu Fenêtre.
Figure 4-37 –La barre d’outils Standard propose les fonctions les plus
communes de Visual Basic Editor.
Figure 4-38 –La barre d’outils Édition sert à obtenir de l’aide, mettre
en
forme le texte et s’y déplacer.
Figure 4-39 –La barre d’outils Débogage sert à tester le
comportement d’un
programme.
Figure 4-40 –La barre d’outils UserForm propose des outils pour
organiser
les contrôles sur une feuille.
Cette section présente la barre d’outils Standard. Vous
découvrirez les autres
barres au fur et à mesure de la lecture de cet ouvrage.
Afficher, masquer et déplacer une barre d’outils
Cliquez-droit sur une barre d’outils ou sur la barre de menus de
la fenêtre
Visual Basic Editor, ou encore sélectionnez la commande Barre
d’outils du
menu Affichage, puis choisissez la barre à afficher (cochée) ou
masquer
(décochée).
Une fenêtre est dite ancrée lorsqu’elle est fixée à la bordure d’une
autre (celle de l’application ou une
autre fenêtre elle-même ancrée).
Une fenêtre ancrée demeure au premier plan. Si vous maximisez
une fenêtre
dans Visual Basic Editor, celle-ci viendra épouser la fenêtre
ancrée, sans en
recouvrir l’espace. Vous pouvez ainsi tirer pleinement parti de
l’espace de
Visual Basic Editor. À la figure 4-42, nous avons ancré l’Explorateur de
projet
et maximisé une fenêtre Code.
Les fenêtres ancrables sont les suivantes :
• Exécution ;
• Variables locales ;
• Espions ;
• Explorateur de projet ;
• Propriétés ;
DEUXIÈME PARTIE
Programmer en Visual
Basic
5
Développer dans Visual Basic Editor
Les chapitres précédents vous ont permis d’acquérir les concepts
essentiels et
de découvrir l’environnement de développement Visual Basic Editor.
Avec ce
chapitre, nous entrons de plain-pied dans la programmation VBA.
Vous apprendrez à distinguer les composants essentiels et à
déterminer les
besoins de votre projet. Vous serez ainsi à même de le
structurer de façon
cohérente, lui assurant efficacité et lisibilité. Gardez à l’esprit que
les projets
sont attachés à une application hôte, ici Excel. Vous devez donc ouvrir
Visual
Basic Editor à partir d’Excel. Le classeur auquel est affecté (ou
auquel vous
souhaitez affecter) votre projet doit aussi être ouvert.
Structure des programmes Visual Basic
Les projets VBA sont constitués d’objets distincts, dont l’ensemble
constitue un
programme entier.
Les modules
Comme vous l’avez vu en découvrant l’Explorateur de projet, on
distingue les
modules standards ou modules de code, les modules de classe
et les feuilles.
Autrement dit, les différents composants du code d’un projet VBA
sont
structurés et distingués selon leur type. Ces éléments
interagissent et
s’appellent pour constituer un programme complet.
Le code décrivant l’interface d’un programme et celui affecté aux
différents
événements qui peuvent toucher cette interface (un clic de souris sur
un bouton
OK, par exemple) sont stockés dans un fichier UserForm. Pour chaque
feuille
d’un projet, il existe un objet UserForm accessible dans le dossier
Feuilles de
l’Explorateur de projet. Le projet de la figure 5-1 contient dix feuilles.
Figure 5-1 –À chaque feuille d’un projet est affecté un fichier dans le
dossier
Feuilles.
Le code standard se trouve dans des modules de code, stockés dans le
dossier
Modules, tandis que le code décrivant les objets développés pour votre
projet
est stocké dans le dossier Modules de classe.
Les procédures
À l’intérieur d’un même module, le code est structuré en
procédures. Une
procédure est une séquence d’instructions s’exécutant en tant
qu’entité. Cette
décomposition rend le code plus performant et plus lisible.
Par exemple, lorsqu’un projet VBA ouvre une boîte de dialogue (une
feuille),
pour chaque événement déclenché par l’utilisateur, l’application
vérifie s’il
existe une procédure (une unité de code) affectée à cet
événement dans le
module correspondant. Si tel est le cas, la procédure est exécutée.
C’est l’ensemble des procédures d’un projet, avec leurs interactions,
qui forme
un programme complet. Par exemple, l’événement clic de souris sur un
bouton
Vous pouvez par exemple définir une constante que vous nommerez
TVA et à laquelle vous affecterez
la valeur 0,186. Chaque fois que vous aurez besoin de cette
valeur dans votre programme, il vous
suffira d’utiliser le nom de la constante qui lui est affectée. Ainsi,
l’expression :
PrixHorsTaxe * TVA
sera équivalente à :
PrixHorsTaxe * 0.186
Rappel
Les variables sont définies par un nom autre qu’un mot-clé du
langage ; elles servent à stocker des
informations modifiées au cours de l’exécution du programme.
On distingue trois types d’instructions :
• Les instructions de déclaration : invisibles pour l’utilisateur, elles
servent à
nommer une variable, une constante ou une procédure. Le nom
attribué à un
élément dans l’instruction de déclaration sera ensuite utilisé pour
invoquer
cet élément tout au long du projet. Une instruction de déclaration peut
aussi
déterminer le type de l’élément déclaré.
Sub MaProcédure() est un exemple d’instr uction de déclar ation
utilisée pour
nommer la procédure MaProcédure. Dim Mavar As String est aussi une
instruction
de déclaration. L’instruction Dim sert à nommer la variable MaVar,
tandis que As
String en spécifie le type (une chaîne de car actèr es).
• Les instructions d’affectation : elles affectent une valeur ou une
expression à
une variable, à une constante ou encore à une propriété – et
contiennent
donc toujours l’opérateur =. L’exécution de ce type d’instructions
peut être
visible comme invisible pour l’utilisateur.
MaVar = 5 et MaVar = [Link] sont des exemples
d’instr uctions
d’affectation, attribuant respectivement une valeur et une
expression à la
variable MaVar.
Let est l’instr uction d’affectation de Visual Basic. Ainsi l’instr uction
MaVar = 5
peut aussi être écrite sous la forme Let MaVar = 5. Cependant,
elle est
facultative et généralement omise.
[Link]("C1") = "Arial" est une instr uction d’affectation
visible pour l’utilisateur puisqu’elle applique la police Arial à la cellule
C1
de la feuille Excel active – la valeur "Arial" est affectée à la propriété
Name de
l’objet Font de cette cellule.
• Les instructions exécutables : elles accomplissent des actions
(exécution
d’une méthode, d’une fonction). Elles comprennent également les
instructions de contrôle (traitées au chapitres 7).
MsgBox "Quel est le nombre de classeurs ouverts ?", vbOKOnly
+ vbInformation, "Bonne
question" est une instr uction exécutable entr aînant l’affichage de
la boîte de
dialogue représentée à la figure 5-2. L’instruction MsgBox est
étudiée au
chapitres 7.
Figure 5-2 –Les instructions MsgBox sont des instructions
exécutables.
La procédure suivante illustre l’utilisation conjointe des différents
types
d’instructions :
Sub AfficherNbreClasseursOuverts()
Dim NbreClasseurs As Byte
NbreClasseurs = [Link]
MsgBox "Il y a actuellement " & NbreClasseurs & _
" classeurs ouverts.", vbOKOnly + vbInformation, "Informations"
End Sub
Cette procédure affiche une boîte de dialogue indiquant le nombre de
classeurs
ouverts dans la session Excel active (voir figure 5-3).
Figure 5-3 –Dans une procédure, les instructions exécutables sont les
seules
visibles pour l’utilisateur.
Les
deux
premières
instructions
sont
des
déclarations
nommant
successivement la procédure AfficherNbreClasseursOuverts et la
variable NbreClasseurs.
La valeur représentant le nombre de documents ouverts est
ensuite stockée
dans la variable NbreClasseurs dans l’instruction d’affectation de la
ligne suivante.
Enfin, l’instruction d’exécution MsgBox affiche une boîte de dialogue
indiquant à
Lorsqu’un argument est passé par référence, c’est son adresse qui est
transmise. La procédure exploite alors la valeur de la variable, mais
peut aussi la modifier.
ByVal ou ByRef
Par défaut (lorsque ces mots-clés sont omis), le passage d’un
argument
se fait par référence.
Dans l’exemple suivant :
Sub MaProcédure(ByVal MaVar)
MaVar = MaVar * 100
End Sub
la valeur de la variable passée MaVar est multipliée par 100 dans
MaProcédure, mais MaVar étant passée par valeur, son contenu réel ne
sera pas modifié.
Ce mot-clé indique que l’argument est un tableau Optional. L’argument
déclaré avec ce mot-clé doit être en dernière position dans la liste des
ParamArray
arguments et ne peut utiliser conjointement l’un des mots-clés
précédemment décrits dans ce tableau.
Spécifie le type de l’argument passé à la procédure : Byte, Boolean,
Integer, Long, Currency, Single, Double, Date, String, Object,
Variant, ou un type défini par l’utilisateur. U ne erreur est générée si la
variable passée par la procédure appelante est incompatible avec le
type déclaré.
As Type
L’instruction de déclaration de MaProcédure suivante indique qu’un
argument Arg1 de type String (chaîne de caractères) est requis :
Sub MaProcédure(Arg1 As String)
Les différents types de données ainsi que la création de types
personnalisés sont étudiés au chapitres 6.
Indique une valeur par défaut pour l’argument. Ce paramètre ne peut
être utilisé que conjointement avec le mot-clé Optional. Il détermine
une valeur par défaut, qui sera employée si l’argument n’est pas passé
par la procédure appelante.
Il peut s’agir d’une constante (numérique, booléenne ou de type
chaîne
= ValeurParDéfaut
de caractères) ou d’une expression constante. Une expression
renvoyant
une valeur variable ne peut être utilisée.
Dans l’exemple suivant, si l’argument Arg1 n’est pas passé par la
procédure appelante, sa valeur sera la chaîne "Bonjour".
Sub MaProcédure(Arg1 = "Bonjour")
Attention
Si, dans la déclaration d’une procédure Sub, vous indiquez des
arguments facultatifs à l’aide du mot-
clé Optional sans spécifier de valeur par défaut, la procédure devra
être conçue pour s’exécuter sans
faire appel à ces arguments lorsqu’ils ne sont pas transmis.
Dans le cas contraire, une erreur sera
générée.
Le programme suivant illustre l’utilisation du mot-clé Static dans
une
instruction Sub :
Dim MaVar
Sub ProcédureAppelante()
MaVar = 2
Call ProcédureStatic(MaVar)
Call ProcédureStatic(MaVar)
Call ProcédureStatic(MaVar)
End Sub
Static Sub ProcédureStatic(MaVar)
Dim MaVarStatique
MaVarStatique = MaVarStatique + MaVar
MsgBox MaVarStatique
End Sub
ProcédureAppelante invoque à tr ois r epr ises ProcédureStatic à
l’aide de l’instr uction
Call, en lui passant la var iable MaVar dont la valeur est 2. À
chaque appel,
ProcédureStatic incr émente la var iable MaVarStatique de la valeur
de MaVar et affiche
sa valeur dans une boîte de dialogue à l’aide de la fonction MsgBox. La
procédure
appelante reprend alors la main (et invoque à nouveau la
procédure
ProcédureStatic).
Ce programme affiche donc à trois reprises une boîte de
dialogue dont le
message est successivement 2, 4, puis 6. En effet, la procédure
appelée étant
déclarée Static, la variable locale MaVarStatique conserve sa
valeur entre deux
appels. Elle est incrémentée de 2 à chaque exécution de la procédure.
Définition
Une variable est dite locale lorsqu’elle est propre à une
procédure, par opposition à une variable
publique ou passée par la procédure appelante.
Si vous supprimez l’instruction Static de la déclaration de
ProcédureStatic, la
variable MaVarStatique ne conservera plus sa valeur entre les
différents appels et
le programme affichera à trois reprises une boîte de dialogue dont le
message
sera toujours 2.
Le programme suivant illustre le passage d’un argument par valeur :
Dim MaVar
Sub ProcédureAppelante()
MaVar = 2
Call ProcédureStatic(MaVar)
Call ProcédureStatic(MaVar)
Call ProcédureStatic(MaVar)
End Sub
Static Sub ProcédureStatic(ByVal MaVar)
Dim MaVarStatique
MaVarStatique = MaVarStatique + MaVar
MsgBox MaVarStatique
MaVar = 100
End Sub
Ce programme se comporte comme nous l’avons détaillé dans
l’exemple
précédent, mais ProcédureStatic affecte en plus la valeur 100 à
MaVar avant de
redonner la main à la procédure appelante. Néanmoins, le
programme
programme.
Les mots-clés Private et Public indiquent si la procédure est privée ou
publique.
Le mot-clé Static indique que les variables locales de la
procédure sont
statiques, c’est-à-dire conservent leurs valeurs entre les appels. Pour
un rappel
de ces concepts, reportez-vous à la section précédente, « Procédures
Sub ».
Arguments r epr ésente les ar guments, sépar és par des vir gules,
passés à Function par
la procédure appelante.
Sub MaFonction(arg1, arg2)
Dans cet exemple, MaFonction est déclarée comme nécessitant les
arguments arg1
et arg2. Autrement dit, la procédure appelante devra lui passer
ces arguments,
ou bien une erreur sera générée. Les appels de procédures et le
passage
d’arguments sont étudiés dans la section « Appel et sortie d’une
procédure »,
plus loin dans ce chapitre.
Chacun des arguments répond à la syntaxe suivante :
[Optional] [ByVal|ByRef] [ParamArray] NomVariable [As type]
[=ValeurParDéfaut]
Cette syntaxe est la même que pour les arguments d’une
instruction Sub ;
reportez-vous au tableau 5-1.
La procédure suivante calcule la surface d’un cercle :
Function SurfaceCercle(Rayon As Long) As Long
Const Pi = 3.14
SurfaceCercle = Pi * Rayon * Rayon
End Function
La première ligne déclare la fonction en indiquant que l’argument
Rayon est
requis. La fonction ainsi que l’argument attendu sont de type
Long. Une
constante Pi est ensuite définie. À la troisième ligne, on affecte
à la fonction
une expression calculant la surface du cercle dont on a transmis
le rayon.
Enfin, l’instruction End Function signale la fin de la procédure.
Les fonctions sont faciles à appeler à partir d’autres procédures. Vous
pouvez
les utiliser comme n’importe quelle fonction intégrée de Visual Basic,
c’est-à-
dire en faisant apparaître dans une expression son nom suivi de
la liste des
arguments requis entre parenthèses.
Considérez le programme suivant :
Sub MaProcédure()
Dim Rayon
Rayon = 10
MsgBox "La surface du cercle est de " & SurfaceCercle(Rayon) & "
centimètres
carré.", _
vbOKOnly + vbInformation, "Appel de fonction"
End Sub
Function SurfaceCercle(Rayon)
Const Pi = 3.14
SurfaceCercle = Pi * Rayon * Rayon
End Function
La sous-routine MaProcédure déclare la variable Rayon et lui
affecte la valeur 10.
Elle affiche ensuite une boîte de dialogue dont une partie du message
fait appel
à la fonction SurfaceCercle en lui passant l’argument Rayon. Cette
dernière calcule
donc la surface du cercle et rend la main à la procédure appelante, qui
affiche
la boîte de dialogue présentée à la figure 5-4.
Figure 5-4 –L’instruction MsgBox fait appel à la fonction
SurfaceCercle pour
afficher la surface du cercle.
Procédures Property
Une procédure Property (ou procédure de propriété) est une série
d’instructions
exécutant une tâche déterminée au sein du projet et manipulant des
données de
type Propriétés. Il existe trois types de procédures Property :
• Property Get. Elles renvoient la valeur d’une propriété qui
sera ensuite
exploitée par d’autres procédures.
• Property Let. Ces procédures définissent la valeur d’une propriété.
• PropertySet. Elles établissent une référence entre un objet et une
propriété.
Rappel
Une propriété est un attribut nommé d’un objet, définissant ses
caractéristiques ou son état. Par exemple,
la propriété Address d’un objet Range en renvoie l’adresse (A1,
par exemple) et la propriété
ColorIndex d’un objet Font (une police de caractères) en renvoie la
couleur.
Procédures Property Get
Une procédure Property Get est structurée de la façon suivante :
Property Get NomDeLaProcédure()
Instructions
…
NomDeLaProcédure = Expression
…
End Property
Les instructions Property Get et End Property déterminent le début
et la fin de la
procédure. NomDeLaProcédure doit respecter les règles
d’affectation de noms de
Visual Basic ; il est utilisé pour invoquer la procédure à partir d’une
autre.
Les Instructions définissent ce qu’exécute la procédure.
NomDeLaProcédure = Expression affecte une valeur à la
pr océdur e de pr opr iété. Cette
instruction d’affectation peut apparaître à plusieurs reprises et
n’importe où
dans le code de la procédure.
L’écriture d’une procédure Property Get se justifie lorsque la
valeur de la
propriété ne peut être renvoyée en une seule instruction Visual
Basic – par
exemple, lorsque l’on souhaite renvoyer sous forme de chaîne de
caractères
une propriété affectée à une constante.
La procédure de propriété suivante renvoie une chaîne de
caractères
représentant un commentaire, lequel est fonction de la valeur de la
cellule qui
lui est passée. Cette information est renvoyée par la propriété
Value de l’objet
Cellule.
1: Property Get RenvoyerCommentaire(Cellule As Range) As String
2: Select Case [Link]
3: Case Is < 10000
4: RenvoyerCommentaire = "Très mauvais"
5: Case 10000 To 20000
6: RenvoyerCommentaire = "Mauvais"
7: Case 20001 To 30000
8: RenvoyerCommentaire = "Correct"
9: Case 30001 To 40000
10: RenvoyerCommentaire = "Bon"
11: Case Is > 40000
12: RenvoyerCommentaire = "Très bon"
13: End Select
14: End Property
Attention
Ce listing est numéroté de façon à simplifier la présentation des
différentes instructions de la procédure
RenvoyerCommentaire. La présence de cette numérotation dans
la procédure réelle générerait
évidemment une erreur à l’exécution.
À la ligne 1, l’instruction Property Get déclare la procédure
RenvoyerCommentaire, qui
doit recevoir l’argument Cellule de type Range et qui renvoie une
valeur de type
String. Une instr uction de contr ôle Select Case est utilisée des lignes
2 à 13 pour
tester la valeur renvoyée par l’expression [Link]. Pour chacune
des plages
dans des modules cohérents, en réunissant celles qui ont des aspects
communs.
Ajouter un module
Vous serez probablement amené à développer des applications VBA
distinctes
au sein d’un même projet. Dans ce cas-là, il est important de regrouper
leurs
procédures dans des modules séparés. Si vous les stockez toutes
au sein d’un
même module, sans aucune distinction, vous risquez d’être
rapidement dépassé
par un nombre important de procédures dont vous serez
incapable de définir
les rapports.
Pour créer un module standard ou un module de classe, procédez
comme suit :
1. Lancez Visual Basic Editor à partir d’Excel (Alt+F11) – le document
hôte du
projet doit être ouvert.
2. Affichez l’Explorateur de projet (Ctrl+R). Si plusieurs projets
sont
accessibles, cliquez sur n’importe quel élément du projet auquel
vous
souhaitez ajouter un module, afin de l’activer.
3. Pour ajouter un module au projet actif et ouvrir sa fenêtre Code,
choisissez
l’une des trois méthodes suivantes :
– Cliquez-droit et, dans le menu contextuel qui s’affiche,
sélectionnez
Insertion. Dans le sous-menu, sélectionnez Module ou Module de
classe.
– Ouvrez le menu Insertion et choisissez la commande Module ou
Module
de classe.
– Cliquez sur la flèche du bouton Ajouter… de la barre d’outils
Standard.
Dans le menu qui s’affiche, sélectionnez Module ou Module de classe.
Le module inséré est automatiquement nommé : Module1 (ou
Module2 si
Module1 existe déjà…) pour un module standard et Class1 (Class2 si
Class1
existe déjà…) pour un module de classe.
4. Ouvrez la fenêtre Propriétés (F4) du nouveau module et donnez-lui
un nom
représentatif. Ce dernier, qui apparaît dans la barre de titre de
la fenêtre
Code et dans l’Explorateur de projet, est automatiquement mis à jour
(voir
figure 5-6).
Figure 5-6 –Choisissez des noms représentatifs pour vos modules.
Supprimer un module
Pour supprimer un module ou une feuille d’un projet, procédez comme
suit :
1. Sélectionnez ce que vous voulez supprimer dans l’Explorateur de
projet.
2. Cliquez-droit et, dans le menu contextuel qui s’affiche,
sélectionnez
Supprimer Module.
Visual Basic Editor affiche une boîte de dialogue vous proposant
d’exporter
le module avant la suppression (voir figure 5-7).
procédure.
Visual Basic considère le texte en tant que commentaire et
l’ignore lors de
l’exécution d’une procédure s’il est précédé :
• d’une apostrophe (’) ;
• du mot-clé REM.
Par défaut, les commentaires apparaissent en vert dans Visual
Basic Editor.
Pour en modifier la couleur d’affichage, reportez-vous à la section « Un
code
tout en couleurs », plus loin dans ce chapitre.
Utiliser l’apostrophe
L’utilisation de l’apostrophe pour marquer les commentaires
permet de les
placer à n’importe quel endroit du texte. Vous pouvez ainsi
insérer un
commentaire sur la même ligne que l’instruction concernée en
plaçant autant
d’espaces que vous le souhaitez entre celle-ci et l’apostrophe.
Cette façon de
faire est particulièrement intéressante et efficace pour les
instructions dont la
syntaxe est courte, puisqu’il est possible d’aligner les différents
commentaires
(figure 5-12).
Figure 5-12 –L’apostrophe permet d’aligner les commentaires.
Utiliser REM
La syntaxe REM joue le même rôle que l’apostrophe. Cependant,
contrairement à
celle-ci, le marqueur REM ne peut être accolé à l’instruction qu’il
commente
mais doit toujours être placé en début de ligne. Il sera donc
utilisé de
préférence pour commenter des blocs d’instructions (figure 5-13).
nombre d’espaces qui seront appliqués lors de la frappe de la
touche
Tabulation.
3. Cliquez sur OK pour valider les paramètres définis.
Pour augmenter ou diminuer simultanément le retrait de ligne de
plusieurs
instructions, sélectionnez celles-ci, puis cliquez sur le bouton Retrait ou
sur le
bouton Retrait négatif de la barre d’outils Édition.
Un code tout en couleurs
Toujours dans l’optique de faciliter l’interprétation du code, les
éléments
constitutifs d’une procédure sont affichés dans différentes
couleurs, chacune
identifiant une catégorie spécifique du langage. Par exemple, les
commentaires
sont affichés par défaut en vert, tandis que les mots-clés du
langage
apparaissent en bleu et les erreurs de syntaxe en rouge (voir figure 5-
15).
Figure 5-15 –Les couleurs, retranscrites ici en niveaux de gris,
déterminent les
catégories de texte et mettent en valeur les erreurs de syntaxe.
Pour définir vos propres paramètres d’affichage du texte dans la
fenêtre Code,
procédez comme suit :
1. Choisissez la commande Options du menu Outils, puis activez
l’onglet
Format de l’éditeur (voir figure 5-16).
2. Dans la zone Couleur de code, sélectionnez la catégorie dont vous
souhaitez
modifier l’affichage. Déterminez ensuite les options de votre choix
dans les
listes déroulantes suivantes :
– Premier plan. Définit la couleur de premier plan. Lorsque le
texte n’est
pas sélectionné, il s’agit de la couleur des caractères.
– Arrière-plan. Détermine la couleur d’arrière-plan.
– Indicateurs. Définit la couleur des indicateurs apparaissant en
marge,
pour les catégories du langage affichant ce type d’indicateur.
3. Modifiez éventuellement la police d’affichage du code dans la
liste
déroulante Police et dans la zone Taille.
4. Pour masquer la barre des indicateurs en marge, décochez la
case
correspondante. Vous gagnerez de l’espace pour afficher le code.
5. Cliquez sur OK pour valider les paramètres d’affichage définis.
Figure 5-16 –L’onglet Format de l’éditeur permet de personnaliser
l’affichage
du code.
Conseil
Les paramètres d’affichage du code tels qu’ils sont définis par défaut
dans Visual Basic Editor assurent
une lecture confortable à l’écran. Si vous souhaitez cependant
les personnaliser, veillez à conserver
cette qualité de lecture.
Macro or not macro ? Les macros sont des procédures Sub exécutables
de façon autonome, donc sans
arguments. Une procédure qui attend des arguments ne peut qu’être
appelée par une autre et n’apparaît
pas dans la liste des macros.
Vous pouvez aussi affecter un bouton de barre d’outils ou un
menu de
commande à une procédure Sub. L’activation de ce bouton ou
de ce menu
11.
Info
Si l’exécution d’un programme retourne une erreur, reportez-vous au
chapitres 10.
Aide à l’écriture de code
Visual Basic Editor met à votre disposition des outils d’aide à
l’écriture de
code. Pour les activer ou désactiver, choisissez la commande Options
du menu
Outils et activez l’onglet Éditeur. Cochez ou décochez ensuite les
options de la
zone Paramètres du code (voir figure 5-18). Si vous débutez
dans la
programmation en VBA, activez les options d’aide à l’écriture de code ;
elles
vous accompagneront dans votre apprentissage.
Vérification automatique de la syntaxe
Cette option entraîne la vérification automatique de la validité de
chaque ligne
de code saisie. Chaque fois que vous frappez la touche Entrée
ou que vous
changez de ligne, la ligne en cours est vérifiée. Si une erreur est
détectée, un
message la décrivant s’affiche et l’instruction invalide apparaît en
rouge (voir
figure 5-19).
Cliquez sur le bouton OK et corrigez l’erreur si elle vous apparaît
évidente, ou
choisissez le bouton Aide pour afficher la rubrique associée.
Celle-ci vous
présente les sources probables de l’erreur et vous propose des
solutions
adaptées. Dès que vous entrez une modification dans l’instruction
incriminée,
celle-ci retrouve sa couleur normale. Si l’erreur de syntaxe n’est pas
résolue,
le message s’affichera de nouveau lorsque vous changerez de ligne.
Figure 5-18 –Visual Basic Editor propose des outils d’aide à l’écriture
de
code.
Figure 5-19 –Vous êtes prévenu chaque fois qu’une erreur est
détectée.
L’instruction invalide est ici encadrée en gris.
Complément automatique des instructions
Cette option affiche une liste alphabétique de mots-clés possibles
chaque fois
que l’attente d’un complément est reconnue lors de l’écriture de code.
C’est par
exemple le cas lorsque vous saisissez un nom de propriété
appelant un objet,
directement suivi d’un point. Visual Basic Editor reconnaît alors
qu’un
membre de l’objet (propriété ou méthode) est attendu et en affiche la
liste (voir
figure 5-20).
Vous pouvez alors sélectionner l’un des éléments de la liste (souris ou
touches
fléchées, puis Espace pour valider), ou continuer à saisir votre code
sans tenir
compte de la liste affichée.
Figure 5-20 –L’option de complément automatique des instructions
affiche la
liste des mots-clés possibles.
Info express automatique
Chaque fois qu’une fonction intégrée de Visual Basic ou une procédure
Function
du module est reconnue, l’option Info express automatique en
affiche la
21).
Figure 5-21 –L’option Info express automatique affiche la syntaxe des
6
Variables et constantes
Les variables sont un élément essentiel de la programmation.
Elles servent à
stocker les informations de votre choix à tout moment de
l’exécution d’un
programme, pour les réexploiter à n’importe quel autre moment. Vous
pouvez,
par exemple, stocker le nombre de classeurs ouverts, le nom du
fichier, la
valeur ou l’adresse d’une cellule, les informations entrées par
l’utilisateur dans
une feuille VBA, etc.
Déclarer une variable
Pour créer une variable, vous devez la déclarer, c’est-à-dire lui
affecter un
nom qu’il suffira par la suite de réutiliser pour exploiter la valeur
qui y est
stockée. La déclaration de variables en VBA peut être implicite
ou explicite.
Autrement dit, les programmes VBA savent reconnaître une nouvelle
variable
sans qu’elle soit préalablement créée dans une instruction de
déclaration. Vous
pouvez aussi paramétrer Visual Basic Editor afin d’exiger la
déclaration
explicite des variables avant leur utilisation.
Déclaration implicite
Si la déclaration explicite des variables n’est pas requise, le simple fait
de faire
apparaître un mot non reconnu par le programme dans une
instruction
d’affectation suffira pour que ce nom soit considéré comme une
variable de
type Variant – les types de variables sont présentés plus loin
dans ce chapitre.
C’est le cas dans l’exemple suivant :
Sub DéclarImpliciteDeVariables()
MaVar = Range("D7").Value
MsgBox "La somme totale des transactions est " & MaVar, _
vbInformation + vbOKOnly
Instructions
End Sub
Le mot MaVar apparaît pour la première fois dans une instruction
d’affectation
Wend
End Sub
Cette procédure a pour but d’ouvrir dix classeurs en boucle. Le
nombre de
classeurs ouverts ([Link]) est affecté à la variable
MaVariable. Une
instruction While…Wend – que vous découvrirez dans le prochain
chapitre – est
utilisée pour créer un nouveau classeur () et ajouter 1 à
MaVariable
tant que la valeur de celle-ci est inférieure à 10. Cependant, le
nom de la
variable a été incorrectement saisi dans la condition. MaVarable
n’existant pas,
elle est créée, mais aucune valeur ne lui est affectée. La procédure
ouvre donc
des documents et incrémente MaVariable de 1 à l’infini, sans
que la condition
MaVarable<10 ne soit jamais r espectée.
Info
Pour interrompre une macro s’exécutant à l’infini, tapez la
combinaison clavier Ctrl+Pause.
Pour éviter ce type d’erreur, forcez la déclaration explicite des
variables. Pour
cela, placez-vous dans la section Déclarations de la fenêtre Code du
module et
saisissez-y l’instruction Option Explicit (voir figure 6-2).
Sub UtiliserDim()
Dim Message As String
Dim Boutons As Single
Dim Titre As String
Message = "La procédure est terminée."
Boutons = vbOKOnly + vbInformation
Titre = "C’est fini"
MsgBox Message, Boutons, Titre
End Sub
Figure 6-4 –Des variables peuvent être utilisées comme arguments
d’une
fonction.
Il est possible de déclarer plusieurs variables dans une même
instruction Dim,
selon la syntaxe suivante :
Dim NomVar1 As Type, NomVar2 As Type, …, NomVarn As Type
Les trois instructions de déclaration de l’exemple précédent peuvent
ainsi être
ramenées à une seule :
Dim Message As String, Boutons As Single, Titre As String
Gardez à l’esprit que pour affecter un type aux variables d’une
telle
instruction, celui-ci doit être mentionné pour chacune des variables
déclarées.
L’instruction suivante déclare une variable Message de type Variant et
une variable
Titre de type String :
Dim Message, Titre As String
Types de données des variables
Le type d’une variable détermine la nature de l’information qui
peut y être
stockée. Il peut s’agir d’une valeur numérique (un nombre ou une
expression
renvoyant un nombre), d’une chaîne de caractères, d’une date,
etc. La valeur
donnée à une variable dans une instruction d’affectation doit être
compatible
avec son type. Par exemple, déclarer une variable de type
numérique et lui
affecter par la suite une chaîne de caractères générera une erreur.
Sans précision lors de sa déclaration, la variable sera de type
Variant et
acceptera tous les types de données.
Chaînes de caractères
Les variables de type String – encore appelées « variables de chaîne »
– stockent
toute expression renvoyant une valeur de type chaîne (chaîne,
propriété,
fonction, etc.). Utilisez la syntaxe suivante :
Dim NomVariable As String
Une chaîne doit être placée entre guillemets. Si vous souhaitez
insérer des
guillemets dans une chaîne (ou tout autre caractère), utilisez
conjointement
l’opérateur de concaténation & et la fonction Chr selon la syntaxe
suivante :
"Chaîne de car." & Chr(codeANSI) & "Chaîne de car."
où codeANSI est le code ANSI du caractère à insérer.
Info
L’opérateur + peut aussi être utilisé. Préférez cependant l’opérateur &
pour concaténer des chaînes, afin
de les distinguer des additions de valeurs numériques qui, elles,
requièrent l’opérateur +.
Les instructions d’affectation suivantes sont toutes valides :
• Prénom = "Luc"
• NomFichier =
• Message = "Le nom du classeur actif est " & Chr(34) & & Chr(34) &
"."
La première instruction affecte une chaîne définie à la variable
Prénom. La
seconde affecte la valeur de la propriété Name du classeur actif
à la variable
NomFichier. La tr oisième conjugue l’affectation de chaînes définies
dans le texte,
renvoyées par une fonction et renvoyées par une propriété, en les
concaténant
à l’aide de l’opérateur &.
La macro suivante affiche la boîte de dialogue représentée à la figure
6-5.
Sub ConcatenerLesChaines()
Dim Message As String, Boutons As Single, Titre As String
Message = "Le nom du document actif est " & Chr(34) & _
& Chr(34) & "."
Boutons = vbInformation + vbOKOnly
Titre = "Concaténation de chaînes"
MsgBox Message, Boutons, Titre
End Sub
Figure 6-5 –Le message affiché par la fonction MsgBox est toujours
une
chaîne de caractères.
Les variables de chaîne définies précédemment sont dites de longueur
variable
et acceptent jusqu’à environ deux milliards de caractères. Vous
pouvez
cependant déclarer des variables de chaîne de longueur fixe,
autorisant de 1 à
65 400 caractères, selon la syntaxe suivante :
Dim NomVariable As String * longueur
Les variables de longueur fixe économisent la mémoire utilisée
par un
programme – et donc en améliorent les performances –, mais
elles doivent
être utilisée prudemment. En effet, si la chaîne affectée à une
variable de
longueur fixe dépasse la capacité de cette dernière, elle sera
purement et
simplement rognée. Remplacez la déclaration de l’exemple
précédent par
celle-ci :
Dim Message As String*15, Boutons As Single, Titre As String*5
Vous obtenez la boîte de dialogue présentée à la figure 6-6.
Figure 6-6 –Utilisez les variables de chaîne de longueur fixe avec
prudence.
Valeurs numériques
Les variables numériques stockent des valeurs sur lesquelles vous
pouvez
effectuer des opérations arithmétiques. Il existe plusieurs types
de variables
numériques (tableau 6-1). Elles se distinguent par l’échelle des valeurs
qu’elles
acceptent et par la place qu’elles occupent en mémoire.
Tableau [Link] de données numériques
Mé moire
Type s de donné e s
Vale urs acce pté e s
occupé e
Byte (octet)
Nombre entier, compris entre 0 et 255
1 octet
Integer (entier)
Nombre entier compris entre –32 768 et 32 767
2 octets
Nombre entier compris entre –2 14 7 4 83 64 8 et 2
Long (entier long)
4 octets
14 7 4 83 64 7
Nombre à virgule flottante compris entre –
Single (simple précision)
1,4 01298E-4 5 et –3,4 02823E38 ou entre
4 octets
1,4 01298E-4 5 et 3,4 02823E38
Nombre à virgule flottante compris entre –
1,797693734 86232E308 et –
Double (double précision)
4 ,94 06564 584 124 7E-324 ou entre
8 octets
4 ,94 06564 584 124 7E-324 et
1,797693734 86232E308
Nombre à virgule fixe, avec quinze chiffres pour
la partie entière et quatre chiffres pour la partie
Currency (monétaire)
8 octets
décimale, compris entre –922 337 203 685
4 77,5808 et 922 337 203 685 4 77,5807
Si votre programme exploite beaucoup de variables, l’affectation à
chacune du
type approprié (celui qui exploite le moins d’espace mémoire) en
améliorera
les performances. Veillez cependant à ce que les valeurs qu’une
variable est
susceptible de prendre soient toujours couvertes par le type
accepté par la
variable. Par exemple, si une valeur supérieure à 255 ou
inférieure à 0 est
affectée à une variable de type Byte, une erreur sera générée (voir
figure 6-7).
Figure 6-7 –Le type d’une variable doit couvrir l’ensemble des valeurs
possibles lors de l’exécution du programme.
Attention
Utilisez le point comme séparateur décimal dans le code VBA.
L’utilisation de la virgule génère une
erreur.
Une variable numérique peut être concaténée avec une chaîne
de caractères à
l’aide de l’opérateur &. Il est aussi possible de l’affecter à toute
expression
renvoyant une valeur numérique (chaîne, propriété, fonction, etc.)
et
d’effectuer des opérations à l’aide des opérateurs arithmétiques
présentés dans
le tableau 6-2.
Tableau [Link] opérateurs arithmétiques
Opé rate ur
De scription
+
Addition
–
Soustraction
*
Multiplication
/
Division
Division. Seule la partie entière du résultat est renvoyée (l’opération
18\5
\
retournera la valeur 3).
^
Élévation à la puissance (2^4 renvoie 16).
À condition que le type de la variable numérique couvre les
valeurs qui lui
sont affectées, les instructions suivantes sont toutes valides :
• MaValeur = 58
• NbreClasseur = [Link]
• Range("D5").Value = (Range("D3").Value + Range("D4").Value) / 2
• SurfaceCercle = (varRayon^2) * 3.14
La première instruction affecte une valeur définie à la variable
MaValeur. La
deuxième affecte la valeur de la propriété Count de l’objet (la
collection)
Workbooks (le nombr e de classeur s ouver ts). La tr oisième
utilise l’opér ateur +
pour additionner les valeurs des cellules D3 et D4, puis
l’opérateur / pour
diviser la valeur obtenue par deux. La dernière instruction élève
au carré la
variable varRayon à l’aide de l’opérateur ^, puis multiplie le
résultat par 3,14 à
l’aide de l’opérateur *.
En revanche, l’instruction suivante affecte une valeur de type
chaîne à la
variable numérique MaVar et génère une erreur (voir figure 6-8).
Sub ErreurAffectation()
Dim MaVar As Byte
MaVar =
End Sub
Figure 6-8 –Une chaîne de caractères ne peut être affectée à une
variable
numérique.
Rappelez-vous que les constantes sont en réalité des valeurs
numériques. Une
constante peut donc être affectée à une variable numérique et
entrer dans une
expression arithmétique. Veillez à ne pas utiliser l’opérateur &,
réservé à la
concaténation de chaînes. Par exemple, l’instruction :
MsgBox "Le message de la bdg", vbOKOnly + vbInformation, "Titre"
est valide, tandis que l’instruction :
compatible. Autrement dit, une variable de type Variant peut être
initialement
une chaîne de caractères, qui sera exploitée par la suite en tant
que valeur
numérique. Si les données qui lui sont affectées sont assimilables à
une valeur
numérique, la conversion se fera automatiquement, lorsque
l’instruction
assimilable à une opération numérique sera exécutée.
Si les variables de type Variant sont très pratiques, elles occupent un
espace en
mémoire plus important que les autres types et peuvent donc
ralentir
l’exécution du programme.
Une variable, une constante ou un argument dont le type n’est pas
déclaré est
par défaut de type Variant.
Les instructions suivantes sont équivalentes :
Dim MaVar
Dim MaVar As Variant
Variables de matrice
Une variable de matrice ou de type Array, encore appelée tableau, est
capable de
stocker plusieurs valeurs de même type, contrairement à une variable
ordinaire
ne pouvant recevoir qu’une seule valeur. Vous pouvez par
exemple y stocker
les chiffres d’affaires de tous les représentants. Pour déclarer une
variable de
matrice, utilisez la syntaxe suivante :
Dim NomVariable(NbreElements) As Type
Pour affecter des valeurs à une variable de matrice ou accéder à ces
dernières,
il suffit de spécifier la position de la valeur stockée dans la
variable. La
première valeur recevant l’index 0, la dernière valeur est
toujours égale au
nombre d’éléments contenus dans la variable moins 1.
Astuce
Pour démarrer l’index d’un tableau à 1 plutôt qu’à 0, placez
l’instruction Option Base 1 dans la
section Déclarations du module.
Une variable de matrice peut également être déclarée selon la
syntaxe
suivante :
Dim NomVariable(Début To Fin) As Type
où Début et Fin définissent la plage de valeurs qui sera utilisée
pour stocker et
accéder aux données de la variable.
Si une variable de matrice sert à stocker des données de même type, il
est alors
recommandé de déclarer un type approprié. Dans l’exemple suivant,
JoursSemaine
stocke sous forme de chaînes les jours de la semaine. Une structure de
contrôle
For…Next est ensuite utilisée pour afficher dans une boîte de
dialogue les valeur s
contenues par la variable.
Sub VarMatrice()
Dim JoursSemaine(7) As String
JoursSemaine(0) = "Lundi"
JoursSemaine(1) = "Mardi"
JoursSemaine(2) = "Mercredi"
JoursSemaine(3) = "Jeudi"
JoursSemaine(4) = "Vendredi"
JoursSemaine(5) = "Samedi"
JoursSemaine(6) = "Dimanche"
Dim compteur as Byte
For compteur = 0 To 6
MsgBox JoursSemaine(compteur)
Next compteur
End Sub
Une variable de matrice peut aussi stocker des données de types
différents. Elle
doit alors être de type Variant. La procédure suivante stocke
dans une seule
variable le nom, la date de naissance, l’adresse, la fonction et le
salaire d’un
employé. Ces données sont ensuite affichées dans une boîte de
dialogue (voir
figure 6-10).
Sub InfosEmployé
Dim Employé(1 To 5) As Variant
Employé(1) = "Jean Dupont"
Employé(2) = "25/12/71"
Employé(3) = "14, rue des Arts"
Employé(4) = "Chargé d’études"
Employé(5) = 2000
MsgBox Employé(1) & " est né le " & Employé(2) & ". Il habite " & _
Employé(3) & " et est " & Employé(4) & ". Son salaire est de : " & _
Employé(5) & " euros", vbOKOnly + vbInformation, "Infos employé"
End Sub
Astuce
Utilisez la fonction IsArray pour vérifier si une variable est de type
Array.
MonTableau(2,2) = Cells(3,3).Value
MonTableau(2,3) = Cells(3,4).Value
MonTableau(2,4) = Cells(3,5).Value
Etc.
Ainsi, pour accéder aux ventes d’un mois, il suffira de spécifier
la valeur
correspondante comme premier index de la variable MonTableau (1 =
janvier, 2 =
février, etc.). De manière similaire, la catégorie de ventes
correspond à une
valeur du second index (1 = Livres, 2 = Vidéo, 3 = Hi-Fi, 4 =
Autres). Par
exemple, MonTableau(1,1) renverra les ventes de janvier pour les
livres et
MonTableau(12,2) r enver r a les ventes de décembr e pour la vidéo.
N’hésitez pas à utiliser les variables de matrice pour stocker les
données d’une
feuille Excel auxquelles un programme VBA doit accéder à de
multiples
reprises. La variable ainsi créée est chargée en mémoire. L’accès aux
données
qu’elle contient est nettement plus rapide qu’un accès aux
valeurs contenues
dans les cellules d’une feuille de calcul.
L’utilisation d’une structure de contrôle For…Next servira à
affecter l’ensemble
des valeurs à une variable de matrice en quelques lignes de
code. Vous
apprendrez à utiliser cette structure au chapitres 7.
Info
Une variable de matrice n’est pas limitée à deux dimensions. Vous
pouvez parfaitement en créer une à
trois dimensions, ou plus.
Conseil
La fonction LBound (resp. UBound) renvoie le plus petit (resp. le plus
grand) indice disponible pour une
dimension spécifiée d’un tableau :
LBound(NomVariable, Dimension) et UBound(NomVariable, Dimension)
Si l’argument Dimension est omis, le plus petit ou le plus grand
indice de la première dimension est
renvoyé.
Variables de matrice dynamiques
Si vous ne spécifiez pas de valeur de taille entre les parenthèses qui
suivent le
nom de la variable de matrice, celle-ci sera dynamique :
Dim NomVariable()
Avant d’affecter des valeurs à la variable ainsi créée, vous
devrez la
redimensionner à l’aide de l’instruction ReDim, selon la syntaxe
suivante :
ReDim NomVariable(Début To Fin)
Vous pouvez utiliser le mot-clé ReDim pour redimensionner une
variable de
matrice autant de fois que vous le souhaitez. Ces variables sont
intéressantes
lorsque vous ne connaissez pas a priori la quantité de données
à stocker.
Supposez que, dans l’exemple précédent, la feuille de calcul des
ventes ne soit
pas annuelle, mais mensuelle. Le tableau s’enrichirait alors tous les
mois d’une
nouvelle ligne. Pour que votre programme fonctionne tout au long de
l’année,
vous devrez créer une variable de matrice de longueur variable :
1: Sub AffectationVariableArray()
2: Dim MonTableau() As Single
3: Dim DerniereLigne As Byte
4: DerniereLigne = Range("A2").End(xlDown).Row
5: Dim NbreDeLignes As Byte
6: NbreDeLignes = DerniereLigne - 1
7: ReDim MonTableau(NbreDeLignes,4)
8: Instructions d’affectation de valeurs à MonTableau
9: End Sub
Aux lignes 2 et 3, les variables MonTableau et DerniereLigne
sont déclarées.
L’instruction de la ligne 4 sert à affecter à DerniereLigne le numéro de
la dernière
ligne contenant des données. La fonction End renvoie l’objet Range
correspondant
à la dernière cellule non vide sous (xlDown) la cellule A2. La
propriété Row
renvoie le numéro de ligne de cet objet. La variable NbreDeLignes est
créée ligne
5. On lui affecte ensuite une valeur égale à DerniereLigne - 1, soit le
nombre de
lignes contenant des données à stocker dans la variable (la
première ligne ne
contenant que des intitulés de colonnes). À la ligne 7,
MonTableau est
redimensionnée de façon à accueillir l’ensemble des chiffres de
ventes de la
feuille.
Attention
Lorsque vous redimensionnez une variable de matrice, celle-ci est
réinitialisée et toutes les valeurs qui
y étaient stockées sont perdues. Pour les conserver, placez le
mot-clé Preserve devant l’instruction
ReDim. L’utilisation de ce mot-clé est cependant subordonnée à
certaines conditions :
• Vous ne pouvez redimensionner que la dernière dimension de la
variable.
• Vous ne pouvez pas modifier le nombre de dimensions du tableau.
• Vous ne pouvez qu’agrandir le tableau. Si vous le réduisez, toutes les
données seront perdues.
La fonction première du tableur étant d’effectuer des calculs sur
des données
affichées sous forme de tableaux, les variables de matrice sont
très utilisées
dans les programmes VBA pour Excel. En effet, en stockant les
données de
feuilles de calcul sous forme de variables, vous améliorez
sensiblement les
performances du programme.
Variables objets
Sub AccederObjetFerme()
Dim ObjetClasseur As Workbook
Set ObjetClasseur = _
GetObject("C:\Users\Nom_utilisateur\Desktop\")
End Sub
La fonction GetObject est particulièrement intéressante si des
données entrées
dans un classeur doivent être répercutées dans un ou plusieurs
autres. Vous
pouvez par exemple créer un programme VBA afin que, lorsqu’un
client vous
passe une commande, le classeur contenant les données du
stock soit mis à
jour. Si nécessaire, un message s’affichera pour prévenir l’utilisateur
qu’il est
temps de renouveler le stock, sans même qu’il sache qu’il existe
un classeur
des stocks. C’est ce que fait la procédure suivante, en supposant que
la valeur
du stock pour le produit commandé se trouve dans la cellule A13 du
classeur
.
1: Sub Commande()
2: ’Instructions
3: Dim StockRestant As Integer
4: Dim UnitésCommandées As Integer
5: UnitésCommandées = 50
6: StockRestant = VerifierEtMettreAJourStock(UnitésCommandées)
7: If StockRestant<0 Then
8: MsgBox "Le stock ne permet pas d’assurer la commande. " & _
"Le stock pour ce produit est de " & _
(StockRestant + UnitésCommandées) & " unités."
9: Exit Sub
10: Else
11: MsgBox "Commande effectuée. Le stock restant pour ce " & _
"produit est de " & StockRestant & " unités."
12: End If
13: ’Suite des instructions de la commande
14: End Sub
15: Function VerifierEtMettreAJourStock(QteCommande)
16: Dim ObjetStock As Workbook
17: Dim StockDispo As Integer
18: Set ObjetStock = GetObject("C:\Users\Nom_utilisateur\Desktop\")
19: StockDispo = [Link](1).Range("A13").Value
20: VerifierEtMettreAJourStock = StockDispo - QteCommande
21: If VerifierEtMettreAJourStock>=0 Then
22: [Link](1).Range("A13").Value = _
StockDispo - QteCommande
23:
24: End If
25: End Function
Attention
Veillez à personnaliser le chemin précisé pour la fonction GetObject à
la ligne 18, sinon cette macro ne
fonctionnera pas.
À la ligne 6, la procédure Commande appelle la fonction
VerifierEtMettreAJourStock en
lui passant la valeur de la variable UnitésCommandées. La valeur 50 a
été affectée à
Il est souvent nécessaire de vérifier que le type des données
entrées par
l’utilisateur dans une cellule ou dans une feuille UserForm est valide,
c’est-à-
dire qu’il correspond au type attendu. Si tel n’est pas le cas, il est
probable que
le programme génère une erreur. Celle-ci peut alors être évitée
en
convertissant le type de la variable.
Vérifier le type de données d’une variable
VBA intègre des fonctions vérifiant qu’une valeur correspond bien
au type
attendu. Elles sont présentées dans le tableau 6-3.
Tableau [Link] VBA vérifiant les types de données
Fonction
De scription
IsArray(MaVar)
Renvoie True si MaVar est une variable de matrice ; False dans le cas
contraire.
IsDate(MaVar)
Renvoie True si MaVar est une variable de date ; False dans le cas
contraire.
IsNumeric(MaVar)
Renvoie True si MaVar est un nombre ; False dans le cas contraire.
IsObject(MaVar)
Renvoie True si MaVar est une variable objet ; False dans le cas
contraire.
Renvoie True si l’argument optionnel MaVar est de type Variant et n’a
pas été
IsMissing(MaVar)
passé à la fonction ou à la procédure en cours.
Renvoie True si MaVar n’a pas été initialisée, c’est-à-dire si aucune
valeur ne lui a
IsEmpty(MaVar)
été affectée ; False dans le cas contraire. Valide uniquement pour les
variables de
type Variant.
Renvoie True si MaVar contient la valeur Null ; False dans le cas
contraire. Ne
confondez pas une variable contenant une valeur Null et une variable
qui n’a pas
IsNull(MaVar)
été initialisée et ne contient aucune valeur. Valide uniquement pour les
variables de
type Variant.
Renvoie True si MaVar stocke une valeur correspondant à l’un des
codes d’erreur
IsError(MaVar)
de VBA. False dans le cas contraire.
Vous pouvez également utiliser les fonctions VarType ou TypeName
pour connaître
le type d’une variable.
Utilisez VarType selon la syntaxe suivante :
MaVar = VarType(NomVar)
MaVar (de type Integer) r eçoit pour valeur une constante Visual Basic
indiquant le
type de la variable NomVar (vbInteger, vbDate, etc.). TypeName
s’utilise selon la même
syntaxe, MaVar =TypeName(NomVar), mais renvoie une chaîne de
caractères
représentant le type de la variable (voir tableau 6-4).
Tableau [Link] renvoyées par la fonction TypeName
Chaîne re nvoyé e
Variable
Type objet
CByte(MaVar)
Convertit MaVar en une variable de type Byte.1
CCur(MaVar)
Convertit MaVar en une variable de type Currency (monétaire).1
CDate(MaVar)
Convertit MaVar en une variable de type Date.1
CDbl(MaVar)
Convertit MaVar en une variable de type Double.1
CDec(MaVar)
Convertit MaVar en une variable de type Decimal.1
CInt(MaVar)
Convertit MaVar en une variable de type Integer.1
CLng(MaVar)
Convertit MaVar en une variable de type Long.1
CSng(MaVar)
Convertit MaVar en une variable de type Single.1
Convertit MaVar en une variable de type Variant. MaVar doit être une
valeur de
CVar(MaVar)
type Double pour les nombres et de type String pour les chaînes.
Convertit MaVar en une variable de type String. Si MaVar est un
booléen, CStr
CStr(MaVar)
renvoie Vrai ou Faux. Si MaVar est une date, CStr la renvoie sous forme
de chaîne.
Si MaVar est un nombre, CStr renvoie cette valeur sous forme de
chaîne.
1. MaVar doit être une valeur compatible avec le type de données vers
lequel s’opère la conversion. Par
exemple, si vous utilisez la fonction Cbyte, MaVar doit être une
valeur numérique comprise entre 0 et
255. Sinon, une erreur « Type incompatible » est générée.
Notez que MaVar peut être une variable ou toute expression valide.
Portée et durée de vie des variables
Outre leurs type et valeur, les variables et les constantes sont
caractérisées par
leur portée. Ce terme désigne son accessibilité pour les
procédures et les
modules du projet. Variables et constantes peuvent être accessibles à
une seule
procédure, à l’ensemble des procédures d’un module, ou encore à
l’ensemble
des modules du projet en cours. Les variables sont aussi caractérisées
par leur
durée de vie, c’est-à-dire le temps pendant lequel elles conservent leur
valeur :
seulement pendant l’exécution d’une procédure, ou bien pendant
toute
l’exécution du programme.
Portée de niveau procédure
Une variable/constante est dite de niveau procédure lorsqu’elle n’est
accessible
qu’à la procédure dans laquelle elle est déclarée.
Portée de niveau module privée
Une variable/constante est dite de niveau moduleprivée
lorsqu’elle est
document Word et enregistrez-le sur le Bureau de Windows, sous
le nom
.
Figure 6-14 –Activez la bibliothèque d’objets de l’application que
vous
souhaitez manipuler à partir de la boîte de dialogue Références.
Placez ensuite le code suivant dans un module Excel :
1: Sub InsereTableauDansFichierWord()
2: Dim MonDoc As Object
3: On Error Resume Next
4: Set MonDoc = GetObject(, "[Link]")
5: If [Link]<>0 Then [Link]
6: Set MonDoc = GetObject("C:\Users\Nom_utilisateur\Desktop\")
7: Dim MaPosition As [Link]
8: Set MaPosition = [Link](0,0)
9: Range:=MaPosition, NumRows:=3, NumColumns:=4
10:
11: Set MonDoc = Nothing
12:
13: End Sub
Attention
Veillez à personnaliser le chemin précisé pour la fonction GetObject à
la ligne 6, sinon cette macro ne
fonctionnera pas.
Exécutez la procédure, puis ouvrez le fichier Word. Un tableau
de quatre
7
Contrôler les programmes VBA
Visual Basic intègre des instructions orientant le comportement d’une
macro :
les structures de contrôle – on parle du flux de contrôle d’un
programme. La
connaissance et la maîtrise de ces structures constituent un
préalable
indispensable à la création de programmes VBA souples et
puissants, se
comportant différemment selon l’état du document et de l’application
au cours
de son exécution, ou suivant les informations fournies par l’utilisateur.
Ce chapitre aborde une à une les structures de contrôle de Visual
Basic. Leur
combinaison vous fera gagner un temps précieux dans vos
tâches les plus
communes comme les plus complexes. L’instruction GoTo et les
fonctions MsgBox
et InputBox, ainsi que la collection Dialogs, sont également
traitées dans ce
chapitre. Il ne s’agit pas de structures de contrôle, mais elles
servent aussi à
orienter le comportement des programmes VBA et à interagir
avec
l’utilisateur.
Répéter une série d’instructions : les boucles
Une boucle est un ensemble d’instructions se répétant en série
un certain
nombre de fois, ce nombre étant déterminé dans le code ou
indéterminé, en
fonction du contexte au moment de l’exécution du programme.
• Do…Loop et While…Wend généralisent une série d’instructions
particulières à
l’ensemble d’un document ; dans ce cas, ce sont l’état du document et
celui
de l’application qui déterminent le nombre de boucles réalisées.
• For…Next répète une série d’instructions sur un document un
nombre de fois
déterminé par l’utilisateur.
• For Each…Next exécute une série d’instructions sur tous les
objets d’une
collection.
La boucle While…Wend
macro, puis à ouvrir la fenêtre Code de la macro et à y insérer
la structure
While…Wend.
Nous utiliserons une structure While…Wend pour automatiser la
saisie
d’informations dans une feuille de calcul. Considérez le classeur
Representants
par departements représenté à la figure 7-1. Dans la feuille de
calcul active
(libellée Representants), les cellules de la ligne 3 contiennent chacune
le nom
d’un représentant et, en commentaire, ses initiales. Les colonnes
correspondantes contiennent les numéros des départements dont
chaque
représentant a la charge.
Figure 7-1 –La répartition des représentants par départements.
Le classeur Representants par clients, illustré à la figure 7-2,
contient la liste
des clients de la société (colonne A), la ville de chacun (colonne
B) et son
numéro (colonne D). Les deux premiers chiffres de ce dernier
correspondent
au département d’origine du client. La colonne C contiendra les
initiales du
représentant en charge du client. Nous profiterons de ce que ces deux
classeurs
ont en commun le numéro du département pour automatiser la mise à
jour de
la colonne C.
Figure 7-2 –La répartition des représentants par clients avant mise à
jour de
la colonne C.
La macro suivante extrait les deux premiers chiffres du numéro de
client. Elle
recherche ensuite cette valeur dans le classeur Representants par
departement,
de façon à identifier le représentant en charge du client, dont les
initiales sont
alors insérées dans la cellule correspondante de la colonne C. La
structure
While…Wend r épète cette pr océdur e en boucle. Chaque fois
que les initiales d’un
représentant ont été insérées, la cellule Numéro de client
suivante est activée.
La procédure s’exécute TANT QUE la cellule sélectionnée contient une
valeur.
1: Sub InsererInitialesRepresentants()
2: Dim ClasseurRepresentants As Workbook
3: Dim NumDepartement As String
4: Dim Colonne As Variant
5: Dim Initiales
6: Set ClasseurRepresentants = _
GetObject("C:\Users\Nom_utilisateur\Desktop\Representants par
")
7: Range("D4").Select
8: While [Link]<>""
9: NumDepartement = Left([Link],2)
10: Colonne =
[Link](1).Range("A4:I50").Find(What:=
NumDepartement, LookIn:=xlFormulas, LookAt:=xlWhole).Address
11: Colonne = Range(Colonne).Column
12: Colonne = CInt(Colonne)
13: Initiales = [Link](1).Cells(3,Colonne)
14: [Link](0,-1).Range("A1").Select
15: ActiveCell.FormulaR1C1 = Initiales
16: [Link](1,1).Range("A1").Select
17: Wend
18: Set ClasseurRepresentants = Nothing
Do
Série d’instructions
Loop Until Condition
Le programme suivant utilise une boucle Do While…Loop pour
supprimer les
doublons dans un classeur Excel (figures 7-4 et 7-5). On estime,
dans cette
première version, qu’il existe un doublon lorsque deux cellules de la
colonne
A contiennent les mêmes données. Le programme commence par
trier ces
dernières. Le contenu de chaque cellule de la colonne A est ensuite
comparé à
celui de la cellule suivante. S’ils sont identiques, la ligne de la cellule
courante
est supprimée.
1: Sub SuppressionDoublons()
2: Dim CelluleCourante As Range
3: Dim CelluleSuivante As Range
4: Set CelluleCourante = [Link]("A1")
5:
6: ’Tri des données sur la cellule A1
7: [Link]("A1").Sort key1:=Range("A1"), _
8: Order1:=xlAscending, Header:= xlGuess, OrderCustom:=1, _
9: MatchCase:=False, Orientation:=xlTopToBottom
10: ’Boucle
11: Do While IsEmpty(CelluleCourante) = False
12: Set CelluleSuivante = [Link](1,0)
13: If [Link] = [Link] Then
14: [Link]
15: End If
16: Set CelluleCourante = CelluleSuivante
17: Loop
18: End Sub
Lignes 2 et 3, les variables objets CelluleCourante et CelluleSuivante
sont déclarées.
CelluleCourante r eçoit ensuite un objet Range cor r espondant à
la cellule A1 de la
feuille active. L’instruction des lignes 7 à 9 trie les données. On
applique pour
cela la méthode Sort. Les arguments Key1 et Order1 définissent
respectivement le
premier critère de tri et l’ordre du tri. Header reçoit ici la constante
xlGuess (Excel
définit s’il y a ou non une ligne de titre et, dans l’affirmative, de quelle
ligne il
s’agit). OrderCustom reçoit la valeur 1 et le tri est donc « Normal ».
Enfin, MatchCase
et Orientation correspondent au respect de la casse lors du tri et à son
orientation
(ici de haut en bas).
Lignes 11 à 17, une boucle Do While…Loop est utilisée pour
tester toutes les
cellules. CelluleCourante est testée, puis reçoit la valeur stockée
dans
CelluleSuivante. La boucle s’exécute tant que CelluleCourante
n’est pas vide
[IsEmpty(CelluleCourante) = False].
Ligne 12, la propriété Offset est utilisée pour attribuer à
CelluleSuivante la case
en-dessous dans la même colonne. Lignes 13 à 15, une
instruction
conditionnelle supprime la ligne de CelluleCourante
([Link]) s’il y
a un doublon avec la cellule suivante. CelluleCourante reçoit
ensuite la cellule
5:
6: ’Tri des données sur la cellule A1
7: [Link]("A1").Sort Key1:=Range("A1"),
Order1:=xlAscending,
Key2:=Range("B1"), _
8: Order2:=xlAscending, Key3:=Range("C1"), Order3:=xlAscending,
Header:=xlGuess, _
9: OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
10: ’Boucle et test des cellules
11: Do While IsEmpty(Cellulecourante) = False
12: Set Cellulesuivante = [Link](1,0)
13: If [Link] = [Link] Then
14: If LignesIdentiques(Cellulecourante, Cellulesuivante, 3) = True
Then
15: [Link]
16: End If
17: End If
18: Set Cellulecourante = Cellulesuivante
19: Loop
20: End Sub
21:
22: Function LignesIdentiques(CellCourante As Range, Cellsuivante As
Range,
Num As Byte) As Boolean
23: LignesIdentiques = True
24: Dim compteur As Byte
25: ’boucle et test des Num colonnes
26: For compteur = 1 To Num
27: If [Link](0, compteur).Value <> [Link](0,
compteur).Value Then
28: LignesIdentiques = False
29: Exit For
30: End If
31: Next compteur
32: End Function
Ligne 14, la fonction LignesIdentiques est appelée et reçoit maintenant
une valeur
de type Byte pour l’argument Num (ici, 3).
La fonction LignesIdentiques contrôle ensuite Num cellules afin de
définir si la
ligne doit ou non être supprimée. Elle reçoit d’abord la valeur True. La
boucle
For…Next (lignes 26 à 31) s’exécute ensuite Num fois. Les cellules
testées à chaque
passage de la boucle correspondent à un déplacement de Num
cases vers la
droite. Si deux contenus différents sont décelés (ligne 27), la
valeur False est
affectée à LignesIdentiques et l’instruction Exit For entraîne la sortie de
la boucle.
Si les contenus des cellules comparées sont toujours identiques,
la boucle
prend fin après Num passages et la fonction garde la valeur True.
Boucle For…Next avec pas négatif
Le programme suivant supprime les lignes vides de la feuille active. Il
utilise
pour ce faire une structure For…Next avec un pas négatif de –1,
de façon à
parcourir l’ensemble des lignes de la feuille, de la dernière ligne
employée
jusqu’à la première.
1: Sub SupprLignesVides()
2: Dim DerniereLigne As Long
Figure 7-7 –Pour stocker les valeurs d’une feuille Excel dans une
variable de
matrice, utilisez des boucles For…Next imbriquées.
Dim MonTableau() As Single
1: Sub BouclesForNextImbriquées()
2: Dim DerniereLigne As Byte
3: DerniereLigne = Range("A2").End(xlDown).Row
4: Dim NbreDeLignes As Byte
5: NbreDeLignes = DerniereLigne - 1
6: ReDim MonTableau(NbreDeLignes,4)
7: Call AffecterValeursTableau(NbreDeLignes)
8: End Sub
9: Sub AffecterValeursTableau(DerniereLigneTableau)
10: Dim CompteurLignes As Byte
11: Dim CompteurColonnes As Byte
12: For CompteurLignes = 1 To DerniereLigneTableau
13: For CompteurColonnes = 1 To 4
14: MonTableau(CompteurLignes, CompteurColonnes) = _
Cells(CompteurLignes+1, CompteurColonnes+1)
15: Next CompteurColonnes
16: Next CompteurLignes
17: End Sub
La variable de matrice MonTableau() est déclarée dans la section
Déclarations du
module, afin d’être accessible à toutes les procédures de ce
dernier. La
procédure BouclesForNextImbriquées la redimensionne de sorte
qu’elle accueille
l’ensemble des données de la feuille Excel active. Pour un
descriptif des
instructions de cette procédure, reportez-vous à la section «
Variables de
matrice dynamiques » du chapitre précédent. Elle appelle ensuite la
procédure
AffecterValeursTableau en lui passant la valeur de la var iable
NbreDeLignes.
La procédure AffecterValeursTableau commence par créer deux
variables
écrit dans un document Word qui est ensuite imprimé. Nous utilisons
pour ce
faire deux structures For Each…Next. La première parcourt la
collection des
feuilles de travail ([Link]) du classeur, tandis
que la seconde y
est imbriquée et parcourt la collection des cellules de la zone courante
définie
à partir de la cellule A1 ([Link](1,1).[Link]).
Lorsque la
boucle imbriquée a fini de traiter les cellules de la zone courante de la
feuille
de travail en cours, la première structure For Each…Next reprend la
main et traite
donc l’objet Worksheet – la feuille de travail – suivant de la collection.
1: Public Sub ExtraireMesFormulesWord()
2: Dim MaFormule As String
3: Dim MaCellule As Range
4: Dim MaFeuille As Worksheet
5: Dim MonWord As Object
6: On Error Resume Next
7: Set MonWord = GetObject(, "[Link]")
8: If [Link]<>0 Then
9: Set MonWord = CreateObject("[Link]")
10: [Link]
11: End If
12: [Link] = True
13:
14: For Each MaFeuille In [Link]
15: With [Link]
16: = "Arial"
17: = True
18: = "13"
19: .TypeText "Formules de la feuille : " & & Chr(13)
20: = "11"
21: = False
22: End With
23: For Each MaCellule In [Link](1,1).[Link]
24: If [Link]=True Then
25: MaFormule = "{" & [Link] & "}"
26: [Link] "Cellule " & _
27: [Link](False, False, xlA1) & _
28: " : " & MaFormule & Chr(13)
29: End If
30: Next MaCellule
31: Next MaFeuille
32: End Sub
Lignes 2 à 5, les variables sont déclarées. Lignes 6 à 13, MonWord
reçoit l’objet
[Link]. Notez que la méthode GetObject est utilisée
avec un gestionnair e
d’erreurs afin de capturer l’erreur générée si Word n’est pas ouvert,
auquel cas
la méthode CreateObject crée une nouvelle instance de l’application
(ligne 9) et
l’objet Err qui reçoit l’erreur est réinitialisé (ligne 10). Lignes 12
et 13,
l’application Word s’affiche et un nouveau document est créé.
Lignes 14 à 31, la première boucle For Each…Next parcourt la
collection des
feuilles du classeur. Pour chacune, le document Word reçoit un
texte formaté
(lignes 15 à 22). Nous utilisons pour cela une structure With…End With
qui définit
End Sub
Figure 7-9 –Ce message s’affiche à chaque ouverture du classeur
effectuée
entre le 1er et le 7 décembre.
La valeur attachée à l’opérateur relationnel dans une condition
varie selon
l’objet de la comparaison ; il peut s’agir d’une chaîne de
caractères, d’un
nombre, ou encore d’une valeur booléenne.
Dans l’exemple suivant, l’instruction If assure que les conditions
nécessaires
au bon fonctionnement du programme sont réalisées (en
l’occurrence que
deux fenêtres de document sont ouvertes). Si ce n’est pas le
cas, un message
s’affiche à l’attention de l’utilisateur et l’instruction Exit Sub
entraîne la sortie
de la procédure.
Sub VérifierConditions
If [Link]<>2 Then
MsgBox "La macro ne peut être exécutée. " & _
"Deux classeurs doivent être ouverts."
Exit Sub
End if
’Instructions exécutées si deux classeurs sont ouverts
End Sub
Une structure If…Then…Else autorise un nombre indéterminé de
conditions. Vous
pouvez ainsi envisager les différents cas possibles dans une
situation
particulière et indiquer à la procédure les instructions à exécuter dans
chacun
de ces cas.
L’instruction répond alors à la syntaxe suivante :
If condition1 Then
Série d’instructions1
ElseIf condition2 Then
Série d’instructions 2
ElseIf condition3 Then
Série d’instructions 3
…
Else
Série d’instructions n
End If
Contrairement à ElseIf, l’instruction Else ne pose aucune condition
: elle
apparaît en dernière position, et les instructions qui lui sont
attachées sont
automatiquement exécutées si aucune des conditions posées
auparavant n’a été
réalisée. En revanche, si l’une des conditions posées par une
instruction If ou
ElseIf est r éalisée, la macr o exécute les instr uctions qui lui
sont attachées, puis
ignore tout le reste et se poursuit avec les instructions situées après
End If.
L’instruction ElseIf, comme Else, est facultative. Une instruction
conditionnelle
peut être composée d’une ou de plusieurs instructions ElseIf et ne pas
présenter
d’instruction Else, et inversement. La fonction suivante détermine
la valeur
d’une remise sur un achat, puis insère cette valeur ainsi que le
prix après
remise dans la feuille de calcul.
1: Sub CalculRemiseEtPrixDefinitif()
2: Dim PrixAvantRemise As Single, PrixDefinitif As Single
3: PrixAvantRemise = [Link]("C11")
4: PrixDefinitif = PrixAvecRemise(PrixAvantRemise)
5: [Link]("C13").Value = PrixDefinitif
6: End Sub
7: Function PrixAvecRemise(ValeurAchat)
8: Dim PourcentageRemise As Single
9: If ValeurAchat<=1000 Then
10: PourcentageRemise = 0
11: ElseIf ValeurAchat>1000 And ValeurAchat<=2000 Then
12: PourcentageRemise = 0.1
13: ElseIf ValeurAchat>2000 And ValeurAchat<=5000 Then
14: PourcentageRemise = 0.2
15: ElseIf ValeurAchat>5000 And ValeurAchat<10000 Then
16: PourcentageRemise = 0.25
17: Else
18: PourcentageRemise = 0.3
19: End If
20: [Link]("C12").Value = PourcentageRemise
21: PrixAvecRemise = ValeurAchat - (ValeurAchat *
PourcentageRemise)
22: End Function
La procédure CalculRemiseEtPrixDefinitif déclare les variables
PrixAvantRemise et
PrixDefinitif de type Single. PrixAvantRemise r eçoit la valeur de la
cellule C11 de la
feuille active. L’instruction de la ligne 4 appelle la fonction
PrixAvecRemise en lui
passant cette valeur.
La structure conditionnelle If…Then…Else des lignes 9 à 19
détermine
PourcentageRemise en fonction de ValeurAchat, et la valeur de
la r emise est insér ée
dans la cellule C12. Ligne 21, la fonction reçoit la valeur après remise,
c’est-à-
dire la valeur de ValeurAchat moins le prix de la remise
(ValeurAchat *
PourcentageRemise).
La procédure principale reprend ensuite la main. L’instruction de
la ligne 5
affecte alors à la cellule C13 la valeur de PrixDefinitif. La procédure
prend fin.
Info
Une instruction conditionnelle peut aussi s’écrire sur une seule ligne,
en utilisant deux points (:) comme
séparateurs entre les instructions à exécuter si la condition est
vérifiée. L’instruction End If est alors
omise :
If Condition Then Instruction1 : Instruction2 : … : InstructionN
Par exemple, l’instruction :
If .Italic()=True Then
.Italic()=False
End If
est aussi valide sous la forme :
If .Italic()=True Then .Italic()=False
Voici un exemple avec plusieurs instructions sur une même ligne :
If .Italic()=True Then .Italic()=False :
=True
Conditions imbriquées
Les conditions imbriquées permettent de prendre en considération
un grand
nombre de possibilités lors de l’exécution du programme.
L’exemple suivant est composé d’une première instruction
conditionnelle qui
vérifie si deux fenêtres sont ouvertes avant de s’exécuter. Nous
y avons
imbriqué une instruction conditionnelle, qui modifie la boîte de
dialogue
affichée en fonction du nombre de fenêtres ouvertes.
L’organigramme de la figure 7-10 présente la structure de cette macro.
Sub ConditionsImbriquées()
If [Link]<>2 Then
Dim Message As String
If [Link]<2 Then
Message = "Au moins deux documents doivent être ouverts."
Else
Message = "Seuls les deux documents concernés doivent être
ouverts."
End If
MsgBox Message, vbOKOnly + vbInformation, "Exécution impossible"
Exit Sub
End if
Instructions de la macro
End Sub
feuille du classeur .
La fonction CalculerValeurReduction utilise une structure Select Case
pour renvoyer
une valeur fonction de l’argument PrixCommande (ici la valeur de
la cellule D7).
Le mot-clé To est utilisé pour définir des plages de valeurs (0 à 999.99,
1000 à
1999.99, etc.). La procédure principale reprend ensuite la main.
Les instructions des lignes 5 et 6 servent à formater la chaîne stockée
dans la
variable Reduction. La fonction Len renvoie la longueur (le
nombre de
caractères) de Reduction, qui est stockée dans LongueurChaîne.
Si la chaîne
comprend trois caractères, un 0 est ajouté à la fin (0,1 et 0,4
deviennent
respectivement 0,10 et 0,40). Enfin, l’instruction de la ligne 7 affiche
une boîte
de dialogue informant l’utilisateur de la valeur de la remise qui sera
effectuée.
Info
Dans les instructions Visual Basic, c’est le point qui sert de
séparateur décimal dans les valeurs
numériques. Cependant, lorsque vous affichez une valeur
numérique sous forme de chaîne – comme
l’instruction de la ligne 7 de l’exemple précédent –, la virgule est
utilisée.
Définir l’instruction suivante avec GoTo
L’instruction GoTo oriente le déroulement d’une procédure vers
l’emplacement
spécifié par l’utilisateur, à tout moment de l’exécution. Cette
instruction
s’utilise avec une étiquette, c’est-à-dire une balise placée dans le
texte. La
syntaxe de GoTo est la suivante :
GoTo Etiquette
L’étiquette spécifiée après GoTo doit être placée au début d’une
ligne
indépendante, située avant l’instruction sur laquelle on veut
brancher la
procédure ; elle doit être immédiatement suivie des deux points
« : ». Une
instruction GoTo ne peut renvoyer qu’à une étiquette se trouvant
dans la même
procédure.
Les instructions GoTo compliquent la lecture du code. Préférez-
leur les
structures de contrôle.
Interagir avec l’utilisateur via des boîtes de dialogue
L’affichage de boîtes de dialogue au cours de l’exécution d’un
programme
renseigne l’utilisateur sur son déroulement, ou lui demande des
informations
qui en modifieront le cours. Deux fonctions affichent des boîtes de
dialogue :
1: Sub VerifierEcheances()
2: ’Vérifier qu’il existe une plage de cellules sélectionnée
3: Dim ZoneATester As String
4: ZoneATester = [Link]
5: If ZoneATester=Null Then
6: MsgBox "Sélectionnez la plage de cellules à tester.", _
vbOKOnly + vbInformation
7: Exit Sub
8: End If
9: ’Demander à l’utilisateur la date d’échéance
10: Dim DateEcheance As Variant
11: DateEcheance = InputBox("Indiquez la date d’échéance.", _
"Echéance des opérations en cours ", Date + 30)
12: DateEcheance = CDate(DateEcheance)
13: ’Tester toutes les cellules de la sélection
14: Dim CellTest As Range
15: For Each CellTest In Range(ZoneATester)
16: If IsDate(CellTest)=True Then
17: If [Link]>DateEcheance Then
18: [Link] = 6
19: End If
20: End If
21: Next
22: End Sub
La procédure commence par vérifier qu’une plage de cellules a
été
sélectionnée dans le classeur actif (lignes 2 à 8). Elle affecte
pour cela
l’adresse de la sélection en cours à la variable ZoneATester. Si aucune
zone n’est
sélectionnée (ZoneATester=Null), un message s’affiche à l’attention de
l’utilisateur
et l’instruction de la ligne 7 entraîne la sortie de la procédure.
La fonction InputBox demande ensuite à l’utilisateur d’indiquer
une date
d’échéance (ligne 11). La fonction Date est utilisée pour
déterminer la valeur
par défaut de la zone de texte. Elle renvoie la date du jour, à laquelle
on ajoute
30 jours. La chaîne renvoyée par la fonction InputBox est
stockée dans la
variable DateEcheance de type Variant. Ligne 12, la fonction
CDate convertit
DateEcheance en une var iable de type Date.
Attention
Si vous déclarez DateEcheance de type String, le programme
fonctionnera correctement, mais
l’instruction de conversion de type de données de la ligne 12 ne
modifiera rien. L’instruction
conditionnelle de la ligne 17 effectuera alors une comparaison entre
les chaînes de caractères, et non
entre les dates. Le programme se déroulera correctement, mais
produira des résultats erronés.
La procédure teste ensuite l’ensemble des cellules sélectionnées. Une
variable
objet de type Range est déclarée ligne 14. Lignes 15 à 22, une
structure de
contrôle For Each…Next est utilisée pour tester tous les objets Range
de la collection
contenue dans la sélection en cours.
L’instruction conditionnelle de la ligne 16 vérifie que la cellule traitée
contient
des données de type Date. Si ce n’est pas le cas, elle est ignorée et la
boucle se
poursuit avec la cellule suivante. Si les données sont de type Date,
la structure
conditionnelle des lignes 17 à 19 est exécutée : quand la valeur de la
cellule est
supérieure à DateEcheance, elle est peinte en jaune
(ColorIndex=6). La représente une feuille de calcul après passage
de la macro VerifierEcheances
(l’utilisateur a indiqué le 16/03/2017 pour date d’échéance).
Figure 7-14 –Les cellules dont la date est supérieure à l’échéance
indiquée
par l’utilisateur sont mises en évidence (cadre gris clair).
Attention
Si l’utilisateur clique sur le bouton Annuler ou sur le bouton de
fermeture d’une boîte de dialogue
affichée à l’aide de InputBox, la fonction renvoie une chaîne vide. Une
erreur pourra alors être générée
par le programme s’il tente de l’exploiter. Placez une instruction
If…Then…Else pour vérifier que la
valeur retournée par InputBox n’est pas une chaîne vide. Les
instructions suivantes pourront être placées
sous la ligne 11 du programme précédent, afin de mettre fin à
la procédure si l’utilisateur annule la
saisie d’une valeur.
If DateEcheance="" Then
Exit Sub
End if
De la même façon, si l’utilisateur saisit n’importe quoi d’autre
que la valeur attendue, le programme
pourra générer une erreur ou produire des résultats erronés. Utilisez
les instructions de contrôle de type
de données présentées au chapitres 6 pour vous assurer que les
informations fournies sont valides. Vous
apprendrez à gérer ces éventuelles erreurs au chapitres 10.
La méthode InputBox
L’objet Application d’Excel possède une méthode InputBox, que
vous pouvez
substituer à la fonction éponyme de Visual Basic. L’intérêt est
qu’elle permet
de spécifier le type de données qui sera renvoyé. Utilisez cette
méthode selon
la syntaxe suivante :
[Link](prompt, title, default, left, top, helpFile,
helpContextID, type)
Si vous ne spécifiez pas de valeur pour l’argument title, le titre par
défaut de la
boîte de dialogue sera « Entrée ». Les arguments nommés left et top
spécifient
l’emplacement de la boîte de dialogue sur l’écran au moment de son
affichage,
tandis que helpFile et helpContextID servent à associer des fichiers
d’aide à la boîte
de dialogue. Ils existent aussi pour la fonction InputBox de Visual
Basic.
L’argument de type Variant type est facultatif. Il peut prendre
l’une des valeurs
présentées dans le tableau 7-2 et détermine le type de données
renvoyé. La
méthode InputBox peut renvoyer plusieurs types de données définis ;
dans ce cas,
affectez à type la somme des valeurs correspondantes (tableau
7-2). Par
exemple, pour que l’utilisateur soit autorisé à indiquer un nombre
ou une
référence de cellules, vous lui affecterez la valeur 9 (1 + 8).
Tableau [Link] admises par l’argument type de la
méthode InputBox
d’Excel
Vale ur de Type
Type de donné e s re nvoyé par InputBox
0
Formule
1
Valeur numérique
2
Chaîne de caractères
4
Valeur booléenne (False ou True)
8
Référence de cellule (objet Range)
16
Valeur d’erreur
64
Tableau de valeurs
Conseil
Si l’information saisie par l’utilisateur dans la zone de texte ne
correspond pas au type de données
déclaré pour la méthode InputBox, une erreur sera générée.
Pensez à créer un gestionnaire d’erreurs
(voir chapitres 10).
L’autre avantage de la méthode InputBox d’Excel sur sa concurrente
Visual Basic
est de permettre à l’utilisateur de sélectionner une plage de
cellules avant de
cliquer sur le bouton OK. Il est ainsi possible de sélectionner un
classeur ou
une feuille spécifique, puis de sélectionner la plage voulue. Les
coordonnées
de celles-ci s’affichent alors dans la zone de texte de la boîte
de dialogue.
L’instruction suivante affiche une boîte de dialogue qui accepte
pour valeur
une référence de cellule. L’utilisateur est invité à sélectionner
une plage de
cellules dans la feuille active (voir figure 7-15).
Sub RenvoyerUnePlageAvecInputBox()
Dim MaPlage As Range
Set MaPlage = [Link](prompt:="Sélectionnez la plage de
cellules.", _
Title:="Contrôle des échéances", Left:=3, Top:=-80, Type:=8)
End Sub
Entraînez-vous ! Modifiez la procédure VerifierEcheances de façon
à inviter
l’utilisateur à sélectionner la plage de cellules à traiter, plutôt que de
traiter la
plage sélectionnée au moment de l’exécution de la macro.
Conseil
Lorsque vous utilisez la fonction InputBox d’Excel pour inviter
l’utilisateur à sélectionner une plage de
cellules, tirez profit des arguments Left et Top. Si la boîte de dialogue
s’affiche dans l’angle supérieur
gauche de la fenêtre, l’utilisateur n’aura pas besoin de la déplacer pour
sélectionner des cellules sur la
feuille.
Figure 7-15 –La zone de texte de la boîte de dialogue reflète la
sélection
effectuée sur la feuille Excel.
La fonction MsgBox
La fonction MsgBox affiche une boîte de dialogue présentant un
message et des
boutons de commande, pour donner une information à l’utilisateur ou
obtenir
une réponse à une question qui orientera l’exécution du
programme. Une
valeur de type Integer est renvoyée en fonction du bouton sur lequel
l’utilisateur
a cliqué, et stockée dans une variable pour être ensuite
exploitée par le
programme.
La fonction MsgBox s’utilise selon la syntaxe suivante :
Variable = MsgBox(prompt, buttons, title)
prompt est un ar gument nommé de type String, cor r espondant au
message affiché
dans la boîte de dialogue. buttons est un argument nommé de
type numérique
facultatif. Il détermine les boutons affichés dans la boîte de
dialogue, le
symbole identifiant le type du message (information, question,
etc.) et le
bouton par défaut. Si cet argument est omis, un seul bouton
libellé OK
s’affiche et aucune icône n’identifie le type du message. title est un
argument
nommé de type String facultatif, affiché dans la barre de titre
de la boîte de
dialogue. Si cet argument est omis, c’est le nom de l’application qui
apparaît.
L’argument buttons est défini par la somme des valeurs choisies
pour chacun
des groupes présentés dans le tableau 7-3. Votre code gagnera
cependant en
lisibilité si vous utilisez les constantes VBA intégrées plutôt que
des valeurs
numériques.
Tableau 7-3.Définition de l’argument buttons
Constante
Vale ur
De scription
Bouton
vbOKOnly
0
OK
vbOKCancel
1
OK et Annuler
vbAbortRetryIgnore
2
Abandonner, Réessayer et Ignorer
vbYesNoCancel
3
Oui, Non et Annuler
vbYesNo
4
Oui et Non
vbRetryCancel
5
Réessayer et Annuler
Symbole
vbCritical
16
Message critique
vbQuestion
32
Question
vbExclamation
4 8
Stop
vbInformation
64
Information
voit affecter la valeur False. Ligne 18, une instruction lui affecte la
valeur True si
une date supérieure à celle spécifiée par l’utilisateur est trouvée.
La mise en valeur des éventuelles cellules hors échéance
terminée, une
instruction conditionnelle If…Then…Else est utilisée pour afficher
un message
(lignes 22 à 30). Si DateHorsEcheance renvoie True (des cellules
contenant des dates
au-delà de celle spécifiée par l’utilisateur sont trouvées), les
instructions des
lignes 23 à 28 sont exécutées. La boîte de dialogue représentée à la
est alors affichée. La valeur renvoyée par la fonction MsgBox est
stockée dans la
variable RedéfinirLaDate. Une structure conditionnelle imbriquée en
teste ensuite
la valeur. Si elle renvoie vbYes (l’utilisateur a cliqué sur le
bouton Oui), la
couleur d’intérieur des cellules de la zone sélectionnée est
supprimée (ligne
26) et la fonction s’appelle elle-même (ligne 27). Si
DateHorsEcheance renvoie
False, une boîte de dialogue s’affiche (ligne 29) afin d’infor mer
l’utilisateur
qu’il n’y a pas de problème.
Définition
Une procédure qui s’appelle elle-même est dite récursive.
Figure 7-19 –L’utilisateur peut redéfinir une date d’échéance.
Affichage de boîtes de dialogue Excel
Il peut être utile d’afficher des boîtes de dialogue Excel à un
moment
spécifique de l’exécution d’un programme, si l’on veut par
exemple que
l’utilisateur puisse indiquer le dossier d’enregistrement d’un classeur.
Les boîtes de dialogue prédéfinies d’Excel
Les boîtes de dialogue sont des objets Dialog. Pour en afficher une,
faites appel
à la collection Dialogs et appliquez la méthode Show ou Display
à l’objet défini
selon la syntaxe suivante :
[Link](xlDialog).Show
[Link](xlDialog).Display
xlDialog est une constante Excel qui indique la boîte à afficher.
Par exemple, l’instruction suivante affiche la boîte de dialogue Ouvrir :
[Link](xlDialogOpen).Show
Lorsqu’une boîte de dialogue Excel s’affiche à l’aide de la
méthode Show, les
commandes qu’elle prend en charge s’exécutent normalement si
l’utilisateur
valide les paramètres qu’il y a définis. En revanche, la méthode
Display affiche
la boîte de dialogue et permet de récupérer les informations au
moment de la
validation par l’utilisateur, sans en exécuter les commandes. La
procédure se
poursuit ensuite avec l’instruction située derrière celle qui a appelé la
boîte de
dialogue.
Vous pouvez évidemment affecter un objet Dialog à une variable
de type Object
ou Variant et faire appel à cet objet pour afficher la boîte en
question. Les
instructions suivantes affichent la boîte de dialogue Enregistrer sous.
Dim BoîteEnregistrerSous as Dialog
Set BoîteEnregistrerSous = [Link](xlDialogSaveAs)
Boî
Vous trouverez une liste des constantes xlDialog dans l’aide de VBA
pour Excel.
Référez-vous à la rubrique Références pour Microsoft
Excel/Objets/Dialogs.
Les méthodes GetOpenFilename et GetSaveAsFilename
Les méthodes GetOpenFilename et GetSaveAsFilename d’Excel
affichent les boîtes de
dialogue standards Ouvrir et Enregistrer sous afin de récupérer le
nom d’un
fichier. Celles-ci sont plus souples et plus fonctionnelles que les objets
Dialogs
correspondants.
Attention
Contrairement à ce qui se passe lorsque vous appliquez la méthode
Show à un objet Dialog, quand une
boîte de dialogue s’affiche à l’aide de GetOpenFilename ou
GetSaveAsFilename, aucune action n’est
exécutée lorsque l’utilisateur clique sur le bouton de validation.
Ces méthodes permettent simplement
de récupérer un nom de fichier. Ce fichier doit ensuite être manipulé
par programmation.
Utilisez les méthodes GetOpenFilename et GetSaveAsFilename selon la
syntaxe suivante :
[Link](InitialFilename, FileFilter, FilterIndex,
Title,
ButtonText)
vérifie si on a trouvé une feuille portant un nom plus petit lors
des
comparaisons (If Min<>I). Si c’est le cas, cette feuille est placée
devant la feuille
en cours de traitement (.Item(Min).Move before:=Worksheets(I)).
La boucle principale reprend alors la main, et la feuille suivante
est traitée
selon le même principe. Une fois les feuilles du classeur triées
par ordre
croissant de nom, le mode de calcul du classeur est redéfini à
son état initial
(ligne 18), tandis que la mise à jour de l’affichage écran est
réactivée (ligne
19).
Conseil
Notez que, dans l’exemple précédent, on évite des opérations
inutiles de déplacement de feuilles, en
mémorisant la donnée la plus petite lors des comparaisons (ligne
13) et en n’effectuant qu’une seule
substitution de position si nécessaire à la fin du passage de la boucle
imbriquée (ligne 15). Exercez-vous
à modifier la fonction TriTableau présentée plus avant selon le même
principe.
8
Fonctions Excel et VBA
Si les fonctions sont un élément clé du développement
d’applications, quels
que soient le langage et l’environnement de programmation, c’est
particulièrement vrai pour Excel, dont l’activité principale consiste à
effectuer
des calculs.
Vos projets exploiteront aussi bien des fonctions d’Excel que de
VBA, mais
également celles que vous allez créer.
Utiliser les fonctions Excel dans VBA
Excel offre un nombre impressionnant de fonctions intégrées, de
la simple
addition aux calculs avancés. Pour la plupart, elles peuvent être
manipulées via
du code Visual Basic.
Attention
Ne confondez pas les fonctions spécifiques à Excel et celles de
Visual Basic. Si de nombreuses
fonctions mathématiques Excel ont leurs équivalents Visual Basic,
le tableur en propose dans le
domaine des statistiques, de la finance, etc., qui lui sont propres
et n’existent pas en Visual Basic. Un
programme exploitant ces fonctions ne pourra donc pas être
exécuté dans une application hôte autre
qu’Excel.
Pour utiliser une fonction Excel dans un programme VBA, vous ferez
appel à
l’objet Application représentant l’application hôte (en l’occurrence
Excel) qui la
contient. Dans l’exemple suivant, QuelEstLeMax exploite la
fonction Max d’Excel,
qui renvoie la valeur la plus forte dans une liste d’arguments. Si vous
ne faites
pas précéder Max du mot-clé Application, la fonction ne sera pas
reconnue et une
erreur sera générée.
Public Sub QuelEstLeMax()
MsgBox "Le plus grand des chiffres reçus est " _
& (1,2,3,4), vbInformation + vbOKOnly, _
"Utiliser les fonctions Excel dans VB"
End Sub
Figure 8-1 –Les fonctions créées dans Visual Basic Editor peuvent
être
exploitées dans Excel, comme des fonctions intégrées.
Les fonctions créées dans Visual Basic Editor sont gérées dans Excel
comme
n’importe quelle fonction intégrée du tableur. Si vous cliquez sur le
bouton OK
de la boîte de dialogue Insérer une fonction, vous serez invité à
préciser les
cellules correspondant aux arguments de la fonction (voir figure
8-2). La
fonction apparaîtra ensuite dans la barre de formule.
Figure 8-2 –Vous êtes invité à spécifier les cellules correspondant aux
arguments de la fonction.
Figure 8-3 –La fonction personnalisée s’affiche dans la barre de
formule.
Conseil
Affectez des noms représentatifs aux arguments des fonctions
que vous créez, afin qu’ils soient
compréhensibles pour les autres utilisateurs.
Intégrer une fonction via l’Explorateur d’objets
catégories suivantes :
• mathématiques ;
• conversion de données ;
• conversion de types de données ;
• date et heure ;
• fonctions financières.
Pour obtenir une aide plus développée concernant leur utilisation,
consultez
l’aide en ligne de VBA.
Info
Les fonctions de traitement des chaînes de caractères constituant une
question clé de la programmation,
le chapitre suivant leur est entièrement consacré.
Info
Notez que les arguments des fonctions présentées dans les
tableaux suivants sont pour la plupart des
arguments nommés. Lorsque ce n’est pas le cas, le nom est traduit en
français.
Dans le tableau 8-1, l’argument nommé Number représente une valeur
numérique
passée en argument.
Tableau [Link] mathématiques
Type de
Fonction
De scription
donné e s re nvoyé
Même type que
Abs(Number)
Retourne la valeur absolue de Number.
Number
Retourne l’arctangente de Number, sous la forme
d’un angle exprimé en radians.
Atn(Number)
Pour convertir des degrés en radians, multipliez-
Double
les par pi/180. Inversement, pour convertir des
radians en degrés, multipliez-les par 180/pi.
Retourne le cosinus de l’angle Number (exprimé en
Cos(Number)
Double
radians).
Retourne la valeur de la constante e élevée à la
puissance Number.
Exp(Number)
Double
La constante e est la base des logarithmes
népériens ; elle est à peu près égale à 2,718282.
Renvoie la partie entière d’un nombre.
Même type que
Fix(Number)
Si Number est négatif, Fix renvoie le premier entier
négatif supérieur ou égal à
Number
Number.
Comme Fix, Int renvoie la partie entière d’un
Int(Number)
nombre, à la différence que, si Number est négatif,
Même type que
Int renvoie le premier entier négatif inférieur ou
Number
égal à Number.
Log(Number)
Retourne le logarithme népérien de Number.
Double
Retourne une valeur aléatoire. L’argument Number
est facultatif et définit le comportement de la
fonction Rnd.
Notez que Rnd génère la même série de nombres
aléatoires à chaque appel, car elle réutilise le
Rnd(Number)
Single
nombre aléatoire précédent comme valeur initiale
pour le calcul du nombre suivant.
Utilisez l’instruction Randomize pour initialiser le
générateur de nombres aléatoires à partir d’une
valeur initiale tirée de l’horloge système.
Retourne la valeur arrondie de Number.
L’argument facultatif NumDigitsAfterDecimal
Round(Number,
Même type que
indique le nombre de chiffres à conserver après la
NumDigitsAfterDecimal)
Number
virgule dans le nombre retourné. Si cet argument
est omis, Round renvoie la valeur entière arrondie.
Retourne une valeur représentant le signe de
Number :
Sgn(Number)
–1 si Number est inférieur à zéro ;
Integer
0 si Number est égal à zéro ;
1 si Number est supérieur à zéro.
Retourne le sinus de l’angle Number exprimé en
Sin(Number)
Double
radians.
Sqr(Number)
Retourne la racine carrée de Number.
Double
Retourne la valeur de la tangente de l’angle
Tan(Number)
Double
Number exprimée en radians.
Le tableau 8-2 présente les fonctions de conversion de données de
VBA. Elles
traitent la valeur reçue en argument et renvoient le résultat de ce
traitement.
Les fonctions de conversion de types de données sont présentées
dans le
tableau 8-2.
Tableau [Link] de conversion des données
Type de
Fonction
De scription
donné e s re nvoyé
Renvoie une valeur représentant le code du
Asc(String)
premier caractère de la chaîne de caractères
Integer
String.
Renvoie le caractère dont le code est CharCode,
Chr(CharCode)
Integer
de type Long.
Renvoie Expression sous forme de chaîne
formatée selon le Format défini.
Format(Expression,
Vous pouvez ainsi définir le format d’une date, ou
Format)
modifier une chaîne pour afficher le symbole de la
String
monnaie et placer des séparateurs entre les
milliers.
Retourne la valeur hexadécimale de Number sous
Hex(Number)
forme de chaîne. Si Number n’est pas un nombre
String
entier, il est arrondi à l’entier le plus proche.
Retourne la valeur octale de Number sous forme
Oct(Number)
String
de chaîne.
Retourne un entier représentant la couleur. Les
arguments Red, Green et Blue sont de type Integer
RGB(Red, Green, Blue)
et correspondent chacun à la valeur de la couleur
Long
associée (rouge, vert, bleu), comprise entre 0 et
255.
Renvoie Number sous forme de chaîne de
caractères. Number peut être n’importe quelle
Str(Number)
String
valeur numérique que l’on souhaite traiter comme
une chaîne.
Retourne String sous forme de valeur numérique
Type approprié à
Val(String)
de type approprié. Si String ne peut être converti
la valeur
en valeur numérique, une erreur est générée.
retournée
Reportez-vous au tableau 6-5 pour un aperçu des fonctions de
conversion de
données. Ces fonctions permettent de modifier le type d’une
donnée. La
conversion de données dans le type approprié est souvent
nécessaire au bon
déroulement d’un programme VBA. Par exemple, tenter
d’exécuter une
fonction mathématique sur une chaîne de caractères (même si
celle-ci n’est
composée que de chiffres) générera une erreur. Vous devrez alors faire
appel à
la fonction de conversion numérique appropriée afin que l’argument
passé à la
fonction soit reconnu comme une valeur et non plus comme une
suite de
caractères.
Le tableau 8-3 présente les fonctions de date et d’heure.
L’argument nommé
date désigne toute expr ession valide qui r envoie une valeur de type
Date.
Tableau [Link] de date et d’heure
Type de
Fonction
De scription
donné e s re nvoyé
Retourne la date en cours à partir de l’horloge système de
Date
votre ordinateur. Utilisez l’instruction Date pour redéfinir la
Date
date de l’horloge système.
Retourne l’heure en cours à partir de l’horloge système.
Time
Date
Utilisez l’instruction Time pour redéfinir l’heure système.
Now
Retourne la date et l’heure en cours.
Date
Retourne l’année correspondant à Date sous la forme d’un
Year(Date)
Integer
nombre entier.
Retourne le mois correspondant à Date sous la forme d’un
Month(Date)
Integer
entier compris entre 1 (janvier) et 12 (décembre).
Retourne le jour correspondant à Date sous la forme d’un
Day(Date)
Integer
nombre entier compris entre 1 et 31.
Retourne un entier compris entre 1 et 7, qui représente le jour
de la semaine correspondant à Date.
FirstDayOfWeek définit le jour considéré comme le premier
de la semaine. Il peut s’agir d’une valeur comprise entre 0 et
7, ou de l’une des huit constantes vbDayOfWeek :
vbUseSystem, vbMonday, vbTuesday, vbWednesday,
Weekday(Date,
vbThursday, vbFriday, vbSaturday et vbSunday.
Integer
FirstDayOfWeek)
Si l’argument FirstDayOfWeek est omis, la valeur par défaut
est vbUseSystem et dépend donc du système sur lequel est
exécutée la macro. En France, le premier jour de la semaine
par défaut est le lundi, tandis qu’aux États-Unis il s’agira du
dimanche. Il est donc recommandé de préciser l’argument
FirstDayOfWeek afin d’éviter des différences de
comportements du programme d’un ordinateur à l’autre.
Retourne une chaîne qui représente le nom du jour de la
semaine WeekDay. WeekDay peut être un nombre compris entre
0 et 7, ou l’une des constantes vbDayOfWeek présentées ci-
avant. La valeur retournée est renvoyée dans la langue du
système sur lequel est exécutée la fonction.
WeekdayName
L’argument nommé Abbreviate est facultatif et définit si le
(WeekDay,
jour est renvoyé sous une forme abrégée (lun. pour lundi). Sa
String
Abbreviate,
FirstDayOfWeek)
valeur par défaut est False.
FirstDayOfWeek définit quel jour est considéré comme le
premier de la semaine.
Notez que la fonction Weekday peut être utilisée comme
argument de WeekdayName :
… WeekDayName(WeekDay(Date))
Retourne un entier compris entre 0 et 23, qui représente les
Hour(Date)
heures de Date. Si Date ne fournit pas d’information d’heure,
Integer
la fonction renvoie 0.
Retourne un entier compris entre 0 et 59, qui représente les
Minute(Date)
minutes de Date. Si Date ne fournit pas d’information sur les
Integer
minutes, la fonction renvoie 0.
Retourne un entier compris entre 0 et 59, qui représente les
Second(Date)
secondes de Date. Si Date ne fournit pas d’information sur les
Integer
secondes, la fonction renvoie 0.
DateSerial(Year,
Retourne une date précise (jour, mois et année), fonction des
Date
Month, Day)
arguments Year, Month et Day reçus.
TimeSerial(Hour,
Retourne une heure précise (heures, minutes et secondes), en
Date
Minute, Second)
fonction des arguments reçus.
Renvoie la date reçue en argument. L’argument Date peut
DateValue(Date)
être une chaîne de caractères, un nombre, une constante ou
Date
n’importe quelle expression renvoyant une date.
9
Manipuler des chaînes de caractères
La manipulation de chaînes de caractères est un aspect clé de
la
programmation, quel que soit le langage, notamment pour
informer et
interagir avec l’utilisateur. Dans ce cadre, les valeurs numériques
doivent
souvent être traitées et formatées comme des chaînes de
caractères afin d’en
extraire les informations pertinentes. Par ailleurs, les informations
retournées
par la fonction InputBox ou via un contrôle TextBox sont des chaînes
de caractères
et devront être traitées comme telles.
Modifier des chaînes de caractères
De nombreuses possibilités de manipulations s’offrent à vous.
Vous pouvez
bien sûr ajouter des éléments à une chaîne de caractères en la
concaténant avec
d’autres, mais aussi en extraire une partie de façon à n’en
conserver que
l’information pertinente.
Concaténer des chaînes
Concaténer des chaînes consiste à les « accoler », c’est-à-dire à en
assembler
plusieurs pour en créer une seule. Il est également possible de
concaténer les
éléments d’un tableau, de façon à obtenir une chaîne qui en reprenne
toutes les
valeurs.
Concaténer des chaînes simples
La concaténation des chaînes est réalisée à l’aide des opérateurs
& et +. Il est
cependant conseillé de privilégier l’opérateur &, qui ne fonctionne
qu’avec les
chaînes, et de conserver le + pour les additions. Votre code
sera ainsi sans
ambiguïté.
Toute expression qui renvoie une chaîne de caractères est utilisable :
variable
de type String, fonction renvoyant une chaîne, chaîne de caractères
entourée de
guillemets.
Attention
Si vous souhaitez inclure une valeur numérique dans une chaîne,
utilisez la fonction Str() pour la
convertir.
Considérez l’exemple suivant :
1: Sub ConcatenerDesChaînes()
2: Dim MonNom As String
3: Dim MonBenefice As Long
4: Dim MonMessage As String
5: MonNom = [Link](1,2).Value
6: MonBenefice = [Link](1,3).Value
7: MonMessage = "La prime de " & MonNom & " est de " &
Str(Int(MonBenefice/20))
& " euros."
8: MsgBox MonMessage
9: End Sub
Lignes 2 à 4, les variables sont déclarées. Notez que MonBenefice est
de type Long
et ne peut donc être concaténée telle quelle. Lignes 5 et 6,
MonNom et MonBenefice
reçoivent respectivement pour valeur le contenu des cellules B1 et C1.
Ligne 7 a lieu la concaténation des différentes chaînes de façon
à générer le
message affiché par la fonction MsgBox à la ligne suivante.
Les éléments concaténés sont les suivants :
• "La prime de " est une simple chaîne de caractères, entourée de
guillemets.
• MonNom est une variable de type String et peut donc être
concaténée sans qu’il
soit nécessaire d’effectuer une conversion de type de données.
• " est de " est une simple chaîne de caractères. Notez que
nous avons fait
précéder et suivre le texte d’espaces, pour que la chaîne finale soit
lisible.
• Str(Int(MonBenefice/20)) est une expression renvoyant une chaîne de
caractères.
Tout d’abord, la valeur numérique MonBenefice est divisée par 20, de
façon à
obtenir la valeur de la prime (5 % du bénéfice). La fonction Int renvoie
la
valeur entière de la somme ainsi obtenue. Enfin, la fonction Str
convertit le
résultat numérique ainsi obtenu en une chaîne de caractères.
• " euros" est une simple chaîne de caractères.
On obtient ainsi le message affiché dans la boîte de dialogue de la
figure 9-1.
Constante
Vale ur
Equivale nt ave cChr()
vbCr
Saut de paragraphe
Chr(13)
vbLf
Saut de ligne
Chr(10)
vbCrLf
Retour chariot + saut de ligne
Chr(13) & Chr(10)
Saut de ligne spécifique à la plate-
Chr(13) & Chr(10) pour Windows
vbNewLine
forme : équivaut à vbCrLf pour
Chr(13) pour Macintosh
Windows et à vbCr sur un Macintosh
vbTab
Tabulation
Chr(9)
Répéter une série de caractères
Utilisez la fonction String() pour renvoyer une chaîne composée d’un
caractère
répété un certain nombre de fois, selon la syntaxe suivante :
String(Number, Character)
où les arguments nommés Number et Character représentent
respectivement le
nombre de répétitions et le caractère à répéter. L’expression
suivante insère
dans une chaîne la valeur de la cellule A1 à laquelle sont ajoutés six
zéros. La
valeur, exprimée en millions dans la cellule, est ainsi récupérée
sous forme
d’unités :
MsgBox Str([Link]("A1").Value) &
String(6,"0")
Astuce
Vous pouvez utiliser la fonction Chr() pour l’argument Character. Ainsi
String(10,Chr(149)) renvoie
une chaîne composée de dix puces.
De façon similaire, la fonction Space renvoie une chaîne
composée d’un
nombre défini d’espaces, selon la syntaxe suivante :
Space(Number)
Supprimer les espaces superflus d’une chaîne
Traiter les espaces d’une chaîne est une opération souvent
indispensable au bon
fonctionnement d’un programme. Par exemple, si vous recevez
des
informations de l’utilisateur grâce à la fonction InputBox, il sera
prudent de
supprimer les éventuels espaces superflus à l’une ou l’autre des
extrémités de
la chaîne retournée avant de traiter ces données.
Visual Basic propose trois fonctions pour ce faire :
premier guillemet (non inclus) présent dans la chaîne. On utilise
pour cela la
fonction InStr() présentée plus loin dans ce chapitre, qui retourne la
position du
caractère recherché (ici Chr(34), soit un guillemet). On ajoute 1
à cette valeur
pour commencer la chaîne à partir du caractère qui suit le guillemet.
Notez que
l’on emploie la fonction Trim() afin de supprimer les éventuels espaces
présents
aux extrémités de la chaîne retournée par la fonction Mid().
Effectuer des remplacements au sein d’une chaîne
Utilisez la fonction Replace() pour effectuer des remplacements
au sein d’une
chaîne de caractères selon la syntaxe suivante :
Replace(Expression, Find, Replace, Start, Count, Compare)
Expression est une expr ession valide qui r envoie la chaîne de
car actèr es à tr aiter.
Find est la chaîne r echer chée et à r emplacer par Replace. Les
tr ois ar guments
suivants sont facultatifs :
• Start précise la position à partir de laquelle doivent
commencent les
remplacements dans Expression. Si cet argument est omis,
l’ensemble de la
chaîne est traité.
• Count indique le nombre de remplacements à effectuer. S’il est
omis, sa
valeur par défaut –1 est utilisée et toutes les occurrences de
Find sont
remplacées.
• Enfin, Compare précise le type de comparaison effectuée. Il
peut s’agir de
l’une des valeurs suivantes :
– vbUseCompareOption ou –1. C’est la valeur de l’option Option
Compare précisée
dans l’en-tête du module dans lequel se trouve l’instruction qui
est
utilisée pour définir le type de comparaison.
– vbBinaryCompare ou 0. Effectue une comparaison binaire. La
recherche
respecte la casse de Find.
– vbTextCompare ou 1. Effectue une comparaison de texte. La
recherche ne
prend pas en considération la casse des occurrences trouvées.
– vbDatabaseCompare ou 2. Effectue une comparaison
s’appuyant sur des
informations contenues dans une base de données Microsoft Access.
Dans l’exemple suivant, lignes 7 à 9, les données de la feuille
active sont
stockées dans le tableau MesValeurs, tout en remplaçant au
passage les « ; » par
des « , ».
1: Sub UtiliserReplace()
• vbDatabaseCompare ou 2.
Dans l’exemple suivant, la procédure MaMacro appelle la fonction
VerifierEnregistrement pour s’assur er que le document actif est
enr egistr é avant de
s’exécuter. Si ce n’est pas le cas, la fonction renvoie False et
l’instruction End
met fin à l’exécution du programme après avoir affiché un
message à
l’attention de l’utilisateur.
1: Sub MaMacro()
2: If VerifierEnregistrement(ActiveWorkbook)=False Then
3: MsgBox "Cette commande ne peut être exécutée que sur un fichier
enregistré.", _
4: vbOKOnly + vbCritical, "Exécution impossible"
5: End
6: End If
7: ’suite des instructions de la macro
8: End Sub
9: Function VerifierEnregistrement(MonClasseur As Workbook) As
Boolean
10: If InStr([Link], [Link])=0 Then
11: VerifierEnregistrement = False
12: Else
13: VerifierEnregistrement = True
14: End If
15: End Function
La fonction VerifierEnregistrement est appelée ligne 2 et reçoit
en argument le
classeur actif. Ligne 10, on recherche le séparateur propre au
système sur
lequel s’exécute le programme ([Link]) au sein
du nom
complet du document, chemin inclus (propriété FullName). Si le
fichier n’a pas
été enregistré, la chaîne retournée par FullName est la même que celle
qui serait
retournée par Name et ne contient pas de séparateur ; la fonction
InStr() renvoie
donc 0 et notre fonction reçoit la valeur False. Dans le cas
contraire, c’est la
valeur True qui lui est affectée.
Dans l’exemple suivant, la fonction ScinderChaîne est appelée par
MaMacro et reçoit
en arguments deux chaînes de caractères : celle qu’il faut scinder en
plusieurs
parties et le séparateur à utiliser. Elle renvoie une variable de matrice
contenant
les différents morceaux extraits. Ceux-ci sont ensuite traités en
vue d’être
affichés.
1: Sub MaMacro()
2: Dim n As Long
3: Dim MonResultat()
4: Dim Exemple As String
5: Dim Message As String
6: Exemple = "Transports:Maritimes:Bateaux:A voile"
7: MonResultat = ScinderChaîne(Exemple,":")
8: For n = 1 To UBound(MonResultat)
9: Message = Message & vbCr & Chr(149) & _
" " & MonResultat(n)
10: Next n
11: MsgBox "La chaîne a été scindée en " & UBound(MonResultat) & _
Figure 9-4 –La fonction InStr() peut servir à scinder une chaîne en
fonction
d’un séparateur.
Scinder une chaîne
Dans l’exemple précédent, nous avons scindé une chaîne de
caractères en
répétant une boucle tant que la comparaison aboutit à un
résultat. Cette
procédure a servi à illustrer l’utilisation de la fonction Instr().
Cependant, une
telle démarche revient à écraser une mouche avec un marteau.
En effet, VBA
propose une fonction dédiée à cette opération : Split().
La fonction Split() renvoie les chaînes obtenues sous forme d’un
tableau
unidimensionnel de base 0 et s’utilise selon la syntaxe suivante :
Split(expression, delimiter, limit, compare)
où expression fournit la chaîne de caractères à scinder. Les trois
autres
arguments sont facultatifs : delimiter est la chaîne de caractères
utilisée comme
séparateur (l’espace par défaut), limit indique le nombre de chaînes à
renvoyer
(toutes par défaut) et compare a le même rôle que dans la
fonction Instr()
présentée ci-avant.
Attention
Notez que le résultat retourné par la fonction Split() ne peut
être stocké que dans une variable de
type Variant. Si vous tentez de le faire dans une variable tableau, une
erreur est générée.
Modifiez la procédure MaMacro() comme suit :
1: Sub MaMacro()
2: Dim n As Long
3: Dim MonResultat
4: Dim Exemple As String
5: Dim Message As String
6: Exemple = "Transports:Maritimes:Bateaux:A voile"
7: MonResultat = Split(Exemple,":")
8: For n = 0 To UBound(MonResultat)
9: Message = Message & vbCr & Chr(149) & _
" " & MonResultat(n)
10: Next n
11: MsgBox "La chaîne a été scindée en " & (UBound(MonResultat)+1)
& _
" parties : " & Message
12: End Sub
Ligne 3, la variable est maintenant déclarée de type Variant,
pour recevoir le
résultat retourné par la fonction Split(). Ligne 7, la fonction
Instr()
précédemment employée dans la boucle est remplacée par
Split(). Ligne 8, la
boucle démarre à zéro, car le tableau retourné par Split() est de base
zéro. Pour
Compare:=vbBinaryCompare."
23: End If
24: If Not UBound(MaRecherche2)=-1 Then
25: Message = Message & vbCr & "- Résultat de la recherche avec
include:=False et Compare:=vbBinaryCompare " & vbCr
26: For n = 0 To UBound(MaRecherche2)
27: Message = Message & " " & MaRecherche2(n) & " / "
28: Next n
29: Else
30: Message = Message & vbCr & "- Pas de résultat pour la recherche
avec
include:=False et Compare:=vbBinaryCompare."
31: End If
32: If Not UBound(MaRecherche3)=-1 Then
33: Message = Message & vbCr & "- Résultat de la recherche avec
include:=True
et Compare:=vbTextCompare" & vbCr
34: For n = 0 To UBound(MaRecherche3)
35: Message = Message & " " & MaRecherche3(n) & " / "
36: Next n
37: Else
38: Message = Message & vbCr & "- Pas de résultat pour la recherche
avec
include:=True et Compare:=vbTextCompare."
39: End If
40: If Not UBound(MaRecherche4)=-1 Then
41: Message = Message & vbCr & "- Résultat de la recherche avec
include:=False et Compare:=vbTextCompare : " & vbCr
42: For n = 0 To UBound(MaRecherche4)
43: Message = Message & " " & MaRecherche4(n) & " / "
44: Next n
45: Else
46: Message = Message & vbCr & "- Pas de résultat pour la recherche
avec
include:=False et Compare:=vbTextCompare."
47: End If
48: MsgBox Message
49: End Sub
Lignes 9 à 11, le nom des jours de la semaine est affecté aux sept
espaces de
stockage de la variable JoursSemaine. On fait pour cela appel à
la fonction
WeekdayName() pr ésentée au chapitr e pr écédent. Lignes 12 à
15, on r echer che à
quatre reprises la chaîne "M" dans la variable avec, chaque fois,
des valeurs
différentes pour les arguments include et compare.
Les mêmes instructions sont ensuite appliquées aux quatre
résultats de
recherche, afin de créer le message à afficher (lignes 16 à 23, 24 à 31,
32 à 39
et 40 à 47). On utilise pour cela une structure If…Then…Else
afin de savoir si la
recherche a abouti. Si c’est le cas, une boucle For…Next est
utilisée pour
concaténer les contenus du tableau ayant reçu le résultat de la
fonction.
Enfin, on affiche le message représenté à la figure 9-5.
10
Déboguer et gérer les erreurs
Il arrivera immanquablement que des erreurs surviennent lors de
l’exécution
d’un programme VBA ou que le résultat ne soit pas celui qui
était escompté.
Vous devrez alors déterminer l’origine de l’erreur et tester de
nouveau le
programme. VBA dispose pour cela de précieux outils. Ce
chapitre vous les
présente.
Vous devez tout d’abord distinguer le débogage de la gestion
des erreurs. Le
débogage consiste à corriger un programme qui ne fonctionne
pas à cause
d’un problème lié au code : faute de frappe, syntaxe incorrecte, etc. La
gestion
des erreurs consiste à prévoir les éventuelles erreurs susceptibles de
survenir
et à y remédier pour que le programme soit aussi fiable que possible,
c’est-à-
dire s’exécutant correctement dans des contextes différents.
Les étapes et les outils du débogage
Le débogage consiste donc à régler les erreurs directement liées
au code et
indépendantes de l’environnement dans lequel il s’exécute. Trois
types
d’erreurs sont susceptibles d’affecter un programme :
• Erreurs de compilation. Elles surviennent lorsque VBA rencontre
une
instruction qu’il ne reconnaît pas ; par exemple, lorsqu’un mot-clé
contient
une faute d’orthographe (voir figure 10-1).
Figure 10-5 –Exécutez les procédures pas à pas pour visualiser les
conséquences de chacune des instructions.
5. Vous pouvez aussi « lâcher » l’exécution de la procédure en cliquant
sur le
bouton Continuer de la barre d’outils Standard. Le programme se
poursuit
alors normalement.
Vous pouvez aussi exécuter le code procédure par procédure, afin
d’étudier
la façon dont elles s’appellent dans le programme. Utilisez pour
cela la
commande Pas à pas principal. La commande Pas à pas sortant
exécute tout
le code restant dans la procédure en cours et le programme
s’interrompt
juste après l’instruction d’appel.
La fenêtre Variables locales
Lorsque vous exécutez une procédure pas à pas, elle est en mode
Arrêt. Vous
pouvez alors visualiser la valeur des variables et des constantes aux
différents
stades de l’exécution du programme.
Définition
Le mode Arrêt désigne l’état d’une procédure dont l’exécution
est interrompue. Cela est dû à une
erreur, à l’exécution pas à pas d’une procédure, à la rencontre
d’une instruction End ou Stop, ou à
l’interruption manuelle de l’exécution.
Pour visualiser la valeur d’une variable en survolant cette
dernière avec la
souris (figure 10-6), activez l’option Info-bulles automatiques
(Outils >
Options).
Figure 10-6 –Les info-bulles automatiques indiquent la valeur des
variables à
un moment précis de l’exécution d’un programme.
Figure 10-8 –La pile des appels affiche les appels de procédure actifs.
Vous pouvez modifier les valeurs dans la fenêtre Variables
locales, afin de
tester le comportement du programme dans d’autres
circonstances. Double-
cliquez sur la valeur à changer, puis saisissez la valeur voulue.
Si cette
dernière est incompatible avec le type de la variable, un
message d’erreur
s’affiche et rien n’est modifié.
Les points d’arrêt
Les points d’arrêt servent à interrompre l’exécution d’un programme
sur une
instruction précise. Cette possibilité est particulièrement
intéressante lorsque
vous soupçonnez l’origine d’une erreur. Ainsi, vous exécutez
normalement
toutes les instructions ne posant pas de problème et vous
arrêtez devant une
instruction dont vous n’êtes pas sûr. Une fois l’exécution
interrompue, vous
pouvez la poursuivre pas à pas, examiner la valeur des variables, etc.
Pour définir un point d’arrêt, placez le curseur sur l’instruction
voulue et
choisissez la commande Basculer le point d’arrêt du menu
Débogage, ou
cliquez sur le bouton Point d’arrêt de la barre d’outils, ou
appuyez sur la
touche F9, ou cliquez dans la marge de la fenêtre Code en face de
l’instruction
voulue. Par défaut, l’instruction apparaît sur un arrière-plan de
couleur
bordeaux et un indicateur est placé en marge (voir figure 10-9).
Placez plusieurs points d’arrêt dans le code, afin de vérifier l’état des
variables
ou du document à différents stades, sans avoir à exécuter le
programme pas à
pas. Pour supprimer un point d’arrêt, procédez de la même façon que
pour le
placer. Pour supprimer tous ceux d’un module, sélectionnez la
commande
Effacer tous les points d’arrêt du menu Débogage ou tapez le raccourci
clavier
correspondant.
Conseil
Lorsque vous quittez Visual Basic Editor, les points d’arrêt ne sont pas
enregistrés. Utilisez l’instruction
Stop, qui entraîne le passage de l’exécution d’une procédure en mode
Arrêt.
Figure 10-9 –Les points d’arrêt (ici en gris foncé) définissent des
interruptions dans l’exécution du code.
Modifier l’ordre d’exécution des instructions
En mode Arrêt, vous pouvez à tout moment définir l’instruction
suivante à
exécuter dans une procédure. Il peut s’agir d’une instruction
précédant
l’actuelle ou au contraire d’une à venir. Placez le curseur dans
l’instruction à
exécuter et sélectionnez la commande Définir l’instruction
suivante du menu
Débogage, ou faites glisser l’indicateur de marge vers l’instruction
voulue. Le
code intermédiaire est alors ignoré et la procédure se poursuit à
partir de
l’instruction définie.
Débogage, ou encore utilisez Maj+F9. La boîte de dialogue vous
renseigne
10-13). Pour intégrer cette expression à la fenêtre Espions, cliquez sur
Ajouter.
Figure 10-13 –L’Espion express : toujours prêt.
La pile des appels
La boîte de dialogue Pile des appels recense toutes les
procédures en cours
d’exécution, selon leur ordre d’appel, la dernière appelée étant
en haut de la
liste.
Il est intéressant de visualiser la pile des appels lors du
débogage d’un
programme VBA. Vous avez ainsi une idée précise des
procédures en cours
d’exécution et des appels successifs. Choisissez la commande Pile
des appels
du menu Affichage, ou cliquez sur le bouton Pile des appels de
la barre
d’outils Débogage, ou encore tapez le raccourci clavier Ctrl+L.
Sur la figure 10-14, vous voyez que la procédure en cours
d’exécution est
Procédure3,
qui a été appelée par Procédure2, elle-même appelée par
AppelsDeProcédures.
Figure 10-14 –La boîte de dialogue Pile des appels.
Exemple de débogage
Nous allons créer ici un programme que nous déboguerons jusqu’au
moment
où nous atteindrons une version fiable. Nous supposons que nous
possédons un
classeur Excel contenant de nombreuses données, mais dans
lequel certaines
lignes sont vides. Nous décidons donc d’écrire une macro VBA
pour
supprimer ces dernières. Nous supposons ici que, lorsqu’une
cellule de la
colonne A ne contient pas de données, la ligne est vide et doit être
supprimée.
Ainsi, les lignes 7, 10, 11 et 16 du classeur représenté à la figure 10-15
doivent
être supprimées.
Figure 10-15 –Le programme devra supprimer les lignes ne
contenant pas de
données.
Commençons logiquement par définir la zone à traiter (de A1 à
la dernière
Next Compteur
MsgBox Message, vbOKOnly + vbInformation
En l’état, le programme lancera encore une erreur à la ligne 33 si
aucune ligne
n’est à supprimer. Corrigez ce bogue selon la méthode de votre choix :
soit en
encadrant les instructions par une structure conditionnelle qui
vérifiera que
MonTableau n’est pas vide, soit par la mise en place d’un
gestionnair e d’er r eur.
Figure 10-17 –Cette version du programme indique les lignes
supprimées.
Une telle méthode se révélera particulièrement intéressante si
vous créez une
procédure supprimant des lignes dont vous souhaitez récupérer
les
informations dans un autre classeur Excel. Vous utiliserez alors une
variable de
matrice dynamique à deux dimensions : l’une correspondant aux
lignes du
classeur, l’autre aux colonnes. La taille de la première dimension (le
nombre
de lignes à supprimer ou le nombre de colonnes du classeur
contenant des
données à conserver) devra être définie avant de stocker les
données dans la
variable – seule la dernière dimension pouvant être redéfinie en
conservant les
valeurs de la variable.
Gestion des erreurs et des exceptions
Un programme VBA peut s’exécuter correctement dans la plupart
des cas et
provoquer des erreurs d’exécution dans des contextes spécifiques.
Une erreur
sera, par exemple, lancée si l’utilisateur n’entre pas le type
d’information
attendu dans une boîte de dialogue ou si le format d’une cellule ne
correspond
pas au type de données qu’un programme tente d’exploiter, ou
encore si un
programme tente de modifier un classeur Excel en cours d’utilisation.
Nombre
d’erreurs de ce type, liées à un code écrit pour un contexte
particulier, sont
susceptibles d’affecter une macro. Il est important de les prévoir
et de mettre
If ZoneATester=Null Then
MsgBox "Sélectionnez la plage de cellules à tester.", _
vbOKOnly + vbInformation
Exit Sub
End If
Dim DateEcheance As Variant
DateEcheance = InputBox("Indiquez la date d’échéance.", _
"Echéance des opérations en cours", Date + 30)
If DateEcheance="" Then
Exit Sub
End if
On Error GoTo GestionnaireErreur
DateEcheance = CDate(DateEcheance)
Dim CellTest As Range
For Each CellTest In Range(ZoneATester)
If IsDate(CellTest)=True Then
If [Link]>DateEcheance Then
[Link] = 6
End If
End If
Next
Exit Sub
GestionnaireErreur:
[Link] = 0
DateEcheance = InputBox("Format de date non valide." & _
Chr(10) & "Entrez une date au format jj/mm/aa", "Erreur gérée", _
"jj/mm/aa")
If DateEcheance=Empty Then Exit Sub
Resume
End Sub
Figure 10-19 –L’erreur est détectée et l’utilisateur est invité à entrer
une
information valide ou à annuler l’opération.
11
Intégrer des applications VBA dans
l’interface d’Excel
Il est simple d’améliorer l’accessibilité d’une macro en lui
affectant un
raccourci clavier, une ligne de commande dans un menu, un
bouton de barre
d’outils ou tout objet figurant sur une feuille de calcul.
Si vous n’utilisez que rarement une macro, contentez-vous de
l’exécuter par la
boîte de dialogue Macros. Cependant, sa nature et sa fréquence
d’utilisation
justifient souvent un accès plus rapide. Une macrocommande ne
présente qu’un
intérêt limité si elle ne peut être exécutée rapidement, par un
raccourci clavier
ou une icône (ou les deux). Il sera en revanche préférable d’affecter
une ligne
de commande à un programme aux conséquences plus larges et
d’une
utilisation moins fréquente.
Affecter une macro à un raccourci clavier
Si vous n’avez pas affecté de raccourci clavier à une macro au moment
de sa
création, il est très simple de le faire par la suite :
1. Cliquez sur le bouton Macros de l’onglet Développeur.
2. Dans la boîte de dialogue, sélectionnez la macro voulue puis cliquez
sur le
bouton Options (voir figure 11-1).
3. Indiquez le raccourci de votre choix en saisissant une lettre
dans la zone
conçue à cet effet. Vous pouvez aussi ajouter une description, si vous
avez
omis de le faire lors de la création.
4. Cliquez sur OK pour valider les modifications.
Figure 11-1 –Il est aisé d’affecter un raccourci clavier à une macro.
Personnaliser le ruban et la barre d’outils Accès
rapide
Vous pouvez personnaliser tous les onglets du ruban ainsi que la barre
d’outils
Accès rapide. Pour ce faire, procédez comme suit :
1. Affichez le fichier et cliquez sur l’onglet Fichier, puis
sur Options. Dans la boîte de dialogue, choisissez Personnaliser le
ruban ou
Barre d’outils Accès rapide.
2. Dans la liste Choisir les commandes dans les catégories
suivantes,
choisissez Macros (figure 11-2).
TROISIÈME PARTIE
Développer des
interfaces utilisateur
12
Créer des interfaces utilisateur
Les feuilles constituent un élément essentiel de la programmation
Visual Basic.
Ce sont des zones sur lesquelles vous placez des contrôles tels que des
cases à
cocher, des boutons d’option, des zones de texte, des boutons
de commande,
etc. Ils forment une interface graphique simple et intuitive entre
l’utilisateur et
le programme.
Un événement utilisateur, tel qu’un clic de souris ou une
modification de
valeur, qui touche un contrôle est automatiquement repéré par le
programme et
lance l’exécution du code que vous lui avez associé. On parle
alors de
procédure événementielle ou procédure d’événement.
Les contrôles prennent une valeur, déterminée par leur état
(case cochée ou
non cochée, texte d’une zone de texte, etc.). L’exploitation des feuilles
consiste
généralement à passer à une procédure de code les informations
que
l’utilisateur entre sur la feuille (les valeurs des différents contrôles) et
valide –
en cliquant sur un bouton libellé OK, par exemple. Ces données
sont ensuite
exploitées par le programme.
Les phases de développement de feuilles
Les feuilles ramènent des tâches complexes à la simple
information des
champs d’une boîte de dialogue pour l’utilisateur final.
La création de feuilles VBA se déroule en trois phases :
• Détermination des besoins. Avant de vous lancer dans la
création d’une
feuille, réfléchissez aux fonctions que devra jouer l’interface
développée.
Quels doivent en être les différents contrôles ? Comment seront-
ils
organisés sur la feuille ? Quel seront les types d’interaction entre
les
contrôles ? À quels événements utilisateur devront-ils répondre ? Nous
vous
conseillons de réaliser sur papier un dessin approximatif de la feuille et
de
noter les informations essentielles sur les différents contrôles la
composant
qui apparaît dans sa barre de titre). La figure 12-3 présente une feuille
dont
la propriété Caption a été définie à « Exemple de feuille UserForm ».
5. Vous pouvez à tout moment utiliser les poignées de
redimensionnement
pour modifier la taille de la feuille.
6. Cliquez sur le bouton Enregistrer de la barre d’outils Standard.
Figure 12-3 –Définissez les propriétés Name et Caption de la feuille.
Pour ouvrir la fenêtre UserForm d’une feuille existante, ouvrez
l’Explorateur
de projet (Ctrl+R) et double-cliquez sur celle-ci.
Les contrôles de la boîte à outils
La boîte à outils contient les contrôles que vous pouvez placer
sur votre
feuille. Au même titre que la feuille elle-même, les contrôles sont
des objets.
Vous n’avez pas à vous soucier de la façon dont ils fonctionnent. Il
vous suffit
d’en connaître les méthodes, propriétés et événements membres
pour les
exploiter.
Cliquez sur le bouton Boîte à outils de la barre Standard ou
sélectionnez la
commande Boîte à outils du menu Affichage.
Figure 12-4 –La boîte à outils contient des contrôles Windows usuels.
Outil Sélection
L’outil Sélection sert à choisir un ou plusieurs contrôles sur une feuille.
Il est
activé par défaut dans la boîte à outils. Cet outil redevient actif
dès que le
contrôle choisi est déposé sur la feuille. Si vous sélectionnez un
contrôle, puis
décidez de ne plus le placer sur la feuille, cliquez sur l’outil Sélection.
Contrôle Label
Le contrôle Label place un intitulé sur la feuille, généralement à
côté d’un
contrôle ne possédant pas cet attribut (une zone de texte par
exemple), pour
aider l’utilisateur à en identifier la fonction.
Figure 12-6 –Le contrôle TextBox est l’un des contrôles les plus
utilisés.
Contrôle ComboBox
Le contrôle ComboBox, ou liste modifiable, insère une zone de texte
permettant à
l’utilisateur de saisir une valeur manuellement ou de la
sélectionner dans la
liste qui se déroule lorsqu’il clique sur le bouton prévu à cet effet. Un
contrôle
ComboBox peut autor iser ou non l’utilisateur à saisir une
valeur ne figur ant pas
dans la liste.
Contrôle ToggleButton
Le contrôle ToggleButton, ou bouton bascule, sert à l’utilisateur
pour activer ou
désactiver une option, voire choisir l’état Null si les propriétés du
contrôle l’y
autorisent. Ce contrôle offre en fait les mêmes fonctionnalités
qu’une case à
cocher, avec l’apparence d’un bouton de commande. Lorsqu’un bouton
bascule
est activé, il semble enfoncé sur la feuille ; lorsqu’il est
désactivé, il est
saillant ; à l’état Null, il apparaît estompé. La figure 12-12
présente les trois
états possibles pour un contrôle ToggleButton.
Figure 12-12 –Le contrôle ToggleButton est assez rarement utilisé
dans les
interfaces de programme.
Contrôle CommandButton
Le contrôle CommandButton est un bouton associé à une action.
Il peut, par
exemple, servir à valider les informations entrées dans la feuille
(bouton OK)
afin de passer à l’étape suivante du programme, ou au contraire
interrompre le
programme (bouton Annuler).
contrôles peuvent être placés sur une feuille de calcul Excel. Les
procédures
pour les exploiter sont les mêmes que pour une feuille UserForm
développée
dans Visual Basic Editor ; elles sont stockées dans l’objet Feuille
portant le
nom de la feuille, situé dans le module Objets Microsoft Excel.
Pour placer des contrôles sur une feuille de calcul plutôt que sur
une feuille
UserForm, affichez la barre d’outils Visual Basic dans Excel et cliquez
sur le
bouton Création, puis sur Boîte à outils Contrôles. Pour quitter ce
mode,
cliquez à nouveau sur le bouton Création.
Copier-coller des contrôles
Si vous souhaitez placer plusieurs fois le même contrôle sur une
feuille,
copiez-collez-le. Ainsi dupliqué, il héritera des propriétés du
contrôle stocké
dans le Presse-papiers, vous évitant de les redéfinir. N’oubliez pas de
définir sa
propriété Name.
Astuce
Pour copier-coller un contrôle, vous pouvez aussi cliquer-droit dessus
et, tout en maintenant le bouton
de la souris enfoncé, le faire glisser à l’endroit où vous souhaitez en
placer une copie. Relâchez ensuite
le bouton de la souris et, dans le menu contextuel qui s’affiche,
sélectionnez Copier ici.
Figure 12-21 –Vous pouvez aussi placer des contrôles sur une feuille
de calcul
Excel.
Figure 12-22 –La copie du contrôle hérite des propriétés du contrôle
source.
Sélectionner plusieurs contrôles
• Pour sélectionner des contrôles contigus, cliquez sur le premier et,
tout en
appuyant sur la touche Maj, cliquez sur le dernier.
• Pour sélectionner des contrôles non contigus, cliquez sur le
premier puis,
tout en appuyant sur la touche Ctrl, cliquez successivement sur les
autres.
Figure 12-23 –Pour sélectionner plusieurs contrôles sur une feuille,
utilisez
les touches Maj et Ctrl.
Info
Lorsque vous sélectionnez plusieurs contrôles, les poignées de
sélection de l’un d’eux apparaissent en
blanc (celles des autres sont noires). Il s’agit du contrôle actif.
Cette notion est particulièrement utile
pour mettre en forme vos feuilles. Vous pouvez ainsi appliquer
certaines propriétés du contrôle actif –
telles que sa taille ou sa position – aux autres sélectionnés.
Supprimer des contrôles
Pour effacer des contrôles d’une feuille, sélectionnez-les et tapez sur la
touche
Suppr. Si vous souhaitez les placer dans le Presse-papiers avant
de les coller
dans une autre feuille, tapez Ctrl+X.
Mise en forme des contrôles
Le simple déplacement des contrôles sur une feuille à l’aide de la
souris n’est
souvent pas assez précis. Un certain nombre d’outils sont à
votre disposition
pour peaufiner la mise en forme : grille, commandes du menu Format
ou de la
barre d’outils UserForm (figure 12-24). Vous obtiendrez ainsi des
contrôles
parfaitement alignés et de dimensions proportionnées.
Figure 12-24 –La barre d’outils UserForm.
La grille
La grille désigne les points quadrillant une feuille dans une fenêtre
UserForm,
qui n’apparaissent qu’en phase de conception et ont pour fonction de
faciliter
la mise en place des contrôles.
Lorsque l’alignement sur la grille est activé, l’angle supérieur
gauche des
contrôles est automatiquement placé sur le point de la grille le plus
proche. Les
contrôles acceptent alors autant de positions qu’il existe de
points de
quadrillage sur la feuille.
1. Sélectionnez la commande Options du menu Outils de Visual Basic
Editor et
activez la page Général de la boîte de dialogue qui s’affiche. La
zone
Paramètres de grille de la feuille (voir figure 12-25) sert à définir
les
options.
2. Cochez les cases Afficher la grille afin de faire apparaître les
points de
quadrillage sur la feuille, puis déterminez la précision de la grille
en
spécifiant des valeurs de largeur et de hauteur.
3. Cochez la case Aligner les contrôles sur la grille, puis cliquez sur OK.
Info
La commande Ajuster à la grille du menu Format ajuste la
hauteur et la largeur des contrôles
sélectionnés aux lignes de grille les plus proches.
Figure 12-25 –Paramétrez l’utilisation de la grille.
Figure 12-26 –Quand ils sont fixés sur la grille les contrôles sont
parfaitement
alignés les uns par rapport aux autres.
Aligner les contrôles
1. Sélectionnez les contrôles à aligner en prenant soin de repérer celui
qui est
actif (dont les poignées de sélection apparaissent en blanc).
Astuce
Pour modifier le contrôle actif d’une sélection, maintenez la
touche Ctrl enfoncée et cliquez à deux
reprises sur celui que vous souhaitez.
2. Choisissez la commande Aligner du menu Format ou cliquez sur la
flèche
du bouton Aligner de la barre d’outils UserForm (voir figure 12-27).
3. Choisissez l’alignement voulu parmi les sept proposés.
Toute la sélection s’aligne sur le contrôle actif.
Figure 12-27 –Sélectionnez un type d’alignement.
Info
Un mauvais choix peut entraîner la juxtaposition des contrôles. Cliquez
alors sur le bouton Annuler de
la barre d’outils Standard ou tapez le raccourci Ctrl+Z pour
ramener les contrôles à leur position
précédente.
Figure 12-43 –Si l’utilisateur clique sur Oui, la méthode Show sera
appliquée
à la feuille afin de l’afficher.
Pour masquer une feuille, on lui applique la méthode Hide, selon
la syntaxe
suivante :
[Link]
Cette instruction est généralement placée dans la procédure
événementielle
affectée au bouton de validation de la feuille. Les valeurs
entrées par
l’utilisateur sont alors passées à une autre procédure qui les
exploitera et la
feuille est masquée. Dans l’exemple suivant, lorsque l’utilisateur clique
sur le
bouton cmdOK de MaFeuille, celle-ci est masquée et la procédure
SuiteDuProgramme
est appelée.
Private Sub cmdOK_Click()
Call SuiteDuProgramme(arg1, arg2, …, argN)
End Sub
Astuce
La propriété Me renvoie la feuille active. Elle peut être utilisée
dans n’importe quelle procédure
événementielle attachée à une feuille pour la manipuler.
Si c’est la feuille active que vous souhaitez masquer (l’objet
conteneur du contrôle ayant reçu
l’événement), utilisez le mot-clé Me à la place de la propriété Name de
la feuille ().
Info
L’affectation de procédures événementielles aux contrôles est traitée
aux chapitres 13 et 14 .
13
Exploiter les propriétés des contrôles
Au cours des chapitres précédents, vous avez découvert les différents
contrôles
disponibles et les outils destinés à leur mise en forme. Vous savez
donc créer
des formulaires à l’apparence professionnelle, mais ce ne sont
pour l’instant
que des feuilles sans vie. Ce chapitre et le suivant vous montrent
comment tirer
parti des feuilles VBA en exploitant les propriétés des contrôles et en
associant
du code aux événements les affectant.
En tant qu’objets, les feuilles et les contrôles possèdent un certain
nombre de
propriétés qui en déterminent l’apparence et le comportement. Il est
fortement
recommandé de préciser la propriété Name des contrôles au fur et à
mesure que
vous les placez sur la feuille.
Sélectionnez un objet et tapez sur la touche F4 afin d’en ouvrir
la fenêtre
Propriétés, ou cliquez-droit et sélectionnez la commande
Propriétés du menu
contextuel. Affectez ensuite les valeurs voulues à l’objet.
Reportez-vous à la
section « La fenêtre Propriétés » du chapitres 4.
Astuce
Si vous sélectionnez plusieurs contrôles sur la feuille, la fenêtre
Propriétés affiche alors les propriétés
qui leur sont communes. Les modifications que vous apporterez
seront appliquées à tous les contrôles
sélectionnés.
Il existe évidemment des propriétés spécifiques pour chaque
contrôle et
d’autres communes à presque tous. Les sections qui suivent vous
présentent les
propriétés essentielles, classées par catégories.
Dans la réalité, vous ne modifierez que très peu d’entre elles, car la
valeur par
défaut est le plus souvent satisfaisante. Les propriétés que vous devez
connaître
et que vous serez amené à utiliser présentent une icône en marge,
identique à
celle qui se trouve en marge de ce paragraphe.
Astuce
Sélectionnez le nom d’une propriété et tapez sur la touche F1 pour
obtenir de l’aide. Vous pouvez aussi
sélectionner le contrôle sur la feuille, puis taper sur F1 pour
ouvrir la rubrique d’aide associée (voir
figure 13-1).
Figure 13-1 –Accédez en un clin d’œil aux rubriques d’aide des
propriétés
d’un contrôle.
Propriété Name
La propriété Name est exploitée par le programme et reste invisible à
l’utilisateur
final. Elle correspond au nom de l’objet et est de type String
(chaîne de
caractères). Ce nom est utilisé pour faire référence à l’objet dans le
code, par
exemple pour connaître ou modifier l’une de ses propriétés. Un même
nom ne
peut être utilisé pour plusieurs objets d’une même feuille.
Lorsque vous placez un contrôle sur une feuille, sa propriété Name est
par défaut
rapport à sa légende (Caption). Elle prend pour valeur l’une des
constantes
fmalignment :
• fmalignmentright (par défaut) place le libellé à droite du contrôle.
• fmalignmentleft le place à gauche.
Figure 13-3 –La légende d’un contrôle CheckBox ou RadioButton peut
être
alignée à droite ou à gauche du contrôle.
BackStyle
Cette propriété détermine le style de fond du contrôle. Elle prend pour
valeur
l’une des constantes fmBackStyle :
• fmBackStyleOpaque (par défaut) détermine un fond opaque. Les
éventuels objets
placés à l’arrière-plan de l’objet sont invisibles.
• fmBackStyleTransparent détermine un fond transparent. Les
éventuels objets
placés à l’arrière-plan de l’objet sont visibles.
Color
Cette propriété prend pour valeur une variable de type Long
représentant la
couleur de fond du contrôle. Lorsque vous modifiez sa valeur dans la
fenêtre
Propriétés, vous pouvez sélectionner une couleur sur l’onglet
Palette (voir
figure 13-4) ou sur l’onglet Système.
Si la propriété BackStyle est définie sur fmBackStyleTransparent,
Color est sans effet
sur l’apparence du contrôle.
ControlTipText
Cette propriété détermine le texte de l’info-bulle qui s’affiche
lorsque
l’utilisateur place le pointeur au-dessus du contrôle sans cliquer.
Elle accepte
une valeur de type String et contient par défaut une chaîne vide.
N’hésitez pas à
utiliser cette propriété pour décrire brièvement à l’utilisateur la
fonction des
contrôles d’une feuille (figure 13-6).
Figure 13-6 –Les info-bulles renseignent l’utilisateur sur la fonction
d’un
contrôle.
ForeColor
Cette propriété détermine la couleur de premier plan du contrôle,
pour
l’affichage de sa propriété Caption.
SpecialEffect
Cette propriété détermine l’apparence du contrôle sur la feuille :
• Les contrôles CheckBox, RadioButton et ToggleButton acceptent
l’une des constantes
suivantes :
– fmButtonEffectFalt ;
– fmButtonEffectSunken.
• Les autres contrôles acceptent l’une des constantes suivantes :
– fmSpecialEffectFlat ;
– fmSpecialEffectRaised ;
– fmSpecialEffectSunken ;
– fmSpecialEffectEtched.
La valeur attribuée par défaut à cette propriété correspond à
l’apparence
habituelle de ce type d’objets dans les applications Windows.
Style
Cette propriété détermine la façon dont la sélection s’effectue dans un
contrôle
ComboBox: l’utilisateur peut ou non êtr e autor isé à saisir une
valeur ne figur ant
pas dans la liste. Elle accepte pour valeur l’une des deux
constantes fmStyle
suivantes :
• fmStyleDropDownCombo (par défaut). L’utilisateur peut
sélectionner un item dans
la liste déroulante ou saisir manuellement une valeur de son
choix. C’est,
par exemple, le cas de la liste Zoom de la barre d’outils Standard
d’Excel.
• fmStyleDropDownList. Les seules valeurs autorisées sont
celles de la liste
attachée au contrôle. Lorsque l’utilisateur saisit un caractère au
clavier, le
premier élément de la liste commençant par ce caractère est
sélectionné. Si
aucun élément de la liste ne correspond, la valeur du contrôle
reste
inchangée.
Utilisez un contrôle ComboBox dont la propriété Style est définie
à
fmStyleDropDownList, plutôt qu’un ListBox, pour r éduir e l’espace
occupé sur la
feuille.
Attention
Lorsque vous autorisez la saisie manuelle dans la zone d’édition d’un
contrôle ComboBox, assurez-vous
que l’utilisateur ne pourra y entrer une valeur non valide, qui
générerait une erreur ou aboutirait à un
mauvais fonctionnement du programme. Affectez pour cela une
procédure à l’événement Change du
contrôle, qui contrôlera la valeur saisie (voir l’exemple donné
pour le contrôle TextBox, au chapitre
suivant).
Value
Else
Instructions
End If
Figure 13-7 –Value est l’une des propriétés les plus utilisées.
Visible
Cette propriété détermine la visibilité d’un contrôle pour
l’utilisateur. Elle
accepte une valeur de type Boolean :
• True (par défaut) indique que le contrôle est visible.
• False indique que le contrôle est masqué et n’apparaît pas sur la
feuille.
Info
La propriété Visible d’un contrôle n’influe pas sur son apparence
durant la phase de conception. Le
contrôle est toujours visible dans Visual Basic Editor.
La propriété Visible permet d’élaborer des feuilles dont
l’apparence et les
fonctionnalités varieront selon le contexte. Vous pouvez ainsi
n’afficher les
contrôles d’une feuille que s’ils doivent être renseignés par
l’utilisateur. La
figure 13-8 présente la feuille Nouveau salarié, en phase de
conception dans
Visual Basic Editor.
Enabled
Cette propriété détermine si un contrôle est accessible, c’est-à-
dire qu’il peut
avoir le focus, ou inaccessible, auquel cas il apparaît estompé et
l’utilisateur ne
peut le sélectionner ni à l’aide de la souris ni à l’aide de la touche Tab.
Enabled
accepte une valeur de type Boolean :
• True (par défaut). Le contrôle est accessible.
• False. Il n’est pas accessible.
Utilisez cette propriété pour déterminer l’accessibilité d’un
contrôle en
fonction du contexte. Dans l’exemple suivant, nous avons ajouté un
CheckBox sur
la feuille, afin d’indiquer si le nouveau salarié est dégagé ou non
des
obligations militaires – sa propriété Name a été définie à chkMilitaire. Il
est inutile
que l’utilisateur accède à ce contrôle si le nouveau salarié est une
femme. Nous
avons ajouté deux instructions dans ce sens.
Private Sub optFéminin_Click()
If optMarié.Value=True Then
[Link] = True
[Link] = True
Else
[Link] = False
[Link] = False
End If
[Link] = False
End Sub
Private Sub optMarié_Click()
If optFé[Link]=True Then
[Link] = True
[Link] = True
Else
[Link] = False
[Link] = False
End If
End Sub
Private Sub optMasculin_Click()
[Link] = False
[Link] = False
[Link] = True
End Sub
Private Sub optCélibataire_Click()
[Link] = False
[Link] = False
End Sub
Private Sub optMaritale_Click()
[Link] = False
[Link] = False
End Sub
Info
Notez qu’un contrôle peut être accessible et non modifiable. Pour plus
de précisions, voyez la propriété
Locked.
Figure 13-12 –La propriété Enabled détermine l’accessibilité d’un
contrôle en
fonction du contexte.
EnterKeyBehavior
Cette propriété détermine le comportement d’un contrôle
CheckBox lorsque
l’utilisateur appuie sur la touche Entrée. Elle accepte une valeur de
type Boolean :
• True. Une pression sur la touche Entrée crée une nouvelle ligne.
• False (par défaut). Une pression sur la touche Entrée passe le
focus au
contrôle suivant dans l’ordre de tabulation.
Info
Si la propriété MultiLine d’un CheckBox est définie sur False, le
contrôle n’autorise qu’une ligne et une
pression sur la touche Entrée entraînera toujours le passage du focus
au contrôle suivant dans l’ordre de
tabulation.
HideSelection
Cette propriété détermine si la sélection dans un TextBox ou un
ComboBox demeure
ou non visible lorsque le contrôle n’a pas le focus. Elle accepte une
valeur de
type Boolean :
• True (par défaut). La sélection n’est visible que lorsque le
contrôle a le
focus.
• False. La sélection demeure visible, que le contrôle ait le focus ou
non.
Maintenir la sélection visible dans un TextBox ou un ComboBox lorsque
celui-ci n’a
pas le focus est déroutant pour l’utilisateur, car cette propriété
est
généralement spécifique du contrôle ayant le focus.
Locked
Cette propriété détermine si un contrôle peut ou non être modifié ou
activé par
l’utilisateur. Elle accepte une valeur de type Boolean :
• True. Le contrôle peut être modifié.
• False (par défaut). Il n’est pas modifiable.
Conseil
Utilisez Locked conjointement avec Enabled, par exemple pour
laisser l’utilisateur copier le contenu
d’une zone de texte sans l’autoriser à le modifier.
Locked doit êtr e définie sur True pour un contr ôle ayant une
fonction de
consultation ; par exemple, un TextBox affichant le texte
sélectionné dans le
document ou le résultat d’un calcul.
Info
Lorsque la propriété Locked est définie à True, le contenu du contrôle
n’est pas modifiable directement
sur la feuille durant la phase Conception. Si vous souhaitez
modifier sa propriété Caption ou Value,
vous devez le faire dans la fenêtre Propriétés.
MaxLength
Cette propriété spécifie le nombre maximal de caractères que
l’utilisateur est
autorisé à saisir dans un TextBox ou un ComboBox. Elle accepte une
valeur de type
Integer. Par défaut, elle est définie sur 0, l’utilisateur étant
alor s autor isé à
entrer un nombre de caractères indéterminé.
Lorsque le nombre maximal de caractères est atteint, les frappes
de clavier
restent sans effet. Vous pouvez aussi choisir que le focus soit passé au
contrôle
suivant dans l’ordre de tabulation en définissant la propriété AutoTab
sur True.
Conseil
Affectez une valeur MaxLength aux TextBox destinés à recevoir un
nombre de caractères constant (mot
de passe ou code produit, par exemple), ou lorsque la limitation est
une nécessité du programme.
Voir aussi AutoTab.
MultiLine
Cette propriété détermine si le texte saisi dans un TextBox s’affiche
sur la ligne
suivante lorsqu’il arrive en bout de ligne. Si tel est le cas, le texte
s’affiche sur
la ligne suivante tant que les dimensions du contrôle le
permettent. MultiLine
accepte une valeur de type Boolean :
• True (par défaut). Le texte s’affiche sur plusieurs lignes lorsque
cela est
nécessaire.
• False. Il s’affiche sur une seule ligne.
SelectionMargin
Cette propriété détermine si l’utilisateur peut ou non sélectionner une
ligne de
texte dans un TextBox ou un ComboBox avec le curseur. Si tel est le
cas, le curseur se
transforme en flèche lorsqu’il est placé à gauche de la ligne à
sélectionner
(voir figure 13-13). SelectionMargin accepte une valeur de type
Boolean :
• True (par défaut). Ce type de sélection est possible.
• False. Ce type de sélection est impossible.
Figure 13-13 –Le curseur prend la forme d’une flèche indiquant qu’un
clic
entraînera la sélection de la ligne entière.
Style
Cette propriété détermine si un ComboBox autorise ou non la saisie
d’une valeur
ne figurant pas dans sa liste déroulante. Style accepte pour valeur une
constante
fmStyle :
• fmStyleDropDownCombo (par défaut). Le contrôle se
comporte comme une zone
de texte. L’utilisateur peut saisir une valeur de son choix dans
la zone
d’édition ou sélectionner l’une des options de la liste déroulante.
Si les
premières lettres saisies sont rapprochées de l’une de ces
options, le
complément automatique est proposé. L’utilisateur doit alors
accepter le
complément proposé ou saisir une valeur différente.
• fmStyleDropDownList. L’utilisateur ne peut sélectionner qu’une
des options de la
liste. Il est impossible de saisir une valeur différente dans la zone
d’édition
du contrôle. Si l’utilisateur saisit une lettre au clavier alors que le
contrôle a
le focus, l’option la plus proche de la lettre saisie est sélectionnée.
Info
La façon dont le rapprochement est effectué entre la valeur saisie par
l’utilisateur dans la zone d’édition
et les options de la liste est déterminée par les propriétés MatchEntry
et MatchRequired du contrôle.
TabKeyBehavior
Cette propriété détermine si l’utilisateur peut ou non saisir une
tabulation dans
LargeChange
Cette propriété spécifie la valeur d’incrémentation de la propriété
Value d’un
ScrollBar lor sque l’utilisateur clique dans la bar r e de
défilement, entr e le
curseur et l’une des flèches de défilement. Elle accepte une
valeur de type
Integer (1 par défaut).
Chaque fois que l’utilisateur clique dans la barre de défilement,
entre le
curseur et la flèche Bas (contrôle vertical) ou Droite (contrôle
horizontal),
Value est incr émentée de LargeChange, jusqu’à atteindr e Max.
Les clics r estent alor s
sans effet.
Chaque fois que l’utilisateur clique dans la barre de défilement,
entre le
curseur et la flèche Haut ou Gauche, Value est décrémentée de
LargeChange, jusqu’à
atteindre Min. Les clics restent alors sans effet.
Dans l’environnement Windows, un clic dans une barre de défilement
entraîne
généralement un déplacement supérieur à un clic sur la flèche (dans
une feuille
Excel par exemple, le déplacement est respectivement d’un écran
et d’une
ligne).
Pour un exemple d’utilisation de la propriété LargeChange, voyez
la section
consacrée à l’exploitation des objets ScrollBar, au chapitre suivant.
Divers
Accelerator
Cette propriété définit un raccourci clavier pour un contrôle. Elle
accepte une
valeur de type String. Affectez-lui un des caractères formant le
texte de sa
propriété Caption.
La lettre du raccourci est soulignée dans le libellé du contrôle
(seulement la
première occurrence). Sa casse ne sera considérée que si le libellé du
contrôle
contient à la fois la lettre majuscule et la lettre minuscule.
Combinée à la touche Alt, la saisie de la touche de raccourci d’un
contrôle lui
passe le focus. Si l’événement par défaut du contrôle est Click (pour un
bouton
de commande ou une case à cocher, par exemple), alors il s’exécute.
La figure 13-16 présente une feuille dont tous les contrôles ont
été affectés à
un raccourci clavier.
Lorsqu’une touche de raccourci est affectée à un Label, elle entraîne le
passage
du focus au contrôle suivant dans l’ordre de tabulation. Cette
fonction est
particulièrement intéressante pour activer un TextBox.
Attention
Veillez à ne pas attribuer un même raccourci clavier à des
contrôles différents sur une feuille. Sinon,
cela entraîne le passage du focus au premier suivant le contrôle actif,
dans l’ordre de tabulation.
Figure 13-16 –N’hésitez pas à affecter des touches de raccourci aux
contrôles
d’une feuille afin d’en optimiser l’utilisation.
GroupName
Cette propriété permet d’associer des OptionButton, afin que
l’utilisateur ne
puisse valider que l’un d’eux. Elle accepte une valeur de type
String. Pour
associer des boutons d’options, affectez la même chaîne de caractères
à leurs
propriétés GroupName respectives.
Astuce
Notez qu’il existe deux moyens d’associer des boutons d’options
sur une feuille : les placer sur un
conserve sa propriété TabIndex, il est ignoré s’il est le suivant
(touche Tab
seule) ou le précédent (Maj+Tab) dans l’ordre de tabulation, et le focus
est
passé à celui d’après.
Tag
Cette propriété stocke des informations supplémentaires sur le
contrôle sous la
forme d’une chaîne de caractères. Il peut s’agir d’une description du
contrôle,
affichée à l’utilisateur si nécessaire.
Emplacement
Height et Width
Ces propriétés, de type Single, déterminent respectivement la
hauteur et la
largeur en points d’un contrôle.
Vous n’avez a priori pas à vous en préoccuper, puisqu’elles sont
automatiquement mises à jour lorsque vous redimensionnez le
contrôle dans
Visual Basic Editor. Préférez donc les méthodes de
dimensionnement
présentées au chapitre précédent.
Left et Top
Ces propriétés, de type Single, déterminent la distance en points
du contrôle,
respectivement par rapport au bord gauche et au bord supérieur de
l’objet qui
le contient.
Vous n’avez a priori pas à vous en préoccuper, puisqu’elles sont
automatiquement mises à jour lorsque vous déplacez le contrôle
dans Visual
Basic Editor. Préférez donc les méthodes de mise en forme
présentées au
chapitre précédent.
Dans le cas d’une feuille, les propriétés Left et Top représentent
la distance en
points de la feuille par rapport aux bords gauche et supérieur de
l’écran lors de
son affichage. Elles ne sont considérées que si la propriété
StartUpPosition de la
feuille est définie à 0 (manuel).
StartUpPosition
Cette propriété détermine la position de la feuille sur l’écran.
Elle accepte
l’une des valeurs suivantes :
• 0 – Manual. La position de la feuille sur l’écran est
déterminée par ses
propriétés Left et Top.
• 1 – CenterOwner (par défaut). La feuille est centrée sur la
fenêtre de
l’application hôte.
• 2 – CenterScreen. La feuille est centrée sur l’écran, quelles
que soient la
position et la taille de la fenêtre de l’application hôte.
• 3 – Windows Default. La feuille s’affiche dans l’angle
supérieur gauche de
l’écran. Utilisez cette valeur lorsque vous souhaitez que la feuille
affichée
masque le moins possible le document actif.
Figure 13-21 –Vous pouvez choisir de toujours afficher la feuille au
centre de
la fenêtre de l’application hôte, quelles que soient la taille et la
position de
cette dernière.
gérée par les CommandButton. Elle accepte pour valeur l’une des
constantes
fmPictureSizeMode :
• fmPictureSizeModeClip (par défaut). Si la taille de l’image est
supérieure à
celle du contrôle, seule la partie tenant dans le contrôle s’affiche. La
partie
rognée variera en fonction de PictureAlignment.
• fmPictureSizeModeStretch. L’image est redimensionnée à la
même taille que
l’objet conteneur. Si le rapport homothétique n’est pas équilibré,
l’image
sera déformée.
• fmPictureSizeModeZoom. L’image est redimensionnée
proportionnellement. Si
le rapport homothétique n’est pas équilibré, l’image occupera
toute la
largeur de l’objet conteneur, mais pas toute la hauteur, ou
inversement.
PictureTiling
Cette propriété détermine si une image est ou non affichée en
mosaïque sur
une feuille ou un contrôle. Elle accepte une valeur de type Boolean :
• True. Si l’image est plus petite que l’objet conteneur, elle
s’affiche en
mosaïque sur la page (voir figure 13-26). Pour que l’affichage en
mosaïque
s’effectue correctement, la propriété PictureSizeMode doit être
définie à
fmPictureSizeModeClip.
• False (par défaut). L’image n’est pas affichée en mosaïque.
Figure 13-26 –Une image affichée en mosaïque sur une feuille.
Info
Une image affichée en mosaïque sur une feuille ou un contrôle
risque d’être rognée sur le bord
supérieur ou inférieur de l’objet, ainsi que sur son bord gauche ou
droit. Il est en effet peu probable que
la hauteur et la largeur de l’objet conteneur soient des multiples de
celles de l’image. Les bords rognés
dépendront de l’alignement de l’image sur l’objet (PictureAlignment).
Police
Font
Cette propriété détermine la police de caractères affectée à
l’affichage du
contenu d’un contrôle (Tahoma Regular corps 8, par défaut). Pour la
modifier,
cliquez sur le bouton … dans le volet droit de la fenêtre Propriétés du
contrôle.
Dans la boîte de dialogue qui s’affiche, déterminez la police de
caractères et
les attributs voulus, puis cliquez sur OK.
14
Maîtriser le comportement des contrôles
Ce chapitre vous propose de découvrir comment rendre les
interfaces
utilisateur vraiment fonctionnelles en leur ajoutant de l’interactivité
grâce aux
procédures événementielles. Il vous présente également les
techniques les plus
courantes pour tirer parti des propriétés de chaque contrôle.
Créer des procédures événementielles
Les contrôles placés sur une feuille sont réceptifs aux
événements utilisateur
qui les affectent. Vous pouvez ainsi créer des procédures dites
événementielles,
qui se déclencheront lorsque l’événement correspondant (un clic de
souris, par
exemple) sera repéré. Ces procédures ont des fonctions très variées,
telles que
vérifier la validité d’une information, modifier l’apparence de la
feuille,
ouvrir une autre feuille, fermer la feuille et passer les valeurs qu’elle
contient
à une procédure du module de code, etc.
Créer une procédure
Il existe plusieurs façons de créer des procédures événementielles.
Quelle que
soit la méthode choisie, elles répondent toujours à une même
syntaxe :
Private Sub Contrôle_Evénement()
Instructions
End Sub
L’instruction de déclaration est toujours précédée de Private, car une
procédure
événementielle est par définition privée. Elle ne s’exécute que
lorsque
l’événement est repéré et ne peut être appelée par une
instruction située dans
une procédure du projet.
Contrôle est le nom (pr opr iété Name) du contr ôle auquel est
attachée la pr océdur e.
Evénement déclencher a la pr océdur e lor squ’il affecter a le
contr ôle ; il peut s’agir
d’un clic de souris, d’une frappe de la touche Entrée ou encore
d’une
modification de la valeur du contrôle. Le nom du contrôle et
celui de
l’événement sont toujours séparés par un trait de soulignement.
Info
Dans le cas de procédures événementielles affectées à des
feuilles, le nom de l’objet n’apparaît pas
dans l’instruction de déclaration. Le mot-clé UserForm est dans
ce cas employé pour identifier la
feuille :
Private Sub UserForm_Evénement()
Vous pouvez écrire une procédure événementielle directement dans la
fenêtre
de Code de la feuille, en adoptant l’une des méthodes présentées plus
loin dans
ce chapitre. Cliquez-droit n’importe où sur la feuille et choisissez
la
commande Code.
Les
instructions
de
déclaration
peuvent
cependant
être
ajoutées
automatiquement à partir de la feuille. Pour affecter une
procédure
événementielle à un contrôle, à partir de l’objet conteneur :
1. Double-cliquez sur le contrôle voulu, ou cliquez-droit et
choisissez la
commande Code (voir figure 14-1), ou sélectionnez le contrôle
puis
choisissez la commande Code du menu Affichage.
Name
Respectivement cmdBouton, cmdTexte et cmdQuitter
Caption
Respectivement Bouton actif, Zone de texte et Quitter
Figure 14-4 –La feuille Test des procédures événementielles réalisée.
Enfin, affectez les procédures événementielles suivantes au TextBox et
aux trois
CommandButton.
Private Sub txtTexte_AfterUpdate()
MsgBox "Vous avez modifié la valeur de la zone de texte.", _
vbOKOnly + vbInformation, "Evénement AfterUpdate() détecté"
End Sub
Private Sub cmdBouton_Click()
Dim BoutonActif As String
If [Link]=True Then
BoutonActif = [Link]
ElseIf [Link]=True Then
BoutonActif = [Link]
ElseIf [Link]=True Then
BoutonActif = [Link]
Else
BoutonActif = [Link]
End If
MsgBox "Le bouton d’option sélectionné est le bouton libellé " _
& BoutonActif, vbOKOnly + vbInformation, "Evénement Click() détecté"
End Sub
Private Sub cmdTexte_Click()
MsgBox "La valeur de la zone de texte est : " & [Link], _
vbOKOnly + vbInformation, "Evénement Click() détecté"
End Sub
Private Sub cmdQuitter_Click()
fmTestEvé
End Sub
Sélectionnez la feuille dans la fenêtre UserForm et cliquez sur le
bouton
Exécuter de la barre d’outils Standard. La feuille s’affiche à l’écran.
Testez son
comportement. Lorsque les événements affectés à une procédure
événementielle sont détectés, cette dernière s’exécute :
• La modification de la valeur de la zone de texte est
interprétée comme
l’événement AfterUpdate affectant txtTexte lors du passage du focus à
un autre
contrôle. La procédure correspondante est exécutée et la boîte de
dialogue
de la figure 14-5 s’affiche.
• Un clic sur Bouton actif est détecté comme l’événement Click
affectant
cmdBouton. La pr océdur e cor r espondante est exécutée et la
boîte de dialogue
de la figure 14-6 s’affiche.
• Un clic sur Zone de texte est détecté comme l’événement
Click affectant
cmdTexte. La pr océdur e cor r espondante est exécutée et la boîte de
dialogue de
la figure 14-7 s’affiche.
• Un clic sur Quitter est détecté comme l’événement Click affectant
cmdQuitter.
La procédure correspondante est exécutée et la fenêtre se ferme.
Figure 14-5 –Déclenchement de la procédure txtTexte_AfterUpdate.
Figure 14-6 –Déclenchement de la procédure cmdBouton_Click.
Figure 14-7 –Déclenchement de la procédure cmdTexte_Click.
Les événements
Les événements sont nombreux et varient d’un contrôle à l’autre.
Ceux qu’un
contrôle sait gérer sont intimement liés à sa nature, c’est-à-dire
à ses
propriétés. Par exemple, les événements Change, AfterUpdate et
BeforeUpdate sont
syntaxe suivante :
Private Sub Contrôle_Exit(ByVal Annulation As
[Link])
Pour annuler le passage du focus, affectez la valeur True à
l’argument
Annulation dans une instr uction de la pr océdur e événementielle
(voir
l’exemple donné pour BeforeUpdate).
• Initialize est détecté lorsqu’une feuille est chargée. La procédure
affectée à
cet événement s’exécute avant l’affichage de la feuille et s’utilise
selon la
syntaxe suivante :
Private Sub UserForm_Initialize()
Instructions
End Sub
Notez que, dans le cas de la procédure Initialize d’une feuille, le
nom de
cette dernière n’est pas utilisé pour spécifier l’objet ; on utilise toujours
le
mot-clé UserForm.
C’est une procédure absolument essentielle de la programmation VBA.
Elle
permet en effet d’effectuer des réglages de la feuille avant son
affichage.
Vous l’utiliserez, par exemple, pour affecter une liste d’éléments à un
ListBox
ou un ComboBox de la feuille. Reportez-vous à la section « ComboBox
», plus
loin dans ce chapitre.
Attention
Lorsque vous utilisez la méthode Hide pour masquer une feuille
précédemment affichée à l’aide de
Show, les ressources mémoire qu’elle occupe ne sont pas
libérées. Si, par la suite, vous affichez de
nouveau la feuille, l’événement Initialize ne sera donc pas reconnu et
ses différents contrôles auront
les mêmes valeurs que lorsqu’elle a été masquée. Pour libérer
les ressources mémoire d’une feuille
UserForm, vous devez lui appliquer la méthode Unload, selon la
syntaxe suivante :
Unload NomFeuille
La méthode Load charge une feuille en déclenchant la procédure
événementielle Initialize, sans pour
autant l’afficher. Notez que, pour manipuler une feuille par
programmation, il faut qu’elle soit chargée
(à l’aide de Show ou de Load).
• KeyDown est détecté lorsqu’une touche du clavier est
enfoncée. Il répond à la
syntaxe suivante :
Private Sub Contrôle_KeyDown(ByVal CodeTouche As
[Link],
ByVal EtatMaj As Integer)
CodeTouche r envoie le code de la touche fr appée et EtatMaj
r envoie l’état des
touches Maj, Ctrl et Alt (0 si aucune n’est enfoncée, 1 si Maj est
enfoncée, 2
si c’est Ctrl, 4 si c’est Alt, ces valeurs s’additionnant si plusieurs
de ces
touches sont enfoncées).
Name
frSexe
Caption
Sexe du nouveau membre
Contrôle OptionButton
Name
optMasculin
Caption
Masculin
Value
True
Contrôle OptionButton
Name
optFeminin
Caption
Féminin
Value
False
Contrôle Label
Name
lbPrenom
Caption
Prénom
Contrôle TextBox
Name
txtPrenom
Value
Contrôle Label
Name
lbNom
Caption
Nom
Contrôle TextBox
Name
txtNom
Value
Contrôle CommandButton
Name
cmdOK
Caption
OK
Contrôle CommandButton
Name
cmdAnnuler
Caption
Annuler
Placez ensuite le code suivant dans la section Déclarations de la
fenêtre Code
de la feuille :
Sub optFeminin_Click()
[Link] = "Nom de jeune fille"
End Sub
Sub optMasculin_Click()
[Link] = "Nom"
End Sub
Sub cmdOK_Click()
End Sub
Sélectionnez ensuite la feuille, puis cliquez sur le bouton Exécuter de la
barre
d’outils Standard. Lorsque vous cliquez sur l’un des boutons
d’option, le
libellé de lbNom varie en fonction de l’option sélectionnée (voir figure
14-9).
Attention
Lorsque vous écrivez du code modifiant la valeur Caption d’un
Label, veillez à ce que la taille du
contrôle permette l’affichage complet du nouveau libellé.
Figure 14-9 –Faites varier le libellé d’un contrôle Label de façon à
refléter
l’information attendue.
Contrôle TextBox
Lorsque vous utilisez un TextBox destiné à recevoir une
information bien
spécifique, vérifiez que l’utilisateur entre une valeur valide. Par
exemple, si
vous attendez une valeur représentant une somme à payer,
assurez-vous que
l’information entrée correspond bien à un nombre et qu’elle
s’inscrit bien
entre les limites éventuellement définies.
Figure 14-11 –Une valeur non valide a été saisie dans la zone de
texte.
La procédure cmdOK_Click vérifie qu’une valeur a bien été entrée dans
la zone de
texte. Si tel n’est pas le cas, une boîte de dialogue s’affiche à
l’attention de
l’utilisateur (voir figure 14-12). Si, au contraire, la zone de texte
contient une
valeur, alors la méthode Hide est appliquée à la feuille afin de la
masquer.
Figure 14-12 –Une valeur doit être saisie dans la zone de texte.
Info
Notez que la procédure Cmd_Click ne vérifie pas que la valeur de la
zone de texte est valide (de type
numérique), mais uniquement qu’elle est différente d’une chaîne
vide. En effet, c’est la procédure
txtValeur_Change qui s’en charge.
ComboBox
Les ComboBox sont très fréquents dans les interfaces utilisateur de
la plupart des
logiciels. Ils présentent en effet l’avantage d’afficher un grand
nombre
d’options en n’occupant qu’un espace très limité sur la feuille.
Par défaut, un ComboBox se comporte à la manière d’un
TextBox, c’est-à-dire que
l’utilisateur est autorisé à saisir une valeur ne figurant pas parmi les
options de
la liste déroulante. Vous pouvez cependant déterminer un
comportement
analogue à celui d’un ListBox, c’est-à-dire interdire la saisie de
nouvelles
valeurs. Définissez pour cela la propriété Style du contrôle à
fmStyleDropDownList
(voir chapitre précédent).
Ajout d’éléments à la liste d’un ComboBox
La méthode AddItem
La liste affectée à un ComboBox est généralement déterminée
dans le code du
programme, à l’aide de la méthode AddItem, selon la syntaxe suivante
:
Contrô[Link](ElementAjoutéALaListe, Index)
ElementAjoutéALaListe est une chaîne de car actèr es et Index est
la position de
l’élément dans la liste (0 pour le premier élément). Ce dernier
argument est
généralement omis ; l’élément ajouté est alors placé en dernière
position.
Info
Lorsque Index est omis, ElementAjoutéALaListe peut être placé
directement derrière AddItem, en
ignorant les parenthèses.
Les instructions définissant les éléments de la liste d’un
ComboBox sont
généralement placées dans une procédure événementielle
attachée à
l’événement Initialize de la feuille. La liste est ainsi mise à jour au
moment de
l’affichage de cette dernière.
Pour réaliser l’exemple suivant, placez un Label, un ComboBox et
un CommandButton
sur une feuille, dotés des propriétés suivantes :
Proprié té
Vale ur
Fe uille
Name
fmComboBox
Caption
Utilisation d’un contrôle ComboBox
Contrôle Label
Name
lbComboBox
Caption
Sélection d’une valeur
Contrôle ComboBox
Name
cbComboBox
Value
Contrôle CommandButton
Name
cmdQuitter
Value
Quitter
Ajoutez le code suivant :
Private Sub UserForm_Initialize()
Dim mavar
For mavar = 1 To 10
[Link] "Element de liste " & mavar
Next mavar
End Sub
Private Sub cmdQuitter_Click()
End Sub
Exécutez ce code. Déroulez la liste modifiable pour visualiser les
options
disponibles (voir figure 14-13). Pour fermer la feuille, cliquez sur
le bouton
Quitter.
Figure 14-13 –La liste est affectée au contrôle à l’affichage de la
feuille.
La procédure UserForm_Initialize est exécutée avant l’affichage de
la feuille. La
boucle For…Next s’exécute alors, ajoutant dix éléments à la liste de
cbComboBox.
Info
Utilisez la méthode RemoveItem pour supprimer des éléments d’une
liste.
La propriété RowSource
Les éléments de la liste peuvent aussi être affectés au contrôle grâce à
RowSource.
Cette propriété accepte pour valeur une chaîne représentant une
cellule ou une
plage de cellules. Cette possibilité est très pratique lorsqu’un projet est
affecté
ListBox
Les contrôles ListBox et ComboBox partagent nombre de
propriétés (RowSource,
ControlSource, BoundColumn, etc.) et de méthodes (AddItem et
RemoveItem, par exemple).
Pour affecter une liste à un ListBox, utilisez l’une des méthodes
présentées pour
les ComboBox.
Un ListBox peut n’autoriser la sélection que d’un élément de la
liste, ou
autoriser des choix multiples (avec différentes méthodes de sélection).
Le type de sélection d’un ListBox est déterminé par sa propriété
MultiSelect, qui
accepte pour valeur l’une des constantes fmMultiSelect :
• fmMultiSelectSingle (par défaut). Un seul élément peut être
sélectionné.
• fmMultiSelectExtended. Plusieurs éléments peuvent être
sélectionnés avec les
touches Maj ou Ctrl. Un clic sur un élément de la liste, sans
qu’aucune de
ces touches ne soit enfoncée, désélectionne tous les autres éléments.
• fmMultiSelectMulti. Plusieurs éléments peuvent être
sélectionnés ou
désélectionnés par de simples clics, sans modifier l’état des autres
éléments
de la liste.
Figure 14-17 –Une zone de liste n’autorisant qu’une sélection unique.
[Link] "Bidault"
[Link] "Deschamps"
[Link] "Kervarrec"
[Link] "Goraguer"
[Link] "Lemaire"
[Link] "Leroux"
[Link] "Martin"
[Link] "Opéra"
[Link] "Otello"
End Sub
Private Sub cmdValider_Click()
Dim compteur As Single
For compteur = 0 To ([Link]-1)
If [Link](compteur)=True Then
[Link] (compteur)
End If
Next compteur
End Sub
La première procédure affecte une liste au ListBox à l’affichage de la
feuille. La
procédure cmdValider_Click utilise les propriétés suivantes du ListBox :
• ListCount renvoie le nombre d’éléments de la liste.
• Selected(index) renvoie une valeur booléenne indiquant si
l’élément à la
position index est sélectionné.
• List(index) renvoie la chaîne de caractères correspondant à
l’élément à la
position index.
Une boucle For…Next est utilisée pour tester la valeur de chacun des
éléments de
la liste (le premier ayant pour index 0, l’index du dernier est égal au
nombre
total d’éléments de la liste, moins 1). Si l’élément testé est
sélectionné,
l’instruction [Link] en affiche le nom dans la fenêtre
Exécution de Visual
Basic Editor. Enfin, la méthode Hide est appliquée à la feuille afin de le
fermer.
Exécutez la feuille. Sélectionnez les éléments de votre choix dans la
liste, puis
cliquez sur le bouton Valider. La feuille se ferme. Affichez la fenêtre
Exécution
de Visual Basic Editor (Ctrl+G). Les éléments sélectionnés dans la liste
y sont
inscrits (voir figure 14-19).
Caption
Les années bissextiles
Contrôle TextBox
Name
txtAnnée
Value
L’an 2000 est une année bissextile
Locked
True
Contrôle ScrollBar
Name
scrAnnée
Value
2000
Min
0
Max
3000
SmallChange
4
LargeChange
100
Ajoutez le code suivant dans la section Déclarations de la
fenêtre Code de la
feuille :
Private Sub scrAnnée_Change()
Dim varAnnée As Single
varAnnée = scrAnné[Link]
txtAnné[Link] = "L’an " & varAnnée & " est une année bissextile."
End Sub
La procédure scrAnnée_Change sera déclenchée chaque fois que
l’utilisateur
modifiera l’emplacement du curseur sur le ScrollBar. Elle affecte
à varAnnée la
valeur définie par le curseur (propriété Value de scrAnnée). La
propriété Value du
TextBox est ensuite définie et la zone d’édition affiche que
varAnnée est une année
bissextile.
Exécutez la feuille (figure 14-20). La barre de défilement modifie
l’année
affichée dans la zone de texte. Lorsque vous cliquez sur l’une
des flèches de
défilement, la valeur du contrôle est incrémentée ou décrémentée
de 4
(SmallChange). Lorsque vous cliquez dans la barre, entre le
curseur et une des
flèches, cette valeur est incrémentée ou décrémentée de 100
(LargeChange).
Contrôle TextBox
Name
txtJour
Value
Lundi
Locked
True
Contrôle SpinButton
Name
spbJour
Value
7
Min
1
Max
7
SmallChange
1
Ajoutez le code suivant dans la section Déclarations de la
fenêtre Code de la
feuille :
1: Private Sub spbJour_Change()
2: Dim varBoutonToupie As Single
3: varBoutonToupie = [Link]
4: [Link] = QuelJour(varBoutonToupie)
5: End Sub
6: Private Function QuelJour(varBoutonToupie)
7: Select Case varBoutonToupie
8: Case 1
9: QuelJour = "Dimanche"
10: Case 2
11: QuelJour = "Samedi"
12: Case 3
13: QuelJour = "Vendredi"
14: Case 4
15: QuelJour = "Jeudi"
16: Case 5
17: QuelJour = "Mercredi"
18: Case 6
19: QuelJour = "Mardi"
20: Case 7
21: QuelJour = "Lundi"
22: End Select
23: End Function
Exécutez la feuille (figure 14-21). Le bouton toupie modifie le
jour affiché
dans la zone de texte. Lorsqu’on arrive à Dimanche, la flèche de
défilement
Bas est sans effet. Lorsque Lundi est affiché, la flèche Haut est sans
effet.
QUATRIÈME PARTIE
Notions avancées de la
programmation Excel
15
Programmer des événements Excel
Vous avez découvert, au cours de cet ouvrage, l’environnement de
Visual Basic
Editor, les techniques de programmation en VBA et les outils
d’aide au
développement de projet. Ce chapitre vous apprendra à gérer
précisément les
événements utilisateur susceptibles d’affecter les objets Excel au
cours d’une
utilisation classique du logiciel. Vous verrez qu’il est possible de
détecter les
actions de l’utilisateur sur un classeur et de créer des
procédures affectées à
ces événements.
Au même titre que les contrôles placés sur une feuille UserForm, les
classeurs
et les feuilles Excel sont des objets auxquels vous pouvez
affecter des
procédures événementielles. Vous gérez ainsi des événements
tels que la
création d’un nouveau classeur, la modification d’une cellule,
l’activation
d’une feuille, etc.
L’objet Application
Au sommet du modèle d’objets d’Excel se trouve Application. Il
représente
l’ensemble de l’application et est donc l’objet conteneur de tous
les autres.
L’objet Application est particulièrement intéressant pour le
développeur. Il
intègre en effet la gestion d’événements de niveau application,
susceptibles
d’intervenir lors d’une utilisation courante du tableur : création,
ouverture ou
fermeture d’un classeur, etc.
Les sections suivantes vous indiquent comment créer des
procédures
événementielles pour l’objet Application.
Déclaration et instanciation de l’objet Application
Les procédures destinées à gérer les événements utilisateur de
niveau
application ne peuvent être écrites que dans un module de
classe, dans lequel
vous devez déclarer une variable objet de type Application à
l’aide du mot-clé
classeur.
La reconnaissance de l’événement NewWorkbook est utile pour
créer des
procédures destinées à aider l’utilisateur dans ses tâches
courantes. Vous
pouvez par exemple afficher une feuille UserForm contenant une
liste
d’options de classeurs : l’utilisateur sera alors invité à indiquer le
type de
classeur qu’il souhaite réaliser et la procédure appelée insérera
les données
essentielles, créera le nombre de feuilles voulues, enregistrera le
classeur dans
le bon dossier, etc.
La liste Procédure recense les événements gérés par l’objet
Application. Vous y
trouverez notamment WindowActivate (activation d’une fenêtre
par l’utilisateur),
ou encore WorkbookBeforePrint (survient avant l’exécution d’une
impression). Les
événements dont le nom contient la chaîne Before surviennent avant
l’exécution
d’une tâche. Ils intègrent le plus souvent un argument Cancel
permettant
d’annuler cette dernière si les conditions requises ne sont pas
remplies. Les
événements dont le nom contient la chaîne After surviennent après
l’exécution
d’une tâche.
Pour des informations supplémentaires sur un événement de l’objet
Application,
choisissez-le dans la liste Procédure, sélectionnez son nom dans
la fenêtre
Code et appuyez sur la touche F1.
Propriétés de l’objet Application
Les propriétés de l’objet Application sont lisibles et modifiables
comme celles
de n’importe quel objet. Le tableau 15-1 présente sommairement
les
principales. Pour plus d’informations, saisissez le nom de la
propriété dans
une fenêtre Code, sélectionnez-le et tapez sur la touche F1.
Tableau [Link] propriétés essentielles de l’objet Application
Proprié té
De scription
ActiveWorkbook
Renvoie l’objet Workbook correspondant au classeur actif (en lecture
seule).
Renvoie l’objet Worksheet correspondant à la feuille active du classeur
spécifié
ActiveSheet
(en lecture seule).
Renvoie l’objet Range correspondant à la cellule active de la feuille de
classeur
ActiveCell
spécifiée (en lecture seule).
Renvoie le nom de l’application, qui apparaît dans la barre de titre. La
valeur par
défaut est "Microsoft Excel". La figure 15-2 représente une session
Excel dans
Caption
laquelle nous avons redéfini la valeur de la propriété Caption de l’objet
Application ([Link] = ChaîneTitre).
Figure 15-4 –Vous pouvez protéger l’accès aux données d’une feuille
de
calcul.
Rappel
Pour empêcher l’utilisateur de lire le mot de passe dans Visual Basic
Editor, protégez aussi votre projet
par mot de passe.
Pour des informations supplémentaires sur un événement de l’objet
Application,
choisissez-le dans la liste Procédure, sélectionnez son nom dans
la fenêtre
Code et appuyez sur la touche F1.
L’objet Worksheet
Le dossier Microsoft Excel Objets contient aussi des objets
Worksheet
correspondant aux feuilles du classeur (voir figure 15-3).
Les feuilles gèrent les événements présentés dans le tableau 15-3.
Pour accéder
aux rubriques d’aide d’un événement, ouvrez la fenêtre Code
d’un objet
Feuille, choisissez l’événement voulu dans la liste Procédure,
sélectionnez son
nom et appuyez sur la touche F1.
Tableau 15-3.Événements gérés par les objets Worksheet
Évé ne me nt
De scription
Activate
Survient lorsque la feuille de calcul est activée.
Attention
Notez que les fenêtres Code des objets Workbook et Worksheet ne
peuvent contenir que des procédures
événementielles. Les procédures appelées doivent se trouver dans des
modules de code.
Pour une liste détaillée des propriétés, méthodes et événements
des feuilles,
saisissez Worksheet dans une fenêtre Code, sélectionnez ce mot et
appuyez sur
la touche F1.
16
Protéger et authentifier des projets VBA
Les virus macros
Parmi les virus, ceux qui infectent les macros font partie des plus
fréquents. Il
s’agit en général de macros conçues pour s’exécuter à
l’ouverture d’un
document ou pour se substituer à certaines commandes de
l’application hôte.
Ces virus sont attachés à un document et sont susceptibles
d’affecter les
documents du même type sur une machine infectée.
Du fait de leur grande souplesse de personnalisation et de leur
popularité,
Word et Excel sont les applications les plus touchées, mais tout
type de
document capable de stocker des macros peut être infecté.
Les virus macros sont plus ou moins nuisibles. Les plus néfastes
suppriment
des fichiers du disque dur ou sur le réseau, ou endommagent
des fichiers
indispensables au bon fonctionnement d’une application, voire du
système.
Plus pernicieux, certains suppriment des données dans un
document ou au
contraire ajoutent des mots et en modifient ainsi le sens.
Se protéger des virus macros
Dans la version 97 d’Office, la seule option de protection consistait à
prévenir
l’utilisateur de la présence de macros dans un document au
moment de son
ouverture et à lui proposer de les désactiver ; cependant, le
document était
alors ouvert en lecture seule et il était impossible de lui
apporter des
modifications.
Depuis la version 2000 d’Office, Microsoft a introduit deux
nouveautés
dédiées à la sécurité et à la protection contre les virus macros : la
possibilité de
définir des niveaux de sécurité, comparables à ceux qui
existaient déjà dans
Internet Explorer, et la signature électronique des macros VBA.
Définir un niveau de sécurité
Les options de sécurité ont sensiblement été modifiées dans les
versions 2007
et 2010 d’Excel. Procédez comme suit :
1. Cliquez sur l’onglet Fichier puis sur le bouton Options Excel.
2. Dans le volet gauche de la fenêtre, sélectionnez Centre de
gestion de la
confidentialité (voir figure 16-1).
3. Cliquez sur le bouton Paramètres de gestion du centre de
confidentialité. La
fenêtre qui s’ouvre est composée de plusieurs onglets. Nous
présentons
sommairement
ceux
qui
nous
intéressent
ci-après
(pour
plus
d’informations, consultez l’aide d’Excel) :
– Éditeurs approuvés. Il s’agit de ceux dont vous reconnaissez les
signatures numériques dignes de confiance. Les macros des
documents
qu’ils ont signés seront activées.
Figure 16-1 –Définissez les options de sécurité d’Excel dans cette
fenêtre.
Figure 16-6 –Le mot de passe est maintenant requis pour accéder au
code du
projet.
Attention
Si vous oubliez le mot de passe défini au moment du
verrouillage, vous n’aurez plus aucun moyen
d’accéder au code. Il est fortement recommandé d’effectuer une
sauvegarde du projet ou d’en exporter
les modules et les feuilles avant de le protéger par mot de passe.
Limiter les droits d’exécution d’une macro
Il est parfois nécessaire de définir des autorisations pour
l’exécution d’une
macro, par exemple si elle donne accès à des informations
confidentielles, ou
encore quand elle peut causer des dégâts si elle n’est pas utilisée
correctement.
La solution consiste alors à réclamer un mot de passe au
moment de son
exécution.
On crée pour cela une feuille intégrant une zone de texte dans
laquelle
l’utilisateur est invité à entrer le mot de passe. Une procédure
vérifie que
l’information fournie est correcte avant d’exécuter le code. Le
projet devra
évidemment être protégé contre l’affichage, afin que l’utilisateur ne
puisse pas
consulter le mot de passe dans le code de la feuille.
Voici une façon d’écrire le code de vérification du mot de passe.
Créez une
feuille UserForm nommée fmMotDePasse et placez-y un Label, un
TextBox et deux
3:
4: Sub ControleMotDePasse(NumTentatives As Byte, MotDePasse1 As
String,
Optional MotDePasse2 As String, Optional MotDePasse3 As String)
5: varNumTentatives = NumTentatives
6: varMotDePasse1 = MotDePasse1
7:
8: ’On vérifie si plusieurs mots de passe ont été passés,
9: ’et on affecte une valeur aux variables en conséquence.
10: If IsMissing(MotDePasse2)=True Then
11: varMotDePasse2 = MotDePasse1
12: Else
13: varMotDePasse2 = MotDePasse2
14: End If
15: If IsMissing(MotDePasse3)=True Then
16: varMotDePasse3 = MotDePasse1
17: Else
18: varMotDePasse3 = MotDePasse3
19: End If
20:
21: End Sub
Ligne 1, nous avons créé trois variables destinées à recevoir les
3 mots de
passe autorisés. Nous avons ensuite modifié la déclaration de
ControleMotDePasse
(ligne 4) en y ajoutant les arguments optionnels MotDePasse2 et
MotDePasse3. Notez
que nous avons dû déplacer l’argument Numtentatives en début
de liste car un
argument optionnel ne peut être suivi d’un obligatoire.
Deux structures conditionnelles (lignes 10 à 14 et lignes 15 à
19) vérifient
ensuite si les mots de passe optionnels ont été passés. Si
l’argument
correspondant au deuxième mot de passe valide a été passé, sa
valeur est
affectée à varMotDePasse2 ; sinon varMotDePasse2 vaut
MotDePasse1. Le même traitement
est appliqué à varMotDePasse3.
Rappel
Le mot-clé Optional indique qu’un argument n’est pas obligatoire.
La fonction IsMissing sert pour
vérifier si l’argument a été passé ou non.
Attention
La fonction IsMissing ne fonctionne correctement qu’avec des
arguments de type Variant. Si vous
déclarez les arguments MotDePasse2 et MotDePasse3 de type
String, IsMissing renverra toujours
False. En conséquence, varMotDePasse2 et varMotDePasse3 se
verront affecter une chaîne vide, qui
sera reconnue comme mot de passe valide.
Modifiez ensuite le test de la procédure cmdOK_Click de façon
que chacun des
trois mots de passe autorisés soit reconnu comme valide :
If =varMotDePasse1 Or =varMotDePasse2
Or =varMotDePasse3 Then
Info
Grâce aux instructions des lignes 10 à 19, varMotDePasse2 et
varMotDePasse3 ne sont jamais vides,
même si les arguments MotDePasse2 et/ou MotDePasse3 n’ont
pas été passés à la procédure. Ce
traitement est nécessaire pour qu’aucune erreur ne soit
provoquée lors de la vérification du texte saisi
par l’utilisateur.
Pour appeler le programme mot de passe, il suffit maintenant de
placer
l’instruction suivante à l’endroit voulu :
Call ControleMotDePasse(NumTentatives, MotDePasse1, MotDePasse2,
MotDePasse3)
Pour le tester, placez la procédure suivante dans n’importe quel
module du
projet et exécutez-la.
1: Sub TestControlePlusieursMotsDePasse()
2: Call ControleMotDePasse(5, "Bonjour")
3: MsgBox "Mot de passe correct." & vbCr & "Poursuite de
l’exécution.", _
4: vbOKOnly + vbInformation
5: Call ControleMotDePasse(5, "Bonjour", "Salut")
6: MsgBox "Mot de passe correct." & vbCr & "Poursuite de
l’exécution.", _
7: vbOKOnly + vbInformation
8: Call ControleMotDePasse(5, "Bonjour", "Salut", "Coucou")
9: MsgBox "Mot de passe correct." & vbCr & "Poursuite de
l’exécution.", _
10: vbOKOnly + vbInformation
11: End Sub
Chacune des instructions appelant la procédure de vérification du mot
de passe
(lignes 2, 5 et 8) autorise 5 tentatives. Lors du premier appel,
seul le mot de
passe "Bonjour" est passé comme argument. Le deuxième appel
fournit aussi la
valeur "Salut" pour l’argument optionnel MotDePasse2. L’un ou
l’autre des mots
de passe sera donc accepté. Enfin, lors du troisième appel, tous les
arguments
sont passés à la procédure ControleMotDePasse et les mots de
passe "Bonjour",
"Salut" et "Coucou" seront tous trois acceptés. Chaque fois que le bon
mot de
passe est fourni par l’utilisateur, la procédure
TestControlePlusieursMotsDePasse
reprend la main et un message s’affiche (lignes 3 et 9).
Authentifier ses macros
Les signatures numériques servent à authentifier vos macros en
identifiant leur
source (le nom de la personne ou de la société les ayant
développées). À
l’ouverture d’un document, le détail des signatures des
éventuelles macros
s’affiche à l’écran.
Conseil
Le fait que des macros soient numériquement signées ne vous garantit
pas leur fiabilité. Un développeur
Info
L’outil selfcert n’est pas installé par défaut avec Office 365.
Pour une liste exhaustive des organismes de certification,
consultez l’aide en
ligne d’Office ou, dans la boîte de dialogue représentée à la
cliquez sur le lien.
Authentifier une macro
Lorsque vous avez obtenu une signature électronique, il ne vous
reste qu’à
« signer » vos macros :
1. Sélectionnez le projet dans l’Explorateur de projet.
2. Choisissez Outils > Signature électronique (voir figure 16-12).
3. Cliquez sur le bouton Choisir et, dans la fenêtre qui s’affiche,
choisissez la
signature électronique que vous souhaitez affecter à votre projet.
Figure 16-12 –La boîte de dialogue Signature numérique gère les
signatures
affectées à vos projets.
17
Exemple complet d’application Excel
Ce chapitre constitue un récapitulatif. Nous vous proposons d’y
créer un
programme complet, étape par étape, de sa définition à son
intégration dans
l’interface d’Excel, qui mette en pratique l’ensemble des
connaissances
acquises au cours de cet ouvrage.
Info
Si ce n’est déjà fait, téléchargez les codes sources des exemples
du livre à l’adresse suivante :
;01. Commencez par décompresser l’archive, puis testez le
programme que nous développerons dans ce chapitre en ouvrant
le fichier du dossier
Bonus.
Présentation du projet d’application Excel
Le programme que nous allons écrire ici aura pour fonction de
générer des
factures de droits d’auteur et de mettre à jour un tableau Word. La
présente une facture type.
Afin de simplifier et de sécuriser cette tâche, nous créerons des
interfaces
utilisateur adaptées, dans lesquelles il suffira d’entrer les données
nécessaires
au programme. Ce dernier composera les feuilles de paie, les
enregistrera et
en imprimera un nombre d’exemplaires défini par l’utilisateur. Il
mettra
également à jour un tableau dans un document Word
répertoriant les
informations essentielles concernant le contrat.
Figure 17-2 –Chaque fois qu’un contrat est édité, les données sont
intégrées
dans un fichier Word.
Le programme VBA que vous développerez dans ce chapitre utilise le
contrôle
Calendrier pour inviter l’utilisateur à sélectionner des dates. Celui-ci
n’est pas
activé par défaut, commencez par le référencer dans la boîte à outils
de Visual
Basic. La procédure est décrite à la section « Personnaliser la boîte à
outils »
du chapitres 12.
Attention
Si vous installez vos macros sur différents ordinateurs, les
contrôles personnalisés devront également
être dupliqués.
Une fois le contrôle Calendrier installé sur votre ordinateur,
testez le
programme. Ouvrez le fichier des codes sources du livre. Si Excel
affiche un message d’avertissement, activez le contenu du fichier, puis
cliquez
sur le bouton Editer un contrat. Suivez les étapes du
programme. Jetez
maintenant un œil au dossier contenant le fichier : il contient
les
feuilles de paie que le programme a éditées. Par ailleurs, le document
Contrat
a été mis à jour.
Identification des informations à recueillir
Les informations nécessaires à l’établissement d’une feuille de
paie de droits
d’auteur sont les suivantes :
• Auteur. Nom et prénom (ou société), adresse, code postal, ville,
pays
(facultatif).
jour son adresse sans qu’il soit nécessaire pour l’utilisateur de la
connaître.
Si l’auteur ne fait pas partie de la liste, l’utilisateur pourra saisir
l’ensemble
de ses coordonnées et les ajouter au fichier Excel.
Le contrat sera établi au nom d’une personne physique ou à
celui d’une
société. Dans le premier cas, un prénom devra être fourni.
Info
Pour les besoins du programme, créez un fichier Excel semblable
à celui de la figure 17-3 et
enregistrez-le sous le nom Classeur dans le dossier C:\Mes documents.
• Ouvrage. Titre de l’ouvrage et ISBN (International Standard Book
Number,
numéro identifiant l’ouvrage de façon unique).
L’ISBN sera toujours formaté de la façon suivante : xxxx-y, où
chaque x
correspond à un chiffre et chaque y à une clé pouvant être un chiffre
ou une
lettre.
• Conditions de rémunération. Droits d’auteur et avance sur droits
d’auteur.
Les droits d’auteur sont un pourcentage du prix de vente de l’ouvrage,
soit
fixe, soit variable (par exemple, 6 % sur les 3 000 premiers
livres, puis
8 %).
L’avance sur droits d’auteur est facultative. Dans le cas d’une avance,
celle-
ci pourra être versée en une fois (à la remise du manuscrit) ou en deux
fois
(une moitié à la remise et une moitié à la parution).
Figure 17-3 –La liste des auteurs est stockée dans un fichier Excel.
• Taxes. Les taxes retenues sur l’avance sur droits d’auteur sont
la TVA, les
AGESSA, la CSG et le RDS. Le programme n’aura cependant pas
à les
traiter, puisque nous créerons un classeur modèle dans lequel
nous
intégrerons les formules nécessaires.
• Dates. Date de remise et date de parution.
La date de parution devra toujours être postérieure à la date de
remise. Par
ailleurs, si moins de 40 jours séparent la date de remise de la
date de
parution, une confirmation sera demandée à l’utilisateur.
• Options d’impression. L’utilisateur aura le choix d’imprimer ou
non les
documents édités. Il pourra également définir le nombre
d’exemplaires
imprimés pour le courrier et pour les feuilles de paie.
Définition de la structure du programme
Pour assurer une bonne lisibilité au programme et être en mesure de
réutiliser
une partie du code dans d’autres conditions (par exemple, pour un
programme
équivalent concernant un travail de traduction), les procédures
seront aussi
autonomes qu’il se peut. Nous devons ici définir le squelette du
programme
(son flux), les modules de stockage des procédures et la façon
dont seront
stockées les informations fournies par l’utilisateur.
Le squelette du programme
Le programme sera structuré de la façon suivante :
1. Déclaration des variables objets et liaison avec les fichiers à
lire ou à
manipuler (répertoire des auteurs et document Word à compléter).
2. Affichage des interfaces utilisateur.
On commence par se procurer l’ensemble des informations requises.
Pour
chaque interface :
a. Chargement des feuilles (procédures Initialize).
Les interfaces sont appelées à partir de la procédure principale.
b. Vérification des informations fournies par l’utilisateur.
Les procédures événementielles des feuilles vérifient la validité
des
données.
c. Stockage des données dans des variables.
Lorsque les données sont valides, elles sont affectées aux
variables
appropriées, pour être ensuite exploitées par le programme.
d. Masquage de l’interface.
3. Édition, impression éventuelle et enregistrement des feuilles de
paie.
Un nouveau classeur fondé sur un modèle est créé. Les
informations
nécessaires sont entrées dans les cellules appropriées.
4. Mise à jour du tableau Word.
Une ligne y est ajoutée et les données du contrat y sont intégrées.
5. Fin du programme et libération des ressources mémoire.
Créez un nouveau module de code et appelez-le ContratAuteur.
Placez-y tout de
suite le corps de la procédure principale, en commentant les
phases
principales :
Sub EditionContratAuteur()
’1. Liaisons des variables objets
’2. Affichage des feuilles
’3. Edition des feuilles de paie
’4. Mise à jour du tableau Word
’5. Libération des ressources mémoire
End Sub
Les modules
Créez les modules suivants pour accueillir les procédures :
nbrePaie As Variant
End Type
Ajoutez en-dessous la déclaration des variables publiques dans
lesquelles
seront stockées les données. Elles doivent se trouver dans la
zone de
déclaration du module (hors de toute procédure) pour être
accessibles dans
tout le reste du projet.
Public MonAuteur As Auteur
Public MesConditionsAuteur As ConditionsAuteur
Public MonImpression As OptionsImpression
Public ClasseurAuteurs As Workbook
Public MonTableauWord
Les trois premières instructions déclarent les variables dans
lesquelles seront
stockées les informations fournies par l’utilisateur. Les deux
dernières
variables se verront respectivement affecter le classeur des
auteurs et le
document Word contenant le tableau récapitulatif des contrats.
La figure 17-5 présente le module ContratAuteur tel qu’il doit se
présenter à ce
stade.
Attention
Avant de manipuler des fichiers Word, vous devez créer une
référence à la bibliothèque d’objets de
l’éditeur de texte. Choisissez la commande Références du menu Outils
de Visual Basic Editor et cochez
la case Microsoft Word Object Library (voir figure 17-6). Si vous
omettez de le faire, l’instruction de
déclaration de la variable MonTableauWord générera une erreur.
C7
Date de parution
C9
Adresse
C10
Code postal
C11
Ville
C12
Pays
F15
Montant de l’avance sur droits à payer
F30
Date de règlement
B32
Nombre d’exemplaires touchés par le taux 1
F32
Taux 1 sous forme de valeur numérique
F33
Taux 2 sous forme de valeur numérique
G32
Taux 1 sous forme de chaîne
G33
Taux 2 sous forme de chaîne
Définir et créer des interfaces
Le programme proposera 5 interfaces qui rassembleront les
différentes
informations requises pour éditer le contrat :
• fmContratAuteur. Choix d’un auteur dans la liste extraite du fichier
Excel.
• fmContratConditions. Fourniture des informations concernant
l’ouvrage (titre
et ISBN) et les conditions du contrat (taux des droits d’auteur et
avance).
• fmContratDates. Dates de remise et de parution.
• fmContratImpression. Définition des documents à imprimer et
du nombre
d’exemplaires.
• fmContratFin. Message indiquant à l’utilisateur que les
informations
nécessaires à l’édition du contrat ont été recueillies.
Toutes les feuilles, à l’exception de la première, proposeront un
bouton de
commande permettant de réafficher la feuille précédente. Toutes
les feuilles
contiendront un bouton de validation et un bouton d’Annulation.
Feuille fmContratAuteur
La feuille fmContratAuteur contiendra une liste modifiable pour
sélectionner le
nom de l’auteur parmi ceux du classeur Excel Répertoire . Elle
contiendra également cinq zones de texte qui indiqueront
respectivement le
prénom, l’adresse, le nom, le code postal, la ville et le pays. Une case
à cocher
précisera s’il s’agit d’une société. Outre les boutons Suite et
Annuler, un
Fe uille
Name
fmContratAuteur
Caption
Contrat auteur
Contrôle Frame
Caption
Auteur :
Contrôle ComboBox
Name
cboNom
Style
0 - fmStyleDropDownCombo
MatchEntry
1 - fmMatchEntryComplete
Contrôle TextBox1
Name
txtPrenom
Contrôle TextBox2
Name
txtAdresse
Contrôle TextBox3
Name
txtCodePostal
Contrôle TextBox4
Name
txtVille
Contrôle TextBox5
Name
txtPays
Contrôle Label1
Name
lbNom
Caption
Nom
Contrôle Label2
Name
lbPrenom
Caption
Prénom
Contrôle CheckBox
Name
chkSociete
Caption
Contrat au nom d’une société
Contrôle CommandButton1
Name
cmdAnnuler
Caption
Annuler
Cancel
True
Contrôle CommandButton2
Name
cmdAjouterAuteur
Caption
Ajouter auteur
Contrôle CommandButton3
Name
cmdSuite
Caption
Suite
Default
True
1. Il n’est pas nécessaire de définir les propriétés Name des autres
contrôles Label, car ils ne seront pas
manipulés.
Ouvrez ensuite la fenêtre Code de la feuille et placez-y les
procédures
suivantes :
1. Code d’initialisation de la feuille
1: Private Sub UserForm_Initialize()
2: [Link] = "Chargement des auteurs en cours. Veuillez
patienter…"
3: [Link] = xlWait
4: Call MiseAjourListeDeroulante
5: [Link] = ""
6: [Link] = xlDefault
7: [Link]
8: End Sub
9:
10: Private Sub MiseAjourListeDeroulante()
11: ’Suppression des entrées de la liste si celle-ci en contient
12: If [Link]>=1 Then
13: Dim ElementListe As Integer
14: Dim NbreElt As Integer
15: NbreElt = [Link] - 1
16: For ElementListe = NbreElt To 0 Step -1
17: [Link] (ElementListe)
18: Next ElementListe
19: End If
20: ’Ajout de tous les noms du répertoire des auteurs
21: Dim compteur As Long
22: Dim AjoutAuteur As String
23: For compteur = 2 To
[Link](1).Range("A1").End(xlDown).Row
24: AjoutAuteur = [Link](1).Range("A" &
compteur).Value
25: [Link] (AjoutAuteur)
26: Next compteur
27: End Sub
La procédure d’initialisation commence par afficher un message dans
la barre
d’état de l’application afin d’informer l’utilisateur du chargement
en cours.
Ligne 3, le curseur est transformé en sablier. Ligne 4,
MiseAjourListeDeroulante est
appelée, puis la procédure appelante reprend la main, le
message de la barre
d’état est effacé tandis que le curseur reprend sa forme normale.
Enfin, ligne 7,
la liste modifiable reçoit le focus.
Attention
La variable ClasseurAuteurs doit avoir été déclarée et un classeur
doit lui être affecté avant que la
feuille ne soit affichée. Si tel n’est pas le cas, l’instruction de la ligne
23 provoquera une erreur.
La procédure MiseAjourListeDeroulante a pour fonction d’ajouter
les noms des
auteurs à la liste modifiable. Si celle-ci n’est pas vide, les
instructions des
lignes 11 à 19 suppriment d’abord les éléments qu’elle contient.
Nous y
reviendrons plus tard. Lignes 20 à 26, les auteurs sont ajoutés à
la liste. On
utilise pour cela une structure For…Next qui ajoute un à un le contenu
des cellules
de la colonne A à la liste déroulante. Le compteur va de 2 (la cellule A2
étant la
première à contenir un nom d’auteur) au numéro de ligne de la
dernière
cellule non vide dans la colonne A : Range("A1").End(xlDown).Row.
Conseil
À ce stade, vérifiez que la mise à jour de la liste modifiable
s’effectue correctement. Exécutez pour
cela la procédure EditionContratAuteur, après avoir pris soin d’y
ajouter l’instruction d’affichage de
la feuille. Celle-ci doit se présenter comme suit :
Sub EditionContratAuteur()
Set ClasseurAuteurs = GetObject("C:\Mes documents\Classeur ")
Set MonTableauWord = GetObject(, "[Link]")
If [Link]<>0 Then [Link]
End Sub
2. Code de mise à jour des zones de texte
1: Private Sub cboNom_Change()
2: Dim LigneSel As Long
3: LigneSel = [Link] + 2
4: txtPrenom = [Link](1).Range("B" &
LigneSel).Value
5: txtAdresse = [Link](1).Range("C" &
LigneSel).Value
6: txtVille = [Link](1).Range("D" & LigneSel).Value
7: txtCodePostal = [Link](1).Range("E" &
LigneSel).Value
8: txtPays = [Link](1).Range("F" & LigneSel).Value
9: End Sub
Cette procédure événementielle met automatiquement à jour le
contenu des
zones de texte lorsque l’utilisateur change le contenu de la liste
modifiable
Nom (par la sélection d’un nom dans la liste ou par la saisie
d’un nouveau
nom). La variable LigneSel stocke le numéro de ligne du classeur
des auteurs
correspondant au nom sélectionné. La propriété ListIndex du
contrôle cboNom
renvoie l’index de l’élément sélectionné. On y ajoute 2 afin
d’obtenir le
numéro de la ligne correspondante dans le classeur Excel – le premier
nom de
la liste correspond à la ligne 2 et la première valeur d’index d’un
ComboBox est 0.
Lignes 4 à 8, la valeur de chacun des TextBox est mise à jour
avec les
informations de la ligne contenant le nom. Par exemple, si
l’utilisateur
sélectionne un nom provenant de la cellule A10, txtPrenom reçoit le
contenu de
la cellule B10, txtAdresse reçoit le contenu de C10, etc.
Notez que, si l’utilisateur saisit une valeur dans le ComboBox (ce qui
est possible,
car la propriété Style du contrôle a été définie à 0 -
fmStyleDropDownCombo), le
complément automatique apparaît si un nom correspondant aux
premières
Figure 17-10 –Les libellés Nom et Prénom, ainsi que la zone de texte
Prénom
sont affectés par l’état de la case à cocher Société.
4. Code d’annulation
1: Private Sub cmdAnnuler_Click()
2: Dim rep As Byte
3: rep = MsgBox("Etes-vous sûr de vouloir annuler l’édition du contrat
en cours ?", _
4: vbYesNo + vbQuestion, "Annuler l’édition de contrat ?")
5:
6: If rep=vbYes Then
7:
8: Call ContratFin
9: End
10: End If
7: For Ligne = 2 To
[Link](1).Range("A1").End(xlDown).Row
8: If [Link]=[Link](1).Range("A" &
Ligne).Value And
txtPrenom=[Link](1).Range("B" & Ligne).Value Then
9: [Link] = ""
10: [Link] = xlDefault
11: Dim remplacer As Integer
12: remplacer = MsgBox("Ce prénom et ce nom existent déjà pour un
auteur.
Remplacer par les coordonnées actuelles ?", vbOKCancel + vbCritical,
"Remplacer les coordonnées de l’auteur ?")
13: If remplacer=vbCancel Then
14: Exit Sub
15: Else
16: [Link] = "Remplacement des coordonnées et mise
à
jour en cours. Patientez…"
17: [Link] = xlWait
18: Call RemplacerEntreeAuteur(Ligne, [Link],
[Link],
[Link], [Link], [Link], [Link])
19: [Link] = ""
20: [Link] = xlDefault
21: Exit Sub
22: End If
23: End If
24: Next Ligne
25: [Link] = ""
26: [Link] = xlDefault
27:
28: ’Ajout du nouvel auteur
29: [Link] = "Ajout de l’auteur en cours. Veuillez
patienter…"
30: [Link] = xlWait
31: Call CreerEntreeAuteur([Link], [Link],
[Link],
[Link], [Link], [Link])
32:
33: ’tri et enregistrement du repertoire
34: [Link](1).Range("A2:H"
& [Link](1).Range("A1").End(xlDown).Row + 1).Sort
Key1:=[Link](1).Range("A2"),
Key2:=[Link](1).Range("B2"),
Key3:=[Link](1).Range("C2")
35:
36:
37: ’Mise à jour de la liste déroulante
38: StatusBar = "Mise à jour de la liste en cours. Veuillez patienter…"
39: Call MiseAjourListeDeroulante
40: [Link] = ""
41: [Link] = xlDefault
42: End Sub
43:
44:
45: Public Sub CreerEntreeAuteur(Nom As String, Prenom As String,
Adresse As String, Ville As String, _
46: CodePostal As String, Optional Pays As String = "")
47: Dim LigneAjout As Integer
48: LigneAjout =
[Link](1).Range("A1").End(xlDown).Row + 1
49:
50: [Link](1).Range("A" & LigneAjout).Value = Nom
51: [Link](1).Range("B" & LigneAjout).Value =
Prenom
52: [Link](1).Range("C" & LigneAjout).Value =
Adresse
53: [Link](1).Range("D" & LigneAjout).Value = Ville
54: [Link](1).Range("E" & LigneAjout).Value =
CodePostal
55: [Link](1).Range("F" & LigneAjout).Value = Pays
56: End Sub
57:
58:
59: Public Sub RemplacerEntreeAuteur(Ligne As Integer, Nom As
String,
Figure 17-12 –Le programme vérifie qu’il n’existe pas déjà une
entrée pour
l’auteur.
Si aucune entrée semblable n’a été trouvée, le programme
atteint la ligne 25
sans que rien ne se soit passé. Le nouvel auteur est alors
ajouté sans qu’une
intervention de l’utilisateur ne soit requise : CreerEntreeAuteur
est appelée ligne
31, puis la procédure appelante reprend la main et le classeur
est trié et
sauvegardé (lignes 34 et 35). La liste modifiable est ensuite mise à jour
(ligne
39). Notez que la procédure MiseAjourListeDeroulante commence
par supprimer
les entrées de la liste pour les ajouter à nouveau. Enfin, lignes
40 et 41, la
barre d’état et le curseur retrouvent leur aspect par défaut.
CreerEntreeAuteur et RemplacerEntreeAuteur r eçoivent toutes les
deux les nom, pr énom,
adresse, code postal, ville et pays entrés par l’utilisateur dans
l’interface.
RemplacerEntreeAuteur r eçoit en plus le numér o de la ligne à
r emplacer (notez les
appels, lignes 18 et 31, et les déclarations, lignes 45 et 59).
Tandis que
CreerEntreeAuteur ajoute les infor mations sur une ligne vide,
RemplacerEntreeAuteur
remplace les données de la ligne dont le numéro lui a été passé
par celles
fournies par l’utilisateur.
Figure 17-13 –Les données sont vérifiées avant d’être affectées aux
variables.
Si les données fournies sont valides, la structure With…End With des
lignes 33 à 43
affecte les valeurs fournies aux espaces de stockage appropriés de la
variable
publique MonAuteur. Notez que, si le champ Pays n’est pas
renseigné (s’il s’agit
de la France), l’espace ne reçoit pas de valeur ; dans le cas
contraire, il reçoit la valeur fournie précédée d’un retour chariot. Vous
verrez
plus tard pourquoi. Ligne 44, la feuille est masquée.
Feuille fmContratConditions
La feuille fmContratConditions contiendra, un contrôle Frame libellé
Ouvrage et un
autre libellé Conditions de rémunération. Le premier contiendra
deux Label
identifiant deux zones de texte destinées à entrer le nom de
l’ouvrage et son
ISBN. Le deuxième contiendra deux autres cadres, l’un libellé Droits
d’auteur
et l’autre libellé Avance. Le cadre Droits d’auteur contiendra les
contrôles
précisant si le taux est variable (CheckBox), le taux initial
(TextBox, Label et
SpinButton), l’éventuel deuxième taux (TextBox, Label et
SpinButton) et au-delà de
combien d’exemplaires celui-ci s’applique (TextBox et deux Label).
Le cadre
Avance indiquera s’il y a ou non une avance sur droits d’auteur
(CheckBox) et,
dans l’affirmative, la valeur de cette avance (TextBox et deux Label) et
le nombre
de versements (deux OptionButton). Outre les boutons Annuler et
Suite, un bouton
Retour permettra de revenir à la feuille précédente.
15, ainsi que sur le tableau suivant.
Proprié té
Vale ur
Fe uille
Name
fmContratConditions
Caption
Contrat d’auteur
Contrôle Frame1
Caption
Ouvrage
Contrôle Frame2
Caption
Conditions de rémunération
Contrôle Frame2.1
Caption
Droits d’auteur
Contrôle Frame2.2
Caption
Avance
Contrôles duFrame1
Contrôle TextBox1
Name
txtTitre
Contrôle TextBox2
Name
txtISBN
Contrôle Label1
Caption
Titre de l’ouvrage
Contrôle Label2
Caption
ISBN
Contrôles duFrame2.1
Contrôle CheckBox
Name
chkTauxVariable
Caption
Taux variable
Value
False
Contrôle TextBox1
Name
txtTaux1
Value
8
Contrôle TextBox2
Name
txtTaux2
Value
8
Contrôle TextBox3
Name
txtNumEx
Value
4 000
Enabled
False
Contrôle SpinButton1
Name
spinTaux1
Value
8
Min
1
Max
20
Contrôle SpinButton2
Name
spinTaux2
Value
8
Min
1
Max
20
Enabled
False
Contrôle Label1
Name
Label1
Caption
% du prix public HT
Enabled
True
Contrôle Label2
Name
lbVar1
Caption
sur
Enabled
False
Contrôle Label3
Name
lbVar2
Caption
sur
Enabled
False
Contrôle Label4
Name
lbVar3
Caption
% du prix HT sur les ex. suivants
Enabled
False
Contrôles duFrame2.2
Contrôle CheckBox
Name
chkAvance
Caption
Avances sur droits d’auteur
Value
True
Contrôle TextBox1
Name
txtAvance
Value
1000
Contrôle Label1
Name
lbAvance1
Caption
de
Contrôle Label2
Name
lbAvance2
Caption
euros
Contrôle OptionButton1
Name
optUnVersement
Caption
Un versement (parution)
Value
False
Contrôle OptionButton2
Name
optDeuxVersements
Caption
Deux versements (parution et remise)
Value
True
Boutons de commande
Contrôle CommandButton1
Name
cmdAnnuler
Caption
Annuler
Cancel
True
Contrôle CommandButton2
Name
cmdRetour
Caption
Retour
Contrôle CommandButton3
Name
CmdSuite
Caption
Suite
Default
True
Copiez ensuite les instructions suivantes dans la fenêtre Code de la
feuille :
1: Private Sub UserForm_Initialize()
2: [Link]
3: End Sub
4:
5: Private Sub chkTauxVariable_Click()
6: If [Link]=True Then
7: [Link] = True
8: [Link] = True
9: [Link] = True
10: [Link] = True
11: [Link] = True
12: [Link] = True
13: Else
14: [Link] = False
15: [Link] = False
16: [Link] = False
17: [Link] = False
18: [Link] = False
19: [Link] = False
20: End If
21: End Sub
22:
23: Private Sub txtTaux1_Change()
24: If IsNumeric([Link])=False Then
25: MsgBox "Le taux pour les droits d’auteur doit être une valeur
numérique.", _
26: vbOKOnly + vbInformation, "Informations incomplètes"
27: [Link] = ""
28: [Link]
89: End
90: End Sub
91:
92: Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer)
93: Dim rep As Byte
94: rep = MsgBox("Etes-vous sûr de vouloir annuler l’édition du contrat
en
cours ?", _
95: vbYesNo + vbQuestion, "Annuler l’édition de contrat ?")
96: If rep=vbNo Then
97: Exit Sub
98: End If
99:
100: Call ContratFin
101: End
102: End Sub
103:
104: Private Sub cmdRetour_Click()
105:
106: End Sub
107:
108: Private Sub cmdSuite_Click()
109:
110: ’Vérifier la validité des informations
111: If [Link]="" Then
112: MsgBox "Vous devez indiquer un titre d’ouvrage.", _
113: vbOKOnly + vbInformation, "Informations incomplètes"
114: [Link]
115: Exit Sub
116: End If
117:
118: If [Link]="" Then
119: MsgBox "Vous devez indiquer un ISBN.", _
120: vbOKOnly + vbInformation, "Informations incomplètes"
121: [Link]
122: Exit Sub
123: End If
124: If Len([Link])<>6 Then
125: MsgBox "L’ISBN n’est pas correctement formaté.", _
126: vbOKOnly + vbInformation, "Informations incomplètes"
127: [Link]
128: Exit Sub
129: End If
130:
131: If [Link]="" Then
132: MsgBox "Vous devez indiquer un taux pour les droits d’auteur.", _
133: vbOKOnly + vbInformation, "Informations incomplètes"
134: [Link]
135: Exit Sub
136: End If
137:
138: If [Link]="" And chkTauxVariable=True Then
139: MsgBox "Vous devez indiquer un taux pour les droits d’auteur.", _
140: vbOKOnly + vbInformation, "Informations incomplètes"
141: [Link]
142: Exit Sub
143: End If
144:
145: If [Link]="" And chkTauxVariable=True Then
146: MsgBox "Vous devez indiquer une valeur valide pour le nombre
d’exemplaires
affectés par le taux 1.", _
147: vbOKOnly + vbInformation, "Informations incomplètes"
148: [Link]
149: Exit Sub
150: End If
Figure 17-17 –La validité des taux de droits d’auteur est contrôlée.
Les procédures des lignes 56 à 62 affectent la valeur des boutons
toupies aux
zones de texte associées lorsque l’utilisateur clique sur l’un d’eux.
La procédure chkAvance_Click (lignes 64 à 78) gère les clics sur la case
à cocher
Avance sur droits d’auteur. Si cette dernière est cochée, les libellés
lbAvance1 et
lbAvance2 sont visibles (lignes 66 et 67). Il en est de même pour la
zone de texte
txtAvance. Enfin, les deux boutons d’option deviennent
accessibles (lignes 69 et
70). Si la case est décochée, le traitement inverse est appliqué à ces
contrôles
(voir figure 17-18).
Date de parution à la liste modifiable (lignes 2 et 3), puis active
le premier
élément de la liste (ligne 4). Ligne 5 et 6, la valeur du calendrier est
définie à
30 jours de la date courante – renvoyée par la fonction Date – et le
calendrier
reçoit le focus.
Calendrier_Click (lignes 9 à 16) gèr e l’affectation des dates aux
zones de texte
txtRemise et txtParution. Une str uctur e conditionnelle est utilisée
pour définir
l’entrée choisie dans la liste modifiable et écrire la date retenue dans
la zone de
texte correspondante (lignes 11 et 14). Si le premier élément de
la liste est
sélectionné (Date de remise), txtRemise reçoit la valeur, puis le
second élément
est sélectionné (ligne 12), ce qui permet à l’utilisateur de choisir
immédiatement la date de parution.
cmdRetour_Click (lignes 42 à 44) gèr e les clics sur le bouton
Retour. Elle affiche
la feuille fmContratConditions.
Enfin, cmdSuite_Click (lignes 46 à 75) vérifie la validité des dates
indiquées
(lignes 48 à 68) et affecte ces valeurs aux variables appropriées.
Une seule
instruction conditionnelle est utilisée. Lignes 49 à 56, on vérifie que les
deux
dates ont été précisées. Si tel n’est pas le cas, un message s’affiche à
l’attention
de l’utilisateur et une instruction Exit entraîne la sortie de la
procédure (voir
figure 17-21).
Figure 17-21 –Les dates de remise et de parution doivent être
précisées.
Lignes 57 à 60, on vérifie que la date de parution est
postérieure à celle de
remise, grâce à la fonction DateValue qui renvoie la valeur de la date
sous forme
numérique (consultez l’aide en ligne pour plus de précisions). Si tel
n’est pas
Caption
Exemplaire(s)
Contrôle CommandButton1
Name
cmdAnnuler
Caption
Annuler
Cancel
True
Contrôle CommandButton2
Name
cmdRetour
Caption
Retour
Contrôle CommandButton3
Name
cmdTerminer
Caption
Terminer
Default
True
Ouvrez la fenêtre Code de la feuille et placez-y les procédures
événementielles
suivantes :
1: Private Sub UserForm_Initialize()
2: If [Link]=True Then
3: [Link] = False
4: [Link] = False
5: [Link] = False
6: [Link] = False
7: End If
8: End Sub
9:
10: Private Sub chkImprimer_Click()
11: If [Link]=False Then
12: [Link] = False
13: [Link] = False
14: [Link] = True
15: [Link] = True
16: [Link] = False
17: [Link] = False
18: Else
19: If [Link]=False Then
20: [Link] = True
21: [Link] = False
22: [Link] = True
23: End If
24: [Link] = True
25: [Link] = True
26: [Link] = True
27: [Link] = False
28: [Link] = True
29: End If
30: End Sub
31:
32: Private Sub chkImpressionContrat_Click()
33: If [Link]=False Then
34: [Link] = True
35: [Link] = False
36: Else
37: [Link] = False
38: [Link] = True
39: End If
1: Sub MettreTableauAJour()
2: Dim derligne As Integer
3: Set MonTableauWord = GetObject("C:\Mes documents\Contrats ")
4: [Link](1)
5: derligne = [Link](1).[Link]
6: With [Link](1)
7: .Cell(derligne,1).[Link]
8: .Cell(derligne,2).[Link] [Link]
9: .Cell(derligne,3).[Link]
10: If [Link]=True Then
11: .Cell(derligne,4).[Link] MesConditionsAuteur.
TauxDroitsNum1 & _
12: " sur " & MesConditionsAuteur.NumExemplairesTaux1 & _
13: " puis " & MesConditionsAuteur.TauxDroitsNum2
14: Else
15: .Cell(derligne,4).[Link]
MesConditionsAuteur.TauxDroitsNum1
16: End If
17: .Cell(derligne,5).[Link]
[Link]
18: .Cell(derligne,6).[Link] Date
19: .Cell(derligne,7).[Link] [Link]
20: .Cell(derligne,8).[Link] [Link]
21: End With
22:
23: [Link]
24: End Sub
Ligne 3, la variable MonTableauWord se voit affecter un document
Word. Lignes 4
et 5, une ligne est ajoutée au premier tableau de ce document et son
numéro est
stocké dans la variable DerLigne. Lignes 6 à 21, une structure
With…End With
complète les cellules du tableau avec les valeurs appropriées. Lignes
22 et 23,
le tableau est enregistré puis fermé.
Telle qu’elle se présente, cette application fonctionne. Pour la
sécuriser, vous
devez cependant la tester dans des conditions différentes et mettre en
place des
gestionnaires d’erreur. De multiples conditions peuvent causer une
erreur. Ce
sera par exemple le cas si un document utilisé (le modèle ou le
document Contrats par exemple) n’est pas disponible, ou est en
cours d’utilisation par un autre utilisateur.
Annexe
Mots-clés pour la manipulation de
fichiers et de dossiers
Cette annexe présente les mots-clés dédiés à la gestion de
fichiers et de
dossiers. Manipulez-les avec prudence afin de ne pas supprimer
malencontreusement des données importantes !
Mots-clés pour la manipulation des fichiers et des dossiers
Mot-clé
De scription
Exe mple
ChDir "C:\Mes documents".
Change de dossier.
ChDir path
Fait de C:\Mes documents le
Notez que le lecteur courant n’est pas modifié.
dossier actif.
ChDrive "D:"
ChDrive drive
Change de lecteur.
Fait de D: le lecteur actif.
CurDir
Retourne le chemin du dossier en cours.
Retourne le nom des fichiers d’un dossier ou
d’un volume. pathname est facultatif et peut
représenter le nom du dossier et le lecteur.
attributes est facultatif et représente les
attributs des fichiers que l’on veut retourner.
Additionnez les valeurs suivantes pour définir
attributes :
– vbNormal ou 0 : Fichiers sans attributs (valeur
par défaut).
MyFile = Dir("*.doc",
Dir(pathname,
– vbReadOnly ou 1 : Fichiers accessibles en
vbHidden). Retourne le premier
attributes)
lecture seule et fichiers sans attributs.
fichier possédant l’extension
– vbHidden ou 2 : Fichiers cachés et fichiers
.doc et l’attribut "Fichier caché".
sans attributs.
– vbSystem ou 4 : Fichiers système et fichiers
sans attributs (non disponible sur Macintosh).
– vbVolume ou 8 : Nom de volume ; si un autre
attribut valeur est précisé, la constante
vbVolume est ignorée (non disponible sur
Macintosh).
– vbDirectory ou 16 : Dossiers et fichiers sans
attributs.
Copie un fichier source à l’emplacement
FileCopy "C:\",
destination.
""
FileCopy source,
Copie le fichier sur le
destination
Notez que le nom du fichier copié peut être
différent de celui du fichier source.
lecteur a: et sous le nom
Attention : une erreur est générée si vous tentez
.
de copier un fichier ouvert.
FileDateTime("C:\")
FileDateTime
Retourne les informations de date et d’heure
Retourne la date et l’heure du
(pathname)
d’un fichier.
fichier .
FileLen("C:\")
FileLen(pathname)
Retourne la taille d’un fichier en octets.
Retourne la taille de .
[Link]
Retourne le nom complet d’un fichier (avec
FullName
Retourne le nom complet du
son chemin).
document actif.
Renvoie une valeur représentant les attributs
d’un fichier, d’un dossier ou d’un volume, qui
résulte de l’addition des valeurs suivantes :
– vbNormal ou 0 : Fichier normal.
– vbReadOnly ou 1 : Fichier en lecture seule.
– vbHidden ou 2 : Fichier caché.
GetAttr(pathname)
– vbSystem ou 4 : Fichier système (non
disponible sur Macintosh).
– vbDirectory ou 16 : Dossier.
– vbArchive ou 32 : Fichier modifié depuis la
dernière sauvegarde (non disponible sur
Macintosh).
MkDir "C:\MonDossier"
MkDir path
Crée un nouveau dossier.
Crée le dossier
C:\MonDossier.
Name
Retourne le nom d’un fichier (sans son chemin).
Retourne le nom du document
actif.
RmDir "C:\MonDossier"
RmDir Path
Supprime un dossier.
Supprime le dossier
C:\MonDossier.
SetAttr "C:\",
Modifie les attributs d’un fichier. Utilisez les
vbHidden + vbReadOnly
SetAttr pathname,
mêmes valeurs que pour la fonction GetAttr()
Affecte les attributs Fichier
attributes
pour définir les attributs du fichier.
caché et Lecture seule au fichier
Si le fichier est ouvert, une erreur est générée.
.
Index
Symboles
-, opérateur arithmétique,*, opérateur arithmétique,/, opérateur
arithmétique,&, opérateur de concaténation, +, opérateur
arithmétique,<, opérateur relationnel,<=, opérateur relationnel,<>,
opérateur relationnel,=, opérateur relationnel,>, opérateur
relationnel,>=, opérateur relationnel, 178
A
Abs, fonction, Accelerator, propriété,Activate, événement, Activation
(feuille de calcul), ActiveCell, propriété, 59,ActiveSheet,
propriété,ActiveWorkbook, propriété, afficher
barre d’outils,boîte à outils, Explorateur, 77, fenêtre Code, fenêtre
Proriétés,fenêtre UserForm,feuille, 298
AfterUpdate, événement, aide
code, 146
validation, 169
dossiers, 78
Feuilles,manipuler,Microsoft Excel Objets, Modules, Références, 78
Double
clic, type de donnée numérique, 155
DropButtonClick, événement, durée de vie (variables), 172
E
écriture du code, EnableCancelKey, propriété, Enabled, propriété, End
mot-clé, 145, propriété, 69
End Sub
instruction, 37
enregistrer
commandes,macro, 31, 32,sous, 209
Enter, événement,EnterKeyBehavior, propriété, erreurs
compilation, détecteur,exécution,gestion, 245, gestionnaire, logiques,
objet Err,On Error, 261
espaces, espions, 252
express,supprimer, 254
étiquettes, événements, 26, 92, 93, 343
Activate, AfterUpdate, BeforeDoubleClick,
BeforeDragOver,BeforeDropOrPaste,BeforeRightClick, BeforeUpdate,
Calculate,Change, 344, Click, Deactivate, DropButtonClick, Enter,
Exit,feuille de calcul, gestion des… utilisateurs, Initialize,KeyDown,
KeyPress, KeyUp, MouseDown,MouseMove, MouseUp,procédures, 93,
SelectionChange, SpinDown, SpinUp, 347
Excel
barre, boîtes de dialogue, cellule active,intitulé, message,modèle
d’objets, référence, 58, 60, 67
sélection, 56
exécution
code, fenêtre, impossible,macro, pas à pas, 248
Exit
événement,mot-clé, 144, 261
Exp, fonction, Explorateur d’objets, 77, 80
afficher, aide,fonctions, masquer, rechercher, utiliser, 81
Explorateur de projet, 76, 77
afficher, 77, masquer, utiliser, 78
exporter (module), 130,expressions, 116
arithmétiques, opérateurs relationnels, 178
F
False, valeur booléenne, fenêtre
ancrer, Code, 76, 89, 91, 94, 96, 98, Exécution, Propriétés, 76, 101,
UserForm, 76, 86, Variables locales, 249
feuille, 273
afficher, contrôles, 102, 283
Day, DDB, Excel, Exp, Filter, Fix, Format, FV,GetObject, 164, Hex,Hour,
InputBox, InStr, IPmt, IRR, IsArray,IsDate,IsEmpty, IsError, IsMissing,
IsNull, IsNumeric, IsObject, Join, LBound, LCase,Left, 190, Len,
Log,LTrim, Mid,Minute, MIRR, Month, MsgBox,Now, NPer, NPV, Oct, 224
HelpContextID,HideSelection,KeepScrollsVisible,LargeChange,
Left,Locked, Max, MaxLength, Min,modifier,MouseIcon, MousePointer,
MultiLine, Name,Offset,PasswordChar, PathSeparator,
Picture,PictureAlignment,PicturePosition,PictureSizeMode,PictureTiling,
Range, Row,ScreenUpdating, ScrollBar, Select,
Selection,SelectionMargin,SmallChange, SpecialEffect,StartUpPosition,
Style, 307,TabIndex,TabKeyBehavior, TabStop,
TextAlign,ThisWorkbook, Top, 330
procédure,programme, 145
souris, SpecialEffect, propriété, SpinButton, contrôle, 283, 323, 362
valeur, 308
SpinDown, événement, SpinUp, événement, Sqr, fonction,Standard,
StartUpPosition, propriété, Static, mot-clé, 119, 121, stockage
macros, 46
Stop, mot-clé, 145, 249, Str, fonction, StrComp, fonction,StrConv,
fonction,String
fonction, type de données, variables, 153
structure
macros, programmes VBA, projets, With…End With, 42
structures de contrôle, 177
Boîtes de dialogue, boucles, 177, 178, 181, 185, GoTo, instructions
conditionnelles, 192, 193, Opérateurs logiques, 198
Style, propriété, 307, Sub
instruction, procédures, 118, 140
supprimer
contrôles, 287
espaces,module, 130
SYD, fonction,syntaxe
accès, 19, arguments, 119,Const,couleurs, CreateObject, Dim, Do…
Loop, For Each…Next,For…Next, Function,gestion des erreurs,
GetObject,GoTo, If…Then…Else, InputBox, 199, méthodes,
MsgBox,Private,procédures, 141,Property Get, Property Let, Public,
Select Case, Set, Static,Type, vérification automatique,While…Wend,
With…End With, 39
T
TabIndex, propriété, TabKeyBehavior, propriété, tableaux, 120
instruction Option Base, 159
Document Outline
Le résumé et la biographie auteur
Page de titre
Copyright
Table des matières
Introduction
Compléments VBA et compléments Office
VBA, pour quoi faire ?
Des programmes
Une application hôte et des projets
Un langage de programmation
Un environnement de travail
Conventions typographiques
Codes sources des exemples du livre
Première Partie : Découvrir la programmation Excel
Chapitre 1 : Notions fondamentales de la programmation
orientée objet (POO)
Comprendre le concept d’objet
Objets et collections d’objets
Application hôte et modèles d’objets
Accéder aux objets
Les propriétés
Les méthodes
Les événements
Les fonctions
Le modèle d’objets d’Excel
Chapitre 2 : Premières macros
Créer une macro GrasItalique
Afficher l’onglet Développeur
Démarrer l’enregistrement
Enregistrer les commandes de la macro
Exécuter la macro
Structure de la macro
Améliorer la macro
Une autre méthode d’enregistrement
Enregistrement
Structure de la macro
Écrire la macro
Exécution de la macro
Choisir l’accessibilité des macros
Accessibilité globale ou limitée
Classeurs et modèles
Le classeur de macros personnel
Les macros complémentaires
Définir le classeur de stockage lors de
l’enregistrement d’une macro
Accéder aux macros d’un classeur spécifique
Chapitre 3 : Déplacement et sélection dans une macro Excel
Méthodes de sélection dans une feuille Excel
Clavier
Souris
Notion de cellule active
Références relatives et références absolues
Coder les déplacements effectués lors de l’enregistrement
d’une macro
Référence absolue aux cellules
Référence relative aux cellules
Référence aux cellules en fonction de leur contenu
Référence aux plages de cellules nommées
Chapitre 4 : Découvrir Visual Basic Editor
Accéder à Visual Basic Editor
Les outils et les fenêtres de Visual Basic Editor
L’Explorateur de projet
L’Explorateur d’objets
La fenêtre UserForm
La fenêtre Code
La fenêtre Propriétés
Les barres d’outils
Paramétrer Visual Basic Editor
Deuxième Partie : Programmer en Visual Basic
Chapitre 5 : Développer dans Visual Basic Editor
Structure des programmes Visual Basic
Les modules
Les procédures
Les instructions
Les différents types de procédures
Procédures Sub
Procédures Function
Procédures Property
Des projets bien structurés
Ajouter un module
Supprimer un module
Créer une procédure
Écrire l’instruction de déclaration
La boîte de dialogue Ajouter une procédure
La notion de portée
Écriture et mise en forme du code
Déplacer une procédure
Appel et sortie d’une procédure
Appel d’une procédure Sub
Appels de procédures Function et Property
Passage d’arguments
Sortie d’une procédure
Sortie d’un programme
Exécuter du code
Aide à l’écriture de code
Vérification automatique de la syntaxe
Complément automatique des instructions
Info express automatique
Chapitre 6 : Variables et constantes
Déclarer une variable
Déclaration implicite
Déclaration explicite
Types de données des variables
Chaînes de caractères
Valeurs numériques
Valeurs booléennes
Dates
Type Variant
Variables de matrice
Variables objets
Types de données personnalisés
Constantes
Validation et conversion des types de données
Portée et durée de vie des variables
Portée de niveau procédure
Portée de niveau module privée
Portée de niveau module publique
Variables statiques
Traitement entre applications à l’aide de variables objets
Chapitre 7 : Contrôler les programmes VBA
Répéter une série d’instructions : les boucles
La boucle While…Wend
La boucle Do…Loop
La boucle For…Next
La boucle For Each…Next
Utiliser des instructions conditionnelles
La structure de contrôle If…Then…Else
La structure de contrôle Select Case
Définir l’instruction suivante avec GoTo
Interagir avec l’utilisateur via des boîtes de dialogue
La fonction InputBox
La méthode InputBox
La fonction MsgBox
Affichage de boîtes de dialogue Excel
Utiliser les opérateurs logiques
Trier des données
Chapitre 8 : Fonctions Excel et VBA
Utiliser les fonctions Excel dans VBA
Créer des fonctions Excel personnalisées
Intégrer une fonction via l’Explorateur d’objets
Insérer une fonction VBA dans votre code
Insérer une fonction Excel dans votre code
Recommandations pour l’écriture de fonctions Excel
Les limites de la cellule
Principales fonctions VBA
Chapitre 9 : Manipuler des chaînes de caractères
Modifier des chaînes de caractères
Concaténer des chaînes
Insérer des caractères non accessibles au clavier
Répéter une série de caractères
Supprimer les espaces superflus d’une chaîne
Extraire une partie : d’une chaîne
Effectuer des remplacements au sein d’une chaîne
Modifier la casse des chaînes de caractères
Comparer des chaînes de caractères
Rechercher dans les chaînes de caractères
Rechercher une chaîne dans une chaîne
Scinder une chaîne
Rechercher une chaîne dans une variable de matrice
Chapitre 10 : Déboguer et gérer les erreurs
Les étapes et les outils du débogage
Test du projet
Exécuter pas à pas
La fenêtre Variables locales
Les points d’arrêt
Modifier l’ordre d’exécution des instructions
La fenêtre Exécution
Les espions
La pile des appels
Exemple de débogage
Recherche du bogue
Résolution du bogue
Gestion des erreurs et des exceptions
Exemple de gestion d’erreur
Chapitre 11 : Intégrer des applications VBA dans l’interface
d’Excel
Affecter une macro à un raccourci clavier
Personnaliser le ruban et la barre d’outils Accès rapide
Affecter une macro à un bouton
Affecter une macro à un objet
Troisième Partie : Développer des interfaces utilisateur
Chapitre 12 : Créer des interfaces utilisateur
Les phases de développement de feuilles
Créer une feuille
Les contrôles de la boîte à outils
Outil Sélection
Contrôle Label
Contrôle TextBox
Contrôle ComboBox
Contrôle Frame
Contrôle ListBox
Contrôle CheckBox
Contrôle OptionButton
Contrôle ToggleButton
Contrôle CommandButton
Contrôle TabStrip
Contrôle MultiPage
Contrôle ScrollBar
Contrôle SpinButton
Placer des contrôles sur une feuille
Copier-coller des contrôles
Sélectionner plusieurs contrôles
Supprimer des contrôles
Mise en forme des contrôles
La grille
Aligner les contrôles
Uniformiser la taille des contrôles
Uniformiser l’espace entre les contrôles
Centrer les contrôles
Réorganiser les boutons de commande
Grouper ou séparer des contrôles
Personnaliser la boîte à outils
Ajouter/supprimer un contrôle
Ajouter/supprimer une page
Afficher/masquer une feuille
Chapitre 13 : Exploiter les propriétés des contrôles
Propriété Name
Apparence
Alignment
BackStyle
Color
BorderStyle
BorderColor
Caption
ControlTipText
ForeColor
SpecialEffect
Style
Value
Visible
Comportement
AutoSize
AutoTab
AutoWordSelect
Cancel
Default
Enabled
EnterKeyBehavior
HideSelection
Locked
MaxLength
MultiLine
SelectionMargin
Style
TabKeyBehavior
TextAlign
TripleState
WordWrap
Défilement
ScrollBars
KeepScrollsVisible
Delay
Max et Min
SmallChange
LargeChange
Divers
Accelerator
GroupName
HelpContextID
MouseIcon
MousePointer
TabIndex
TabStop
Tag
Emplacement
Height et Width
Left et Top
StartUpPosition
Image
Picture
PictureAlignment
PicturePosition
PictureSizeMode
PictureTiling
Police
Font
Chapitre 14 : Maîtriser le comportement des contrôles
Créer des procédures événementielles
Créer une procédure
Les événements
Exemples d’exploitation des contrôles
Label
Contrôle TextBox
ComboBox
ListBox
CheckBox et OptionButton
ScrollBar
SpinButton
Exploiter les informations d’une feuille VBA
Quatrième Partie : Notions avancées de la programmation Excel
Chapitre 15 : Programmer des événements Excel
L’objet Application
Déclaration et instanciation de l’objet Application
Création de procédures événementielles de niveau
application
Propriétés de l’objet Application
Méthodes de l’objet Application
L’objet ThisWorkbook
L’objet Worksheet
Chapitre 16 : Protéger et authentifier des projets VBA
Les virus macros
Se protéger des virus macros
Définir un niveau de sécurité
Les signatures numériques
Sauvegarder des macros
Protéger l’accès aux macros
Verrouiller un projet
Limiter les droits d’exécution d’une macro
Authentifier ses macros
Obtenir une authentification
Authentifier une macro
Chapitre 17 : Exemple complet d’application Excel
Présentation du projet d’application Excel
Avant de commencer
Identification des informations à recueillir
Définition de la structure du programme
Créer un modèle Excel
Définir et créer des interfaces
Feuille fmContratAuteur
Feuille fmContratConditions
Feuille fmContratDates
Feuille fmContratImpression
Feuille fmContratFin
Écriture des procédures d’édition de documents
Édition des feuilles de paie
Mise à jour du tableau Word
Annexe : Mots-clés pour la manipulation de fichiers et de dossiers
Index
353