首页 百科知识 条件选择结构

条件选择结构

时间:2022-10-03 百科知识 版权反馈
【摘要】:Text5.Value=/4 右击 “清除” 按钮 , 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码: 右击 “退出” 按钮 , 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码:条件语句的Then后不能有其他语句 Else If不能写成Else If, 每个If对应一个End If但Else If不算。Text11.Value=78'累计月积数=÷2×存入次数。

一、 If...Then...语句

•语法格式1:

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

关系表达式或逻辑表达式成立时执行Then后的语句, 否则直接执行If的下一条语句。<语句>可以是一条语句, 也可以是若干条用冒号 “:” 隔开的VBA语句组。

例10: 出一道两位数加法题让小学生回答。

Subsub9()

Dim AAs Integer,BAs Integer,Sum As Integer

Randomize Timer

A=Rnd∗100:B=Rnd∗100

Sum=Input Box(A&"+"&B&"=?","两位数加法")

If Sum=A+BThen Msg Box"答案正确!"

If Sum<>A+BThen Msg Box"答错了! 正确答案是"&A+B

End Sub

其运行结果如图9.24所示。

答案错误时:

图9.24 条件控制输出实例

例如, 判断变量X是否为不小于10的整数:

If X >=10and X=Int(X)Then...

•语法格式2:

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

If后的表达式成立时执行Then后的语句, 不成立时执行Else后的语句; 然后程序继续执行If后的其他语句。

例11: 输入的考试分数是否合格, 并分别输出不同信息。

Sub Passed()

Dim Grade As Integer

Grade=Input Box("请输入考试分数:")

If Grade >=60Then Msg Box("合格")

Else Msg Box("不合格")

End Sub

•语法格式3 (多条件选择):

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

<语句组>

End If

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

<语句组1>

Else

<语句组2>

End If

二、 案例十二的操作步骤

例12: 制作案例十二中计算课程平均成绩的窗体。 其步骤如下:

(1) 单击 【创建】 选项卡中的 “窗体设计” 新建一个窗体, 添加标签、 文本框和按钮控件, 并添加相应内容。

(2) 在 【窗体设计工具】 选项卡的 “设计” 中选择 “添加现有字段”, 添加student表,将学号、 姓名和照片字段拖动到窗体上。

(3) 使用导航按钮 “下一项记录” 和 “前一项记录” 进行查找, 如图9.25所示。

(4) 通过文本框属性修改4个成绩文本框名分别是Text1~Text4, 平均成绩项为Text5。

(5) 通过按钮属性修改3个按钮名为Command0、 Command1和Command2, 方便编程。

【说明】 若将学号、 姓名及4门课程及平均成绩建立一个表, 可直接拖字段名到窗体,形成和数据库表绑定的字段, 此时计算的平均成绩可填写到表中。

图9.25 求解平均成绩界面

(6) 右击 “计算平均” 按钮 (Command0), 选择 “事件生成器” 下的 “代码生成器”,打开模块编辑窗口, 键入程序代码如下所示。 运行结果见案例十二。

Private Sub Command0_Click()

If Text1=""Or Text2=""Or Text3=""Or Text4=""Then

Msg Box"成绩输入不全,继续输入成绩!"

Else

Text5.Value=(Val(Text1.Value)+Val(Text2.Value)+Val(Text3.Value)+Val(Text4.Value))/4

Endif

(7) 右击 “清除” 按钮 (Command1), 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码:

Private Sub Command1_Click()

Text1.Value=""

Text2.Value=""

Text3.Value=""

Text4.Value=""

Text5.Value=""

End Sub

(8) 右击 “退出” 按钮 (Command2), 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码:

Private Sub Command2_Click()

Do Cmd.Run Macro"close_window"

End Sub

条件语句的Then后不能有其他语句 (单引号的注释语句除外) Else If不能写成Else If, 每个If对应一个End If但Else If不算。

三、 注释语句

在程序中加上注释语句有利于程序的维护和阅读。

格式: Rem注释内容或使用单引号“'”注释内容

四、 多条件语句

如果条件复杂, 程序需要多个分支, 即要用多个If语句嵌套, 这样程序变得不易阅读。此时可使用Select Case语句来写出结构清晰的程序。

语法格式:

Select Case<条件表达式>

