0% ont trouvé ce document utile (0 vote)
471 vues52 pages

Introduction à VBA pour Excel

Transféré par

Arnaud Dodzro
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
471 vues52 pages

Introduction à VBA pour Excel

Transféré par

Arnaud Dodzro
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Collège de Paris – Cours du Visual Basic for Application

I - Introduction
Ce document s'adresse aux utilisateurs d'Excel désirant s'initier à la programmation des macros.
En effet bien que très pratique, l'enregistrement automatique de macro en Excel tend à créer un code de mauvaise
qualité, ceci étant dû au fait qu'il enregistre les actions de l'utilisateur, et donc fonctionne selon un mode Sélection /
Action. Or la sélection est rarement utile dans une Macro.
Le cours présente les fonctionnalités de l'éditeur de macros, aussi appelé Visual Basic Editor (VBE).
Vous y découvrirez une description des outils disponibles pour créer vos premières procédures.
Les macros servent essentiellement à automatiser et personnaliser des actions dans le classeur.
Vous pouvez ainsi écrire des procédures pour les tâches répétitives, mais aussi adapter l'outil Excel pour qu'il
réponde exactement à vos besoins particuliers (interagir avec les manipulations de l'utilisateur, piloter d'autres
applications...).
Le langage Visual Basic For Applications (VBA) est orienté objet et intégré à Excel, ce qui en facilite
l'apprentissage et son maniement par les utilisateurs.
Il est constitué d'instructions, de mots clés, de fonctions, de méthodes et de propriétés pour élaborer des codes qui
permettent la manipulation des objets de l'application.
Ce cours contient du code compatible avec les versions Excel 97 et supérieures.

II - Notions importantes
Ce cours est destiné aux utilisateurs ayant une maîtrise d’Excel de base et des fonctions avancées.

Pour commencer, il est utile de faire un rappel sur l’enregistrement des macros.

Si vous ne savez pas encore comment écrire une procédure, et que vous voulez automatiser une tâche, sollicitez
l'enregistreur de macros.

Lancez l'enregistreur depuis la feuille de calcul dans l’onglet Développeur

Une boîte de dialogue vous permet de spécifier préalablement:

* Le nom de la macro
* Dans quel classeur enregistrer la macro
* Un raccourci clavier pour déclencher la macro (facultatif)
* Un commentaire en début de macro (facultatif).

Ensuite effectuez une série d'actions dans la feuille (Sélection et coloriage de cellules, écriture dans les cellules, ajout de
feuille ...etc...), puis retournez dans l’onglet Développeur et arrêtez l'enregistreur.

Par Essobua BALOUKI 1


Collège de Paris – Cours du Visual Basic for Application
Allez dans l'éditeur VBE en cliquant sur Macros, en suite sélectionnez la macro et en cliquant sur Modifier.

Vous constatez qu'un nouveau module standard vient d'être créé. Il contient une traduction VBA des opérations
précédemment effectuées.

Si vous recherchez une syntaxe adéquate pour vos procédures, utilisez l'enregistreur, analysez le résultat puis adaptez le
code à votre besoin.
Si vous n'êtes pas un spécialiste du VBA et que vous recherchez une simple macro répétitive, conservez la macro
enregistrée telle quelle et ré-exécutez la.
L'enregistreur est toutefois limité: Il fonctionne uniquement pour des actions successives. Les notions de boucles et de
conditions ne sont pas prises en compte. Il crée uniquement des procédures de type Sub. Les macros enregistrées
contiennent parfois des portions de codes qui ne servent pas, ou ne sont pas directement en rapport avec les actions
effectuées. Celles ci sont donc améliorables.

La sécurité des macros


Tout classeur Excel peut potentiellement contenir des macro-virus. C'est l'inconvénient de cet outil puissant qu'est le
VBA.
De nombreux fichiers sont échangés chaque jour par le biais des messageries électroniques ou téléchargés depuis des
forums et autres sites spécialisés: Ce qui augmente d'autant le risque de propagation des virus.
Même sans mauvaise intention, certaines macros mal maitrisées peuvent causer des dégâts.
Par Essobua BALOUKI 2
Collège de Paris – Cours du Visual Basic for Application
Par exemple: La modification de la base de registre est toujours risquée pour votre PC. La manipulation des barres
d'outils est aussi une source de problème dans l'application Excel.
Il convient donc d'être prudent.
Règle importante:
Quand vous recevez un classeur dont vous ne connaissez l'origine, ayez le réflexe de désactiver les macros lors de la
première ouverture.

Ensuite vérifiez que les procédures contenues dans le fichier ne risquent de provoquer des actions indésirables sur votre
PC.
S'il n'y a pas de problème, refermez le classeur puis ré-ouvrez le en activant les macros.
Un anti virus régulièrement mis à jour est aussi nécessaire pour vous protéger des macros malveillantes.
Pour paramétrer le niveau de sécurité, utilisez l’onglet Développeur et cliquez sur Sécurité de macros.

Sélectionnez Activer toutes les macros.

Cliquez sur le bouton OK pour valider.


III - Présentation de l’environnement VBE
Visual Basic Application(VBA) s’utilise dans toutes les applications qui offrent une interface Visual Basic Editor
(VBE). VBE est un environnement dans lequel vous pouvez modifier des macros que vous avez enregistrées et écrire de
Par Essobua BALOUKI 3
Collège de Paris – Cours du Visual Basic for Application
nouvelles macros et de nouveaux programmes Visual Basic pour Applications.
Pour lancer ouvrir une interface VBE, cliquez sur l’onglet Développeur et pointez sur le groupe Code, cliquez sur
Visual basic. La fenêtre suivante s’affiche.

Fig. 3.1 – Fenêtre VBE

Microsoft Visual Basic est la version évoluée de Basic, permettant une programmation visuelle. Visual Basic a été
développé par Microsoft afin de créer des applications pour Windows.

L'explorateur de projets
L'explorateur de projets permet d'accéder à tous les classeurs et macros complémentaires (.xla) ouverts dans la session
Excel.
Si la fenêtre n'apparait pas l'écran, utilisez le menu Affichage/Explorateur de projet (ou le raccourci clavier Ctrl+R).
Chaque classeur est constitué:
* D'un module objet ThisWorkbook.
* D'un module objet pour chaque feuille du classeur (Feuil1, Feuil2, Feuil3 ...).
* De module objet pour chaque feuille Graphique du classeur
* De UserForms (boîtes de dialogues personnalisées), créées par l'utilisateur.
* De modules standards (Module1, Module2 ...), créés par l'utilisateur.
Les éléments du dossier "Microsoft Excel Objects" existent systématiquement dans tous les classeurs. Vous ne
pouvez pas les supprimer depuis l'explorateur de projet.
Les autres éléments sont constitués à partir des ajouts de l'utilisateur.
Double cliquez sur les éléments de l'explorateur pour vous déplacer entres les différents modules et UserForms.
Les éléments créés par l'utilisateur (modules standards, modules de classe et UserForm) peuvent être supprimés depuis
l'explorateur de projet, en effectuant un clic droit sur le module.
Sélectionnez l'option "Supprimer ...".
Une boîte de dialogue vous demande si vous souhaitez exporter le module avant de le supprimer (C'est à dire de le
sauvegarder sur votre disque dur).
Cliquez sur le bouton "Non" pour confirmer.

Par Essobua BALOUKI 4


Collège de Paris – Cours du Visual Basic for Application
Si vous cliquez sur le bouton Oui, une nouvelle fenêtre s'affiche pour préciser l'emplacement de l'enregistrement. Le
chemin indiqué par défaut est généralement:
C:\Program Files\Microsoft Office\OfficeXX
Mais vous pouvez bien entendu sauvegardez dans un autre répertoire.

La fenêtre Propriétés
Elle permet de consulter et modifier les propriétés des objets (classeur, feuilles, contrôles).
Si la fenêtre n'apparait pas l'écran, utilisez le menu Affichage/Fenêtre Propriétés (ou le raccourci clavier F4).

La fenêtre Code
Chaque type de module et chaque UserForm possède sa propre fenêtre code. Vous allez rédiger vos procédures dans ces
zones de saisie.
Les macros sont constituées de simples textes que vous pouvez entièrement écrire ou copier à partir de codes
existants.
Vous pouvez modifier, copier/coller, supprimer une procédure (ou une portion) comme dans un éditeur de texte
classique.

La couleur du code
Tous les mots clés et les instructions sont automatiquement identifiables par une couleur de police spécifique
(généralement bleu par défaut).
Les lignes contenant des erreurs de syntaxe sont identifiables par une couleur de police rouge.
Les lignes de commentaires (précédées par une apostrophe ou par l'instruction REM) sont identifiables par une
couleur de police verte.
N'hésitez pas à ajouter des annotations dans vos procédures. Cela vous aidera pour la relecture et la compréhension des
macros.
Ces couleurs peuvent être personnalisées depuis le menu Outils/Options/Onglet "Format de l'éditeur".

La saisie semi automatique


L'éditeur possède un outil de saisie semi automatique.
Cette option est activée en cochant la ligne "Complément automatique des instructions" dans le menu
Outils/Options/Onglet "Editeur".
Dès que vous saisissez un point (.) après un élément, l'environnement V BA propose la liste des méthodes et
propriétés associées. La liste sera restreinte en fonction des premières lettres saisies.
La saisie semi automatique limite les risques d'erreurs de syntaxe dans vos procédures.

Les points d'arrêt


Les Points d'arrêt permettent de stopper le déroulement d'une macro à un emplacement précis.
Lorsque vous lancez la procédure, celle ci s'exécutera jusqu'à la ligne où figure le point d'arrêt.
Cliquez dans la marge à gauche de la zone de saisie, pour appliquer un point d'arrêt sur la ligne (ou utilisez la touche
raccourci F9 à l'emplacement du curseur).
Les points d'arrêt ne fonctionnent pas sur les lignes vides.
Cette option est pratique pour par exemple vérifier les valeurs attribuées aux variables.
En effet, si vos variables sont correctement paramétrées, un passage de la souris sur leur nom fait apparaitre une info-
bulle qui indique la valeur prise.

Vous pouvez interrompre totalement l'exécution en appuyant sur le bouton "Réinitialiser", lorsque vous êtes en mode
"Arrêt".

L'Explorateur d'objets
Par Essobua BALOUKI 5
Collège de Paris – Cours du Visual Basic for Application
Cliquez sur l'icône "L'explorateur d'objets" (ou le raccourci clavier F2) pour afficher cette fenêtre.
Cet outil liste tous les éléments disponibles dans l'éditeur, pour toutes les bibliothèques actives.
Sélectionnez un élément et appuyez sur la touche F1 pour atteindre l'aide associée.
Utilisez la croix sur la droite de l'écran pour refermer cette fenêtre.

Les modules standards


Les modules standards sont les principaux supports pour écrire vos procédures.
Ajoutez un module standard dans votre projet en utilisant le menu Insertion/Module, depuis l'éditeur de macros.
Par défaut, le premier module créé sera nommé "Module1". Vous pouvez personnaliser ce nom en modifiant le
champ (Name) dans la fenêtre Propriétés. Ce nom ne doit pas contenir d'espaces ni de caractères spéciaux.
Vous pouvez créer autant de modules que vous souhaitez dans un classeur, dans la limite de l'espace mémoire
disponible.
Toutefois, pour faciliter la lecture des procédures et pour un gain de place, il est préférable de regrouper dans un
même module des macros destinées à fonctionner ensemble.
ATTENTION :
Lorsque vous ouvrez un fichier Excel 2007 dont l’extension est (.xlsm) i.e. contient des macro, vous obtenez ce
message d’avertissement : de menu comme indiqué dans la figure ci-dessous. Cliquez sur le bouton Options pour
activer les macros si vous faites confiance au fichier.

Fig. 3.2 – Message d’avertissement de la présence de macro dans le fichier actif

IV - Structure d’un programme


Pour écrire un bon code, l’ensemble des actions à réaliser doit être décomposé en évènements simples compréhensibles
par le commun des mortels. Ces évènements élémentaires seront ensuite traduits dans un langage compréhensible par un
logiciel qui sera chargé de demander à l’ordinateur d’exécuter les actions voulues.
Selon la logique algorithmique, un programme est structuré comme suit :
Nom du programme (identification du programme)
Début
[Déclaration des variables]
[Commentaires]
[Instructions]
[Restitution des résultats]
Fin

V - Les procédures
Les procédures commencent par l'instruction Sub et se terminent par l'instruction End Sub. Le code doit être écrit entre
Sub et End Sub.

Par Essobua BALOUKI 6


Collège de Paris – Cours du Visual Basic for Application
End sub s'ajoute automatiquement si vous appuyez sur la touche Entrée après avoir saisi le nom de la macro ("Test" dans
l'exemple du chapitre précédent).

Le nom de la macro doit commencer par un caractère alphabétique et pas excéder 255 caractères. Le nom ne doit pas
contenir de caractères spéciaux. Le caractère underscore _ est accepté. Essayez d'attribuer des noms les plus explicites
possibles afin de faciliter la relecture de votre programme.

Un module ne peut pas contenir deux macros ayant le même nom. Plus généralement, il est déconseillé d'avoir deux
macros utilisant le même nom dans un projet.

N'utilisez pas un nom de macro qui est aussi une référence à une cellule.

Les parenthèses placées après le nom de la macro Test(), servent à spécifier des arguments (des paramètres) lors de
appel à cette procédure. Les parenthèses sont obligatoires même si la procédure s'exécute sans arguments.

Un exemple de procédure utilisant un argument, à placer dans un module standard:

Sub TestMacro()

'Apelle la procédure MultiplicationCellule en indiquant la référence à 'la cellule A1 en argument.

MultiplicationCellule Range("A1")

End Sub

Sub MultiplicationCellule(Cible As Range)


'Vérifie si la cellule contient bien une valeur numérique
'(Sinon la suite de la macro va provoquer une erreur)
If Not IsNumeric(Cible) Then
Exit Sub

'multiplie le contenue de la cellule par 2

Cible = Cible * 2

End Sub

Quand vous lancez la macro depuis la feuille de calcul (raccourci Alt+F8), vous constatez que la procédure contenant des
arguments (MultiplicationCellule) n'est pas visible dans la boîte de dialogue. Il n'y a que les procédures sans arguments
qui apparaissent dans la liste.

Si vous utilisez l'instruction Private:

Private Sub TestMacro()

Dans ce cas la macro TestMacro n'est accessible que pour les procédures du module dans lequel elle est déclarée. Sa
portée est limitée et elle n'est plus visible dans la boîte de dialogue (Alt+F8).

VI - Les fonctions
Contrairement aux procédures Sub qui ne renvoient pas de données, la fonction (Function) est un type de procédure qui
renvoie une valeur.

L'environnement VBA dispose de nombreuses fonctions prédéfinies mais vous pouvez aussi créer vos fonctions
personnelles. Ces dernières sont utilisées de la même manière que les fonctions prédéfinies.

Les fonctions commencent par l'instruction Function et se terminent par l'instruction End Function. Le
code doit être écrit entre Function et End Function.

Les fonctions acceptent des arguments obligatoires et optionnels. Les arguments optionnels sont placés en fin de la
déclaration.

Vous pouvez définir le type de résultat retourné de la même manière que pour une variable.

Voici un exemple de fonction à placer dans un module standard:


Par Essobua BALOUKI 7
Collège de Paris – Cours du Visual Basic for Application
Function MaFonctionPerso(NbValeurs As Long, Optional Coeff As Variant) As Long
'Spécifie que la fonction doit être recalculée à chaque fois qu'un calcul
'est effectué dans une cellule quelconque de la feuille. Application.Volatile
'Vérifie si l'argument optionnel à été indiqué
'Nota: Coeff doit être impérativement de type Variant.
If IsMissing(Coeff) Then
'S'il n'y a pas d'argument optionnel:
MaFonctionPerso = (NbValeurs + 3)
Else
'S'il y a un argument optionnel:
MaFonctionPerso = (Nbvaleurs + 3)* Coeff
End if
End function

Vous pouvez ensuite appeler cette fonction depuis une procédure Sub.

Sub AppelFonction()
MsgBox MaFonctionPerso(10)
MsgBox MaFonctionPerso(10, 5)
End Sub

Mais aussi l'utiliser depuis la feuille de calcul:

Formules
=MaFonctionPerso(10)

=MaFonctionPerso(10 ; 5 )

'Si le premier argument fait référence à la cellule A1:

=MaFonctionPerso(A1; 5)

Les fonctions n'apparaissent pas dans la boîte de dialogue des macros (Alt+F8). Par contre elles sont intégrées dans la liste
des fonctions Excel tant que le classeur qui les contient est ouvert:

Si vous utilisez l'instruction Private:

Private MaFonctionPerso(NbValeurs As Long, Optional Coeff As Variant) As Long

Dans ce cas la fonction MaFonctionPerso n'est accessible que pour les procédures du module dans lequel elle est
déclarée.

VII - Les variables


Généralités
Utilisez généralement l’instruction Dim pour déclarer vos variables.
Exemple :
Dim Variable1

Les variables servent à stocker et manipuler des informations dans une macro.
Une variable possède:
* Un nom qui permet d'accéder aux données qu'elle contient: "maVariable".
* Un type de données: Par exemple, String et Integer.

Les données peuvent être modifiées pendant l'éxécution de la macro.


Evitez de nommer les variables en utilisant des mots clés ou instructions réservés par Excel (par exemple Val, Left...).

Le nom des variables doit commencer par un caractère alphabétique et ne doit pas excéder 255 caractères. Les noms ne
doivent pas contenir de caractères spéciaux. Le caratère underscore _ est accepté. Essayez de donner des noms les plus
explicites possibles afin de faciliter la relecture de votre programme.
Il est conseillé d'avoir au moins une majuscule dans la variable déclarée. Ensuite lors de la saisie de la variable en
minuscule dans la macro, celle-ci reprendra automatiquement la majuscule: cette astuce permet de vérifier les fautes
Par Essobua BALOUKI 8
Collège de Paris – Cours du Visual Basic for Application
d'orthographe éventuelles.
Par exemple: Dim RepertoireFichier As String.

Le type de données doit être défini en fonction de la valeur prise par la variable. Chaque type de donnée utilise un
espace mémoire (de 1 octet pour les types de données Byte jusqu'à 22 octets et plus, pour les types de données Variant).
Il est donc important de définir le bon type de données pour libérer de l'espace mémoire et ne pas ralentir inutilement le
traitement de la macro.

Types de données

i) Toutes les variables sont converties en type Variant si aucun autre type de données n'est explicitement déclaré.

ii) En cas de déclaration de plusieurs variables avec le même Dim, vous devez préciser le type de donnée pour chaque
variable.
Par exemple, si pour définir 3 variables des type String (strVar1, strVar2 et strVar3) vous écrivez:

