VBA On Error – Meilleures Pratiques de Gestion des Erreurs
In this Article
Aide-Mémoire sur les Erreurs VBA
Erreurs
Voir d’autres « Aide-Mémoires » VBA et des téléchargements PDF gratuits
Gestion des Erreurs VBA
La gestion des erreurs en VBA désigne le processus d’anticipation, de détection et de résolution des erreurs d’exécution VBA. Le processus de gestion des erreurs VBA intervient lors de l’écriture du code, avant que les erreurs ne se produisent réellement.
Les erreurs d’exécution VBA sont des erreurs qui se produisent pendant l’exécution du code. Voici quelques exemples d’erreurs d’exécution :
- Référence à un classeur, une feuille de calcul ou un autre objet inexistant (Erreur d’exécution 1004)
- Données non valides, par exemple référence à une cellule Excel contenant une erreur (Incompatibilité de type – Erreur d’exécution 13)
- Tentative de division par zéro
Déclaration VBA On Error
La plupart des traitements des erreurs en VBA sont effectués avec l’instruction On Error. L’instruction On Error indique à VBA ce qu’il doit faire s’il rencontre une erreur. Il existe trois instructions On Error:
- On Error GoTo 0
- On Error Resume Next
- On Error GoTo Ligne
On Error GoTo 0
On Error GoTo 0 est le paramètre par défaut de VBA. Vous pouvez restaurer ce paramètre par défaut en ajoutant la ligne de code suivante :
On Error GoTo 0
Lorsqu’une erreur se produit avec On Error GoTo 0, VBA arrête l’exécution du code et affiche sa boîte de messages d’erreur standard.
Souvent, vous ajouterez un On Error GoTo 0 après avoir ajouté la gestion des erreurs On Error Resume Next (section suivante) :
Sub ErreurGoTo0()
On Error Resume Next
ActiveSheet.Shapes("Bouton_Démarrer").Delete
On Error GoTo 0
' Suite du code ici
End Sub
On Error Resume Next
On Error Resume Next indique à VBA d’ignorer toute ligne de code contenant des erreurs et de passer à la ligne suivante.
On Error Resume Next
Remarque : On Error Resume Next ne corrige pas une erreur et ne la résout d’aucune manière. Il indique simplement à VBA de procéder comme si la ligne de code contenant l’erreur n’existait pas. Une utilisation incorrecte de On Error Resume Next peut avoir des conséquences inattendues.
L’utilisation de On Error Resume Next est particulièrement utile lorsque vous travaillez avec des objets qui peuvent ou non exister. Par exemple, vous voulez écrire un code qui supprimera une forme, mais si vous exécutez le code alors que la forme est déjà supprimée, VBA émettra une erreur. Au lieu de cela, vous pouvez utiliser On Error Resume Next pour indiquer à VBA de supprimer la forme si elle existe.
On Error Resume Next
ActiveSheet.Shapes("Bouton_Démarrer").Delete
On Error GoTo 0
Remarquez que nous avons ajouté On Error GoTo 0 après la ligne de code contenant l’erreur potentielle. Cela réinitialise la gestion des erreurs.
Dans la section suivante, nous vous montrerons comment tester si une erreur s’est produite en utilisant Err.Number, ce qui vous donnera des options de gestion des erreurs plus avancées.
Err.Number, Err.Clear, et la Capture des Erreurs
Au lieu de simplement sauter une ligne contenant une erreur, nous pouvons attraper l’erreur en utilisant On Error Resume Next et Err.Number.
Err.Number renvoie un numéro d’erreur correspondant au type d’erreur détecté. S’il n’y a pas d’erreur, Err.Number = 0.
Par exemple, cette procédure renvoie « 11 » parce que l’erreur qui se produit est l’erreur d’exécution ’11’.
Sub Exemple_Num_Erreur()
On Error Resume Next
ActiveCell.Value = 2 / 0
MsgBox Err.Number
End Sub
Gestion des Erreurs avec Err.Number
La véritable puissance de Err.Number réside dans sa capacité à détecter si une erreur s’est produite (Err.Number <> 0). Dans l’exemple ci-dessous, nous avons créé une fonction qui va tester si une feuille existe en utilisant Err.Number.
Sub Test_Gestion_Erreur()
MsgBox FeuilleExiste("test")
End Sub
Function FeuilleExiste(nomFeuille As String) As Boolean
Dim fc As Worksheet
On Error Resume Next
Set fc = Sheets(nomFeuille)
'Si erreur fc n'existe pas
If Err.Number <> 0 Then
FeuilleExiste = False
Else
FeuilleExiste = True
End If
On Error GoTo -1
End Function
Note : Nous avons ajouté un On Error GoTo -1 à la fin qui remet Err.Number à 0 (voir deux sections plus bas).
Avec On Error Resume Next et Err.Number, vous pouvez reproduire la fonctionnalité « Try » et « Catch » d’autres langages de programmation.
On Error GoTo « Ligne »
On Error GoTo « Ligne » indique à VBA d’aller à une ligne de code étiquetée lorsqu’une erreur est rencontrée. Vous déclarez l’instruction Go To comme suit (où gestionErreur est l’étiquette de la ligne à atteindre) :
On Error GoTo gestionErreur
et créez une étiquette de ligne comme ceci :
gestionErreur:
Remarque : il s’agit de la même étiquette que celle que vous utiliseriez avec une instruction GoTo VBA normale.
Ci-dessous, nous allons démontrer l’utilisation de On Error GoTo « Ligne » pour sortir d’une procédure.
On Error Exit Sub
Vous pouvez utiliser On Error GoTo Ligne pour quitter une sous-procédure lorsqu’une erreur se produit.
Vous pouvez le faire en plaçant l’étiquette de la ligne de gestion des erreurs à la fin de votre procédure :
Sub ErrGotoFin()
On Error GoTo finProc
' Votre code
finProc:
End Sub
ou en utilisant la commande Exit Sub :
Sub ErrGotoFinProc()
On Error GoTo finProc
' Du code
GoTo sauterSortie
finProc:
Exit Sub
sauterSortie:
' Plus de code
End Sub
Err.Clear, On Error GoTo -1, et Réinitialiser Err.Number
Après la gestion d’une erreur, vous devez généralement effacer l’erreur pour éviter les problèmes futurs de gestion des erreurs.
Après qu’une erreur se soit produite, Err.Clear et On Error GoTo -1 peuvent être utilisés pour remettre Err.Number à 0. Mais il y a une différence très importante : Err.Clear ne réinitialise pas l’erreur elle-même, mais uniquement le numéro d’erreur.
Qu’est-ce que cela signifie ? En utilisant Err.Clear, vous ne pourrez pas modifier le paramètre de traitement des erreurs. Pour voir la différence, testez ce code et remplacez On Error GoTo -1 par Err.Clear:
Sub ExemplesGestionErreurs()
On Error GoTo gestionErreur:
' Erreur "Définie par l'Application"
Error (13)
Exit Sub
gestionErreur:
' Effacer l'erreur
On Error GoTo -1
On Error GoTo gestionErreur2:
'Erreur "Incompatibilité de Type"
Error (1034)
Exit Sub
gestionErreur2:
Debug.Print Err.Description
End Sub
Typiquement, je recommande de toujours utiliser On Error GoTo -1, sauf si vous avez une bonne raison d’utiliser Err.Clear à la place.
VBA On Error MsgBox
Vous pouvez également vouloir afficher une boîte de message en cas d’erreur. Cet exemple affichera différentes boîtes de message selon l’endroit où l’erreur se produit :
Sub ExempleMessagesErreur()
Dim msgErr As String
On Error GoTo gestionErreur
'Phase 1
msgErr = "Une erreur s'est produite lors de l'étape de copier-coller"
'Err.Raise (11)
'Stage 2
msgErr = "Une erreur s'est produite lors de l'étape de validation des données"
'Err.Raise (11)
'Stage 3
msgErr = "Une erreur s'est produite au cours de l'étape de construction et de copie des comptes de résultat"
Err.Raise (11)
'Stage 4
msgErr = "Une erreur s'est produite lors de la tentative d'enregistrement de l'importation sur la page de configuration"
'Err.Raise (11)
GoTo finProc
gestionErreur:
MsgBox msgErr
finProc:
End Sub
Ici, vous devez remplacer Err.Raise(11) par votre code.
VBA IsError
Une autre façon de gérer les erreurs consiste à les tester à l’aide de la fonction VBA ISERROR. La fonction ISERROR teste une expression pour détecter les erreurs et renvoie VRAI ou FAUX si une erreur se produit.
Sub ExempleIsError()
MsgBox IsError(Range("a7").Value)
End Sub
If Error VBA
Vous pouvez également traiter les erreurs en VBA avec la fonction IFERROR d’Excel. Pour accéder à la fonction IFERROR, il faut utiliser la classe WorksheetFunction:
Sub ExempleIfError()
Dim n As Long
n = WorksheetFunction.IfError(Range("a10").Value, 0)
MsgBox n
End Sub
La valeur de la plage A10 sera affichée. Si la valeur est une erreur, elle sera remplacée par 0.
Types d’Erreurs VBA
Erreurs d’Exécution
Comme indiqué ci-dessus : Les erreurs d’exécution VBA sont des erreurs qui se produisent pendant l’exécution du code. Voici quelques exemples d’erreurs d’exécution :
- Référence à un classeur, une feuille de calcul ou un autre objet inexistant
- Données non valides, par exemple, référence à une cellule Excel contenant une erreur
- Tentative de division par zéro
Vous pouvez « gérer les erreurs » d’exécution à l’aide des méthodes présentées ci-dessus.
Erreurs de Syntaxe
Les erreurs de syntaxe VBA sont des erreurs d’écriture du code. Voici quelques exemples d’erreurs de syntaxe :
- Erreur d’orthographe
- Ponctuation manquante ou incorrecte
L’éditeur VBA identifie de nombreuses erreurs de syntaxe par une surbrillance rouge :
L’éditeur VBA dispose également d’une option de « contrôle syntaxique automatique » :
Lorsque cette option est cochée, l’éditeur VBA génère une boîte de messages vous avertissant des erreurs de syntaxe après la saisie d’une ligne de code :
Personnellement, je trouve cela extrêmement ennuyeux et je désactive cette fonction.
Erreurs de Compilation
Avant d’essayer d’exécuter une procédure, VBA « compile » la procédure. La compilation transforme le programme du code source (que vous pouvez voir) en forme exécutable (que vous ne pouvez pas voir).
Les erreurs de compilation VBA sont des erreurs qui empêchent le code de se compiler.
Un bon exemple d’erreur de compilation est une déclaration de variable manquante :
D’autres exemples sont :
- For sans Next
- Select sans End Select
- If sans End If
- Appel d’une procédure qui n’existe pas
Les erreurs de syntaxe (section précédente) sont un sous-ensemble des erreurs de compilation.
Débogage > Compiler
Les erreurs de compilation apparaissent lorsque vous tentez d’exécuter une procédure. Mais l’idéal serait d’identifier les erreurs de compilation avant de tenter d’exécuter la procédure.
Vous pouvez le faire en compilant le projet à l’avance. Pour ce faire, allez dans Debogage > Compiler VBAProject.
Le compilateur se rendra à la première erreur. Une fois cette erreur corrigée, compilez à nouveau le projet. Répétez l’opération jusqu’à ce que toutes les erreurs soient corrigées.
Vous pouvez savoir que toutes les erreurs sont corrigées parce que l’option Compiler le projet VBA est grisée :
Erreur OverFlow
L’erreur VBA dépassement de capacité (Overflow) se produit lorsque vous tentez de placer une valeur dans une variable qui est trop grande. Par exemple, les variables entières ne peuvent contenir que des valeurs comprises entre -32,768 et 32,768. Si vous entrez une valeur plus grande, vous recevrez une erreur de dépassement de capacité:
Vous devez plutôt utiliser la variable Long pour stocker le plus grand nombre.
Autres Termes d’Erreur VBA
Erreur de Saisie en VBA
Contrairement à d’autres langages de programmation, il n’existe pas d’instruction « Catch » en VBA. Cependant, vous pouvez reproduire une instruction Catch en utilisant On Error Resume Next et If Err.Number <> 0 Then. Ceci est traité ci-dessus dans la section Gestion des Erreurs avec Err.Number.
Ignorer les Erreurs en VBA
Pour ignorer les erreurs en VBA, il suffit d’utiliser l’instruction On Error Resume Next
On Error Resume Next
Cependant, comme mentionné ci-dessus, vous devez être prudent en utilisant cette instruction car elle ne corrige pas une erreur, elle ignore simplement la ligne de code contenant l’erreur.
Lancer une Erreur en VBA / Err.Raise
Pour lancer une erreur en VBA, vous utilisez la méthode Err.Raise. Cette ligne de code lèvera l’erreur d’exécution ’13’ : Type mismatch :
Err.Raise (13)
Piégeage d’Erreurs VBA
Le piégeage d’erreurs VBA ou « Trapping » est un autre terme pour la gestion des erreurs VBA.
Message d’erreur VBA
Un message d’erreur VBA ressemble à ceci :
Lorsque vous cliquez sur « Déboguer », vous voyez la ligne de code qui provoque l’erreur :
Gestion des Erreurs en VBA dans une Boucle
La meilleure façon de gérer les erreurs dans une boucle est d’utiliser On Error Resume Next avec Err.Number pour détecter si une erreur s’est produite (n’oubliez pas d’utiliser Err.Clear pour effacer l’erreur après chaque occurrence).
L’exemple ci-dessous divise deux nombres (colonne A par colonne B) et affiche le résultat dans la colonne C. S’il y a une erreur, le résultat sera 0.
Sub test()
Dim cell As Range
On Error Resume Next
For Each cell In Range("a1:a10")
'Défini la valeur de la cellule
cell.Offset(0, 2).Value = cell.Value / cell.Offset(0, 1).Value
'Si la valeur Cell.Value contient une erreur, alors inscrit 0
If Err.Number <> 0 Then
cell.Offset(0, 2).Value = 0
Err.Clear
End If
Next
End Sub
Traitement des Erreurs VBA en Access
Tous les exemples ci-dessus fonctionnent exactement de la même manière en Access VBA et en Excel VBA.
Function SupprimerEntrée(frm As Form)
'Cette fonction est utilisée pour supprimer un enregistrement dans une table à partir d'un formulaire
On Error GoTo fin
With frm
If .NewRecord Then
.Undo
Exit Function
End If
End With
With frm.RecordsetClone
.Bookmark = frm.Bookmark
.Delete
frm.Requery
End With
Exit Function
fin:
End
End Function