Excel · VBA · A3iformations

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.

IsError, CVErrErreurs Excel
F9 · F8 · Ctrl+GDéboguer
IsNumeric, IsDatePrévenir
On Error GoToIntercepter
1

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.

ErreurCause fréquenteSolution dans la feuilleConstante VBA
#DIV/0!Division par zéro ou par une cellule vide=SIERREUR(C2/B2;0) ou tester le diviseurxlErrDiv0 (2007)
#N/AValeur introuvable (RECHERCHEV, RECHERCHEX, EQUIV)SI.NON.DISP, vérifier la donnée cherchéexlErrNA (2042)
#NOM?Fonction mal écrite, nom défini inexistant, texte sans guillemetsCorriger l’orthographe, Gestionnaire de nomsxlErrName (2029)
#VALEUR!Texte utilisé dans un calcul, argument du mauvais typeNettoyer les données, CNUMxlErrValue (2015)
#REF!Cellule référencée suppriméeAnnuler la suppression, réécrire la référencexlErrRef (2023)
#NOMBRE!Nombre impossible ou trop grand (racine d’un négatif…)Vérifier les argumentsxlErrNum (2036)
#NUL!Intersection vide de deux plages (espace au lieu de 😉Corriger le séparateurxlErrNull (2000)
#PROPAGATION!Résultat matriciel bloqué par des cellules non videsLibérer la zone de débordement—
#####Pas une erreur : colonne trop étroite ou date négativeÉlargir la colonne—
Simulateur : lire les erreurs d’Excel en VBA (cliquez sur une cellule pour voir sa formule)
Value ou TextRange("D3").Value renvoie la valeur d’erreur (Erreur 2007) ; Range("D3").Text renvoie le texte affiché « #DIV/0! ».
WorksheetFunction ou ApplicationWorksheetFunction.VLookup arrête la macro (1004) si la valeur est introuvable ; Application.VLookup renvoie #N/A, à tester avec IsError.
2

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.

TypeQuandExemple
SyntaxeÀ la saisie de la ligneIf total > 100 sans Then, parenthèse oubliée
CompilationAu lancement (Débogage › Compiler VBAProject)Variable non définie avec Option Explicit, For sans Next, Sub inexistante
ExécutionPendant l’exécutionDivision par zéro, feuille introuvable, texte dans un calcul
LogiqueJamais signaléeBoucle qui s’arrête trop tôt, mauvaise cellule, taux de 20 au lieu de 0,2
N°MessageCause habituelle
6Dépassement de capacitéValeur trop grande pour le type (Integer au-delà de 32 767)
9L’indice n’appartient pas à la sélectionFeuille ou classeur mal nommé, tableau lu hors de ses bornes
11Division par zéroDiviseur nul ou cellule vide
13Incompatibilité de typeTexte ou valeur d’erreur placé dans une variable numérique
91Variable objet ou variable de bloc With non définieVariable objet utilisée sans Set
424Objet requisPropriété appliquée à une valeur au lieu d’un objet
438Propriété ou méthode non gérée par cet objetMembre mal orthographié ou inexistant
1004Erreur définie par l’application ou par l’objetPlage incorrecte, Cells(0, 1), fonction de feuille en échec
Simulateur : syntaxe, compilation, exécution et logique
Option ExplicitOutils › Options › cochez « Déclaration des variables obligatoire » : chaque nouveau module commence par Option Explicit, et les fautes de frappe deviennent des erreurs de compilation.
Fin ou DébogageDans le message d’erreur, Fin arrête la macro ; Débogage ouvre le code sur la ligne fautive, surlignée en jaune, pour l’examiner.
3

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.

OutilAction
F9 ou clic dans la margePlace ou retire un point d’arrêt sur la ligne
Ctrl + Maj + F9Supprime tous les points d’arrêt
StopPoint d’arrêt écrit dans le code, conservé à l’enregistrement
Debug.Assert conditionArrête la macro seulement si la condition est fausse
Survol d’une variableEn mode Arrêt, une info-bulle affiche sa valeur
F5Reprend l’exécution jusqu’au point d’arrêt suivant
Simulateur : points d’arrêt, Stop et Debug.Assert
Non enregistrésLes points d’arrêt disparaissent à la fermeture du classeur, contrairement à Stop : supprimez les Stop avant de livrer la macro.
Lignes validesUn point d’arrêt se place sur une instruction exécutable, pas sur une ligne vide, un commentaire ou un Dim.
4

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.

