Votre question
Fermé

[Tutoriel] Excel/Macro VBA : Débogage

Tags :
  • Visual basic
  • Programmation
  • VB
Dernière réponse : dans Programmation
a b L Programmation
28 Juillet 2008 13:47:32

Excel/Macro VBA: Débogage

La mise au point des programmes informatiques est une part importante du développement.
Tout environnement de développement qui se respecte possède donc un débugger, c'est-à-dire un ensemble d'outils pour suspendre le déroulement du programme, lire la valeurs des variables en cours d'exécution, permettre de modifier ces variables et parfois modifier le déroulement même du programme, exécuter pas-à-pas le programme, etc.

Le débugger de l'éditeur Visual Basic est excellent, facilité en cela par le fait que le Basic est un langage interprété. Pas besoin donc de recompilation, on peut souvent modifier à la volée le code en cours de débuggage.

Les exemples qui vont suivre sont présentés sous Excel. Mais le principe reste identique pour tous les VBA, et même pour VB lui-même.

Autres pages sur : tutoriel excel macro vba debogage

a b L Programmation
28 Juillet 2008 16:02:25

Débogage inline

La façon la plus intuitive pour déboguer du code est d'ajouter dans ce code lui-même des messages pour afficher les valeurs ou résultats intermédiaires afin de véfirier les entrées et les sorties :
  1. Sub MaProc()
  2. Dim parametre As Integer
  3. Dim coderetour As Integer
  4.  
  5. parametre = 2
  6. MsgBox "Param: " & parametre
  7. coderetour = MaFonction(parametre)
  8. MsgBox "Retour: " & coderetour
  9.  
  10. End Sub

Quand le programme est enfin au point, il faut penser à retirer tous ces messages.
a b L Programmation
28 Juillet 2008 16:03:14

L'objet Debug

Dans d'autres langages (C/C++ notamment) on peut écrire du code conditionnel qui affichera ces messages en mode "debug", et qui disparaîtront en mode "release".

Le VB a chosit une autre méthode. On oublie bien sûr la fonction MsgBox, au profit de l'objet Debug :
  1. Sub MaProc()
  2. Dim parametre As Integer
  3. Dim coderetour As Integer
  4.  
  5. parametre = 2
  6. Debug.Print "Param: " & parametre
  7. coderetour = MaFonction(parametre)
  8. Debug.Print "Retour: " & coderetour
  9.  
  10. End Sub
Les valeurs sont alors enregistrées discrètement dans la fenêtre d'exécution grâce à la méthode Print et le programme n'est pas plus perturbé que ça. Reste maintenant à interrompre à bon escient l'application en cours d'exécution si un problème survenait, pour aller constater la pertinence de nos traces, justement.

L'objet Debug possède une seconde méthode, assert qui suspend le déroulement du programme si la condition donnée en paramètre est fausse :
  1. ' // b ne devrait pas être nul !
  2. Assert b <> 0
  3. q = a / b



La fenêtre Exécution



Attention pour ceux qui connaîtraient d'autres langages, cette méthode ne fait que suspendre le dédoulement, sans l'arrêter.

PS: Souvenez-vous, Print pouvait s'écrire ? en Basic. C'est toujours le cas pour cette méthode de debug ;) 
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
28 Juillet 2008 16:03:51

Méthodes d'arrêt

Plusieurs méthodes d'arrêt sont possibles :
  • La méthode Assert de l'objet Debug vient d'être vue.
  • A tout moment, l'appui sur la combinaison de touches [Ctrl+Pause] suspend le déroulement du programme. Très pratique quand on est lancé dans une boucle infinie.
  • L'instruction Stop : placée dans le code, elle suspend le déroulement du programme comme un point d'arrêt.
  • Les points d'arrêts (Touche [F9], ou menu Debogage/Basculer point d'arrêt, ou encore menu contextuel/Basculer/Point d'arrêt). Représentés par de gros points rouges, ils arrêtent le déroulement du programme. C'est pourquoi on les appelle points d'arrêt :sol: 

  • Une dernière façon de suspendre le déroulement du programme est de créer un espion en précisant un des deux types "Arrêt si..".

    Dans tout ces cas, La main est rendu au débogueur.
    a b L Programmation
    28 Juillet 2008 16:15:18

    Les espions

    Très utiles, les espions permettent de suivre l'évolution des variables en temps réel.
    Quand la variable est de type scalaire sa valeur s'affiche simplement.
    Mais si la variable est de type objet, alors tous les attributs de l'objet sont visibles.
    Si certains de ces attributs sont eux-mêmes des objets, ils affichent eux aussi leurs attributs, ad libitum !

    Pour afficher la fenêtre espion, menu Affichage/Fenêtre espion. Peut-on faire plus facile ?

    Pour ajouter un espion, on peut passer par le menu contextuel, le menu classique, etc. Je préfère sélectionner dans le code la variable, voire la formule, qui m'intéresse et la glisser dans la fenêtre espion.


    La fenêtre Espion


    La combinaison de touche [Maj-F9] vous permet de voir immédiatement la valeur de ce qui est sélectionné dans votre code.
    a b L Programmation
    28 Juillet 2008 16:45:24

    Pas-à-pas

    Votre si beau code n'est toujours pas au point. Des bugs subsistent. Vos espions sont en place, et vous avez placé judicieusement un point d'arrêt ou un Stop. Bien.

    Exécutons-donc ce code, jusqu'à l'arrêt artificiel. Toutes les variables, tous les objets sont ok. On va donc exécuter pas-à-pas le code jusqu'à trouver l'erreur.

  • [F5] - Et c'est parti ! Cette touche lance l'exécution du programme. Si on était en pause, le cours normal du programme est repris.
  • [F8] - Quand le programme est en pause, en appuyant sur cette touche, la ligne en cours va être exécutée. Les espions vont être mis-à-jour, puis la ligne suivante va devenir la ligne en cours. Si un appel de procédure ou de fonction est effectué dans cette ligne, nous allons entrer dans le code de la sous-routine. Le programme reste en pause.
  • [Maj-F8] - Même comportement que [F8], sauf que les sous-routines seront exécutées sans interruption.
  • [Ctrl-Maj-F8] - La sous-routine en cours va être exécutée sans interruption jusqu'à son point de sortie. Puis de nouveau le programme sera remis en pause.

    Une petite flèche et un surlignage de couleur jaune indiquent la ligne en cours. Il est possible de déplacer ce curseur pour désigner une autre ligne. Cela se fait à la souris en déplaçant la petite flèche à la souris, ou grâce à la combinaison de touche [Ctrl+F9] qui établit la nouvelle ligne en cours sur la ligne courante.



    A force de parcourir votre code pas-à-pas en surveillant vos variables et vos espions, vous allez bien finir par le trouver, ce fichu bug !