调试
调试是一种非常强大的方法,可以仔细查看并修复错误的工作(或非工作)代码。
逐步运行代码
在调试过程中,你需要做的第一件事是在特定位置停止代码,然后逐行运行代码以查看是否发生了预期的情况。
- 断点( 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")
) - 描述哪一行给出了错误的行为,以及它是什么(错误,错误的结果……)