Introduction au language Visual Basic for
Applications dans le monde Excel
Ressources
FAQ :
http://msdn2.microsoft.com/en-us/isv/bb190540.aspx
Référence :
http://msdn2.microsoft.com/en-us/isv/bb190540.aspx
Nombreux livres
Aide en ligne d’Excel
Programmer sous Excel
Pour accéder à l’environement de
programmation sous Excel, deux possibilités
Par les menus
Alt F11
L’environement de dévelopement
Explorateur de projet
Éditeur
Espions
(débogage) Propriétés
Ajouter une fonction à Excel
Click droit sur “Microsoft Excel objects” :
Séléctioner “Module
”Structure d’une fonction
Délimiteu rs
de
fonction
Nom de la fonctionType de la fonctionNom de l’argumentListe des argumentsType de l’argument
Corps de la fonction:
Attribution fonctionne comme valeur de retour
Utilisation dans Excel
Conditions pour fonctions à appeler dans Excel
Ne pas changer la structure d’une feuille Excel.
Ne pas changer les propriétés d’une cellule.
Toute fonction appelée doit respecter les mêmes restrictions.
Si la fonction doit être exécuté même si ses arguments ne changent pas il faut appeler Application.Volatile.
Doit retourner un type qui Excel sait traiter.
Subroutines
Les sub ne renvoient pas de résultat, contrairement aux fonctions.
Les sub ne peuvent pas être appelées
directement depuis les cellules de Excel.
Si une sub est appelée depuis une fonction
qui est appelée depuis une cellule, alors elle
doit respecter les mêmes restrictions que ces
fonctions.
Valeurs par défaut
Les paramètres des Function et Sub peuvent être optionnels. Si un paramètre est optionnel tous les paramètres suivants le sont aussi.
Si un paramètre est de type Variant on peut tester que l’appel n’a pas définit ce
paramètre avec IsMissing.
Sub ajoutEspace(ByRef str As String, Optional nb As Integer = 5) Dim prefix As String
prefix = Space(nb) str = prefix & str Debug.Print str End Sub
Sub ajoutEspace(ByRef str As String, Optional vnb As Variant)
Dim prefix As String Dim nb As Integer
If IsMissing(vnb) Then nb = 5
Else
nb = CInt(vnb) End If
prefix = Space(nb) str = prefix & str Debug.Print str End Sub
Paramètres nommés
On peut appeler une fonction en nommant ses paramètres.
ajoutEspace str:=res, nb:=10
Sub ajoutEspace(ByRef str As String, Optional nb As Integer = 5) Dim prefix As String
prefix = Space(nb) str = prefix & str Debug.Print str End Sub
Déclaration des variables
On déclare une variable à l’aide de Dim :
Function surfCercle(x As Double) As Double
Dim pi As Double pi = 3.1415279
surfCercle = x * x * pi End Function
Par défaut les variables n’ont pas besoin
d’etre déclarées, elles ont le type Variant. Il faut utiliser
Option Explicit
pour rendre la déclaration obligatoire.
Types
String : Chaines de caractères.
Types numériques : entiers, réels en virgule flottante (précision simple ou double) et réels en virgule fixe (decimal).
Dates : Représentation des dates en nombre de jours écoulés depuis le premier janvier 1900.
Tableaux : une collection de variables d’un autre type, l’indexation est au choix de
l’utilisateur, par défaut de 1 à N.
Variant : Type abritant tout autre type.
Objets : Types définis dans des bibliothèques
ou par des utilisateurs.
Strings
Une chaine de caractères se déclare comme String, par exemple :
Dim message As String
De nombreuses fonctions de manipulation de strings sont disponibles, exemples :
Len, calcule la taille
InStr, cherche dans une String
Replace, modifie une String
Etc.
Types numériques
Entiers :
Byte
Integer, entier 2 octets
Long, entier 4 octets
Decimal : Currency
Réels virgule flotante :
Single, 4 octets
Double, 8 octets
Booléens et dates
Boolean, représente vrai ou faux.
Date, représente une date, stockée comme
nombre de jours depuis le premier janvier
1900. Il y a un jour de décalage avec des
dates Java.
Tableaux
Un tableau (array) se déclare en ajoutant au nom d’une variable des paranthèses et une dimension.
On accéde aux éléments d’un tableau par indexation.
L’option globablle Option Base permet de
fixer le premier indice de chaque tableau, par défaut les tableaux commencent à 1.
Dim t(1 To 10) As Integer Sub arrTest(j As Integer)
Dim t(1 To 10) As Integer Dim i As Integer
i = 1
While i <= 10 t(i) = j + I i = i + 1 Wend
End Sub
Appel de Function
Une Function s’appelle en plaçant une liste d’expressions entre parenthèses à la place de la liste des arguments.
Un appel de fonction remplace toute
expression du même type que le type de retour de la fonction.
Exemple :
X=surfCercle(2.0)+4
Appel de sub
2 façons d’appeler une sub:
• Call suivi du nom, les arguments entre ()
• nom du Sub (sans Call) avec arguments séparés par ,
Function HelloWorld() As String Dim res As String
res = "Hello World"
Call ajoutEspace(res) HelloWorld = res
End Function
Sub ajoutEspace(ByRef str As String) str = " " & str
End Sub
Function HelloWorld() As String Dim res As String
res = "Hello World"
ajoutEspace res HelloWorld = res End Function
Sub ajoutEspace(ByRef str As String) str = " " & str
End Sub
Sub, Function : paramètres
Deux façons de passer un paramètre a une Function où Sub :
Par valeur, le nom du paramètre est précédé par ByVal (cette méthode de passage de
paramètres est la méthode par défaut).
Par référence, le nom du paramètre est
précédé par ByRef.
Variables globales
Une variable déclarée à l’extérieur de toute Function ou Sub est globale.
Deux types de visibilités sont possibles :
Public, visible depuis tous modules,
Private, visible uniquement dans le module
courant.
Instructions de contrôle
Conditionels :
If
Iif
Function Signe(x As Double) As Byte
If x > 0 Then Signe = 1
ElseIf x < 0 Then Signe = -1
Else
Signe = 0 End If
End Function
Function sPlus(x As Double) As Double sPlus = IIf(x > 0, x, 0)
End Function
Boucles
While
For
For Each, s’utilise avec de collections.
Sub arrTest(j As Integer)
Dim t(1 To 10) As Integer
Dim i As Integer
i = 1
While i <= 10 t(i) = j + i i = i + 1 Wend
End Sub
Sub arrTest(j As Integer) Dim t(1 To 10) As Integer Dim i As Integer
For i = 1 To 10 t(i) = j + i Next i
End Sub
Manipulation des cellules
Les feuilles et les celules d’Excel sont des variables de type spécial. Elles peuvent etre manipulées dans VBA.
À chaque feuille correspond une variable :
Utilisation d’objets
Un objet est une variable dont le type est une classe appartenant au projet courant où à une bibliothèque.
Un objet se déclare à l’aide de Dim comme pour toute variable.
Un objet doit être crée avec une instruction New et l’attribution du résultat de New se fait obligatoirement à l’aide de Set.
Un objet non initialisé contient Nothing.
Objets et classes
Une classe est un type défini dans une bibliothèque.
Une variable dont le type est une classe est un Object.
Un Objet contient des membres qui peuvent être
des propriétés,
Des méthodes (des fonctions)
Deux objets de même type ont, en général,
des propriétés avec des états différents.
Accès aux cellules
Parmi les membres de la classe Worksheet on trouve la méthode Cells.
Il y a deux versions de la méthode Cells
À deux arguments entiers représentant le
nombre de lignes et le nombre de colonnes. Ex:
Cells(1,1)
À un argument String représentant l’adresse d’une cellule. Ex Cells("A1")
La méthode Cells retourne un objet du type
Range qui représente un groupe de cellules.
Range : quelques membres
Value, propriété qui représente le contenu de la cellule.
Text, propriété qui représente le texte affiché par la cellule.
Formula, propriété qui représente la formule de la cellule.
ClearContents, méthode qui efface le contenu de la cellule.
ClearComments, méthode qui efface les
comentaires de la cellule.
Exemple
Option Explicit
Sub displaySquare() Dim i As Integer
For i = 1 To 100
result.Cells(i, 1).Value = i * i
result.Cells(i, 1).Interior.ColorIndex = i Mod 32 Next i
End Sub Result est un Objet
de type
Excel.Worksheet
Excel -> bibliothèque Worksheet -> class
Cells est une méthode de la class Worksheet à 2 arguments (il a une Autre méthode de même nom à 1 argument) qui retourne un objet de type Excel.Range
Value est une propriété de la class Range
Évènements
Le évènements sont des subroutines qui s’exécutent assynchronement . Ils sont
déclenchés automatiquement par des actions extérieures.
Quelques exemples :
Click de souris sur bouton
Changement de contenu d’une cellule
Changement de la cellule courante
Private Sub btnGo_Click() displaySquare
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Or IsEmpty(Target) Then
Exit Sub End If
If Target.Address = "$A$1" Then
calc.Cells(1, 4).Value = "A1 Changed"
End If End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) calc.Cells(2, 4).Value = "selection is now " & Target.Address End Sub
Évènements
Nom de la class,
Dans certains cas nom De l’objet
Nom de l’évènement
Erreurs
Dans son comportement par défaut l’exécution s’arrête et un message est affiché.
On peut spécifier un autre comportement si une erreur se produit, trois comportemens sont
possibles :
On Error Goto 0, le comportement par défaut
On Error Resume Next, ignorer les erreurs et passer à l’instruction suivante.
On Error Goto <label>, sauter à <label> (ligne marqué de <lable>:) si une erreur se produit.
Si une erreur se produit la variable Err est initialisée.
Erreurs (suite)
La variable Err contient plusieurs membres, les plus importants :
Number, contient le numéro unique de l’erreur.
Description, contient la description de l’erreur.
Raise, produit une erreur (utile pour signaler des erreurs à d’autres parties du programme.
Clear, nettoye la dernière erreur.
Erreurs (exemple)
Sub ajoutEspace(ByRef str As String, Optional vnb As Variant) Dim prefix As String
Dim nb As Integer
On Error GoTo err_label If IsMissing(vnb) Then nb = 5
Else
nb = CInt(vnb) End If
prefix = Space(nb) str = prefix & str Exit Sub
err_label:
MsgBox Err.Description
End Sub Modification du
traitement des erreurs.
Label
Accès à l’erreur
Modules de classe
Dans un module de classe on peut définir ses propres classes.
Une classe contient 3 types de membres :
Des variables membres
Des méthodes
Des propriétés
2 types de visibilité pour les membres :
Private
Public
Créer une classe
Exemple : étudiants
Option Explicit
Private my_nom As String Private my_prenom As String Private notes As Collection Private Sub Class_Initialize() my_nom = "Inconnu"
my_prenom = ""
Set notes = New Collection End Sub
Variables membres
Méthode
Exemple : étudiants
Public Property Get moyenne() As Single Dim ret As Single
Dim note As Variant Dim cnt As Integer
ret = 0 cnt = 0
For Each note In notes ret = ret + note
cnt = cnt + 1 Next note
moyenne = ret / cnt End Property
Propriété en lecture seule, pas de « Property Let »
Exemple : étudiants
Public Property Let nom(nom_ As String) my_nom = nom_
End Property
Public Property Get nom() As String nom = my_nom
End Property
Public Property Let prenom(prenom_ As String) my_prenom = prenom_
End Property
Public Property Get prenom() As String prenom = my_prenom
End Property
Attribution, propriété
Lecture, propriété
Utilisation d’une classe
Dim e1 As Etudiant
Dim e2 As New Etudiant
Set e1 = New Etudiant
e1.nom = "Sarkozy"
e1.prenom = "Nicolas"
e1.addNote "Mathematiques", 10 e1.addNote "Droit", 17
e2.nom = "Royal"
e2.prenom = "Segolene"
e2.addNote "Mathematiques", 10 e2.addNote "Droit", 15
Déclarations Allocation
Utilisation de propriétés
Appel de méthode
Forms
Les forms sont des objets graphiques qu’on peut afficher dans Excel.
On utilise des forms pour intéragir avec un utilisateur.
Une form et toujours composé d’une fenêtre sur laquelle s’affichent des contrôles graphiques.
La boite à outils de Excel propose plusieurs
contrôles : boutons, zones de texte, liste de choix, etc.
Chaque contrôle propose des évènements qui permettent d’interagir avec l’utilisateur.
Chaque form gère son propre module.
Créer une form
Form et boite à outils
Design de la form
Code associé à une form
Évènement
click du bouton Accès à une propriété d’un autre contrôle