VBA en cas d'erreur - Bonnes pratiques de gestion des erreurs

Aide-mémoire sur les erreurs VBA

les erreurs

La descriptionCode VBAEn cas d'erreur - Code d'arrêt et erreur d'affichageEn cas d'erreur Aller à 0En cas d'erreur - Ignorer l'erreur et continuer l'exécutionEn cas d'erreur Reprendre ensuiteEn cas d'erreur - Aller à une ligne de code [Libellé]En cas d'erreur Aller à [Étiquette]Efface (réinitialise) l'erreurEn cas d'erreur GoTo -1Afficher le numéro d'erreurNuméro d'erreur MsgBoxAfficher la description de l'erreurMsgBox Err.DescriptionFonction pour générer sa propre erreurErr.Augmenter

Voir plus de "Cheat Sheets" VBA et des téléchargements PDF gratuits

Gestion des erreurs VBA

Gestion des erreurs VBA fait référence au processus d'anticipation, de détection et de résolution des erreurs d'exécution VBA. Le processus de gestion des erreurs VBA se produit lors de l'écriture du code, avant que des erreurs ne se produisent réellement.

Erreurs d'exécution VBA sont des erreurs qui se produisent lors de l'exécution du code. Voici des exemples d'erreurs d'exécution :

  • Référencement d'un classeur, d'une feuille de calcul ou d'un autre objet inexistant
  • Données invalides ex. référencement d'une cellule Excel contenant une erreur
  • Tenter de diviser par zéro

VBA en cas d'erreur

La plupart des traitements d'erreurs VBA sont effectués avec le En cas d'erreur. L'instruction On Error indique à VBA quoi faire s'il rencontre une erreur. Il ya trois Sur les déclarations d'erreur:

  • En cas d'erreur GoTo 0
  • En cas d'erreur Reprendre ensuite
  • En cas d'erreur GoTo Ligne

En cas d'erreur GoTo 0

En cas d'erreur 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 :

1 En cas d'erreur GoTo 0

Lorsqu'une erreur se produit avec En cas d'erreur GoTo 0, VBA arrêtera d'exécuter le code et affichera sa boîte de message d'erreur standard.

Souvent, vous ajouterez un En cas d'erreur GoTo 0 après avoir ajouté En cas d'erreur Reprendre ensuite gestion des erreurs (section suivante) :

123456789 Sous-erreurGoTo0()En cas d'erreur Reprendre ensuiteActiveSheet.Shapes("Start_Button").SupprimerEn cas d'erreur GoTo 0'Exécuter plus de codeFin du sous-marin

En cas d'erreur Reprendre ensuite

En cas d'erreur Reprendre ensuite indique à VBA d'ignorer toutes les lignes de code contenant des erreurs et de passer à la ligne suivante.

1 En cas d'erreur Reprendre ensuite

Noter: En cas d'erreur Reprendre ensuite ne corrige pas une erreur, ni ne la résout autrement. Il indique simplement à VBA de procéder comme si la ligne de code contenant l'erreur n'existait pas. Utilisation inappropriée de En cas d'erreur Reprendre ensuite peut entraîner des conséquences inattendues.

Un bon moment à utiliser En cas d'erreur Reprendre ensuite est lorsque vous travaillez avec des objets qui peuvent ou non exister. Par exemple, vous souhaitez écrire du code qui supprimera une forme, mais si vous exécutez le code alors que la forme est déjà supprimée, VBA générera une erreur. Au lieu de cela, vous pouvez utiliser En cas d'erreur Reprendre ensuite pour dire à VBA de supprimer la forme si elle existe.

123 En cas d'erreur Reprendre ensuiteActiveSheet.Shapes("Start_Button").SupprimerEn cas d'erreur GoTo 0

Remarquez que nous avons ajouté En cas d'erreur GoTo 0 après la ligne de code contenant l'erreur potentielle. Cela réinitialise la gestion des erreurs.

Dans la section suivante, nous allons vous montrer comment tester si une erreur s'est produite en utilisant Numéro d'erreur, vous offrant des options de gestion des erreurs plus avancées…

