CathyAstuce

VBA

GEMCCAP CONSEIL INFORMATIQUE BUREAUTIQUE
Formation - Conception Sites Internet
Applications Informatiques Personnalisées
Communauté partenaire Microsoft

GESTION DES ERREURS

Pourquoi ? Éléments mis à votre disposition Gestionnaire d'erreurs

Remonter I. Pourquoi ?

Lorsqu'une erreur survient, un message s'affiche, celui-ci est difficile de compréhension pour l'utilisateur, mais de plus la procédure s'interromps, ce qui peut poser de gros problème pour votre application. Par exemple, une feuille de classeur est protégée, votre procédure déprotège la feuille, modifie des données puis normalement reprotège cette feuille. Mais si votre procédure contient une erreur, votre feuille peut rester déprotégée et l'utilisateur peut alors la modifier à volonté. Autre exemple, votre procédure affiche le curseur de travail pendant son exécution, mais si une erreur survient le curseur normal ne revient pas, ce qui peut perturber l'utilisateur.
Pour éviter ce type d'inconvénient, vous devez :
  • tout d'abord tester votre code le plus possible pour les corriger, en utilisant tous les moyens expliqués dans le chapitre Débogage. Vous pourrez ainsi ajouté le code adéquat pour éviter une erreur, par exemple interdire une division si le diviseur est égal à 0.
  • mais VBA vous permet également de détecter les erreurs et d'effectuer certaines actions pour y remédier.

En ajoutant un gestionnaire d'erreurs, vous pourrez soit remplacer les messages d'erreurs peut explicite pour l'utilisateur, soit remettre l'application en état de travail correct (reprotéger une feuille, un document, remettre le curseur en état normal, etc...), soit corriger l'erreur puis reprendre le cours de votre procédure.

Remonter II. Éléments mis à votre disposition

  • L'instruction On Error permet de créer un gestionnaire d'erreur, elle se déclenche lorsqu'une erreur survient.
  • L'objet Err qui contient des propriétés sur l'erreur qui vient de se produire, dont la propriété Number qui donne le numéro d'erreur et la propriété Description qui donne le texte standard de description de cette erreur.
  • L'instruction Resume qui permet de reprendre le code à différents endroit.
  • L'instruction Exit qui permet de sortir d'une procédure immédiatement.

Remonter III. Gestionnaire d'erreurs

Le principe de fonctionnement d'un gestionnaire d'erreur fonctionne ainsi :

Sub MaProcédure()
     On Error GoTo GestionErreur
     'début du code
     '....
     'Fin du code

     Exit Sub
GestionErreur:
     'code de gestion d'erreur
     'avec retour dans le code après gestion ou sortie de la procédure

End Sub

L'instruction On Error permet de déclencher une action selon le paramètre ajouté et ne concerne que la procédure dans laquelle elle est inscrite. :
Instruction Action
On Error GoTo NomEtiquette En cas d'erreur le code suivant l'étiquette NomEtiquette est exécuté.
Pour mettre une étiquette dans le code, tapez son nom suivi du caractère de ponctuation deux-points (:), puis tapez votre code sur la ligne suivante.
On Error Resume Next En cas d'erreur le code continu sur la ligne suivante et donc ignore l'erreur mais attention aux conséquences
On Error GoTo 0 désactive le traitement des erreurs.

Cette instruction peut être utilisée autant de fois que vous le voulez dans une procédure.
Il est important de même l'instruction Exit Sub ou Exit Function avant l'étiquette indiquant le début du code pour les erreurs, sinon votre procédure exécute ses lignes automatiquement.

Le code qui suit l'étiquette débutant la gestion d'erreur (dans l'exemple ci-dessus :  GestionErreur) va vous permettre de vérifier quel est l'erreur et d'agir en conséquence.

  • Err.Number vous donne le numéro d'erreur, celui qui s'affiche dans une fenêtre vous proposant le débogage, si "On Error GoTo NomEtiquette" n'existe pas.
  • Err.Description vous donne le texte correspondant à l'erreur.

Remonter III.1 Erreur connue

Pour gérer une erreur que vous connaissez mais ne pouvez éviter, écrivez un code du type (1000 est un numéro d'erreur bidon) :

     Exit Sub
GestionErreur:
    If Err.Number = 1000 Then
     'ici votre correction
     'ici le renvoi au code normal ou sortie

    End if
End Sub

Pour retourner dans le code normal, vous pouvez utiliser :

  • Resume qui renvoie sur la ligne d'instruction qui a provoqué l'erreur
  • Resume Next qui renvoie sur la ligne d'instruction qui suit celle qui a provoqué l'erreur

Remonter III.2 Erreur inconnue

Pour gérer les erreurs que vous n'avez pu détecter, utilisez le code suivant :

     Exit Sub
GestionErreur:
    MsgBox Err.Description, vbOkOnly, "ERREUR"
    Application.ScreenUpdating = True 'pour remettre l'affichage à jour si vous l'avez désactivé
    Application.Cursor = xlDefault 'pour remettre le curseur par défaut si vous l'avez modifié
End Sub

Remonter III.3 Toutes les erreurs

Avec un code de ce type vous avez une procédure gérant l'ensemble des erreurs.

Sub MaProcédure()
     On Error GoTo GestionErreur
     'début du code
     '....
     'Fin du code

     Exit Sub
GestionErreur:
    If Err.Number = 1000 Then
         'ici votre correction
    Resume Next
    End if
    MsgBox Err.Description, vbOkOnly, "ERREUR"
    Application.ScreenUpdating = True 'pour remettre l'affichage à jour si vous l'avez désactivé
    Application.Cursor = xlDefault 'pour remettre le curseur par défaut si vous l'avez modifié
End Sub

AccueilDébut de la page