Dim strVar1 , strVar2 , strVar3 As String

Dans ce cas strVar1 et strVar2 seront de type Variant.


Pour y remédier et obtenir 3 variables String, Il faut écrire: Dim strVar1 As String , strVar2 As String , strVar3 As String
Byte
Les variables Byte sont utilisées pour stocker des nombres entiers positifs compris entre 0 et 255.
Les variables de type Byte sont stockées sous la forme de nombres uniques codés sur 8 bits (1 octet), sans signe.

Boolean
Données pouvant prendre exclusivement les valeurs True et False.
Les variables Boolean sont stockées sous la forme de nombres codés sur 16 bits (2 octets).

Integer
Données contenant des nombres entiers stockés, de 2 octets, compris entre -32 768 et 32 767. Le type de données Integer
permet également de représenter des valeurs énumérées. Dans Visual Basic, le signe % est le caractère de déclaration du
type Integer.
Remarque:
Si vous écrivez "Dim X As Integer", alors que la valeur est décimale (par exemple X=5,9), la valeur renvoyée sera égale
à 6.

Long
Nombre entier codé sur 4 octets (32 bits) et dont la valeur est comprise entre -2 147 483 648 et 2 147 483 647. Dans
Visual Basic, le signe et commercial (&) est le caractère de déclaration du type Long.

Currency
Données dont la plage de valeurs s'étend de -922 337 203 685 477,5808 à 922 337 203 685 477,5807. Les
variables de type Currency sont stockées sous la forme de nombres de 64 bits (8 octets).
Ce type de données est utilisé dans les calculs monétaires ou dans les calculs à virgule fixe pour lesquels une grande
précision est requise. Le signe @ est le caractère de déclaration du type Currency.

Single
Type de données qui regroupe des variables à virgule flottante en simple précision sous forme de nombres à virgule
flottante codés sur 32 bits (4 octets), dont la valeur est comprise entre -3,402823E38 et -1,401298E-45 pour les valeurs
Par Essobua BALOUKI 9
Collège de Paris – Cours du Visual Basic for Application
négatives, et entre 1,401298E-45 et 3,402823E38 pour les valeurs positives.
Dans Visual Basic, le point d'exclamation (!) est le caractère de déclaration du type Single.
Double
Type de données stockant sur 64 bits les nombres à virgule flottante en double précision compris entre -
1,79769313486231E308 et -4,94065645841247E-324 pour les valeurs négatives, et entre 4,94065645841247E-324 et
1,79769313486232E308 pour les valeurs positives.
Dans Visual Basic, le signe dièse (#) est le caractère de déclaration du type Double.

Date
Type de données utilisé pour stocker les dates et les heures sous la forme d'un nombre réel codé sur 64 bits (8 octets).
La partie située à gauche du séparateur décimal représente la date, et la partie droite l'heure.

String
Type de données composé d'une séquence de caractères contigus interprétés en tant que caractères et non en tant que
valeurs numériques.
Une donnée de type String peut inclure lettres, nombres, espaces et signes de ponctuation.
Le type de données String peut stocker des chaînes de longueur fixe dont la longueur est comprise entre 0 et environ 63 Ko
de caractères et des chaînes dynamiques dont la longueur est comprise entre 0 et environ 2 milliards de caractères.
Dans Visual Basic, le signe dollar ($) est le caractère de déclaration du type String.

Variant
Type de données particulier pouvant contenir des données numériques, des chaînes ou des dates, des types définis par
l'utilisateur ainsi que les valeurs spéciales Empty et Null.
Le type de données Variant est doté d'une taille de stockage numérique de 16 octets et peut contenir la même plage de
données que le type Decimal, ou d'une taille de stockage de caractère de 22 octets (plus la longueur de la chaîne). Dans ce
dernier cas, il peut stocker tout texte.

Object
Type de données représentant toute référence Objet. Les variables Object sont stockées sous forme d'adresses codées
sur 32 bits (4 octets). L'instruction Set permet d'attribuer une référence d'objet à la variable.
Dans Excel, un objet peut être un classeur, les feuilles de calcul, un graphique...etc...
La macro suivante déclare la variable Ws comme un objet de type Worksheet (Feuille de cacul).

Sub Test()

Dim Ws As Worksheet
'Attribue la 1ere feuill du classeur dans la variable
e
Set Ws = Sheets(1)
MsgBox Ws.Name
Set Ws = Nothing ' Libère la mémoire
End Sub

Vous avez aussi la possibilité de communiquer avec d'autres applications depuis Excel: Word, ADO (ActiveX Data
Objects),...

Voici un exemple de syntaxe pour utiliser les objets Word depuis Excel.

'Vous devez préalablement activer la référence Word: 'Dans l'éditeur de macros: 'Menu outils
'Références
'Cochez la ligne "Microsoft Word x.x Object Library"

Par Essobua BALOUKI 10


Collège de Paris – Cours du Visual Basic for Application
'(x.x dépend de la version installée sur votre poste) 'Cliquez sur OK pour valider.

Sub piloterWord_V01()
Dim wordApp As Word.Application 'déclare la variable wordApp comme un objet de type Word
'Remarque :
'Lorsque la librairie est activée,l'outil de saisie semi automatique permet
'd'afficher la bibliotheque Word sans avoir besoin de saisir le nom complet.
'Toutes les méthodes et propriétés de la librairie sont aussi accessibles grace
'à l'outil de saisie semi automatique.

'Attribue la référence objet à la variable


Set wordApp = New Word.Application
MsgBox "La version Word installée sur votre poste: " & wordApp.Version

'Fermeture de l'application Word


wordApp.Quit
'libération de la mémoire
Set wordApp = Nothing
End Sub

Option Explicit
L'instruction Option Explicit est utilisée au niveau module pour imposer la déclaration explicite de toutes les variables de
ce module. Cette instruction doit apparaître tout en haut dans le module, avant toute procédure.
Lorsque cette instruction est utilisée, un message d'erreur identifie toute variable non définie ou mal orthographiée.
Pour qu'Option Explicit s'insère automatiquement dans chaque nouveau classeur: Allez dans l'éditeur de macros. Menu
Outils Options Dans l'onglet Editeur, cochez l'option "Déclaration des variables".

Les niveaux de variables


Une Variable déclarée à l'intérieur d'une macro ne sera utilisable qu'à l'intérieur de celle-ci.
Sub Test()
Dim X As String
X = "Coucou ! "
MsgBox X
End Sub

Pour que la variable soit utilisable dans toutes macros du module, celle-ci doit être déclarée en tête du module, avant le
premier Sub.
Dim X As String
Sub Test()
X = "Coucou ! "
MsgBox X
End Sub

Pour que la variable soit utilisable dans toutes les macros du projet, il faut utiliser l'instruction Public et la variable
doit impérativement être placée en tête d'un module standard.
Public X As String
Sub Test()


End Sub

Const
L'instruction Const permet de déclarer les constantes.
Une constante est un élément nommé conservant une valeur identique pendant toute l'exécution d'un programme. Il
peut s'agir d'une chaîne, d'une donnée numérique, d'une autre constante ou d'une combinaison contenant des opérateurs
logiques ou arithmétiques à l'exception de Is et de l'opérateur d'élévation à une puissance. Les constantes peuvent
remplacer des valeurs réelles partout dans votre code.
Il y a plusieurs avantages à utiliser une constante:
Si la donnée doit être modifiée dans une macro complexe, vous n'avez plus besoin de parcourir toute la procédure pour
la retrouver: il suffit de modifier la constante qui est généralement placée en début de macro ou en tête du module.
Vous évitez ainsi les recherches fastidieuses et les erreurs de saisie.
Par Essobua BALOUKI 11
Collège de Paris – Cours du Visual Basic for Application
Les constantes permettent aussi d'améliorer la lisibilité des macros. Un exemple d'utilisation:
Sub Test()

Const Coefficient As Integer = 10


Dim x As Integer
x = Coefficient * 5
MsgBox x
End Sub

Enum
L'instruction ENUM permet de définir un groupe de constantes liées afin de créer une énumération. Un
exemple:
Public Enum Coeff

Coeff_2 = 2
Coeff_3 = 3
Coeff_4 = 4
End Enum

Sub Test()

MsgBox 500 * Coeff.Coeff_2 'Résultat = 1000


End Sub

Remarque:
La saisie de Coeff. dans l'éditeur de macros, permet d'afficher rapidement la liste des coefficients disponibles.

VIII - Les instructions


Les opérateurs

Opérateurs arithmétiques.
Les opérateurs suivants permettent de réaliser les opérations élémentaires:
+-*/
De plus, les opérateurs Mod et \ permettent de déterminer respectivement le reste et le quotient d'une division entière. Enfin &
permet de concaténer deux chaînes de caractères.

Opérateurs de comparaison.
Les opérateurs suivants permettent de réaliser les comparaisons classiques:
= <> < > <= >=
Il n'y a donc pas de différence entre l'opérateur d'affectation et l'opérateur de comparaison. Les opérateurs Like et Is
permettent, de plus, respectivement de comparer deux chaînes de caractères et deux variables de type objet. Consulter l'aide en
ligne pour plus de précisions.

Opérateurs logiques.
Les principaux opérateurs suivants permettent les opérations classiques :
Not And Or Xor
InputBox

La fonction InputBox, en Visual Basic, permet d'afficher un message à l'écran, et, en dessous, une zone de texte qui permet à
l'utilisateur d'entrer du texte ou du chiffre. Ce que l'utilisateur entre sera stocké dans une variable.

Utilisation de InputBox

Sub TestInputBox()
Dim Reponse As String
Reponse = InputBox("Entrez votre prénom")
MsgBox Reponse
End Sub

Par Essobua BALOUKI 12


Collège de Paris – Cours du Visual Basic for Application
MsgBox

La Message Box (MsgBox) est la méthode la plus rapide, la plus simple et la plus utilisée pour afficher un message.
Cette méthode étant probablement connue par la plupart d'entre vous, nous allons malgré tout passer en revue les
différentes propriétés que l'on peut lui appliquer et qu'il est parfois

La MsgBox dans sa plus simple expression

Afin d'afficher rapidement un message, il n'est pas nécessaire de préciser les paramètres, par défaut la MsgBox sera
constituée de votre message et du bouton "Ok" Exemples d'utilisation :

VBA - MsgBox
Sub mess_01a()
'texte directement introduit dans le
code MsgBox "Ici votre message" End
Sub

Sub mess_01b()
'texte provenant d'une
cellule MsgBox
Sheets("Feuil1").Range("A1")
End Sub

Sub mess_01c()
'résultat d'une variable
Dim Var As String
Var = "Texte à afficher"
MsgBox Var
End Sub

Aperçu :

2 - La MsgBox multiligne

Pour afficher un texte sur plusieurs lignes, le passage à la ligne s'obtient en indiquant soit Chr(10), soit vbLf, entouré du
signe de concaténation & Exemples d'utilisation :

Sub mess 02a()

'texte directement introduit dans le code


MsgBox "Ici votre 1ère & Chr(10) &
"2ème ligne..." " &ligne"
Chr(10) & _
"3ème ligne..." " & Chr(10) & _
4ème ligne. . . " " & Chr(10) & _
"5ème ligne..." " & Chr(10) & _
"etc ..."
End Sub

Sub mess 02b()

'texte provenant de cellules


With Sheets("Feuil1" )
MsgBox .Range( " A1" & Chr(10) &
.Range("A2" )) & Chr(10) &
.Range("A3" ) & Chr(10) &
"etc..."
End With
End Sub

Par Essobua BALOUKI 13


Collège de Paris – Cours du Visual Basic for Application
Sub mess 02c ()

'texte provenant de variables


Dim Var1 As String Var2 As String, Var3 As String
Var1 = "Valeur de la variable 1"
Var2 = "Valeur de la variable 2"
Var3 = "Valeur de la variable 3"
MsgBox Var1 & vbLf &
Var2 & vbLf & _
Var3 & vbLf & _
"etc..."
End Sub

Aperçu :

Les combinaisons de boutons

Les combinaisons de plusieurs boutons permettent de poser une question à l'utilisateur et de modifier le déroulement de la
procédure selon son choix.
La syntaxe est la suivante : MsgBox("Votre message", combinaison de boutons, "Titre de la MsgBox")
Différentes combinaisons de boutons sont possible :

