按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
GetDiscount = 0。2
End Select
End Function
3。 将光标放在过程DisplayDiscount的任意地方并且按下F5来运行它。
过程DisplayDiscount将储存于变量unitsSold的值传递给函数GetDiscount。当VB遇到Select Case
语句时,它检查第一个Case子句里的值是否合储存于unitsSold里面的值是否匹配。如果匹配,VB
给函数名称赋值百分之五(0。05),并且跳到关键字End Select。因为,在函数过程里面没有更多需
要运行的语句,VB就返回主调过程——DisplayDiscount,在这里,它将函数的结果赋予变量
myDiscount。最后的语句用信息框来显示获得的折扣。
113
… 页面 130…
10。在 Case 子句里确定多个表达式
你可以使用逗号明确单一Case子句里的多个表达式:
Select Case myMonth
Case 〃January〃; 〃February〃; 〃March〃
Debug。Print myMonth & 〃: 1st Qtr。〃
Case 〃April〃; 〃May〃; 〃June〃
Debug。Print myMonth & 〃: 2nd Qtr。〃
Case 〃July〃; 〃August〃; 〃September〃
Debug。Print myMonth & 〃: 3rd Qtr。〃
Case 〃October〃; 〃November〃; 〃December〃
Debug。Print myMonth & 〃: 4th Qtr。〃
End Select
技巧5…7 Case子句的多个条件
用来分隔开Case子句里面多个条件的逗号,和用于If语句里的运算符OR意义一样。只要这些条件有
一个为真,Case子句就为真。
11。接下来…
在本章介绍的条件语句,让你控制你的过程走向。通过测试条件的真假,你可以决定哪些语句需要
执行,哪些要跳过。换句话说,不必从上到下,一行一行地运行你的过程,你可以只执行某些行,
如果你犹豫应该使用哪种条件语句,这里是一些指南:
更灵活并且更容易理解。
有些决定是需要重复的,例如,你可能需要在工作表里的每个单元格里或者一个工作簿里的每个表
里重复同样的操作。下章将教你如何一次又一次地做同样的操作。
第六章 在 VBA 中重复操作
作者:Julitta Korol 翻译:Tiger Chen Feb 1’ 2005
既然你已经学习了条件语句如何赋予你的VBA过程作决定的能力,是时候深入了。不是所有的决定
都容易,有时候你将需要运行一些语句好几次才能达到某个条件。然而,另一方面,当你达到这个
决定后,你可能需要一直运行某些语句,只要条件为真,或直到条件变为真。在编程中,重复地执
行任务被称为循环。VBA有好些个循环结构,允许你多次重复一系列的语句。你将在本章里学习如
何循环你的代码。
1。Do Loops: Do…While 和 Do…Until
VB有两种Do循环语句,只要或者直到某个条件为真,它们就会重复一系列的语句。只要条件为真,
Do…While循环就允许你重复某个操作。这个循环的语法如下:
Do While 条件
语句1
语句2
语句N
Loop
当VB遇到这个循环时,它首先条件的真假,如果条件为假,循环内部的语句就不会被执行,VB将继
续执行关键字Loop后面的第一条语句。如果条件为真,循环里面的语句则会被一条一条地执行,直
到遇到Loop语句。Loop语句告诉VB重复这个过程,只要Do While语句里的条件为真的话。
现在,我们来看看如何在Excel里面好好利用Do…While循环语句。在第四章里,你学习了如何根据
一个单元格的内容来作决定。让我们再进一步,看看如何在一系列单元格上作同样的决定。该决定
是给一列中的非空单元格设置粗体格式。
114
… 页面 131…
1。 打开一个空工作簿,并且命名为Chap06。xls
2。 切换到VB编辑屏幕,并且将新工程改名为Repetition (Chap06。xls)
3。 在工程Repetition里插入一新模块,并重命名为DoLoops
4。 输入如下过程:
Sub ApplyBold()
Do While ActiveCell。Value 〃〃
ActiveCell。Font。Bold = True
ActiveCell。Offset(1; 0)。Select
Loop
End Sub
5。 在单元格A1:A7里输入任意数据(文本或数字)
6。 选择单元格A1
7。 选择“工具”…“宏”…“运行宏”。在宏对话框里,双击过程ApplyBold(或者选中该过程然后
点击运行)
当运行过程ApplyBold时,VB首先评估Do While语句里的条件——ActiveCell。Value””,该条
件意思是:只要当前单元格的值不是一个空字符串(””),就执行下列语句。因为你已经在单元
格A1里输入了数据并且激活了该单元格(见第六步),第一个测试返回真,所以VB执行语句
ActiveCell。Font。Bold = True,它的意思是给当前单元格设置粗体格式。接下来,VB选择了下一
行的单元格(参见第二章里的Offset属性)。因为该语句之后就是关键字Loop,VB返回到Do While
语句,并且再次检查条件。如果新选中的单元格(当前激活的单元格)不为空,那么VB就会重复循
环内部的语句。该过程会继续,直到检查到单元格A8的内容为空,测试条件的结果为假,因此,VB
就跳过循环内部的语句。并且在关键字Loop后面没有其它的语句了,所以该过程就结束了。
我们来看看另外一个Do…While循环的例子。是不是很想知道如何在Excel的状态栏里显示今天的日
期和时间?这里有个例子,如何让它显示十秒钟:
Sub TenSeconds()
Dim stopme
stopme = Now + TimeValue(〃00:00:10〃)
Do While Now 《 stopme
Application。DisplayStatusBar = True
Application。StatusBar = Now
Loop
Application。StatusBar = False
End Sub
在上面的程序里,只要函数Now返回的时间小于变量stopme的值,Do…While循环里的语句就会被执
行。变量stopme储存值为当前时间加上十秒(参见在线帮助里的另外一个使用内置函数TimeValue
的例子)。
语句Application。DisplayStatusBar告诉VB打开状态栏的显示,下条语句则是将当前日期和时间放
在状态栏上。当显示时间时(只显示10秒)用户无法使用系统(光标变成了沙漏)。十秒钟后(也
就是,当条件Now 《 stopme为真),VB跳出循环并且执行关键字Loop后面的语句,该语句将状态栏
返回到默认信息“就绪”。
技巧6…1 什么是循环?
循环是一种导致一部分程序代码重复执行的编程结构。VBA提供了多种结构在你的过程里执行循环:
Do…While; Do…Until; For…Next; For…Each; and While…Wend
Do…While循环还有另外一种语法,你可以在循环的底部测试条件,例如:
Do
语句1
语句2
语句N
Loop While 条件
当你在循环的底部测试条件时,意味着循环里面的语句至少运行了一次。看一下这个例子:
115
… 页面 132…
Sub SignIn()
Dim secretCode As String
Do secretCode = InputBox(〃Enter your secret code:〃)
If secretCode = 〃sp1045〃 Then Exit Do
Loop While secretCode 〃sp1045〃
End Sub
注意,在条件被测试之时,VB至少已经执行了一次循环里的语句。除了将条件放在循环之后外,过
程SignIn示范如何使用条件跳出循环。当Exit Do语句执行时,循环便立即停止。
技巧6…2 避免无限循环
如果你没有正确地设计你的循环,你将导致一无限循环——永无休止的循环。你将无法使用Esc键
来停止该循环。在下面的过程里,因为用户忘了放置测试条件而导致了永无休止的循环:
Sub SayHello()
Do
MsgBox 〃Hello。〃
Loop
End Sub
你必须按下Ctrl+Break键(译者:现在,有些电脑使用别的组合键来中断程序。例如我的手提电脑
就是Fn+Break)才能终止该无限循环,当VB显示信息“代码执行被中断”时,点击结束以退出过程。
另外一种方便的循环Do…Until,也可以让你重复一条或多条语句,直到条件为真。换句话说,
Do…Until语句是只要当某个条件为假的时候重复一块代码。这是它的语法:
Do Until 条件
语句1
语句2
语句N
Loop
使用上面的语法,你可以将前面的过程ApplyBold重新写成下面的方式:
Sub ApplyBold2()
Do Until IsEmpty(ActiveCell)
ActiveCell。Font。Bold = True
ActiveCell。Offset(1; 0)。Select
Loop
End Sub
该过程的第一条语句意思是执行下列语句,直到遇到第一个空单元格。结果上,如果当前单元格不
为空,VB就执行循环内部的那两条语句。只要条件IsEmpty(ActiveCell)测试为假,这个过程就反
复继续着。因为过程ApplyBold2在循环的前面就测试条件,如果第一个单元格就为空的话,循环内
部的语句就不会运行。在下一段,你将有机会试验它。
和Do…While循环类似,Do…Until循环也有第二种语法让你在循环的底部测试条件:
Do
语句1
语句2
语句N
Loop Until 条件
如果你想要程序至少执行一次,那么