为了避免难以弄清的复杂的嵌套的If语句,你可以使用Select Case语句代替。它的语法为: 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。 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子句是个放置错误信息的好地方。 有时候,作决定是基于测试表达式的条件,例如它是否大于,小于,等于或使用一些其它的关系运算符(参见表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 <10 MsgBox "The number is less than 10" Case 11 MsgBox "You entered eleven." 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之间的语句会被执行。 9.确定Case子句里数值的范围在前面的例子里,你看到了在每个Case子句里使用一个简单表达式。然而,很多时候,你可能需要在Case子句里确定一个数值范围。可以通过关键字To用于表达式的数值之间来实现它,如下所示: Select Case unitsSold Case 1 to 100 Discount = 0.05 Case Is <= 500 Discount = 0.1 Case 501 to 1000 Discount = 0.15 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 <=500 GetDiscount = 0.1 Case 501 To 1000 GetDiscount = 0.15 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。最后的语句用信息框来显示获得的折扣。 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子句的多个条件 |
|