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
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
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
End Function
Module Complémentaire d'Exemples de Code VBA
Accédez facilement à tous les exemples disponibles sur le site.
Naviguez simplement dans le menu, cliquez, et le code sera inséré directement dans votre module. Module complémentaire .xlam.
(Aucune installation requise!)
Free Download
Qu'est-ce que AutoMacro?
AutoMacro est un module complémentaire pour VBA qui s'installe directement dans l'éditeur Visual Basic. Il est doté de générateurs de code, d'une vaste bibliothèque de codes, il permet de créer votre propre bibliothèque de codes et de nombreux autres outils et utilitaires permettant de gagner du temps et d'ajouter des fonctionnalités indispensables à l'éditeur VBA obsolète.
En Savoir Plus