Combinaisons de 2 boutons
3 combinaisons possibles :
. Boutons Ok + Annuler (constante : vbOkCancel)
. Boutons Oui + Non (constante : vbYesNo)
. Boutons Réessayer + Annuler (constante : vbRetryCancel)
Exemples d'utilisation :
Sub mess_03a()
'Msgbox Ok +
Annuler
Select Case MsgBox("Votre message ici", vbOKCancel, "Titre de la
MsgBox") Case vbOK
'procédure si click
sur Ok Case vbCancel
'procédure si click sur
Annuler End Select End Sub

Sub
mess_03b()
'MsgBox Oui
+ Non
Select Case MsgBox("Votre message ici", vbYesNo, "Titre de la
MsgBox") Case vbYes
'procédure si click
sur Oui Case vbNo
'procédure si click
sur Non End Select End Sub

Par Essobua BALOUKI 14


Collège de Paris – Cours du Visual Basic for Application
Sub mess 03c()

'MsgBox Réessayer + Annuler


Select Case MsgBox( "Votre message ici", vbRetryCancel, "Titre de la MsgBox")
Case vbRetry
'procédure si click sur Réessayer
Case vbCancel
'procédure si click sur Annuler
End Select
End Sub

Aperçus :

Combinaisons de 3 boutons
2 combinaisons possibles :
. Boutons Oui + Non + Annuler (constante : vbYesNoCancel)
. Boutons Abandonner + Réessayer + Ignorer (constante : vbAbortRetryIgnore)
Exemples d'utilisation :

Sub mess 04a()

'MsgBox Oui + Non + Abandonner


Select Case MsgBox( "Votre message ici", vbYesNoCancel, "Titre de la MsgBox")
Case vbYes
'procédure si click sur Oui
Case vbNo
'procédure si click sur Non
Case vbCancel
'procédure si click sur Annuler
End Select
End Sub

Sub mess 04b ()

'MsgBox Abandonner + Réessayer H Ignorer


Select Case MsgBox( +
"Votre message ici", vbAbortRetryIgnore, "Titre de la MsgBox")
Case vbAbort
'procédure si click sur Abandonner
Case vbRetry
'procédure si click sur Réessayer
Case vbIgnore
'procédure si click sur Ignorer
End Select
End Sub

Aperçus :

Par Essobua BALOUKI 15


Collège de Paris – Cours du Visual Basic for Application

En plus des combinaisons de boutons ci-dessus, vous pouvez ajouter une icône à votre MsgBox afin d'indiquer à
l'utilisateur le type du message.
La syntaxe est la suivante : MsgBox("Votre message", combinaison de boutons + icône, "Titre de la MsgBox")
4 possibilités :

Question Information Exclamation Arrêt critique

constante : vbQuestion constante : vbInformation constante : constante :


vbExclamation vbCritical

Sub mess 05()

'MsgBox Oui + Non + Abandonner + H icône Question


Select Case MsgBox( "Votre message ici", vbYesNoCancel + vbQuestion, "Titre de la MsgBox")
Case vbYes
'procédure si click sur Oui
Case vbNo
'procédure si click sur Non
Case vbCancel
'procédure si click sur Annuler
End Select
End Sub

Aperçu :

Définir le bouton qui aura le focus par défaut


Sans préciser ce paramètre, par défaut c'est le premier bouton de votre MsgBox qui recevra le focus.
Pour les MsgBox comportant plusieurs boutons (max.4 : combinaison de 3 boutons + bouton Aide), il peut être
intéressant de définir à l'avance le bouton qui recevra le focus, ce qui permet par exemple de définir l'action si
l'utilisateur appuie sur la touche "Enter" sans avoir sélectionné un bouton.
Les constantes sont : vbDefaultButton1 ou vbDefaultButton2 ou vbDefaultButton3 ou vbDefaultButton4.
Exemple de syntaxe : MsgBox("Message", vbYesNoCancel + vbQuestion + vbMsgBoxHelpButton +

Par Essobua BALOUKI 16


Collège de Paris – Cours du Visual Basic for Application
vbDefaultButton3, "Titre", HelpFile, Context)
Dans cet exemple, c'est le bouton Annuler qui recevra le focus.

Alignement du texte à droite


Si vous souhaitez afficher le texte de votre MsgBox avec un alignement à droite, la constante à ajouter est
vbMsgBoxRight.
Exemple de syntaxe : MsgBox("Message", vbYesNoCancel + vbQuestion + vbMsgBoxRight, "Titre")
Aperçu :

Mode de Pause
Par défaut, lorsque la MsgBox s'affiche, uniquement l'application active (dans notre cas Excel) se met en pause tant que
l'utilisateur n'aura pas précisé son choix.
Par défaut, la constante est vbApplicationModal, mais il n'est pas besoin de la spécifier.
Vous pouvez également mettre en pause tout le système en ajoutant la constante vbSystemModal

Langues arabes
Ce dernier paramètre permet de spécifier que le texte doit s'afficher de droite à gauche pour les systèmes en langues
arabes.
La constante est : vbMsgBoxRtlReading
Je n'ai pas encore eu l'occasion de tester ce paramètre afin d'en vérifier le fonctionnement.

Manipuler les chaînes de caractères

Compter le nombre de caractères dans une chaine


Utilisez la fonction Len
MsgBox Len("Developpez") 'renvoie 10

Extraire une portion de caractères en partant de la gauche


Utilisez la fonction Left
'Renvoie les 3 premiers caractères d'un texte
MsgBox Left("Developpez", 3) 'renvoie "Dev"

Extraire une portion de caractères en partant de la droite


Utilisez la fonction Right
'Renvoie les 3 derniers caractères d'un texte
MsgBox Right("Developpez", 3) ' renvoie "pez"

Extraire une chaîne de caractères à l'intérieur d'une autre chaîne


Utilisez la fonction Mid
'5 est la position du caractère qui marque le début de la partie à extraire 'et
2 correspond au nombre de caractères à renvoyer) MsgBox Mid("Vendredi", 5, 2) '
renvoie "re"

Si vous souhaitez récupérer toute la chaîne à partir du 5eme caractère, n'indiquez pas le dernier argument
MsgBox Mid("Vendredi", 5) 'Renvoie "redi"

Renvoyer la position de la première occurrence d'une chaîne dans une autre chaîne

Par Essobua BALOUKI 17


Collège de Paris – Cours du Visual Basic for Application
Utilisez la fonction InStr
Remarque:

cette fonction renvoie 0 si auncune occurence n'est trouvée.


'Renvoie la position de la première occurrence d'une chaîne
("e") MsgBox InStr("Developpez", "e") 'renvoie 2

les arguments de la fonction : InStr(start, string1, string2, compare)


Le premier argument "start" (facultatif) permet de définir la position de départ de la recherche.
MsgBox InStr(1, "Developpez", "e") 'renvoie 2

un autre exemple
Dim x As Integer
x = InStr(1, "Developpez", "e") + 1
MsgBox InStr(x, "Developpez", "e") 'renvoie 4

string1 contient la chaîne de caractères qui va être contrôlée.


String2 contient la chaîne à rechercher.
La recherche est sensible à la casse si le dernier argument "compare" (facultatif) est égal à 0, ou omis. (Casse:
Signifie que la recherche n'est pas sensible aux majuscules et aux minuscules)

MsgBox InStr(1, "Developpez", " Z " , 0) 'renvoie 0


MsgBox InStr(1, "Developpez", " z " , 0) 'renvoie 10

La recherche n'est pas sensible à la casse si le dernier argument "compare" est égal à 1

MsgBox InStr(1, "Developpez", "z", 1) 'renvoie 10


MsgBox InStr(1, "Developpez", "Z", 1) 'renvoie 10

Inverser l'ordre des caractères dans une chaîne


Utilisez la fonction StrReverse
MsgBox StrReverse("Developpez")
'Contrôler si un mot est un palindrome( qui s'épell de la même façon dans les deux sens)
Dim leMot As String e
leMot = " radar"
If leMot = StrReverse(leMot) Then MsgBox "Il s'agit d'un palindrome"

Passer l'ensemble d'une chaîne en majuscule


Utilisez la fonction UCase
MsgBox UCase("Developpez")

Passer l'ensemble d'une chaîne en minuscule


Utilisez la fonction LCase
MsgBox LCase("Developpez")

Scinder une chaîne


Utilisez la fonction Split.

Cette fonction est disponible à partir d'Excel2000


'Extraire les données séparées par un espace dans une chaine de caractères Sub
extractionMots()
Dim Tableau() As String
Dim i As Integer
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split("Bienvenue sur le site Developpez.com", " ")
'boucle sur le tableau pour visualiser le résultat For i = 0 To
UBound(Tableau)
'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros Debug.Print
Tableau(i) Next i End Sub

Convertir une chaine vers un format spécifié

Par Essobua BALOUKI 18


Collège de Paris – Cours du Visual Basic for Application
Utilisez la fonction StrConv
Les types de format:

vbUpperCase: 1 (Convertit la chaîne en majuscules)

vbLowerCase: 2 (Convertit la chaîne en minuscules)

vbProperCase: 3 (Convertit la première lettre de chaque mot de la chaîne en majuscule)

Supprimer les caractères non imprimables dans la feuille active


Dim Cel As Range
For l
Eac Cell In ActiveShee .UsedRange
Cel
h .Value = Applicatio
t .WorksheetFunctio .Clean(Cel .Value)
Next l n n l

Supprimer tous les espaces superflus à l'exception des espaces simples entre les mots
L'équivalent de la fonction SUPPRESPACE
Dim Cell As Range
For Each Cell In ActiveSheet.UsedRange
Cell =
Application.WorksheetFunction.Trim(Cell) Next

Dim monText as String


monText = Trim(monText) - supression des espaces à gauche et à droite
monText = LTrim(monText) '- supression des espaces à gauche
monText = RTrim(monText) '- supression des espaces à droite

La fonction ASC
Permet de récupérer la valeur d'un caractère dans un jeu de caractères.
MsgBox Asc("a") 'Renvoie 97 MsgBox Asc("A")
'renvoie 65

La fonction CHR
Permet de récupérer un caractère en fonction de sa valeur dans un jeu de caractères.
MsgBox Chr(97) 'renvoie a MsgBox Chr(65)
'renvoie A

Un autre exemples pour manipuler des guillemets contenus dans une variable
'Remplace le caractère guillemet " par un point d'exclamation dans une chaine
Dim strVariable As String
strVariable = Range("A1")
MsgBox Replace(strVariable, Chr(34), "!")

Les fonctions de conversion des types de données


Ces fonctions convertissent une expression en un type de données spécifié.
Elles sont particulièrement intéressantes pour réadapter un format, par exemple suite à un transfert de données
brutes que vous souhaitez utiliser en type Date, numérique... De la même manière, les données saisies dans des
TextBox ont souvent besoin d'être converties pour une utilisation dans la suite du programme.
Fonction Type Plage de valeurs
CBool renvoyé
Boolean Toute chaîne ou expression numérique valide
CByte Byte 0 à 255
CCur Currency 922 337 203 685 477,5808 à 922337 203 685 477,5807
CDate Date Toute expression de date valide
CDbl Double -1.79769313486231E308 à-4,94065645841247E-324
pour les valeurs négatives ;
4,94065645841247E-324 à1,79769313486232E308
pour les valeurs positives
CDec Decimal +/-79 228 162 514 264 337 593
543 950 335 pour les nombres sans décimales. La plage de
valeurs des nombres à 28 décimales est
+/-7,92281625142643375935439503 Le plus petit nombre

Par Essobua BALOUKI 19


Collège de Paris – Cours du Visual Basic for Application
différent de zéro est 0,0000000000000000
CInt Integer -32 768 à 32 767 ; les fractions sont arrondies. Les parties
décimales sont arrondies à 0,5 au nombre pair le plus proche
CLng Long 2 147 483 648 à 2 147 483 647 ;
les fractions sont arrondies. Les parties décimales sont
arrondies à 0,5 au nombre pair le plus proche
CSng Single -3,402823E38 à -1,401298E-45 pour les valeurs négatives ;
1,401298E-45 à 3,402823E38 pour les valeurs positives
CStr String Les valeurs renvoyées par la fonction Cstr dépendent de
l'argument expression
CVar Variant Même plage de valeurs que le type Double pour les nombres
et que le type String pour les chaînes non numériques

Un exemple qui transforme une chaîne de caractères de type String en type Date.

Sub Essai()
Dim maVariable As String

maVariable = "26/05/2005"

'Ecrit le contenu de la variable dans la cellule


A1 Range("A1") = maVariable
'Ecrit la variable convertie en date dans la cellule
A2 Range("A2") = CDate(maVariable) End Sub

Astuces

Quelques astuces en complément de ceux déjà indiqués :

* Ctrl+Espace: Affiche une liste pour compléter le mot clé que vous êtes en train d'écrire.

* Ctrl+I: Affiche la syntaxe de la variable, fonction, instruction, méthode ou propriété sélectionnée.

* Ctrl+A: Sélectionne tout le texte de la fenêtre Code.

* F7: Affiche la fenêtre de code de l'objet sélectionné dans un UserForm.

* Ctrl + L: Liste les procédures (Pile des appels) en cours d'exécution. La procédure doit être en mode Pause.

Vous pouvez insérer jusqu'à 1024 caractères par ligne de code mais il est conseillé de ne pas écrire en dehors de la
partie visible de l'écran, pour améliorer l'ergonomie de travail dans la fenêtre de saisie.

Si besoin, insérez un espace suivi d'un caractère underscore _ pour revenir à la ligne.
Par exemple:
'Instruction sur une seule ligne.

MsgBox "Vous êtes dans le classeur " & ThisWorkbook.Name


'Résultat équivalent en utilisant des retours à la ligne (caractères underscore)
MsgBox
"Vous êtes dans" & _
"le classeur " &
ThisWorkbook.
Name

Les phases de développement peuvent parfois amener des erreurs ou des plantages involontaires (blocage du classeur,
perte de données ...), même chez les programmeurs chevronnés. Pour vous prémunir de ce genre de désagrément,
sauvegardez régulièrement des versions différentes de vos classeurs.

IX - Les tests et les boucles


Les boucles et tests sont très utilisés lors de l’écriture des codes.

Les tests
Les tests permettent de vérifier si une condition est réalisée pour l’exécution d’une action.
Par Essobua BALOUKI 20
Collège de Paris – Cours du Visual Basic for Application
Deux instructions peuvent être utilisées pour les tests.

If ... Then ... Else … End If


Exemple 1: Attribue une valeur en utilisant la syntaxe sur une seule ligne.

If Digits = 1 Then MyString = "Un" Else MyString = "Plusieurs"

ou bien

MyString = "Plusieurs"
If Digits = 1 Then MyString = "Un"

Exemple 2 : Nombre de digit

Sub NB_Digits ()
Dim Number, Digits, MyString
Number = 53 ’ Initialise la variable.
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
’ Si la condition prend la valeur True, l’instruction suivante est exécutée.
Digits = 2
Else
Digits = 3
End If
End Sub

IIf(expr, action_si_vrai, action_si_faux).


Exemple : Cet exemple utilise la fonction
IIf pour évaluer le paramètre TestMe de la procédure CheckIt et renvoie soit le mot "Grand" si le montant est supérieur à
1000 soit le mot "Petit" s’il est inférieur à 1000.

Function CheckIt (TestMe As Integer)


CheckIt = IIf(TestMe > 1000, "Grand", "Petit")
End Function

Sub verif ()
Dim Variable1 as Integer
Variable1=InputBox("Entrez un nombre pour savoir s’il est grand ou petit")
MsgBox ChecIt (Variable1)
End Sub

Les boucles
En programmation, une boucle, aussi appelée itération, permet d'effectuer une série d'actions de façon répétitive.
Il existe plusieurs solutions pour créer une boucle:
* For Each Next: Boucle sur chaque objet d'une collection.
* For Next: Répète une action le nombre de fois spécifié par un compteur.
Par Essobua BALOUKI 21
Collège de Paris – Cours du Visual Basic for Application
* Do Loop: Itération pendant ou jusqu'à ce qu'une condition soit remplie.
* While Wend: Répète une action tant qu'une condition est vraie.

For Each Next

Ce type de boucle peut être traduit par:


Pour chaque [élément] d'un
[Ensemble] Série d'actions
[élément] suivant

Ici, [Ensemble] représente une collection.


L'architecture Excel est construite sous forme d'objets et de collections. C'est pour cette raison que le langage Visual Basic
For Applications (VBA) est dit 'orienté objet'. Chaque collection possède des objets qui peuvent eux mêmes contenir
d'autres collections:
• L'application possède une collection de classeurs.
• Chaque classeur possède une collection de feuilles.
• Chaque feuille peut contenir une collection de graphiques incorporés.
• ... etc ...
L'objet Application représente le niveau le plus élevé.

Les éléments en bleu sont des objets.


Les éléments en jaune peuvent contenir des objets ou des collections.

Le principe de fonctionnement de l'instruction For Each Next va donc consister à boucler sur tous les objets d'une
collection spécifique. Si la collection ne contient par d'objet ou quand tous les objets ont été parcourus, la boucle est
fermée et l'exécution continue sur la ligne de code, juste après l'instruction Next.

Ce premier exemple boucle sur les classeurs ouverts dans l'application Excel:

Sub BoucleClasseurs()
'Définit une variable qui va représenter un classeur à chaque
itération. Dim Wb As Workbook

'Boucle sur chaque classeur de l'application


Excel For Each Wb In Application.Workbooks
'Ecrit le nom de chaque classeur dans la fenêtre d'exécution Ctrl+G
Debug.Print Wb.Name Next Wb End Sub

Vous noterez que Workbooks représente la collection de tous les classeurs, et Workbook définit un objet de cette
collection pour chaque itération. D'une manière générale en VBA, le nom des collections est différencié du nom
d'objets par un s placé à la fin: Worksheets/Worksheet, ChartObjects/ChartObject ... etc ...

En reprenant le schéma vu précédemment, il est possible des créer des boucles imbriquées qui vont descendre
jusqu'au niveau de détail le plus fin.
Ce nouveau code intervient sur la plage de cellules A1 :A10, dans toutes les feuilles de tous les classeurs ouverts:

Sub BouclePlagesCellules()
'Définit une variable qui va représenter un
classeur Dim Wb As Workbook
'Définit une variable qui va représenter une feuille de
calcul Dim Ws As Worksheet
'Définit une variable qui va représenter une
cellule Dim Cell As Range

'Boucle sur chaque classeur de l'application


Excel For Each Wb In Application.Workbooks
'Boucle sur chaque feuille de chaque

Par Essobua BALOUKI 22


Collège de Paris – Cours du Visual Basic for Application
classeur For Each Ws In Wb.Worksheets
'Boucle sur chaque cellule de la plage
A1:A10 For Each Cell In
Ws.Range("A1:A10")
'Si la cellule contient la valeur 3, on multiplie la valeur par 2 If
Cell.Value = 3 Then Cell.Value = Cell.Value * 2 Next Cell Next Ws Next
Wb
End Sub

Ce n'est pas une obligation pour le bon fonctionnement de la procédure, mais vous remarquez que chaque instruction Next
est suivie du nom de la variable objet (Next Wb, Next Ws, Next Cell). Cette règle d'écriture améliore la relecture des
codes volumineux et contenant de nombreuses boucles imbriquées. De même, utilisez l'indentation (décalage des
portions de macro par l'insertion de tabulations) pour améliorer la lisibilité du code.

Pour gérer la sortie anticipée d'une boucle, utilisez l'instruction Exit For. Dans ce cas la procédure passe directement à la
ligne de code qui suit l'instruction Next.
L'instruction Exit For peut être utilisée:
* Après la vérification d'une condition.
* Lorsqu'une erreur se produit.
Exemple:
Sub BoucleFeuilles()

Dim Ws As Worksheet
'Boucle sur les feuilles d classeur.
u
For Each Ws In ThisWorkbook Worksheets
'On sort de la boucle si le nom de la feuille est "Feuil2".
If Ws.Name = "Feuil2" Then Exit For
MsgBox Ws.Name
Next Ws
End Sub

For ... Next.


Ce type de boucle peut être traduit par:
De [Compteur] = [Numéro de départ] à [Numéro d'arrivée]

Série d'actions [Compteur] suivant

L'instruction For Next permet de répéter des actions un nombre de fois prédéfini.
Vous devez spécifier une valeur de début [Numéro de départ] et une valeur de fin [Numéro d'arrivée]. La variable
[compteur] va ensuite être incrémentée ou décrémentée à chaque itération.

Sub Test ()

Dim x As Integer

'La variable x va successiveme nt prendre les valeurs 3 à 10


For x = 3 To 10
'Ecrit dans la plage de cellules A3:A1 0
' ( Cells(3, 1) correspond à la cellule
'Cells(4, 1) A3,
correspond à la cellule A4 . .. etc. . . ) )
Cells(x, 1) = "Ligne " & x
Next x
End Sub

Par défaut, le compteur est incrémenté d'une unité positive à chaque itération.
Ajoutez l'argument Step afin de personnaliser le pas d'incrémentation. Cette valeur peut être positive ou négative. Une
fois que toutes les actions spécifiées dans la boucle sont terminées, la valeur de l'argument Step est ajoutée à la
variable [compteur].
L'indication d'une valeur négative pour l'argument Step, permet de décrémenter le compteur de la valeur la plus élevée
vers la valeur la plus basse. Vous devez spécifier une valeur de fin [Numéro d'arrivée] inférieure à la valeur de début
[Numéro de départ].

Par Essobua BALOUKI 23


Collège de Paris – Cours du Visual Basic for Application
La boucle s'exécute tant que la valeur [compteur] est supérieure ou égale à la valeur de fin [Numéro d'arrivée].

Sub Test ()

Dim
x As
Integer
'La variable x va successivement prendr les valeurs 10, 7 et 4
e
For x = 10 To 3 Step -3
'Ecrit dans les cellules A7 et A4
A10,
Cells(x, 1) = "Ligne " & x
Next x
End Sub

Nota:
Lorsque vous utilisez l'argument Step pour décrémenter un compteur, le type de variable (x dans les exemples
précédents) ne doit pas être Byte, sinon vous obtiendrez un message d'erreur 'Dépassement de capacité'.
Pour gérer la sortie anticipée d'une boucle, avant que le compteur n'atteigne la valeur de fin, utilisez l'instruction Exit
For. Tout comme dans le type de boucle For Each Next, la procédure passe directement à la première ligne de code
qui suit l'instruction Next.
L'instruction Exit For peut être utilisée:
* Après la vérification d'une condition.
* Lorsqu'une erreur se produit.
Exemple:
Sub Test ()
Dim x As Integer
'Boucle de 1 à 10
For
x = 1 To 10
'On sort de la boucle si l cellul testée ne contient
'pas une donnée numérique. a e
If Not IsNumeric(Cells(x, 1 ) Then Exit For
'Multiplie le contneu de )
l cellul par 2
Cells(x, 1) = Cells(x, 1) a
* e
2
Next x
End Sub

While ... Wend.


L'instruction While Wend répète une action tant qu'une condition est vraie.
While condition
Actions
Wend
Qui peut être traduit par:
[Tant que] La condition à vérifier
Les actions à
effectuer [Répéter]

Si la condition est vraie, les actions indiquées dans la procédure sont effectuées. Quand l'instruction Wend est atteinte,
la procédure revient sur l'instruction While et la condition est de nouveau vérifiée. Si condition est toujours vraie, le
processus est répété. Si la condition est fausse, l'exécution passe directement à la première ligne de code qui suit
l'instruction Wend.

Sub
Test_WhileW
end() Dim i
As Integer

i = 1

'Boucle sur les cellules de la colonne A


'On sort de la boucle si la cellule testée (Cells(i, 1)) est
vide While Not IsEmpty(Cells(i, 1))

Par Essobua BALOUKI 24


Collège de Paris – Cours du Visual Basic for Application
'Ecrit le contenu de la cellule dans la fenêtre
d'exécution. Debug.Print Cells(i, 1)
'Incrémente la variable d'une unité afin de tester la cellule suivante, i =
i + 1 Wend End Sub

Remarque:

While Wend est incluse dans VBA pour assurer une compatibilité ascendante. Privilégiez l'instruction Do Loop qui
permet d'exécuter une itération de manière plus structurée et plus souple (CF aide Excel).

La méthode While wend ne possède pas d'instruction spécifique pour la sortie anticipée de boucle.

Do...Loop.

Les boucles Do Loop, associées aux mots clés While et Until permettent de répéter une ou plusieurs actions pendant ou
jusqu'à ce qu'une condition soit remplie.
Les instructions peuvent être associées de différentes manières:
Do
Actions
Loop While condition
Qui peut être traduit par:
[Faire]
Les actions à effectuer
[Recommencer] [Tant que]
condition

Do While condition
Actions
Loop

Qui peut être traduit par:


[Faire] [Tant que] condition
Les actions à effectuer [Recommencer]

Do Until condition
Actions
Loop

Qui peut être traduit par:


[Faire] [Jusqu'à ce que] condition
Les actions à effectuer [Recommencer]

Do
Actions
Loop Until condition

Qui peut être traduit par:

[Faire]
Les actions à effectuer
[Recommencer] [Jusqu'à ce que] condition

Vous pouvez utiliser les mots clés While et Until pour vérifier qu'une condition est remplie:
* Avant d'exécuter les actions contenues dans la boucle.
* Après chaque exécution de la boucle.
Do Loop peut exécuter des blocs d'instructions un nombre de fois indéfini. Il est donc important de s'assurer qu'une
condition de sortie pourra être remplie et que la boucle ne tournera pas sans fin.
Dans cet exemple, la boîte de dialogue s'affiche tant que le mot de passe saisi est incorrect:

Par Essobua BALOUKI 25


Collège de Paris – Cours du Visual Basic for Application
Sub SaisieMotDePasse()
Dim Reponse As String

'Affiche la boîte de dialogue tant que l'utilisateur n'a pas


saisi '"mimi" (en minuscules). Do While Reponse <> "mimi"
Reponse = InputBox("Saissez le mot de passe:", "Mot de
passe") Loop

MsgBox "OK, poursuite de la


procédure." End Sub

Cette autre procédure incrémente la variable "i" d'une unité à chaque itération, permettant ainsi de boucler sur les
cellules de la colonne A jusqu'à trouver la chaîne "DVP".
Sub Boucle_V01()
Dim i As Integer

Do
i = i + 1 Loop While
Cells(i, 1) <> "DVP"

MsgBox "Trouvé ligne "


& i End Sub

Bien évidemment, si le mot "DVP" n'existe pas, la procédure ne va jamais s'arrêter. Pour y remédier vous pouvez
ajouter l'instruction Exit Do qui permet d'anticiper la sortie de la boucle.

Voici une modification de la macro précédente afin de ne pas dépasser 1000 itérations, si le mot recherché n'est pas
trouvé.

Sub Boucle_V02()
Dim i As Integer

Do
i = i + 1
'On sort après 1000 itérations. If i > 1000 Then Exit Do 'On
répète la boucle tant que le contenu de la cellule est
différent
'de la chaîne "DVP". . (la procédure est sensible à la casse).
Loop While Cells(i, 1) <> "DVP"
'Affiche un message en fonction du résultat de l recherche.
a
MsgBox IIf(Cells(i, 1) = "DVP", "Trouvé ligne " & i, "Pas trouvé")
End Sub

Arrêter une boucle


Dans les parties précédentes, nous avons vu les instructions Exit For et Exit Do pour forcer la sortie d'une boucle en
fonction de conditions. Néanmoins, il y a toujours un risque de créer une boucle infinie si la condition de sortie n'est
jamais remplie.
En cas d'urgence, si une macro de veut plus s'arrêter, utilisez simultanément les touches clavier: Ctrl + Pause. Vous
pouvez aussi utiliser la touche Echap.
Cette solution affiche une fenêtre d'erreur 'Exécution interrompue'. Cliquez sur le bouton Fin pour terminer la
procédure.
Si vous souhaitez gérer les touches Ctrl + Pause ou Echap par macro, utilisez la propriété EnableCancelKey: Cet
exemple affiche un message personnalisé à la place de la fenêtre d'erreur, avant de sortir de la macro.
Sub GestionSortieBoucle Echap()

Dim x As Long
On Error GoTo Fin
Application.EnableCancelKey = = xlErrorHandler
'Crée un boucle assez longue pour vous donner le temps de tester
'l'utilisation de la touche Echap".
For x = 1 To 50000
Cells(x, 1) = x
Next x
Fin
If Err.Number = 18 Then MsgBox "Opération annulée."

Par Essobua BALOUKI 26


Collège de Paris – Cours du Visual Basic for Application
End Sub

Par Essobua BALOUKI 27


Collège de Paris – Cours du Visual Basic for Application

X - Application de VBA à Excel

Les collections
On entend par collection, la réunion d'éléments connexes permettant d'accéder à ces éléments par leurs numéros
d'index (ou parfois par leur nom), mais aussi d'ajouter ou de supprimer des membres.
Le modèle objet d'Excel contient ainsi de nombreuses collections hiérarchisées (on peut dire que l'application
contient une collection de classeurs dont chaque élément contient une collection de feuilles etc... )
Une collection contient généralement au moins trois méthodes et une propriété de base.
Les méthodes Add et Remove (ou Delete) permettent l'ajout / suppression d'éléments, la méthode Item permet
d'accéder à un élément par son index ou son nom, la propriété Count donne le nombre d'éléments de la collection.
Attention toutefois, certaines collections sont de base 0, d'autres de base 1. Dans Excel, les collections sont de Base 1.
Cela signifie que le numéro d'index 1 est le premier numéro d'index utilisable pour pointer sur un élément à travers la
collection.
En général, la collection a le même nom que les objets qu'elle contient en y ajoutant un "s" à la fin. Par exemple la
collection des objets classeurs WorkBook s'appelle WorkBooks
Quelques remarques encore, les collections coûtent relativement cher en mémoire, donc avant d'utiliser un des
membres fréquemment, il convient de l'affecter à une variable fortement typée.
Exemple
Dim MaPlage as Range
Set MaPlage = ActiveSheet.Cells(1,1) _________________________________________
L'utilisation de "MaPlage" permet un meilleur accès à la cellule que l'utilisation d'Active Sheet.Cells(1) tout au long
du code.
L'appel à la méthode Item est implicite,
WorkBooks("NomClasseur").Activate et WorkBooks.Item("NomClasseur").Activate sont
équivalents.

L'énumération
Cette technique permet de parcourir une collection. Sa syntaxe est For Each... .Next
Là encore, typez fortement votre variable d'énumération.
Dim MaCellule As Range
For Each MaCellule in ActiveSheet.Range("A1 :E5")
Next
Dans l'exemple ci-dessus, "Dim MaCellule As Range" est mieux que "Dim MaCellule As Object" qui est mieux que
"Dim MaCellule As Variant".

Par Essobua BALOUKI 28


Collège de Paris – Cours du Visual Basic for Application

L'Adressage
Excel fonctionne principalement par un système d'adresse (appelé aussi référence) pour localiser une cellule
particulière. Le nom complet d'une adresse Excel valide est dans le cas d'une cellule :
'[NomClasseur.xls]NomFeuille'!$PositionCellule. Excel utilise indifféremment deux types de références
appelées A1 où les colonnes sont des lettres et les lignes des nombres, et L1C1 où lignes et colonnes sont des
nombres. L'exemple ci-dessous donne deux adresses Excel complètes dans les deux styles de références :
'[NomClasseur.xls]NomFeuille'!$A$35 ou '[NomClasseur.xls]NomFeuille'!L1C35
Ces références peuvent être relatives ou absolues. Une référence absolue donne la position d'une cellule dans
la feuille par l'intersection de la ligne et de la colonne, une référence relative donne l'adresse de la cellule par
décalage de l'adresse par rapport à une autre cellule. Une référence peut être relative dans une direction (par
exemple les colonnes) et absolue dans l'autre. Dans le tableau suivant, nous voyons l'écriture de l'adresse "B2"
dans la cellule "A1" dans tous les modes
Références A1 L1C1
Ligne Colonne
Absolue Absolue =$B$2 =L2C2
Absolue Relative =B$2 =L2C(1)
Relative Absolue =$B2 =L(1)C2
Relative Relative =B2 =L(1)C(1)
A l'identique en VBA on peut donner l'adresse d'un objet appartenant au modèle objet Excel par :
Application.Workbooks("NomClasseur").Sheets("NomFeuille").Objet...
Dans la pratique on ne met jamais Application dans l'adresse puisqu'il est clairement implicite (sauf dans le cas
d'un classeur partagé dans un programme utilisant plusieurs instances d'Excel).

ThisWorkBook
L'objet ThisWorkBook représente le classeur qui contient la macro qui est en train de s'exécuter Ceci sous-
entend, qu'il n'est jamais nécessaire de mettre dans une variable le classeur contenant la macro pour y faire
référence.

Objet actif
La notion de l'objet actif permet d'accéder à des raccourcis dans l'adressage VBA. Cette notion, très employée
par l'enregistreur de macro est certes performante, mais non dénuée de risque. A chaque instant, de
l'application, on peut nommer le classeur actif (visible) ActiveWorkbook, la feuille visible de ce classeur
ActiveSheet et la cellule sélectionnée ActiveCell. (il y en a d'autres mais voilà les principaux)
Ceci permet bien des raccourcis d'écriture de code mais demande deux choses :
> Bien savoir quel est l'objet actif
> Manipuler l'activation
Or comme nous allons le voir au cours de cet article, manipuler l'activation est une méthode lourde et assez
lente.
Je reviendrai sur quand utiliser cette syntaxe plus tard.

Sélection
Cet objet représente ce qui est sélectionné. Cette simple définition devrait suffire pour se méfier de son
utilisation. En effet, on l'utilise en général quand on ne sait pas quel est le type de l'objet que l'on cherche à
atteindre. A mon avis son utilisation est à proscrire. Là encore, on le trouve très souvent dans les macro s
enregistrées, je vais donc vous donner une petite astuce pour connaître le type d'un objet. En général, tout
objet inséré par le code, l'est par une méthode Add. On ajoute donc une variable de type variant où l'on affecte
l'objet crée. La fonction TypeName permet alors de connaître le type de l'objet. Ceci peut se faire aussi avec
l'espion express du débogueur.

Par Essobua BALOUKI 29


Collège de Paris – Cours du Visual Basic for Application
Paramètres nommés
Excel accepte une syntaxe particulière pour ses méthodes, celle des paramètres (ou arguments) nommés. En Visual
Basic l'appel d'une procédure paramétrée se fait en plaçant les paramètres dans le même ordre que celui qui se
trouve dans la déclaration de la procédure. Cette méthode reste vraie en VBA mais il y a aussi la possibilité de ne
passer que quelques-uns de ces paramètres en les nommant. Regardons par exemple la méthode Find d'Excel.
Sa déclaration est :
expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection,
MatchCase, MatchByte)

Son utilisation normale serait


Set CelluleCible=ActiveSheet.Cells.Find(2,ActiveCell, xlValues, xlWhole,
xlByColumns, xlNext, False)
Mais je pourrais très bien simplifier en écrivant S e t
CelluleCible=ActiveSheet.Cells.Find(What : = 2 , LookIn:= xlValues)
Ceci permet une plus grande clarté du code ainsi qu'une simplification à la condition expresse de bien connaître la
valeur par défaut des paramètres.

Les évènements
La gestion des événements dans Excel se fait via du code soit dans un module d'objet WorkSheet, soit dans le
module de l'objet WorkBook. Pour atteindre le module de code du classeur, on ouvre la fenêtre VBA et dans
l'explorateur de projet on double click sur "ThisWorkBook". Pour atteindre le module d'une feuille on peut soit
passer par l'explorateur de projet, soit faire un click droit sur l'onglet de la feuille et choisir "Visualiser le code".

Intercepter les évènements Excel en Visual Basic


Dans la feuille VB où l'on souhaite récupérer l'événement on déclare une variable globale P r i v a t e
WithEvents MaFeuille As Excel.Worksheet
Après il suffit d'écrire une procédure d'évènements identique à la procédure Excel correspondante. Par exemple,
l'événement de feuille SelectionChange s'écrit dans Excel
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Et dans Visual Basic : Private Sub MaFeuille _SelectionChange(ByVal Target As Excel.Range)
L'exemple suivant montre l'interception de l'événement BeforeClose d'un classeur dans Visual Basic afin
d'empêcher la fermeture de celui-ci (et donc de l'application Excel) par l'utilisateur. Pour qu'Excel puisse se fermer
dans cet exemple, il faut remplir la case "A1", ce qui est géré par l'événement
MonClasseur_SheetChange.
Private WithEvents MonClasseur As Excel.Workbook
Private MonExcel As Excel.Application, MaFeuille As Excel.Worksheet
Private Sub OuvreExcel()
Set MonExcel = New Excel.Application
MonExcel.ReferenceStyle = xlR1C1
Set MonClasseur =
MonExcel.Workbooks.Open("D:\User\jmarc\tutorial\excel\tutor1.xls")
Set MaFeuille = MonClasseur.Worksheets("pilotage")
MonExcel.Visible = True
End Sub
Private Sub MonClasseur_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub

Private Sub MonClasseur_SheetChange(ByVal Sh As Object, ByVal Target As


Excel.Range)

If Not MonExcel.Intersect(Target, MaFeuille.Cells(1, 1)) Is Nothing Then


MonExcel.EnableEvents = False

Par Essobua BALOUKI 30


Collège de Paris – Cours du Visual Basic for Application
MonClasseur.Close False

Set MaFeuille = Nothing


Set MonClasseur = Nothing
MonExcel.Quit
Set MonExcel = Nothing
End If
End Sub

La base, l'objet Application


Cet objet représente l'application Excel. Il est l'objet parent de tous les autres, et contient des propriétés méthodes et
évènements très intéressants, que nous allons regarder maintenant.

Evènements
On utilise rarement les événements au niveau de l'application, pour la raison simple qu'ils ne sont pas accessibles
directement. Pour pouvoir les utiliser, il faut dans le projet créer un module de classe dans lequel on met le code
suivant :
Public WithEvents App As Application
Comme la plupart des événements gérés se retrouvent dans les objets classeur et feuille, nous les utiliseront plutôt à ce
niveau.

Propriétés
Quelques propriétés utiles de l'objet application :
AskToUpdateLinks : Si sa valeur est False la mise à jour des liaisons se fait sans appel d'une boite de dialogue, qui
sinon apparaît automatiquement.
Calculation (xlCalculationAutomatic, xlCalculationManual, xlCalculationSemiautomatic): Définit le mode de
recalcul d'Excel. Il s'agit d'une propriété très importante pour l'optimisation du temps d'exécution. En effet, pour
les feuilles contenant des formules de calcul, le mode de calcul automatique peut être très coûteux en temps, en
effet Excel recalcule intégralement une feuille de calcul à chaque modification ou suppression. C'est pourquoi, en
général on bloque le mode de calcul au départ en faisant : Application.Calculation = xlCalculateManual
Puis on exécute les calculs lorsqu'on en a besoin avec la méthode Calculate
CutCopyMode (False,xlCopy,xlCut) : Définit si on utilise un mode par défaut copier ou couper. En fait, on l'utilise
souvent sous la forme Application. CutCopyMode=False pour vider le presse papier.
DisplayAlerts : Si sa valeur est False, les messages d'avertissements d'Excel ne seront pas affichés.
Il faut toujours remettre la valeur à True en fin d'exécution
Interactive : Désactive toutes les interactions entre Excel et le clavier/souris.
Il faut toujours remettre la valeur à True en fin d'exécution
International : Renvoie des informations relatives aux paramètres régionaux et internationaux en cours. Cette
propriété est en lecture seule. On s'en sert généralement pour connaître les séparateurs.
ReferenceStyle (xlA1 ou xlR1C1): Permet de basculer entre les modes L1C1 et A1. Il est à noter que cela change
l'affichage des feuilles mais que cela peut aussi avoir une influence sur le code. En effet certaines formules
comme les règles de validations doivent être écrites dans le même système de référence que celui de l'application.
ScreenUpdating : Permet de désactiver la mise à jour d'écran. Pour des raisons de vitesse d'exécution il est conseillé
de toujours la désactiver.
t*t Il faut toujours remettre la valeur à True en fin d'exécution, sous peine de récupérer un écran figé.
SheetsInNewWorkbook : Permet de définir le nombre de feuilles contenues dans un nouveau classeur. Lorsque
l'on sait exactement le nombre de feuilles nécessaires, on peut modifier cette propriété afin de ne pas faire des
worksheets.add. Il convient de restaurer cette valeur en fin d'exécution.

Par Essobua BALOUKI 31


Collège de Paris – Cours du Visual Basic for Application

Méthodes
Calculate : Permet de forcer le calcul. La syntaxe Application. Calculate est peu utilisée. On l'utilise
principalement sous la forme MaFeuille.Calculate. Sachez toutefois que l'on peut restreindre le calcul à une
plage à des fins de performance. Exemple :
Worksheets(1).Rows(2:3).Calculate ne fait les calculs que sur les lignes 2 et 3.
Evaluate : Permet de convertir une chaîne en sa valeur ou en l'objet auquel elle fait référence. Nous allons
regarder quelques utilisations de cette méthode.
Interprétation de formule de calcul -> Imaginons que ma cellule A1 contient le texte (12*3)+4, écrire
Range("A2").Value=Application.Evaluate(Range("A1").Value)
Renverra 40 en A2. De même on pourra écrire : R e s u l t a t = A p p l i c a t i o n . E v a l u a t e ( " ( 1 2 * 3 ) + 4 " )
La méthode permet aussi d'évaluer une formule respectant la syntaxe Excel (en anglais) ; on peut écrire
Resultat= Application.Evaluate("Sum(A1 :E5)")
Interprétation d'une adresse -> Si ma cellule A1 contient B1 :B2 je peux écrire
Application.Evaluate(Range("A1").Value).Font.Bold=True
Il est à noter que le mot Application est facultatif et on trouve parfois la notation [ A 1 ] . F o n t . B o l d = T r u e
Qui est strictement équivalente !
FindFile Permet de lancer une recherche de fichier dans laquelle on spécifie les critères. La collection FoundFiles
contient les fichiers trouvés correspondant.
(cf l'exemple plus loin)GetOpenFileName : Ouvre la boite de dialogue "Ouvrir un fichier" mais n'ouvre pas le
fichier. La méthode renvoie juste le nom complet du fichier sélectionné.
GetSaveAsFilename : De même que précédemment mais avec la boite "Enregistrer Sous..."
Goto : Je cite cette méthode pour vous mettre en garde. L'enregistreur de macro l'utilise lors de l'appel d'une plage
nommée, elle sous-tend un "Activate" et un "Select". Il faut donc faire très attention lors de son utilisation dans le
code car elle peut facilement changer les objets actifs.
Intersect : Renvoie une plage qui est l'intersection de n plages. Bien que les plages appartiennent à des objets
feuilles, la méthode Intersect appartient directement à l'objet Application.
OnKey : Permet l'exécution d'une macro lors de l'appui sur une touche ou sur une combinaison de touches.
Application. OnKey " ^ { A } " , "MaProc" lance la procédure MaProc sur l'appui de CTRL-A
Pour restaurer la séquence de touche on écrit : Application.OnKey "^{A}"
OnTime : Permet l'exécution d'une macro à une heure fixée ou après un délai précisé.
Application.OnTime Now + TimeValue("00:00:15"), "MaProc" attend 15 secondes avant
d'exécuter la procédure MaProc
Run : Lance l'exécution de la procédure spécifiée. Si celle-ci attend des paramètres, ils ne peuvent pas être nommés.
Par exemple imaginons la fonction suivante :
Private Function MaSomme(Oper1 as D ou bl e, Op er 2 as Do ub le ) As D ou bl e.

La syntaxe d'appel sera : R e s u l t at = A p p li c a ti o n . R u n ( M o n C l a s s eu r! M a So m m e , 1 . 2 , 2 . 3 )


Union : Renvoie l'union de n plages. Même remarque que pour Intersect.
Wait : Marque une pause dans l'exécution de la macro.
L'objet WorkBook (classeur)
Le classeur est en général l'objet central de la programmation Excel. Lorsque l'application va utiliser un seul
classeur, on peut utiliser ActiveWorkbook, mais dans le cas d'une application multi-classeurs, il convient de les
mettre dans des variables afin d'en simplifier la manipulation. Pour cela, on fait :
En VBA
Dim MonClasseur as WorkBook Set MonClasseur=ActiveWorkBook
En VB
Dim MonClasseur as Excel.WorkBook

Par Essobua BALOUKI 32


Collège de Paris – Cours du Visual Basic for Application
Set MonClasseur=ActiveWorkBook
On peut bien sûr faire l'affectation dans le même temps que l'ouverture ou l'ajout, par exemple Set
MonClasseur=WorkBooks.Open Filename:="C:\User\Classeur1.xls"
N.B. (en VBA uniquement) : Si on utilise deux classeurs dont celui qui contient la macro, il n'est pas utile de mettre
celui-ci dans une variable puisqu'on le retrouve sous le nom "ThisWorkbook".
La collection WorkBooks
Cette collection contient l'ensemble des classeurs ouverts. L'ordre des classeurs dans la collection (index) est
l'ordre d'ouverture. Elle possède quatre méthodes que nous allons étudier
Add
Permet d'ajouter un nouveau classeur à la collection et non pas d'ouvrir un classeur existant. Le classeur créé
devient le classeur actif.
Elle suit la syntaxe Worbooks.Add(Template)
Si Template est un fichier Excel existant, le classeur est créé en suivant le modèle défini. Template peut aussi
être une constante (xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet,
xlWBATWorksheet) et dans ce cas, le classeur ne contiendra qu'une feuille du type donné. Enfin si Template est
omis un nouveau classeur standard est créé.
Close
Cette méthode ferme tous les classeurs de la collection. Donc attention de ne pas confondre
WorkBooks.Close et WorkBooks(1).Close
Open
Ouvre un classeur Excel. Sa syntaxe est :
WorkBooks Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword,
IgnoreReadOnlyRecommended, Origin, Delimiter, Editab le, Notify, Converter, AddToMRU) Seul FileName est
obligatoire.
OpenText
Permet d'ouvrir un fichier texte délimité comme un classeur. Sa syntaxe est
WorkBooks. .OpenText(Filename, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab,
Semicolon, Comma, Space, Other, OtherChar, FieldInfo)
Quelques méthodes à connaître
Close
Ferme le classeur. La syntaxe est :
MonClasseur. Close(SaveChanges, FileName, Route Workbook)
Si SaveChanges est omis, une boite de demande d'enregistrement apparaît. Donner une valeur FileName
différentes de celle du classeur revient à faire un SaveAs.
PrintOut
Lance l'impression du classeur. Sa syntaxe est :
MonClasseur.PrintOut(from, To, Copies, Preview, ActivePrinter, PrintToFile, Collate) A noter que From et To
sont des pages d'imprimante et non les feuilles du classeur, et que ActivePrinter permet de choisir l'imprimante
8
Protect / UnProtect
Active ou désactive la protection du classeur. La syntaxe est :
MonClasseur.Protect(Password, Structure, Windows) pour activer la protection
MonClasseur. UnProtect(Password) pour la retirer.
A ce propos, la protection du classeur et des feuilles est une chose indépendante. La protection du classeur sert à bloquer la
structure de celui-ci, celle de la feuille à protéger les objets qu'elle contient. On peut parfaitement protéger une feuille sans
protéger le classeur et inversement.
Save / SaveAs

Par Essobua BALOUKI 33


Collège de Paris – Cours du Visual Basic for Application

Sauvegarde le classeur. La syntaxe de SaveAs est :


MonClasseur.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup,
AddToMru, TextCodePage, TextVisualLayout)
Evènements du classeur
L'objet classeur possède beaucoup d'événements, je ne vais donc détailler que ceux les plus souvent utilisés. BeforeClose,
BeforePrint, BeforeSave
Private Sub Workbook_Before-—--(Cancel As Boolean)
Se produit avant l'événement. Dans le cas de BeforeClose se produit avant la demande d'enregistrement des modifications. Mettre
Cancel = True dans la procédure empêche l'événement d'avoir lieu.
Open
Se produit à l'ouverture du classeur. Permet donc de faire des macros à exécution automatique
SheetBeforeDoubleClick, SheetBeforeRightClick
Private Sub MonClasseur SheetBefore-—--Click(ByVal Sh As Object, ByVal Target As Range, ByVal Cancel As Boolean)
Ces évènements sont des évènements de feuille. On utilise l'événement au niveau classeur lorsqu'on veut centraliser
l'événement pour plusieurs feuilles du classeur. S'il existe aussi une procédure pour l'événement au niveau feuille, elle
s'exécutera avant la procédure du classeur.
Cet événement ne se produit pas sur les feuilles graphiques.
L'objet "Sh" est un objet WorkSheet qui représente la feuille sur laquelle l'événement se produit. Nous regarderons l'argument
Target dans "les techniques de programmation".
SheetCalculate, SheetChange, SheetSelectionChange
Les mêmes remarques sont valables. Nous étudierons en détail ces événements dans le chapitre sur les feuilles.

