2019
INITIATION VISUAL BASIC sous
EXCEL
François BANCQUART
ABF
01/02/2019
SOMMAIRE
INTRODUCTION _____________________________________________________________ 2
I. Types de variables _________________________________________________________ 5
I.A. Les tableaux de données _____________________________________________________ 10
I.B. Opérations sur les variables numériques ________________________________________ 10
I.C. Opérations sur les variables alphanumériques (chaînes de caractères) ________________ 10
I.D. Parcourir un ensemble de données dans un tableau _______________________________ 11
II. Les procédures __________________________________________________________ 12
II.A. boucle While...Wend _______________________________________________________ 13
II.B. Boucles imbriquées _________________________________________________________ 14
III. Informations sur les classeurs (Workbook) et les feuilles (Sheets) _________________ 14
IV. Dialogue avec l’utilisateur ________________________________________________ 15
IV.A. Donner une information à l’utilisateur :________________________________________ 15
IV.B. Demander une information à l’utilisateur : _____________________________________ 15
V. Instructions conditionnelles ________________________________________________ 16
V.A. Coloriage de cellules ________________________________________________________ 17
ABF | INTRODUCTION 1
INTRODUCTION
Toutes les applications Microsoft (Word, Excel, Powerpoint, etc.) comportent deux
fonctionnalités :
✓ Une interface utilisateur permettant de créer, de modifier des documents (textes,
feuille de calcul, présentation)
✓ Un langage de programmation (Visual Basic pour Application, VBA) permettant
d’écrire des programmes (routines) pour effectuer des opérations non prévues par
le logiciel, et correspondant à des besoins particuliers de l’utilisateur. Ce langage a
une structure et une syntaxe commune à toutes les applications, mais certaines
instructions sont spécifiques à chaque application.
Avec Excel 97, la programmation en VB se fait à partir du menu « Outils », sous menu
« Macros », sous menu « Visual Basic editor »
Avec Excel 2007 : menu « Développeur », puis « Visual basic »
Une fenêtre apparaît, dans laquelle on peut écrire des « macros » ou des « sous routines »
(SUB ROUTINES) qui pourront être ensuite exécutées.
Principe : une « macro » comporte une suite d’instructions qui vont s’exécuter les unes après
les autres
La première ligne indique le nom de la macro et (éventuellement) les variables qu’elle doit
traiter
La dernière ligne est toujours : END SUB
Exemple :
Sub Essai()
Suite d’instructions
‘Commentaires éventuels
End Sub
ABF | INTRODUCTION 2
Lorsque vous taper une apostrophe ‘ le texte qui suit n’est pas considéré comme une
instruction exécutable, mais comme un commentaire. Cela permet de préciser certaines
informations utiles au programmeur
Lorsque vous quittez le module de programmation, cette macro sera incluse dans la liste des
macros, et vous pourrez en demander l’exécution. Cette macro sera liée au classeur en cours,
mais son exécution pourra concerner des données contenues dans d’autres classeurs.
Objectifs :
✓ Lire des données dans une feuille
✓ Traitement de ces données
✓ Placer les résultats dans une feuille
Avantage : pas besoin de gérer l’interface utilisateur (saisie et présentation des informations)
Les données sont dans des cellules (Cells) d’une feuille (Sheet) d’un classeur (Workbook)
L’adressage d’une cellule doit donc comporter tous ces éléments séparés par un point (.)
Exemple :
X = [Link](1,2)
Met le contenu de la cellule de la ligne 1 et de la colonne 2 de la feuille Mafeuille du classeur
MonClasseur dans la variable X
Une cellule est référencée par son numéro de ligne et son numéro de colonne dans la feuille
Il faut déclarer (ou « dimensionner ») toutes les variables qui vont être utilisées, par
l’instruction DIM suivi du Nom de la variable AS type de variable
Exemple :
Dim MaFeuille As Worksheet
Plusieurs façons d’associer la variable Mafeuille à une feuille de données d’un classeur :
Set MaFeuille = [Link] ‘la variable MaFeuille fait référence à la
feuille active (celle qui est affichée sur l’écran)
Où :
Set MaFeuille = [Link]("Feuil2") ‘MaFeuille fait référence à la
Feuille nommée « Feuil2 » du classeur actif
ABF | INTRODUCTION 3
Ou :
Set Mafeuille = [Link](1) ‘Mafeuille fait référence à la feuille
numéro 1 du classeur
[Link]
[Link] ‘MaFeuille devient la feuille active, et s’affiche à l’écran
Je peux maintenant utiliser cette variable pour faire référence à une cellule :
X = [Link](1,2) ‘met le contenu de la cellule située ligne 1 et colonne 2 dans la
variable nommée X (qu’il faut aussi déclarer, voir plus loin)
Où
[Link](2,3) = « BONJOUR » ‘met la chaîne de caractère placée entre guillemets
dans la cellule ligne 2, colonne 3
Où :
[Link](1,3) = [Link](1,1) * [Link](1,2) ‘ : met dans la cellule de la
ligne 1, colonne 3, le produit des valeurs contenues dans les cellules des colonnes 1 et 2 de la
même ligne
Une cellule a un contenu (numérique ou alphanumérique) et des « propriétés » (couleur, fonte,
taille de caractères, etc.) ; la valeur (value) d’une cellule fait partie de ses propriétés
Donc, en toute rigueur il faudrait écrire :
X = [Link](1,2).Value
[Link](2,3).Value = « BONJOUR »
Même si ce n’est pas toujours nécessaire
On peut éventuellement définir certaines propriétés de la cellule :
[Link](2,3). [Link] = True ‘style italique
[Link](2,3). [Link] = False ‘supprime le style italique
[Link](2,3). [Link] = True ‘met en gras
[Link](2,3). [Link] = 24 ‘taille du texte
[Link](2,3). [Link] = 5 ‘colore la cellule avec la couleur
correspondante à l’index 5
Où
[Link](2,3). [Link] = vbBlue ‘colore la cellule en bleu
Remarque : le préfixe vb (pour Visual Basic) se retrouve souvent pour définir un caractère
(vbtab, vbCR, etc.) ou une couleur (vbRed, vbBlack, etc.)
ABF | INTRODUCTION 4
I. Types de variables
Les différents types de variables les plus utilisés :
BOOLEAN : ne peut prendre que 2 valeurs : true (1 ou -1) ou false (0)
INTEGER : nombre entier (entre - 32768 et 32768)
LONG : entier long
DOUBLE : nombre décimal ( : double précision)
STRING : chaîne de caractères alphanumériques
Une variable a un nom (X, Y, Taille, Nom), un type et un contenu
Il faut dimensionner ( : déclarer) une variable avant de l’utiliser, avec l’instruction DIM
Cette instruction réserve un emplacement en mémoire pour la variable déclarée
On peut imaginer une variable comme un « récipient » qui a un nom et un contenu
Exemple :
Dim X as double, Y as double
X = 10
La variable X de type décimal, contient la valeur 10
Le X fait référence au nom de la variable (le récipient)
Y = X*3.1
La variable Y de type décimal contient 31
Le Y fait référence au nom de la variable (le récipient)
Le X fait référence au contenu du récipient nommé X,
X=X+1
La variable X contient 11
Ici, le X à gauche du signe = fait référence au « récipient » tandis que le X à droite fait
référence à son contenu.
Le signe « = » est une instruction d’affectation (et non de comparaison, comme nous le
verrons plus tard)
Cette instruction se lit donc comme : « mettre dans le récipient X son contenu plus 1 »
Il est évident qu’on ne peut pas mettre dans une variable des valeurs d’un autre type
Par exemple :
Dim X as Integer
X = « Hello »
Produit une erreur car on essaie de mettre une chaîne de caractères dans une variable de type
numérique
de même :
Dim Montexte as String
Montexte = 10
Produit une erreur
Il faut donc faire attention lorsqu’on veut mettre le contenu d’une cellule dans une variable.
Par exemple :
Dim X as Double
X = [Link](1,1).value
Produira une erreur si la cellule contient du texte
ABF | I. Types de variables 5
EXERCICE 1
Dans la feuille 1 du classeur actif, entrer les valeurs suivantes (ou d’autres si vous le
souhaitez):
Nous allons calculer la moyenne et la variance de la série de valeurs de la colonne « taille »
Pour cela, il nous faut une macro qui « lit » les valeurs dans la feuille 1, calcule la moyenne,
la variance et l’écart-type, et écrit les résultats dans la feuille 2
Nous avons besoin de définir des variables correspondant à :
La feuille 1
La feuille 2
La somme des X
La somme des X2
La somme des carrés des écarts
Le nombre de valeurs de la série
La moyenne de la série
La variance de la série
L’écart-type de la série
Remarques :
Le nom d’une variable doit commencer par une lettre, et ne doit ensuite contenir que des
lettres ou des chiffres (surtout pas d’espace, ni de lettre accentuées comme é, à, …)
Les lettres minuscules ou majuscules ne sont pas différenciées
Il est conseillé de donner des noms qui évoquent le contenu de la variable (Exemple : Moy),
mais ce n’est pas obligatoire. Cela facilite simplement la lecture du programme
ABF | I. Types de variables 6
Notre programme, à ce stade, se présente ainsi :
Il nous faut maintenant définir les feuilles qui vont être utilisées
Il est souvent intéressant de connaître le nombre de lignes et de colonnes utilisées dans une
feuille pour ne parcourir que la plage de cellules réellement utilisées
La syntaxe est :
NbreLigne = [Link]
NbreCol = [Link]
dans notre exemple :
ABF | I. Types de variables 7
Il nous faut maintenant calculer N (le nombre de valeurs) : c’est le nombre de lignes – 1 (la
première contient du texte correspondant aux noms des variables)
N = derniereLigne - 1
Il nous faut maintenant parcourir la colonne 2 de la feuille Fdata où se trouvent les valeurs
dont on veut calculer la moyenne, variance et écart-type
Pour effectuer ce type d’opération, tous les langages utilisent des « boucles » dans lesquelles
s’exécutent des instructions répétées.
En VB, les boucles les plus utilisées sont les boucles FOR … NEXT
For indice = valeurInitiale to valeurFinale
Suite d’instructions
Next indice
Fonctionnement de la boucle : lorsque le programme rencontre la première instruction For, il
met la valeur da la variable indice à valeurInitiale puis il exécute les instructions jusqu’à la
ligne Next indice. Il augment la valeur de indice de 1 (par défaut) et vérifie que cette nouvelle
valeur n’est pas supérieure à valeurFinale. Si indice est inférieur ou égal à valeurFinale, les
instructions sont exécutées jusqu’à l’instruction Next indice. Ce cycle se répète jusqu’à ce que
indice soit supérieur à valeurFinale. Le programme sort alors de la boucle et passe à
l’instruction qui suit l’instruction Next indice.
Nous allons utiliser ce type de boucle pour parcourir les cellules de la feuille 1 qui
contiennent les valeurs qui nous intéressent et effectuer les calculs préalables au calcul de la
moyenne et de la variance.
Pour ces calculs, il nous faut la somme des X (que nous mettrons dans la variable SomX) et la
somme des carrés de X (que nous mettrons dans la variable SomX2)
Il nous faut aussi une nouvelle variable qui servira d’indice pour parcourir la plage de cellules
Voici comment se présente le programme
Question : comment calculer SomX et SomX2 ?
ABF | I. Types de variables 8
ABF | I. Types de variables 9
I.A. Les tableaux de données
On a souvent besoin de ranger des valeurs dans un « tableau » comportant des lignes et des
colonnes.
Exemple :
Dim VarX(100,10) as Double
Création d’un tableau (en mémoire) de 100 lignes (Exemple : des sujets) et 10
colonnes (Exemple : des conditions de mesures ou des essais de pratique) pouvant contenir
des nombres décimaux
Autre exemple :
Dim NomSujet(50) as String
I.B. Opérations sur les variables numériques
Addition : +
Soustraction : -
Multiplication : *
Division : /
Racine carrée : sqr(X)
Logarithme : Log(X)
Exposant : X^2
Partie entière d’un nombre : INT(X)
Sinus, cosinus, tangente : sin(X) cos(X) Tan(X)
I.C. Opérations sur les variables alphanumériques (chaînes de caractères)
Elles doivent être déclarées comme STRING
Exemple :
Dim Mot as String
Dim Phrase as String
On peut les spécifier en mettant leur contenu entre guillemets :
Exemple :
Mot = "Bonjour"
Phrase = "Comment allez-vous ?"
On peut extraire des bouts de chaînes de caractère avec 3 fonctions :
Left, right, mid
ABF | I. Types de variables 10
Exemple :
Mot = left(Phrase, 3) ‘Mot contient les 3 caractères à gauche de Phrase ("Com")
Mot = Right(phrase,4) ‘Mot contient les 4 caractère les plus à droite de Phrase ("us ?")
Mot = Mid(Phrase,2,5) ‘Mot contient les 5 caractères à partir du 2ème ("ommen")
On peut rechercher si une chaîne se trouve dans une autre :
Dim Trouve as Long
Trouve = Instr(premCar,ChaineCible, ChaineCherchee)
Cette instruction recherche, en partant du caractère premCar si ChaineCherchee est inclus
dans ChaineCible, et renvoie la position (Trouve) de sa première occurrence
Exemple :
Mot = "vous"
Phrase = "Comment allez-vous ?"
Trouve = Instr(1,Phrase, Mot) ‘Trouve sera égal à 15
(note : si la recherche doit commencer au 1er caractère, le paramètre peut être omis)
Si la chaîne cherchée ne se trouve pas dans la chaîne cible, la fonction renvoie 0
Autres procédures :
Phrase = UCASE(Phrase) ‘met toute la chaîne en MAJUSCULES (Upper Case)
Phrase = LCASE(Phrase) ‘met toute la chaîne en minuscules (Lower Case)
I.D. Parcourir un ensemble de données dans un tableau
Soit un tableau de données X(100) dont on veut calculer la moyenne
Une possibilité : calculer Somme = X(1) + X(2) + X(3) …. + X(99) + x(100)
Et ensuite : Moyenne = Somme/100
Pas terrible…., d’où l’intérêt de faire une boucle pour parcourir le tableau :
Dim i as Integer
Dim Somme as Double, Moyenne as Double
Somme = 0
For i = 1 to 100
Somme = Somme + X(i)
Next i
Moyenne = Somme/100
i : indice de la variable dans le tableau
On verra plus loin d’autres types de boucle
ABF | I. Types de variables 11
II. Les procédures
Toutes les instructions doivent être incluses dans des procédures (sauf DIM qui est la seule à
pouvoir apparaître en dehors d’une procédure)
Pour créer une procédure :
Menu Outils
Macros
Visual Basic Editor
Une feuille s’affiche où on va écrire les procédures
Format général :
Sub NomProcédure(nom_variable AS type_variable,…)
Instructions
End Sub
Si la procédure ne comporte pas de paramètres, elle apparaîtra dans le menu « macro ». Si elle
comporte des paramètres, elle ne pourra être appelée que depuis une autre procédure
Exemple de procédure pour calculer la moyenne de N valeurs :
Sub CalculMoyenne (X() as double, N as Integer, Moyenne as Double)
Dim i as Integer
Dim Somme as Double
Somme = 0
For i = 1 to N
Somme = Somme + X(i)
Next i
Moyenne = Somme/N
End Sub
Exemple : les données sont dans la première colonne d’une feuille de calcul « Feuil1 »
On veut pouvoir calculer leur moyenne et leur écart-type et placer ces informations dans
« Feuil2 »
On crée d’abord une procédure qui pourra être appelée depuis le menu Outils.. Macros
Pour ce type de procédure, il ne doit pas y avoir de variables ( : arguments) qui lui sont passés
Sub Moyenne ()
Dim FeuilDonnees as worksheet
Dim FeuilResultat as worksheet
Dim Nbre as Integer
Dim Y(1000) as Double ‘on prévoit large
Dim Moy as Double, Ecartype as Double
Dim i as Integer
Set FeuilDonnees = [Link]("Feuil1")
Set FeuilResultat = [Link]("Feuil2")
Nbre = [Link]
ABF | II. Les procédures 12
For i = 1 to Nbre
Y(i) = [Link](i,1)
Next i
‘on appelle la procédure de calcul de la moyenne déjà définie plus haut :
call CalculMoyenne(Y(), Nbre, Moy)
‘on appelle la procédure de calcul de l’écartype qu’on va écrire plus loin
call calculEcartype(Y(), Nbre, Ecartype)
‘ on écrit les résultats
[Link](1,1) = “Nombre de Données:”
[Link](1,2) = Nbre
[Link](2,1) = “Moyenne: “
[Link](2,2)= Moy
[Link](3,1) = “Ecart-Type: “
[Link](3,2) = Ecartype
End sub
Sub calculEcartype(X() as double, N as Integer, s as double)
Dim IM j as Integer
Dim Somme as double
Dim Somme2 as double
For j = 1 to N
Somme = Somme + X(j)
Somme2 = Somme2 + X(j)*X(j)
Next i
S = sqr((somme2 – (Somme*Somme)/N)/(N-1))
End Sub
Vous remarquerez que les variables n’ont pas le même nom dans la procédure appelante
(Y(),Nbre, Moy) et dans la procédure appelée (X(), N, Moyenne)
II.A. boucle While...Wend
i=0
While i < N
‘ces instructions seront exécutées tant que i < N
i=i+1
somme = somme + i
Wend
boucle Do...Loop until
i=0
Do
i=i+1
somme = somme + X(i)
Loop Until i = N ‘quand i = N on sort de la boucle
ABF | II. Les procédures 13
II.B. Boucles imbriquées
Exemple : une feuille contient les mesures d’une variable faites sur plusieurs sujets (en ligne)
dans différentes conditions (en colonnes)
La première ligne contient le nom des mesures
La première colonne contient le nom des sujets
Sub LireDonnees()
Dim Nsujets as Integer, Nmesures as Integer
Dim X(100,50) as double
Dim Nomsujets(100) as string, NomMesures(50) as String
Dim i as Integer, j as Integer
Nsujets = [Link] -1
Nmesures = [Link] -1
For j = 1 to Nmesures
NomMesures(j) = cells(1,j+1)
‘ pas besoin de préciser la feuille si c’est la feuille active
Next j
For i = 1 to Nsujets
Nomsujets(i) = cells(i+1,1)
For j = 1 to Nmesures
X(i,j) = cells(i+1,j+1)
next j
Next i
End sub
III. Informations sur les classeurs (Workbook) et les feuilles (Sheets)
‘combien de feuilles dans un classeur ?
‘mettre leurs nom dans les cellules d’une feuille
Dim Wb as Workbook ‘la variable Wb fera référence à un classeur
Dim f As Worksheet ‘la variable f fera référence à une feuille
Dim Nf as Integer, i as Integer ‘ces 2 variables contiendront des nombres entiers
Set Wb = activeWorkbook ‘Wb fait maintenant référence au classeur actif
Nf = [Link] ‘Nf contient maintenant le nombre de feuilles de Wb
Set f = [Link] ‘f fait référence à la feuille active de Wb
For i = 1 To Nf
[Link](i, 1) = " feuille " & i ‘on place dans la colonne 1 de la ligne i le
mot Feuille et le numéro i qui lui correspond
[Link](i, 2) = [Link](i).Name ‘on place dans la colonne 2 de la ligne i le
nom de la feuille correspondante
Next i
‘ajouter une feuille au classeur Wb
[Link]
ABF | III. Informations sur les classeurs (Workbook) et les feuilles (Sheets) 14
IV. Dialogue avec l’utilisateur
IV.A. Donner une information à l’utilisateur :
Fonction MsgBox(message)
Exemple :
MsgBox(« opération terminée »)
Une boite de dialogue apparaît, et reste visible jusqu’à que l’utilisateur clique « ok »
(on peut créer d’autres forme de dialogue avec MsgBox : voir aide dans Visual Basic)
IV.B. Demander une information à l’utilisateur :
Fonction InputBox(message, titre, défaut)
Sub DemandeNombre(Nbre As Integer)
Dim Message as string, Titre as string, Defaut as string, Reponse as string
Message = "Entrez le nombre voulu :"
Titre = "Démonstration de InputBox" ' Définit le titre.
Defaut = "1" ' Définition la valeur par défaut.
' Affiche le message, le titre et la valeur par défaut.
Reponse = InputBox(Message, Titre, Defaut)
‘attente d’un click sur OK
Nbre = Val(Reponse)
End Sub
ABF | IV. Dialogue avec l’utilisateur 15
V. Instructions conditionnelles
Certaines instructions ne doivent être exécutées que si une certaine condition est vraie
If condition Then
Instructions à exécuter si la condition est vraie
Else
Instructions à exécuter si la condition est fausse (optionnel)
End If
Exemple : calculer la moyenne des valeurs de la colonne 1 en ignorant les cellules vides :
Sub MoyenneIgnoreVide()
Dim FeuilDonnees as worksheet
Dim FeuilResultat as worksheet
Dim i as Integer
Dim Nbre as Integer, N as Integer, Moy as double, ecartype as double
Set FeuilDonnees = [Link]("Feuil1")
Set FeuilResultat = [Link]("Feuil2")
Nbre = [Link]
N=0
For i = 1 to Nbre
If [Link](i,1) <> “” then
‘ou if IsNumeric([Link](i, 1)) then
‘instructions exécutées uniquement si la condition est vraie
N=N+1
Y(N) = [Link](i,1)
End if
‘à la sortie de la boucle, N sera égal au nombre de cellules non vides
Next i
Call CalculMoyenne(Y(), N, Moy)
Call calculEcartype(Y(), N, Ecartype)
‘ on écrit les résultats
[Link](1,1) = “Nombre de Données:”
[Link](1,2) = N
[Link](2,1) = “Moyenne: “
[Link](2,2)= Moy
[Link](3,1) = “Ecart-Type: “
[Link](3,2) = Ecartype
End Sub
Note : <> signifie « différent » : not equal
Note : lorsqu’une variable est dimensionnée dans une procédure, elle n’existe que pour cette
procédure
Pour qu’une variable soit « visible » par toutes les procédures, il faut la déclarer
(dimensionner) en dehors d’une procédure, en tête de la feuille Visual basic
ABF | V. Instructions conditionnelles 16
V.A. Coloriage de cellules
Comment connaître les index des couleurs
Sub couleur()
Dim i As Integer
Dim MaFeuille As Worksheet
Set MaFeuille = [Link]("Feuil1")
For i = 1 To 56
[Link](i, 1) = i
[Link](i, 2).[Link] = i
Next i
End Sub
ABF | V. Instructions conditionnelles 17