excel-vba
Débogage et dépannage
Recherche…
Syntaxe
- Debug.Print (chaîne)
- Stop STOP
Debug.Print
Pour imprimer une liste des descriptions de code d'erreur dans la fenêtre immédiate, transmettez-la à la fonction Debug.Print
:
Private Sub ListErrCodes()
Debug.Print "List Error Code Descriptions"
For i = 0 To 65535
e = Error(i)
If e <> "Application-defined or object-defined error" Then Debug.Print i & ": " & e
Next i
End Sub
Vous pouvez afficher la fenêtre immédiate par:
- Sélection de V iew | Je mmediate fenêtre dans la barre de menu
- Utiliser le raccourci clavier Ctrl-G
Arrêtez
La commande Stop met en pause l'exécution lorsqu'elle est appelée. De là, le processus peut être repris ou exécuté pas à pas.
Sub Test()
Dim TestVar as String
TestVar = "Hello World"
Stop 'Sub will be executed to this point and then wait for the user
MsgBox TestVar
End Sub
Fenêtre Immédiate
Si vous souhaitez tester une ligne de code macro sans avoir à exécuter un sous-ensemble, vous pouvez taper des commandes directement dans la fenêtre Immédiat et ENTER
sur ENTER
pour exécuter la ligne.
Pour tester la sortie d'une ligne, vous pouvez la faire précéder d'un point d'interrogation ?
pour imprimer directement dans la fenêtre immédiate. Vous pouvez également utiliser la commande print
pour print
la sortie.
Dans Visual Basic Editor, appuyez sur CTRL + G
pour ouvrir la fenêtre immédiate. Pour renommer votre feuille actuellement sélectionnée en "ExampleSheet", tapez ce qui suit dans la fenêtre Immédiat et ENTER
sur ENTER
ActiveSheet.Name = "ExampleSheet"
Pour imprimer le nom de la feuille actuellement sélectionnée directement dans la fenêtre immédiate
? ActiveSheet.Name
ExampleSheet
Cette méthode peut être très utile pour tester les fonctionnalités des fonctions intégrées ou définies par l'utilisateur avant de les implémenter dans du code. L'exemple ci-dessous montre comment utiliser la fenêtre Immédiat pour tester la sortie d'une fonction ou d'une série de fonctions afin de confirmer un résultat attendu.
'In this example, the Immediate Window was used to confirm that a series of Left and Right
'string methods would return the desired string
'expected output: "value"
print Left(Right("1111value1111",9),5) ' <---- written code here, ENTER pressed
value ' <---- output
La fenêtre Immédiat peut également être utilisée pour définir ou réinitialiser une application, un classeur ou d'autres propriétés nécessaires. Cela peut être utile si vous avez Application.EnableEvents = False
dans un sous-programme qui génère une erreur de manière inattendue, ce qui provoque sa fermeture sans réinitialiser la valeur sur True
(ce qui peut provoquer des fonctionnalités frustrantes et inattendues. Dans ce cas, les commandes peuvent être saisies directement). dans la fenêtre immédiate et exécutez:
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
False ' <---- Output
Application.EnableEvents = True ' <---- Resetting the property value to True
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
True ' <---- Output
Pour les techniques de débogage plus avancées, les deux points :
peuvent être utilisés comme séparateur de ligne. Cela peut être utilisé pour des expressions multi-lignes telles que la mise en boucle dans l'exemple ci-dessous.
x = Split("a,b,c",","): For i = LBound(x,1) to UBound(x,1): Debug.Print x(i): Next i '<----Input this and press enter
a '<----Output
b '<----Output
c '<----Output
Utiliser la minuterie pour trouver des goulots d'étranglement dans les performances
La première étape pour optimiser la vitesse consiste à trouver les sections de code les plus lentes. La fonction Timer
VBA renvoie le nombre de secondes écoulées depuis minuit avec une précision de 1 / 256ème de seconde (3,90625 millisecondes) sur les PC Windows. Les fonctions VBA Now
et Time
ne sont précises qu’à une seconde.
Dim start As Double ' Timer returns Single, but converting to Double to avoid
start = Timer ' scientific notation like 3.90625E-03 in the Immediate window
' ... part of the code
Debug.Print Timer - start; "seconds in part 1"
start = Timer
' ... another part of the code
Debug.Print Timer - start; "seconds in part 2"
Ajouter un point d'arrêt à votre code
Vous pouvez facilement ajouter un point d'arrêt à votre code en cliquant sur la colonne grise située à gauche de la ligne de votre code VBA où vous souhaitez arrêter l'exécution. Un point rouge apparaît dans la colonne et le code du point d'arrêt est également surligné en rouge.
Vous pouvez ajouter plusieurs points d'arrêt dans votre code et reprendre l'exécution en appuyant sur l'icône "play" dans la barre de menus. Tout le code ne peut pas être un point d'arrêt en tant que lignes de définition de variable, la première ou la dernière ligne d'une procédure et les lignes de commentaires ne peuvent pas être sélectionnées en tant que point d'arrêt.
Fenêtre locale de débogueur
La fenêtre Locaux permet d'accéder facilement à la valeur actuelle des variables et des objets dans la portée de la fonction ou du sous-programme que vous exécutez. C'est un outil essentiel pour déboguer votre code et passer en revue les modifications afin de trouver des problèmes. Cela vous permet également d'explorer les propriétés que vous ne connaissiez peut-être pas.
Prenons l'exemple suivant:
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
Dans l'éditeur VBA, cliquez sur Afficher -> Fenêtre locale
Ensuite, en parcourant le code en utilisant F8 après avoir cliqué dans le sous-programme, nous nous sommes arrêtés avant d’avoir assigné findMeinLocals. Vous pouvez voir ci-dessous que la valeur est 0 --- et c'est ce qui serait utilisé si vous ne lui avez jamais attribué de valeur. L'objet Range est "Nothing".
Si nous nous arrêtons juste avant la fin du sous-programme, nous pouvons voir les valeurs finales des variables.
Nous pouvons voir findMeInLocals avec la valeur 1 et le type Integer, et FindMeInLocals2 avec un type Range / Range. Si nous cliquons sur le signe +, nous pouvons développer l'objet et voir ses propriétés, telles que le nombre ou la colonne.