Les Feuilles (Sheets)


Un classeur Excel est composé d'une ou plusieurs feuilles. Ces feuilles peuvent être de cinq types :
Feuille de calcul, Feuille graphique, Macro Excel4, Macro Excel4 International, feuilles de bo îtes de
dialogue Excel 5.
La collection Sheets contient toutes les feuilles du classeur quel que soit leur type. En fait, on utilise très
peu cette collection sauf pour connaître le nombre total de feuille avec la propriété Count ou parfois pour ajouter
une feuille de type macro Excel4.

Feuille de calcul (WorkSheet)


L'objet WorkSheet doit suivre les mêmes règles de programmation que l'objet classeur. On utilise ActiveSheet que dans le
cas d'une application ne mettant en jeu qu'une seule feuille. Sinon on référence la feuille par :
En VBA
Dim MaFeuille as WorkSheet Set MaFeuille=ActiveWorkSheet
En VB
Dim MaFeuille as Excel.WorkSheet Set MaFeuille=ActiveWorkSheet
Observons qu'il est rarement nécessaire de référencer à la fois la feuille et le classeur.
La collection Worksheets
Cette collection contient l'ensemble des feuilles de calcul du classeur. Le num éro d'ordre d'un objet WorkSheet dans
cette collection est son ordre dans les onglets du classeur. Méthodes utiles
Add WorkSheet.Add(Before, After, Count, Type)
Before et/ou After permettent de préciser la position où la feuille doit être ajoutée. L'argument Count détermine le nombre de
feuilles à ajouter. Type revient à faire un Add de la collection Sheets.
Comme je l'ai signalé au préalable, la position de l'objet WorkSheet dans l'ensemble des Worksheets du classeur va aussi être

