- Excel VBA语法与应用手册
- 许小荣 夏跃伟 高翔等编著
- 444字
- 2020-08-27 02:39:03
6.2 代码调试
代码完成后,接下来的任务就是进行代码调试,对代码中不完善的地方加以修正。代码调试是一项繁琐的工作,有时代码调试的时间会超过代码编写的时间。用户通过代码调试获取编程经验,提高今后代码编写水平。VBA为用户代码调试提供了多种手段。
6.2.1 工作模式
在VBA编辑环境中,工作模式可以分为3种分别是设计模式、运行模式和中断模式。
1. 设计模式
在设计模式下,用户可以编写代码,设置窗体和控件,并为窗体和控件添加属性。我们讲述的例子都是在设计模式下完成的。
2. 运行模式
进入运行模式的方法是单击工具栏上的“运行子过程和用户窗体”按钮,或按F5键即可。用户代码设计完成后就要通过运行模式来测试代码编写的正确与否。在运行模式下,用户是无法修改代码。
3. 中断模式
在正常情况下,代码运行的顺序是自上而下连续运行的。一旦代码运行时发生错误,程序将会中止自动进入中断模式。
除此之外,用户还可以通过设置断点来人为的进入中断模式。程序运行碰到断点的时候就会暂时中断。用户可以利用VBA的调试工具和方法来测试到断点为止,程序的运行结果是否正确。
6.2.2 逐语句运行
在工具栏中单击运行按钮后,其执行的方式是一次性的执行完毕,用户看不到执行的过程是如何一步步推进的,有的时候为了放缓这个过程,用户可以将代码逐语句执行。
逐语句执行操作方法如下所示。
(1)将鼠标的位置移动到要执行的代码中,在开始行代码内单击。
(2)按键盘上的F8功能键,此时每按一次F8键就能执行一句指令。即将要执行的指令行其背景色默认为黄色。
说明
也可以在VBE中执行“调试”菜单中的“逐语句”命令。
逐语句执行能够最大程度地还原指令操作的效果,用户通过观察变量的值或者是其他的变化来获知代码是否正确。
例如下述代码将会把工作表的A1到E10单元格内填充数据,并最终结算A1到E10单元格内所有数据之和,最后将求和结果以消息框的方式显示出来。
#001: Sub test() #002: Dim i As Integer #003: Dim j As Integer #004: Dim s As Integer #005: For i = 1 To 10 #006: For j = 1 To 5 #007: Cells(i, j) = i * j #008: Next #009: Next #010: s=Application.WorksheetFunction.Sum(Range(Cells(1,1),Cells(10, 5))) #011: MsgBox s #012: End Sub
用户每按一次F8功能键就能执行一行代码,此时只要将鼠标悬停到某个变量的上方,就会提示该变量的值,如图6-6所示,将鼠标悬停在第7行代码中变量i上,即可显示变量i的值。
图6-6 显示变量的值
逐语句执行的缺点是效率太低,特别是代码中包含大循环结构,如果要越过循环直接执行循环体后的代码就不太容易了。例如要查看上述代码中变量s的值,必须要不停地按F8键,直到循环结束为止。
如果要跳过循环直接执行到第11行代码处,可以使用下述方法解决这个问题。将鼠标光标定位在第11行内,执行“调试”菜单下的“运行到光标处”命令。那么第11行代码背景色将会显示为黄色,表示将要执行的代码就是第11行代码。按F8键,继续执行,即可获得最终执行的效果。
6.2.3 设置断点
为了解决逐语句运行调试的缺陷,还可以使用设置断点的功能。当代码运行到有断点标志的语句时候会暂停运行。在代码窗口中设置断点的方法通常有如下几种:
● 将鼠标光标放置在要设置断点的代码句中,执行“调试”菜单下的“切换断点”命令。
● 将鼠标光标放置在要设置断点的代码句中,按F9键。
● 直接在边界标示条上单击。
具有断点的行代码文字反白显示,背景色为棕红色。图6-7显示了设置断点时候代码窗口。
图6-7 设置断点
断点设置完成后,用户单击工具栏上的运行按钮,代码就会直接运行到断点位置,此时断点所标示行的代码没有运行,用户可以接着使用F8功能键继续逐语句进行调试。
使用断点的方法可以跳过那些繁复的大循环结构或者不太容易发生错误的代码。在这点上和“调试”菜单下“运行到光标处”的功能类似。不过使用“运行到光标处”的功能一次只能有一个位置,而设置断点可以在代码运行前设置很多个断点。
当程序调试完毕后,需要将已经存在的断点取消,以便程序发布后正常运行,取消断点的方法如下所示。
● 将鼠标单击棕红色圆点断点。
● 如果某段代码的断点非常多,那么可以执行VBE窗口中的“调试”菜单下的“清除所有断点”命令来清除所有的断点。
6.2.4 使用立即窗口调试
立即窗口的功能很多,其中有一项功能就是可以在立即窗口中为代码变量直接设置值。为此可以通过立即窗口来为出现问题的变量重新赋值,使得程序调试能够顺利进行。为了说明这个问题,在代码窗口中输入如下一段简易代码来说明问题。
#001: Sub使用立即窗口演示() #002: b = 0 #003: For b = 0 To 10 #004: c = 5 / b #005: Next #006: End Sub
上述代码输入完成后,使用立即窗口调试的方法如下所示。
(1)单击工具栏上的运行按钮,由于b=0,代码运行到第4行的时候就会发生错误,显示如图6-8所示的对话框。
图6-8 错误提示对话框
(2)单击对话框上的“调试”按钮,此时发生错误的代码底色变为黄色,并且在代码的边界条上出现了一个黄色的箭头指向发生错误的代码位置,如图6-9所示。将鼠标悬停在变量b上,可以看出变量b的值为0。
图6-9 错误位置显示
(3)按键盘上的Ctrl+G组合键,打开“立即”窗口,在立即窗口中输入“b=1”按Enter键确认,如图6-10所示,将此时变量b重新赋值为1。
图6-10 立即窗口
说明
将变量重新赋值为1后,继续返回代码窗口,将鼠标悬停在黄色行中变量b上,此时可以看出变量b的值已经显示为1,如图6-11所示。再次单击工具栏上的运行按钮,代码就可以顺利执行完毕。
图6-11 使用立即窗口后的变量的值
6.2.5 添加监视
调试的时候添加监视窗口可以很好的监视变量的变化情况。例如在上一节所示的代码中有i和j两个变量,如果想知道当变量i和j的值为多少的时候,指定单元格的值会大于15。面对这种问题通过逐语句运行的方法也可以监视到,但是需要逐行运行,可能会耗费很长时间,如果添加监视则会简单很多。
添加监视的方法是执行VBE窗口中“调试”菜单下的“添加监视”命令,打开如图6-12所示的添加监视对话框,在表达式文本框中设置要监视的表达式是“cells(i,j)>15”,监视的类型是“当监视值为真时中断”,表示如果监视到的内容大于了15,那么这次监视任务就算完成了,单击“确定”按钮,完成第一个监视内容的设置。
图6-12 添加监视
添加监视后,用户可以单击工具栏上的运行按钮,当监视完成的时候,代码就暂停了运行,此时只要将鼠标悬停在某个变量上,就能知道这些变量的值。
还可以在监视窗口中显示变量的值,方法是再次添加一个监视。执行VBE窗口中“调试”菜单下的“添加监视”命令,表达式为i,类型为“监视表达式”,如图6-13所示。单击“确定”按钮,完成第二个监视表达式的设置。监视表达式的含义是仅仅监视这个值的变化,但是并不阻止代码的运行。
图6-13 添加监视
同样方法完成对变量j的监视,最终的监视窗口如图6-14所示。
图6-14 监视窗口
用户单击工具栏上的运行按钮,当监视到达指定的条件时,代码就暂停了运行,此时的监视窗口如图6-15所示。
图6-15 监视到的结果
从上述结果可以看出,当i和j都是4的时候,代码中断了运行,监视窗口列出终止运行时i和j的值。要撤销对某个表达式的监视,只要在上图所示的监视窗口中选中某个表达式,右击鼠标,在弹出的快捷菜单中执行“删除监视”命令即可。
6.2.6 快速监视
快速监视并不是另外一种监视方法,而是为监视窗口中添加监视表达式的一种便捷方式。方法是选中代码中要监视的表达式,例如选中变量j,执行“调试”下的“快速监视”命令或者是同时按Shift+F9组合键,打开如图6-16所示的对话框。
图6-16 快速监视
此时单击“添加”按钮,即可将内容添加到监视窗口中。当然这种监视方式比较简单,它监视的类型是“监视表达式”,不涉及到监视中断的问题。
如果要用快速监视的方法监视“Cells(i, j)>15”,其操作步骤如下所示。
(1)在代码中选中“Cells(i, j)”,然后执行“调试”下的“快速监视”命令或者同时按Shift+F9组合键,打开如图6-17所示的对话框。
图6-17 快速监视
(2)单击“添加”按钮,即可将内容添加到监视窗口中。
(3)双击监视窗口中的“Cells(i, j)”表达式,此时表达式处于可以编辑的状态,将其内容修改为“Cells(i, j)>15”,如图6-18所示。
图6-18 修改表达式
说明
也可以在上图所示的监视窗口中选中该表达式,右击鼠标,在弹出的快捷菜单中执行“编辑监视”命令,打开如图6-19所示的“编辑监视”对话框。在该对话框中编辑要监视的表达式,完成监视。
图6-19 编辑监视