Erreurs VBA
La gestion des erreurs en VBA
Ajouter un gestionnaire d'erreur
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)
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"
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
Code de gestion d'erreur
A positionner après l'étiquette GestionErreurErr.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)
5 représente ci-dessus le numéro d'erreur.
Erreur connue
Pour gérer une erreur que vous connaissez mais ne pouvez éviter, écrivez un code du type :
... 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
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
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
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
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
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