8.3.3 选择语句

8.3.3 选择语句

选择语句又称为分支语句、条件语句。使用选择语句可让程序中语句的执行次序除了自上而下的顺序外,还能根据某个变量或表达式的值“跳跃”执行,即根据条件的值选择所执行的语句:当表达式的值成立时执行某些语句;不成立时不执行,或者执行另一些语句。

1.单分支结构

单分支选择结构是最简单的选择语句,其结构如下:

格式1:

If <关系表达式或逻辑表达式> then <语句>

格式2:

If <关系表达式或逻辑表达式> then

<语句序列>

End If

功能:当If后的关系表达式或逻辑表达式成立时,才能执行Then后面的语句,否则不执行,直接执行If的的下一条语句。单分支If语句流程如图8-17所示。

说明:格式1中的<语句>实际上是语句组,可以是若干条用冒号“:”隔开的VBA语句;当<表达式>成立时这些语句全部被执行,不成立则全部不执行。格式2中,选择语句的Then后不能有其他语句(单引号引导的注释语句除外),一旦有语句,VBA就认为是格式1,从而断定End If是多余的,程序运行将出错。

2.双分支结构

与If...Then...语句相比,If...Then...Else...语句不但考虑了条件成立时应执行的语句,也考虑了条件不成立时要执行的语句,其结构如下:

格式1:

图8-17 单分支If语句流程图

If <关系或逻辑表达式> Then <语句1> Else <语句2>

格式2:

If <关系或逻辑表达式> Then

<语句序列1>

Else

<语句序列2>

Else If

功能:当If后面的表达式成立时执行Then后的语句,不成立时执行Else后的语句,然后程序继续执行If后的其他语句。双分支If语句流程如图8-18所示。

图8-18 双分支If语句流程图

任务8.2 创建名为“选择”窗体,添加两个“文本框”(“堆积”布局),一个“按钮”,建立“按钮”的“单击事件”,要求在文本框中输入两个整数,通过输出函数,输出较大的一个。程序界面设计视图如图8-19所示。

图8-19 窗体设计视图

操作步骤:

(1)创建“选择”窗体,添加两个“文本框”,两个“文本框”以“堆积”布局,添加一个“按钮”,调整控件的适当位置,选中“按钮”,在“属性表”面板中,选择“事件”选项,在“单击”列表框中选择“[事件过程]”,单击右侧“…”按钮,进入窗体模块的代码窗口,输入按钮单击事件的代码,如图8-20所示。

图8-20 代码窗口

Private Sub Command4_Click()

Dim a As Integer,b As Integer,m As Integer

a=Text0

b=Text2

If a>b Then

m=a

Else

m=b

End If

MsgBox "两个数中较大的数为:"& m,64+1,"最大值"

End Sub

(3)切换到窗口视图,单击按钮,触发单击事件,运行程序,如图8-21所示,单击“保存”按钮。

图8-21 运行程序

3.多分支结构

双分支结构语句只能根据条件表达式的真或假来处理两个分支中的一个。当有多种条件时,要使用多分支结构语句。

多分支结构如下:

If <表达式1> Then

<语句块1>

Else If <表达式2> Then

<语句块2>

……

Else

<语句块n+1>

End If

功能:依次测试条件表达式1、条件表达式2、…,当遇到条件表达式为真时,则执行该条件下的语句块。如均不为真,若有Else选项,则执行Else后的语句块,否则执行End If后面的语句。

多分支结构的流程如图8-22所示。

图8-22 多分支结构的流程图

说明:不管条件分支有几个,程序执行一个分支后,其余分支不再执行。当有多个条件表达式同时为真时,只执行第一个与之匹配的语句块。因此,应注意多分支结构中条件表达式的不要同时为真。

任务8.3 设计名为“系统登录”窗体,用户名为“admin”,密码为“000000”,如图8-23所示,要求如下。

(1)如果用户名为空,弹出输出框,提示用户“用户名有空,请输入用户名!”

(2)如果密码为空,弹出输出框,提示用户“密码有空,请输入密码!”。

(3)如果用户名输入错误,弹出输出框,提示用户“无此用户,请重新输入!”,超过3次,提示用户“3次输入错误,退出系统!”,关闭窗口。

(4)如果密码输入错误,弹出输出框,提示用户“密码有误,请重新输入!”,超过3次,提示用户“3次输入错误,退出系统!”,关闭窗口。

(5)当输入用户名和密码都正确,弹出对话框,提示用户“准备打开教学信息管理系统,欢迎使用!”,关闭登录窗口,打开“教学信息管理”窗体。

操作步骤:

(1)创建名为“系统登录”窗体,取消窗体“记录选择器”、“导航器按钮”,无滚动条。设置标题为“系统登录”。

添加两个“文本框”名为“Text0”和“Text2”(分别用于输入用户名和密码)。两个“文本框”以“堆积”布局,文本框“Text2”的输入掩码为“密码”。

