3.2 选择结构的语句实现
选择控制结构又称为分支结构,这种结构能够根据条件执行不同的操作。Visual Basic支持的选择控制结构包括If语句和Select Case语句。
1.If…Then 语句
格式:If<条件>Then
<语句块>

End If
说 明: ⑴“条件”一般为关系表达式或逻辑表达式,“语句块”可以为一条或多条语句,If语句以EndIf结束。
⑵语句执行过程:首先判断条件表达式的值,若为真,则执行Then后面的语句块,否则直接跳出If语句,执行End If之后的语句。If语句流程图如图1所示。
【例1】输入a、b的值,如果a大于b,则输出“a大于b”。
Private Sub Form_Click()
Dim a! , b!
a = InputBox("please inputa:")
b = InputBox("please inputb:")
If a > b Then
Print "a大于b"
End If
End Sub
⑶条件表达式也可以是算术表达式,按非零为真、零为假来处理。如:
Dim a%
a=3
If a then
Print a
End If
由于a被赋值为3, If语句判断条件时,会认为条件为True,所以执行分支内语句,输出a的值3。
⑷If语句可以精简为单行If语句,即
If <条件>Then<语句>
单行If语句必须在一行内完成,Then后面即使是多条语句也要写在一行,用冒号分隔,单行If语句不用End If结束。
【例2】将例1用单行If语句改写。
Private Sub Form_Click()
Dim a!,b!
a = InputBox("please inputa:")
b = InputBox("please inputb:")
If a > b Then Print "a大于b"
End Sub
一般使用单行If语句做短小简单的判断,但是语句块形式具有更强的结构性与适应性,并且通常也比较容易阅读、维护及调试。
2.If...Then...Else语句
格式:

If<条件>Then
<语句块1>
Else
<语句块2>
End If
说明:
⑴语句执行过程:首先测试条件表达式的值,如果值为真,执行Then后面的语句块1,执行完毕跳出If语句,继续执行EndIf下面的语句;如果值为假,则执行Else后面的语句块2,执行完毕再执行End If下面的语句。流程图如图2所示。
⑵If...Then...Else语句为双分支选择结构,语句块1和语句块2必定有一个被执行。
【例3】输入一个非零数,判断其是正数还是负数。
PrivateSub Form_Click()
Dimnum!
num= InputBox("please input a number :")
Ifnum > 0 Then
Printnum; "是一个正数"
Else
Printnum; "是一个负数"
EndIf
EndSub
【例4】 判断某年是不是闰年。
闰年的条件:年份能被400整除,或者年份能被4整除但不能被100整除。
算法设计:由条件可知有两种情况是闰年,一种情况是year Mod 400 = 0(被400整除)另一种情况是year Mod 4 = 0 And year Mod 100<> 0(被4整除但不被100整除),只要满足其中一个条件就是闰年,所以这两个表达式之间应该用Or连接。
PrivateSub Form_Click()
Dimyear As Integer
year= InputBox("请输入一个年份:")
If year Mod 400 = 0 Or year Mod 4 = 0 And year Mod 100 <> 0 Then
Printyear; "是闰年"
Else
Printyear; "不是闰年"
EndIf
EndSub
⑶If...Then...Else语句也可以写为单行形式,即
If<条件>Then<语句块1>Else<语句块2>
【例5】将例3用单行语句改写。
PrivateSub Form_Click()
Dimnum!
num= InputBox("please input a number :")
Ifnum > 0 Then Print num; "是一个正数" Else Print num; "是一个负数"
End Sub
3. IIf函数
格式:IIf(条件,表达式1,表达式2)
说明:
⑴该函数在运算时,首先计算“条件”的值,如果“条件”的值为真,则该函数的返回值就是“表达式1”的值,否则函数的返回值是“表达式2”的值。例如:
PrintIIf(3>5,1,-1)的结果为-1。
⑵函数中的三个参数都不能省略。
⑶可以将IIf函数看作是一种简单的If …Then …Else结构。例如:
MaxValue=IIf(x>y,x,y)
可以改写为单行If语句:
Ifx>y Then MaxValue=x Else MaxValue=y
二者的功能是一致的。
4.If...Then...ElseIf语句
格式:
If<条件1>Then
<语句块1>
ElseIf<条件2>Then
<语句块2>
…
[Else
语句块n+1]
End If

