添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
"AutoMacro is the best purchase I have made in a long time. This has helped me streamline work processes, making much of what I do much more efficient..."
Cynthia R.
May 22, 2021

Return to VBA Code Examples

VBA On Error – Meilleures Pratiques de Gestion des Erreurs

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 :

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