调试

调试是一种非常强大的方法,可以仔细查看并修复错误的工作(或非工作)代码。

逐步运行代码

在调试过程中,你需要做的第一件事是在特定位置停止代码,然后逐行运行代码以查看是否发生了预期的情况。

  • 断点( F9,Debug - Toggle 断点):你可以向任何已执行的行添加断点(例如,不对声明),当执行到达该点时停止,并为用户提供控制。
  • 你还可以将 Stop 关键字添加到空白行,以使代码在运行时停止在该位置。例如,如果在无法添加断点的声明行之前,这很有用 F9
  • Step into( F8,Debug - Step into):只执行一行代码,如果是一个用户定义的子/函数的调用,则逐行执行。
  • 跳过( Shift + F8,调试 - 跳过):执行一行代码,不进入用户定义的子/函数。
  • 跳出( Ctrl + Shift + F8,调试 - 跳出):退出当前子/功能(运行代码直到结束)。
  • 运行到游标( Ctrl + F8,调试 - 运行到游标):运行代码直到到达光标所在的行。
  • 你可以使用 Debug.Print 在运行时将行打印到立即窗口。你也可以使用 Debug.? 作为 Debug.Print 的快捷方式

手表窗口

逐行运行代码只是第一步,我们需要了解更多细节,其中一个工具是监视窗口(View - Watch 窗口),在这里你可以看到已定义表达式的值。要将变量添加到监视窗口,请执行以下任一操作:

  • 右键单击它,然后选择添加手表
  • 在监视窗口中单击鼠标右键,选择添加监视
  • 转到调试 - 添加手表。

添加新表达式时,你可以选择是仅查看其值,还是在代码执行时或在其值发生更改时中断代码执行。

即时窗口

即时窗口允许你执行任意代码或打印项目,在它们之前使用 Print 关键字或单个问号“?

一些例子:

  • ? ActiveSheet.Name - 返回活动工作表的名称
  • Print ActiveSheet.Name - 返回活动工作表的名称
  • ? foo - 返回 foo *的值
  • x = 10 设置 x 到 10 *

*通过立即窗口获取/设置变量值只能在运行时进行

调试最佳实践

每当你的代码没有按预期工作时,你应该做的就是仔细阅读它,寻找错误。

如果这没有用,那就开始调试吧; 对于简短的程序,逐行执行它可能是有效的,对于较长的程序,你可能需要在观察的表达式上设置断点或中断,这里的目标是找到不按预期工作的行。

一旦你得到了给出错误结果的行,但原因尚不清楚,尝试简化表达式,或用常量替换变量,这有助于理解变量的值是否错误。

如果你仍然无法解决它,并寻求帮助:

  • 尽可能包含代码的一小部分,以便了解你的问题
  • 如果问题与变量的值无关,则用常量替换它们。 (所以,而不是 Sheets(a*b*c+d^2).Range(addressOfRange)Sheets(4).Range("A2")
  • 描述哪一行给出了错误的行为,以及它是什么(错误,错误的结果……)