Des erreurs peuvent parfois apparaître lors de l’exécution d’un code VBA. Si vous ne mettez pas en place un gestionnaire d’erreur, une boîte de dialogue peu esthétique stoppera net le fonctionnement du programme.
Mise en place d’un gestionnaire d’erreurs
Pour définir un gestionnaire d’erreurs dans une procédure, vous utiliserez une instruction On Error GoTo. Voici un exemple de code :
Sub uneProcedure() On Error GoTo gestionErreurs Dim a As Integer a = 1 / 0 gestionErreurs: MsgBox "Erreur n° " & Err.Number & vbLf & Err.Description End Sub
Et voici le résultat :
Ici, on tente d’affecter la valeur 1/0 à la variable Integer a. Ce qui produit une erreur 11 : Division par zéro.
Annulation du gestionnaire d’erreurs
A tout moment, vous pouvez désactiver le gestionnaire d’erreur mis en place par une instruction On Error GoTo. Pour cela, il suffit d’utiliser cette instruction :
On Error GoTo 0
Examinez ce code :
Sub uneProcedure() On Error GoTo gestionErreurs Dim a As Integer a = 1 / 0 gestionErreurs: MsgBox "Erreur n° " & Err.Number & vbLf & Err.Description On Error GoTo 0 a = 2 / 0 End Sub
La première division par zéro provoque l’exécution du gestionnaire d’erreurs. Ce dernier :
- affiche un message d’erreur ;
- désactive le gestionnaire d’erreur ;
- lance intentionnellement une instruction qui provoque une erreur.
Voici le résultat :
Le deuxième message d’erreur est beaucoup moins engageant que le premier !
Reprise de l’exécution
Placée dans le gestionnaire d’erreurs, l’instruction Resume reprend l’exécution sur l’instruction qui a provoqué une erreur.
Examinez ce code :
Sub uneProcedure() On Error GoTo gestionErreurs Dim a As Integer a = InputBox("Entrez un entier") End gestionErreurs: MsgBox "Vous devez saisir un entier" Resume End Sub
Ici, la saisie de l’utilisateur est affectée à une variable de type Integer. Si l’utilisateur n’entre pas un nombre entier, une erreur se produira, et le gestionnaire d’erreurs sera exécuté.
Dans ce cas, un message d’erreur demandant à l’utilisateur de saisir un entier sera affiché et l’instruction Resume provoquera la réexécution de la ligne :
a = InputBox("Entrez un entier")
Si l’utilisateur entre un nombre entier, l’instruction qui suit le InputBox() sera exécutée et la procédure se terminera.
Poursuite de l’exécution
Plutôt que d’indiquer un gestionnaire d’erreurs dans l’instruction On Error GoTo, vous pouvez demander d’ignorer l’erreur et d’exécuter la ligne suivante :
On Error Resume Next
Par exemple, pour tester si la feuille « F3 » existe dans le classeur courant, vous pourriez utiliser ce code :
Sub uneProcedure() Dim feuille As Worksheet On Error Resume Next Set feuille = Worksheets("F3") If feuille Is Nothing Then MsgBox "La feuille ""F3"" n'existe pas" Else MsgBox "La feuille ""F3"" existe" End If End Sub
L’instruction
On Error Resume Next
fait en sorte que le code ne s’arrête pas sur une erreur d’exécution. L’erreur est purement et simplement ignorée et l’exécution se poursuit sur la ligne suivante.
L’instruction
Set feuille = Worksheets("F3")
tente d’affecter à la variable feuille la feuille F3. Si cette feuille n’existe pas, l’erreur est ignorée (grâce à l’instruction On Error Resume Next) et l’instructions suivante s’exécute.
Ici, on teste si la variable feuille fait ou ne fait pas référence à une feuille :
If feuille Is Nothing Then Else End If
Selon le résultat du test, un message ou un autre est affiché avec une instruction MsgBox().
Je cherche un code vba pour fermer l’application dans le cas d’une erreur d’execution