Easy-Micro


ESPACEMEMBRE VBA
Erreurs VBA

La gestion des erreurs en VBA

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.

• 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 endroits.
• L'instruction Exit qui permet de sortir d'une procédure immédiatement.

Pour afficher la description d'une erreur, dans la fenétre exécution saisissez : ?Error(numéro_d_erreur). Exemple : ?Error(5)

VBA Principe de fonctionnement d'un gestionnaire d'erreur

Sub proc_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 :
• On Error GoTo NomEtiquette
En cas d'erreur le code suivant l'étiquette NomEtiquette est exécutée. 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.

Exemple de suppression d'une barre d'outils qui n'existe pas:
Sub proc_testerreur()

On Error GoTo gestionderreur

CommandBars("MaBarre").Delete

Exit Sub
gestionderreur:
MsgBox "HUSTON...?", vbOKOnly, "ERREUR"

End Sub


VBA Code de gestion d'erreur
(après l'étiquette GestionErreur: )
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.

Dans le fenêtre "Exécution" (menu Affichage/Fenêtre Exécution) saisissez :
?error(5)
ou 5 représente le numéro d'erreur.

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

If Err.Number = 7 Then
MsgBox "Mémoire insuffisante"
'ici le renvoi au code normal ou sortie comme "Resume Next"
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

Erreur inconnue
Pour gérer les erreurs que vous n'avez pu détecter:

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

Exemple:
Sub proc_EssaiErreur()
On Error GoTo GestionErreur
Dim N As Byte

'Remplissage de la plage A1:A10
For N = 1 To -1 ' -1 pour une erreur volontaire
Range("A" & N) = N
Next
Exit Sub
GestionErreur:
'If Err.Number = 6 Then ' à rajouter après
MsgBox Err.Description, vbOKOnly, "ERREUR"
'End If ' à rajouter après
End Sub

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

Sub proc_MaProcédure()
On Error GoTo GestionErreur
'début du code
'....
'Fin du code
Exit Sub
GestionErreur:
If Err.Number = 7 Then
'ici votre correction
Resume Next
End if
MsgBox Err.Description, vbOkOnly, "ERREUR"
Application.ScreenUpdating = True
Application.Cursor = xlDefault
End Sub

Pour afficher la description d'une erreur, dans la fenêtre exécution saisissez : ?Error(numéro_d_erreur). Exemple : ?Error(5)

Récupérer le numéro de ligne d'une erreur (implique de saisir les numéros de ligne dans le code):
Sub proc_Un_exemple()
On Error GoTo GestionErreur

10: Range("A10").Value = "titi"

Exit Sub
GestionErreur:
MsgBox "Numéro d'erreur : " & Err.Number & Chr(10) & "Numéro de ligne : " & Erl & "Description : " & Err.Description, vbOkOnly, "ERREUR"
End Sub

Note : la fonction Erl est une fonction non référencée.

Exemple de gestion d'erreur de type #N/A (sur bouton rechercher d'un formulaire)
Dim str_mavariable As String

Private Sub btn_recherche_Click()
Workbooks.Open ("test.xlsx")
Sheets(2).Select
str_mavariable = champ_de_formulaire.Value
Range("Z1").Value = "=VLOOKUP(""" & str_mavariable & """,A2:B5,2,0)"

If Application.WorksheetFunction.IsNA([Z1]) = True Then
MsgBox "Pas de valeur"
Else
MsgBox "Une valeur trouvé : " & Range("Z1").Value
End If
End Sub



Suivez les aventures des skippers aquitains sur EasyVoile.com
Flux RSS Easy-Micro - Abonnez-vous Easy-Micro [ François Bisch ]
Lundi 18 mars 2019 - Semaine 12 - Saint Cyrille de Jérusalem (Demain: Saint Joseph)
Aujourd'hui, c'est l'anniversaire de Luc Besson (1959-60 ans), réalisateur et producteur français, de Xavier Deluc (1958), acteur français et de Laetitia Hallyday (1975). Autre 18 mars: 1314 : supplice de Jacques de Molay, grand maître des Templiers.
Haut de page Easy-Micro