添加一个命令按钮控件Command4,设置“标题”为“确定”。

(2)打开Command4的单击事件代码窗口,输入如下代码。

图8-23 系统登录窗口

Public iname As Integer '定义模块级变量,表示用户名输入次数

Public ipass As Integer '定义模块级变量,表示密码输入次数

Private Sub Command4_Click()

Dim name As Variant,pass As Variant

'如果设置为string则当文本框为空时,不能通过编译

name=Text0

pass=Text2

If IsNull(name)Then

MsgBox"用户名有空,请输入用户名!",vbOKOnly+vbExclamation,"警告"

Text0.SetFocus '文本框获得焦点

ElseIf IsNull(pass)Then

MsgBox"密码有空,请输入密码!",vbOKOnly+vbExclamation,"警告"

Text2.SetFocus

ElseIf name<>"admin"Then

If iname<2 Then

MsgBox"无此用户,请重新输入!",vbOKOnly+vbExclamation,"警告"

Text0="" '清空文本框

Text0.SetFocus '文本框获得焦点

iname=iname+1

Else

MsgBox"3次输入错误,退出系统!",vbOKOnly+vbExclamation,"退出"

DoCmd.Close '关闭当前窗体

Exit Sub

End If

ElseIf pass<>"000000"Then

If ipass<2 Then

MsgBox"密码有误,请重新输入!",vbOKOnly+vbExclamation,"警告"

Text2="" '清空文本框

Text2.SetFocus '文本框获得焦点

ipass=ipass+1

Else

MsgBox"3次输入错误,退出系统!",vbOKOnly+vbExclamation,"退出"

DoCmd.Close

Exit Sub

End If

Else

MsgBox"准备打开学生管理系统,欢迎使用!",vbOKOnly+vbInformation,"欢迎"

DoCmd.Close '关闭当前窗体

DoCmd.OpenForm"教学信息管理" '打开窗体

End If

End Sub

(3)保存窗体,切换为“窗体视图”,单击“确定”按钮,验证程序设计。

4.Select Case语句

Select Case语句是一种多分支选择语句,它根据多个表达式的值,选择其中一个对应执行。

Select Case语句的格式为:

Select Case <表达式>

Case <表达式值列表1>

<语句序列1>

Case <表达式值列表2>

<语句序列2>

[Case Else

<语句序列n+1>]

End Select

功能:Select语句首先计算Select Case后<表达式>的值,然后依次与每个Case子句中表达式值列表匹配,如果满足,则执行此Case下面语句序列,当所有Case语句都不满足时,执行Case Else子句。如果条件表达式满足多个Case语句,则只有第一个Case语句被执行。

Select语句的流程如图8-24所示。

图8-24 情况语句的流程图

说明:Select Case“表达式”可以是数值型或字符串表达式。Case表达式值列表与“表达式”的类型必须相同。

Case表达式可以是下列几种格式。

(1)单一数值,如Case 10。

(1)多个并列的值,数据之间用逗号分开,如Case 2,4,6,8,10。

(3)用关键字To分隔开的两个值或表达式,前一个值必须比后一个值要小。字符串的比较是从它们的第一个字符的ASCII码值开始比较的,直到分出大小为止。Case 10 To 20。

(4)用关系键Is(表示表达式的值)连接关系运算符,后面跟变量或具体的值,如Case Is>10。

任务8.4 创建名为“等级”窗体。

添加2个“文本框”,一个用来输入分数,另一个用来显示等级。

添加2个“按钮”,编写按钮单击事件,一个功能是:在一个文本框中输入百分制成绩、转化为五级制,转换规则为90~100之间为“优秀”;80~89之间为“良好”;在70~79之间为“中等”;在60~69之间为“及格”;在0~59之间为“不及格”,不在0~100内的“分数越界”,使用第二个文本框输出对应的等级。另一个功能是清空两个文本框,为下一次转换作准备。

程序界面如图8-25所示。

图8-25 程序结果图

操作过程:

(1)创建“转换”窗体,添加2个“文本框”及2个“按钮”,格式化后,切换到“设计视图”,进入“窗体模块”的代码窗口,分别输入2个“按钮”的“单击事件”代码,如图8-26所示。

图8-26 按钮的单击事件

按钮的单击事件代码如下:

Private Sub Command4_Click()

Dim score As Integer,score_class As String

score=Text0

Select Case score

Case 90To 100

score_class="优秀"

Case 80To 89

score_class="良好"

Case 70To 79

score_class="中等"

Case 60To 69

score_class="及格"

Case 0To 59

score_class="不及格"

Case Else

score_class="分数越界"

End Select

Text2=score_class

End Sub

Private Sub Command5_Click()

Text0=""

Text2=""

End Sub

(2)切换为“窗体视图”,输入“分数”,单击“转换”按钮,分数转换为对应的等级,如图8-27所示,保存窗体。

图8-27 程序运行效果