Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !

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...