|
GESTION DES ERREURS
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.
- 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.
Le principe de fonctionnement d'un gestionnaire d'erreur fonctionne ainsi
:
Sub MaProcédure()
On Error GoTo GestionErreur
Exit Sub
GestionErreur:
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.
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
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
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
Application.Cursor = xlDefault
End Sub
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
Exit Sub
GestionErreur:
If Err.Number = 1000 Then
Resume Next
End if
MsgBox Err.Description, vbOkOnly, "ERREUR"
Application.ScreenUpdating = True
Application.Cursor = xlDefault
End Sub
|