Médiaforma

VBA Excel – Gestion d’erreurs en VBA

Partagez cet article sur vos réseaux

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

 
Commentaires

Je cherche un code vba pour fermer l’application dans le cas d’une erreur d’execution

Bonjour,

voici ci-dessous :

Sub uneProcedure()

On Error GoTo stop

stop :

ActiveWorkbook.Close

End sub

Cordialement,

Merci pour l’astuce On Error Resume Next

Trackbacks for this post

Laissez un commentaire