La gestion des erreurs en VBA : déboguer et sécuriser vos macros
Une macro rencontre tôt ou tard une cellule vide, un texte à la place d’un nombre ou une feuille renommée. Bien gérer les erreurs, c’est savoir les reconnaître, les trouver avec les outils de débogage de l’éditeur, les prévenir en vérifiant les valeurs, et les intercepter avec On Error pour afficher un message clair au lieu de planter. Les simulateurs reproduisent l’éditeur VBA : points d’arrêt, ligne jaune du pas à pas, variables locales, fenêtre d’exécution et boîtes d’erreur. Voir aussi les procédures et fonctions et MsgBox et InputBox.
Les erreurs dans Excel
Dans la feuille, une formule qui ne peut pas aboutir affiche une valeur d’erreur commençant par #. Pour VBA, ce n’est pas un plantage : la cellule contient une valeur spéciale, de type Error. La lire est possible, mais l’utiliser dans un calcul ou la placer dans une variable numérique provoque l’erreur 13. On la détecte avec IsError et on l’identifie avec CVErr.
| Erreur | Cause fréquente | Solution dans la feuille | Constante VBA |
|---|---|---|---|
| #DIV/0! | Division par zéro ou par une cellule vide | =SIERREUR(C2/B2;0) ou tester le diviseur | xlErrDiv0 (2007) |
| #N/A | Valeur introuvable (RECHERCHEV, RECHERCHEX, EQUIV) | SI.NON.DISP, vérifier la donnée cherchée | xlErrNA (2042) |
| #NOM? | Fonction mal écrite, nom défini inexistant, texte sans guillemets | Corriger l’orthographe, Gestionnaire de noms | xlErrName (2029) |
| #VALEUR! | Texte utilisé dans un calcul, argument du mauvais type | Nettoyer les données, CNUM | xlErrValue (2015) |
| #REF! | Cellule référencée supprimée | Annuler la suppression, réécrire la référence | xlErrRef (2023) |
| #NOMBRE! | Nombre impossible ou trop grand (racine d’un négatif…) | Vérifier les arguments | xlErrNum (2036) |
| #NUL! | Intersection vide de deux plages (espace au lieu de 😉 | Corriger le séparateur | xlErrNull (2000) |
| #PROPAGATION! | Résultat matriciel bloqué par des cellules non vides | Libérer la zone de débordement | — |
| ##### | Pas une erreur : colonne trop étroite ou date négative | Élargir la colonne | — |
Range("D3").Value renvoie la valeur d’erreur (Erreur 2007) ; Range("D3").Text renvoie le texte affiché « #DIV/0! ».WorksheetFunction.VLookup arrête la macro (1004) si la valeur est introuvable ; Application.VLookup renvoie #N/A, à tester avec IsError.Les types d’erreurs
VBA distingue quatre familles d’erreurs, détectées à des moments différents. Les erreurs de syntaxe apparaissent dès la saisie (ligne rouge), celles de compilation au lancement de la macro, avant la première instruction. Les erreurs d’exécution surviennent pendant le déroulement, à cause d’une valeur : elles portent un numéro. Les erreurs de logique, enfin, ne déclenchent aucun message : le résultat est simplement faux.
| Type | Quand | Exemple |
|---|---|---|
| Syntaxe | À la saisie de la ligne | If total > 100 sans Then, parenthèse oubliée |
| Compilation | Au lancement (Débogage › Compiler VBAProject) | Variable non définie avec Option Explicit, For sans Next, Sub inexistante |
| Exécution | Pendant l’exécution | Division par zéro, feuille introuvable, texte dans un calcul |
| Logique | Jamais signalée | Boucle qui s’arrête trop tôt, mauvaise cellule, taux de 20 au lieu de 0,2 |
| N° | Message | Cause habituelle |
|---|---|---|
| 6 | Dépassement de capacité | Valeur trop grande pour le type (Integer au-delà de 32 767) |
| 9 | L’indice n’appartient pas à la sélection | Feuille ou classeur mal nommé, tableau lu hors de ses bornes |
| 11 | Division par zéro | Diviseur nul ou cellule vide |
| 13 | Incompatibilité de type | Texte ou valeur d’erreur placé dans une variable numérique |
| 91 | Variable objet ou variable de bloc With non définie | Variable objet utilisée sans Set |
| 424 | Objet requis | Propriété appliquée à une valeur au lieu d’un objet |
| 438 | Propriété ou méthode non gérée par cet objet | Membre mal orthographié ou inexistant |
| 1004 | Erreur définie par l’application ou par l’objet | Plage incorrecte, Cells(0, 1), fonction de feuille en échec |
Placer des points d’arrêt
Un point d’arrêt suspend la macro juste avant une ligne : on peut alors lire les variables, tester des expressions, puis reprendre. On le place avec F9 ou d’un clic dans la marge grise de gauche : la ligne devient rouge. La macro suspendue est en mode Arrêt : la ligne jaune est la prochaine à exécuter.
| Outil | Action |
|---|---|
| F9 ou clic dans la marge | Place ou retire un point d’arrêt sur la ligne |
| Ctrl + Maj + F9 | Supprime tous les points d’arrêt |
Stop | Point d’arrêt écrit dans le code, conservé à l’enregistrement |
Debug.Assert condition | Arrête la macro seulement si la condition est fausse |
| Survol d’une variable | En mode Arrêt, une info-bulle affiche sa valeur |
| F5 | Reprend l’exécution jusqu’au point d’arrêt suivant |
Le mode pas à pas et la fenêtre d’exécution
Le pas à pas exécute la macro une ligne à la fois pour suivre son cheminement et voir à quel moment une valeur devient fausse. La fenêtre d’exécution (Ctrl + G) affiche les messages de Debug.Print et permet, en mode Arrêt, d’interroger une variable (? total), de calculer une expression ou de modifier une valeur avant de reprendre. La fenêtre Variables locales liste toutes les variables de la procédure en cours.
| Raccourci | Commande | Effet |
|---|---|---|
| F8 | Pas à pas détaillé | Exécute la ligne jaune ; entre dans les procédures et fonctions appelées |
| Maj + F8 | Pas à pas principal | Exécute un appel de procédure d’un seul coup |
| Ctrl + Maj + F8 | Pas à pas sortant | Termine la procédure en cours et revient à l’appelante |
| Ctrl + F8 | Exécuter jusqu’au curseur | Exécute jusqu’à la ligne où se trouve le curseur |
| Ctrl + G | Fenêtre d’exécution | ? expression, variable = valeur, sortie de Debug.Print |
| Maj + F9 | Espion express | Surveille une expression dans la fenêtre Espions |
? IsNumeric("12a"), ? Range("A1").Value…Les fonctions de vérification de type ou de valeur
Le meilleur traitement d’erreur est celui dont on n’a pas besoin : avant de convertir une saisie ou de calculer avec une cellule, on vérifie sa valeur. Ces fonctions renvoient True ou False et ne provoquent jamais d’erreur.
| Fonction | Renvoie True si… | Exemple |
|---|---|---|
IsNumeric(v) | v peut être converti en nombre | IsNumeric("12,5") → True |
IsDate(v) | v est une date valide | IsDate("31/02/2026") → False |
IsEmpty(v) | v n’a jamais été initialisée, ou la cellule est vide | IsEmpty(Range("A1").Value) |
IsError(v) | v est une valeur d’erreur Excel | IsError(Range("D3").Value) |
IsNull(v) | v contient Null (base de données) | IsNull(rs!Nom) |
IsArray(v) / IsObject(v) | v est un tableau / un objet | IsArray(Array(1, 2)) |
TypeName(v) / VarType(v) | Renvoient le type (texte / code numérique) | TypeName(12.5) → « Double » |
Len(Trim(v)) = 0 | Texte vide ou fait uniquement d’espaces | Contrôle d’un champ obligatoire |
objet Is Nothing | La variable objet ne désigne rien | If cellule Is Nothing Then |
CDbl(v) = Int(CDbl(v)).Type:=1, Excel refuse lui-même ce qui n’est pas un nombre ; Type:=8 fait sélectionner une plage.On Error GoTo : intercepter les erreurs
On Error indique à VBA quoi faire quand une erreur d’exécution survient, au lieu d’afficher son message et de s’arrêter. L’objet Err décrit la dernière erreur : Err.Number (0 s’il n’y a pas d’erreur), Err.Description, Err.Source. Le gestionnaire se place en fin de procédure, après Exit Sub, derrière une étiquette suivie de deux-points.
| Instruction | Effet |
|---|---|
On Error GoTo Erreur | En cas d’erreur, saute à l’étiquette Erreur: |
On Error Resume Next | Ignore l’erreur et passe à la ligne suivante ; on teste ensuite Err.Number |
On Error GoTo 0 | Désactive la gestion d’erreur : VBA affiche de nouveau ses messages |
Resume | Dans le gestionnaire : réexécute la ligne qui a échoué |
Resume Next | Dans le gestionnaire : reprend à la ligne qui suit l’erreur |
Resume Etiquette | Dans le gestionnaire : reprend à une étiquette |
Err.Raise numéro, source, description | Déclenche une erreur personnalisée |
Err.Clear | Remet Err.Number à 0 |
On Error Resume Next en tête de macro cache toutes les erreurs, y compris les vôtres. Encadrez seulement les lignes à risque et terminez par On Error GoTo 0.On Error GoTo Erreur … Exit Sub / Erreur: / MsgBox Err.Description : un message clair pour l’utilisateur, la cause pour vous.Exercice : sécuriser le calcul des prix unitaires
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Exécutez
PrixUnitaires_Bogue: notez l’erreur obtenue, cliquez sur Débogage et lisez les variables (survol, Ctrl + G). - Placez un point d’arrêt dans la boucle et parcourez-la avec F8 en suivant
idans Variables locales. - Exécutez
PrixUnitaires_Securise: les lignes à problème reçoivent un message dans la colonne E, les autres leur prix. - Exécutez
SaisirRemiseet testez des saisies incorrectes, puis répondez aux questions de la feuille Contrôle.