Case<表达式1>

[<语句组1>]

Case<表达式2>

[<语句组2>]

……

Case Else

[<语句组n>]

Case Else

[<语句组n+1>]

End Select

其中的<条件表达式>是任何数值或字符串表达式。 <表达式>可以是下列几种形式:

•数值表达式;

•数值表达式To数值表达式;

•Is<数值表达式>。

若<表达式n>与Case子句中的一个<表达式>相匹配, 则执行该子句后面的语句组。 若没有一个表达式的值能满足测试表达式, 则执行Case Else后的语句。

若没有Case Else语句, 没有满足的表达式时, 则不执行任何语句。

若<表达式>中含有To关键字, 必须要求第一个表达式小于第二个表达式。

若<表达式>含有Is关键字, Is代表<条件表达式>构成的关系值为真时则匹配。

多条件语法流程结构如图9.26所示。

图9.26 多条件语法流程结构

五、 案例十三的操作步骤

例13: 制作案例十三个人所得税计算的过程。

(1) 创建一个窗体, 添加1个标签、7个文本框和2个按钮控件, 添加相应的文字内容, 并按照顺序修改文本框名为Text1~Text7, 如图9.27所示。

(2) 右击 “养老保险费” 文本框, 打开 “代码生成器”, 选择焦点事件 (Got Focus),在其下编写的代码为:

Private Sub Text2_Got Focus()

Text2.Value=Val(Text1.Value)∗0.04

End Sub

(3) 右击 “医疗保险费” 文本框, 打开 “代码生成器”, 选择焦点事件 (Got Focus),在其下编写的代码为:

Private Sub Text3_Got Focus()

Text3.Value=Val(Text1.Value)∗0.02

End Sub

图9.27 个人所得税编辑界面

(4) 右击 “失业保险费” 文本框, 打开 “代码生成器”, 选择焦点事件 (Got Focus),在其下编写的代码为:

Private Sub Text4_Got Focus()

Text4.Value=Val(Text1.Value)∗0.005

End Sub

(5) 右击 “住房公积金” 文本框, 打开 “代码生成器”, 选择得到焦点事件(Got Focus), 在其下编写的代码为:

Private Sub Text5_Got Focus()

Text5.Value=Val(Text1.Value)∗0.08

End Sub

(6) 右击 “计税额” 文本框, 打开 “代码生成器”, 选择得到焦点事件 (Got Focus),在其下编写的代码为:

Private Sub Text7_Got Focus()

Dim Tax As Single

Tax=Val(Text1.Value)-Val(Text2.Value)-Val(Text3.Value)-Val(Text4.

Value)-Val(Text5.Value)

Tax=Tax-3500

If Tax>0Then

Text7.Value=Tax

Else

Text7.Value=0

(7) 右击 “计税” 按钮 (Command0), 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码如下。 运行结果见案例十三。

Private Sub Command0_Click()

Dimsalary Tax As Single

Dim Tax1As Single

salary Tax=Val(Text7.Value)

Ifsalary Tax>0Then

Select Casesalary Tax

Case0To1500:Tax1=salary Tax∗0.03

Case1500To4500:Tax1=salary Tax∗0.1-105

Case4500To9000:Tax1=salary Tax∗0.2-555 Case9000To35000:Tax1=salary Tax∗0.25-1005

Case35000To55000:Tax1=salary Tax∗0.3-2755

Case55000To80000:Tax1=salary Tax∗0.35-5505

Case Is>80000:Tax1=salary Tax∗0.45-13505

Case Else: Tax1="输入工资数据错误"

End Select

Else

Tax1=0

End If

Text6.Value=Tax1

“重置” 按钮的程序代码为:

Private Sub Command1_Click()

Text1.Value=""

Text2.Value=""

Text3.Value=""

Text4.Value=""

Text5.Value=""

Text6.Value=""

Text7.Value=""

End Sub

六、 案例十四的操作步骤

例14: 制作银行个人存款利息计算器的过程。

(1) 创建一个窗体, 添加标签、 文本框、 组合框和按钮控件, 如图9.28所示。

(2) 右击 “计算” 按钮 (Command1), 选择 “事件生成器” 下的 “代码生成器”, 打开模块编辑窗口, 键入程序代码如下。 运行结果见案例十四。

