Introduction à VBA pour Excel
Introduction à VBA pour Excel
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.
* 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.
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.
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.
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.
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".
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.
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.
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.
Sub TestMacro()
MultiplicationCellule Range("A1")
End Sub
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.
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.
Vous pouvez ensuite appeler cette fonction depuis une procédure Sub.
Sub AppelFonction()
MsgBox MaFonctionPerso(10)
MsgBox MaFonctionPerso(10, 5)
End Sub
Formules
=MaFonctionPerso(10)
=MaFonctionPerso(10 ; 5 )
=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:
Dans ce cas la fonction MaFonctionPerso n'est accessible que pour les procédures du module dans lequel elle est
déclarée.
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.
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:
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"
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.
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".
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()
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()
Remarque:
La saisie de Coeff. dans l'éditeur de macros, permet d'afficher rapidement la liste des coefficients disponibles.
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
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
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 :
Aperçu :
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
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 :
Aperçus :
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 :
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.
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
un autre exemple
Dim x As Integer
x = InStr(1, "Developpez", "e") + 1
MsgBox InStr(x, "Developpez", "e") 'renvoie 4
La recherche n'est pas sensible à la casse si le dernier argument "compare" est égal à 1
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
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), "!")
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"
Astuces
* Ctrl+Espace: Affiche une liste pour compléter le mot clé que vous êtes en train d'écrire.
* 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.
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.
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.
ou bien
MyString = "Plusieurs"
If Digits = 1 Then MyString = "Un"
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
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.
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
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
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
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
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].
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
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
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
Do Until condition
Actions
Loop
Do
Actions
Loop Until condition
[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:
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"
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
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."
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".
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.
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".
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.
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.
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
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.
.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.
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.
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
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.
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.
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.
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
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
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
Imprimer un UserForm
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:
Option Explicit
'Ajoute une feuille pour coller l'image de la forme Set Ws = Sheets.Add Ws.Paste
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 :
maVariable = "x"
CheckBox1 = False
CheckBox2 = True
TextBox1 = "mon texte"
TextBox2 = Range("A1")
End Sub
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
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
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.
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 !
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.