Le langage VBA
Une programmation impérative
VBA est un langage de programmation impérative, c’est-à-dire que les instructions qui sont codées doivent s’exécuter dans leur ordre d’apparition dans le programme. Une instruction ne peut s’exécuter que si celle qui la précède a elle-même été exécutée.
Un chien suivra les instructions dans leur ordre d’apparition : « Assis », « Debout », « Couché ».
Syntaxes possibles
En VBA, les instructions sont séparées par un retour à la ligne ou par le signe deux-points « : ».
Par exemple, considérons le programme suivant :
Instruction_1
Instruction_2
Instruction_3
L’exécution de ce programme entraînera l’exécution d’Instruction_1, puis Instruction_2 et enfin Instruction_3. Le programme aurait pu s’écrire de la manière équivalente suivante :
Instruction_1 : Instruction_2 : Instruction_3
Si une instruction est trop longue pour tenir sur une seule ligne, ou si vous souhaitez la répartir sur plusieurs lignes pour votre confort de lecture, il est possible de passer à la ligne en utilisant le symbole souligné (underscore) « _ ». Ainsi l’exécution du programme suivant déclenche l’exécution de l’instruction Instruction_A :
Instruc_
tion_A
Structure d’un programme
Un programme VBA se décompose en série de procédures et fonctions écrites dans le but de réaliser une ou plusieurs opérations. Les instructions doivent être codées à l’intérieur de ces procédures ou fonctions. Il est question de déclaration de procédures (et fonctions).
Dans un module, le programme est donc constitué d’une série de déclarations de procédures et de fonctions. Une fois ces procédures déclarées, elles seront exécutées lorsqu’elles seront appelées par le programme.
Pour lancer un programme VBA, on exécute une macro, qui est une procédure particulière et qui contient des instructions faisant appel aux autres fonctions et procédures. Un programme VBA doit avoir au minimum une macro déclarée pour fonctionner.
Voici un exemple de programme VBA à l’intérieur d’un module :
Sub Procedure_A()
...
End Sub
Sub Procedure_B()
...
End Sub
Function Fonction_C...
...
End Function
Sub Macro_1()
Procedure_A
...
End Sub
Dans cet exemple, on peut constater la déclaration des procédures Procedure_A et Procedure_B, de la fonction Fonction_A et de la macro Macro_1. La première instruction de Macro_1 est un appel de la procédure Procedure_A. La première opération exécutée lors du lancement de la macro Macro_1 sera donc le lancement de la procédure Procedure_A.
Attention, le nom que vous donnez à vos macros, procédures et fonctions n’a pas d’impact sur leur nature, exemple, vous pouvez avoir :
Sub MaFonction()
...
End Sub
Mais il est évident que vous ne vous faciliterez pas la vie ainsi.
Les variables
Les variables sont des récipients qui permettent de stocker des informations à tout moment de l’exécution d’un programme et de les exploiter à n’importe quel autre moment. En VBA, une variable est définie par deux attributs :
-
Son nom, qu’on utilisera pour accéder aux informations qu’elle contient ; pour les conventions, voir Conventions de nommage et typographies du code VBA.
-
Son type de donnée stockée.
1. La syntaxe de déclaration
Tout comme les fonctions et procédures, pour qu’une variable puisse être appelée et utilisée, il faut la déclarer. La syntaxe de déclaration d’une variable est la suivante :
Dim NomDeVariable As TypeVariable
Le mot-clé Dim sert à déclarer une variable. Il est suivi du nom de la variable. Après le mot-clé As se trouve le type de la variable. Il existe plusieurs types de données qu’il est possible de manipuler en VBA.
Lorsqu’on présente son chien, on indique son prénom et sa race (« Snoopy, cocker »), et pour utiliser une variable, on l’appelle par son nom.
2. Les types de données
Il existe plusieurs types de données (car on a également des constantes).
Tout comme il existe plusieurs races de chiens.
a. Les types numériques
Les valeurs entières
Le type Byte permet de stocker un entier compris entre 0 et 255 (stocké sur 8 bits, soit 1 octet, Byte en anglais),
Dim b As Byte
b = 13
Le type Integer contient un entier compris entre -32 768 et 32 767 (sur 16 bits).
Dim i As Integer
i = 28
Le type Long contient un entier compris entre -2 147 483 648 et 2 147 483 647 (sur 32 bits).
Dim l As Long
l = 52
Les valeurs réelles (décimales)
Le type Single contient une valeur...
Les constantes
1. Les constantes utilisateurs
Les constantes utilisateurs permettent d’attribuer un libellé à une valeur fixe. L’utilisation de telles constantes permet de faciliter la programmation, notamment dans le cadre d’une éventuelle mise à jour des valeurs. On peut utiliser une constante par exemple pour stocker le nombre de jours par semaine. La syntaxe générique est la suivante :
Const NomConstante [As TypeConstante] = ValeurConstante
Exemple :
Const NOMBRE_DE_MOIS_PAR_ANNEE As Integer = 12
La constante NOMBRE_DE_MOIS_PAR_ANNEE, de type nombre entier, gardera la valeur 12 tout du long de l’utilisation du programme.
Une fois la valeur de la constante définie, elle ne peut plus être modifiée.
2. Les constantes Office
En VBA, il existe déjà un certain nombre de constantes Office qui sont directement liées aux différentes applications (Access, Excel, etc.). Ces constantes ont des valeurs prédéfinies, et ont des noms qui respectent un nommage : ApplicationNom (ac pour Access, xl pour Excel, vb pour VB, etc.). Ci-dessous quelques exemples de constantes VBA :
Outil/Application |
Exemples de constantes |
Access |
acGreaterThan, acPage, acTextBox |
Excel |
xlToLeft, xlLabel, xlPasteFormats |
VB |
vbGreen, vbMaximizeFocus, vbSunday |
Les tableaux
Jusqu’à présent, nous avons vu le moyen de stocker une valeur dans une variable. Il est également possible de stocker plusieurs valeurs dans plusieurs variables. Enfin, il est possible de stocker plusieurs valeurs au sein d’une seule variable, un tableau. Créer un tableau de n éléments revient à créer n variables différentes, en même temps.
Les variables de type tableau servent à stocker des groupes de données de même type. Chaque élément du tableau sera accessible grâce à un numéro séquentiel. Une modification d’un des éléments du tableau ne modifie pas les autres éléments de celui-ci.
Un tableau peut être composé d’une ou plusieurs dimensions, chaque dimension étant définie par une borne inférieure et une borne supérieure. Ces bornes peuvent être fixes ou dynamiques. Les tableaux ne peuvent changer de dimension en cours de programme que lorsqu’ils sont dynamiques.
Un tableau nécessitera toujours 20 octets de mémoire, plus 4 octets par dimension et le nombre d’octets nécessaires selon le type des valeurs stockées.
1. Les tableaux de taille fixe
On détermine un tableau de taille fixe lorsque celle-ci est définie lors de la déclaration de la variable.
Option Base 0
Dim Tableau(3) As Date
L’indice 3 spécifie la taille du tableau. Le décompte des éléments peut commencer à 0 ou à 1 selon la définition de l’instruction Option Base. Si aucune information n’a été précisée, Option Base 0 est la valeur par défaut. As Date détermine le type des données contenues dans le tableau, ici des dates.
Il s’agira donc d’un tableau...
Les opérateurs
Il existe plusieurs opérateurs en VBA qui peuvent être utilisés selon les types de variables. Les résultats des opérateurs seront représentés dans les exemples qui suivent à droite du symbole =.
1. Les opérateurs numériques
+, -, *, / : opérateurs mathématiques des opérations élémentaires
+ : addition
1 + 2 = 3
- : soustraction
6 - 5 = 1
* : multiplication
4 * 9 = 36
/ : division
42 / 6 = 7
\ : pour la division entière
8 \ 3 = 2
^ : puissance
2 ^ 4 = 2 * 2 * 2 * 2 = 16
mod : modulo
Le modulo retourne le reste de la division entière d’un nombre par un autre.
25 mod 3 = 1' (car 25 = 3 * 8 + 1)
2. Les opérateurs de chaînes de caractères
& : concaténation
Pour concaténer deux chaînes de caractères entre elles, on utilise le symbole esperluette « & ». À noter que l’opérateur + peut également fonctionner, mais des erreurs peuvent survenir si vous utilisez cet opérateur, car il est déjà utilisé pour les variables numériques.
"Bonjour " & "à tous" = "Bonjour à tous"
3. Les opérateurs de dates
+ : addition
#01/12/2020# + 365 = #01/12/2021#
- : soustraction
#04/10/2016# - 4 = #04/06/2016#
4. Les opérateurs booléens, opérateurs logiques
And : opérateur ET
True And False = False
Or : opérateur OU
True Or False = True
Not : opérateur NON
Not True = False
Xor : opérateur OU EXCLUSIF
Xor permet de déterminer si c’est l’un ou l’autre, mais pas les deux en même temps.
True Xor False = True
False Xor False = False
True Xor True = False
Eqv : opérateur EQUIVALENT
Eqv retourne...
Les procédures
Une procédure est une série d’instructions qui modifie l’environnement mais ne renvoie aucune valeur à la fin. Une procédure peut être directement codée dans un module, mais également attachée à un événement sur un objet Access (formulaire, bouton, etc.). Certaines procédures peuvent être créées automatiquement à partir d’une macro Access ou de l’assistant Access.
Pour notre chien, « Assis » ou « Va au panier » est une procédure.
1. Déclaration d’une procédure
La déclaration d’une procédure en VBA est faite avec le mot-clé Sub selon la syntaxe suivante :
[Private ou Public] Sub Nom_de_Procedure([param_1 As Type_Param, ...])
'Commentaires
Instructions
End Sub
Nom_de_Procedure est le nom de la procédure et param_1 le nom d’un paramètre de type Type_Param. L’expression entre crochets [Private ou Public] signifie que l’on peut ajouter si on le souhaite un des mots-clés Public ou Private, utilisés pour définir le caractère public ou privé de la procédure. Si aucun de ces mots-clés n’est utilisé, la procédure sera publique (Public) par défaut.
Une procédure publique peut être appelée depuis n’importe quel autre emplacement du programme. Une procédure privée ne peut être appelée que depuis une autre procédure (ou fonction) qui se situe dans le même module du programme.
Afin de rendre le code le plus compréhensible pour un utilisateur, il est possible d’ajouter des commentaires. Ces commentaires ne seront pas interprétés par l’ordinateur...
Les fonctions
Une fonction est une série d’instructions qui renvoie une et une seule valeur, soit le résultat d’une expression.
Notre chien est censé nous rapporter une balle si on lui demande « Va chercher la balle ».
1. Déclaration d’une fonction
La déclaration d’une fonction en VBA est faite avec le mot-clé Function selon la syntaxe suivante :
[Private ou Public] Function Nom_Fonction([param_1 As Type_Param, ...])
As Type_Retour
'Commentaires
Instructions
Nom_Fonction = expression
End Function
Nom_Fonction est le nom de la fonction et param_1 le nom d’un paramètre de type Type_Param. Une fonction peut être déclarée avec zéro, un ou plusieurs paramètres. As Type_Retour permet de déterminer le type de valeur qui sera retournée par la fonction. L’expression entre crochets [Private ou Public] signifie que l’on peut ajouter si on le souhaite un des mots-clés Public ou Private, utilisés pour définir le caractère public ou privé de la fonction. Si aucun de ces mots-clés n’est utilisé, la fonction sera publique (Public) par défaut.
Voici un exemple de fonction, Le_Triple, qui prend un entier x en paramètre, et retourne le triple de sa valeur (x*3).
Function Le_Triple (x As Long) As Long
'Fonction retournant la valeur de x fois 3
Le_Triple = x * 3
End Function
Ainsi, étant donné un entier x, la fonction Le_Triple retourne la valeur x * 3, ce qui correspond au triple de x.
2. Appel d’une fonction
Pour exécuter une fonction, il suffit de l’appeler en écrivant son nom suivi des paramètres éventuels séparés...
Passage des paramètres par valeur et par référence
1. Passage des paramètres
Lors de l’appel d’une fonction ou d’une procédure, il arrive parfois que le programme ait besoin d’une information pour fonctionner, comme par exemple la fonction Le_Triple qui a besoin d’avoir la valeur n pour retourner son triple.
Notre chien a besoin de savoir quoi chercher : « va chercher… la balle ».
Les informations qui sont fournies à la procédure ou à la fonction sont nommées des paramètres (on utilise également le mot argument).
La balle est le paramètre pour le chien.
La syntaxe générale de passage d’un paramètre est la suivante :
[Optional] [ByRef ou ByVal] [ParamArray] <nom_parametre> [As Type_Param]
Chacun des mots-clés a un impact sur la nature du paramètre.
a. Les paramètres obligatoires
Lorsqu’un paramètre est obligatoire au programme pour qu’il remplisse sa fonction, la syntaxe est la suivante :
Nom_parametre As Type_Param
Par exemple si l’on reprend la fonction Le_Triple, le paramètre x est obligatoirement fourni pour que la fonction s’exécute :
x as Long
b. Les paramètres facultatifs
Si le paramètre peut être fourni facultativement, il est précédé du mot-clé Optional. Par exemple, une procédure qui doit afficher les nom et prénom d’une personne ainsi que le nom de jeune fille si la personne est une femme s’écrira comme ceci:
Nom As String, Prenom As String, Optional Nom_Jeune_Fille As String
Nom_Jeune_Fille est facultatif, car il peut être omis pour les hommes.
Le chien sait que c’est « dehors » quand on lui dit « on sort ».
Il est ensuite possible de savoir si le paramètre...
Portée et durée de vie des variables
1. La portée
Lorsqu’on déclare et utilise des variables dans un programme, se pose la question de l’accessibilité de ces variables par rapport à l’ensemble du programme. Il existe plusieurs façons de déclarer des variables/constantes. Selon le mot-clé utilisé lors de la déclaration, la variable sera accessible seulement depuis certains points du programme. De la même façon, une variable peut n’être conservée que lors de l’exécution d’une procédure, ou durant toute l’exécution d’un programme.
On définit trois niveaux d’accès possibles :
-
Au niveau d’une procédure ou d’une fonction : il s’agit de toutes les variables déclarées au sein de la procédure ou de la fonction, elles ne sont pas visibles « en dehors » de la procédure ou de la fonction. On utilise les mots-clés Dim et Static.
Pour le chien, il s’agira d’une pièce de la maison.
-
Au niveau d’un module : toutes les procédures et fonctions qui seront déclarées au sein du module auront accès à cette variable. On utilise les mots-clés Dim et Private.
Il s’agira de la maison entière
-
Au niveau de l’ensemble des modules du projet : on utilise le mot-clé Public.
Il s’agira de l’intérieur et l’extérieur de la maison.
Dans l’exemple qui suit, la variable varProc a une portée de niveau procédure, la variable varModulePriv a une portée de niveau module et la variable varModulePublic a une portée de niveau projet.
Public varModulePublic...
Conventions de nommage et typographies du code VBA
Il est vigoureusement préconisé voire impératif de suivre certaines règles de conventions de nommage lorsque l’on rédige un programme en VBA. Ces conventions permettent notamment de faciliter la lecture et la relecture du code. Les sections qui suivent permettent de vous aider à connaître certaines de ces règles.
Les règles qui suivent ne sont pas les seules à pouvoir être utilisées. Chaque entreprise, équipe de développement, développeur peut avoir sa propre nomenclature de nommage. Néanmoins, les nomenclatures les plus fréquentes sont celles exposées dans les sections suivantes.
1. Règle générale
Les noms d’objets, variables, constantes, fonctions et procédures sont assujettis à quelques règles par VBA :
-
Le nom débute par une lettre.
-
Le nom est limité à 255 caractères.
-
Le nom peut être composé de lettres, de chiffres et du caractère souligné (_).
-
Le nom ne peut pas contenir de caractère de ponctuation ni d’espace.
-
Le nom ne peut correspondre à un mot VBA réservé.
-
Le nom doit être unique à l’intérieur d’une même portée.
On ne peut avoir deux Rantanplan dans une pièce, ni deux Milou dans la maison, ni encore deux Snoopy dehors.
Exemples de noms valides
Nom_Client
NomClient
Nom_1_Client
Même si cela n’est pas interdit par VBA, il est clairement déconseillé d’utiliser des caractères accentués, tant pour leur spécificité locale (clavier) que pour leur utilisation ultérieure dans le programme.
On l’appellera Idefix au lieu d’Idéfix.
2. Convention de nommage des objets
D’une manière générale...
Les structures de décision conditionnelle
Lorsque l’on souhaite exécuter du code selon plusieurs alternatives, il faut faire appel aux structures de décision conditionnelle.
Quel panier choisir, le bleu, le jaune ou le rouge ?
1. La structure de test If … Then … End If
a. Conditionnelle unique
En VBA, on utilise la syntaxe suivante :
If Condition_1 Then
Instruction_A
[Else
InstructionB]
End If
Les crochets indiquent que les instructions situées à l’intérieur sont facultatives. Le fonctionnement de cette structure est le suivant :
Si la condition Condition_1 est vérifiée alors l’instruction Instruction_A sera exécutée, sinon l’instruction Instruction_B sera exécutée.
Si le maître est dans le canapé, je choisis le panier rouge.
Par exemple, considérons un programme qui affecte à une variable bMajeur préalablement déclarée la valeur True si la valeur comprise entre 0 et 99 stockée dans une variable Age est strictement supérieure à 17. Le programme s’écrirait ainsi :
If Age > 17 Then
bMajeur = True
Else
bMajeur = False
End If
Ainsi, si la valeur stockée dans la variable Age est strictement supérieure à 17 (c’est-à-dire qu’elle contient une valeur comprise entre 18 et 99), bMajeur vaut True (puisque la personne ayant strictement plus de 17 ans est majeure - majorité française), sinon bMajeur vaut False (puisque la personne ayant de 0 à 17 ans est mineure).
Puisque l’instruction Else est facultative, il aurait également été possible d’écrire le programme précédent de la façon suivante :...
Les boucles
En VBA, lorsque l’on souhaite exécuter à plusieurs reprises la même série d’instructions, plutôt que de recopier n fois les mêmes instructions comme dans l’exemple suivant :
Sub Mauvaise_Methode()
Msgbox "Salut"
Msgbox "Salut"
....
Msgbox "Salut"
End Sub
Il est possible de créer des boucles, qui indiqueront au programme qu’il doit exécuter une série d’instructions à plusieurs reprises. Il existe plusieurs types de boucles, qui sont expliquées dans les sections suivantes.
1. La boucle Do Loop
Il existe plusieurs structures de boucles Do Loop en VBA. À chaque structure sa syntaxe.
a. Do While Loop
La syntaxe est la suivante :
Do While ConditionATester
nstructions
Loop
L’instruction à l’intérieur de la boucle est exécutée tant que la condition ConditionATester est vérifiée.
Le chien voit le facteur et aboie tant qu’il est devant la maison.
b. Do Loop While
La syntaxe est la suivante :
Do
Instructions
Loop While ConditionATester
L’instruction à l’intérieur de la boucle est exécutée une première fois, et de nouveau exécutée tant que la condition ConditionATester est vérifiée.
Le chien aboie, voit le facteur et aboie tant qu’il est devant la maison.
c. Do Until Loop
La syntaxe est la suivante :
Do Until ConditionATester
Instructions
Loop
L’instruction à l’intérieur de la boucle est exécutée jusqu’à ce que la condition ConditionATester soit vérifiée.
Jusqu’à ce que le facteur...
Les entrées-sorties en VBA
Lors de l’exécution d’un programme, il est possible d’interagir avec l’utilisateur au moyen des boîtes de dialogue. Ces boîtes de dialogue permettent au programme d’afficher des informations à l’utilisateur, mais également de lui en demander. Il existe deux fonctions principales qui affichent ces boîtes de dialogue.
1. La fonction InputBox
Cette fonction affiche une boîte de dialogue dans laquelle l’utilisateur peut taper du texte ou cliquer sur un bouton, et la fonction retourne au programme le contenu de la zone de texte sous la forme d’une chaîne de caractères. Cette fonction VBA est déclarée de la façon suivante :
Public Function InputBox( _
ByVal Prompt As String, _
Optional ByVal Title As String = "", _
Optional ByVal DefaultResponse As String = "", _
Optional ByVal Xpos AS Integer = -1, _
Optional ByVal YPos As Integer = -1, _
Optional ByVal HelpFile As String = "", _
Optional Context As Long) As String
Comme vous pouvez le constater à la lecture de la déclaration de cette fonction, bon nombre des paramètres sont facultatifs. Voici à quoi ils correspondent :
Paramètre |
Description |
Prompt |
Correspond au texte qui sera affiché au-dessus de la zone de texte dans laquelle l’utilisateur devra taper son texte. Ce paramètre est obligatoire, limité à 1024 caractères. Il est possible d’étaler le texte sur plusieurs lignes, en insérant des retours chariot (Chr(13) ou vbCrLf) et des sauts de ligne (Chr(10) ou vbLf). |
Title |
Correspond au titre que prendra... |
Les sorties anticipées : instruction Exit
Jusqu’à présent, le code contenu dans les fonctions et les procédures devait s’exécuter jusqu’à arriver à la ligne de sortie de programme (End Function ou End Sub). Il peut être néanmoins utile de pouvoir quitter une fonction ou une procédure avant la fin de son exécution. Il est possible de le faire grâce au mot-clé Exit, suivi du mot-clé qui détermine la portion de code de laquelle le code sortira.
Le chien ayant trouvé son os, arrête de chercher…
Lorsque vous commencez la programmation, nous recommandons de ne pas faire de sortie intempestive dans votre code, car cela peut entraîner des difficultés en cas d’erreurs de conception ou de programmation.
1. Sortie de fonction : Exit Function
Il est possible de sortir d’une fonction avant la fin (End Function). Par exemple dans l’exemple suivant, le programme sortira de la fonction si le paramètre fourni est égal à -2 :
Function SiNonNul(x as Integer) As Boolean
SiNonNul = False
If x = -2 Then
Exit Function
End If
...
End Function
Dans le cas où la variable x passée en paramètre n’est pas égale à -2, le code se poursuit jusqu’à arriver à l’instruction de fin de fonction End Function.
2. Sortie de procédure : Exit Sub
Il est possible de sortir d’une procédure avant la fin End Sub. Par exemple dans l’exemple suivant, le programme sortira de la procédure si le paramètre fourni est une chaîne de caractères vide.
Sub SiNonVide(s as String)
If s = "" Then
Exit Sub
End If
...
End Sub
Dans le cas où la variable s passée...
La gestion d’erreur en VBA
Lorsque l’on débute en programmation, et même lorsqu’on a déjà rédigé plusieurs milliers de lignes de code, il peut arriver que le programme ne soit pas parfaitement codé, et que des erreurs aient lieu lorsqu’on tente de l’exécuter. Il existe plusieurs types d’erreurs, et nous allons expliquer les méthodes qui nous permettent de les éviter.
1. Les types d’erreurs possibles
Lorsque l’on code, il existe plusieurs erreurs possibles qui peuvent être faites à différents niveaux dans le code.
a. Les erreurs de syntaxe
On parle d’erreur de syntaxe lorsque le programme qui est écrit est syntaxiquement incorrect. Ce type d’erreur est souvent directement détectée par VBE et la ligne se colore en rouge (ou dans la couleur choisie dans les options, voir la section Les options VBE - Format de l’éditeur du chapitre VBE et la sécurité Access 2021). Pour que cette détection automatique se fasse, il faut cocher la case Vérification automatique de la syntaxe dans les options VBE (voir la section Les options VBE - Éditeur du chapitre VBA et la sécurité Access 2021). Les erreurs de syntaxe peuvent être dues à l’oubli de mots ou à la mauvaise écriture de mots.
Exemples d’erreurs
Le code suivant génère une erreur car le mot-clé Then est oublié.
Sub AbsenceMotCleThen()
Dim a As Integer
'la ligne suivante est incomplète,
le mot-clé Then ayant été oublié
If a=3
a = a - + 5
End If
End Sub
Le code suivant génère...