Private Sub Combo2_After Update()

Select Case(Combo2.Value)

Case"一天"

Call Reset Result

Call Day Fimit

图9.28 银行个人利息编辑界面

If Combo1.Value="整存整取"Then

Msg Box"整存整取最短期限三个月",vb Information,"警告"

Call Reset Half

Combo2.Value="选择期限"

Else

Combo1.Value="通知存款"

Combo4.Value=0.95

Combo1.Enabled=False

Combo3.Enabled=False

Call Mask Text2

End If

Text11.Enabled=False

Case"七天"

Call Reset Result

Call Day Fimit

If Combo1.Value="整存整取"Then

Msg Box"整存整取最短期限三个月",vb Information,"警告"

Call Reset Half

Combo2.Value="选择期限"

Else

Combo1.Value="通知存款"

Combo4.Value=1.49

Combo1.Enabled=False

Combo3.Enabled=False

Call Mask Text2

End If

Text11.Enabled=False

Case"三个月"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=3.1

Text11.Value=3

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

Case"六个月"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=3.3

Text11.Value=6

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

Case"一年"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=3.5

Text11.Value=12

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

Case"二年"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=4.4

Text11.Value=24

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

Case"三年"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=5

Text11.Value=36

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

Case"五年"

Call Reset Result

If Combo1.Value="通知存款"Then

Msg Box"通知存款只有一天和七天期限",vb Information,"警告"

Call Reset Half

Call Day Fimit

Combo2.Value="选择期限"

Else

Combo1.Value="整存整取"

Combo4.Value=5.5

Text11.Value=60

Combo3.Enabled=False

Call Mask Text3

End If

Text11.Enabled=False

End Select

End Sub

Private Subcombo4_After Update()

Select Case(Combo4.Value)

Case0.36

Call Reset Half

Call Show Text All

Combo1.Value="活期存款"

Combo4.Value=0.5

Combo2.Enabled=False

Text11.Enabled=False

Combo3.Enabled=False

Call Mask Text1

Call Day Start

Call Day Final

Case0.95

Call Reset Half

Call Show Text All

Combo1.Value="通知存款"

Combo4.Value=0.95

Combo2.Value="一天"

Combo2.Enabled=False

Text11.Enabled=False

Combo3.Enabled=False

Call Mask Text2

Call Day Fimit

Case1.49

Call Reset Half

Call Show Text All

Combo1.Value="通知存款"

Combo4.Value=1.49

Combo2.Value="七天"

Combo2.Enabled=False

Text11.Enabled=False

Combo3.Enabled=False

Call Mask Text2

Call Day Fimit

Case3.1

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=1.71

Combo3.Enabled=False

Combo2.Value="三个月"

Text11.Value=3

Call Mask Text3

Case3.3

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=3.3

Combo3.Enabled=False

Combo2.Value="六个月"

Text11.Value=6

Call Mask Text3

Case3.5

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=3.5

Combo3.Enabled=False

Combo2.Value="一年"

Text11.Value=12

Call Mask Text3

Case4.4

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=4.4

Combo3.Enabled=False

Combo2.Value="二年"

Text11.Value=24

Call Mask Text3

Case5

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=5

Combo3.Enabled=False

Combo2.Value="三年"

Text11.Value=36

Call Mask Text3

Case5.5

Call Reset Half

Call Show Text All

Combo1.Value="整存整取"

Combo4.Value=5.5

Combo3.Enabled=False

Combo2.Value="五年"

Text11.Value=60

Call Mask Text3

End Select

End Sub

Private Subcombo1_After Update()

Select Case(Combo1.Value)

Case"活期存款"

Call Show Text All

Call Reset Half

Combo4.Value=0.5

Combo2.Enabled=False

Combo4.Enabled=False

Combo3.Enabled=False

Text11.Enabled=False

Call Mask Text1

Call Day Start

Call Day Final

Case"整存整取"

Call Show Text All

Call Reset Half

Combo2.Value="选择期限"

Combo3.Enabled=False

Call Mask Text3

Case"存本取息"

Call Show Text All

Call Reset Half

Combo2.Value=Null

Combo4.Value=Null

Combo3.Value="选择期限"

Combo2.Enabled=False

Combo4.Enabled=False

Call Mask Text3

Case"零存整取"

