调试VBA,查找问题和故障排除方法

时间:2018-05-05 11:56:46

标签: vba debugging breakpoints callstack

调试VBA代码有哪些方法?

具体地:

  • 单步执行代码
  • 断点和停止命令
  • Debug命令
  • 当地人和观看窗户
  • 调用堆栈

1 个答案:

答案 0 :(得分:11)

调试VBA代码

此页面介绍了调试VBA代码的方法。

简介

调试程序是软件开发中最重要的步骤之一。了解VBA的调试工具可以使调试更容易,更高效。本页介绍了在测试和调试应用程序时可以使用的几种VBA内置调试工具。

单步执行代码

调试代码的第一种方法之一是一次一行地遍历代码。要逐步执行代码,请将光标放在要分析的第一行代码上,然后按 F8 或在调试菜单上选择 Step Into 。要执行的下一行代码将以黄色背景显示,并带有黑色字体。请注意,突出显示的代码行尚未执行 - 它是下一行要执行的。

如果您的代码调用另一个过程,则使用 F8 逐步执行代码将导致执行以逐行顺序进入被调用过程。如果要在不单步执行的情况下执行被调用的过程,请按 Shift + F8 。这将执行被调用的过程,然后在调用过程后暂停代码行。如果您已经单步执行某个过程,则可以按 Ctrl + F8 逐行恢复代码执行。无论是在逐步模式还是在断点处(见下文)暂停,您都可以从运行<按 F5 继续 / strong>菜单,使VBA运行完成或遇到暂停语句。

每当您按步骤模式暂停时,您可以从立即窗口查询或更改变量的值。

断点和停止命令

断点是放在一行代码上的标记,导致执行在执行该行之前立即暂停。您可以通过将光标放在相关代码行上并按 F9 ,在调试上选择切换断点,将断点添加到一行代码中。 strong>菜单,或单击代码行旁边的左边距。设置断点后,该行将以砖红色背景显示,并带有白色字体。当您运行代码时,执行将在具有断点的代码行之前暂停,并将以黄色背景显示为黑色字体。注意,黄色线尚未执行 - 它是下一行代码。

当代码在断点处暂停时,您可以在立即窗口中发出命令以更改或查询变量的值。要查看变量的内容,请输入?字符后跟变量名称,然后按 Enter 。您可以通过在立即窗口中输入VariableName = NewValue并按 Enter 来更改变量值。

如果“立即”窗口不可见(通常位于VBA编辑器屏幕的底部),请按 Ctrl + G 或选择立即窗口查看菜单中,使窗口可见。

要删除断点,请将光标放在代码行上,然后按 F9 。您可以通过从调试菜单中选择清除所有断点或按 Ctrl + Shift + F9 。 VBA还提供 Stop 命令。这只是停止代码执行该代码行并进入中断模式。

完成代码调试后,请务必返回并清除所有断点(从调试菜单中选择 清除所有断点 或按 Ctrl + Shift + F9 )并确保删除或注释掉所有Stop语句。

当您在断点处或在逐步模式下暂停时,您可以在当前行之前更改要执行的下一行,以重新运行一段代码,或者在行到跳过语句之后。右键单击要恢复执行的行,然后右键单击并选择设置下一语句或从运行菜单中选择设置下一语句 。执行将在选定的代码行恢复。

调试命令

VBA为Debug对象提供了两个属性Print和Assert,您可以使用它们显示变量的值并控制程序流。 Debug.Print会将其后面的内容写入立即窗口。代码执行不会中断。在立即窗口中显示文本后,代码执行继续运行。您可以在Debug.Print语句中将文字文本与变量名称混合使用。例如,

Debug.Print "The value of variable X is: " & X

您可以在立即窗口中一次显示多个变量,方法是用逗号分隔。例如,

Debug.Print X, Y, Z

Debug.Assert命令是一个条件断点,如果Assert语句后面的表达式为False,将导致执行在Debug语句上暂停。例如,

Debug.Assert Var >= 0

如果Debug.AssertVar >= 0,则会在False语句中暂停;也就是说,如果Var为负数,它会暂停。当条件为False而不是True时,执行暂停可能看起来倒退,但Assert方法是从C语言中采用的,其用法与C中的相同。

完成调试后,请务必删除或注释掉Debug.PrintDebug.Assert语句。在正常使用您的申请期间,您通常不希望这些陈述有效。

本地窗口

Locals窗口允许您在单步执行该过程时查看过程中所有变量的值。要显示“本地”窗口,请从查看菜单中选择本地窗口。使用“局部”窗口比检查“立即”窗口中的值更容易显示变量值。对于简单变量类型(例如,Long和String变量),该值显示在一行上。对于复杂类型或对象(例如,Range变量),其属性以可折叠的树状结构显示。

观察窗

Watch窗口显示所有有效的Watches。您可以从查看菜单中选择观察窗口来显示观看窗口。 Watch是一个指令,当表达式为True或被监视的变量改变值时,VBA暂停代码。要在变量上创建Watch,请打开Watch窗口并右键单击Watch窗口,然后从弹出菜单中选择 Add Watch ... 或选择 Add Watch ... 来自Debug窗口。在“添加监视”对话框中,在“表达式”文本框中输入要监视其值的变量名称。然后选择值更改后中断。运行代码时,执行将在修改变量值的行之后的行处暂停。代码暂停时,变量的值已经更新。

要删除Watch,请在Watch窗口中右键单击Watch,然后从弹出菜单中选择 Delete Watch 。要修改Watch,请在Watch窗口中右键单击它,然后从弹出菜单中选择 Edit Watch

调用堆栈

调用堆栈是由VBA维护的数据结构,用于跟踪称为另一个过程的过程。例如,如果过程AAA调用调用BBB的{​​{1}},则调用堆栈窗口将显示从最近的过程开始的过程列表,以及下面的过程列表。执行到达当前位置。您可以从查看菜单中选择调用堆栈来查看调用堆栈。这对于跟踪最终在当前位置的执行流程非常有用。不幸的是,没有以编程方式从调用堆栈中获取信息。

消息来源:Pearson Software Consulting的Chip Pearson:http://www.cpearson.com/Excel/DebuggingVBA.aspx