一、 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
六、 案例十四的操作步骤
(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。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。