Call Show Text All

Call Reset Half

Combo2.Value=Null

Combo4.Value=Null

Combo3.Value="选择期限"

Combo2.Enabled=False

Combo4.Enabled=False

Call Mask Text3

Case"通知存款"

Call Show Text All

Call Reset Half

Combo4.Value=Null

Combo2.Value="选择期限"

Combo3.Enabled=False

Combo4.Enabled=False

Call Mask Text2

Call Day Fimit

End Select

End Sub

Private Subcombo3_After Update()

Select Case(Combo3.Value)

Case"一年"

Combo4.Value=3.1

If(Combo1.Value="零存整取")Then

Text11.Value=78'累计月积数=(存入次数+1)÷2×存入次数。 推算一年期的累计月积数为(12+1)÷2×12=78,以此类推,三年期、五年期的累计月积数分别为666和1830

Else

Combo1.Value="存本取息"

Text11.Value=12

Combo2.Enabled=False

Combo4.Enabled=False

End If

Call Mask Text3

Call Reset Result

Case"三年"

Combo4.Value=3.3

If(Combo1.Value="零存整取")Then

Text11.Value=666

Else

Combo1.Value="存本取息"

Text11.Value=36

Combo2.Enabled=False

Combo4.Enabled=False

End If

Call Mask Text3

Call Reset Result

Case"五年"

Combo4.Value=3.5

If(Combo1.Value="零存整取")Then

Text11.Value=1830

Else

Combo1.Value="存本取息"

Text11.Value=60

Combo2.Enabled=False

Combo4.Enabled=False

End If

Call Mask Text3

Call Reset Result

End Select

End Sub

Private Sub Command1_Click()

If Is Null(Text0.Value)Then

Text0.Value=0

End If

If Combo1.Value="活期存款"Then

Call Arith Days1

Else If Combo1.Value="通知存款"Then

Call Arith Days2

Else

Call Arith Months

End If

End Sub

Private Sub Command2_Click()

Call Reset All

Call Show Text All

End Sub

Private Sub Mask Text1()

Text1.Enabled=False

Text2.Enabled=False

Text3.Enabled=False

End Sub

Private Sub Mask Text2()

Text4.Enabled=False

Text5.Enabled=False

Text6.Enabled=False

Text7.Enabled=False

Text8.Enabled=False

Text9.Enabled=False

End Sub

Private Sub Mask Text3()

Text1.Enabled=False

Text2.Enabled=False

Text3.Enabled=False

Text4.Enabled=False

Text5.Enabled=False

Text6.Enabled=False

Text7.Enabled=False

Text8.Enabled=False

Text9.Enabled=False

End Sub

Private Sub Show Text1()

Text1.Enabled=True

Text2.Enabled=True

Text3.Enabled=True

End Sub

Private Sub Show Text2()

Text4.Enabled=True

Text5.Enabled=True

Text6.Enabled=True

Text7.Enabled=True

Text8.Enabled=True

Text9.Enabled=True

End Sub

Private Sub Show Text3()

Text1.Enabled=True

Text2.Enabled=True

Text3.Enabled=True

Text4.Enabled=True

Text5.Enabled=True

Text6.Enabled=True

Text7.Enabled=True

Text8.Enabled=True

Text9.Enabled=True

End Sub

Private Sub Show Text All()

Text0.Enabled=True

Combo2.Enabled=True

Combo4.Enabled=True

Combo1.Enabled=True

Combo3.Enabled=True

Text1.Enabled=True

Text2.Enabled=True

Text3.Enabled=True

Text4.Enabled=True

Text5.Enabled=True

Text6.Enabled=True

Text7.Enabled=True

Text8.Enabled=True

Text9.Enabled=True

Text10.Enabled=True

Text11.Enabled=True

Text12.Enabled=True

Text13.Enabled=True

End Sub

Private Sub Reset Result()

Text10.Value=Null

Text12.Value=Null

Text13.Value=Null

End Sub

Private Sub Reset Buttom()

Text1.Value=Null

Text2.Value=Null

Text3.Value=Null

Text4.Value=Null

Text5.Value=Null

Text6.Value=Null

Text7.Value=Null

Text8.Value=Null

Text9.Value=Null

Text10.Value=Null

Text11.Value=Null

Text12.Value=Null

