调试VBA,定位问题&排查方法

Debugging VBA, Locating Problems & Troubleshooting Methods

调试VBA代码有哪些方法

具体来说:

调试VBA代码

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


简介

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


逐步执行代码

调试代码的首要方法之一是一次单步执行代码。要逐步执行代码,请将光标放在要分析的代码的第一行,然后按 F8 或在 [=102= 上选择 Step Into ]调试 菜单。下一行要执行的代码将以黄色背景和黑色字体显示。请注意,突出显示的代码行尚未执行——它是下一行要执行的代码。

如果您的代码调用另一个过程,使用 F8 单步执行代码将导致执行以逐行顺序进入被调用的过程。如果要执行被调用的过程而不单步执行它,请按 Shift+F8。这将执行被调用的过程,然后在调用该过程后的代码行上暂停。如果您已经在单步执行一个过程,您可以按 Ctrl+ F8 逐行恢复代码执行。在单步模式或断点(见下文)暂停时,您可以按 F5Continue 运行 菜单导致 VBA 到 运行 完成或直到遇到暂停语句。

每当您在逐步模式下暂停时,您都可以从 即时 window.

查询或更改变量的值

断点和停止命令

断点是放置在一行代码上的标记,它会导致执行在执行该行之前立即暂停。您可以将光标放在有问题的代码行上并按 F9,然后选择 Toggle Breakpoint Debug 菜单,或单击代码行旁边的左边距。设置断点后,该行以砖红色背景和白色字体显示。当您 运行 代码时,执行将在带有断点的代码行之前立即暂停,并以黄色背景和黑色字体显示它。请注意,黄色行尚未执行——它是 运行.

的下一行代码

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

来更改变量的值

如果立即 window 不可见(通常在 VBA 编辑器屏幕的底部),请按 Ctrl+ G 或从 View 菜单中选择 Immediate Window 以使 window 可见。

要删除断点,请将光标放在代码行上并按 F9。您可以通过从 Debug 菜单中选择 Clear All Breakpoints 或按 Ctrl+[= 来清除所有断点117=]Shift+F9。 VBA 还提供了 Stop 命令。这只是停止对该行代码的执行并进入中断模式。

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

当你在断点暂停或单步执行模式时,你可以更改下一行要执行的代码,或者在当前行之前重新运行一段代码,或者在跳过语句的行之后。右键单击要继续执行的行,然后右键单击并选择 Set Next Statement 或从 [=102] 中选择 Set Next Statement =]运行 菜单。执行将在选定的代码行恢复。


调试命令

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

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

您可以在即时 window 中一次显示多个变量,方法是用逗号分隔它们。例如,

Debug.Print X, Y, Z

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

Debug.Assert Var >= 0

如果 Var >= 0False,这将暂停在 Debug.Assert 语句上;也就是说,如果 Var 为负,它将暂停。当条件为False而不是True时暂停执行似乎倒退,但Assert方法是从C语言中沿用而来的,其用法与C语言相同。

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


当地人Window

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


手表Window

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

要删除监视,请在监视 window 中右键单击它,然后从弹出菜单中选择 删除监视 。要修改手表,请在手表 window 中右键单击它,然后从弹出菜单中选择 编辑手表


调用栈

调用堆栈是由 VBA 维护的数据结构,用于跟踪哪个过程调用了另一个过程。例如,如果过程 AAA 调用 BBB 而调用 CCC,调用堆栈 window 将显示过程列表,从最近的过程开始,然后是链为到达当前位置而执行的程序的数量。您可以通过从 View 菜单中选择 Call Stack 查看调用堆栈。这对于跟踪在当前位置结束的执行流很有用。不幸的是,没有编程方式从调用堆栈中获取信息。


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