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

ash*_*awg 3 debugging vba callstack breakpoints

有哪些调试VBA代码的方法?

特别:

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

ash*_*awg 11

调试VBA代码

本页介绍了调试VBA代码的方法.


介绍

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


逐步执行代码

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

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

只要在逐步模式下暂停,就可以从" 立即"窗口查询或更改变量的值.


断点和停止命令

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

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

如果"立即"窗口不可见(通常位于VBA编辑器屏幕的底部),请按Ctrl+ G或从" 视图"菜单中选择" 立即窗口 " 以使窗口可见.

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

完成代码调试后,请务必返回并清除所有断点(从" 调试"菜单中选择" 清除所有断点 " 或按+ + ),并确保删除或注释掉所有"停止"语句.CtrlShiftF9

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


调试命令

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

Debug.Print "The value of variable X is: " & X
Run Code Online (Sandbox Code Playgroud)

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

Debug.Print X, Y, Z
Run Code Online (Sandbox Code Playgroud)

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

Debug.Assert Var >= 0
Run Code Online (Sandbox Code Playgroud)

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

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


当地人的窗口

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


观察窗口

Watch窗口显示所有有效的Watches.您可以从" 视图"菜单中选择" 监视窗口"来显示"监视"窗口.Watch是一个指令,当表达式为True或被监视的变量改变值时,VBA暂停代码.要对一个变量创建一个观察,打开监视窗口和监视窗口中单击鼠标右键,然后选择添加监视...从弹出菜单或选择添加监视...从调试窗口.在"添加监视"对话框中,在"表达式"文本框中输入要监视其值的变量名称.然后选择Break When Value Changes.运行代码时,执行将在修改变量值的行之后的行处暂停.代码暂停时,变量的值已经更新.

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


调用堆栈

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


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

  • 这个答案是多余的,因为[网站重新上线](http://www.cpearson.com/Excel/DebuggingVBA.aspx). (4认同)
  • 我将此答案标记为潜在的侵犯版权. (2认同)