excel_vba_编程教程(完整版)-第36部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
End If
End If
End Sub
为了使过程TestConditions更容易理解,每个If…Then语句都显示为不同的格式,现在你可以清楚
地看到过程使用了三个If…Then程序块。
第一个If块(粗体)检查当前单元格是否为空,如果为真,就会显示信息,然后VB将跳过Else部分
找到相应的End If,该语句位于关键字End Sub之前。
如果当前单元格不为空,IsEmpty (ActiveCell)条件返回假,并且VB运行粗体Else下面的单下划线
的If块。该单下划线的If…Then…Else语句就是嵌套在第一个If块(粗体)的。该语句检查当前单
元格是否是个数字。注意,我们通过另一个内置函数IsNumeric来做这个。如果当前单元格的值不
是一个数字,条件就为假,因此,VB跳到单下划线的Else处,并且在B1里输入“text”。然而,如
果当前单元格包含个数字时,VB就会运行双下划线的If块,评估每种情况并作出相应的决定。
第一个If块(粗体)被称为外部If语句,这个外部语句包含两个内部的If语句(单下划线和双下划
线)。
技巧5…5 嵌套语句
嵌套是指将一种控制结构放在另外一控制结构里面。你将在第六章里的循环结构里看到更多的嵌套
的例子。
7。Select Case 语句
为了避免难以弄清的复杂的嵌套的If语句,你可以使用Select Case语句代替。它的语法为:
110
… 页面 127…
Select Case 测试表达式
Case 表达式1
如果表达式1匹配测试表达式的语句
Case 表达式2
如果表达式2匹配测试表达式的语句
Case 表达式N
如果表达式N匹配测试表达式的语句
Case Else
如果没有表达式匹配测试表达式要执行的语句
End Select
你在关键字Select Case和End Select之间放置任意多个条件以测试。子句Case Else是可选的,当
你希望可能有条件表达式返回假时使用它。在Select Case语句里,VB将每个表达式和测试表达式
相比较。
这里是Select Case语句背后的逻辑。当VB遇到Select Case子句,它记下测试表达式的值。然后它
前进到下面的第一个Case子句,如果这个表达式的值和测试表达式的值匹配的话,VB就会执行语句
直到遇到另外一个Case子句并且跳到End Select语句。然而,如果第一个Case子句后面的表达式测
试结果和测试表达式不匹配时,VB就会检查每一个Case子句,直到它找到一个匹配的为止。如果没
有一个Case子句后面的表达式匹配测试表达式的值的话,VB就会跳到Case Else子句并执行该语句
直到遇到关键字End Select。注意,Case Else子句是可选的,如果你的程序里面没有使用Case Else
并且没有一个Case子句的表达式和测试表达式相匹配,VB就会跳到End Select后面的语句,并且继
续执行你的程序。
我们来一个使用Select Case语句的程序例子。在第四章里,你学习了MsgBox函数允许你显示带有
一个或多个按钮的信息,你也学习了MsgBox函数的结果可以赋予一个变量。使用Select Case语句,
你现在可以基于用户按下的按钮决定采取哪个行动。
1。 在当前工程里插入一新模块
2。 重命名新模块SelectCase。
3。 输入下述过程TestButtons:
Sub TestButtons()
Dim question As String
Dim bts As Integer
Dim myTitle As String
Dim myButton As Integer
question = 〃Do you want to open a new workbook?〃
bts = vbYesNoCancel + vbQuestion + vbDefaultButton1
myTitle = 〃New Workbook〃
myButton = MsgBox(prompt:=question; buttons:=bts; _ title:=myTitle)
Select Case myButton
Case 6
Workbooks。Add
Case 7
MsgBox 〃You can open a new book manually later。〃
Case Else
MsgBox 〃You pressed Cancel。〃
End Select
End Sub
过程TestButtons的第一部分显示一个带有三个按钮的信息框:是,否和取消。用户选择按钮的值
赋予变量myButton。
如果用户点击“是”,那么变量myButton就会被赋值常量vbYes或它对应的值6;如果用户点击“否”,
那么变量myButton则赋值为常量vbNo或它对应的值7;最后,如果点击了“取消”,变量myButton
的内容就等于vbCancel或2。
111
… 页面 128…
Select Case语句对照储存在变量myButton里的值检查Case子句提供的值。当有匹配时,就会执行
适当的Case语句。
如果你使用常量,而不是按钮值,过程TestButtons同样会运行一致。
Select Case myButton
Case vbYes
Workbooks。Add
Case vbNo
MsgBox 〃You can open a new book manually later。〃
Case Else
MsgBox 〃You pressed Cancel。〃
End Select
你可以忽略Else子句,可以按下述方法修改一下Select Case语句:
Select Case myButton
Case vbYes
Workbooks。Add
Case vbNo
MsgBox 〃You can open a new book manually later。〃
Case vbCancel
MsgBox 〃You pressed Cancel。〃
End Select
4。 运行过程TestButtons三次,每次选择一个不同的按钮。
技巧5…6 通过Case Else捕捉错误
尽管在Select Case语句里使用Case Else不是强制的,使用它总是很好的,以防止万一测试有没有
预料到的值。Case Else子句是个放置错误信息的好地方。
8。和 Case 子句一起使用 Is
有时候,作决定是基于测试表达式的条件,例如它是否大于,小于,等于或使用一些其它的关系运
算符(参见表5…1)。关键字Is使你能够在Case子句里使用条件表达式。使用关键字Is的Select Case
语句的语法如下:
Select Case 测试表达式
Case Is 条件1
如果条件1为真时执行的语句
Case Is 条件2
如果条件2为真时执行的语句
Case Is 条件N
如果条件N为真时执行的语句
End Select
例如,我们来比较几个数字:
Select Case myNumber
Case Is =100
MsgBox 〃The number is greater than or equal to 100。〃
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…Unt