已阅读5页,还剩118页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.5 VBA程序语句,VBA 语句分为两大类型: 1)声明语句 用于给变量、常量或过程定义命名。 2)执行语句 用于执行赋值操作,调用过程,实现各种流程控制。执行语句有三种结构: (1)顺序结构:按照语句顺序执行。即程序从左至右、自顶向下执行语句。如赋值语句、过程调用语句等。 (2)选择结构:根据条件选择执行路径。 (3)循环结构:重复执行某一段程序语句。,9.5.1 VBA 程序语句编写规则,(1)每个语句占一行,若在一行中写多个语句,则语句之间用“:”分隔。例:a = 0 : i = i + 1 (2)当一条语句一行写不下,可用续行符(空格后面加“_”)续写,将语句分成多行。 例如: Msgbox(“尊敬的“ & name & “先生/女士:欢迎您使用“ & _ “Access基础知识教育的示范数据库家庭经营管理数据库! “) (注:其中的 & 为连接运算符。) (3)在VBA代码中,不区分字母的大小写,例:SUM 与 Sum 是等同的。 (4)当输入一行语句并按回车键后,若该行代码以红色文本显示,则表明该语句有错误。,有一个空格,9.5.2 VBA 注释语句,注释语句有两种方式: (1)使用 Rem 语句 (2)用英文单引号 注释语句可写在某语句的后面,也可单独一行,若把Rem语句写在某语句的后面的同一行时,要在该语句与Rem 之间用“:”分隔。 例如: s = 3.14 * r * r 求圆的面积 r = 2 : Rem r 表示圆的半径,图9-22 “编辑”工具栏,注意: 可通过选中两行或多行代码并在“编辑”工具栏上选择“设置注释块”或“解除注释块”按钮来对该代码块添加或删除注释符号。,9.5.3 VBA 声明语句,声明语句用于命名和定义常量、变量、数组和过程。在定义了这些内容的同时,也定义了它们的作用范围,即:局部、模块或全局。与使用的关键字(Dim、Public、Static 或 Global)有关。 例如,有一程序段如下: Sub Sample() Const PI=3.14159 Dim I As Integer, K As Long, Y(3,5) As Double . End Sub Const 定义 PI 为符号常量。Dim 定义了 I 为整型变量、K 为长整型变量和 Y 二维数组有24个元素为双精度型的。,9.5.4 VBA 赋值语句,赋值语句格式: Let 变量名 = 表达式 功能:计算右端的表达式,并把结果赋值给左端的变量。Let为可选项。符号 “=” 被称为赋值号。 注意:赋值号“=”左边的变量可以是对象的属性,但不能是常量。 例如: A = 99 把数值 99 赋给变量A text1.Value = “程序设计“ P = “学习” & text1.Value 把“学习程序设计“赋给变量strP,9.5.5 输入/输出的语句,在 VBA 程序中,有时需要输入数据,有时需要数据输出,为此,VBA 提供有相应的输入和输出功能。 输入框(InputBox) 消息框(MsgBox), InputBox 函数的作用 是打开一个对话框,等待用户键入文本或选择一个按钮。当用户单击“确定”按钮或按 Enter 键,函数返回文本框中的输入的值。 例:a = InputBox(“请输入自然数:“ , “输入提示“),1InputBox函数, 函数格式 InputBox(提示 , 标题 , 缺省值 , x 坐标位置 , y 坐标位置) 例:InputBox(“输入自然数“,“输入提示“,“10“,1000, 200) 参数说明: “提示”:唯一不能省略的选项,是字符串表达式,在对话框中作为提示信息显示。 “标题”:字符串表达式,在对话框的标题栏显示。可省略。 “缺省”:当无输入新值时,则该缺省值作为输入的内容。 “x坐标位置”和“y坐标位置”:确定对话框在屏幕上的位置。 注:若用户单击“取消”,该函数返回长度为零的字符串 (“),2MsgBox,MsgBox函数格式: MsgBox( 提示 , 按钮 , 标题) MsgBox过程格式: MsgBox 提示 , 按钮 , 标题 注意:MsgBox 函数与 MsgBox 过程的格式区别,前者有一对圆括号,后者没有圆括号。 1)功能 MsgBox 的作用是打开一个消息对话框,并在该对话框中显示提示消息,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。,MsgBox 的参数说明,MsgBox 函数与 MsgBox 过程的参数相同。 (1)“提示”和“标题”:与 InputBox 函数的意义相同。 (2)“按钮”:本参数可选的。它是整型表达式,决定显示按钮的数目及形式,使用的图标样式,默认按钮是什么以及消息框的强制回应等。如果省略,缺省值为 0。按钮设置值如表9-23所示(P.248)。 在表9-23中,第一组值 (05) 描述了显示的按钮的类型与数目;第二组值 (16, 32, 48, 64) 描述了图标的样式;第三组值 说明哪一个按钮是缺省(默认)值;而第四组值则决定消息框的强制返回性。将这些数字相加以生成按钮参数值的时候,只能由每组值取用一个数字。,MsgBox 函数的返回值,表9-24 MsgBox 函数的返回值 P.249,例如,Dim a a = MsgBox(“请用户选择单击某一按钮“, 4 + 48 + 0, “MsgBox函数“) 4 表示显示“是”及“否”按钮 48 表示显示 Warning Message 图标( ) 0 表示第一个按钮(“是”按钮)是缺省值,例9-3 使用InputBox函数、MsgBox函数与MsgBox过程的例子。 Private Sub Command0_Click() Dim a As Long a = InputBox(“请输入8个字符的学号:“, “输入学号“, “, 1000, 200) MsgBox “输入学号是 “ & a a = MsgBox(“请用户选择单击某一按钮“, 4 + 48 + 0, “MsgBox函数“) 如图9-24所示 Rem 4 + 48 + 0 表达式中的4的含义:4 表示显示“是”及“否”按钮 Rem 4 + 48 + 0 表达式中的48的含义:48 表示显示 Warning Message 图标 Rem 4 + 48 + 0 表达式中的0的含义:0 表示第一个按钮(“是”按钮)是缺省值 If a = 6 Then 注意,本语句中的 a = 6 也可改用 a = vbYes MsgBox “用户已单击了MsgBox函数对话框中的“是”按钮“, , “MsgBox过程“ End If If a = vbNo Then 注意,本语句中的 a = vbNo 也可改用 a = 7 MsgBox “用户已单击了MsgBox函数对话框中的“否”按钮“, , “MsgBox过程“ 如图9-25所示 End If End Sub,例9-3中的部分代码说明如下,a = MsgBox(“请用户选择单击某一按钮“, 4 + 48 + 0, “MsgBox函数“) If a = 6 Then 注意,根据表9-24,本语句中的 a = 6 也可改用 a = vbYes MsgBox “用户已单击了MsgBox函数对话框中的“是”按钮“, , “MsgBox过程“ End If If a = vbNo Then 注意,根据表9-24,本语句中的 a = vbNo 也可改用 a = 7 MsgBox “用户已单击了MsgBox函数对话框中的“否”按钮“, , “MsgBox过程“ End If,9.5.6 选择结构,在 VBA 中,实现选择结构的功能有两种方式,一是使用条件语句(如 If End 语句和 Select Case 语句),二是使用具有选择条件的函数(如 Iif 函数、Switch 函数、Choose函数)。,1IfThen 条件语句,If Then 语句有两种格式: (1)单行结构的格式 If 条件表达式 Then 语句组 (2)块结构的格式 If 条件表达式 Then 语句组 End If 功能:若条件值为 True,则执行 Then 后面的语句组,否则执行本语句的下一个语句。其执行过程如上图所示。,例1: If cj 10 Then A = A + 1 : B = B + A : C = C + B 单行结构Then后边有3条语句 注意:例1中的两个 If 条件语句的功效是完全一样的。,2If.Then.Else条件语句,语句格式: If 条件表达式 Then 语句组 Else 语句组2 End If 功能:首先测试条件,若条件成立,则执行语句组1;否则执行语句组2。执行语句组后,自动转到 End If 的后继语句执行。执行过程如上图所示。,例9-4 飞机场托运行李的收费标准是30公斤以内(包括30公斤)0.30元/公斤,超过部分0.50元/公斤。编写一个事件过程,要求根据输入的任意重量,计算出应付的行李费。 根据题意计算公式如下:,创建一个“VBA 编程”的数据库,新建一个名为 “例9-4-计算行李费”窗体。,添加的控件有: 2个标签控件:名称为 lab1,标题为“行李重量”; 名称为 lab2,标题为“应付行李费”。 2个文本框控件:名称为 txt1 和 txt2。 3个命令按钮控件:名称为 cmd1,标题为“计算”;名称为 cmd2,标题为“清除”;名称为 cmd3,标题为“退出”。,程序代码如下: “计算“按钮代码 Private Sub cmd1_Click() Dim W as single 行李重量 Dim P as single 应付行李费 W = Txt1.Value If W 30 Then P =(W - 30)* 0.5 + 30 * 0.3 Else P = W * 0.3 End If Txt2.Value = P End Sub,“清除“按钮代码 Private Sub cmd2_Click() Txt1.Value = “ Txt2.Value = “ End Sub “退出“按钮代码 Private Sub cmd3_Click() Docmd.Close End Sub,3If条件语句的嵌套,在条件语句中,Then 和Else 后面的语句组也可包含另一个条件语句,即条件语句的嵌套。语句格式: If 条件表达式1 Then If 条件表达式2 Then 语句组1 Else 语句组2 End If Else If 条件表达式3 Then 语句组3 Else 语句组4 End If End If,例9-5 输入某考生的成绩 x(百分制),当x90时,输出“优秀”;当75x90 时,输出“良好”;当60x75 时,输出“合格”,当 x60 时,输出“不合格”。 创建一个名为“例9-5-成绩监定”窗体,如下图所示。该窗体有2个命令按钮,第一个命令按钮名称为cmd1,标题为“成绩监定”;另一个命令按钮名称为cmd2,标题为“退出”。,“成绩监定” 按钮的代码: Private Sub Cmd1_Click() Dim cj As Integer cj = CInt(InputBox(“请输入考生的百分制成绩:“) If cj = 75 Then If cj = 90 Then MsgBox “优秀“ 成绩分数90 Else MsgBox “良好“ 75成绩分数90 End If Else If cj = 60 Then MsgBox “合格“ 60成绩分数75 Else MsgBox “不及格“ 成绩分数60 End If End If End Sub,4If.Then.ElseIf. 语句,语句格式: If 条件表达式1 Then 语句组 ElseIf条件表达式2 Then 语句组2 Else 语句组3 End If 功能:首先测试条件表达式1,若“条件表达式1”的值为 True,则执行语句组1;否则若 “条件表达式2”的值为 True,则执行语句组2,否则执行语句组3。然后,执行 End If 的后继语句。,可以重复使用 ElseIf 的方式来表达更多的可能性,语句格式是: If 条件表达式1 Then 语句组 ElseIf条件表达式2 Then 语句组2 ElseIf条件表达式3 Then 语句组3 语句组n Else 语句组n+1 End If,例9-6 创建一个名为:“例9-6成绩If-Then-ElseIf分类”的窗体。输入某门课分数 x(百分制),当x90时,输出“优秀”;当80x90 时,输出“良好”;当 70x80 时,输出“中”;当60x70 时,输出“及格”,当 x60 时,输出“不及格”。要求用文本框输入成绩和判定分类的输出。,例9-6:“分类”按钮的单击事件过程代码,Private Sub Cmd1_Click() Dim cj As Integer cj = CInt(text1.Value) 取出 text1文本框中所输入的成绩 If cj = 90 Then text2 = “优秀“ 在text2中显示“优秀“,可省略文本框的 .Value ElseIf cj = 80 Then text2 = “良好“ ElseIf cj = 70 Then text2 = “中“ ElseIf cj = 60 Then text2 = “及格“ Else text2.Value = “不及格“ 也可不省略 .Value End If End Sub,5Select Case 语句,当对一个表达式的不同取值情况作不同处理时,用 ElseIf 语句程序结构显得较为杂乱,而用 Select Case 语句将使程序的结构更清晰,Select Case 语句又称为情况语句。,Select Case 表达式 Case 表达式1 表达式与表达式1 的值相等时执行的语句组1 Case 表达式2 To 表达式3 表达式的值介于与表达式2和表达式3 的值之间执行的语句组2 Case Is 关系运算符与表达式4 表达式的值与表达式4之间满足关系运算为真时执行的语句组3 Case Else 上面的情况均不符合时执行的语句组4 End Select,Select Case 语句格式如下:,Case 表达式可以是下列 4 种格式之一: 单个值或一行并列值,相邻两个值之间用逗号隔开。如:Case 1, 3, 5 或 Case “4”, “6”, “9” 用关键字 To 指定值的范围,前一个值必须比后一个值要小。如: case 1 to 10 或 Case “a“ To “j“ 使用关键字 is 指定条件。Is 后紧接关系运算符(如 、= 和 等)和一个变量或值;如:Case Is =10 或 Case Is “教授“ 前面三种形式可混用,多个条件之间用逗号隔开。如:Case 2, 5 To 7, Is =20。,例9-7 (Select Case 语句例子),例9-7 输入一个月份(整数),确定该月有多少天。根据历法,1、3、5、7、8、10、 12月为31天,润年2月为29天,平年2月为28天,4、6、9、11月为30天。要求用文本框来输入月份和输出结果。 (1)创建一个名为“例9-7确定月份天数Selece-Case”窗体。 (2)编写Cmd1命令按钮的单击事件过程的程序代码如下:,例9-7 (VBA代码),Private Sub Cmd1_Click() Dim i As Integer i = Val(text1) 取出 text1中输入的月份,可省略文本框的 .Value Select Case i Case 1, 3, 5, 7 To 8, 10, 12 text2 = i & “月为31天“ 在text2文本框中显示输出结果 Case 2 text2 = “润年2月为29天,平年2月为28天“ Case 4, 6, 9, 11 text2 = i & “月为30天“ Case Else text2 = “无效月份“ End Select End Sub,6Iif函数,调用格式:Iif(条件,表达式1,表达式2) 作用:先判断条件,如果条件为真,返回表达式1 的值;否则返回表达式2 的值。,例9-8 创建一个名为“例9-8 IIf函数的调用”窗体。 其中 Command0 按钮单击事件的程序代码: Private Sub Command0_Click() Dim cj As Single cj = InputBox(“请输入百分制的成绩:“) z = IIf(cj = 90, “优秀“, IIf(cj = 75, “良好“, IIf(cj = 60, “合格“, “不合格“) MsgBox “成绩 “ & cj & “为“ & z End Sub,7Switch函数,调用格式: Switch (条件1, 表达式1, (条件2, 表达式2 , 条件n, 表达式n) ) 作用:Switch 函数分别根据“条件1”、“条件2”直至“条件n”的值来决定函数返回值。条件是由左至右进行计算判断的,而表达式则会在第一个相关的条件为真时作为返回值。,例9-9 创建一个名为“例9-9 Switch函数的调用”窗体。根据输入的变量 x 的值来为变量 y 赋值。 Command0 按钮单击事件的程序代码如下: Private Sub Command0_Click() Dim x%, y% x = CInt(InputBox(“请输入一个整数:“) y = Switch(x 0, 1, x = 0, 0, x 0, -1) 若在输入对话框中输入 -9, 则y的值为 -1 MsgBox “y 的值为 “ & y End Sub,调用格式: Choose (索引式,选项1, 选项2, ., 选项n) 作用:本函数是根据“索引式”的值来返回选项列表中的某个值。“索引式”值为1,函数返回“选项1”值;“索引式”值为2,函数返回“选项2”值;依次类推。 注意:“索引式”的值只能界于1和可选择的项目数之间,函数才返回其后的选项值;当“索引式”的值小于 1 或大于列出的选择项数目时,返回无效值(Null)。,8Choose函数,例9-10 创建一个名为“例9-10 Choose函数的调用”窗体。根据输入的变量x的值来为变量y赋值。 Cmd0按钮单击事件的程序代码如下: Private Sub Cmd0_Click() Dim x%, y!, i!, j! %为整型,! 为单精度 x = CInt(InputBox(“请输入一个 1, 4 范围内的整数:“) i = x 2: j = x 3 + 5 y = Choose(x, x + 1, i + 1, j, 100) MsgBox “y 的值是 “ & y 使用 MsgBox 消息框输出结果 End Sub,消息框输出结果: x=1,y=2 x=2,y=5 x=3,y=32 x=4,y=100,9选择结构的综合应用实例 P.255,例9-11 创建一个名为“例9-11登录”窗体。当用户输入了学号和密码后,若学号或密码为空,则显出提示,要求重新输入;若学号或密码不对,则显出错误提示,结束程序运行;若学号和密码都正确,则显出“欢迎光临!”信息。,添加的控件有: 2个标签: lab1,标题为“学号”; lab2,标题为“密码”。 2个文本框:名称为 xh 和 mim 。 2个命令按钮:cmd1,标题为“登录”; cmd2,标题为“退出”。 已知学号: 09031001,密码:abc168 不分大小写,Private Sub Cmd1_Click() If Len(Nz(Me!xh) = 0 And Len(Nz(Me!mim) = 0 Then 学号或密码均为空时处理 MsgBox “学号、密码为空!请输入“, vbCritical, “出错提示“ Me!xh.SetFocus 设置输入焦点落在xh文本框 ElseIf Len(Nz(Me!xh) = 0 Then 学号为空时处理 MsgBox “学号为空!请输入“, vbCritical, “出错提示“ Me!xh.SetFocus 设置输入焦点落在xh文本框 ElseIf Len(Nz(Me!mim) = 0 Then 密码为空时处理 MsgBox “密码为空!请输入“, vbCritical, “出错提示r“ Me!mim.SetFocus 设置输入焦点落在mim文本框 Else If Me!xh = “09031001“ Then 学号为09031001 If LCase(Me!mim) = “abc168“ Then 密码abc168不分大小写 MsgBox “欢迎光临!“, vbInformation, “进入系统成功“ Else 密码不对时的处理 MsgBox “密码不对!异常退出。“, vbCritical, “出错提示“ DoCmd.Close End If Else 学号不对时的处理 MsgBox “学号不对!异常退出。“, vbCritical, “出错提示“ DoCmd.Close End If End If End Sub,9.5.7 循环结构,在实际工作中,常遇到一些操作过程不太复杂,但又需要反复进行相同处理的问题,比如,统计本单位所有人员的工资,计算1100所有奇数的平方和等,使用循环语句来解决这些问题就很容易。 所谓循环就是重复地执行一组语句。 VBA提供了三种不同风格的循环语句,分别是: (1)For Next 循环语句语句。 (2)While Wend 循环语句语句。 (3)Do Loop 循环语句语句。,1For Next 循环语句,For.Next 循环能够重复执行代码区域特定次数。 1)For.Next 循环的一般格式:,例如:For i = 1 To 1000 Step 5 Debug.Print i 在立即窗口输出 i 的值 Next i,如果省略 “Step 步长”,则默认步长值为1,执行步骤,注意:当步长=0 时,如果循环变量值终值, 则一次也不执行循环体。,例9-12 求s=1+2+3+4+1000 的和。窗体名称为:例9-12 For循环求和。运行结果如下图所示。,“求和”按钮的程序代码如下: Private Sub Cmd1_Click() Dim i As Long, s As Long s = 0 s 作累加器,初值置 0 For i = 1 To 1000 s = s + i Next text1.Value = “1+2+3+.+1000 = “ & s 使用文本框控件来输出结果 End Sub,省略 Step 步长,默认为 1,例9-13 编写程序求结果。把2662表示为两个加数之和,使其中一个加数能被87整除,而另一个加数能被91整除。请求出:这两个加数各是多少?窗体名称为:例9-13 For循环求加数。运行结果如下图所示。,图9-32 例9-13 For循环求加数的窗体视图,使用标签控件来输出结果,例9-13(VBA代码) P.257,Private Sub Cmd1_Click() Dim i%, j% For i = 87 To 2662 Step 87 步长为 87,能被87整除 For j = 91 To 2662 Step 91 步长为 91,能被91整除 If i + j = 2662 Then 使用标签来输出结果 lab1.Caption = “能被87整除的加数是“ & i & “,能被91整除的加数是“ & j Exit For 找到了加数,退出本循环 End If Next j Next i End Sub,例9-14 取面值为一元、二元、五元的纸币共21张,付给58元钱,每种面值纸币至少要有一张,编写VBA程序,求出有多少种不同的付法? 窗体名称:例9-14 For循环求纸币付法。Cmd1过程代码是: Private Sub Cmd1_Click() Dim i%, j%, k%, n% n = 0 保存有多少种付法 For i = 1 To 21 i 为面值为1元的纸币张数 For j = 1 To 21 j 为面值为2元的纸币张数 k = 21 - i - j k 为面值为5元的纸币张数 If (i + 2 * j + 5 * k) = 58 And k = 1 Then k=1表示5元的至少一张 n = n + 1 End If Next j Next i text1 = “本题纸币付法共有 “ & n & “ 种“ 在text1文本框中显出结果 End Sub,运行结果如下图所示:,例9-15 编写程序,从键盘输入10个整数,把这些数由小到大的顺序排序输出。窗体名为: “例9-15 For循环冒泡法排序输出”。 ( P.258 ),添加的控件有: 2个标签: lab1 和 lab2。 2个文本框:名称为 Text1 和 Text2 。 2个命令按钮:cmd1,标题为“排序”; cmd2,标题为“退出”。,(1)算法分析 假设输入10个数分别存储在数组A的10个数组元素中。 第1轮:将 A(1) 与 A(2) 比较,若 A(1)A(2),则 A(1)、A(2) 的值互换,否则不作交换;处理后,A(1) 一定是两数中的较小者。再将 A(1)分别与 A(3)、A(4)、A(10) 比较,并且依次作同样的处理。最后,最小者放在A(1)。 第2轮:将 A(2) 分别与 A(3)、A(4)、A(10) 比较,并依次作出同第1轮一样的处理。最后第1轮余下的9个数中的最小者放入 A(2) 。 照此方法,继续进行第3轮。 直到第9轮后,余下的 A(10) 是10个数中的最大者。至此,10个数已从小到大顺序存放在 A(1)A(10)中。,(2)“排序”按钮的程序如下: Private Sub cmd1_Click() Dim t As Long, i As Long, j As Long Dim a(10) As Long lab1.Caption = “排序前的数据序列: “ For i = 1 To 10 a(i) = InputBox(“输入一个整数“) Text1 = text1 & a(i) & “ “ 用Text1文本框输出原序列 Next i,冒泡法排序 For i = 1 To 9 For j = i + 1 To 10 If a(i) a(j) Then t = a(i) : a(i) = a(j) : a(j) = t 交换数据 End If Next j Next i lab2.Caption = “排序后的数据序列: “ For i = 1 To 10 Text2 = Text2 & a(i) & “ “ 使用文本框Text2输出排序后的序列 Next i End Sub,2WhileWend循环语句,While 循环语句的格式: While 条件表达式 循环体 Wend While 循环语句先对条件进行判断,若条件成立(即为True值),就执行循环体,否则结束循环。 注意:若开始时条件就不成立(即条件不成立),则循环体一次也不执行。,例9-16 编写VBA程序,使用 “立即窗口” 的“Print” 方法(即 Debug.Print),在立即窗口输出 1, 10 范围内的全部偶数。“立即窗口”名为 Debug。窗体名为:“例9-16 While 循环在立即窗口输出偶数”。,(P.259),添加的控件有: 1个标签: lab1 ,标题为“提示:在VBE窗口环境下打开立即窗口,才能看到结果” 。 2个命令按钮:cmd1,标题为“输出偶数”; cmd2,标题为“退出”。,“输出偶数”按钮的程序如下: Private Sub cmd1_Click() Dim n As Integer n = 1 While n = 10 If (n Mod 2) = 0 Then Debug.Print n 当n为偶数时,在立即窗口输出该偶数 n = n + 1 Wend Debug.Print “注意,循环完毕后 n 的值是:“ & n End Sub,例9-16A 编写VBA程序,求 S = 1/3 + 1/6 + 1/9 + 1/12 + 1/15 + + 1/(3*n) + 的前n项之和,当S第一次大于或等于1.8时终止计算,此时项数n是多少?窗体名为:“例9-16A 求S的和数”。,“计算”按钮的程序如下: Private Sub cmd1_Click() Dim n%, s As Double s = 0 s 作累加器,初值置 0 n = 1 While s = 1.8 s = s + 1 / (3 * n) n = n + 1 Wend Txt1.Value = “n = “ & n - 1 End Sub 答案:n=124,例9-16B求 S = 1/1 + 1/3 + 1/5 + 1/7 + 1/9 + + 1/(2*n-1) + 的前n项之和,当S第一次大于或等于3.5时终止计算,此时项数n为_。窗体名为:“例9-16B 求S的和数”。,“计算”按钮的程序如下: Private Sub cmd1_Click() Dim n%, s As Double s = 0 s 作累加器,初值置 0 n = 1 While s = 3.5 s = s + 1 / (2 * n - 1) n = n + 1 Wend Text0.Value = “n = “ & n - 1 End Sub 答案:n=154,3DoLoop循环语句,与前面介绍的 While 循环相比,Do 循环具有更强的灵活性,它可以根据需要决定是条件满足时执行循环体,还是一直执行循环体直到条件满足。 Do 循环有四种语句格式。,语句格式1: Do while 语句组1 Exit Do 语句组2 Loop,语句格式2: Do Until 语句组1 Exit Do 语句组2 Loop,语句格式3: Do 语句组1 Exit Do 语句组2 Loop While ,语句格式4: Do 语句组1 Exit Do 语句组2 Loop Until ,(1)Do 循环语句格式1,注意:若开始时条件不成立,则循环体一次也不执行。,例9-17 用Do 循环语句格式1完成用大写26个英文字母向数组元素赋值操作,并在文本框中显示。 程序代码如下: Private Sub cmd1_Click() Dim i As Integer, D(26) As String i = 1 Text1 = “26个大写字母是:“ Do While i = 26 D(i) = Chr(i + 64) 大写英文字母A的字符代码是 65 Text1 = Text1 & D(i) & “ “ i = i + 1 Loop End Sub,添加的控件有: 1个文本框:Text1 。 2个命令按钮: cmd1,标题为“While循环产生26个大写字母”; cmd2,标题为“退出”。,格式1 补充思考题,请判断如下程序代码中的循环体被执行了几次? Private Sub cmd1_Click() Dim j% %为整型 j = 0 Do While j = 2 j = j + 1 Debug.Print j Loop End Sub,3 次,(2)DoLoop循环语句格式2,说明:格式2循环结构是在条件为 False 时,重复执行循环体,直至条件为 True时结束循环。 注意:若开始时条件为True时,则循环体一次也不执行,请判断如下程序代码中的循环体被执行了几次? Private Sub cmd1_Click() Dim j% j = 0 Do Until j = 2 j = j + 1 Loop Debug.Print “循环体被执行了 “ & j & “ 次“ 在立即窗口输出 j 的值 End Sub,例9-18,0 次,(3)DoLoop循环语句格式3,说明:格式3循环结构首先执行一次循环体,执行到 Loop 时判断条件,若条件为True,继续执行循环体,否则结束循环。 注意:不管 While 之后的条件是否满足,循环体也至少执行一次。,例9-19,请判断如下程序代码中的循环体被执行了几次? Private Sub cmd1_Click() Dim j% j = 0 Do j = j + 1 Debug.Print j Loop While j 2 End Sub,1 次,(4)DoLoop循环语句格式4,说明:格式4循环结构首先执行一次循环体,执行到Loop时判断条件,若条件为False,继续执行循环体,否则结束循环。 注意:不管Until后的条件是否成立,循环体至少会执行一次。,例9-20,请判断如下程序代码中的循环体被执行了几次? Private Sub cmd1_Click() Dim j% j = 0 Do j = j + 1 Debug.Print j Loop Until j 2 End Sub,3 次,9.5.8 标号和GoTo语句,1标号 标号是一个字符序列,首字符必须是字母,大小写无关,以冒号“ : ”结尾。标号的命名规则与变量命名规则相同。例如,E1: 2GoTo语句 GoTo语句格式:GoTo 标号 作用:无条件地转到标号指定的那行语句继续执行。 建议不用或少用 GoTo 语句。 在 VBA 中,GoTo 主要用于错误处理语句: On Error GoTo 标号,9.5.9 过程调用和参数传递,在子过程或函数过程的声明语句中,给出的参数称为形式参数(简称形参)。 在子过程或函数过程调用中,所给出的参数称为实际参数(简称实参)。实参必须与形参相匹配。,1子过程声明,形参列表的基本格式:,子过程的声明格式:,形参说明,注意: (1)定义过程可设置一个或多个形参,若有多个时,两个形参之间要用 “ , ” 分隔。 (2)ByVal 是可选项,表示该形式参数按值传递。 (3)ByRef 是可选项,表示该形式参数按址传递。 (4)ByVal 与 ByRef 只能两者选一,两者都没选时,默认为 ByRef(即按址传递)。“传址”调用具有“双向”传递作用,即调用子过程时,实参将其值传递给形参,调用结束由形参将结果值返回给实参。,形参列表的基本格式:,2子过程调用,子过程的调用格式有两种: 调用格式1: Call 子过程名(实参列表) 调用格式2: 子过程名 实参列表 注意:当没有任何实参时,上述子过程的两个调用形式就变为如下的简单格式: 调用格式1的简单格式: Call 子过程名 调用格式2的简单格式: 子过程名,例9-21 编一个求 n! 的子过程,然后调用它,计算 12!- 9!的值。 (1)创建一窗体,窗体上有两个命令按钮cmd1(计算)、cmd2(退出)和一个文本框 txt1,如下图所示。 (2)编写子过程 jch 和 cmd1 按钮的单击事件代码。,调用过程格式1,调用格式2,形式参数,(P.263264),Private Sub Cmd1_Click() Dim x As Long, y As Long, z As Long x = 0: y = 0 Call jch(12, x) 该调用语句等价于 jch 12, x jch 9, y 该调用语句等价于 Call jch(9, y) z = x - y Text1 = “12! - 9! = “ & z 用Text1输出结果 End Sub Private Sub jch(ByVal n As Long, m As Long) Rem 形参 n 按值传递,m 按地址传递(ByRef) Dim i As Integer m = 1 m 用作累乘器,初值置 1 For i = 1 To n m = m * i Next i End Sub,例9-22 编写一个无参子过程 randomuum (),用于产生一个 1,100 范围内的随机整数。在主调过程中,对该子过程进行30次的过程调用,以产生出30个 1,100 范围内随机整数。运行结果如下图所示。,例9-22 (VBA代码) P.264,Private Sub randomuum() 这是一个无参数的子过程 Dim x As Integer Randomize 初始化随机数生成器 x = Int(100 * Rnd + 1) 产生一个 1, 100 范围内的随机整数 Text1.Value = Text1.Value & x & Space(2) 两个随机整数之间用2个空格分隔开 End Sub Private Sub Cmd1_Click() Dim i As Integer For i = 1 To 30 循环30次用于产生30个随机整数 Call randomuum 该调用语句等价于 randomuum Next i End Sub,3函数过程的声明,形参列表的基本格式:,函数过程的声明格式:,说明:函数过程名有值,有类型,在过程体内至少赋值一次。,说明,形参列表的基本格式:,(1)函数过程名有值,有类型。函数过程名在过程体内至少被赋值一次。若在过程体内没有对过程名赋值,则该函数过程将返回一个缺省值:数值类型函数返回 0,字符串类型返回一个空字符串(“)。 (2)As 数据类型子句是可选的。使用“As 数据类型”子句可声明函数过程的返回值的数据类型,否则VBA自动赋给返回值一个最合适的数据类型。,4函数过程的调用,在表达式中,可通过使用函数名,并给出相应的参数来调用一个函数过程。 函数过程的调用格式: 函数过程名(实参1 , 实参2 , ),例9-23 (函数过程声明与调用例子 ),例9-23 编写求一个自然数 N 的阶乘 N! 的函数过程,然后调用它,计算 12!- 9!。要求该函数过程要在标准模块“例9-23 标准模块-声明求自然数N 的阶乘的函数过程”中进行声明,在窗体“例9-23 调用标准模块中所声明的函数过程-求阶乘”中的按钮的单击事件过程中调用该函数。,例9-23 (VBA代码 ) P.265,(1)新建一个名为“例9-23 标准模块-声明求自然数N 的阶乘的函数过程”标准模块。 注意:在 Function 前面一定要使用 Public 关键字,以使fnjc 函数的作用域为全局范围。 程序代码: Public Function fnjc(n As Long) As Long Dim i As Integer fnjc = 1 fnjc 作累乘器,初值为1 For i = 1 To n fnjc = fnjc * i Next i End Function,(2)新建一个名为“例9-23 调用标准模块中所声明的函数过程-求阶乘”窗体。Cmd1 的单击事件过程的程序代码: Private Sub Cmd1_Click() Dim z As Long z = fnjc(12) - fnjc(9) 二次调用标准模块中的 fnjc 函数 text1 = “12! - 9!= “ & z 使用 Text1 文本框输出运算结果 End Sub,9.6 VBA中的常用操作方法,在 VBA 编程过程中会经常用到一些操作,例如,打开和关闭窗体、打开和关闭报表、对控件输入数据进行验证功能等等。,9.6.1 打开和关闭窗体,VBA 的窗体操作主要有两个重要的命令: 打开窗体: DoCmd.OpenForm 关闭窗体: DoCmd.CloseForm,打开窗体操作 P.266,例9-24 以对话框形式打开名为“例9-12 For循环求和”窗体。 DoCmd.OpenForm “例9-12 For循环求和“, , , , , acDialog 注意:参数可以省略,取默认值,但中间的分隔符“,”不能省略。,2关闭窗体操作,语句格式: DoCmd.Close (ObjectType, ObjectName, Save) 或 DoCmd.Close ObjectType, ObjectName, Save,由 DoCmd.Close 命令参数看到,该命令可以用于 Access 各种对象的关闭操作。省略所有参数的命令(DoCmd.Close)可以关闭当前窗体。,例9-25 (关闭窗体操作例子),例9-25 关闭名为“例9-12 For循环求和”窗体。 DoCmd.Close acForm, “例9-12 For循环求和“ 如果“例9-12 For循环求和”窗体是当前窗体,则可使用语句: DoCmd.Close,9.6.2 打开和关闭报表,报表的打开和关闭也是 Access 应用程序中的常用的操作。VBA 提供了两个操作命令。 打开报表: DoCmd.OpenReport 关闭报表: DoCmd.Close。,1打开报表操作,例9-26 以预览视图形式打开名为“学生信息表” 报表的语句为: DoCmd.OpenReport “学生信息表“, acViewPreview,2关闭报表操作,关闭报表操作也可以使用 DoCmd.Close 命令来完成。 例9-27 关闭名为“学生信息表”报表。 DoCmd.Close acReport, “学生信息表“,9.7 VBA 程序调试和错误处理,VBA 代码运行时,可能会产生各种各样的错误。 VBA 针对不同错误类型,提供的处理方法是:错误处理和程序调试。,9.7.1 错误处理,使用错误处理的好处是:代码的执行不会中断。 错误处理步骤:设置错误陷阱、编写错误处理代码。 VBA提供 On Error GoTo 语句来控制当有错误发生时程序的处理。On Error 语句的形式有三种: On Error GoTo 标号 On Error Resume Next On Error GoTo 0,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GB-T 39159-2020集成电路用高纯铜合金靶材》专题研究报告
- 2025年执业药师(西药)《药物化学》章节试题(第五章)及答案
- 2025年驾照考试科目一1500题(易错题)及答案(七)
- 露天矿采矿前装机司机安全规程评优考核试卷含答案
- 《GBT 2658-2015 小型交流风机通 用技术条件》专题研究报告
- 数字资产管理师岗前测试验证考核试卷含答案
- 超重型汽车列车司机安全专项竞赛考核试卷含答案
- 玻纤制品后处理工安全知识测试考核试卷含答案
- 《GBT 35403.1-2017 国家物品编码与基础信息通 用规范 第 1 部分:总体框架》专题研究报告
- 公司火工品管理工岗位职业健康技术规程
- 工会劳动法律监督员考试题及答案
- 辽宁省2025年度通信专业技术人员初级和中级职业水平考试综合能力+传输与接入无线专业复习题及答案
- 人教版高中化学选择性必修第二册全册教学课件
- 《美丽文字 民族瑰宝》课件
- 2025中国重症医学科建设和发展指南解读课件
- 2025年专利审查协作中心招聘考试面试常见问题解答
- 锂电池火灾扑救课件
- GB/T 45953-2025供应链安全管理体系规范
- 国外音乐教学法课件
- 建筑工人安全施工操作规范范本
- 俄乌冲突军事理论课件
评论
0/150
提交评论