08Access的编程工具VBA.ppt_第1页
08Access的编程工具VBA.ppt_第2页
08Access的编程工具VBA.ppt_第3页
08Access的编程工具VBA.ppt_第4页
08Access的编程工具VBA.ppt_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章Access的编程工具VBA 宏毕竟功能有限 和宏相比 VBA编程除了可以实现更复杂的功能外 还有使数据库易于维护的特点 第8章Access的编程工具VBA 8 1VBA程序设计概述 8 1 1VBA编程环境8 1 2面向对象程序设计的概念 BASICBeginner sAll purposeSymbolicInstructionCode初学者万用符号指令代码 关于VBA VisualBasicWindows环境下的应用程序开发工具 它是可视化的 面向对象的 采用事件驱动方式的高级程序设计语言 VBA是MicrosoftOffice内置的编程语言 是根据VisualBasic简化的宏语言 其基本语法 词法与VisualBasic基本相同 因而具有简单 易学的特点 与VisualBasic不同的是 VBA不是一个独立的开发工具 一般被嵌入到像Word Excel Access这样的宿主软件中 与其配套使用 从而实现在其中的程序开发功能 在Office中使用的VBA开发界面被称为VBE VisualBasicEditor 它具有编辑 调试和编译VisualBasic程序的功能 8 1 1VBA编程环境 从Access数据库窗口切换到VBE环境 在数据库窗口新建或打开一个模块对象选择 工具 宏 VisualBasic编辑器 命令使用标准工具栏上的 代码 按钮 另外 也可以在设计窗体 报表时转到VBE环境 1 工具栏包括标准 编辑 调试和用户窗体工具栏 2 工程资源管理器窗口列出当前应用程序中的所有窗体 报表和VBA程序模块 3 代码窗口显示 编辑模块中的程序代码 4 属性窗口列出所选对象控件的各种属性 4 属性窗口列出所选对象控件的各种属性可以在Access数据库环境的属性窗口设置对象的各种属性值 也可以在VBE环境的属性窗口设置对象的各种属性值 5 立即窗口用来在调试程序的过程中给变量临时赋值或输出变量或表达式的值 在VBA中 通常使用Debug对象的Print方法进行输出 VBA采用了面向对象的程序设计方法 8 1 2面向对象程序设计的概念 类 是对一类相似对象的定义和描述 因此类可看做是对象的模板 每个对象由类来定义 1 对象和集合 对象 在采用面向对象程序设计方法的程序中 程序处理的目标被抽象成了一个个对象 每个对象具有各自的属性 方法和事件 对象集合 是由一组对象组成的集合 这些对象的类型可以相同 也可以不同 Access有几十个对象 其中包括对象和对象集合 所有对象和对象集合按层次结构组织 处在最上层的是Application对象 即Access应用程序 其他对象或对象集合都处在它的下层或更下层 Access程序中的常用对象 2 属性和方法对象的特征用属性和方法描述 属性 用来表示对象的状态 如窗体的Name 名称 属性 Caption 标题 属性等 方法 用来描述对象的行为 如窗体有Refresh方法 Debug对象有Print方法等 引用对象的属性或方法时应该在属性名或方法名前加对象名 并用对象引用符 连接例如 Me Label1 caption 春江水暖鸭先知 Debug print 你好 3 事件和事件过程事件 是对象可以识别的动作 通常由系统预先定义事件过程 对象在识别了所发生的事件后执行的程序 例如 下面的事件过程描述了单击按钮之后所发生的一系列动作 PrivateSubCommand1 Click Me Label1 Caption 首都经济贸易大学 Me Text1 EndSub 8 2VBA编程基础 8 2 1数据类型8 2 2常量8 2 3变量8 2 4函数8 2 5表达式 VBA的数据类型共有13种 每种数据类型的数据在存储时所占的存储空间和处理时能够进行的运算都不相同 8 2 1数据类型 VBA的数据类型 VBA的数据类型 续表 常量就是其值在程序运行期间不变的量 常量又分 8 2 2常量 字面常量符号常量固有常量 1 字面常量字面常量是常量按照其实际数值表示 1 各种数字型常量 如123 0 005 也可以用指数形式 如1250 0可写成1 25E 3 2 字符型常量 如 Visual 北京 3 日期型常量 按8字节的浮点数来存储 如 2007 1 1 1 1 2007 2002 5 414 30 00PM 4 布尔型常量 只有两个值True或False 2 符号常量如果程序中多处用到某个常量 将其定义成符号常量可增加代码的可读性 也便于维护 用关键字Const定义符号常量 ConstPIassingle 3 1415926 3 固有常量这是一类特殊的符号常量 通常已经预先在类库中定义好 编程者只要直接使用这些已经定义好的符号常量即可 例如VBA类库中 vbRed代表红色 vbBlue代表蓝色 这里开始的两个字母表示所在的类库Access类库的常量以ac开始 如acForm等 ADO类库的常量以ad开始 如adOpenKeyset 变量是其值在程序运行期间变化的量 程序运行时 变量代表的就是内存中的某块临时存储空间 8 2 3变量 1 变量的命名规则 1 以字母或汉字开头 后可跟字母 数字或下划线 2 变量名最长为255个字符 3 不区分变量名的大小写 不能使用关键字 4 字符之间必须并排书写 不能出现上下标 以下是合法的变量名 a x x3 BOOK 1 sum5以下是非法的变量名 3ss T 3xbowy 1if 2 变量的声明 一般 变量在使用前应该先声明 格式为Dim变量名 AS类型 例如DimabAsinteger sumAssingle如果省略 AS类型 则所定义的变量为Variant型 VBA允许用户在编写应用程序时 不声明变量而直接使用 这就是隐式声明 所有隐式声明的变量都是Variant数据类型 建议在程序中显式声明变量 VBA提供了大量的内置函数 这些函数极大地丰富了VBA的功能 8 2 4函数 了解和使用函数 应从下面三个方面 函数名参数 指参数的个数 顺序和类型 函数值 按照函数的功能 VBA的内置函数可分为数学函数字符串函数日期函数转换函数等 具体介绍可见附录B 下面主要介绍专门负责输入输出的函数MsgBox函数和InputBox函数 1 MsgBox函数 功能 在对话框中显示消息 等待用户单击按钮 并返回一个Integer型数值 告诉用户单击的是哪一个按钮 格式为MsgBox 提示 按钮 图标和默认按钮 标题 例如 下面的程序是某个窗体中单击 退出 按钮后执行的动作 运行时先显示消息框 并将返回的结果赋给Integer型变量Response 如果单击 是 按钮 则关闭当前窗体 否则返回到当前窗体 PrivateSubcmd退出 Click DimresponseAsIntegerresponse MsgBox 真的要退出吗 vbYesNoCancel vbQuestion 提示 Ifresponse vbYesThenDoCmd CloseEndIfEndSub 2 InputBox函数 功能 在对话框中显示提示信息 等待用户输入正文并按下按钮 返回文本框中输入的内容 String型 格式为InputBox 提示 标题 默认 例如strName InputBox 请输入您的姓名 输入 张三 8 2 5表达式 表达式是将常量 变量 字段名称 控件的属性值和函数用运算符连接而成的运算式 VBA中有5类运算符 使用这些运算符可以分别构成算术表达式 字符表达式 关系表达式 布尔表达式和对象引用表达式 1 算术表达式 当几个算术运算符一起使用时 运算顺序由优先级决定 而且使用圆括号可以改变原有的运算顺序 2 字符串表达式 字符运算符只有1个 作用是连接两个字符串 例如 字符串表达式 中国 北京 运算的结果为字符串 中国北京 3 关系表达式 关系运算符用来实现数据的比较 结果为逻辑值True或False 关系运算符有7个 它们有相同的优先级4 4 布尔表达式 布尔表达式也叫逻辑表达式 用来实现对逻辑量True和False的运算 5 对象引用表达式 对象引用运算符有2个 和 表达式的结果为被引用的对象或被引用对象的属性值或方法 8 3VBA程序流程控制 8 3 1程序的顺序控制8 3 2程序的分支控制8 3 3程序的循环控制 程序由语句组成 每个程序语句由关键字 标识符 运算符和表达式等组成 每条语句指明了计算机要进行的具体操作 按照语句所执行的功能 VBA的程序语句有赋值语句 声明语句 控制语句 注释语句等 是最基本的语句 它的功能是给变量或对象的属性赋值 其格式为 或 例如 Rate 0 1 给变量赋值 给控件的属性赋值Me Text1 Value 欢迎使用ACCESS 赋值语句 为赋值号 表示赋值的动作 不要理解为数学上的等号 1 VBA代码中不区分字母的大小写 除汉字外 全部字符都用半角符号 2 在程序中可适当添加空格和缩进 3 一般一行书写一条语句 多条语句写在同一行时用 分开 一条语句分多行写时用1个空格加下划线 续行 例如 response MsgBox 真的要退出吗 vbYesNoCancel vbQuestion 提示 4 应养成及时注释的好习惯 在VBA中有两种方法可以添加注释 一是在行前用rem关键字开始 二是在行前或行末用单引号 开始 书写原则 8 3 1程序的顺序控制 程序的三种基本控制结构是顺序结构 分支结构和循环结构 顺序结构是最简单的一种结构 程序运行时 计算机按照语句的排列顺序依次执行程序中的每一条语句 例8 1创建如图8 5所示的窗体 计算圆的面积和周长 要求在文本框中输入了圆的半径后 单击 计算 按钮 在窗体的另外两个文本框中分别输出圆的面积和周长 本例除了采用第5章介绍的方法制作窗体外 最关键的是编写 计算 按钮的单击事件 为按钮添加事件代码的方法是 用鼠标右键单击按钮 在弹出的快捷菜单中选择 事件生成器 命令 在打开的 选择生成器 对话框中选择 代码生成器 选项 转到VBE环境 计算 按钮的Click事件过程如下 PrivateSubcmd计算 Click 定义变量和符号常量DimrAsSingle r为圆的半径DimsAsSingle s为圆的面积DimlAsSingle l为圆的周长ConstPIAsSingle 3 1415926 给变量r赋值r InputBox 请输入圆的半径 输入 计算圆的面积和周长s PI r 2l 2 PI r 用文本框输出结果Debug PrintsDebug PrintlEndSub 8 3 2程序的分支控制 类似条件宏 分支结构是用条件来控制语句的执行 在VBA中 执行分支结构控制的语句有If语句和SelectCase语句 1 If Then Else语句 语句格式为IfThenElseEndIf 输入两个数并在立即窗口输出其中较大的数DimxAsInteger yAsIntegerx InputBox 请输入x的值 y InputBox 请输入y的值 Ifx yThenDebug PrintxElseDebug PrintyEndIf 说明 1 可以是任何表达式 一般为关系表达式或布尔表达式 如果是其他表达式 则非0认为是True 0认为是False 2 执行时 先判断表达式的值 为True则执行语句块1 否则执行语句块2 3 如果语句较短 也可以采用下面的单行形式将整个语句写在一行上 Ifx yThenDebug PrintxElseDebug Printy 4 使用过程中有时没有语句块2 这时If语句变为单分支结构 其语句格式为IfThenEndIf 例8 2用VBA程序实现窗体 系统登录 与第7章不同 本例中对用户名和口令的检验改为用VBA程序代码 触发并执行这些代码的条件仍然是单击 确定 按钮 确定 按钮的Click事件过程PrivateSubcmd确定 Click DimnameAsString passAsStringDimrAsInteger 存放MsgBox消息框的返回值name Me txt用户名pass Me txt口令Ifpass 1234 Andname cueb Then 如果用户名和口令正确 显示消息框 运行 学生管理模块 窗体MsgBox 欢迎进入学生管理模块 vbOKOnly vbCritical 欢迎 DoCmd Close 关闭系统登录窗体DoCmd OpenForm 学生管理模块 打开 学生管理模块 窗体ElseMsgBox 密码错误 vbOKOnly 显示消息框Me txt用户名 使文本框清空Me txt口令 Me txt用户名 SetFocus 使文本框获得焦点 准备重新输入EndIfEndSub 使用DoCmd对象的方法 可以从VBA代码中运行多种Access操作 如打开和关闭窗体 设置控件值等任务 在本例中打开窗体使用了DoCmd对象的OpenForm方法 关闭窗体使用了DoCmd对象的Close方法 2 If Then ElseIf语句 语句格式为IfThenElseIfThen ElseIfThenElse EndIf 运行时 从表达式1开始逐个测试条件 当找到第一个为True的条件时 即执行该条件后所对应的语句块 例8 3编程根据输入的学生成绩 评定其等级 标准是 90 100分为 优秀 80 89分为 良好 70 79分为 中等 60 69分为 及格 60分以下 不合格 为了重点说明程序 本例将程序放在模块中的过程里 并用立即窗口作为输出 操作步骤如下 1 在数据库设计窗口创建一个新模块 此时系统自动转到VBE环境 选择 插入 过程 命令 这时出现 添加过程 对话框 在该对话框中为新过程命名 gc1 2 在代码窗口的过程gc1中输入下列程序 PublicSubgc1 DimxAsIntegerx InputBox 请输入成绩 Ifx 90ThenDebug Print 优秀 ElseIfx 80ThenDebug Print 良好 ElseIfx 70ThenDebug Print 中等 ElseIfx 60ThenDebug Print 及格 ElseDebug Print 不及格 EndIfEndSub 3 SelectCase语句 语句格式为SelectCaseCase语句块1Case语句块2 CaseElse语句块n 1 EndSelect 说明 1 SelectCase后的变量或表达式只能是数值型或字符型表达式 2 执行过程是先计算SelectCase后的变量或表达式的值 然后从上至下逐个比较 决定执行哪一个语句块 如果有多个Case后的表达式列表与其相匹配 则只执行第一个Case后的语句块 3 语句中的各个表达式列表应与SelectCase后的变量或表达式同类型 各个表达式列表可以采用下面的形式 表达式 a 5 用逗号分隔的一组枚举表达式 2 4 6 8 表达式1To表达式260to100 Is关系运算符表达式Is 60 课堂练习 用SelectCase语句改写例8 3 DimxAsIntegerx InputBox 请输入成绩 SelectCasexCase90To100Debug Print 优秀 Case80To89Debug Print 良好 Case70To79Debug Print 中等 Case60To69Debug Print 及格 CaseElseDebug Print 不及格 EndSelect 特别提示 SelectCase语句和If Then ElseIf语句并不完全等同 SelectCase语句适用于对一个条件的多个不同取值进行测试的情况 而If Then ElseIf语句则可对多个条件进行测试 因此后者的使用范围更广一些 4 分支嵌套 分支语句的语句块中可以嵌套另一个分支语句 但应注意只能是包含的关系 Ifx yThenIfx yThen Else EndIfElse EndIf PrivateSubcmd确定 Click DimnameAsString passAsStringDimrAsInteger 存放MsgBox消息框的返回值name Me txt用户名pass Me txt口令Ifpass 1234 Andname cueb Then 如果用户名和口令正确 显示消息框 运行 学生管理模块 窗体MsgBox 欢迎进入学生管理模块 vbOKOnly vbCritical 欢迎 DoCmd Close 关闭系统登录窗体DoCmd OpenForm 学生管理模块 打开 学生管理模块 窗体Elser MsgBox 密码错误 要继续吗 vbYesNo 显示消息框Ifr vbYesThen 继续输入Me txt用户名 使文本框清空Me txt口令 Me txt用户名 SetFocus 使文本框获得焦点 准备重新输入Else 关闭窗体 不继续输入DoCmd CloseEndIfEndIfEndSub 8 3 3程序的循环控制 循环控制结构也叫重复控制结构 特点是程序执行时 该语句中的一部分操作即循环体被重复执行多次 在VBA中 执行循环控制的语句有For循环语句和Do Loop循环语句 1 For循环语句 语句格式为For to Step ExitFor Next 说明 1 循环控制变量的类型必须是数值型 2 步长可以是正数 也可以是负数 如果步长为1 Step短语可以省略 3 根据初值 终值和步长 可以计算出循环的次数 因此For语句一般用于循环次数已知的情况 4 使用ExitFor语句可以提前退出循环 例8 4编程用For语句求1 2 3 10之和 gc2的程序代码PublicSubgc2 DimsAsInteger iAsIntegers 0Fori 1To10Step1s s iNextiDebug PrintsEndSub 该循环的执行过程如下 1 首先给i赋初值1 2 测试i是否超过终值10 如果没有 则执行累加 否则 退出循环转到步骤 5 3 将i加上一个步长 4 重复步骤 2 和步骤 3 5 继续执行Next后面的语句 2 Do Loop循环语句 形式1 Do While Until 语句块 ExitDo 语句块Loop 该语句适合的范围更广 下面的程序用DoWhile Loop语 句求1 2 3 10之和 PublicSubgc3 DimsAsInteger iAsIntegers 0 i 1DoWhilei 10s s ii i 1LoopDebug PrintsEndsub 说明 1 这里的条件可以是任何类型的表达式 非0为真 0为假 2 执行过程是 在每次循环开始时测试条件 对于DoWhile语句 如果条件成立 则执行循环体的内容 然后回到DoWhlie处准备下一次循环 否则如果条件不成立 则退出循环 对于DoUntile语句 则正好相反 当条件满足时退出循环 3 ExitDo语句的作用是提前终止循环 与For语句相比 有下列几点不同 1 Do Loop语句不仅可用于循环次数已知的情况 而且可用于循环次数未知的情况 因此适用的范围更广 2 Do Loop语句没有专门的循环控制变量 但一般应有一个专门用来改变条件表达式中变量的语句 使得随着循环的执行 条件趋于不成立 或成立 最后达到退出循环 形式2 Do语句块 ExitDo 语句块Loop While Until 说明 和形式1不同的是 在每次循环结束时测试条件 因此 二者的区别是如果一开始循环条件就不成立 则形式1中的循环体部分一次也不执行 而形式2中的循环体部分被执行一次 问题 下面的程序执行结果是什么 控制循环执行的判断被执行了几次 下面的程序用Do LoopWhile语 句求1 2 3 10之和 DimsAsInteger iAsIntegers 0 i 1Dos s ii i 1LoopWhilei 10Debug Prints 例8 5编程求两个整数的最大公约数和最小公倍数 算法 设两个整数分别为m和n 1 保证m大于n 否则将m和n互换 2 求m除以n的余数r 3 若r不为0 则将n赋给m r赋给n 4 重复步骤 2 和步骤 3 直到r为0 此时最大公约数为n 最小公倍数为m和n的乘积除以最大公约数 将m和n互换的算法是借助于第3个变量t t m m n n t gc3中的程序代码 PublicSubgc3 DimnAsInteger mAsInteger tAsIntegerDimrAsInteger r为m n的余数DimmnAsInteger mn为m和n的乘积m Val InputBox m n Val InputBox n mn n mIfm0 m nn rr mModnLoopDebug Print 最大公约数 nDebug Print 最小公倍数 mn nEndSub 3 循环嵌套 循环语句之间 循环语句和分支语句之间也可以进行嵌套 Dowhile Dowhile Loop Loop Dowhile if Endif Loop 8 4VBA数组 8 4 1数组的概念及定义8 4 2数组的应用 8 4 1数组的概念及定义 问题 求10个成绩的平均值 并对它们按照从大到小排序 这10个数怎么组织 放在10个变量中 放在一个数组中 如果在程序中要对一组数据进行处理 通常的解决方法是将这组数放在数组中 数组是一组相同类型的数据的集合 1 一维数组的定义 使用数组必须先定义数组 格式为Dim数组名 to As 例如 dimscore 1to10 asInteger 定义了一个有10个元素的整型数组 所有数组元素具有同一个标识即数组名 数组名后括号内的序号称为数组元素的下标 1 所有数组元素在内存连续存放 2 根据下标区分数组元素 关于数组的定义 还有下面的说明 1 定义数组时数组名的命名规则与变量名的命名规则相同 2 一般在定义数组时应给出数组的上界和下界 但也可以省略下界 缺省为0 例如 Dima 10 AsSingle默认情况下 数组a由11个元素组成 若希望下标从1开始 可在模块的通用声明段使用OptionBase语句声明 其使用格式为OptionBase0 1 后面的参数只能取0或1 3 和不能使用变量 必须是常量 常量可以是字面常量或符号常量 一般是整型常量 4 如果省略As子句 则数组的类型为Varient变体类型 2 二维数组的定义 格式为Dim数组名 to to As 例如 Dimc 1To3 1To4 AsSingle 存放的顺序是先行后列 8 4 2数组的应用 一旦定义了数组 就可以用前面介绍的对变量的处理方法处理数组 并且可以用循环语句对数组进行处理 提高程序的可读性 例8 5编程产生10个0 99之间的随机数 并找出其中的最大值和最小值 本例中使用内置函数Rnd 生成随机数 采用了如下表达式 Int Rnd 100 程序代码如下 PublicSubgc4 Dima 1To10 AsIntegerDimiAsInteger maxAsInteger minAsInteger 生成并输出数组Fori 1To10a i Int Rnd 100 Debug Printa i NextiDebug Print 另起一行 寻找最大值和最小值max a 1 min a 1 Fori 2To10Ifmaxa i Thenmin a i Nexti 输出结果Debug Print max maxDebug Print min minEndSub 例8 7编程在立即窗口输出所示矩阵 矩阵被放在一个二维数组中 111222333 程序代码如下 OptionBase1PublicSubgc5 Dimc 3 3 AsIntegerDimiAsInteger jAsIntegerFori 1To3 赋值Forj 1To3c i j iNextjNextiFori 1To3 输出Debug PrintForj 1To3Debug Printc i j NextjNextiEndSub 例8 8编程输入5个整数 并将这5个数按升序排序 有多种算法可以实现排序 本例采用选择法 其基本思路如下 找出a 1 a 5 中的最大值 放在a 1 中找出a 2 a 5 中的最大值 放在a 2 中 找出a 4 a 5 中的最大值 放在a 4 中问题归结为寻找4次最大值 程序代码如下 OptionBase1PublicSubgc6 Dimp 5 AsInteger 存放最小值的下标DimiminAsIntegerDimiAsInteger jAsInteger tAsIntegerDebug Print 排序前 Fori 1To5 赋值并输出p i InputBox p NextiFori 1To4 排序 寻找最小值的位置imin iForj iTo5Ifp imin p j Thenimin jNextj 交换t p i p i p imin p imin tNexti Debug PrintDebug Print 排序后 输出排序结果Fori 1To5Debug Printp i NextiEndSub 8 5VBA模块的创建 8 5 1VBA标准模块8 5 2过程的创建和调用8 5 3函数的创建和调用8 5 4过程调用中的参数传递8 5 5局部变量 全局变量和静态变量 8 5 1VBA标准模块 VBA程序由模块组成 组成VBA程序的模块有类模块和标准模块 标准模块一般用来承载在程序其他模块中要引用的代码 这些代码按照其是否有返回值可以被组织成Sub过程和Function函数 因而标准模块不与某个具体的对象相连 它的作用就是为其他模块提供可共享的公共Sub过程和Function函数 在Access数据库中创建标准模块的方法 1 在数据库设计窗口创建模块 单击数据库工具栏的 新建 按钮 2 在VBE环境创建模块 选择 插入 模块 命令 无论哪种方法 创建新模块后都会自动转到VBE环境 8 5 2过程的创建和调 过程是一段可以实现某个具体功能的代码与函数不同 过程没有返回值既可以在类模块中 也可以在标准模块中创建过程 PublicSubswap xAsInteger yAsInteger DimtAsIntegert x x y y tEndSub 过程的定义形式如下 Public Private Static Sub过程名 变量名1As类型 变量名2As类型 语句块 ExitSub 语句块 EndSub 说明 1 过程名的命名规则与变量名等其他标识符的命名规则相同 2 过程名后括号内的变量也叫形式参数 如果过程有形式参数 则要在定义过程时指明形参的名称和类型 如果省略类型 则形参的默认类型为Varient型 3 语句 ExitSub 的作用是中途提前退出过程 创建过程的方法是 打开模块 选择菜单 插入 过程 命令 在 添加过程 对话框中输入过程名 调用过程有以下两种格式 格式1 call过程名 实参列表 格式2 过程名 实参列表 这里过程名后的参数叫实际参数 调用过程时应注意实参应与形参的顺序 类型和个数保持一致 例8 10创建一个窗体 在其中的某个按钮的单击事件中用InputBox函数输入两个整数 然后调用过程swap将它们的值互换 按钮的单击事件如下 PrivateSubCommand0 Click DimxAsInteger yAsIntegerx InputBox x y InputBox y Debug Printx yswapx y 或swap x y Debug Printx yEndSub 8 5 3函数的创建和调用 函数有返回值 VBA的函数包含内置函数和用户自定义函数两种 函数的定义形式如下 Public Private Static Function过程名 变量名1As类型 变量名2As类型 As类型 语句块 ExitFunction 语句块 EndFunction 例8 11在前面创建的标准模块 模块1 内创建函数jc 函数的功能是返回一个数的阶乘 另外创建一个过程test 在test过程内调用函数jc 函数jc的定义如下 PublicFunctionjc nAsInteger AsLong 函数的返回值为Long型DimiAsInteger sAsLongs 1Fori 1Tons s iNextijc s 给函数赋值EndFunction 过程test的定义如下 PublicSubtest DimnAsInteger kAsLongn InputBox n Debug Printjc n k jc 3 jc 5 调用函数jcDebug Print 3 5 kEndSub 8 5 4过程调用中的参数传递 在调用过程和函数的过程中 一般会发生数据的传递 即将主调过程中的实参传给被调过程的形参 在参数传递过程中 可以有传址和传值两种形式 1 传址 如果在定义过程或函数时 形参的变量名前不加任何前缀 即为传址 传递过程是 调用过程时 将实参的地址传给形参 因此如果在被调过程或函数中修改了形参的值 则主调过程或函数中实参的值也跟着变化 前面示例中的过程和函数均为传址形式 2 传值 如果在定义过程或函数时 形参的变量名前加ByVal前缀 即为传值 这时主调过程将实参的值复制后传给被调过程的形参 因此如果在被调过程或函数中修改了形参的值 则主调过程或函数中实参的值不会跟着变化 PublicSubswap xAsInteger yAsInteger DimtAsIntegert x x y y tEndSub PublicSubswap1 ByValxAsInteger ByValyAsInteger DimtAsIntegert x x y y tEndSub 按钮的单击事件如下 PrivateSubCommand0 Click DimxAsInteger yAsIntegerx InputBox x y InputBox y Debug Printx yswapx yswap1x yDebug Printx yEndSub 如果输入5和7 程序的结果 8 5 5局部变量 全局变量和静态变量 变量的有效范围 即作用域 按照作用域不同 VBA有局部变量 模块级局部变量和全局变量 1 过程内局部变量 在过程和函数内用关键字Dim定义 有效范围是定义该变量的过程或函数 形参也属于过程内局部变量 2 模块级局部变量 在模块的通用声明段用关键字Dim或Private定义 有效范围是定义该变量的模块 例8 12创建名为 排序 的窗体 运行时自动产生并在左面的列表框中输出10个0 99之间的随机数 单击 排序 按钮后将这10个数按降序排序 并在右边的列表框中输出排序的结果 解题思路 1 用数组存放10个随机数 2 在窗体的Load事件中生成数组中的10个随机数 然后在 排序 按钮的Click事件中将数组排序 因此该数组应定义为模块级数组 关于该题涉及的生成随机数和排序算法 可参考例8 6和例8 8 使用AddItem方法动态向列表框中添加项目控件名 AddItem Item Index Dima 1To10 AsInteger 定义模块级数组PrivateSubForm Load DimiAsInteger 生成并输出数组Fori 1To10a i Int Rnd 100 Me lst左 AddItema i NextiEndSubPrivateSubcmd排序 Click DimiAsInteger jAsInteger imaxAsInteger tAsIntegerFori 1To10 排序 寻找最大值的位置imax iForj iTo10Ifa imax a j Thenimax jNextj 交换t a i a i a imax a imax tNextiFori 1To10 输出排序结果Me lst右 AddItema i NextiEndSub 3 全局变量 是可在整个应用程序使用的变量 定义的方法是在模块的通用声明段用Public关键字定义变量 引用全局变量时 如果是在标准模块中定义的全局变量 可在应用程序的任何地方直接用变量名引用该变量 如果是在类模块 如窗体模块 中定义的全局变量 可在应用程序的任何地方引用该变量 但在变量名的前面应加模块名限定 形式为 模块名 变量名 4 静态变量 静态变量决定了变量的生存期 对于过程内的局部变量 它的生存期从进入过程 Sub 开始 到退出过程 EndSub 时结束 如果要改变过程内局部变量的生存期 可以将它定义为静态变量 定义的方法是在定义过程内局部变量时加关键字Static 例8 13制作一个 记时器 窗体 要求 该窗体运行后首先单击 设置 按钮 然后在输入框中输入计时的秒数 单击 开始 按钮则开始计时 同时计时的秒数显示在文本框中 当计时时间到 停止计时并响铃 同时将文本框清零 基本思路 1 本题中计时由窗体的Timer事件完成 该事件按照预先定义好的时间间隔自动触发 这个时间间隔由窗体的TimerInterval属性决定 为1000 则每隔1秒触发1次 为0 不触发 2 由于在 设置 按钮的单击事件和 开始 按钮的单击事件中都要用到计时范围f 所以将变量f定义成全局变量 3 变量s的作用是计时 即每次Timer事件触发时s的值要加1 所以将变量s定义成静态变量 DimfAsInteger 定义全局变量 在窗体的Load事件中设置TimerInterval属性为0PrivateSubForm Load Me TimerInterval 0EndSub 窗体的Timer事件PrivateSubForm Timer StaticsAsInteger 定义静态变量s s 1Ifs fThenBeep 响铃s 0Me TimerInterval 0EndIfMe txt显示 sEndSub 按钮 cmd设置 的单击事件PrivateSubcmd设置 Click f InputBox 请输入计时范围 EndSub 按钮 cmd开始 的单击事件PrivateSubcmd开始 Click Me TimerInterval 1000 开始计时EndSub 8 6VBA程序的调试 8 6 1错误类型8 6 2设置断点8 6 3单步跟踪8 6 4设置监视点 中断模式在中断模式下 程序暂停运行 这时编程者可以查看并修改程序代码 检查各个变量或表达式的取值 两种情况下可以使程序进入中断模式 一种是如果程序出现错误 无法继续执行 则会自动进入中断模式 第二种是通过设置断点 或在程序运行过程中单击 中断 按钮人为进入中断模式 退出中断模式 单击 继续 按钮 继续运行程序 单击 重新设置 按钮 终止程序的运行 8 6 1错误类型 编程时 可能产生的错误有4种 语法错误编译错误运行错误逻辑错误 1 语法错误 指输入代码时产生的不符合程序设计语言语法要求的错误 查错和纠错如果在输入程序时发生了此类错误 编辑器会随时指出 并将出现错误的语句用红色显示 编程者只要根据给出的出错信息 就可以及时改正错误 2 编译错误 指在程序编译过程中发现的错误 查错和纠错对于这类错误编译器往往会在程序运行初期的编译阶段发现并指出 并将出错的行用高亮显示 同时停止编译并进入中断状态 3 运行错误 指在程序运行中发现的错误 查错和纠错在程序运行过程中由计算机识别出来 给出有关错误的提示信息 并进入中断状态 4 逻辑错误 不能由计算机自动识别 且由其它原因产生的错误 查错和纠错由编程者认真阅读分析程序 跟踪变量和表达式的变化情况 自己找出错误 为在程序运行过程中观察和跟踪变量及表达式的变化情况 以便查找和修改程序中的逻辑错误 VBE提供了几个调试窗口 1 立即窗口给变量临时赋值或做输出用 2 本地窗口在中断模式下可显示当前过程中所有变量的类型和值 3 监视窗口可显示给定表达式的值 8 6 2设置断点 在程序中人为设置断点 当程序运行到设置了断点的语句时 会自动暂停运行并进入中断状态 设置断点的方法是 在代码窗口中单击要设置断点的那一行语句左侧的灰色边界标识条 再次单击边界标识条可取消断点 8 6 3单步跟踪 也可以单步跟踪程序的运行 即每执行一条语句后都自动进入中断状态 单步跟踪程序的方法是 将光标置于要执行的过程内 单击 调试 工具栏的 逐语句 按钮 或选择 调试 逐语句 命令 8 6 4设置监视点 即设置监视表达式 一旦监视表达式的值为真或改变 程序也会自动进入中断模式 设置监视点的方法如下 1 选择 调试 添加监视 命令 弹出 添加监视 对话框 2 在 模块 下拉列表框中选择被监视过程所在的模块 在 过程 下拉列表框中选择要监视的过程 在 表达式 文本框中输入要监视的表达式 3 最后在 监视类型 栏中选择监视类型 8 7VBA的数据库编程 8 7 1数据访问接口ADO8 7 2ADO的主要对象8 7 3使用记录集中的数据 8 7 1数据访问接口ADO ADO ActiveXDataObject 即ActiveX数据访问对象 是Microsoft公司在OLE DB之上提出的一种新的逻辑接口 以便编程者通过OLE DB更简单地以编程方式访问各种各样的数据源 OLE DB是以ActiveX技术为基础的数据访问技术 其目的是提供一种能够访问多种数据源类型的通用数据访问技术 1 什么是ADO 和其他接口相比 ADO具有下面一些优点 1 ADO将访问数据源的过程抽象成几个容易理解的具体操作 并由实际的对象来完成 因而使用起来简单方便 2 由于采用了ActiveX技术 与具体的编程语言无关 所以可应用在VisualBasic C Java等各种程序设计语言中 3 ADO能够访问各种支持OLE DB的数据源 包括数据库和其他文件 电子邮件等数据源 4 ADO既可以被应用于网络环境 也可以被应用于桌面应用程序中 ADO访问数据源的具体过程如下 1 建立与数据源的连接 2 指定访问数据源的命令 并向数据源发出命令 3 从数据源以行的形式获取数据 并将数据暂存在内存的缓存中 4 如果需要可对获取的数据进行查询 更新 插入 删除等操作 5 如果对数据源进行了修改 将更新后的数据发回数据源 6 断开与数据源的连接 实际使用时 上面过程中的各个步骤分别由ADO的具体对象完成 要使用ADO对象 先要引用ADO类库 2 在VBA中引用ADO类库 在VBA中引用ADO类库 1 在VBE环境下选择 工具 引用 命令 弹出 引用 对话框 2 在 可使用的引用 列表框中选中 MicrosoftActiveXDataObjects2 5 复选框 8 7 2ADO的主要对象 ADO共有9个对象和4个对象集合 ADO的对象模型采用分层结构 经常被使用的是3个处在最上层的对象 分别是 Connection对象Command对象Recordset对象 Connection对象用于建立与数据源的连接 1 Connection对象 使用过程 1 定义一个ADO的Connection对象 例如DimMyCnnAsADODB ConnectionSetMyCnn NewADODB Connection 声明了一个对象变量MyCnn 然后用Set命令将其初始化为ADO的Connection对象 2 指定OLE DB数据提供者的名称和有关的连接信息 例如MyCnn Provider Microsoft Jet OLEDB 4 0 MyCnn ConnectionString DataSource D 教学管理 mdb 3 最后调用MyCnn对象的Open方法打开连接 例如MyCnn Open 用Provider属性设置Connection对象的OLE DB数据提供者的名称 用ConnectionString属性指示用于建立到数据源的连接信息 下面是用Connection对象显式建立与Access数据库 教学管理 的连接的完整程序 PublicSubCnnToDB 1 定义Connection对象DimMyCnnAsADODB Connection 初始化SetMyCnn NewADODB Connection 指定数据提供者的名称MyCnn Provider Microsoft Jet OLEDB 4 0 指定数据源MyCnn ConnectionString DataSource D 教学管理 mdb 打开连接MyCnn OpenEndSub 用来定义并执行针对数据源运行的具体命令 如SQL查询 并通过Recordset对象返回一个满足有关条件的记录集 2 Command对象 1 创建一个Command对象的实例 例如DimMyCmdAsADODB CommandSetMyCmd NewADODB Command 2 使已经打开的连接与Command对象相关联 例如MyCmd ActiveConnection MyCnn 3 定义命令 如SQL语句 的可执行文本 例如MyCmd CommandText Select From课程 4 执行命令并返回记录集 例如MyCmd Execute Recordset是最常用的ADO对象 从数据源获取的数据就存放在Recordset对象中 并且所有Recordset对象均由记录 行 和字段 列 组成 可以使用Recordset对象的方法和属性定位到数据的各行 查看行中的值或者操纵记录集中的数据 3 Recordset对象 定义并初始化一个Recordset对象 DimMyRSAsADODB RecordsetSetMyRS NewADODB Recordset 有多种获取记录集的方法 1 接收Command对象的返回记录集 SetMyRS MyCmd Execute 调用Command对象的Execute方法执行命令后 可将返回的记录集指定给一个Recordset对象 下面程序实现了创建连接 定义命令和获取数据的全部过程 PublicSubCnnToDB 2 DimMyCnnAsADODB ConnectionSetMyCnn NewADODB ConnectionDimMyCmdAsADODB CommandSetMyCmd NewADODB CommandDimMyRSAsADODB RecordsetSetMyRS NewADODB RecordsetMyCnn Provider Microsoft Jet OLEDB 4 0 MyCnn ConnectionString DataSource D 教学管理 mdb MyCnn OpenMyCmd ActiveConnection MyCnnMyCmd CommandText Select From课程 SetMyRS MyCmd ExecuteStop 断点 以便观察得到的数据MyCnn CloseEndSub 2 使用Recordset对象的Open方法打开Recordset对象 此方法的语法格式如下 recordset OpenSource ActiveConnection CursorType LockType OptionsSource可以是SQL命令 Command对象 表名等 ActiveConnection指定所用的连接 可以是Connection对象 Cu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论