RaccourciCommandeEffet
F8Pas à pas détailléExécute la ligne jaune ; entre dans les procédures et fonctions appelées
Maj + F8Pas à pas principalExécute un appel de procédure d’un seul coup
Ctrl + Maj + F8Pas à pas sortantTermine la procédure en cours et revient à l’appelante
Ctrl + F8Exécuter jusqu’au curseurExécute jusqu’à la ligne où se trouve le curseur
Ctrl + GFenêtre d’exécution? expression, variable = valeur, sortie de Debug.Print
Maj + F9Espion expressSurveille une expression dans la fenêtre Espions
Simulateur : pas à pas, variables locales et fenêtre d’exécution
Déplacer la ligne jauneDans l’éditeur, on peut faire glisser la flèche jaune pour réexécuter une ligne, ou Ctrl + F9 : « Définir l’instruction suivante ».
Tester sans macroLa fenêtre d’exécution fonctionne aussi hors exécution : ? IsNumeric("12a"), ? Range("A1").Value…
5

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.

FonctionRenvoie True si…Exemple
IsNumeric(v)v peut être converti en nombreIsNumeric("12,5") → True
IsDate(v)v est une date valideIsDate("31/02/2026") → False
IsEmpty(v)v n’a jamais été initialisée, ou la cellule est videIsEmpty(Range("A1").Value)
IsError(v)v est une valeur d’erreur ExcelIsError(Range("D3").Value)
IsNull(v)v contient Null (base de données)IsNull(rs!Nom)
IsArray(v) / IsObject(v)v est un tableau / un objetIsArray(Array(1, 2))
TypeName(v) / VarType(v)Renvoient le type (texte / code numérique)TypeName(12.5) → « Double »
Len(Trim(v)) = 0Texte vide ou fait uniquement d’espacesContrôle d’un champ obligatoire
objet Is NothingLa variable objet ne désigne rienIf cellule Is Nothing Then
Simulateur : vérifier avant de convertir
IsNumeric est largeIsNumeric accepte aussi « 1E3 » ou un montant avec séparateur de milliers. Pour un entier strict, testez en plus CDbl(v) = Int(CDbl(v)).
Application.InputBoxAvec Type:=1, Excel refuse lui-même ce qui n’est pas un nombre ; Type:=8 fait sélectionner une plage.
6

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.

InstructionEffet
On Error GoTo ErreurEn cas d’erreur, saute à l’étiquette Erreur:
On Error Resume NextIgnore l’erreur et passe à la ligne suivante ; on teste ensuite Err.Number
On Error GoTo 0Désactive la gestion d’erreur : VBA affiche de nouveau ses messages
ResumeDans le gestionnaire : réexécute la ligne qui a échoué
Resume NextDans le gestionnaire : reprend à la ligne qui suit l’erreur
Resume EtiquetteDans le gestionnaire : reprend à une étiquette
Err.Raise numéro, source, descriptionDéclenche une erreur personnalisée
Err.ClearRemet Err.Number à 0
Simulateur : On Error, Resume et l’objet Err
Ne pas tout masquerUn 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.
Modèle de gestionnaireOn 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é)

  1. Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
  2. Exécutez PrixUnitaires_Bogue : notez l’erreur obtenue, cliquez sur Débogage et lisez les variables (survol, Ctrl + G).
  3. Placez un point d’arrêt dans la boucle et parcourez-la avec F8 en suivant i dans Variables locales.
  4. Exécutez PrixUnitaires_Securise : les lignes à problème reçoivent un message dans la colonne E, les autres leur prix.
  5. Exécutez SaisirRemise et testez des saisies incorrectes, puis répondez aux questions de la feuille Contrôle.
A3iformations · Organisme certifié Qualiopi · Centre de passage TOSA Interface Excel Microsoft 365 en français