Par Essobua BALOUKI 34


Collège de Paris – Cours du Visual Basic for Application

son index dans la collection WorkSheets. C'est pourquoi accéder à une feuille par WokSheets(index) peut être une source
d'erreur.
Copy Worksheets(index).Copy(Before, After)
Duplique une feuille dans le classeur ou crée une copie dans un autre classeur.
Attention ! lors de la copie d'une feuille, la collection "Names" des plages nommées appartient à l'objet WorkBook et à l'objet
WorkSheet. Lors de la duplication de la feuille, Excel va créer deux noms presque identiques, ce qui peut engendrer des bugs.
Delete WorkSheets(index) .Delete
Supprime la feuille spécifiée par index. Un classeur doit toujours contenir au moins une feuille.
FillAcrossSheets WorkSheets(collection). FillAcrossSheets (Range, Type)
Permet de recopier une plage sur plusieurs feuilles en même temps. Range détermine la plage à copier, Type définit le mode de
copie (xlFillWithAll, xlFillWithContents ou xlFillWithFormulas)
Il faut passer une collection ou un tableau d'objets WorkSheet contenant les feuilles concernées par la recopie à la méthode.
Cette collection doit toujours contenir la feuille contenant la plage source.
Le code suivant recopie la plage A1 : A10 sur toutes les feuilles de calcul du classeur
Dim MaFeuille As Worksheet
Set MaFeuille = ActiveWorkbook.Worksheets(1)
Worksheets.FillAcrossSheets MaFeuille.Range(Cells(1, 1), Cells(10, 1)),
xlFillWithAll
Le code suivant recopie la même plage dans la feuille "Feuil3"
Dim MaFeuille As Worksheet, TabFeuille As Variant
Set MaFeuille = ActiveWorkbook.Worksheets(1)
TabFeuille = Array("Feuil1", "Feuil3")
Worksheets(TabFeuille).FillAcrossSheets MaFeuille.Range(Cells(1, 1),
Cells(10, 1)), xlFillWithAll
Move : Worksheets(index).Move(Before, After)
Similaire à copy mais déplace la feuille. Dans ce cas il n'y a pas de problème avec les noms.
Evènements de l'objet WorkSheet
BeforeDoubleClick, BeforeRightClick
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Se produit avant que l'effet du double click ou du click droit se produise. Mettre Cancel à True annule l'évènement
normalement attendu. Target renvoie un objet Range qui représente la cellule ayant reçu l'évènement.
Calculate
Se produit après le recalcul de la feuille.
Change
Private Sub Worksheet_Change(ByVal Target As Range)
Se produit lorsque le contenu d'une cellule ou d'une plage change, du fait de l'utilisateur ou d'un lien externe, ou du
programme, mais pas par le recalcul.
Target renvoie la plage ou la cellule modifiée. Pour la gestion de ces plages voir plus loin au chapitre "techniques de
programmation".
SelectionChange
Private Sub Worksheet SelectionChange(ByVal Target As Excel.Range)
Se produit lorsque la sélection a changé. Target renvoie la nouvelle plage sélectionnée.
é* Attention à la programmation de cet évènement. La présence de méthode Select dans la procédure peut déclencher un
évènement en cascade.
Quelques propriétés
Names

