excel_vba_编程教程(完整版)-第73部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
快速监视对话框上面有个添加按钮,允许你在监视窗口里添加表达式。
确保过程WhatDate里不含有任何监视表达式,参见前面的章节有关如何从监视窗口清除监视表达式
的内容。现在我们通过例子来看看如何利用快速监视。
1。 在过程WhatDate里,将插入点(光标)放在变量x处
256
… 页面 273…
2。 选择调试|添加监视
3。 输入下述表达式:
x = 50
4。 选择当监视值为真时中断,并点击确定
5。 运行过程WhatDate
当x等于50时VB将中断过程的执行,注意,监视窗口里没有变量newDate和curDate。想要查看
这些变量的值的话,那么你可以将光标放在代码窗口里相应变量名称上,或者,你也可以调用
快速监视窗口。
6。 在代码窗口里,将鼠标光标放在变量newDate上并且按下Shift+F9。快速监视窗口就会显示该
表达式名称和其当前值
7。 点击取消返回代码窗口
8。 在代码窗口,将鼠标光标放在变量curDate上并且按下Shift+F9。现在,快速监视窗口就会显
示变量curDate的值了
9。 点击取消返回代码窗口
10。 按下F5继续运行该过程
9。使用本地窗口和调用堆栈对话框
如果在VBA过程的执行过程中,你想密切注视所有声明的变量和它们的当前值,那么确保你在运行
该过程前选择视图|本地窗口。当在中断模式下时,VB就会显示一系列的变量和它们相应的数值在
本地窗口里(参见图13…12)
图13…12 本地窗口显示当前VBA过程里所有声明的变量和它们当前值
本地窗口包含三列,表达式列显示声明在当前过程里的变量名称。第一行显示前面带加号的模块名
称,当你点击该加号,你就可以查看是否有变量声明在模块级。类模块将显示系统变量Me。在本地
窗口,全局变量和被其它工程使用的变量不会显示出来。
第二列显示变量的当前值,在本列,你可以更改变量的值,只要点击它并输入新的值。更改了数值
后,按下回车键以记录该变化。你也可以在更改数值后,按Tab键,Shift+Tab键或者向上或向下箭
头,或者也可以点击本地窗口的其它任意地方。第三列显示每个声明了的变量的类型。
想要观察本地窗口里的变量值的话,请跟着做:
1。 选择视图|本地窗口
2。 点击过程WhatDate里的任意地方,并按F8,你将过程置于中断过程了。本地窗口显示了当前模
块的名称,以及当地变量和它们的初始值
3。 按几下F8键,密切关注本地窗口
4。 按F5键继续运行该过程
本地窗口也包含一个带三个点的按钮,该按钮将打开调用堆栈对话框(参见图13…13),它显示所有
257
… 页面 274…
活动调用过程的清单。活动的调用过程是指已经开始但是还没有完成的过程。你也可以通过选择视
图|调用堆栈,该选项只有在中断模式下才是可用的。
图13…13 调用堆栈对话框显示了开始但未完成的过程列表
调用堆栈对话框特别是在追踪嵌套的程序时有用。回想一下,嵌套过程是一个被另一个过程调用的
过程。如果一个过程调用另一个过程,该被调用的过程名称就会自动添加到调用堆栈对话框里的调
用列表。当VB执行完该被调过程后,该过程名称就会从调用堆栈对话框里自动清除。你可以使用调
用堆栈对话框上的显示按钮,显示调用下一个过程的语句。
10。逐句运行 VBA 过程
逐句运行代码意思是每次只运行一条语句,这样,可以允许你检查遇到的每一个过程里的每一条语
句。想要从头开始逐句运行过程的话,可以将插入点置于过程代码的任意地方,并且选择调试|逐
语句,或者按下F8。调试菜单包含好几个选项供你在逐步模式下执行(参见图13…14)
图13…14 调试菜单提供了许多命令以逐步VBA过程
258
… 页面 275…
当你每次运行一条语句时,VB将会执行每条语句,直到它碰到关键字End Sub。如果你不希望VB逐
句运行的话,那么你随时可以按下F5来运行过程中剩余的代码,而不必逐步运行。
11。逐句运行过程
1。 将插入点置于你想要追踪的过程中代码的任意地方
2。 按下F8或者选择调试|逐语句。VB就会执行当前语句,并且自动跳到下一句并中断执行。在中
断模式下,你可以激活立即窗口,监视窗口或者本地窗口,查看某特定语句中变量和表达式的
值。以及,如果你正在逐语句执行的过程调用了其它过程,那么你也可以激活调用堆栈窗口来
查看当前哪些过程是活动的
3。 再次按下F8,执行被选中的语句。执行完该语句后,VB会选中下一条语句,并且该过程将再次
中断
4。 按下F8继续逐语句执行该过程,或者按F5无停止的执行完剩余的代码。你也可以选择运行|重
新设置来终止该过程的执行,而不执行剩下的语句
当你逐过程运行某个过程(Shift+F8)时,VB将一次执行一个过程,好像里面只有一条语句一样。
如果某过程调用了其它过程,并且你并不像逐语句执行这些过程,因为你已经测试过了,或者因为
你只想侧重于尚未被调试的新代码,那么该选项特别有用。
12。逐过程执行过程
假设过程MyProcedure的当前语句调用过程SpecialMsg。如果你选择调试|逐过程(Shift+F8),而
非调试|逐语句(F8),那么VB就会快速地执行过程SpecialMsg里面的所有语句,并且选择主调过程
MyProcedure里的下一条语句。在过程SpecialMsg的执行期间,VB将继续显示当前过程于代码窗口。
1。 在当前模块里输入下述过程:
Sub MyProcedure()
Dim myName As String
Workbooks。Add
myName = ActiveWorkbook。Name
‘ choose Step Over to avoid stepping through the
‘ lines of code in the called procedure … SpecialMsg
SpecialMsg myName
Workbooks(myName)。Close
End Sub
Sub SpecialMsg(n As String)
If n = 〃Book2〃 Then
MsgBox 〃You must change the name。〃
End If
End Sub
2。 在下面语句处添加一个断点:
SpecialMsg myName
3。 将插入点置于过程MyProcedure的代码中,并按下F5运行它。VB到达断点时将中断执行
4。 按下Shift+F8,或者选择调试|逐过程。VB将会快速的运行过程SpecialMsg并且跳到紧挨着调
用过程SpecialMsg的语句下面的那条语句
5。 按下F5无间断地完成过程的运行
当你不要分析被调过程中具体语句的话,逐过程执行是非常有用的。
调试菜单上的另外一个命令,跳出(Ctrl+Shift+F8),当你步入了某个过程,然后决定不继续逐步
执行它,那么就可以使用该命令。当你喧杂该选项时,VB就会一步执行完该过程里的剩余语句,然
后继续去激活主调过程中的下一条语句。
在逐步运行过程期间,你可以在逐语句,逐过程和跳出选项之间切换。选择哪个取决于这时你想要
分析哪个代码片断。
调试菜单中运行到光标处(Ctrl+F8)命令让你运行过程,直到碰到你选中的行。如果你想要在执
行一个大循环之前停止,或者想要跳过一被调过程时,该命令非常有用。
假设你想要执行过程MyProcedure到调用过程SpecialMsg的行。
259
… 页面 276…
1。 点击语句SpecialMsg myName内部
2。 选择调试|运行到光标处。当到达特定行时,VB将停止执行
3。 按下Shift+F8以逐过程地运行过程SpecialMsg
4。 按下F5无间断地执行完剩下的代码
13。设置下一条语句
有时,你也许想要重新运行过程中前面的几行代码,或者想要跳过一段将导致麻烦的代码。每遇到
这种情况,你可以使用调试菜单里的设置下一条语句选项。当你中断过程的执行时,你可以随意恢
复任何语句。VB将会跳过所选语句和中断处语句之间的语句。假设在过程MyProcedure(参见前面
部分的代码)中,你已经在调用过程SpecialMsg的语句处设置了断点。要跳过过程SpecialMsg的执
行,你可以将光标置于语句Workbooks(myName)内,关闭并按下Ctrl+F9(或者选择调试|设置下一
条语句)。除非你中断了过程的执行,否则不能使用设置下一条语句选项。
技巧13…4 跳过代码行
尽管跳过代码行在你的过程调试中非常有用,但是你得非常小心。当你使用下一条语句选项时,你
告诉VB这是你想要执行的下一条语句。中间的所有代码行将被忽略,这意味着期间有很多你本预期
要发生的事情并没有发生,这将可能导致意想不到的错误。
14。显示下一条语句
如果你不肯定过程的执行会从哪里继续,那么你可以选择调试|显示下一条语句,这样VB就会将光
标放置到下次将运行的代码行。当你正在看别的过程,不知道下面会执行哪条代码的时候,该命令
尤其有用。显示下一条语句选项仅在中断模式下可用。
15。终止和重新设置 VBA 过程
任何时候在逐步过程代码时,你可以:
* 按下F5无间断地执行剩余指令
* 选择运行|重新设置来终止过程,而不执行剩下的语句
当你重新设置过程时,所有变量将丢失它们的当前值。数字型变量恢复为其初始值0,变化长度的
字符串变量初始化为0长度字符串(””),而固定长度的字符串用ASCII码0代表的字符或者Chr(0)
填充。Variant型变量初始化为Empty,对象变量则设置为Nothing。
16。了解和使用条件编译
当你第一次运行某个过程时,VB会将你使用的VBA语句转变为计算机能够理解的机器码。该过程被
称为编译。你也可以选择调试|编译(当前VBA工程名称),在你运行该过程之前执行整个VBA工程的
编译。
使用条件编译,你可以告诉VB在编译或者运行时包括或者忽略某些代码块。取决于你设置的条件,
你的过程可能会表现不同。例如,条件编译用来编译一个将会运行于不同平台(Windows 或者
Macintosh,Win16或者Win32)上的应用软件。条件编译对于本地化使用于不同语言的应用软件也
是很有用的。在条件编译时排除的程序代码将从最终文件中忽略掉,因此,它对文件大小或程序功
效没有影响。
要激活条件编译的话,你应该使用叫做指示的特殊表达式。首先,你需要使用#Const指示声明一个
布尔值(True或者False)常量,接下来,你在#If 。 。 。Then。。。 #Else指示中核实该常量。你需
要进行条件编译的代码部分必须包括在这些指示中。注意,关键字If和Else前面都带有一个数字符
号(#)。
如果一部分代码将要运行,那么该条件常量必须设置为真(…1),否则为假(0)。在模块的声明部
分声明条件常量,例如:
#Const User = True
声明名为User的条件常量。
在接下来的过程中,当名叫verPolish条件常量为True时,数据就显示为波兰语。过程WhatDate调
用函数DayOfWeek,它基于提供的日前返回星期名称。要用英语编译该程序的话,你所要做的全部
就是将该条件常量改为False,然后VB就会跳到#Else指示后面的指令块去。
1。 在当前VBA工程插入一个新模块,并重命名为Conditional
260
… 页面 277…
2。 输入下述过程和函数:
‘ declare a conditional piler con