VBA On Error – Meilleures Pratiques de Gestion des Erreurs

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

David Gagnon

Last updated on janvier 12, 2022

Aide-Mémoire sur les Erreurs VBA

Erreurs

Description
Code VBA
On Error – Arrête le code et affiche l’erreur
On Error Goto 0
On Error – Ignorer l’erreur et poursuivre l’exécution
On Error Resume Next
On Error – Accéder à une ligne de code [Étiquette]
On Error Goto [Étiquette]
Efface (Réinitialise) l’erreur
On Error GoTo -1
Afficher le numéro de l’erreur
MsgBox Err.Number
Afficher la description de l’erreur
MsgBox Err.Description
Fonction permettant de générer sa propre erreur
Err.Raise

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 :

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
vba-free-addin

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!)

Téléchargement gratuit

Retour aux exemples de code VBA