




已阅读5页,还剩114页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块与vba程序设计,模块和过程的创建,模块是access数据库7个对象之一,其实质就是没有界面的vba程序。模块具有很强的通用性,窗体、报表等对象都可以调用模块内部的过程。 模块基本上是由声明、语句和过程组成的集合,它们作为一个已命名的单元存储在一起,对vba代码进行组织。 access 有两种类型的模块:标准模块和类模块。,模块和过程的创建,类模块 包括窗体模块(模块中包含在指定的窗体或其控件上事件发生时触发的事件过程的代码。)和报表模块(模块中包含由在指定报表或其控件上发生的事件触发的事件过程的代码。) ,它们各自与某一特定窗体或报表相关联。 类模块可以调用标准模块中定义好的过程 作用范围限于所属窗体或报表内部,生命期也随窗体或报表的打开而开始、关闭而结束,模块和过程的创建,标准模块 标准模块包含的是通用过程和常用过程,这些通用过程不与任何对象相关联,常用过程可以在数据库中的任何位置运行。类模块可以调用标准模块中定义好的过程 标准模块中的公共变量和公共过程具有全局特性,作用范围在整个应用程序,生命期伴着应用程序运行而开始、关闭而结束,模块和过程的创建,模块的基本组成单元过程 sub子过程 可执行一系列操作,无返回值 可在该子过程之外用call显示调用 调用call mysub(参数1,参数2,) function函数 执行一系列操作,返回执行结果 返回值直接利用函数名调用获得 调用x=myfuntion(参数),sub mysub(参数1,参数2,) 变量声明部分 操作语句部分 end sub,function myfunction(参数) 变量声明部分 操作语句部分 end function,模块和过程的创建,模块的创建 创建一个名为“模块入门”的新模块,模块和过程的创建,过程的创建 在“模块入门”模块中创建一个hello过程,vba编程环境:vbe界面,工程窗口,属性窗口,代码窗口,立即窗口,对象选定器,过程选定器,vba编程环境:vbe界面,access视图,运行子过程/用户窗体,中断,重新设定,工程管理器,插入模块,属性窗口,对象浏览器,显示出对象库以及工程里过程中的可用类、属性、方法、事件及常数变量。可以用它来搜索及使用既有的对象,或是来源于其他应用程序的对象。,vba程序设计,一门程序设计语言应该怎么学? 掌握语言的基本用途 掌握语言的基本构成 掌握语言的基本书写规范 掌握语言的数据类型、运算符、常用函数、基本语句结构、调用关系。 利用上述元素编写程序代码,逐步深化,面向对象编程基本概念,一、对象与类 对象:对象是基本的运行时的实体,如窗体、报表、各种控件等,包括作用于对象的操作(方法)和对象的响应(事件)。将数据和处理这些数据的过程封装在一起。 类:一个抽象的整体概念 ,对象是类的实例化。 类与对象是面向对象程序设计语言的基础。 例:“学生”类,“张三” 对象,面向对象编程基本概念,二、属 性(property) 对象中的数据,所有对象都有自己的属性。用来描述和反映对象特征的参数。如:控件名称(name)、标题(caption)、颜色(color)、字体(fontname)等属性决定了对象展现给用户的界面具有什么样的外观及功能。 对象属性设置的方法: 在设计模式下,通过属性窗口直接设置对象的属性。 在程序的代码中通过赋值实现,其格式为:对象.属性=属性值 例: label10.caption=“显示”,面向对象编程基本概念,在vba中引用access对象: 基本语法: forms(或reports)!窗体(或报表)名称!控件名称.属性名 注意要点 如果在通用模块或在一类模块中引用另一类模块的控件时,应该使用上述完整语法。 如果在类模块中引用自己窗体上的控件,仅采用下面语法: 控件名称.属性名,例如:在窗体form1中引用form2上的label1控件 forms!form2!label1.caption=“教师信息表” 在引用form2上引用自己的label1控件 label1.caption=“教师信息表,基本控件常用属性,面向对象编程基本概念,三、事件(event)及事件过程(event procedure) 事件:可被对象识别的动作。如:窗体打开onopen,按钮的单击onclick,双击ondbclick等 事件过程:是指附在该对象上的程序代码,是事件触发后处理的程序。事件过程的形式如下: sub 对象名_事件过程名(参数列表) (事件过程代码) end sub,例如: sub cmdok_click() cmdok.fontsize=20 设置命令按钮的字体大小为20 end sub,面向对象编程基本概念,四、方 法(method) 方法:在对象上可操作的过程,是vb系统提供的一种特殊的过程和函数 方法是面向对象的,所以方法调用一般要指明对象。 对象方法调用形式: 对象.方法 参数列表 ,例如: debug.print “欢迎您使用access “ 在立即窗口中打印出文字,vba数据类型、常量、变量,本节内容及要求 1.熟悉vb程序中代码和语句书写规则 2.掌握vb的数据类型 3.掌握vb的运算符和表达式的使用 4.掌握常用内部函数的使用,vba数据类型、常量、变量,编码规则 1.vba代码中不区分字母的大小写。 2.一条语句写完后不需加任何结束符。 3.同行上可以书写多条语句,语句间要用冒号“:”分隔。 4.若一个语句行不能写下全部语句时,可以换行。换行时需在本行后加入续行符,1个空格加下划线“_”。 5.一行最多允许255个字符。 6.注释以rem开头,也可以使用单引号“”,注释内容可直接出现在语句的后面。 7.在程序转向时需用到标号,标号是以字母开始而以冒号结束的字符串。 8.函数和方法后应加上括号()。,vba数据类型、常量、变量,编码规则举例 label10与label10相同 x=y+z:y=z+x:z=y+x 在同一行书写了三个语句 myvar = “这是一个 “ _ & “例子说明如何 “ _ & “续行代码“ 空白加下划线 ( _) 可接续两行以上的代码。 this is a comment. () 引导注释文本 rem this is a comment rem引导注释文本 if number = 1 then goto line1 else goto line2 end if line1:标号1 mystring = “数值等于1“ line2:标号2 mystring = “数值等于2“,vba数据类型、常量、变量,数据类型标准数据类型,vba数据类型、常量、变量,在access中,有4种不同的编辑环境需要用户指定数据类型表设计视图、查询参数、vba代码、sql查询视图。其数据类型与vba数据类型对比,如右图所示。,数据类型的对比,vba数据类型、常量、变量,数据类型之间的转换 在进行vba编程过程中,用户可以将一种数据类型的数据转换成另一种特定类型的数据。,vba数据类型、常量、变量,数据类型自定义类型 在模块级别中使用,用于定义包含一个或多个元素的用户自定义的数据类型。,基本语法: private | public type 类型名 元素名 as 数据类型 元素名 as 数据类型 end type,例:定义学生类型数据 public type students name as string*8 age as integer end type,声明变量: dim student as students 引用数据: student.name=”张三” student.age=15,vba数据类型、常量、变量,标准数据类型要点 boolean 数据类型:值只能是 true 或是 false。当转换其他的数值类型为 boolean 值时,0 会转成 false,而其他的值则变成 true。当转换 boolean 值为其他的数据类型时,false 成为 0,而 true 成为 -1。 date 数据类型:日期须以数字符号 (#) 扩起来,例如,#2008-3-23# object 数据类型:利用 set 语句,声明为 object 的变量可以赋值为任何对象的引用。 variant 数据类型:所有没被显式声明(用如dim、private、public或static等语句)为其他类型变量的数据类型。,vba数据类型、常量、变量,variant 数据类型 variant 是一种特殊的数据类型,除了定长 string 数据及用户定义类型外,可以包含任何种类的数据,以及empty、error、nothing 及 null等特殊值。可以用 vartype 函数(变量类型)或 typename(类型名)函数来检查 variant 中的数据实际类型。,vba数据类型、常量、变量,标识符 程序中常量、变量、过程等对象的名字,vba标识符规定: 第一个字符必须是字母 包含的字符数不超过255个 不得与vba的关键字同名,如不能使用sub、for等 不能使用下列字符:! & $ # (空格) 从增强程序可读性角度出发,标识符应使人望文生义,了解其代表的内涵。,vba数据类型、常量、变量,常 量 在程序运行过程中,其值不能被改变的量称为常量。vba中有三类常量: 普通常量、符号常量 、系统常量 普通常量 整型常量:10、110%(integer)、23&(long) 实型常量:0.123!(single)、-1.123#、1.25e+3、-1.25e-3 字符串常量:“abd”、“xyz、”大家好” 逻辑常量:ture、false 日期常量:#2002-5-4 14:30:00 pm#、#09/02/99#,vba数据类型、常量、变量,符号常量 在程序中,某个常量多次被使用,则可以使用一个符号来代替该常量,这样不仅在书写上方便,而且有效地改进了程序的可读性和可维护性。 关键字const 声明符号常量,基本语法如下 const 常量名 as 类型 | 类型符号=常数表达式,例如: const pi#=3.1415926535 等价于: const pi as double=3.1415926535,vba数据类型、常量、变量,系统常量 vba系统提供了应用程序和控件的系统定义常数。它们存放于系统的对象库中,在“对象浏览器”中能查看这些常数。,颜色常数 常数 值 描述 vbblack 0x0 黑色 vbred 0xff 红色 vbgreen 0xff00 绿色 vbyellow 0xffff 黄色 vbblue 0xff0000 蓝色 vbmagenta 0xff00ff 紫红色 vbcyan 0xffff00 青色 vbwhite 0xffffff 白色,星期常数 常数 值 描述 vbusesystem 0 vbsunday 1 星期日 vbmonday 2 星期一 vbtuesday 3 星期二 vbwednesday 4 星期三 vbthursday 5 星期四 vbfriday 6 星期五 vbsaturday 7 星期六,vba数据类型、常量、变量,变 量 程序中的变量为临时存在单元,可存放文字、数值、日期和对象属性。每个变量都有一个名字,程序通过变量名对变量进行存取操作。 用dim语句显式声明变量 1、dim 变量名 as 类型 或 dim 变量名类型符 2、声明的每个变量都要一个单独的 as 类型 子句,没有的作为变体类型( variant ),例1:dim icount as integer , sum as single 等价于:dim icount%, sum! 例2:dim icount as integer , sum 则声明了两个变量,其中icount为整型,sum为变体型,vba数据类型、常量、变量,隐式声明变量 vba允许用户在编写应用程序时,不声明变量而直接使用,系统临时为新变量分配存储空间并使用,这就是隐式声明。所有隐式声明的变量都是variant数据类型。vba根据程序中赋予变量的值来自动调整变量的类型。,例如:变量a, b, sum都没有事先定义。 private sub form_click() sum = 0 a = 10: b = 20 sum = a + b debug.print “sum=“& sum end sub,vba数据类型、常量、变量,强制显式声明变量option explicit 良好的编程习惯都应该是“先声明变量,后使用变量”,这样做可以提高程序的效率,同时也使程序易于调试。vba中可以强制显式声明,在窗体模块、标准模块和类模块的通用声明段中加入:option explicit,vba数据类型、常量、变量,变量的作用域和生命周期 vba中,变量定义的位置和方式不同,则变量存在的时间和起作用的范围也有所不同,即变量的作用域与生命期。 变量的可见性:即可对变量进行操作的状态。 变量作用域的三个层次:局部范围(过程级别)、模块范围、全局范围,vba数据类型、常量、变量,局部范围(过程级别):定义在模块的过程内部,只有在声明此变量的过程中才可使用 定义方式:dim x as singl static y as single 用dim 定义的局部变量只有在它所在的过程运行时才会有值 static定义的局部变量在整个程序运行期间均有值,所以它可以作为中间变量保存结果。 模块范围(private ):定义在模块的所有过程外部的起始位置,运行时在模块所包含的所有子过程和函数中可见。 全局范围(public):定义在模块的所有过程外部的起始位置,运行时在所有类模块和标准模块的所包含的所有子过程和函数过程中都见。一般函数默认为public,变量的作用域和生命周期举例,x全局变量 y过程变量 z过程静态变量,数 组,数组并不是一种数据类型,而是一组相同类型数据的集合。用一个统一的名字(数组名)代表逻辑上相关的一批数据,每个元素用下标变量来区分;下标变量代表元素在数组中的位置。 一维数组(线状) public/private/static/dim 数组名 (下界 to 上界) as 数据类型 下界和上界不能使用变量,必须是常量,一般是整型常量。,例如: dim workers(8) as integer 未定义下界,下届默认为0,有08共9个元素 dim workers(1 to 8) as integer 下届为1,上届为8,有18共8个元素,数组的引用 数组必须先定义后使用 使用形式:数组名(下标) 下标可以是整型变量、常量或表达式。 引用不能下标越界,通常可以通过一个for循环处理数组 dim numbers(1 to 10) as integer dim i as integer for i=1 to 10 numbers(i)=30 next i 如果i=11怎么办?,二维数组(表的形式)和多维数组 dim 数组名(下界 to 上界,下界 to 上界,) as 数据类型 dim aa(19,19) as integer 等价于 dim aa(1 to 20,1 to 20) as integer,下面将值30赋给数组: dim i as integer,j as integer dim aa(9,9) as integer for i=0 to 9 for j=0 to 9 aa(i,j)=30 next j next i,动态数组 如果在程序运行之前不能肯定数组的大小,可以使用动态数组。 申明方法:dim 数组名()as 数据类型 过程中用redim语句改变数组的大小 redim preserve 数组名(下标1,下标2) redim语句是一个可执行语句,只能出现在过程中,并且可以多次使用,改变数组的维数和大小。 每次使用redim语句都会使原来数组中值丢失。 可以在redim后加preserve 参数来保留数组中的数据。但此时 只能改变最后一维的大小。,例1:利用redim改变数据维数和大小。 sub arraychange() dim x( ) as integer redim x(20) x(20) = 30 debug.print x(20) redim x(20, 5) x(20, 5) = 10 debug.print x(20, 5) end sub,例2:利用preserver保留数组中的值。 sub arraychange() dim x( ) as integer redim x(20) x(20) = 30 debug.print x(20) redim preserve x(30) debug.print x(20) end sub,运算符,1. 算术运算符(均是双目运算,ia=3),例如: 5+10 mod 10 9 / 3 +2 2 结果是?,2. 字符串运算符 字符串运算符有:、+(连接两字符串) 区别 +(连接运算):两个操作数均应为字符串类型; &(连接运算):两个操作数既可为字符型也可为数值型,当是数值型时,系统自动先将其转换为数字字符,然后进行连接操作。,例: “100“ + “123“ 结果为 100123 “abc“ + 123 出错 “100“ & 123 结果为 100123 100 & 123 结果为 100123 “abc“ & 123 结果为 abc123,3.关系运算符,4.逻辑运算符 非not、与and 、或or、异或xor、逻辑相等(同或)eqv 、 隐含(逐位比较)imp not逻辑非为单目运算符(要求一个操作数),其它为双目运算符。,0:false,1:true,5.运算符的执行顺序 表达式中的多种不同类型的运算符的优先级如下: 算术运算符=字符运算符关系运算符逻辑运算 基本说明: 当一个表达式中出现多种运算符时,首先进行算术运算符,接着处理字符串连接运算符,然后处理比较运算符,最后处理逻辑运算符,在各类运算中再按照相应的优先次序进行。 可以用括号改变优先顺序,强令表达式的某些部分优先运行。括号内的运算总是优先于括号外的运算。对于多重括号,总是由内到外。,常用函数,vba中提供了各种函数,利用函数可以完成许多相关的操作。其使用形式如下: 函数名(参数列表),要点说明 1.在三角函数中的自变量是以弧度为单位。 如:sin300 sin(3.14159/180*30) 2.取整函数int()和fix() fix(n)为截断取整,即去掉小数后的数:fix(9.59)=9 int(n)不大于n的最大整数:int(9.59)=9、int(-9.59)=-10,要点说明 3. rnd函数返回01(包括0和不包括1)之间的双精度随机数。例:产生1-100的随机整数:int(rnd *100)+1 怎样产生n,m区间的随机数?int(n+(m-n+1)*rnd) 例 int(100+201*rnd) 随机数100,300 4.类型转换函数 asc(“abcd”) 值为65 只取首字母的ascii值 val(“abc123“) 值为0, val(“1.2sa10“) 值为1.2 注意: val( )函数只将最前面的数字字符转换为数值。,5.日期函数 date():返回系统日期,如 2008-03-25 time():返回系统时间,如 19:30:25 now():返回系统日期和时间:2008-03-25 19:30:25 weekday(时间,w):返回17的整数,表示星期几。 其中可选参数w是指定一星期的第一天是星期几的常数。 例:weekday(#2004-2-29#)=1 即2004-2-29为星期天 若 weekday(#2004-2-29#,3)=6 即让星期二为第一天 dateadd()、datediff()相关参数,三种基本结构程序设计,传统流程图中的基本符号,三种基本结构,三种基本结构,选择结构,1. ifthen语句(单分支结构) if then 语句块 end if 或 if then ,例:已知两个数x和y,比较它们的大小,使得x大于y. if xy then t=x : x=y: y=t end if 或 if xy then t=x: x=y: y=t,2. ifthenelse语句(双分支结构) if then else end if if then else ,例:输出x,y两个中值较大的一个值。 if xy then print x else print y end if 单行形式:if xy then print x else print y,2. ifthenelse语句(双分支结构) if then else end if if then else ,例:输出x,y两个中值较大的一个值。 if xy then print x else print y end if 单行形式:if xy then print x else print y,3. ifthenelseif语句(多分支结构) 形式: if then else if then else if then else 语句块 n+1 end if,if x=90 then print “优秀“ elseif x=80 then print “良好“ elseif x=70 then print “中等“ elseif x=60 then print “及格“ else print “不及格“ end if,例:输入一学生成绩,评定其等级。方法是:90100分为“优秀”,8089分为“良好”,7079分为“中等”,6069分为“及格”,60分以为“不合格”,select case语句(情况语句),select case 变量或表达式 case 表达式列表1 语句块1 case 表达式列表2 语句块2 case else 语句块n+1 end select,:与同类型的下面四种形式之一: 表达式 a +5 一组枚举表达式(用逗号分隔) 2, 4, 6, 8 表达式1 to 表达式2 60 to 100 is 关系运算符表达式 is 60,数值型或字符串表达式,select case x case 90 to 100 print “优秀“ case 80 to 89 print “良好“ case 70 to 79 print “中等“ case 60 to 69 print “及格“ case else print “不及格“ end select,例:使用select case语句来实现成绩等级评选,程序段如下,选择结构的嵌套 在if语句的then分支和else分支中可以完整地嵌套另一if语句或select case语句,同样select case语句每一个case分支中都可嵌套另一if语句或另一select case语句。下面是两种正确的嵌套形式:,(1)if then if then else end if . else . if then else end if end if,(2)if then select case case if then else end if case. end select . end if,vba的三个选择函数 iif函数: iif(条件式、表达示1,表达示2) 条件为真,返回表达式1的值;为假,返回表达示2的值 如:iif(ab,a,b) 返回a,b中较大的值 switch函数 switch(条件式1,表达式1条件式2,表达式2) 条件式与表达式成对出现,如条件式为真,则返回对应表达式的值 y=switch(x0,1,x=0,0,x0,1) 根据x的值来为y赋值。 choose函数 choose(索引式,选项1,选项2,选项n) 根据索引式的值返回选项列表中的某个值 y=choose(x,1,m,7,n) 根据x的值来为y赋值。,循环结构 doloop:通过do来执行循环,有四种形式。其中while是条件为真时循环,until是条件为假时循环。,形式1、2(当型循环) : do while|until 语句块 exit do 语句块 loop,当型循环举例,sub command1.click() dim i as intger i=1 do while i=20 print i i=i+1 loop end sub,sub command1.click() dim i as intger i=1 do until i=20 print i i=i+1 loop end sub,结果i21,结果i=1,循环结构,形式3、4:(直到循环) do 语句块 exit do 语句块 loop while|until ,直到循环举例,sub command1.click() dim i as intger i=1 do print i i=i+1 loop while i=20 end sub,sub command1.click() dim i as intger i=1 do print i i=i+1 loop until i=20 end sub,结果i=21,结果i=2,whilewend语句循环结构,while wend,说明:该语句的功能与do while .loop实现的循环完全相同。,sub command1.click() dim i as intger i=1 while i=20 print i i=i+1 wend end sub,for循环语句 (一般用于循环次数已知),for 循环变量初值 to 终值 step 步长 语句块 exit for 语句块 next 循环变量,for循环语句 (一般用于循环次数已知),循环次数,例: for i=2 to 13 step 3 print i , next i print “i=“, i 循环次数?输出结果?,循环执行次数 输出i的值分别为: 2 5 8 11 出了循环输出为: i=14,循环的嵌套多重循环结构 如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定。以下是各种嵌套循环的示例:,(1)for i=. for j=. . next j next i,(2)for i=. do while/until . . loop next i,(3)do while. for j=. . next j loop,(4)do while/until. do while/until . . loop loop,对于循环的嵌套,要注意以下事项: (1) 内循环变量与外循环变量不能同名; (2) 外循环必须完全包含内循环,不能交叉; (3) 不能从循环体外转向循环体内,也不能从外循环转向内循环. 正 确 错 误,for ii =1 to 10 for ii=1 to 20 next ii next ii,其它语句,goto 语句 形式: goto 标号|行号 作用是无条件地转移到标号或行号指定的那行语句. 由于goto语句破坏了程序的逻辑顺序,一般不赞成使用,if number = 1 then goto line1 else goto line2 line1:标号1 mystring = “number equals 1“ line2:标号2 mystring = “number equals 2“,1.exit 语句 exit 语句用于退出 do.loop、for.next、function或sub代码块。 对应的使用格式为:exit do、exit for、exit function、exit sub。分别表示退出do循环、for循环、函数过程、子过程。,例如: 下面的例子是使用 exit 语句退出 for.next 循环、do.loop 循环及子过程。,private sub form_click() dim i%, num% do 建立无穷循环。 for i = 1 to 100 循环 100 次。 num = int(rnd * 100) 生成一个099的随机数。 select case num case 10: exit for 退出 for.next 循环。 case 50: exit do 退出 do.loop 循环。 case 64: exit sub 退出子过程。 end select next i loop end sub,2.with.end with 语句 with 对象名 语句块 end with 说明:with 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。,例如,要改变一个对象的多个属性,可以在 with 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 with 语句来给同一个对象的几个属性赋值。,需要对同一对象设置几个属性。途径之一是使用多条语句。 private sub form_load() command1.caption = “退出(e&xit)“ command1.top = 500 command1.left = 4500 command1.enabled = true end sub 使用with.end with 语句,上面程序的代码如下。 private sub form_load() with command1 .caption = “ok“ .top = 500 .left = 4500 .enabled = true end with end sub,vba中的常用操作,1.消息窗msgbox 消息窗用于显示消息,等待用户单击按钮,并返回一个整型值。基本格式: msgbox (提示,按钮图标 +缺省按钮+ 模式,标题),10.10 vba中的常用操作,根据用户所选按钮,函数返回1到7的整数值,其含义如下,2.输入框inputbox 提示并获取用户输入的值。基本格式: 变量名=inputbox$(, ),注意:输入区缺省值有$返回字符类型,否则为数值类型. 提示文本如需换行,则用 chr(13) + chr(10) 将各行分开。,返回字符类型举例:有下列语句如下: dim strname as string( 40), strs1 as string(40) strs1 = “请输入你的姓名” + chr(13) + chr(10) + “然后单击确定” strname= inputbox$(strs1, “输入框”, , 100,100) 当键盘输入“王晓明” 后,变量strname获得键盘输入的值.,1. docmd对象 vba中可以通过调用docmd对象的方法来实现对access的各种操作。,打开各种access对象示例,关闭access中的对象 docmd.close objecttype, objectname, save objecttype 下列固有常量之一:,acdefault(默认值) acdiagram 图 acform 窗体 acmacro 宏 acdataaccesspage 数据访问页,acmodule 模块 acquery 查询 acreport 报表 actable 表,关闭各种access对象示例,2. 计时事件timer vba可通过设置窗体的“计时器间隔(timerinterval)”属性与添加“计时器触发器(timer)”事件来完成“定时”功能。 基本处理过程:timer事件每隔timerinterval时间间隔被激发一次,然后运行timer事件过程来响应。,private sub form_timer() labeltime.caption = cstr(now() end sub,3. 运行错误处理 程序中一定要合理的设置错误处理,以便处理程序在不可预知的情况下发生错误。如果仅由操作系统来处理这些错误,不仅会让用户不知所措,还会造成灾难性的后果。vba中提供了以下语句来处理程序运行时的错误: on error goto 标号:发生错误时转移到标号处进行处理 on error resume next:忽略的发生错误,执行下面语句 on error goto 0:关闭出错处理,过程调用与参数传递,sub子过程 在vba中,的sub子过程分为:事件过程和通用过程 1.事件过程,(2)控件事件的语法 private sub 控件名_事件名(参数列表) 语句组 end sub,(1)窗体事件的语法 private sub form_事件名(参数列表) 语句组 end sub,2.通用过程,子过程的定义形式如下: public|privatestatic sub 子过程名(形参表) 语句组 exit sub 语句组 end sub,说明: (1)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。,(2)形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。 (3)过程可以无形式参数,但括号不能省。 (4)参数的定义形式: byvalbyref变量名( )as 类型,, byval表示当该过程被调用时,参数是按值传递的; byref(缺省)表示当该过程被调用时,参数是按地址传递的。,例. 一个交换两个整型变量值的子过程。 private sub swap( x as integer, y as integer) dim temp as integer temp=x : x=y : y=temp end sub,function过程,public|privatestaticfunction 函数名()as 函数体函数名=返回值 exit function 函数名=返回值 end function,注意:在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。,过程的调用,1 子过程的调用 子过程名 参数列表 或 call 子过程名(参数列表) 2 函数过程的调用 变量名 = 函数过程名(参数列表),说明: (1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。,(2)调用时把实参值传递给对应的形参。其中值传递时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。 (3)当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。 (4)调用子过程的形式有两种,用call关键字时,实参必须加圆括号括起,反之则实参之间用“,”分隔。,例:调用上面定义的sawp子过程的形式: swap a,b call swap(a,b),private sub cmdok() call swap(a,b) swap a,b end sub,private sub swap(x%,y%) dim temp% temp=x x=y y=temp end sub,过程调用的执行过程:,过程之间参数的传递,1、形式参数 是指在定义通用过程时,出现在sub或function语句中的变量名后面园括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。,2、实际参数 实际参数是指在调用sub或function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给sub或function过程与其对应的形参变量。 实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如a())组成,实参表中各参数用逗号分隔。,3、参数传递(虚实结合) 参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“byval”关键字的是按值传递,缺省或加“byref”关键字的为按地址传递。,传址与传值 传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值:形参得到的是实参的值,形参值的改变不会影响实参的值。,sub swap2(x%, y%) dim temp% temp = x: x = y: y = temp end sub,sub swap1(byval x%, byval y%) dim temp% temp = x: x = y: y = temp end sub,例:,private sub cmdok_click() a% = 10: b% = 20: swap1 a, b 传 值 print “a1=“& a &“b1=“&b a = 10: b = 20: swap2 a, b 传地址 print “a2=“& a& “b2=“& b end sub,值传递的执行过程如下图:,地址传递数据的执行过程,vba数据库编程,vba通过数据库引擎(microsof jet)工具完成对数据库的访问,所谓数据库引擎其实是一组动态连接库(dll),程序运行时被连接到vba程序程序而实现对数据库的访问功能。vba中提供了3种数据库访问接口。 odbc api:开放数据库互连应用编程接口。 dao:数据访问对象。 ado:active数据对象,vba访问的三种数据库类型: 本地数据库:access 外部数据库 odbc数据库:如oracle、sybase、sql server等,dao数据对象模型模型,dbengine数据库引擎为dao模型最上层对象,包含并管理其它对象。,ado数据对象模型模型(与语言无关),指定数据连接提供者,建立到数据源的连接。,可执行一个命令,如可执行sql查询。一般用于表结构的修改。,可执行sql查询返回一个记录集,并可对记录集进行修改、插入、删除操作。是ado中最灵活的对象。,例:分别用dao和ado来完成对“教学管理.mdb”文件中“学生表”的学生年龄都加1的操作。(假设文件存放在e盘“考试中心”文件夹中),使用dao技术: sub setageplus1() dim we as dao.workspace 工作区对象 dim db as dao.database 数据库对象 dim rs as dao.recordset 记录集对象 dim fd as dao.field 字段对象 set ws=dbengine.workspace(0) set db=ws.opendatabase(“e:考试中心教程教学管理.mdb”) 打开数据库 set rs=db.openrecordset(“学生表”) 返回“学生表”记录集 set fd=rs.fields(“年龄”) 设置“年龄”字段,对记录集用循环结构进行遍历 do while not rs.eof rs.edit 设置为“编辑”状态 fd=fd+1 “年龄”加1 rs.update 更新记录,保存年龄值 rs.movenext 记录指针移动至下一条 loop 关闭并回收对象变量 rs.close db.close set rs=nothing set db=nothing end sub,使用ado技术: sub setageplus1() dim cn as new adodb.connection 连接对象 dim rs as new adodb.recordset 记录集对象 dim fs as adodb.field 字段对象 dim strconnect as string 连接字符串 dim strsql as string 查询字符串 strconnect=“e:考试中心教程教学管理.mdb”) 设置连接数据库 cn.provider=“microsoft.jet.oledb.4.0” 设置数据提供者 cn.open strconnect 打开与数据源的连接 strsql=“select 年龄 from 学生表” 设置查询语句 rs.open strsql,cn,adopendynamic,adlockoptimistic,adcmdtext set fd=rs.fields(“年龄”),对记录集用循环结构进行遍历 do while not rs.eof fd=fd+1 “年龄”加1 rs.update 更新记录,保存年龄值 rs.movenext 记录指针移动至下一条 loop 关闭并回收对象变量 rs.close db.close set rs=nothing set db=nothing end sub,ado数据对象模型的相关要点,recordset对象的locytype属性决定数据的锁定方式 adlockreadonly:数据处于只读状态。 adlockpessimistic(保守式锁定):编辑数据时即锁定数据源记录,直到数据编辑完成才释放。 adlo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 在线叉车考试试题及答案
- 会计机考试题及答案
- aopa考试题及答案
- c1科一考试题及答案
- 医美培训试题及答案
- 法学通论考试题及答案
- 专职队员招聘考试试题及答案
- 2025年分子科学与工程专业毕业设计开题报告
- 2025年材料科学与工程专业毕业设计开题报告
- 2025年浙江社工招聘考试题库
- 国企党委关于2025年主题教育自查评估总结报告
- 2025江苏南京六合龙袍新城建设发展有限公司招聘18人笔试历年参考题库附带答案详解
- 损失赔偿管理办法
- 2024年湖南省桑植县事业单位公开招聘工作人员考试题含答案
- 打字员技能测试题库及答案
- 行政后勤管理培训课件
- 产科DIC诊断及处理
- 医院信息安全管理制度培训
- 2025-2030中国语言训练行业市场发展趋势与前景展望战略研究报告
- 医院治安培训课件
- 配网培训课件
评论
0/150
提交评论