Par Essobua BALOUKI 35


Collège de Paris – Cours du Visual Basic for Application

Renvoie la collection des noms spécifique à la feuille de calcul. Attention les plages nommées appartiennent à l'objet
WorkBook. La collection Names renvoyée par cette propriété ne contient donc pas les plages nommées contenues par la feuille
sauf si l'on a défini ce nom comme spécifique.
N.B : Pour votre culture générale, lors de la définition d'un nom, si on écrit NomFeuille!Nom on crée une plage nommée
spécifique.
PageSetup
Renvoie un objet PageSetup qui contient toutes les informations de mise en page de la feuille.
Shapes
Renvoie la collection Shapes de toutes les formes présentes sur la feuille. Cette collection peut contenir beaucoup d'objets de
types différents. Je n'aborderai pas dans cet article la programmation avec Shapes.
Visible
Affiche ou masque la feuille. La propriété peut prendre la valeur xlVeryHidden qui masque la feuille de telle façon qu'elle ne
puisse être rendue visible que par le code ou par l'explorateur de projet.

Plage et cellule (Range)


Nous allons aborder ici la clé de la programmation. Une plage de cellules (objet Range) représente n'importe quel groupe
de cellules d'une feuille. La plage peut être constituée d'une cellule, d'une plage continue ou de plusieurs plages. L'objet Range,
lorsqu'il représente des cellules, appartient toujours à un objet WorkSheet. L'objet Range ne possède pas d'événement
spécifique, néanmoins on peut lui faire utiliser les événements de feuille ou de classeur.
Excel fonctionne avec un système d'adresse. Il existe en fait deux styles de référence :
R1 C1 Les colonnes et les lignes sont représentées par des nombres
A1 Les colonnes sont des lettres et les lignes des nombres.
Le changement de style au cours d'un programme ne pose pas de problème vis-à-vis des formules déjà existantes dans une
feuille. Sachez toutefois que le code doit être rédigé dans le même style de référence que l'application, sous peine de voir parfois
se déclencher des erreurs.
En mode A1 on utilise un range comme suit :
MaFeuille .Range ( "A1" ) : une cellule
MaFeuille .Range ( "A1 : E 1 0 " ) ou Range ( " A 1 " , " E 1 0 " ) : une plage continue
En mode R1C1
MaFeuille. Cells ( 1 , 1) : une cellule
MaFeuille. Range ( C e l l s ( 1 , 1 ) , C e l l s ( 1 0 , 5 ) ) : une plage continue
Quel que soit le style, les plages discontinues s'obtiennent à l'aide de la méthode Union que nous verrons plus en détail dans la
deuxième partie.
En général j'utilise la syntaxe R1C1. La notation est Cells(Ligne, Colonne)
Je vais faire maintenant un parcours de ses propriétés et méthodes.
Propriétés ne renvoyant pas un objet - collection
Address
MonRange.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
RowAbsolute et ColumnAb solute détermine si la référence renvoyée est relative ou absolue, ReferenceStyle détermine le style de
référence, External ajoute le nom du classeur et le nom de la feuille.
Comme nous l'avons vu, peu importe le style utilisé puisque la propriété Address renvoie la référence dans le style désiré.
Column, row : Renvoie le numéro de la première colonne / ligne de la plage
Column Width, RowHeight : Renvoie ou définit la largeur / hauteur des colonnes / lignes de la plage.
Formula / FormulaR1C1 : Définit ou renvoie la formule de la plage, cette formule étant en anglais.
FormulaLocal : Identique à Formula mais dans la langue de l'utilisateur.
Hidden : Masque une ou plusieurs ligne(s)/colonne(s). Attention l'ensemble de la ligne ou de la colonne doit être sélectionnée

Par Essobua BALOUKI 36


Collège de Paris – Cours du Visual Basic for Application

(voir plus loin à "plage particulière").


HorizontalAlignment : Définit l'alignement dans la plage. Peut permettre un centrage multi-colonnes si la plage contient
plusieurs colonnes.
Locked : Renvoie ou définit si les cellules sont verrouillées. Le verrouillage n'a aucun effet tant que la feuille n'est pas
protégée.
MergeCells : Renvoie Vrai si la cellule fait partie d'une plage fusionnée. A ce propos, évitez si possible de fusionner les
cellules. C'est très souvent une source de problèmes.
Name : Renvoie ou définit le nom de la plage. Comme nous le verrons dans les techniques de programmation, les plages
nommées sont très utiles.
NumberFormat : Renvoie ou définit le format des cellules de la plage. Lors de la lecture, renvoie NULL si tous les formats ne
sont pas identiques.
ShrinkToFit : Force le contenu à s'adapter aux dimensions de la cellule.
WrapText : Force le retour à la ligne si le contenu dépasse la largeur de la cellule.
Propriétés renvoyant un objet
Areas : Renvoie la collection Areas de l'objet Range. Si la plage est une plage continue, la collection Areas ne contient qu'un
élément qui est l'objet Range. Si cette plage contient plusieurs plages discontinues, il y a autant d'éléments que de plages
continues dans l'objet Range.
Par Exemple
Dim MaPlage As Range, NbPlage As Integer, AdrTest As String
Set MaPlage = Union(Range(Cells(1, 1), Cells(5, 1)), Range(Cells(1, 3),
Cells(5, 3)), Range(Cells(1, 5), Cells(5, 5))) NbPlage = MaPlage.Areas.Count
AdrTest = MaPlage.Areas ( 2 ) .Address(True, True, xlA1)

Dans ce cas NbPlage renvoie 3 et AdrTest = "$C$1:$C$5"


Borders : Renvoie une collection des objets Border d'une cellule ou d'une plage.
On peut manipuler tous ces objets en même temps avec un appel à Borders ou en spécifier un avec sa propriété Item.
L'exemple ci-dessous crée un encadrement léger intérieur, avec un contour plus épais :
With Range(Cells(1, 1), Cells(5, 1 )).Borders
.LineStyle = xlContinuous
.Item(xlEdgeBottom).Weight = xlMedium
.Item(xlEdgeLeft).Weight = xlMedium
.Item(xlEdgeTop).Weight = xlMedium

.Item(xlEdgeRight).Weight = xlMedium

End With
Cells : Cette propriété renvoie un objet Range (une cellule) avec des coordonnées relatives à la première cellule de
l'objet Range. Il faut faire très attention à cette erreur relativement fréquente.
MaFeuille.Cells(3,3) représente la cellule "C3", par contre si mon objet range est B1:B3 alors MaRange.Cells(3,3) représente la
cellule "D3", c'est à dire celle qui est en position (3,3) par rapport à la
cellule "B1".
Characters : Renvoie un objet Characters sur le contenu d'une cellule ou sur les objets Shapes (Ne renvoie rien si la plage
contient plusieurs cellules).
Un objet Characters renvoie tout ou partie (comme un Mid) du contenu d'une cellule, à condition que cela soit du texte.
La syntaxe est MaCellule.Characters(Start,Length).
Ainsi le code suivant passe les caractères 2 et 3 de la chaîne contenue dans la cellule en police "Symbol" Cells(1 , 7)
.Ch aracters ( 2 , 2 ).Fo nt.Nam e = "Sym b o l"
Il est à noter que la modification de la police est la seule utilisation que j'ai rencontré de l'objet Characters dans une cellule.

Par Essobua BALOUKI 37


Collège de Paris – Cours du Visual Basic for Application

Columns / Rows : Renvoie la collection de toutes les colonnes / lignes contenues dans la plage. Cela peut permettre certains
raccourcis de programmation intéressant. Par exemple : M aP l a g e . C o l u m n s ( 2 ) . V a l u e = " "
Efface le contenu de toutes les cellules de la colonne 2 dans la plage.
CurrentArray : Cette propriété est un peu particulière. Si la plage fait partie d'une formule matricielle, CurrentArray renvoie une
plage contenant toutes les cellules de cette formule matricielle.
CurrentRegion : Renvoie la plage en cours dans laquelle est l'objet Range. On entend par plage en cours, l'ensemble des
cellules limitées par une combinaison de lignes et de colonnes vides.
Dependents / DirectDependents/ Precedents / DirectPrecedents
Renvoie un objet Range contenant les cellules dépendantes ou antécédentes. Une cellule antécédente est une cellule qui contient
dans sa formule de calcul la référence à la cellule cible. Une cellule dépendante est une cellule dont la référence est contenue
dans la formule de calcul de la cellule cible. L'objet Range renvoyé peut être une plage multiple. Cette propriété peut être
extrêmement intéressante pour déterminer quelle plage doit être recalculée. Nous verrons des utilisations dans la deuxième partie,
mais je vais vous donner un exemple.

regardons le code suivant :


Dim Recup As Range, raTest As Range
Set Recup = ActiveSheet.Cells(10, 7).Precedents For Each raTest In Recup.Areas
Debug.Print raTest.Address(True, True, xlR1C1) Next
Le résultat dans la fenêtre d'exécution sera
R9C6
R11C6
R8C5:R11C5
Si j'avais utilisé DirectPrecedents, seuls les deux premiers résultats aurait été renvoyés.
S'il n'y a pas de cellules correspondantes, la propriété déclenche une erreur récupérable.
End : Cette propriété renvoie un objet Range décalé dans le sens spécifié à l'intérieur de la région. Toujours dans mon exemple
précédent, ActiveSheet.Cells(2, 2).End(xlDown).Address(True, True, xlR1C1) renvoie R5C2 qui est la dernière cellule remplie
vers le bas de la colonne 2.
Si la cellule sélectionnée est vide, est que la colonne est vide, la cellule renvoyée est la dernière cellule de la feuille, c'est à dire :
ActiveSheet.Cells(2, 6).End(xlDown).Address(True, True, xlR1C1) renvoie R65536C6.
Il y a un piège avec cette propriété. Supposons que la colonne 12 contienne une valeur dans la ligne 1 et que toutes les autres
cellules soient vides, alors
ActiveSheet.Cells(1, 12).End(xlDown).Address(True, True, xlR1C1) renverra R65536C12
Font : Renvoie ou définit un objet Font pour la plage. Cet objet permet de modifier la police, ainsi que ses propriétés.
Attention toutefois, la police renvoyée lors de la lecture d'une plage affectera NULL aux propriétés qui ne sont pas les mêmes
sur toute la plage. Supposons que la cellule (2,2) soit en gras. Si je fais :
Dim MaPlage As Range, LaPolice as Font
S e t Ma P l a g e = Ra n g e ( Ce ll s ( 1 , 2 ) , C e l l s ( 3 , 2 ) ) S e t L a P o l i c e = M a P l a g e . F o n t Dans ce cas
LaPolice.Bold sera NULL puisque toutes les cellules ne sont pas en gras.
Interior : Renvoie ou définit un objet Interior pour la plage. Cet objet représente le motif et la couleur de l'intérieur de la cellule.
Comme pour l'objet Font, il renvoie NULL pour les propriétés qui ne sont pas toutes identiques dans la plage.
OffSet : Renvoie un objet range décalé par rapport à l'objet sur lequel on fait l'offset. Sa syntaxe est : MaPlage.OffSet( Offset de
ligne, OffSet de Colonne). Par Exemple :

Par Essobua BALOUKI 38


Collège de Paris – Cours du Visual Basic for Application

R a n g e ( C e l l s ( 1 , 1 ) , C e l l s ( 5 , 1 ) ) . O f f S e t ( 2 , 2 ) . A d r e s s ( T r u e , T r u e , x l R 1 C 1 ) r e n v o i e R3C3:R7C3
On peut omettre un des paramètres s'il n'y a pas de décalage, mais pour la lisibilité du code, il convient de mettre 0.
Resize : Renvoie un objet range redimensionné par rapport à la plage d'origine. La syntaxe est
MaPlage.Resize(NbLigne,NbColonne)
Comme on redimensionne la plage, c'est la cellule en haut à gauche de la plage d'origine qui sert de base. Pour ne pas
redimensionner dans une des dimensions, on omet le paramètre. Par exemple
Range (Cells (1,1) , Cells (5,1) ) .Resize(2,2) .Adress (True, True, xlR1C1) renvoie R1C1:R2C2
Range (Cells (1,1) , Cells (5,1) ) .Resize(,2) .Adress (True, True, xlR1C1) renvoie R1C1:R5C2
La combinaison d'Offset et de Resize permet de définir n'importe quelle plage.
Quelques méthodes
Nous allons maintenant regarder quelques-unes des méthodes les plus utiles de l'objet Range.
AutoFill : Syntaxe : MaPlage. AutoFill(Destination, Type)
Destination est un objet Range qui contient forcément MaPlage
Type peut être xlFillDefault, xlFillSeries, xlFillCopy, xlFillFormats, xlFillValues, etc...
La méthode exécute une recopie incrémentée dans les cellules de la plage destination.
AutoFit : Ajuste la largeur de colonne / hauteur de ligne en fonction du contenu. S'applique sur des colonnes ou des lignes mais
pas directement sur la plage.
Range (Cells (1 , 2 ) , Cells(3, 2) ) .AutoFit renvoie une erreur, il faut écrire
Range(Cells(1, 2), Cells(3, 2)).Columns.AutoFit
BorderAround : Syntaxe : MaPlage.BorderAround(LineStyle, Weight, ColorIndex, Color)
Permet de réaliser directement un contour extérieur d'une plage. Ainsi l'exemple que j'ai donné pour la
propriété Borders s'écrirait plus simplement :
With Range(Cells(1, 1), Cells(5, 1))
.Borders.LineStyle = xlContinuous
.BorderAround Weight:=xlMedium
End With
Calculate : Bien que cette méthode appartienne à l'objet application, on l'utilise lorsqu'on veut minimiser le temps de calcul sur
un objet range restreint. En général elle s'utilise en coordination avec un événement Change et une plage Dependents.
Nous pourrions imaginer la fonction suivante qui ne calculerait en permanence que les cellules nécessaires.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
On Error GoTo EnleveErreur
Target.Dependents.Calculate
Exit Sub EnleveErreur:
Err.Clear
End Sub
Ce code n'est qu'un exemple puisque c'est ce que fait Excel. Celui ci ne servirait que si on utilise des fonctions "volatiles",
ou si on veut restreindre la plage de calcul.
Clear / ClearContents / ClearFormats : Efface tout ou la partie spécifiée de la plage.
ColumnDifferences / RowDifferences
Syntaxe : MaPlage.ColumnDifferences(Comparison)
Renvoie un objet Range contenant toutes les cellules de la plage dont le contenu est diff érent de celui spécifié dans
l'argument Comparison. Quelques limitations toutefois, l'argument comparison doit être un objet Range contenant une seule
cellule ; elle doit faire partie de la plage. L'objet Range renvoyé peut être discontinu, alors que la plage d'appel doit être continue.
La comparaison ne se fait pas sur toute la feuille mais sur la plage UsedRange (voir plus loin)
Ces méthodes sont très puissantes dans un certains nombres de cas. Supposons que j'ai un tableau contenant des cellules vides
dans ma feuille, le code suivant va me renvoyer un objet Range contenant toutes les cellules

Par Essobua BALOUKI 39


Collège de Paris – Cours du Visual Basic for Application

non vides de la feuille.


