代码之家  ›  专栏  ›  技术社区  ›  ashleedawg

调试VBA,查找问题和故障排除方法[关闭]

  •  3
  • ashleedawg  · 技术社区  · 6 年前

    有哪些方法 调试VBA代码 ?

    具体而言:

    • 单步执行代码
    • 断点和Stop命令
    • 这个 Debug 命令
    • 本地人(&A);监视窗口
    • 调用堆栈
    1 回复  |  直到 4 年前
        1
  •  11
  •   Scott Dietrich    4 年前

    调试VBA代码

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


    介绍

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


    单步执行代码

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

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

    无论何时在逐步模式下暂停,都可以从 即时窗口


    断点和停止命令

    断点是放置在代码行上的标记,它使执行在执行该行之前立即暂停。您可以将光标放在有问题的代码行上,然后按向代码行添加断点 F9层 ,选择 切换断点 调试 菜单,或单击代码行旁边的左边距。设置断点后,该行以砖红色背景和白色字体显示。运行代码时,执行将在带有断点的代码行之前立即暂停,并以黄色背景和黑色字体显示。请注意,黄色的那一行尚未执行,这是要运行的下一行代码。

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

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

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

    完成代码调试后,请确保返回并清除所有断点(选择 清除所有断点 调试 功能表或按键 Ctrl键 + 转移 + F9层 )并确保删除或注释掉所有停止语句。

    当您在断点或分步模式下暂停时,可以更改要执行的下一行,可以在当前行之前重新运行一段代码,也可以在该行之后跳过语句。右键单击要继续执行的行,然后右键单击并选择 设置下一条语句 或选择 设置下一条语句 菜单将在选定的代码行继续执行。


    Debug命令

    VBA提供了一个调试对象,该对象具有两个属性,即打印和断言,您可以使用它们来显示变量的值和控制程序流。 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
    

    这将在 调试。明确肯定 声明如果 Var >= 0 False ;也就是说,如果 Var 为负。当条件为False而不是True时,执行会暂停,这似乎有点倒退,但Assert方法是从C语言中采用的,其用法与C语言中的用法相同。

    请确保删除或注释掉 调试。打印 调试。明确肯定 完成调试后的语句。您通常不希望这些语句在应用程序的正常使用期间起作用。


    “本地人”窗口

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


    监视窗口

    “监视”窗口显示所有有效的监视。您可以通过选择 监视窗口 看法 菜单监视是当表达式为True或被监视的变量更改值时,VBA暂停代码的指令。要在变量上创建监视,请打开监视窗口并在监视窗口中单击鼠标右键,然后选择 添加监视。。。 从弹出菜单或选择 添加监视。。。 从调试窗口。在“添加监视”对话框中,在“表达式”文本框中输入要监视其值的变量名称。然后选择 值更改时中断 。运行代码时,执行将在修改变量值的行后的行暂停。代码暂停时,变量的值将已更新。

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


    调用堆栈

    调用堆栈是由VBA维护的数据结构,用于跟踪哪个过程调用了另一个过程。例如,if程序 AAA 呼叫 BBB 哪个呼叫 CCC ,调用堆栈窗口将显示从最新的过程开始的过程列表,下面是为到达当前位置而执行的过程链。您可以通过选择查看调用堆栈 调用堆栈 看法 菜单这对于跟踪在当前位置结束的执行流非常有用。不幸的是,没有编程方式从调用堆栈获取信息。


    资料来源:Pearson软件咨询公司的Chip Pearson: http://www.cpearson.com/Excel/DebuggingVBA.aspx