Gestion des erreurs et débogage
Objectifs du chapitre
Durant votre parcours d’apprentissage et bien au-delà, vous aurez l’occasion de rédiger de nombreux programmes, et d’obtenir aussi de nombreuses erreurs ! Ce n’est pas une fatalité et cela se gère très bien !
Qu’elles soient de votre fait ou de celui de vos utilisateurs, ce chapitre vise à vous permettre de vous prémunir contre plusieurs de ces erreurs, et de vous adapter lorsque celles-ci apparaissent lorsque vous codez ou exécutez un programme.
En fin de chapitre, vous serez invité à reprendre certains exercices des précédents chapitres et à rendre votre code plus robuste au moyen des pistes suggérées dans ce chapitre.
Les erreurs dans Excel
Il est très fréquent d’avoir des erreurs dans les cellules Excel. Dans le chapitre Manipuler les formules, vous avez pu voir que les erreurs dans les formules sont possibles, mais cela n’est pas la seule source possible d’erreurs sous Excel.
Des erreurs de formules
Que la donnée que vous cherchez ne soit pas présente, ou que vous tentiez une division par 0, tout type d’erreur retournée dans une cellule peut se gérer, vous l’avez déjà vu au travers des fonctions ESTERREUR et SIERREUR.
Lorsqu’une erreur est identifiée par Excel, un point d’exclamation noir dans un carré jaune apparaît à gauche de la cellule :
Un libellé de l’erreur est fourni par Excel, des pistes de solutions vous sont proposées. Il est ainsi possible d’utiliser l’aide Excel, d’afficher les étapes de calculs qui amènent à cette erreur, d’ignorer l’erreur ou encore d’effectuer une correction de la formule directement dans la barre de formule.
Des erreurs de conception
Au-delà des solutions qu’Excel vous propose, il peut arriver que l’origine des problèmes vienne directement des données sur lesquelles vous travaillez. Vous pouvez avoir des erreurs à cause de formats de cellules qui ne sont pas les bons, de données qui ne se trouvent...
Les erreurs en VBA
Il existe plusieurs types d’erreurs en VBA, toutes n’apparaissent pas pour les mêmes raisons ni au même moment. Vous allez voir dans ce paragraphe ce qui les différencie, mais également quelques corrections fort simples pour résoudre les erreurs les plus triviales.
Faites-vous aider : Option Explicit
La première chose qui est fortement recommandée est d’utiliser une instruction que vous verrez dans chacune des corrections d’exercices :
Option Explicit
Exemple 1 : une instruction plus qu’utile, une instruction primordiale
Cette instruction est à placer au début de vos modules. Elle va vous aider à mieux programmer.
Ajouter manuellement l’instruction
En effet, la présence de cette instruction impose que chaque variable utilisée dans le code soit strictement déclarée auparavant. Ainsi, si une variable n’est pas correctement écrite ou si sa déclaration est manquante, VBA vous l’indiquera immédiatement.
Option Explicit
Sub ProcedurePleinedErreurs()
Dim o As String
B = "B"
End Sub
Exemple 2 : cas d’usage d’une variable non déclarée
Si vous faites une erreur dans un nom de variable, par exemple, si vous utilisez des noms de variables longs et que vous oubliez une lettre, VBA le détectera.
Sub AutreProcedurePleinedErreurs()
Dim UnNomDeVariableParticulierementLong As String
UnNomDeVariableParticulierementLog = "A"
End Sub
Exemple 3 : cas d’un nom de variable mal écrit...
Gérer les erreurs dans le code
Dans ce paragraphe, vous allez voir plusieurs outils à votre disposition pour pallier le mieux possible les erreurs qui pourraient advenir durant l’utilisation de votre programme.
S’assurer des valeurs des variables
Lorsque vous exécutez votre programme, les variables que vous manipulez prennent des valeurs, et votre code se base sur ces valeurs pour exécuter ou non des instructions. Il est donc primordial de connaître les valeurs auxquelles vous vous attendez durant cette exécution.
En utilisant les points d’arrêt (voir le chapitre Exécuter un programme et règles d’écriture), vous êtes déjà en mesure de vous assurer qu’une instruction doit être exécutée ou non. Mais cela ne suffit parfois pas pour connaître l’état de vos variables.
Utiliser la souris
Que vous soyez en train d’effectuer un débogage en mode pas à pas ou bien que le programme vienne de s’arrêter pour vous sur un point d’arrêt, il est possible de voir ce que contient une variable simplement en plaçant votre souris dessus. Une info-bulle s’affiche alors, avec le nom de la variable sur laquelle vous placez votre souris, ainsi que sa valeur à ce moment dans le programme :
Cette solution permet une visibilité rapide du contenu des variables mais n’est pas toujours possible. Par exemple, lorsque la variable dont vous souhaitez connaître la valeur est située bien plus haut dans le programme, ou encore que le type de variable n’est pas une valeur qui puisse être simplement représentée par un texte (une feuille ou un classeur Excel par exemple). Il faut donc utiliser d’autres moyens.
Utiliser la fenêtre d’exécution
Tout comme vous avez eu la possibilité de lancer une fonction ou une procédure depuis la fenêtre d’exécution, il est possible de connaître durant l’exécution d’un programme la valeur d’une variable à partir de cette fenêtre.
Pour cela, il vous suffit de taper le nom de la variable précédé du caractère point d’interrogation ?. Le contenu de la variable sera affiché dans la ligne suivante dans la fenêtre d’exécution :
Cette approche vous permet de vous affranchir de la technique précédente avec le pointeur de souris mais elle ne résout pas pour autant le problème évoqué dans la précédente section, à savoir la représentation des objets plus complexes et leur contenu.
Il vous reste fort heureusement une ultime solution pour d’accéder aux informations de vos variables : les espions.
Utiliser les espions
Que vous soyez en cours d’exécution d’un programme ou simplement en train de déboguer vos lignes de code, il est possible d’utiliser un outil des plus pratiques pour suivre les valeurs que prennent vos variables : les espions.
Vous avez déjà affiché la fenêtre Espions dans le chapitre L’environnement de programmation VBE.
Effectuez un clic droit sur une variable de votre code et sélectionnez l’option Ajouter...
Gérer les erreurs dans les formulaires utilisateurs
Après avoir vu les principaux moyens de vous prémunir des erreurs lors de l’exécution, ce dernier paragraphe vous donne quelques idées sur la façon de vous assurer le plus tôt possible que l’utilisateur fournit ce que vous attendez de lui lorsqu’il remplit un formulaire.
La gestion des erreurs peut ainsi se faire dès le clic sur un bouton dans un formulaire utilisateur.
Valider les données
Avant de faire appel à certaines fonctions, vous pouvez effectuer une série de tests sur les contrôles de vos formulaires. Contrôles de cohérences, zones de texte correctement remplies et valeurs valides sont autant de choses qu’il vous faudra valider avant de faire appel aux procédures.
Vous pouvez ainsi créer une fonction Validation, de type Boolean, qui effectuera les contrôles et retournera la valeur True seulement si tous vos tests procurent les résultats attendus.
Function Validation() As Boolean
Validation = True
'Instructions des Controles de validation
'en cas d'échec du contrôle
Validation = False
End Function
Exemple 13 : utilisation d’une fonction de validation
Vous pourrez ensuite utiliser cette fonction directement lors d’un clic sur le bouton Valider de votre formulaire :
Private Sub BoutonValider_Click() ...
Exercices
Créez un module Chapitre_20_Erreurs afin d’y écrire vos programmes.
Renforcer vos précédents exercices
Dans un souci de rendre plus robustes les exercices des précédents chapitres, voici quelques pistes.
Chapitre 5 MsgBox Inputbox Exercice BoiteElementaire : assurez-vous que l’utilisateur ne saisit pas une valeur numérique ni une date.
Chapitre 11 Chaînes de caractères Exercice TitreEtDate : assurez-vous que les caractères passés en paramètres permettent une récupération sous forme de date valide.
Mettre en place une gestion d’erreur
Chapitre 14 Manipuler les Feuilles, Exercice CreerRemplirEtNommerFeuille, mettez en place une gestion d’erreurs qui afficherait un message à l’utilisateur si la feuille est déjà présente dans le classeur.
Utiliser les fonctions de contrôle
Chapitre 15 Manipuler les classeurs, Exercice EtapesCompletesClasseur, utilisez les fonctions que vous avez abordées dans ce chapitre pour vous assurer que la cellule servant à stocker le nom du fichier ne soit pas vide avant d’effectuer l’enregistrement du classeur.