Dim MaPlage As Range, raEnum As Range
Set MaPlage =
ActiveSheet.Columns.ColumnDifferences(ActiveSheet.Cells.SpecialCells(xlCellTypeLastCe
ll).Offset(1, 1))
For Each raEnum In MaPlage.Areas
Next
Copy : Cette méthode utilise ou non l'argument Destination. Lorsque l'argument est omis, la méthode copie la plage dans le
presse-papiers, sinon le collage à lieu dans le même temps. Sauf cas très particulier il faut toujours préciser l'argument
Destination. Cet argument doit être soit un objet Range de la même dimension que la plage source, soit une cellule unique
qui deviendra le coin supérieur gauche de la plage collée. Pour donner un
exemple, le code généré par l'enregistrement automatique serait :
Range("A1 :E5") .Select Selection.Copy Sheets("Feuil2").Select Range("C3").Select
ActiveSheet.Paste
Ce qui revient à écrire :
Range("A1:E5") .Copy Destination :=Worksheets("Feuil2") .Range("C3")
Dans certaines versions d'Excel, une erreur se produit si une des plages contient des cellules
fusionnées. é* En Excel97 il est impératif que la zone copiée soit située sur la feuille active.
Insert / Delete : Permet d'insérer ou de supprimer une plage de cellules. Utilise l'argument Shift pour définir le sens de
déplacement des cellules. Pour insérer une ligne ou une colonne entière utiliser EntireRow / EntireColumn (voir plus loin)
FillDown, FillLeft, FillRight,FillUp : Recopie la plage avec le contenu de la cellule source. La cellule source doit être à
l'extrémité inverse du sens de la recopie.
Ainsi Range(Cells(1,1),Cells(10,1)).FillDown recopie la cellule A1 dans la plage Range(Cells(1,1),Cells(10,1)).FillUp recopie la
cellule A10 dans la plage
Find & FindNext : La syntaxe de cette méthode est MaPlageFind(What, After, LookIn, LookAt, SearchOrder, SearchDirection,
MatchCase, MatchByte)
Je vais en profiter pour tordre le cou à un canard. La méthode Find ne déclenche pas une erreur lorsqu'elle ne trouve pas de
cellules correspondantes, comme je l'ai souvent lu dans des forums. Lors d'un enregistrement automatique on obtient :
Selection.Find(What:="27", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart,
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False).Activate
Ainsi qu'un message d'alerte qui signale qu'il n'y a pas de cellules correspondantes. Lorsqu'on prend ce bout de code et qu'on
cherche à le bricoler pour faire une recherche dans son programme, on constate qu'il se produit une erreur s'il n'y pas de cellule
contenant la recherche. Or ce qui est en cause n'est pas la méthode Find, mais l'appel de la méthode Activate. En effet, Find
renvoie un objet Range qui est la première cellule contenant le critère ou Nothing s'il n'y en a pas.
Et l'appel de Nothing. Activate fait planter l'exécution.
Ce qui en une méthode me permet de montrer qu'il faut se méfier de l'enregistrement automatique, de la méthode Activate et des
rigolos qui font des copier/coller de bout de code.
La méthode Find se programme comme dans l'exemple suivant.
Dim MaFeuille As Worksheet, Reponse As Range, PremAdresse As String Dim MonCritere As
String
Set MaFeuille = ActiveSheet MonCritere = "27"
Set Reponse = MaFeuille.Cells.Find(MonCritere, MaFeuille.Cells(1, 1), xlValue, xlWhole)
If Not Reponse Is Nothing Then
PremAdresse = Reponse.Address Do
Set Reponse = Selection.FindNext(After:=Reponse) Loop While Not Reponse Is Nothing And
Reponse.Address <> PremAdresse End If
PasteSpecial : Bien que l'on puisse souvent se passer de cette méthode, il y a des cas où elle est très utile.
Sa syntaxe est : MaPlage.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
Replace : Fonctionne sur le même schéma que Find, à la différence que cette méthode ne renvoie rien.
Sort : Tri la plage spécifiée. Sa syntaxe est :

Par Essobua BALOUKI 40


Collège de Paris – Cours du Visual Basic for Application

MaPlage.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation)
Type n'est utilisé que pour les objets PivotTable.
Les Arguments Key sont des variants, contenant la clé de tri, les arguments Order sont le sens du tri.
Header définit s'il y a une ligne / colonne d'entête, MatchCase si le tri est sensible à la casse, Orientation donne le sens du tri.
Par exemple
Range("I1:K5").Sort Key1:=Range("K1"), Order1:=xlAscending, Key2:=Range("J1")
, Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
SpecialCells
MaPlage.SpecialCells(Type, Value)
Renvoie un objet Range contenant les cellules correspondant aux critères donnés en argument. Les choix possibles sont :
XlCellTypeNotes : Les cellules contenant des annotations.
xlCellTypeConstants : Les cellules contenant des constantes.
xlCellTypeFormulas : Les cellules contenant des formules.
XlCellTypeBlanks : Les cellules vides.
XlCellTypeLastCell : La dernière cellule de la plage utilisée.
XlCellTypeVisible : Toutes les cellules visibles.
Les Types xlCellTypeConstants et xlCellTypeFormulas acceptent un argument Value qui peut être xlErrors, xlLogical,
xlNumbers, xlTextValues, xlAllFormatConditions. Celui ci permet d'affiner les critères de sélection. Nous verrons des
exemples dans la seconde partie de ce document.
L'exemple suivant renvoie un objet range contenant toutes les cellules vides de la plage :
Dim MaPlage As Range
Set MaPlage = Range(Cells(1, 1), Cells(10,10)) .SpecialCells(xlCellTypeBlanks)
TextToColumns : Permet de redistribuer sur plusieurs cellules une cellule contenant du texte avec des séparateurs, similaire à la
méthode OpenText de la collection WorkBooks.
Plages particulières
Ligne ou colonne entière
Il y a plusieurs méthodes pour sélectionner des lignes complètes. On peut utiliser la propriété EntireRow d'un objet Range. Par
exemple Range(Cells(1,1),Cells(2,1)).EntireRow renvoie les lignes 1 et 2. Sinon on peut utiliser la collection Rows de l'objet
Range. MaFeuille.Range(Rows(1), Rows(2)) renvoie les mêmes lignes.
UsedRange : Renvoie un objet Range qui représente l'ensemble de la plage utilisée dans la feuille. Attention toutefois,
l'effacement du contenu d'une cellule la laisse comme étant utilisée dans la feuille jusqu'à un nouvel appel de la méthode
UsedRange. Nous verrons ce point dans la deuxième partie de ce document.
Plage nommée
Toute plage d'une feuille peut avoir un nom (propriété Name). Le fait de nommer une plage permet de pouvoir faire référence
à celle-ci de façon simple, et de rendre la programmation indépendante de l'adresse réelle de la plage. Ces plages peuvent être
discontinues. Sauf déclaration particulière, une plage nommée appartient à l'objet Workbook. Il y a là un danger lors de la
duplication d'une feuille. Au moment de la duplication, toutes les plages nommées qui réfèrent à la feuille que l'on va dupliquer
deviennent des plages propres à cette feuille (c'est à dire dont le nom de la plage se transforme de "NomPlage" en
"NomFeuille!NomPlage", puis les noms sont dupliqués dans la nouvelle feuille. Notons que les noms spécifiques de feuilles
apparaissent dans la collection Names de l'objet classeur, mais que seuls les noms spécifiques apparaissent dans la collection
Names de l'objet feuille. Dans un classeur modèle, il est fortement conseillé d'utiliser au maximum les plages nommées.

Objets graphiques (Chart & ChartObject)


Les objets graphiques servent à tracer des courbes. Il existe des feuilles graphiques (Chart) qui appartiennent à l'objet
WorkBook, et des graphiques incorporés (ChartObject) qui appartiennent à l'objet WorkSheet. Bien que ces objets soient
similaires, ils présentent quelques différences d'emploi. Je ne vais pas étudier l'ensemble des propriétés et méthodes de mise en
forme de ces objets car elles sont assez faciles à utiliser. Par contre, nous allons regarder les objets constituants de l'objet Chart.

Par Essobua BALOUKI 41


Collège de Paris – Cours du Visual Basic for Application

Collection Charts & ChartObjects


Pour la collection Charts, la position relative des onglets donne le numéro d'index de l'objet, il n'est en général pas le même
que l'index dans la collection Sheets. Pour la collection ChartObjects, le numéro d'index correspond à l'ordre de création.
Les propriétés / méthodes sont les mêmes que pour la collection WorkSheets. Il y a juste une différence pour la méthode Add
de la collection ChartObjects puisqu'on peut donner la position et les dimensions de l'objet.
ChartObjects.Add(Left, Top, Width, Height)
Les coordonnées sont données en point.
Evènements
Gestion d'événement pour l'objet ChartObject
L'objet ChartObject étant contenu dans l'objet WorkSheet, il ne possède pas de module objet qui lui soit propre. Pour pouvoir
utiliser ces évènements il faut déclarer l'objet "WithEvents".
Par exemple, dans le module de la feuille :
Private WithEvents MonGraphe As Graph
Et ensuite
Private Sub MonGraphe_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long,
ByVal Arg2 As Long, Cancel As Boolean)
End Sub
Il faudra bien sûr faire l'affectation dans le code avec par exemple
Set MaFeuille.MonGraphe=MaFeuille.ChartObjects. Add(10,10,100,100)
Si on doit gérer les évènements de nombreux graphiques incorporés, il convient d'écrire une classe pour cette gestion.
BeforeDoubleClick / BeforeRightClick
Private Sub MonGraphe_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long,
ByVal Arg2 As Long, Cancel As Boolean)
ElementID renvoie l'élément du graphique sur lequel le double click a eu une action, le contenu de Arg1 et Arg2 dépendent de
cet élément.
Se produit après l'ajout ou la modification d'une série. MouseDown, MouseUp, MouseMove
Private Sub MonGraphe_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X
As Long, ByVal Y As Long)
Private Sub MonGraphe_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X
As Long, ByVal Y As Long)
Private Sub MonGraphe _MouseMove(ByVal X As Long, ByVal Y As Long)
Evènements de gestion de la souris (classique en Visual Basic). SeriesChange
Private Sub MonGraphe_SeriesChange(ByVal SeriesIndex As Long, ByVal PointIndex As Long)
Les arguments renvoient la série sélectionnée et le point sélectionné.
Cet événement se produit lorsque la valeur d'un point change.
Propriétés et méthodes
CopyPicture : MonGraphe. CopyPicture(Appearance, Format, Size)
Généralement utilisée en Visual Basic, cette méthode permet de copier l'image d'un graphique, ce qui permet de le rendre
indépendant de ses données. Attention, il n'est pas possible après de faire la procédure inverse.
MonGraphe .Export(FileName, FilterName, Interactive) Sert à exporter le graphique dans un fichier image.
GetChartElement : MonGraphe .GetChartElement(X, Y, ElementID, Arg1, Arg2)
Cette méthode s'utilise avec les évènements souris. En passant à cette méthode les arguments X et Y, il renvoie le type
d'élément et des informations complémentaires dans ElementID, arg1 et arg2
Location : Permet de changer un objet Chart en ChartObject ou inversement.
SetSourceData : Permet de définir une plage contenant les données à tracer. C'est une des méthodes permettant de tracer des

Par Essobua BALOUKI 42


Collège de Paris – Cours du Visual Basic for Application

séries. Nous y reviendrons en détail dans la deuxième partie.


DisplayBlanksAs : Cette propriété définit comment sont gérées les cellules vides de la plage de données.
HasAxis, HasLegend, HasTitle : Doivent être misent à "True" pour pouvoir utiliser les objets axes, légende....
Les objets constituants
La programmation des graphiques se fait surtout en manipulant les objets constituants de celui -ci. Ces objets sont
directement accessibles dans le cas d'un objet Chart, mais il faut passer par la propriété Chart pour y accéder depuis un
ChartObject (voir dans l'exemple pour "Legend " ci-dessous).
Axis
Collection des axes du graphique. Pour identifier un seul axe, utiliser la méthode Axes (Type, Group) de l'objet Chart. Les
valeurs pour Type sont xlCategory pour les abscisses et xlValue pour les ordonnées. Le modèle objet Axis est le suivant :

ChartAreas, PlotAreas : Définissent des zones du graphique. Utilisées uniquement pour la mise en forme.
Legend : Définit la légende du graphique. Le modèle objet est le suivant :

A chaque série du graphique correspond normalement un objet LegendEntry. Il est possible de supprimer
un de ces objets, mais pas d'en modifier le texte directement (pour cela il faut modifier la propriété Name de la
série). Par exemple pour supprimer la légende de la quatrième série d'un graphique incorporé :
Dim MonGraphe As ChartObject
Set MonGraphe = ActiveSheet.ChartObjects( 1 )
MonGraphe.Chart.Legend.LegendEntries(4).Delete

Comme je vous l'ai dit, vous voyez ici que je passe par la propriété Chart pour accéder à la légende.
Series, SeriesCollection : C'est donc l'objet principal de la programmation des graphes, aussi allons nous regarder un peu plus
en détail.
La collection SeriesCollection représente donc toutes les séries du graphique. On peut donc ajouter une série à l'aide de la
méthode Add.
MonGraphe.SeriesCollection.Add(Source, Rowcol, SeriesLabels, CategoryLabels, Replace)
L'argument Source contient l'objet Range contenant les données. On peut aussi ajouter une série vide à l'aide de la méthode
NewSerie. Enfin on peut ajouter des données à une série a l'aide de la méthode Extend. Je reviendrai dans la deuxième partie de
ce document sur la création dynamique de séries. On utilise directement l'objet Series pour sa mise en forme.
Point, Points : La collection points représente tous les points d'une série, l'objet point un seul de ces points. Sachez juste qu'on
ne peut pas ajouter un point à la collection Points.

Par Essobua BALOUKI 43


Collège de Paris – Cours du Visual Basic for Application

XI – UserForms (Formulaires)

Préambule
Il s'agit avant tout d'une introduction pour:
La création et la mise en forme de la boite de dialogue dans votre projet. Une présentation des méthodes et propriétés
accessibles par macro. Une description des évènements principaux. Quelques exemples particuliers d'utilisation.

Créer un UserForm
Pour insérer un UserForm dans votre projet:
Vous devez tout d'abord afficher l'éditeur de macros (Alt + F11), puis Cliquez sur votre fichier dans l'explorateur de projets.
Ensuite, Sélectionnez le Menu Insertion / UserForm

Dès que l'UserForm est créé, il est possible d'effectuer un affichage rapide en appuyant sur le bouton "Exécuter
Sub/UserForm", ou sur la touche raccourci F5.
Vous pouvez modifier la taille de la boite de dialogue en utilisant les poignées de redimensionnement.
Utilisez la fenêtre de propriétés pour personnaliser l'USF manuellement: Changer le nom, une fonctionnalité, l'apparence du
formulaire...etc.
Si cette fenêtre n'est pas affichée par défaut:
Sélectionnez le Menu Afficher/Fenêtre propriétés ou Sélectionnez votre UserForm et appuyez sur la touche raccourci F4.

Le tableau suivant décrit succinctement chaque propriété.


Propriété Description
(Name) Renvoie le nom de l'objet
BackColor Spécifie la couleur de fond
BorderColor Spécifie la couleur de bordure
BorderStyle Spécifie le style de bordure
Caption Spécifie le texte affiché dans la barre de titre
Cycle Spécifie l'action à effectuer lorsque l'utilisateur quitte le dernier contrôle
DrawBuffer Spécifie le nombre de pixels de la mémoire tampon vidéo utilisée pour le rafraichissement de
l'image
Enabled Spécifie si l'objet peut recevoir le focus et répondre aux événements générés par l'utilisateur
DrawBuffer Spécifie le nombre de pixels de la mémoire tampon vidéo utilisée pour le rafraichissement de
l'image
Forecolor Définit la couleur de la police
Height Définit la dimension verticale
HelpContextID Spécifie la rubrique d'un fichier d'aide

Par Essobua BALOUKI 44


Collège de Paris – Cours du Visual Basic for Application

KeepScrollBarsVisible Spécifie si les barres de défilement sont visibles


Left Définit la position par rapport au bord gauche de l'application
MouseIcon Affecte un icône personnalisé
MousePointer Spécifie le type de pointeur
Picture Spécifie l'image de fond dans l'UserForm
PictureAlignment Spécifie l'alignement de l'image de fond
PictureSizeMode Spécifie comment afficher une image de fond
PictureTiling Permet d'afficher l'image en mosaïque
RightToLeft Indique le sens d'affichage du texte et contrôle l'apparence visuelle sur un système bidirectionnel.
ScrollBars Indiquee si les barres de défilement verticales et horizontales doivent être affichées
ScrollHeight Spécifie la hauteur de la zone totale pouvant être affichée en déplaçant la barre de défilement
ScrollLeft Spécifie la distance, du bord gauche de la partie visible, à partir du bord gauche du UserForm
ScollTop Spécifie la distance, du bord supérieur de la partie visible, à partir du bord supérieur du UserForm
ScrollWidth Spécifie la largeur de la zone totale pouvant être affichée en déplaçant la barre de défilement
ShowModal Indique si la boîte de dialogue est modale
SpecialEffect Spécifie l'aspect du UserForm à l'écran
StartUpPosition Indique la position du UserForm lors de sa première apparition
Tag Permet de stocker des informations supplémentaires
Top Définit la position par rapport au bord supérieur de l'application
WhatsThisButton Indique si le bouton d'aide "Qu'est-ce que c'est" apparaît sur la barre de titre
WhatsThisHelp Indique si l'aide contextuelle utilise la fenêtre automatique fournie par l'aide de Windows ou la
Width fenêtre d'aide
Définit principale
la dimension horizontale
Zoom Spécifie le changement de taille de l'objet
Visible Spécifie si l'objet est masqué ou affiché.
Vous pouvez ensuite insérer des contrôles dans votre projet.