说明:
If...Then...ElseIf语句用于实现多分支结构。语句执行过程:依次判断条件1、条件2……,一旦遇到表达式的值为真,则执行该条件下的语句块。如果所有的表达式都不为真,则执行最后的Else下面的语句块n+1,如果没有Else语句,则什么也不执行,跳出If语句,执行End If后面的语句。流程图如图3所示。
If...Then...ElseIf语句可以用于条件比较复杂的多分支情况。
【例6】输入一个分数,判断它应得的学分。90分以上得4学分,80-89分得3学分,70-79分得2学分,60-69分得1学分,60分以下不得学分。
Private Sub Form_Click()
Dim score!,grade!
score = InputBox("请输入分数:")
If score >= 90 Then
grade = 4
ElseIf score >= 80 Then
grade = 3
ElseIf score >= 70 Then
grade = 2
ElseIf score >= 60 Then
grade = 1
ElseIf score < 60 Then
grade = 0
End If
Print"应得学分为:";grade
End Sub
当输入一个分数时,程序从第一个条件开始判断,如果条件为真,执行“grade =
If语句执行过程中,一旦有一个分支被执行,便退出If语句,继续执行End If下面的语句,也就是说如果有多个条件都为真,只能执行第一个条件为真的分支。因此,利用If多分支语句筛选数据时,如果条件设计不当,就不能正确的实现筛选。
【例8】将例7的筛选条件重新设计。
Private Sub Form_Click()
Dim score!,grade!
score = InputBox("请输入分数:")
If score < 60Then
grade = 0
ElseIf score >= 60 Then
grade =1
ElseIf score >= 70 Then
grade =2
ElseIf score >= 80 Then
grade = 3
ElseIfscore >= 90 Then
grade = 4
End If
Print"应得学分为:";grade
End Sub
运行程序时输入80,会看到结果为“应得学分为:
使用多分支If语句时,一定要注意思路清晰,要养成良好的程序书写风格,层次明确,便于阅读和修改程序。
5. If语句的嵌套
如果一个If语句块中包含另一个If语句,则称为If语句的嵌套。
格式:
If<条件1>Then
<语句块1>
Else
If<条件2> Then
<语句块2>
…
Else
<语句块3>
…
End If
End If
说明:嵌套必须完全“包住”,不能互相交叉,即把一个If…Then…Else块放在另一个If…Then…Else块中。
例如将例6分段函数用If语句的嵌套改写:
Private Sub Command1_Click()
Dim x As Single, y As Single
x = Val(Text1.Text)
If x >0 Then
y = x * x + 1
Else
Ifx=0 Then
y = 0
Else
y=2*x-1
End If
End If
Text2.Text = y
End Sub
6.Select Case语句
实现多分支的筛选,使用If语句嵌套并不是最理想的,Visual Basic提供了Select Case语句可以更方便的完成多分支程序的设计。Select Case语句也称为Case语句或情况语句,其功能是根据测试表达式的值,在几组Case子句中挑选出一组符合条件的语句块执行。
格式:
Select Case <测试表达式>
Case<值1>
<语句块1>
Case<值2>
<语句块2>
…
[Case Else
<语句块n+1>]
End Select
语句执行过程:先计算测试表达式的值,依次与Case子句中的值相比较,如果遇到相匹配的值,则执行该Case子句中的语句块,然后跳出Select Case语句,继续执行End Select下面的语句。
说明:
(1)测试表达式可以是任何数值表达式或字符串表达式,也可以是日期或逻辑表达式;
(2)值1、值2是测试表达式可能取的值,与测试表达式的类型必须相同。每个Case分支可以列出多个值,可以是以下形式之一:
Case 1,2,3 多个具体值,用逗号隔开
Case 1 to 10 使用关键字To表示值的范围
(3) 使用Is关系表达式,例如:
Case Is>=10 '表示测试表达式的值大于等于10
Case Is <>"" '表示测试表达式的值不为空字符串
(4)也可以使用以上几种形式的组合,例如:
Case 1,3,Is>10 '表示测试表达式的值为1、3或大于10
【例9】用Case语句编写将输入成绩转换为相应学分。
Private Sub Form_Click()
Dim score!, grade!
score = InputBox("输入成绩")
Select Case score
Case Is >= 90
grade = 4
Case Is >= 80
grade = 3
Case Is >= 70
grade = 2
Case Is >= 60
grade = 1
Case Is < 60
grade = 0
End Select
Print "应得学分为:"; grade
End Sub
注意,使用Select Case语句也要确保值列表顺序的合理性,才能够正确筛选数据,如果将例中的值列表按相反顺序编写,就不能合理地筛选数据了。
Case Else子句是可选的,表示没有匹配的值时则执行该子句中的语句块n+1。通常加上Case Else语句来处理不可预见的测试表达式的值。如果测试表达式没有匹配值,而且也没有Case Else语句,则程序会跳到End Select之后的语句继续执行。
=========================================================================================
========================================================================================

