Download presentation
Presentation is loading. Please wait.
1
第8章 VBA与模块
2
本章内容: 8.1 VBA简介 8.2 面向对象程序设计 8.3 VBA编程基础 8.4 VBA程序的流程控制结构 8.5 数组 8.6 过程调用与参数传递 8.7 VBA的数据库编程 8.8 VBA程序的调试
3
8.1 VBA简介 VBA(Visual Basic for Application)是微软系列软件的内置编 程语言。编程语言是用户和计算机进行信息交流的媒介。使用编 程语言可以设计计算机程序,控制计算机完成用户要求的各项操 作功能。 VBA程序由称之为“过程”的程序段组成,过程中的语句按照解 决问题的逻辑顺序依次排列。执行VBA程序时,计算机会自动按 照过程中各条语句的语义从过程头执行到过程尾。
4
VBA程序编辑环境 VBA的开发界面称为VBE(Visual Basic Editor)。它是VBA程 序编辑、调试的环境。 1. VBE 窗口 VBE窗口主要由标准工具栏、工程资源管理器窗口、代码窗口、 属性窗口、立即窗口等组成。 单击工具栏中“视图”主菜单可以打开各个窗口。
5
菜单栏和工具栏 “对象”列表 “过程”列表 “工程资源管理器”窗口 “声明”区 “代码”区 “属性”窗口 “立即窗口” VBE 编程界面
6
2. 打开VBE窗口 常见打开VBE环境方法有以下三种: 方法一 方法二 方法三
7
8.1.2 VBA模块 模块是VBA应用程序代码的组织方式,模块中的代码以过程 的形式组织在一起,过程是构成模块的基本单元,一个模块中可 以包含多个过程。 在Access中,模块分为类模块和标准模块。 1. 类模块 类模块是代码和数据的集合,每个类模块都与某个特定的窗 体或报表相关联。 窗体模块和报表模块都属于类模块,它们从属于各自的窗体 或报表。
8
例8-1 建立一个类模块,创建下图窗体,单击“开始”按钮时,显 示“欢迎使用Access!”
9
操作步骤: (1)在数据库中,创建窗体,设置窗体属性,使“记录选择器 钮”、“导航按钮”、“分隔线”均不显示。 (2)选择命令按钮控件,单击鼠标右键,从快捷菜单中选择 “事件生成器”,在“选择生成器”对话框中选择“代码生成器”。 (3)在事件过程中输入代码。
10
2. 标准模块 标准模块用于存放公共过程(子程序和函数),不与其他任何 Access数据库对象相关联。
在标准模块中,通常为整个应用系统设置全局变量或通用过程, 以供其他窗体或报表等数据库对象在类模块中使用或调用。 标准模块中的变量和过程具有全局特性,作用范围是整个应用 程序,生命周期随应用程序的运行而开始,随应用程序的关闭而结 束。
11
例8-2 建立一个标准模块,运行时显示“欢迎使用Access
例8-2 建立一个标准模块,运行时显示“欢迎使用Access!” 操作步骤: (1)在数据库中,单击功能区 “创建”选项卡下“宏与代码”组 中“模块”按钮 。 (2) 输入代码。 (3)单击“保存”按钮,为模块起名:First。 (4)单击标准工具栏上“运行子过程”命令,数据库窗口显示 相应信息。
12
3.模块的结构 无论是类模块还是标准模块,其结构都包含以下两部分:
(1)模块声明部分: 放置本模块范围的声明,如Option声明、 变量及自定义类型的声明。 (2)过程(函数)定义部分:放置实现过程或函数功能的 VBA代码。 “声明”区 “代码”区
13
4.将宏转换为VBA代码 在Access中,宏的每个操作在VBA中都有等效的代码。
独立宏可以转换为标准模块,嵌入在窗体、报表及控件事件 中的宏可以转换为类模块。 将宏转换为VBA代码的方法有以下两种: 方法一 方法二
14
8.2 面向对象程序设计 目前有两种编程思想: (1)面向过程程序设计:将数据和数据的处理相分离,程序 由过程和过程调用组成。 (2)面向对象程序设计:将数据和数据的处理封装成一个称 之为“对象”的整体。 VBA是Access系统内置的Visual Basic(VB)语言,VB语言是可 视化的、面向对象、事件驱动的高级程序设计语言,采用面向对 象的程序设计思想。
15
8.2.1 基本概念 1.类和对象 在面向对象的程序设计中,基本概念包括对象、类、属性、事件、 方法等。
基本概念 在面向对象的程序设计中,基本概念包括对象、类、属性、事件、 方法等。 1.类和对象 在自然界的一切事物都是分类的,类是一个抽象的概念。比如说 “人”就是一种分类,是一个抽象的概念。但谈到“张三”、“李四”等某些 具体的人时,这些具体的人称为“人”类的一个对象。 Access中的对象代表应用程序中的元素,如表、窗体、按钮等。 Access数据库窗口左边的对象:表、查询、窗体、报表、宏与模 块,应该准确地称为对象类,通过每一个类可以创建多个该类型的对 象。
16
2. 属性 属性是对象的特征,描述了对象的当前状态。标题、名称、左边距、 宽度等是窗体中标签的属性。
2. 属性 属性是对象的特征,描述了对象的当前状态。标题、名称、左边距、 宽度等是窗体中标签的属性。 在面向对象的程序设计中,可以直接在属性表窗口定义对象属性, 也可以用代码设置对象属性。 在VBA代码中,使用属性时,对象名与属性名之间用一个圆点分隔。 例如: Text1.Forecolor= VbRed 将Text1文本框的前景色设置为红色。 MsgBox Me.Caption 显示当前窗体的标题。 每个对象都有自己的属性,对象的类别不同,属性也会不同。同一 类型的不同对象,属性也会有差异。
17
3.事件 事件是对象能够识别的动作。如单击命令按钮,其中的“单击” 事件是命令按钮能识别的动作。 响应事件的方式有以下2种。
(1) 用宏对象响应对象的事件。 (2) 给事件编写VBA代码,用事件过程响应对象的事件。 类模块每个过程的开始行都会显示对象名和事件名。 如:Private Sub Command1_Click() 其中,Command1是对象名,Click是事件名。
18
4.方法 方法是对象能够执行的动作,不同对象有不同的方法,不同 方法能完成不同的任务。如Close方法能关闭一个窗体,Open方 法能打开一个窗体。 在代码中调用对象方法时,对象名与方法名之间要用一个圆 点相连。 例如:DoCmd.Close 功能是关闭当前窗体。其中,Close是系统对象DoCmd的内置 方法。
19
8.2.2 用代码设置窗体属性和事件 1.关键字Me 2.用代码设置窗体属性
用代码设置窗体属性和事件 1.关键字Me Me是“包含这段代码的对象”的简称,可以代表当前对象。在类模 块中,Me代表当前窗体或当前报表。 例如: (1) Me.Label1.Caption= "学生信息",定义标签Label1的Caption属 性。 (2) Me.Caption= "学生信息一览表",定义窗体的Caption属性。 2.用代码设置窗体属性 能用代码设置的窗体属性主要包括窗体标题、窗体数据源、背景 图片等。
20
例8-3 创建窗体,窗体标题为“用代码设置属性”,并在窗体中 建立文本框txtXm和命令按钮cmdStart,单击命令按钮时,窗体中 插入一张图片,并在文本框中显示“学生信息”表中的第一条记录 的姓名。 操作步骤: (1) 创建窗体,设置“记录选择器”、“分隔线”、“导航按钮”为不 显示。 (2) 在窗体中添加文本框,并将其“名称”属性改为txtXm,附 属标签的“标题”属性改为“第一条记录”;添加图像框,将其“名称” 属性改imgPhoto;创建命令按钮,将其“名称”属性改为cmdStart。
21
(3) 编写窗体的Load事件和命令按钮的Click事件。
(4) 转到窗体视图,单击命令按钮“开始”,显示结果如下。
22
编程步骤 VBA编程有以下几个主要步骤: 1.创建用户界面 2.设置对象属性 3.对象事件过程的编写 4.运行和调试 5.保存窗体
23
DoCmd对象 DoCmd是系统对象,主要作用是调用系统提供的内置方法, 在VBA程序中实现对Access的操作。例如,打开窗体、关闭窗体、 打开报表、关闭报表等。 DoCmd对象的大多数方法都有参数,除了必选参数之外,其 他参数可以省略,用系统提供的默认值即可。 使用DoCmd调用方法的格式如下: DoCmd.方法名 参数
24
DoCmd对象的常用方法 方法 功能 示例 OpenForm 打开窗体 DoCmd.OpenForm ”学生信息” OpenReport
打开报表 DoCmd.OpenReport "学生成绩" , acViewPreview OpenTable 打开表 DoCmd. OpenTable "课程信息" Close 关闭对象 DoCmd. close RunMacro 运行宏 DoCmd. RunMacro "Macro1"
25
例8-4 创建下图所示窗体,单击命令按钮时,使用DoCmd对象 分别打开“学生信息浏览”窗体、“学生情况报表”报表及“Macro1”宏。
26
8.3 VBA编程基础 8.3.1 VBA的基本数据类型 类型标识 符号 字段类型 取值范围 字节数 Byte 字节 0~255 1B
字节 0~255 1B Integer % 整数 ~32767 2B Long & 长整型 -231 ~ 4B Single ! 单精度 -3.4×1038 ~ 3.4×1038 Double # 双精度 -1.7× ~ 1.7×10308 8B Currency @ 货币型 ~ String $ 字符串 0~65535个字符 与字符串长度有关 Boolean 布尔 True/False Date 日期型 100年1月1日~9999年12月31日 Variant 变体形 数字与双精度同,文本和字符串 与数据有关 Object 对象型 任何对象引用
27
8.3.2 常量与变量 1. 常量 2.变量 常量是指在程序运行过程中其值保持不变的量。
常量与变量 1. 常量 常量是指在程序运行过程中其值保持不变的量。 2.变量 变量是指程序在运行过程中其值可以改变的量,用来存储程 序运行时的数据。 变量实质是内存中的临时存储单元,一个变量对应一块内存 空间。为了操作方便,要对每个变量取一个变量名。 在程序中,使用变量名就可以对变量的值进行存取,不必知 道它的具体地址。
28
(1)变量命名规则 以字母开始,可以包括数字、字母和下划线;不能多于 255个字符;字母不区分大小写。 不能与关键字重复(如End、Print、Sub等)。 在同一作用域中,变量名不能重复。
29
(2)变量声明 使用变量前,一般必须声明变量名和变量类型,使系统分配 相应的内存空间,并确定该空间可存储的数据类型。 用类型说明符来标识 把类型说明符放在变量名的尾部,可以标识不同的变量类型。 例如:Total% Amount# Lzlame$
30
使用Dim语句定义类型 格式: Dim 变量名 [as 类型] 例如: Dim cj As Integer , total ‘定义cj变量为整型,total为 变体型 变量 说明: 使用Dim语句声明变量时,如果没有指定数据类型,则默认 为Variant类型。 如果没有事先定义而直接在程序中使用的变量,则系统默认 其为Variant类型。
31
表达式 表达式是将常量、变量、字段名、控件属性值和函数用运算 符组成的式子,完成各种形式的运算和处理。 每一个表达式都有一个值,可以用表达式值的类型作为表达 式的类型。 一个表达式中可能包含多个运算符,运算符的优先级别决定 了表达式的求值顺序,优先级高的先运算,同级别的从左向右运 算。
32
内部函数 系统提供了大量的内部函数。在这些函数中,有些是通用的, 有些则与某种操作有关。 大体上可分为转换函数、数学函数、字符串函数、时间/日期 函数、随机数函数等五类,这些函数带有一个或几个自变量。
33
8.4 VBA程序的流程控制结构 语句的书写规则 VBA语句是以“过程”形式的存在,除一些声明语句出现在模块 声明部分外,其他语句都必须出现在某个具体过程中。 主要的书写规则有: (1)将单行语句分成多行:用续行符(一个空格后面跟一个 下划线)将长语句分成多行。 (2) 将多个语句合并到同一行上:用冒号“:”将它们分开。 例如: X=100:Y="hello"
34
(3)在语句代码中添加注释 为了增加程序的可读性,在程序中可以添加适当的注释。VBA 在执行程序时,并不执行注释文字。 注释方式有两种“Rem”和“‘”。 注释可以和语句在同一行并写在语句的后面,也可占据一整 行。 例如 Rem 程序举例 DoCmd.OpenForm "学生信息管理" '打开学生信息管理窗体
35
8.4.2 VBA常用语句 1.赋值语句 一条语句就是能执行一定任务的一条指令。 格式: <变量名>=<表达式>
功能:变量指定一个值。 例如: x = 5 s = 3.14 * x ^ 2 y = Int(s) 如果变量未被赋值而直接引用,则数值型变量的值为0,字符 型变量的值为空串,逻辑型变量的值为False。
36
2.用户交互函数InputBox InputBox函数的作用是打开一个对话框。等待用户输入文本或选择一个按钮。 函数格式:
InputBox(提示[,标题][,默认值][,x坐标位置][,y坐标位置]) 功能:单击“确定”按钮时,函数返回文本框中输入的值。 例如,通过InputBox函数给变量xm赋值: xm=InputBox("请输入你的名字","提示","Nancy") 标题 提示 默认值
37
MsgBox 提示[,按钮][,标题] 变量名=MsgBox(提示[,按钮][,标题]) 3. MsgBox函数和MsgBox语句
功能:使用消息框输出信息。 MsgBox函数的格式: 变量名=MsgBox(提示[,按钮][,标题]) MsgBox语句的格式: MsgBox 提示[,按钮][,标题]
38
分组 系统常数 按钮值 描述 按钮数目 vbOKOnly 只显示“确定”按钮 vbOKCancel 1 显示“确定”、“取消”按钮 vbAbortRetryIgnore 2 显示“终止”、“重试”、 “忽略”按钮 vbYesNoCancel 3 显示“是”、“否”、“取消”按钮 vbYesNo 4 显示“是”、“否”按钮 vbRetryCancel 5 显示“重试”、 “取消”按钮 图标类型 vbCritical 16 “停止”图标 vbQuestion 32 “询问”图标 vbExclamation 48 “感叹”图标 vbInformation 64 “信息”图标 默认按钮 vbDefaultButton1 第一个按钮是默认值 vbDefaultButton2 256 第二个按钮是默认值 vbDefaultButton3 512 第三个按钮是默认值
39
函数的书写格式: yn= MsgBox (“你的输入有误 !", , "确认") 或: yn = MsgBox ("你的输入有误!", vbOKCancel +vbInformation + vbDefaultButton1, "确认") 语句的书写格式: MsgBox “你的输入有误 !", , "确认" 或: MsgBox "你的输入有误!", vbOKCancel +vbInformation + vbDefaultButton1, "确认" 标题 图标类型 提示信息 默认按钮 按钮数目
40
MsxBox函数返回值 系统常数 返回值 描述 vbOK 1 确定 vbCancel 2 取消 vbAbort 3 终止 vbRetry 4 重试 vbIgnore 5 忽略 vbYes 6 是 vbNo 7 否
41
8.4.3 顺序结构 计算机程序的执行控制流程有三种基本结构: 顺序结构 分支结构 循环结构。
顺序结构 计算机程序的执行控制流程有三种基本结构: 顺序结构 分支结构 循环结构。 顺序结构是最简单的一种结构,计算机按照语句的排列顺序 依次执行每一条语句。
42
例8-5 创建如图所示窗体,解决鸡兔同笼问题。已知鸡和兔子 的总头数、总脚数,编写程序计算笼子中鸡和兔子各有多少只?
43
分析:用h表示总头数,f表示总脚数,用c表示鸡,r表示兔子, 则有: c + r = h ① 2c + 4r =f ② 计算机不会直接处理这样的二元一次方程组,必须经过变形: ② - ①×2 得: r =(f - 2 × h)/2 ③ ① 可以等价的变形为: c = h –r ④ 这时我们就可以利用已知的f 和h 通过③、④两个式子分别求 得r和c了。 计算后的结果r和c通过文本框输出。
44
操作步骤: (1)创建如图所示窗体,将窗体标题改为“鸡兔同笼” (2)在窗体上添加四个文本框,将其“名称”属性分别为改为txtR、 txtF、 txtC、 txtR,附属标签的文本分别改为为“总头数”、“总 脚数”、“鸡”、“兔子”。 (3)在窗体上添加两个命令按钮,将其“名称”属性分别改为 cmdStart、cmdClose,“标题”属性改为“计算”和“退出”。 (4) 进行代码设计窗口,编写事件过程:
45
Private Sub cmdClose_Click() DoCmd
Private Sub cmdClose_Click() DoCmd.Close End Sub Private Sub cmdStart_Click() Dim h!,f!,c!,r! h = txtH '将在文本框中输入的头数赋予变量h f = txtF '将在文本框中输入的脚数赋予变量f r = (f - 2 * h) / 2 c = h - r txtC = c '将变量c在文本框中输出 txtR = r '将变量r在文本框中输出
46
8.4.4 选择结构 1.单分支结构 选择结构即根据条件,选择执行的分支,VBA提供了多种形式 的选择结构。
选择结构 选择结构即根据条件,选择执行的分支,VBA提供了多种形式 的选择结构。 1.单分支结构 格式1:IF <条件> THEN <语句序列> 格式2: IF <条件> THEN <语句序列> END IF 执行过程:判断条件,如果为真,执行语句序列;如果为假, 则不执行语句序列而直接执行END IF后面的语句。
47
例:创建一个模块,录入以下程序代码: Sub Panduan() Dim x As Integer x = InputBox("请输入X的值") If x > 0 Then MsgBox "这是一个正数" End If End Sub 运行模块时,当输入的值大于零时,弹出消息框提示为“这是 一个正数”。
48
2.双分支结构 格式: IF <条件> THEN <语句序列1> [ ELSE <语句序列2> ]
END IF 执行过程:判断条件,如果为真,执行语句序列1;如果为假, 执行语句序列2。
49
例8-6 输入一个成绩,给出“及格”或“不及格”的信息提示。 代码如下: Sub Cjmark() Dim cj As Integer cj = InputBox("请输入成绩:") If cj >= 60 Then MsgBox "及格" Else MsgBox "不及格" End If End Sub
50
3.IF … THEN … ELSEIF多分支 格式: IF 条件1 THEN 语句序列1 ELSEIF 条件2 THEN 语句序列2 ……
END IF
51
执行过程: 依次判断条件,如果找到一个满足的条件,则执行其下面 的语句序列,然后执行END IF后面的语句。 如果所列的条件都不满足,则执行ELSE语句后面的语句序 列; 如果所列出的条件都不满足,又没有ELSE子句,则直接跳 过END IF,执行其后面的语句。
52
例8-8 编写程序,将学生的百分制成绩按要求转换成相应的 等次输出。成绩在[90,100]为“优秀”;成绩在[80,90)为“良好”; 成绩在[70,80)为“中等”;成绩在[60,70),60分以下的为“不及 格”。 操作步骤: (1)创建窗体。添加文本框,“名称”属性改为txtCj;添加标 签,“名称”属性改为lblMark;添加命令按钮,“名称”属性改为 cmdStart,“标题”属性改为“鉴定”。
53
(2)进入代码设计窗口,编写如下事件过程:
Private Sub cmdStart_Click() Dim score!,,grade$ score = txtCj.Value If score >= 90 Then grade = "优秀" ElseIf score >= 80 Then grade = "良好" ElseIf score >= 70 Then grade = "中等" ElseIf score >= 60 Then grade = "及格" Else grade = "不及格" End If lblMark.Caption = score & "分为" & grade End Sub
54
4. SELECT CASE 语句(情况语句) 格式: SELECT CASE <变量或表达式>
<语句组1> CASE <表达式2> <语句组2> …… CASE <表达式n> <语句组n> [CASE ELSE <语句组 n+1>] END SELECT
55
执行过程: 首先计算变量或表达式的值,然后依次计算CASE子句中 表达式的值,如果变量或表达式的值和某个CASE表达式 的值吻合,则执行相应的语句序列,然后执行END SELECT下面的语句。 当前CASE表达式的值不满足,则进行下一个CASE语句的 判断。 如果都不满足,有CASE ELSE部分则执行语句序列n+1,否 则执行END SELECT后面的语句。
56
CASE 语句中的表达式有三种不同的形式:
一组枚举值或单个值,相邻两个值之间用逗号隔开。 例如,Case 2, 4, 6,9 用关键字To指定值的范围。 例如,Case "A" To "E" 使用关键字Is指定条件。Is 后面紧跟关系运算符和一个变量或 值。 例如,Case Is<=12 Case 语句中的条件可以是以上形式的组合。 例如,Case 2,4, 9 To 12
57
例8-9 将例8-8的程序代码用Select Case情况语句完成,程序代码如下: Private Sub cmdStart_Click() Dim score!,grade$ score = txtCj Select Case score Case Is >= 90 grade = "优秀" Case Is >= 80 grade = "良好" Case Is >= 70 grade = "中等" Case Is >= 60 grade = "及格" Case Else grade = "不及格" End Select lblmark.Caption = score & "分为" & grade End Sub
58
5.IIF() 函数 格式: IIF(<条件表达式>,<表达式1>,<表达式2>) 说明:
例如:求x,y中大的数,将其存入MaxNum变量中,可以使用 如下语句: MaxNum = IIf(x > y, x, y)
59
循环结构 1.FOR循环 格式: FOR <循环变量=初值> TO <终值> [STEP <步长>] <循环体语句序列> [EXIT FOR ] NEXT [<循环变量>] 执行过程: 先把初值赋给循环变量,并将循环变量的当前值与终值比较, 若比较结果为真,执行循环体语句序列,增加一个步长,再进行 比较,如此循环下去,直到比较结果为假,结束循环。
60
说明: (1)步长可以是整数或小数,步长是1可以省略,默认步长 为1。 (2)若步长大于0,判断循环变量的当前值是否大于终值。 若步长小于0,判断循环变值是否小于终值。步长不能为0,步长 为0会导致循环无法结束。 (3)可以用Exit For语句中途结束循环。 (4)Next后的循环变量可以省略,由系统匹配。
61
例8-10 求1+2+3+….+100的和。 创建窗体,添加文本框,“名称”属性改为txt1;添加命令按钮, “标题”属性改为“求和”,“名称”属性改为Cmd1。
62
进入代码设计窗口,编写如下事件过程: Private Sub Cmd1_Click() Dim I As Integer Dim s As Integer For i = 1 To 100 s = s + i Next txt1.Value = s End Sub
63
例8-11 求n!(n为自然数) 创建如图所示窗体,添加文本框,“名称”属性改为txt1;添加 命令按钮,“标题”属性改为“求阶乘”,“名称”属性改为Cmd1。
64
进入代码设计窗口,编写如下事件过程: Private Sub Cmd1_Click() Dim i As Integer Dim n As Integer Dim p As Long n = InputBox("请输入一自然数:") P = 1 For i = 1 To n p = p *i Next txt1.Value = n & "的阶乘是" & p End Sub
65
2. DO-WHILE-LOOP循环 格式: DO WHILE <循环条件> <语句序列> [EXIT DO]
执行过程: 先检查循环条件,若条件为真,执行语句序列,执行到LOOP 语句返回循环开始处,重新判断条件,若条件仍为真,再次执行 语句序列,重复下去,直到条件为假退出循环。
66
说明: (1)重复执行的语句序列称为循环体,用EXIT DO可以中途 退出循环。 (2)要在DO-WHILE-LOOP循环之前给循环变量赋初值,在 循环体内改变循环变量。
67
例8-12编写程序,求自然数前n项和小于1000的最大的n值 操作步骤: 添加新模块,运行结果如下图所示。
68
过程代码如下: Sub Maxdata() Dim s%, n% n= 0 s = 0 Do While s < 1000 n = n + 1 s = s + n Loop MsgBox "自然数前n项和小于1000的最大的n值:" & n - 1 MsgBox "自然数前 " & n - 1 & " 项的和:" & s - n End Sub
69
3. DO-UNTIL-LOOP循环 格式: DO UNTIL 循环条件 语句序列 [EXIT DO] LOOP 执行过程:
70
例8-13输入若干个学生成绩,以-1为结束标志,求这些成绩的 平均值。 操作步骤: 添加新模块,过程代码如下: Sub Avgcj() Dim cj As Integer,i As Integer,avg As Single i = 1 cj = InputBox("请输入第" & i & "位学生的成绩") Do Until cj= -1 avg = avg + cj i= i + 1 cj= InputBox("请输入第" & i & "位学生的成绩") Loop MsgBox ("平均成绩=" & Round(avg / (i - 1), 1)) End Sub
71
4. 多重循环 如果一个循环语句的循环体中嵌套了另一个循环语句,这种 循环结构称为多重循环。
4. 多重循环 如果一个循环语句的循环体中嵌套了另一个循环语句,这种 循环结构称为多重循环。 例8-14 在立即窗口下,打印如图所示格式的九九乘法口诀。
72
过程代码如下: Sub cfkj() Dim I As Integer, j As Integer, z As Integer For i = 1 To 9 j = 1 Do While j <= i Debug.Print j & “*” & i & “=“ & z, j = j + 1 Loop Debug.Print Next i End Sub
73
说明: ① 该程序包含了二重循环。外面的循环称为外循环,由循环变量 i控制,内部的循环称为内循环,由循环变量j控制。 ② 程序执行从i循环开始,i每取一个值,内循环j就要从1至i取一 遍。变量i控制行数,变量j控制每行输出的列数。 ③ Debug.Print 语句用于在立即窗口输出信息。其语法格式为: Debug . Print <输出项列表> <输出项列表>由一个或多个表达式组成,各项之间分隔符有逗号“,” 和分号“;”两种形式。 逗号“,” 表示与下一个输出项间距为一个Tab键 分号“;”表示与下一个输出项间距为一个空格键 若<输出项列表>最后没有符号,则下一个输出项将换行输出。
74
8.5 数组 数组的实质是内存中一片连续存储空间,该连续存储空间由 一组具有数据类型的子空间组成,每个子空间对应一个变量,称 为数组的一个元素,也称为数组元素变量。 数组元素在数组中的序号称为下标。系统通过数组名和相应 的下标即可访问数组元素。 数组的优点是用数组名代表逻辑上相关的一批数据。
75
8.5.1 数组的声明 1. 一维数组声明 数组在使用前,必须显式声明,可以用Dim语句来声明数组。
数组的声明 数组在使用前,必须显式声明,可以用Dim语句来声明数组。 1. 一维数组声明 Dim 数组名([下标下界 To] 下标上界) [As 数据类型] 下标必须为常数,不允许是表达式或变量。如是不指定下界,下界 的默认值为0。 例如: Dim y(5) As Integer '定义了一个一维数组,占据6个整形变 量空间 Dim x(1 To 5) As Integer '定义了一个一维数组,占据5个整形 变量空间
76
2. 二维数组声明 DIM 数组名([下标下界 TO] 下标上界,[下标下界 TO] 下标上 界) [AS 数据类型]
2. 二维数组声明 DIM 数组名([下标下界 TO] 下标上界,[下标下界 TO] 下标上 界) [AS 数据类型] 上标、下标必须为常数,不允许是表达式或变量。如是不指 定下界,下界的默认值为0。 例如: Dim c(2 ,3 ) As Integer 该语句声明了一个二维数组c,它包含了12个元素,每个元素 都是一个整形变量。
77
8.5.2 数组的使用 数组声明后,数组中的每个元素都可以当作简单变量来使用。 例如: y(3)是一个数组元素,其中y为数组名,3是下标。
数组的使用 数组声明后,数组中的每个元素都可以当作简单变量来使用。 例如: y(3)是一个数组元素,其中y为数组名,3是下标。 在使用数组元素时,必须把下标放在一对紧跟在数组名之后的括号中。 Y(3)是一个数组元素,Y3是一个简单变量。
78
例8-15 输入任意10个学生的成绩,输出大于平均成绩的数据。 操作步骤:创建一空白窗体,添加一文本框,“名称”属性改为 Txt1,附属标签为“10个成绩”,用于显示10个成绩;添加一文本 框,“名称”属性改为Txt2,附属标签为“大于平均数的值”,用于显 示大于平均成绩的数;添加命令按钮,“标题”属性改为“开始”, “名称”属性改为cmdStart。
79
进入代码设计窗口,编写如下事件过程: Private Sub cmdStart_Click() Dim a(10) As Single, s As Single ,avg As Single For i = 1 To 10 a(i) = InputBox( "请输入第" & i & "个数") s = s + a(i) Txt1 = Txt1 & " " & a(i) Next i avg = s / 10 For i = 1 To 10 If a(i) > avg Then Txt2 = Txt2 & " " & a(i) End If End Sub
80
8.6 过程调用与参数传递 模块是过程的组成形式,所有过程都存在于相应的模块中, 一个模块可以包含多个过程。 (1)SUB过程
8.6 过程调用与参数传递 模块是过程的组成形式,所有过程都存在于相应的模块中, 一个模块可以包含多个过程。 (1)SUB过程 SUB过程无返回值,不能用在表达式中。 (2)FUNCTION过程 FUNCTION过程有返回值,常用在表达式中。 调用FUNCTION过程就像使用基本函数一样。
81
8.6.1 SUB过程 1.SUB过程定义格式 2. SUB过程调用格式
SUB <过程名>([形参1 AS 数据类型, 形参2 AS 数据类型,…]) <语句序列> END SUB 2. SUB过程调用格式 格式1:CALL <过程名>([实参1,实参2,…]) 格式2:<过程名> 实参1,实参2,…
82
例8-16创建两个子程序过程add和substract ,add过程实现两个 参数相加,substract实现两个参数相减。输入两个数,调用这两 个子程序,计算相加和相减的结果。
83
8.6.2 Function过程 1.FUNCTION 过程定义格式 2.FUNCTION 过程调用格式
FUNCTION <过程名>([<形参1 AS 数据类型,形参2 AS 数 据类型,…>])[AS数据类型] <语句序列> <过程名>=<表达式> END FUNCTION 2.FUNCTION 过程调用格式 调用FUNCTION过程的方式是直接引用过程名,过程名通常用 在表 达式中。
84
例8-17 使用FUNCTION过程,计算 𝐶 𝑚 𝑛 分析:求组合 𝐶 𝑚 𝑛 的数学式为:n. /(m. (n-m)
例8-17 使用FUNCTION过程,计算 𝐶 𝑚 𝑛 分析:求组合 𝐶 𝑚 𝑛 的数学式为:n!/(m!*(n-m)!)。本题编写一个求 阶乘的函数,分别调用三次,每次的调用参数分别为n,m,n-m。 操作步骤: 创建一空白窗体,添加三个文本框,如下图所示。
85
FUNCTION过程代码如下 : Function jc(p As Integer) As Long Dim I As Integer, s As Long s = 1 For i = 1 To p s = s * i Next i jc = s End Function 过程名 过程名>=<表达式>
86
事件代码如下: Private Sub cmdStart_Click() Dim n As Integer, m As Integer, result As Long n = txtN m = txtM If n >= m And n>0 And m>=0 Then c = jc(n) / (jc(m) * jc(n - m)) txtresult = c lblm.Caption = m lbln.Caption = n Else MsgBox "数据录入有误,请重录", vbCritical End If End Sub 第一次调用 第二次调用 第三次调用
87
参数传递 在调用过程中,一般主调用过程和被调用过程之间有数据传 递,也就是主调用过程的实参传递给被调用过程的形参,然后执 行被调用过程。 1.传值方式 在形参前面加ByVal说明符,表示参数传递是传值方式,是一 种单向的数据传递。即调用时只能由实参将值传递给形参,调用 结束后不能由形参将操作结果返回给实参。 实参可以是常量或表达式。
88
2.传址方式 在形参前面加ByRef说明符或省略不写,表示参数传递是传址 方式,是一种双向的数据传递。即调用时由实参将值传递给形参, 调用结束后由形参将操作结果返回给实参。 实参只能是变量。
89
当给x,y分别输入10时,单击命 令按钮,标签显示结果?
例8-18 阅读下面程序代码,分析程序运行结果 主调用过程代码如下: Private Sub Cmd1_Click() Dim x%, y% x = txt1 y = txt2 Cscd x, y lbl1.Caption = "x=" & x lbl2.Caption = "y=" & y End Sub 子过程代码如下: Sub Cscd(ByRef a As Integer,ByVal b As Integer) a = a + 10 b = b + 10 当给x,y分别输入10时,单击命 令按钮,标签显示结果? 按地址传递 按数值传递
90
8.6.4 变量的作用域 1.局部范围 变量可被访问的范围称为变量的作用域。变量的作用域有三 个层次:局部范围、模块范围和全局范围。
变量的作用域 变量可被访问的范围称为变量的作用域。变量的作用域有三 个层次:局部范围、模块范围和全局范围。 1.局部范围 在模块的过程内部用Dim或Static关键字声明的变量,称为局 部变量。 局部变量的作用范围是局部的,只在过程执行期间才存在。
91
2.模块范围 变量定义在模块的所有子过程或函数过程的外部,在模块的 通用声明区域,用Dim或Private关键字声明的变量,称为模块级 变量。 模块级变量在声明它的整个模块中的所有过程中都能使用, 但其他模块过程却不能访问。 一旦模块运行结束,模块变量的内容自动消失。
92
3.全局范围 在标准模块的通用声明段用Public关键字声明的变量,称为全 局变量。
全局变量在声明它的数据库中所有的类模块和标准模块的所 有过程中都能使用。 例如,在标准模块的通用声明区域声明全局变量的语句格式 是: Public i As Integer
93
Option Compare Database Public j As Integer Dim i As Integer Private k As Integer Private Sub Command2_Click() i = 5 Call aa MsgBox i End Sub Sub aa() Dim i As Integer i = i+5 全局变量 模块级变量 模块级变量 局部变量
94
8.6.5 变量的生存期 1.动态变量 2.静态变量 从变量的生存期来分,变量又分为动态变量和静态变量。
变量的生存期 从变量的生存期来分,变量又分为动态变量和静态变量。 1.动态变量 用Dim关键字声明的局部变量属于动态变量。 动态变量的生存期是指:从变量所在的过程第一次执行,到 过程执行完毕,自动释放该变量所占的内存单元为止的这一段时 间。 2.静态变量 用Static关键字声明的局部变量属于静态变量。 静态变量在过程运行时可保留变量的值,即每次调用过程时, 用Static说明的变量保持上一次的值。
95
例8-19 比较动态变量和静态变量的应用 代码如下: Private Sub Cmd1_Click() Dim x% Static y% x = x + 1 y = y + 1 b1.Caption = x b2.Caption = y End Sub 连续单击“开始”按钮5次,y=5 说明: 因为x为动态变量,它的值总是从0开始,所以值为1。 变量y为静态变量,它的值从上一个过程结果开始,所以值为5。
96
8.7 VBA的数据库编程 通过数据访问接口,可以在VBA代码中处理打开的或没有打 开的数据库、表、查询、字段、索引等对象,可以编辑数据库中 的数据。 在VBA中主要提供了三种数据访问接口: ODBC API:Open Database Connectivity Application Programming Interface(开放数据库互连应用编程接口)。 DAO:Data Access Object(数据访问对象)。 ADO:ActiveX Data Object(ActiveX数据对象)。
97
8.7.1 ADO数据访问接口 1. ADO对象模型 ADO是一个组件对象模型,模型中包含了一系列用于连接和 操作数据库的组件对象。
系统已经完成了组件对象的类定义,只需在程序中通过相应 的类类型声明对象变量,就可以通过对象变量来调用对象方法、 设置对象属性,以此来实现对数据库的各项访问操作,如图所示。
98
ADO模型对象包含的对象 对 象 作 用 Connection 建立与数据库的连接,通过连接可以从应用程序中访问数据源 Command 在建立与数据库的连接后,发出命令操作数据源 Recordset 与连接数据库中的表或查询相对应,所有对数据的操作基本上都是在记录集中完成的 Field(s) 表示记录集中的字段数据信息 Error 表示程序出错时的扩展信息
99
2.设置ADO库的引用 在使用ADO之前,必须引用包含ADO对象和函数的库。其引 用设置方法为: (1) 进入VBA编程环境。
(2) 单击“工具”“引用”命令,打开“引用”对话框。 (3) 在可使用的引用中,选择“Microsoft ActiveX Data Objects2.1 Library”。单击“确定”按钮。
100
ADO访问数据库步骤 通过ADO编程实现数据库访问时,首先要创建ADO对象变量, 然后通过对象变量调用对象的方法,设置对象的属性,实现数据 库的各种访问。 1. 创建对象变量 定义连接对象变量:Dim cn As ADODB.Connection 定义记录集对象变量:Dim rs As. ADODB.RecordSet 定义字段对象变量:Dim fs As. ADODB.Field
101
2. 对象变量赋值 cn.Open <连接串等参数> '打开一个连接
2. 对象变量赋值 cn.Open <连接串等参数> '打开一个连接 rs.Open <查询串等参数> '打开一个记录集 set fs=… '设置字段引用
102
3. 通过对象的方法和属性进行操作 (1) Command对象 Command对象主要用来执行查询命令,获得记录集。
3. 通过对象的方法和属性进行操作 (1) Command对象 Command对象主要用来执行查询命令,获得记录集。 (2) Record对象 通过Record对象可以读取数据库中的记录,进行添加、删 除、更新和查询操作。
103
Record对象常用属性 名 称 含 义 Bof 如果为真,指针指向记录集的顶部 Eof 如果为真,指针指向记录集的底部 RecordCount 返回记录集对象中记录的个数 Filter 设置筛选条件过滤出满足条件的记录
104
名 称 含 义 AddNew 添加新记录 Delete 删除当前记录 Find 查找满足条件的记录 Move 移动记录指针位置 MoveFirst 指针定位在第一条记录 MoveLast 指针定位在最后一条记录 MoveNext 指针定位在下一条记录 MovePrevious 指针定位在上一条记录 Update 将Recordset对象中的数据保存到数据库 Close 关闭连接或记录集
105
4.操作后的收尾工作 Rs.Close '关闭记录集 Set rs= Nothing '回收记录集对象变量占有的内存
106
8.8 VBA程序的调试 8.8.1 常见错误类型 1.语法错误 编写程序不可避免地会发生错误,常见的错误有如三种。
常见错误类型 编写程序不可避免地会发生错误,常见的错误有如三种。 1.语法错误 语法错误是指输入了不符合程序设计语言语法要求的代码, 如If语句的条件后面忘记写Then,Dim写成了Din等。 Access 的代码编辑窗口是逐行检查的,如果在输入时发生了 此类错误,编辑会随时指出,并将出现错误的语句用红色显示。
107
2.运行错误 运行错误是指在程序运行中发现的错误。例如数据传递时类 型不匹配,试图打开一个不存在的文件等,这时系统会在出现错 误的地方停下来,并打开代码窗口,给出运行时错误提示信息并 告知错误类型。修改了错误以后,选择“运行继续”命令,继续 运行程序,也可以选择“运行”“重新设置”命令退出中断状态。
108
3.逻辑错误 程序运行时没有发生错误,但程序没有按照所期望的结果执 行。产生逻辑错误的原因很多,一般难以查找和排除,有时需要 修改程序的算法来排除错误。
109
Debug. Print x 8.8.2 调试方法 1.Debug.Print 语句
调试方法 1.Debug.Print 语句 在VBA中添加Debug. print语句可以对程序的运行实行跟踪。 例如,程序中有变量x,如果程序调试过程中要对变量x进行 监视,就可以在适当位置加上以下语句: Debug. Print x 在程序调试的过程中,在立即窗口中就会显示x的当前值。在 一个程序代码中可以使用多个Debug. Print语句,也可对同一个变 量使用多个Debug. Print语句。
110
2.设置断点 在程序中人为设置断点,当程序运行到设置了断点的语句时, 会自动暂停运行,将程序挂起,进入中断状态。可以在任何执行 语句和赋值语句处设置断点,但不能在声明语句和注释处设置断 点,也不能在程序运行时设置断点,只有在程序编辑状态或程序 处于挂起状态时才可以设置断点。
111
(1)设置断点 在代码编辑窗口中将光标移到要设置断点的行,按F9键或单 击“调试”工具栏上的“切换断点”按钮设置断点,也可以在代码编辑 窗口中单击要设置断点的那一行语句左侧的灰色边界标识条来设 置。 (2)取消断点 可以再次单击编辑窗口左侧的灰色边界标识条取消断点。
112
3.单步跟踪 单步跟踪即每执行一条语句后都进入中断状态。通过单步执 行每一条语句,可以及时、准确地跟踪变量的值,从而发现错误。
单步跟踪的方法是将光标置于要执行的过程内,单击“调试逐语 句”按钮或单击F8键,执行当前语句(用黄色亮条显示),同时将 程序挂起。
113
4.设置监视点 如果设置了监视表达式,一旦监视表达式的值为真或改变,程序 也会自动进入中断状态。设置监视表达式的方法如下:
(1)选择“调试添加监视”命令,弹出“添加监视”对话框。 (2)在“模块”下拉列表中选择被监视过程所在的模块;在“过程” 下拉列表中选择要监视的过程;在“表达式”文本框中输入要监视的表 达式。 (3)在“监视类型”选项区域中选择监视类型。 (4)设置完监视表达式后屏幕上会出现监视窗口。
114
小结 模块是Access中的重要对象,它以VBA语言为基础编写,以过 程为单元的集合方式存储。VBA是一种面向对象程序设计语言。 VBA的程序流程控制结构有:顺序结构、选择结构和循环结构。 在模块的过程调用中,可能存在参数传递,过程中的变量有作用 域和生存周期。可以使用ADO对数据库进行访问。无论编程者如 何小心,错误都在所难免。利用调试工具和错误处理的方法可尽 量避免错误。
Similar presentations