Text13.Value=Null

End Sub

Private Sub Reset Half()

Combo2.Value=Null

Combo4.Value=Null

Combo3.Value=Null

Text1.Value=Null

Text2.Value=Null

Text3.Value=Null

Text4.Value=Null

Text5.Value=Null

Text6.Value=Null

Text7.Value=Null

Text8.Value=Null

Text9.Value=Null

Text10.Value=Null

Text11.Value=Null

Text12.Value=Null

Text13.Value=Null

End Sub

Private Sub Reset All()

Text0.Value=Null

Combo2.Value=Null

Combo4.Value=Null

Combo1.Value=Null

Combo3.Value=Null

Text1.Value=Null

Text2.Value=Null

Text3.Value=Null

Text4.Value=Null

Text5.Value=Null

Text6.Value=Null

Text7.Value=Null

Text8.Value=Null

Text9.Value=Null

Text10.Value=Null

Text11.Value=Null

Text12.Value=Null

Text13.Value=Null

End Sub

Private Sub Arith Months()

Text10.Value=Val(Combo4.Value)/12/100∗Val(Text0.Value)

Text12.Value=Val(Combo4.Value)/100∗Val(Text0.Value)/12∗Val (Text11.Value)

Text13.Value=Val(Text0.Value)+Val(Text12.Value)

End Sub

Private Sub Arith Days1()

Text10.Value=Val(Combo4.Value)/12/100∗Val(Text0.Value)

temp_start=(Val(Text5.Value)-1)∗30+Val(Text6.Value)

temp_final=(Val(Text8.Value)-1)∗30+Val(Text9.Value)

If Val(Text4.Value)=Val(Text7.Value)Then

Text12.Value=Val(Combo4.Value)/100/360∗(temp_final-temp_start)∗Val(Text0.Value)

Text13.Value=Val(Text0.Value)+Val(Text12.Value)

Else If(360-temp_start+temp_final)>360Then

Msg Box"存款日期已经大于一年,选择整存整取或通知存款减少利息损失", vb Information,"警告"

Call Reset Result

Call Day Start

Call Day Final

Else

Text12.Value=Val(Combo4.Value)/100/360∗(360-temp_start+temp_final)∗Val(Text0.Value)

Text13.Value=Val(Text0.Value)+Val(Text12.Value)

End If

End Sub

Private Sub Arith Days2()

Text10.Value=Val(Combo4.Value)/12/100∗Val(Text0.Value)

Text12.Value=Val(Combo4.Value)/100/360∗Val(Text0.Value)∗(Val (Text1.Value)∗365+Val(Text2.Value)∗30+Val(Text3.Value))

Text13.Value=Val(Text0.Value)+Val(Text12.Value)

End Sub

Private Sub Day Fimit()

Text1.Value=0

Text2.Value=0

Text3.Value=0

End Sub

Private Sub Day Start()

Text4.Value=0

Text5.Value=0

Text6.Value=0

End Sub

Private Sub Day Final()

Text7.Value=0

Text8.Value=0

Text9.Value=0

End Sub

Private Sub Text7_After Update()

If Val(Text7.Value)<Val(Text4.Value)Then

Msg Box"取款年份要大于起存年份",vb Information,"警告"

Call Day Final

End If

End Sub

Private Sub Text8_After Update()

If Val(Text8.Value)<Val(Text5.Value)And Val(Text7.Value)=Val (Text4.Value)Then

Msg Box"取款月份不能小于起存月份",vb Information,"警告"

Call Day Final

End If

End Sub

Private Sub Text9_After Update()

If Val(Text9.Value)<Val(Text6.Value)And Val(Text8.Value)=Val (Text5.Value)And Val(Text7.Value)=Val(Text4.Value)Then

Msg Box"取款日期不能小于起存日期",vb Information,"警告"

Call Day Final

End If

End Sub

测试表达式不一定是关系表达式或逻辑表达式, 可以是任意类型, 但Case子句中的表达式类型必须与之相一致。

如果Case子句中的表达式是一个常量, 则该常量直接写在Case之后, 如Case100。

如果Case子句后的表达式是一个范围, 可用To从小到大指定, 如Case90To99、Case “A” To “Z”; 或者使用Is<关系运算符><表达式>。 如: Case Is>3And<8。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