Mise au point avec le débogueur VBA

Déboguer votre première fonction VBA dans Excel : And.

Déboguer votre première fonction VBA dans Excel : And.


Ouvrez votre classeur Chess.xls puis le VBE (Alt+F11) et la fenêtre Exécution (Ctrl+G).

En général cette dernière est déjà ouverte si on l’a utilisée dans une précédente session du VBE.

Débogage de la fonction FileRankToString

Le débogage ou mise au point est la recherche d’erreur de programmation (bug) mais cela peut être aussi un moyen d’apprendre le fonctionnement dynamique de nouvelles instructions VBA ou de comprendre un code écrit par d’autres personnes.

Comme on a déjà corrigé l’erreur dans la fonction FileRankToString() dans la précédente session, ce sera surtout l’occasion de se familiariser avec l’outil de débogage et de suivre pas à pas l’exécution de l’instruction conditionnelle If.

Dans la fenêtre d’édition, cliquez dans la colonne vide de gauche (sorte de marge en gris) en face de la 1ere ligne du corps de la fonction, c-a-d le If.

Si vous voyez le curseur d’insertion de texte qui clignote ou si la ligne est sélectionnée en bleu, alors il faut cliquer un peu plus sur la gauche dans la colonne plus grise que la zone d’édition sans toutefois cliquer dans la fenêtre Projet.

Si vous ne trouvez pas cette colonne, cliquez sur le If dans la 1ere ligne du corps de la fonction puis cliquez sur le menu "Débogage" > "Basculer le point d’arrêt" (F9) [Toggle Breakpoint]

Un gros point rouge apparaît dans la marge et toute la ligne passe en vidéo inverse avec comme couleur de fond la couleur du point rouge. Vous avez inséré un point d’arrêt dont le but est d’arrêter l’exécution de la fonction et inspecter les valeurs de variables. C’est un stop dont l’icône est une petite main. D’ailleurs il existe en VBA l’instruction Stop qui arrête l’exécution exactement comme un point d’arrêt.

Dans la fenêtre Exécution, lancer la fonction avec un paramètre de n° de case incorrect :

? FileRankToString(-1)

La fonction s’arrête sur le point d’arrêt souhaité avec une petite flèche jaune dans la marge et la couleur de fond de la ligne passe en jaune.

Pour inspecter la valeur des variables, passer le pointeur souris sur une variable sans cliquer (survoler au-dessus de la variable) et attendre que la valeur s’affiche en bulle d’aide juste dessous.
Ainsi indexSquare = -1 (c’est le paramètre d’entrée de la fonction et il n’est jamais modifié).
file et rank ne sont pas encore calculés et ont pour valeur par défaut 0 (*).

Cliquez avec le bouton droit de la souris dans la zone des barres d’outils de VBE.
Cochez [x] la barre d’outil "Débogage" (Debug) que vous pouvez positionner où vous voulez.
Parmi les 3 premières flèches, cliquez la 1ere "Pas à pas détaillé" (F8) [Step Into] qui signifie avancer d’une instruction. Si c’est un appel de fonction, VBA débogue à l’intérieur de la fonction (into) par opposition à la 2ème flèche "Pas à pas principal" (Shift+F8) [Step Over] qui exécuterait toute la fonction sans la déboguer.

Comme la condition de l’instruction If ne contient pas de fonction, on passe de :
If indexSquare >= 0 And indexSquare <= 63 Then
directement à
Else
dont la couleur d’arrière fond devient jaune.
Cela signifie que la condition du If est fausse et que VBA a sauté entièrement toutes les instructions de la partie Then.

A droite de la fenêtre Exécution, on a également ouvert avec le menu "Affichage" la fenêtre des Variables Locales (Locals) remplie automatiquement ainsi que la fenêtre des Variables Espionnées (Watches) dans laquelle on a demandé d’afficher le même paramètre d’entrée indexSquare. Notez que dans la fenêtre d’édition, on a survolé à la souris cette variable dans la condition du If et qu’une bulle d’aide est apparue sous la variable avec sa valeur.

La fenêtre des Variables Locales voire l’espionnage du paramètre d’entrée indexSquare sont des moyens plus pratique que de devoir copier-coller dans la fenêtre Exécution :

? indexSquare

-1

Il y a également une différence : la fenêtre Locale ou Espion est toujours mise à jour à chaque exécution pas à pas lors du déboguage. La fenêtre Exécution n’affiche que la valeur de la variable au moment où on valide par ENTER. Mais comme le paramètre d’entrée n’est pas changé dans le corps de cette fonction, les deux fenêtres présentent la même valeur.

(*) : Dans la fenêtre des Variables Locales, on constate que le résultat de la fonction est égal à la chaîne vide et les variables locales file et rank sont égales à zéro. Il ne faut jamais se fier aux valeurs par défaut des variables locales ou du résultat de la fonction tant qu’on ne les a pas explicitement initialisés ou affectés dans le corps de la fonction, d’où l’affection qui suit du résultat avec la chaîne vide en cas d’erreur.


Optionnellement pour vérification, on peut copier-coller la condition sans le If ni le Then dans la fenêtre Exécution précédé du classique " ?".

? indexSquare >= 0 And indexSquare <= 63

False

indexSquare n’est pas dans la plage valide.

On peut également détailler l’évaluation de la condition du If.

? indexSquare >= 0

False

? indexSquare <= 63

True


L’opérateur logique And

Les évaluations qui suivent permettent de comprendre le fonctionnement de l’opérateur And :

? False And False

False

? True And False

False

? False And True

False

? True And True

True

Expr gaucheExpr droiteAnd
False False False
True False False
False True False
True True True

Les évaluations avec indexSquare dans la fenêtre Exécution sont contextuelles de l’endroit où on débogue à l’intérieur de la fonction. Si on fait un copier-coller de l’expression avec indexSquare dans la fenêtre d’Exécution quand on est sorti de la fonction, indexSquare ne sera plus le paramètre d’entrée de la fonction mais une variable globale inconnue que l’on n’a ni déclarée (typée) ni initialisée avec une valeur, donc sa valeur a de forte chance d’être zéro.

? indexSquare

0

? indexSquare >= 0 And indexSquare <= 63

True


Cliquez dans la barre d’outil de debug "Pas à pas détaillé" (F8) [Step Into] à nouveau.

On progresse dans la partie Else du If avec FileRankToString = ’’’’ surligné en jaune si cette instruction n’est pas en commentaire car le débogueur saute toujours les commentaires.

Plutôt que de continuer à déboguer les deux dernières instructions End If et End Function qui n’apporteraient guère plus d’information, on peut sortir du débogage de la fonction par un clic sur "Pas à pas sortant" (Ctrl+Shift+F8) [Step Out] ou carrément lancer l’exécution jusqu’à la fin en cliquant sur la barre d’outil de débogage triangle "Continue" (F5) [Run].


On peut relancer une nouvelle session de débogage de la fonction mais cette fois avec un paramètre valide et inspecter à la souris les valeurs des variables rank puis file juste avant et après les avoir modifiées en jetant également un coup d’œil à la fenêtre des Variables Locales.

? FileRankToString(62)

g8

Quand la mise au point est terminée, pour enlever le point d’arrêt, on peut cliquer dans la marge sur le point rouge d’arrêt pour le faire disparaître ou cliquer sur le VBE menu "Débogage" > "Effacer les points d’arrêt" (Ctrl+Shift+F9) [Clear All Breakpoints].


Précédent : Edition de code VBA et commentaire

Suivant : Tout l’échiquier dans une chaîne

Posté le 8 juillet 2011 par Matt