Err.Number, Err.Clear et capture d'erreurs

Au lieu de simplement sauter une ligne contenant une erreur, nous pouvons détecter l'erreur en utilisant En cas d'erreur Reprendre ensuite et Numéro d'erreur.

Numéro d'erreur renvoie un numéro d'erreur correspondant au type d'erreur détecté. S'il n'y a pas d'erreur, Numéro d'erreur = 0.

Par exemple, cette procédure renverra « 11 » car l'erreur qui se produit est Erreur d'exécution '11'.

1234567 Sous-numéro d'erreur_ex()En cas d'erreur Reprendre ensuiteActiveCell.Valeur = 2 / 0Numéro d'erreur MsgBoxFin du sous-marin

Gestion des erreurs avec Err.Number

Le vrai pouvoir de Numéro d'erreur réside dans la capacité à détecter si une erreur s'est produite (Numéro d'erreur 0). Dans l'exemple ci-dessous, nous avons créé une fonction qui testera si une feuille existe en utilisant Err.Number.

12345678910111213141516171819 Sous-testWS()MsgBox DoesWSExist("test")Fin du sous-marinFonction DoesWSExist(wsName As String) As BooleanDim ws As Feuille de calculEn cas d'erreur Reprendre ensuiteDéfinir ws = Sheets(wsName)'Si l'erreur WS n'existe pasSi Err.Numéro 0 AlorsDoesWSExist = FalseAutreEst-ce queWSExist = TrueFin siEn cas d'erreur GoTo -1Fonction de fin

Remarque : Nous avons ajouté un En cas d'erreur GoTo -1 à la fin qui réinitialise Err.Number à 0 (voir les deux sections ci-dessous).

Avec En cas d'erreur Reprendre ensuite et Numéro d'erreur, vous pouvez reproduire le « Essayer » et « Attraper » fonctionnalités d'autres langages de programmation.

En cas d'erreur GoTo Ligne

En cas d'erreur GoTo Ligne dit à VBA d'"aller à" une ligne de code étiquetée lorsqu'une erreur est rencontrée. Vous déclarez l'instruction Go To comme ceci (où errHandler est l'étiquette de ligne vers laquelle aller) :

1 En cas d'erreur GoTo errHandler

et créez une étiquette de ligne comme celle-ci :

1 errHandler :

Remarque : il s'agit de la même étiquette que vous utiliseriez avec une instruction VBA GoTo standard.

Ci-dessous, nous allons démontrer en utilisant En cas d'erreur GoTo Ligne pour quitter une procédure.

En cas d'erreur Quitter Sub

Vous pouvez utiliser On Error GoTo Line pour quitter un sous-marin lorsqu'une erreur se produit.

Vous pouvez le faire en plaçant le libellé de la ligne du gestionnaire d'erreurs à la fin de votre procédure :

12345678 Sous ErrGoToEnd()En cas d'erreur GoTo endProc'Du codefinProc :Fin du sous-marin

ou en utilisant la commande Exit Sub :

123456789101112131415 Sous ErrGoToEnd()En cas d'erreur GoTo endProc'Du codeAller à sauterQuitterfinProc :Quitter le soussauterSortie :'Un peu plus de codeFin du sous-marin

Err.Clear, en cas d'erreur GoTo -1 et réinitialisation de Err.Number

Une fois qu'une erreur est gérée, vous devez généralement effacer l'erreur pour éviter de futurs problèmes avec la gestion des erreurs.

Après qu'une erreur se soit produite, les deux Err.Effacer et En cas d'erreur GoTo -1 peut être utilisé pour réinitialiser Numéro d'erreur à 0. Mais il y a une différence très importante : Err.Effacer ne réinitialise pas l'erreur réelle elle-même, il réinitialise uniquement le Numéro d'erreur.

Qu'est-ce que ça veut dire? À l'aide deErr.Effacer, vous ne pourrez pas modifier le paramètre de gestion des erreurs. Pour voir la différence, testez ce code et remplacez En cas d'erreur GoTo -1 avec Err.Effacer:

123456789101112131415161718192021 Sous ErrExamples()En cas d'erreur GoTo errHandler :'Erreur "définie par l'application"Erreur (13)Quitter le souserrHandler :' Effacer l'erreurEn cas d'erreur GoTo -1En cas d'erreur GoTo errHandler2 :'Erreur "Incompatibilité de type"Erreur (1034)Quitter le souserrHandler2 :Debug.Print Err.DescriptionFin du sous-marin

En règle générale, je recommande de toujours utiliser En cas d'erreur GoTo -1, sauf si vous avez une bonne raison d'utiliser Err.Effacer au lieu.

VBA sur erreur MsgBox

Vous souhaiterez peut-être également 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 :

12345678910111213141516171819202122232425262728 Sous ErreurMessageEx()Dim errMsg en tant que chaîneEn cas d'erreur GoTo errHandler'Étape 1errMsg = "Une erreur s'est produite lors de l'étape Copier & Coller."'Err.Augmenter (11)'Étape 2errMsg = "Une erreur s'est produite lors de l'étape de validation des données."'Err.Augmenter (11)'Étape 3errMsg = "Une erreur s'est produite lors de l'étape de création du compte de résultat et de copie."Err.Augmenter (11)'Étape 4errMsg = "Une erreur s'est produite lors de la tentative d'enregistrement de l'importation sur la page de configuration"'Err.Augmenter (11)GoTo endProcerrHandler :MsgBox errMsgfinProc :Fin du sous-marin

Ici, vous remplaceriez Err.Raise(11) par votre code réel.

VBA IsError

Une autre façon de gérer les erreurs consiste à les tester avec la fonction VBA IsError. La fonction IsError teste une expression pour les erreurs, renvoyant TRUE ou FALSE si une erreur se produit.

123 Sous IsErrorEx()MsgBox IsError(Plage("a7").Valeur)Fin du sous-marin

Si erreur VBA

Vous pouvez également gérer les erreurs dans VBA avec la fonction Excel IfError. La fonction IfError doit être accessible en utilisant le Classe WorksheetFunction :

1234567 Sous IfErrorEx()Dim n As Longn = WorksheetFunction.IfError(Range("a10").Value, 0)MsgBox nFin du sous-marin

Cela produira la valeur de la plage A10, si la valeur est une erreur, elle produira 0 à la place.

Types d'erreurs VBA

Erreurs d'exécution

Comme indiqué ci-dessus:

Erreurs d'exécution VBA sont des erreurs qui se produisent lors de l'exécution du code. Voici des exemples d'erreurs d'exécution :

  • Référencement d'un classeur, d'une feuille de calcul ou d'un autre objet inexistant
  • Données invalides ex. référencement d'une cellule Excel contenant une erreur
  • Tenter de diviser par zéro

Vous pouvez « gérer les erreurs » des erreurs d'exécution en utilisant les méthodes décrites ci-dessus.

Erreurs de syntaxe

Erreurs de syntaxe VBA sont des erreurs d'écriture de code. Voici des exemples d'erreurs de syntaxe :

  • Faute d'orthographe
  • Ponctuation manquante ou incorrecte

L'éditeur VBA identifie de nombreuses erreurs de syntaxe en surbrillance rouge :

L'éditeur VBA a également une option pour « Vérification automatique de la syntaxe » :

Lorsque cette option est cochée, l'éditeur VBA génère une boîte de message vous alertant des erreurs de syntaxe après avoir entré une ligne de code :

Personnellement, je trouve cela extrêmement ennuyeux et désactive la fonctionnalité.

Erreurs de compilation

Avant d'essayer d'exécuter une procédure, VBA « compilera » la procédure. La compilation transforme le programme à partir du code source (que vous pouvez voir) en une forme exécutable (vous ne pouvez pas voir).

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 incluent :

  • Pour sans pour autant Prochain
  • Sélectionner sans pour autant Fin de la sélection
  • Si sans pour autant Fin si
  • Appeler un procédure qui n'existe pas

Les erreurs de syntaxe (section précédente) sont un sous-ensemble des erreurs de compilation.

Déboguer > Compiler

Des erreurs de compilation apparaîtront lorsque vous tenterez d'exécuter une procédure. Mais idéalement, vous identifieriez les erreurs de compilation avant d'essayer d'exécuter la procédure.

Vous pouvez le faire en compilant le projet à l'avance. Pour ce faire, rendez-vous sur Déboguer > Compiler le projet VBA.

Le compilateur « ira à » la première erreur. Une fois que vous avez corrigé cette erreur, compilez à nouveau le projet. Répétez jusqu'à ce que toutes les erreurs soient corrigées.

Vous pouvez dire que toutes les erreurs sont corrigées car Compiler le projet VBA sera grisé :

Erreur de débordement

Les Erreur de débordement VBA se produit lorsque vous essayez de mettre une valeur dans une variable qui est trop grande. Par exemple, Variables entières ne peut contenir que des valeurs comprises entre -32 768 et 32 768. Si vous entrez une valeur plus élevée, vous recevrez une erreur de débordement :

Au lieu de cela, vous devez utiliser le Variable longue pour stocker le plus grand nombre.

Autres termes d'erreur VBA

Erreur de capture VBA

Contrairement à d'autres langages de programmation, en VBA, il n'y a pas Déclaration de capture. Cependant, vous pouvez répliquer une déclaration de capture en utilisant En cas d'erreur Reprendre ensuite et Si Err.Numéro 0 Alors. Ceci est couvert ci-dessus dans la gestion des erreurs avec Err.Number.

Erreur d'ignorance VBA

Pour ignorer les erreurs dans VBA, utilisez simplement le En cas d'erreur Reprendre ensuite déclaration:

1 En cas d'erreur Reprendre ensuite

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.

Erreur de lancer VBA/Err.Raise

Pour passer par une erreur dans VBA, vous utilisez le Err.Augmenter méthode.

Cette ligne de code générera une erreur d'exécution '13' : Incompatibilité de type :

1 Err.Augmenter (13)

Trappe d'erreur VBA

Trappe d'erreur VBA n'est qu'un autre terme pour la gestion des erreurs VBA.

Message d'erreur VBA

UNE Message d'erreur VBA ressemble à ça:

Lorsque vous cliquez sur "Déboguer", vous verrez la ligne de code qui génère l'erreur :

Gestion des erreurs VBA dans une boucle

La meilleure façon de gérer les erreurs dans une boucle est d'utiliser En cas d'erreur Reprendre ensuite de même que Numéro d'erreur pour détecter si une erreur s'est produite (n'oubliez pas d'utiliser Err.Effacer pour effacer l'erreur après chaque occurrence).

L'exemple ci-dessous divisera deux nombres (colonne A par colonne B) et affichera le résultat dans la colonne C. S'il y a une erreur, le résultat sera 0.

12345678910111213141516 Sous-test()Cellule tamisée en tant que plageEn cas d'erreur Reprendre ensuitePour chaque cellule dans la plage ("a1:a10")'Définir la valeur de la cellulecell.Offset(0, 2).Value = cell.Value / cell.Offset(0, 1).Value'Si Cell.Value est une erreur, la valeur par défaut est 0Si Err.Numéro 0 Alorscellule.Décalage(0, 2).Valeur = 0Err.EffacerFin siProchainFin du sous-marin

Gestion des erreurs VBA dans Access

Tous les exemples ci-dessus fonctionnent exactement de la même manière dans Access VBA et dans Excel VBA.

123456789101112131415161718 Fonction DelRecord(frm As Form)'cette fonction permet de supprimer un enregistrement dans une table d'un formulaireSur erreur GoTo se terminantAvec frmSi .NewRecord Alors.AnnulerFonction de sortieFin siTerminer parAvec frm.RecordsetClone.Bookmark = frm.Bookmark.Effacerfrm.RequêteTerminer parFonction de sortiefin:FinirFonction de fin

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave