excel_vba_编程教程(完整版)-第41章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Case Else
MsgBox 〃The number is between 12 and 99。〃
End Select
假设变量myNumber为120,那么第三个Case子句为真,并且只有Case Is 》=100和Case Else之间的
语句会被执行。
112
… 页面 129…
9。确定 Case 子句里数值的范围
在前面的例子里,你看到了在每个Case子句里使用一个简单表达式。然而,很多时候,你可能需要
在Case子句里确定一个数值范围。可以通过关键字To用于表达式的数值之间来实现它,如下所示:
Select Case unitsSold
Case 1 to 100
Discount = 0。05
Case Is 1000
Discount = 0。2
End Select
我们来分析一下上面的Select Case代码块,假设变量unitsSold当前值为99。VB将变量unitsSold
的值与Case子句的条件表达式进行比较。第一和第三条Case子句示范如何通过使用关键字To在条件
表达式里使用数值范围。因为unitsSold=99,第一个Case子句里的条件表达式为真,因此,VB将0。05
赋给变量Discount。第二个Case子句如何呢?它也为真。尽管,很明显99小于等于500,VB不会执
行相关的语句Discount=0。1。原因是,一旦VB找到了一个真条件的Case子句,它就不会去管其它的
Case子句,它将跳过那些代码,继续执行End Select语句后面可能有的语句。
我们来练练使用Select Case语句,在函数过程里使用它。回想在第四章里,函数过程允许你将结
果返回给一个子过程。假设该子过程必须根据销售的套数来显示一个折扣,你可以从用户那里获得
销售套数,然后允许一个函数来确定需要的折扣:
1。 在模块SelectCase里输入下列子过程:
Sub DisplayDiscount()
Dim unitsSold As Integer
Dim myDiscount As Single
unitsSold = InputBox(〃Enter the number of sold units:〃)
myDiscount = GetDiscount(unitsSold)
MsgBox myDiscount
End Sub
2。 输入下列函数过程:
Function GetDiscount(unitsSold As Integer)
Select Case unitsSold
Case 1 To 200
GetDiscount = 0。05
Case Is 1000
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显示信息“代码执行