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.AugmenterVoir 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 |