Affichage Modal
Pour afficher la boite de dialogue par macro, utilisez:
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

Lorsque l'UserForm est affiché, vous ne pouvez plus accéder aux feuilles de calcul. Dans ce cas l'UserForm est dit modal.
UserForm1 est le nom défini dans la propriété (Name).
Afficher un UserForm dont le nom est contenu dans une variable
UserForms est l'ensemble des objets UserForm placés dans le classeur.
la méthode Add permet de placer un nouvel élément UserForm dans la collection.
Sub lanc ementUS F()
Dim sVariable As String
sVariable = "UserForm1" VBA.UserForms.Add(sVariable).Show
End Sub

Masquer l'UserForm
Pour masquer un UserForm sans le décharger, utilisez:
Private Sub CommandButton1_Click()
UserForm1.Hide
End Sub

Lorsqu'un UserForm est masqué, l'utilisateur n'a plus aucune interaction avec celui ci mais La boite de dialogue et les objets
qu'elle contient restent accessibles par programmation.
Fermer l'UserForm

Par Essobua BALOUKI 45


Collège de Paris – Cours du Visual Basic for Application

'Ferme l'UserForm nommé UserForm1 Unload UserForm1

Lorsqu'un objet est déchargé, il est supprimé de la mémoire et toute la mémoire qui lui était associée est libérée.
Si la procédure de fermeture est placée dans l'UserForm, il est aussi possible d'écrire:

Pour fermer en une seule fois tous les UserForm en cours d'affichage, utilisez:
Private Sub CommandButton1_Click()
End End Sub

Définir la Position de l'UserForm à l'écran


La propriété StartUpPosition définit la position des USF lors de l'affichage.
Ce tableau décrit les constantes disponibles:

Valeur Paramètre Description

Manual 0 Aucune valeur initiale n'est


indiquée.
CenterOwner 1 Centre l'objet UserForm au sein
de l'élément auquel il appartient.

CenterScreen 2 Centre l'objet par rapport à


l'écran.
WindowsDefault 3 Place l'objet dans l'angle
supérieur gauche de l'écran.
Cet exemple affiche un USF en haut et dans le coin supérieur gauche de l'écran.
Private Sub UserForm_Initialize()
Me.StartUpPosition = 3 End Sub

Vous pouvez aussi utiliser les propriétés Left et Top pour personnaliser la position de la boite de dialogue. Left: Définit la
distance du bord gauche du UserForm par rapport au bord gauche de l'application. Top: Définit la distance du bord supérieur du
UserForm par rapport au bord supérieur de l'application.
Quelques exemples particuliers:
(L'application Excel est supposée préalablement affichée en mode "Aggrandi".)
Afficher un USF en haut et dans le coin droit de l'écran.
Private Sub userForm_Initialize() With Me
.startUpPosition = 3
.Left = Application.Width - Me.Width End With End Sub

Positionner l'USF en bas et à droite.

Private Sub UserForm ActivateO

With Me 'affiche l'USF en bas à droite


.Top = Application.Height - M .Height
e
.Left = Application.Width - M .Width
e
End With
End Sub

Afficher un USF en plein écran.


Private Sub UserForm_Activate() With Me
.StartUpPosition = 3 .Width = Application.Width .Height = Application.Height .Left = 0 .Top = 0 End With
End Sub

Imprimer un UserForm

Par Essobua BALOUKI 46


Collège de Paris – Cours du Visual Basic for Application
Remarque préalable:
Ce chapitre présente quelques solutions d'impression, mais un UserForm n'est pas bien adapté pour les éditions (consommation
d'encre importante, long temps d'impression, rendu sur le papier ne correspondant pas toujours à ce qui est vu à l'écran...)
Plus généralement, il faut toujours avoir une réflexion sur l'utilisation du papier pour ne pas le gaspiller.
Private Sub CommandButton1_Click()
Me.PrintForm End Sub

L'image du UserForm est automatiquement placée dans le coin supérieur gauche de la page imprimée.

Il n'existe pas d'option pour centrer ou repositionner l'impression. La seule solution palliative consiste à faire une copie d'écran
de la boite de dialogue. Ensuite vous faites un collage dans la feuille de calcul en tant qu'image, pour la manipuler à votre
guise.
Cet exemple imprime l'UserForm centré dans la page:

Par Essobua BALOUKI 47


Collège de Paris – Cours du Visual Basic for Application

Option Explicit

Private Declare Sub keybd_event Lib "user32" ( _


ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Sub CommandButton1_Click() Dim Ws As Worksheet

'Copie d'écran de la forme active keybd_event vbKeySnapshot, 1, 0&, 0& DoEvents

'Ajoute une feuille pour coller l'image de la forme Set Ws = Sheets.Add Ws.Paste

'impression centrée dans la page With Ws


.PageSetup.CenterHorizontally = True .PageSetup.CenterVertically = True .PrintOut End With End
Sub

Effectuer l'aperçu avant impression d'une feuille de calcul depuis un UserForm


Lorsque vous souhaitez effectuer un aperçu avant impression d'une feuille de calcul, depuis un UserForm, utilisez:
Private Sub CommandButton1_Click() Me.Hide
'Aperçu avant impression de la Feuil1 Feuil1.PrintPreview Me.Show
End Sub

Insérer une image de fond


La fonction LoadPicture permet de spécifier un objet Image dans la propriété Picture du UserForm.
Cette procédure charge une image de fond dans l'UserForm lors de l'évènement Click sur un CommandButton. L'image
sera automatiquement déchargée lors de la fermeture de la boîte de dialogue.
Private Sub CommandButton1_Click()
UserForm1.Picture = LoadPicture("C:\monFichier.jpg") End Sub

Remarque: Certains formats d'image ne sont pas reconnus: PNG, TIF...


Modifier durablement les propriétés d'un UserForm
Vous avez constaté dans les exemples précédents qu'il est possible de modifier les propriétés de la boite de dialogue par
macro. Lorsque vous refermez l'UserForm, les propriétés sont réinitialisées.
Il est aussi possible de changer de façon "définitive" et dynamique les propriétés, à condition que la boite de dialogue ne
soit pas en cours d'affichage.
L'exemple suivant montre comment modifier la couleur de fond.
'Change la couleur de fond du UserForm ThisWorkbook.VBProject.VBComponents("UserForm1"). _
Properties("backcolor") = RGB(125, 125, 125)

Les évènements dans un UserForm


Ce chapitre décrit les évènements principaux, sans se vouloir totalement exhaustif dans le domaine.
Vous pouvez accéder aux procédures évènementielles en double cliquant sur l'UserForm depuis l'éditeur de macros. Le
menu déroulant de droite vous donne ensuite accès à la liste des évènements disponibles.

UserForm Initialize
Cet évènement est important car il permet de définir les propriétés des objets et les valeurs par défaut des variables, lors du
lancement du Userform.
Exemple :

Private Sub UserForm Initialize()

maVariable = "x"
CheckBox1 = False
CheckBox2 = True
TextBox1 = "mon texte"
TextBox2 = Range("A1")
End Sub

Par Essobua BALOUKI 48


Collège de Paris – Cours du Visual Basic for Application

UserForm Activate
Cet évènement est déclenché lorsque l'UserForm est activé, dès que la boite de dialogue prend le focus.
UserForm_KeyPress
Cet évènement est déclenché lorsque vous appuyez sur une touche du clavier alors que l'UserForm a le focus.
L'argument KeyAscii renvoie un nombre représentant la touche du clavier dans le jeu de caractères alpha numérique.
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
MsgBox Chr(KeyAscii) End Sub

UserForm_KeyDown et UserForm_KeyUp
UserForm_KeyDown est déclenché lorsqu'une touche du clavier est enfoncée. UserForm_KeyUp est déclenché
lorsqu'une touche du clavier est relâchée.
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) La description
des arguments:
KeyCode: Renvoie un nombre représentant la touche du clavier dans le jeu de caractères alpha numérique.
Shift: Indique le type de touche manipulé lors de l'évènement.
0 = Touche alpha numérique
1 = Touche Shift
2 = Touche Ctrl
4 = Touche Alt
Vous pouvez aussi obtenir des associations de touches:
6 = Touches Ctrl & Alt
...etc...
UserForm Click

L'évènement Click est déclenché lorsque vous cliquez sur l'UserForm.


UserForm Terminate
Terminate est le dernier évènement, déclenché lors de la fermeture d'un UserForm. A ce stade, l'annulation de la
fermeture est impossible contrairement à l'évènement QueryClose.

Afficher un UserForm temporairement


Cette procédure referme la boite de dialogue 5 secondes après son activation.
Private Sub UserForm_Activate()
Application.Wait Now + TimeValue("00 : 00 : 05") '5 secondes
Unload UserForm1 End Sub

XI – Contrôles de la boite d’outils


ASCENSEUR
Ce contrôle qui sert généralement à se déplacer au sein d'une feuille de calcul sert également à augmenter ou diminuer
la valeur d'une variable. Dans ce cas, ce contrôle s'apparente fortement à la toupie

BOUTON DE COMMANDE
L'un des contrôles les plus utilisés. Quand on clique sur un bouton de commande, il peut se passer n'importe quoi : On
peut valider une boîte de dialogue, afficher une autre boîte, ou n'importe quoi d'autre. Les barres d'outils intégrées
d'Excel sont en fait des boutons sur lesquels vous cliquez, par exemple pour imprimer ou pour créer un graphique
automatique. A ne pas confondre avec le Bouton bascule

BOUTON BASCULE

Par Essobua BALOUKI 49


Collège de Paris – Cours du Visual Basic for Application

A ne pas confondre avec le simple bouton . Ce bouton sert simplement à dire OUI ou NON. Quand il est appuyé
(apparence appuyée), ça veut dire OUI, ou ACTIF, ou envore VRAI. Sinon, c'est qu'il est faux. Il y a également des
exemples de boutons bascules dans les barres d'outils intégrées d'Excel : Quand vous mettez le texte en gras ou en
italique par exemple.

BOUTON RADIO

Ce bouton ressemble énormément au bouton bascule et à la case à cocher . C'est à dire que ce sont des
contrôles qui sont soit vrais, soit faux (activés - pas activés. Cochés - pas cochés). Les boutons radios se placent
généralement au sein d'un groupe d'options . Quand on clique sur un bouton radio, ça enlève les autres options
bouton radio. Vous en avez un bon exemple dans la boîte de dialogue Excel Outils/Options/ onglet calcul, mode de
calcul : vous ne pouvez sélectionner qu'une seule des 3 options. Et par contre quand vous sélectionnez l'option "Sur
ordre", vous avez la possibilité de cliquer, en plus sur la case à cocher "recalcul avant l'enregistrement"

CASE à COCHER

Elle se comporte donc plus ou moins comme un bouton radio , sauf que cette fois, on peut cocher plusieurs options
en même temps. Un bon exemple se trouve dans la boîte de dialogue Outils/Options/Onglet Modification, ou vous avez
toute une série de cases à cocher que vous pouvez toutes cocher ou pas indépendamment les unes des autres

SELECTEUR DE REFERENCES

Cette zone ressemble quelque peu à la zone d'édition , mais le sélecteur de référence est vraiment typique à
Excel (en effet tous les autres contrôles se retrouvent dans Visual Basic simple, pour Access, pour Word etc...). Par
contre, le sélecteur de référence permet quand on clique dedans, de sélectionner une zone dans Excel. Un excellent
exemple se trouve dans Outils/Valeur-cible, ou les zones "Cellule a définir" et "Cellule a modifier" sont des zones que
si vous cliquez dedans, vous pouvez directement sélectionner par simple clic une cellule ou une plage de cellule dans
votre feuille Excel. La ou les cellules seront recopiées dans cette zone.

ETIQUETTE
Ce conrôle sert simplement à afficher du texte dans une boîte de dialogue. On en rencontre partout. Dans l'exemple
Outils/Valeur-cible, le texte "Cellule a définir" est une étiquette. Attention, confond parfois l'étiquette avec la zone
d'édition .

GROUPE D'OPTIONS
Le groupe d'option sert généralement à déterminer une liste de choix, souvent effectuée par des boutons radio. Par
exemple, dans la boîte de dialogue Fichier/Mise en page, Onglet Page, vous avez 2 goupes d'options : "Orientation" et
"échelle", qui contiennent plusieurs genres de contrôles, mais, ce qui est le plus intéressant, ce sont les boutons radio
. Vous ne pouvez en sélectionner qu'un des 2 dans la section "Orientation" ET AUSSI un seul des 2 dans la secion
"Echelle". De l'intérêt du groupe d'option. S'il n'y avait eu qu'un groupe d'option, ou pas de groupoe d'option du tout,
mais malgré tout des boutons radios , alors, vous n'auriez pu en sélectionner qu'un des quatre.

IMAGE
Afin d'agrémenter vos boîtes de dialogues, vous pouvez installer une image, comme dans la boîte de dialogue
Données/Rapport de tableau croisé dynamique, le dessin à gauche est une zone d'image.

LISTE DE CHOIX

La liste permet de choisir un élément parmi plusieurs. Quand la liste contient beaucoup d'éléments, on opte plutôt
pour la liste déroulante , plus pratique.

LISTE DEROULANTE

La liste déroulante se comporte comme une liste de choix , à la différence que les choix ne sont pas immédiatement
visible. Il faut soit taper les premières lettres de ce qu'on recherche dans cette liste, ou alors cliquer sur la petite flèche
pour la faire dérouler. Il y a un nombre incalculable de listes déroulantes partout.

ONGLETS ONGLETS AUSSI

Par Essobua BALOUKI 50


Collège de Paris – Cours du Visual Basic for Application
Les onglets servent à organiser une boîte de dialogue qui aurait vraiment trop de choix. Un excellent exemple se trouve
avec Outils/Options. Là, vous avez carrément 2 rangées d'onglets .

SELECTEUR

Attention : ceci n'est pas un contrôle. C'est simplement ici que vous cliquez quelquefois pour ensuite pouvoir
sélectionner, déplacer ou redimensionner les contrôles existants.

TOUPIE

La toupie permet d'augmenter ou de diminuer une valeur. Vous avez 2 exemples de toupie dans
Outils/Options/Général : à droite de "Liste des derniers fichiers utilisés" et "Nombre de feuilles de calcul par nouveau
classeur"

ZONE D'EDITION
C'est simplement une zone ou vous écrivez n'importe quoi. Vous ne pouvez pas choisir dans une liste. Vous saisissez du
texte, c'est tout. Attention à utiliser judicieusement plutôt le sélecteur de référence quand la zone doit contenir une
cellule ou une plage de cellules !

Par Essobua BALOUKI 51


Collège de Paris – Cours du Visual Basic for Application

Conclusion
Ce cours ne présente qu'une partie infime des possibilités offertes par l'environnement VBA.

Pour améliorer vos connaissances dans la programmation, le meilleur des apprentissages consiste à mettre en
application des exemples concrets: Développez vos projets personnels pour découvrir de nouvelles fonctionnalités.
N'hésitez pas à tester de nouveaux codes. Vous vous apercevrez vite que le VBA est un outil très puissant et qu'il existe
pratiquement toujours une solution à votre besoin.

Les sources d'aide


Désormais vous savez comment créer une macro, mais une nouvelle question se pose:
Ou trouver de l'aide et des solutions à mes problèmes dans ce vaste domaine qu'est le langage VBA?
Il y a tout d'abord l'aide fournie dans l'application Microsoft Excel.
Quand vous ne connaissez pas la signification d'un terme, écrivez le dans la fenêtre Code, puis positionnez le curseur sur ce
mot. Ensuite, appuyez sur la touche F1 du clavier.
Si le terme recherché est un mot clé Excel, l'aide associée apparaitra à l'écran.
L'aide n'est pas toujours évidente à appréhender, mais vous allez vous rendre compte rapidement que les
informations contenues sont très détaillées, et souvent complétées par des exemples.
Une fois affichée, vous pouvez aussi utiliser la fenêtre d'aide pour effectuer d'autres recherches par:
* Sommaire
* Aide intuitive
* Index
Si l'Aide n'est pas disponible sur votre poste, récupérez-la depuis le CD-ROM d'installation de votre produit Microsoft
Excel.
Il existe aussi beaucoup d'informations sur le web, mises à disposition par des contributeurs et contributrices
bénévoles.
Des requêtes, à partir des moteurs de recherche, vous feront découvrir de nombreux cours, démo, trucs et astuces, FAQ,
tutoriels et classeurs prêts à l'emploi.
Des sources d'aide très complètes sont notamment disponibles sur le site Developpez.com:
* La FAQ Excel
* La FAQ VBA
* Les tutoriels
* Le Forum Excel
* Le forum VBA
D'autres liens sur le web:
* La base de connaissance Microsoft

Par Essobua BALOUKI 52

Vous aimerez peut-être aussi