Programmation VBA
Programmation VBA
Chapitre 1
Introduction
1.7.2 Exporter
Exporter un module va permettre d’enregistrer dans un fichier un groupe de
fonctions et de macros que l’on a testé et qui peuvent nous être utiles dans d’autres
projets. Lorsque vous êtes dans l’éditeur VBA, faites un clic droit sur le module
que vous voulez exporter, → Exporter un fichier . . . , donnez un nom au fichier qui
contiendra votre module. Un certain nombre des modules que j’ai créé pour mes
besoins personnels sont disponibles sur http ://[Link] sous licence GPL (cf.
annexe A).
1.7.3 Supprimer
Toutes les macros que vous ferez avec l’enregistreur de macro afin de voir com-
ment programmer certaines actions seront placées dans des modules (module1,
module2, . . .). Lorsque celle-ci ne seront plus utiles, pensez à les supprimer du clas-
seur, il s’allègera d’autant. Lorsque vous êtes dans l’éditeur VBA, faites un clic droit
sur le module que vous voulez supprimer, → Supprimer nom_du_module , ré-
pondre à la question. Attention, il faut la lire avant de cliquer, elle ne correspond
pas à ce que vous supposez !
Sub NumeroteLignes ( )
Dim N As Long
For N = 1 To 20
C e l l s (N, 1) = " Ligne " & N
Next N
End Sub
Vous venez de créer votre premier programme. si vous l’exécutez, vous verrez
qu’il se contente d’afficher dans chaque cellule le numéro de ligne correspondant.
Nous verrons au cours des explications qui suivent, à quoi correspondent chacun
des termes utilisés.
4 1.9 Recommandations
1.9 Recommandations
1.9.1 Découpez
Avant de commencer un programme, prenez un papier, un crayon et listez toutes
les étapes de ce que vous voulez réalisez. Détaillez au maximum afin que chaque
tâche soit aussi simple que possible. Réalisez une à une les macros correspondant à
ces tâches. Après chaque réalisation de macro, testez la et corrigez la. Vous verrez, il
n’est pas rare que cela ne fonctionne pas du premier coup comme on l’espérait.
1.9.2 Enregistrez
Lorsque vous travaillez sur un programme, à chaque fois que vous avez écrit une
portion qui fonctionne correctement, enregistrez votre travail sous un autre nom.
Terminez le nom du fichier par un numéro que vous incrémentez par exemple. En
procédant de la sorte, vous pourrez toujours revenir à une étape antérieure et serez
assuré que le fonctionnement de votre programme n’est pas dépendant du nom du
fichier qui le contient. C’est toujours très désagréable d’avoir un joli fichier qui ne
fonctionne plus car un de vos collègue n’a rien trouvé de mieux que de le renommer,
toujours pour une excellente raison !
1.9.3 Commentez
Commentez, commentez, commentez . . .. N’hésitez pas à mettre des commen-
taires qui vous permettront de retrouver à quoi sert telle ou telle portion du pro-
gramme quelques temps plus tard. Pensez aussi aux personnes qui vous remplace-
ront un jour et qui auront besoin de découvrir comment cela fonctionne.
1.9.4 Indentez
Afin de permettre une meilleure lisibilité, il est préférable d’indenter le texte.
Cela consiste à décaler à l’aide d’une tabulation les portions de codes représen-
tant un sous-ensemble. Si on reprend notre premier programme, on se rend compte
qu’avec une indentation correcte, on voit plus facilement que la ligne « Cells(N, 1) =
"Ligne " & N » est répétée par la boucle For. Les deux exemples ci-dessous font la
même chose mais l’un est plus facile à lire que l’autre.
Tout au long de ce document, les exemples de code seront indentés à ma façon.
Inspirez-vous en.
Sub NumeroteLignes ( )
Dim N As Long
For N = 1 To 20
C e l l s (N, 1) = " Ligne " & N
Next N
End Sub
1.9 Recommandations 5
Sub NumeroteLignes ( )
Dim N As Long
For N = 1 To 20
C e l l s (N, 1) = " Ligne " & N
Next N
End Sub
1.9.5 Déclarez
Déclarez de façon explicite toutes vos variables. Cela clarifie le code du pro-
gramme. En tête de chaque module , spécifiez Option Explicit afin d’obtenir
un message d’erreur si vous tentez d’utiliser une variable non déclarée. Pour éviter
de l’oublier, on peut configurer Excel pour que ce soit le fonctionnement par défaut.
Dans l’éditeur VBA, Outils , Options , Editeur . Dans les paramètres du code,
cochez Déclaration des variables obligatoire .
1.9.6 Structurez
Structurez votre programme. Définissez toujours une fonction ou une macro
avant de l’utiliser, ainsi, lorsque vous la recherchez, vous savez qu’elle se trouve
avant son utilisation. Cela vous évitera de chercher en aveugle où peut bien être
cette ... de fonction ou macro lorsqu’il s’agira de la corriger ou de l’améliorer. Que ce
soit dans un programme, un module, une fonction ou une macro, gardez toujours
l’ordre déclaration (des variables, des fonctions, des macros) puis utilisation, quant
bien même la déclaration dans le cours du programme fonctionne. Tout au long de
ce document, les exemples de code respectent cette façon de faire. Inspirez-vous en.
6 1.9 Recommandations
Option Explicit
Sub NumeroteLignes()
For N = 1 To 20
Utilisation
Cells(N, 1) = "Ligne " \& N
Next N
End Sub
Chapitre 2
Notions de base
2.1.1 Nom
Afin de pouvoir les identifier et réutiliser, chaque constante ou variable aura un
nom. Celui-ci est constitué de lettres et chiffres mais ne contient pas d’espace. Pour
éviter tout problème, n’utilisez pas de caractères exotiques, utilisez A..Z, a..z, 0..9 et
_. Personnellement, je nomme tout en anglais, ce qui élimine le risque d’avoir mis un
accent par inadvertance. Dans ce document, j’ai essayé de mettre des noms en fran-
çais afin de les différencier plus facilement des mots utilisés par le langage. Les noms
sont libres, sous réserve de ne pas utiliser un mot réservé du langage. Vous pouvez
mélanger majuscules et minuscules de façon à faciliter leur lisibilité. Par exemple,
CompteurLigne est plus lisible que compteurligne, même si d’un point de vue pure-
ment programmation cela ne change rien.
2.1.2 Constantes
Une constante est quelque chose qui est fixe et qui ne changera pas tout au long
du programme. On va les utiliser pour des choses qui ne doivent pas évoluer au
cours du programme mais que l’on souhaite pouvoir adapter facilement. Lors de
leur définition, elles sont précédées du mot clé Const.
Exemple:
On va créer une feuille « ma super feuille » dans un classeur puis y faire appel
plusieurs fois dans le programme. Si l’on écrit le nom de la feuille à chaque fois que
l’on l’utilise dans le programme et que notre chef de service décide que son inti-
tulé n’est pas bon, il va falloir tout relire et remplacer à chaque fois l’ancien nom
par le nouveau nom. Si on a pris la précaution de définir le nom de la feuille dans
une constante et d’utiliser cette constante tout au long du programme, il suffit de
changer la valeur de la constante pour que tout le programme soit à jour.
Syntaxe:
Const TitrePage = "ma super f e u i l l e "
Le fait d’écrire Const suivi de son nom et de son contenu s’appel déclarer une
constante.
8 2.2 Commentaires
2.1.3 Variables
Une variable est quelque chose qui va évoluer et changer de valeur tout au long
du programme. On utilisera des variables pour ce qui change tel qu’un numéro de
ligne ou colonne, le contenu d’une cellule que l’on veut modifier, . . . Lors de leur dé-
finition, elles sont précédées du mot clé Dim, Private ou Public (c.f. Visibilité
page 11).
Exemple:
On veut remplir des cellules qui se suivent avec un texte donné. Au lieu d’écrire
autant de ligne que nécessaire, on va utiliser une variable pour effectuer une boucle
qui se répétera le nombre de fois désiré.
Sub MaSuperMacro ( )
Dim I As Integer
For I = 1 to 100
c e l l s ( 1 , I +3)= "mon super t e x t e "
Next I
End Sub
Le fait d’écrire Dim suivi d’un identifiant (nom) et d’un type s’appel déclarer une
variable.
2.2 Commentaires
Très rapidement, le nombre de ligne de notre programme croît. Si l’on veut être
capable de le relire et de comprendre ce qu’il fait deux ans plus tard, pour le modifier
par exemple, il va être judicieux d’y mettre des commentaires. Il s’agit de texte libre
où l’on peut mettre ce que l’on veut. Il est précédé d’une apostrophe.
Exemple:
On veut se souvenir du format à donner pour une date.
Syntaxe:
Dim DateDeDebut as String ’ d o i t ê t r e sous la forme aaaammjj
2.3 Regroupement
2.3.1 Noms de macros, fonctions, modules
Les noms de macros, de fonctions ou de modules suivent les même régles que
les constantes et variables (cf. 2.1.1 page 7).
2.3.2 Macros
Chaque macro réalise une suite d’opération. En exécutant une macro, ou en l’ap-
pelant dans un programme plus vaste, on va lui faire effectuer chacune des instruc-
tions qu’elle contient.
2.3 Regroupement 9
Exemple:
On veut ajuster les largeurs et hauteurs de toutes les cellules de la feuille.
Sub TstSub ( )
’ Nomme la f e u i l l e
ActiveSheet .Name = " Test "
PosY = PosY + 1
C e l l s ( PosY , 1) = "Sub"
PosY = PosY + 1
C e l l s ( PosY , 1) = " C a l l Ajuste ( " " Test " " ) "
Call AutoAdjust ( " Test " ) "
PosY = PosY + 1
End Sub
2.3.3 Fonctions
Une fonction réalise une suite d’opération et retourne une valeur.
Exemple:
On veut, à partir du nom complet d’un fichier (chemin + nom de fichier), récupé-
rer le seul nom du fichier. On va donc écrire une macro qui fait cela. Elle commence
par Function suivi d’un nom et, de façon facultative, de paramètres et se termine
par End Function.
Sub TstFonction
Dim monFichier as String
End Sub
2.3.4 Modules
Rapidement, on va se construire une bibliothèque de macros et de fonctions.
Il devient donc intéressant de les regrouper en fonction de leurs points commun
(macros et fonctions qui agissent sur les feuilles de classeur, macros et fonctions qui
travaillent sur les chaînes de caractères, . . .). On va donc les rassembler au sein d’un
module.
Exemple:
On peut créer le module FileFct qui contiendra toutes les fonctions que l’on va
créer et qui auront un lien avec les fichiers.
End Function
2.4 Visibilité
Suivant la façon d’on nous avons déclaré une variable, une macro ou une fonc-
tion, elle sera pas utilisable partout. On parle aussi de portée des déclarations.
2.4.2 Déclarations
Les déclarations de variables peuvent être implicites ou explicites.
Une déclaration implicite est réalisée lorsque l’on utilise une variable que l’on
n’a pas déclarée précédement dans le programme. Excel défini alors lui-même le
type de la variable le plus approprié. Cela semble facile mais se révéle très dange-
reux plus le programme devient important. Une faute de frappe et l’on a créé une
nouvelle variable au lieu de réutiliser celle que l’on voulait.
12 2.4 Visibilité
End Sub
Une déclaration explicite est réalisée lorsque l’on va, avant utilisation, définir le
type d’une variable.
For I = 1 to 100
c e l l s ( 1 , I +3)= "mon super t e x t e "
Next I
End Sub
2.4.3 Portée
En utilisant les mots clés Dim, Private, Static et Public, on va indiquer
qui pourra voir, utiliser la variable définie.
Une variable déclarée Dim, Private ou Static est une variable locale. Elle
ne sera utilisable et connue que de la partie de programme (module, macro, fonc-
tion) qui la défine. Private n’est pas utilisable dans une macro (sub) ou une fonc-
tion (function). Private ne peut être utilisé qu’en entête de module.
Une variable déclarée Dim ou Private est réinitialisée à chaque lecture de sa
déclaration. Une variable déclarée Static est initialisée seulement lors de la pre-
mière lecture de sa déclaration. Par la suite, sa valeur ne fait qu’évoluer.
Une variable déclarée Public est une variable globale. Elle pourra être utilisée
par n’importe qu’elle partie du programme. Afin d’éviter les risque de confusion, on
déclarera de préférence les variables globales dans l’en-tête du module considéré.
Mise en évidence
Code
’ Option E x p l i c i t
Sub Process ( )
C e l l s . Select
Selec tion . Clear
Range ( "A1" ) . Select
Call ProcessModule1
Call ProcessModule2
End Sub
14 2.4 Visibilité
Listing 2.8 – Portée - module1
’ Code de Module1 :
’ ***************
’ Option E x p l i c i t
Decalage = 10 * ( Boucle − 1)
End Sub
Sub ProcessModule1 ( )
Dim I As Integer
2.4 Visibilité 15
For I = 1 To 5
RepeteModule1 ( I )
Next I
End Sub
’ Option E x p l i c i t
Decalage = 10 * ( Boucle − 1)
End Sub
Sub ProcessModule2 ( )
Dim I As Integer
For I = 1 To 5
RepeteModule2 ( I )
Next I
End Sub
2.4 Visibilité 17
Résultats
Conclusion
Chapitre 3
Types
3.1 Booléen
Il s’agit des valeurs vrai et faux. On les utilise beaucoup dans les tests. Lors de leur
définition, ils sont déclarés par Boolean. Ils peuvent prendre les valeurs False (0)
et True (toute valeur différente de 0)
R e s u lt a t = I < J
I f R e s u lt a t
c e l l s (1 ,1)= " I est inférieur à J "
Else
c e l l s ( 1 , 1 ) = " I e s t supérieur ou égal à J "
End I f
End Sub
3.2 Nombres
End Sub
3.4 Variant
Ce type de variable peut avoir un contenu de n’importe quel type (booléen, en-
tier, réel, chaîne, . . .). Il est à éviter autant que faire se peut car il consomme beau-
coup de mémoire et ne permet pas de savoir le type de son contenu.
End Sub
I d e n t i f i a n t As String
MotDePasse As String
End Type
Dim C l i e n t As T U t i l i s a t e u r
Dim Vendeur As T U t i l i s a t e u r
C l i e n t .Nom = "Doe"
C l i e n t . Prenom = "John"
C l i e n t . I d e n t i f i a n t = " jdoe "
C l i e n t . MotDePasse = "inconnu"
End Sub
3.6 Conversions
Pour effectuer des conversions entre types, on utilise :
3.7 Tests
Afin de vérifier les plages et fonctionnement de chaque types, j’ai réalisé le clas-
seur « Test_Variable.xls ».
24 3.7 Tests
25
Chapitre 4
Structures de contrôles
4.1 Boucles
4.1.1 Do . . . Loop Until
On utilisera une boucle Do . . .Loop Until lorsque l’on veut que la boucle soit
parcourue jusqu’à ce que la condition soit remplie.
Dans l’exemple ci-dessous, on exécute ce qui est entre Do et Loop Until jus-
qu’à ce que I devienne supérieur à 10.
I = 1
Do
C e l l s ( I + 1 , 1) = I
I = I + 1
Loop Until I > 10
End Sub
I = 1
Do
C e l l s ( I + 1 , 2) = I
I = I + 1
Loop Until I > 0
End Sub
affichera 1. En effet, le test de condition n’est fait qu’en fin de boucle, elle est donc
au moins parcourue une fois.
26 4.1 Boucles
I = 1
Do
C e l l s ( I + 1 , 4) = I
I = I + 1
Loop While I <= 10
End Sub
I = 1
Do
C e l l s ( I + 1 , 4) = I
I = I + 1
Loop While I < 0
End Sub
affichera 1. En effet, le test de condition n’est fait qu’en fin de boucle, elle est donc
au moins parcourue une fois, même si la condition n’est pas remplie au départ.
I = 1
While I <= 10
c e l l s ( I + 1 , 4) = I
I = I + 1
Wend
End Sub
affichera les valeurs 1 à 10. La boucle ne sera parcourue que si la condition est rem-
plie au départ. A opposer à la boucle Do . . .Loop While.
4.1 Boucles 27
For I = 1 to 10
c e l l s ( 1 , I )= I
Next I
End Sub
For I = 0 to 10 step 2
c e l l s ( 1 , I /2)= I
Next I
End Sub
For I = 10 to 1 step −1
c e l l s (1 ,11 − I )= I
Next I
End Sub
End Sub
La boucle est parcourue pour chacuns des éléments du tableau et affiche Lille, Rou-
baix, Paris, Lyon, Marseille.
4.1.6 Test
Les différents tests ont été réalisés dans le classeur « Test_Boucle.xls ».
4.2 Conditions
4.2.1 If . . .Then . . . Else . . . End If
Pour un test simple, on utilisera If . . .Then . . .End If.
Listing 4.10 – If . . .Then . . . End If
Sub TstIfThenEndIf
Dim I As Integer
For I = 1 To 10
C e l l s ( I + 1 , 1) = I
I f I = 5 Then
C e l l s ( I + 1 , 2) = " I = 5"
End I f
Next I
End Sub
End Sub
For I = 1 To 10
C e l l s ( I + 13 , 1) = I
Select Case I
Case 1
Cells ( I + 13 , 2) = " I à l a valeur 1"
Case 2
Cells ( I + 13 , 2) = " I à l a valeur 2"
Case 8 To 10
Cells ( I + 13 , 2) = " I e s t compris entre 8 et 10"
Case Else
Cells ( I + 13 , 2) = " I e s t supérieur à 2"
End Select
Next I
End Sub
4.2.3 Test
Les différents tests ont été réalisés dans le classeur « Test_Condition.xls ».