资源描述
ACCESS实例教程,模块的操作(第8章),1 . 模块的基本概念 2 . VBA程序设计基础 3 . VBA函数的使用 4 . 模块的建立与使用 5 . 过程与参数传递,本章要点:,VBA(Visual Basic for Application)是Microsoft Office系列软件的内置编程语言; 其语法结构与Visual Basic编程语言互相兼容; VB是微软公司推出的可视化BASIC语言,是一种编程简单、功能强大的面向对象开发工具,我们可以像编写VB程序那样来编写VBA程序。 采用的是面向对象的编程机制和可视化的编程环境。 用VBA语言编写的代码,将保存在Access中的一个模块里,并通过类似在窗体中激发宏的操作那样来启动这个模块,从而实现相应的功能。,VBA简介,注意: VB语言开发系统是独立运行的开发环境,它创建的应用程序可以独立运行在Windows平台上; 而VBA则不同,其编程环境和VBA程序都必须依赖Office应用程序(如Access、Word、Excel等)。,VBA简介,VBA编程环境 在Access 2003提供的“模块”数据库对象中,使用VBA程序设计语言,在不同的模块中实现VBA代码设计,可以解决实际开发中的复杂应用。 要用Access 2003来完成一个实际的数据库应用系统,就应该掌握VBA。,8.1 认识模块对象,模块是由声明、语句和过程组成的集合,以VBA(Visual Basic for Application)语言编写,作为一个已命名的单元存储在一起。 模块有2种类型:类模块和标准模块。使用模块可以在实际开发中实现较为复杂的功能。,(1)模块:模块由一个或多个过程组成,每个过程实现一个或几个功能。模块的执行通过特定事件激发相应的事件过程实现。 (2)事件过程:事件过程是一组代码,用于响应窗体事件或报表事件。 (3)类模块:类模块是包含代码和数据的集合,可以看作是没有物理表示的控件,总是与某一特定的窗体或报表相关联。窗体模块和报表模块都属于类模块。 (4)标准模块:标准模块是代码的集合,包含的过程不与任何其他对象相关联,是数据库对象使用的公共过程,保存在数据库窗口中。,8.1.1 模块的基本概念,8.1.2 启动Access的编程界面,Access的编程界面称为VBE(Visual Basic Editor),是Microsoft Office所有组件公用的程序编辑系统。 方法1:在窗体或报表设计视图中选控件单击标准工具栏的“生成器”按钮在“选择生成器”对话框中选择“代码生成器”。 方法2:右击窗体或报表设计视图中控件快捷菜单中选“事件生成器”“选择生成器”对话框中选择代码生成器”。,8.1.3 VBE窗口 VBE窗口由工具栏、工程资源管理器窗口、 属性窗口、代码窗口和立即窗口组成。,工程窗口 选择对象,属性窗口 选择对象的属性,代码窗口,选择事件,(1)工程窗口 也称工程资源管理器 ,一个数据库应用系统就是一个工程,系统中的所有类模块及标准模块对象都在该窗口中显示出来。,类模块,标准模块,(2)属性窗口 属性窗口列出了选定对象的属性,可以在设计时查看、改变这些属性。当选取了多个控件时,属性窗口会列出所有控件的共同属性。,(3)代码窗口 代码窗口用来显示、编写以及修改VBA 代码。实际操作中,可以打开多个代码窗口,查看不同窗体或模块中的代码,代码窗口之间可以进行复制和粘贴。,对象框,过程框,编写模块对象的代码在代码窗口进行。 (1)窗口顶部有2个组合框,左边对象框显示所有对象名称,右边过程框显示当前对象能识别的所有事件名称。选定一个对象,再选定一个事件,系统会自动生成相应事件过程的起始行与结束行,只须在两行中间添加过程代码即可。 “通用” 过程可以被所有控件调用。某控件的过程只在关联事件中有效。 (2)窗口中央代码区有声明区和过程区,声明区中声明模块使用的变量,过程区显示一个或多个过程,之间用一条灰线分隔。 (3)窗口底部有2个按钮,单击“过程视图”按钮,只显示当前过程。单击右边“完整的模块视图”按钮,窗口显示全部过程。,8.1.4 标准工具栏,例8-1:创建一个类模块。 1、打开数据库; 2、新创建窗体名称为w1; 3、在窗体中添加命令按钮名字为c1; 4、选择c1打开属性【单击】打开【代码生成器】;,Private Sub Command0_Click() DoCmd.Close End Sub,DoCmd为对象用来调用内置的方法,Close关闭窗体,例8-1:创建一个类模块。,对象框,过程框,例8-2:创建一个标准模块。,1、打开数据库; 2、选择【模块】对象 单击【新建】按钮; 3、在VBE中编辑如下程序;,过程名为aa,x,y为整型变量,z为整型变量,存放x和y的乘积。 显示信息框,例8-2:创建一个标准模块。,4、保存模块名为mj; 5、新创建窗体名称为w2; 6、在窗体中添加两个文本框名称分别为t1,t2; 7、添加命令按钮名字为c1; 8、选择c1打开属性【单击】打开【代码生成器】;,调用过程aa,并将文本框的值传递给aa,8.1.7 使用提示与帮助,在代码窗口输入代码时,系统会自动显示提示信息,包括关键字列表、属性列表、过程参数列表等,在列表中选取一项后双击鼠标,所选值会自动添加到当前光标处。,8.2 VBA程序设计基础,8.2.1 面向对象的程序设计的基本概念,(1)对象 在自然界中,一个对象就是一个实体,如一辆汽车就是一个对象。在面向对象的程序设计中,对象代表应用程序中的元素,如表、窗体、按钮等。 (2)属性 属性是对象的特征。如汽车有颜色和型号属性,按钮有标题和名称属性。对象的类别不同,属性会有所不同。同类别对象的不同实例,属性也有差异。例如,同是命令按钮,名称属性不允许相同。,(3)事件 事件是对象能够识别的动作。如按钮可以识别单击事件、双击事件等。在类模块每一个过程的开始行,都显示对象名和事件名。如:Private Sub c1_Click()。 (4)方法 方法是对象能够执行的动作,决定了对象能完成什么事。不同对象有不同的方法。如close方法能关闭一个窗体。,(5)集合 集合由许多与对象有关的键和值组成,其中的键和值是配对的。如一本书是一个对象,书的页码是键,页码对应的内容是值。所有配对的页码和内容组成了书对象的集合。 (6)过程 过程是由代码组成的单元,包含一系列计算语句和执行语句。每一个过程都有名字,过程名不能与所在模块的模块名相同。过程有两种类型:sub过程(无返回值),function过程(有返回值)。,例8-3:创建一个类模块,动态设置控件属性,(1)在窗体ct中创建一个文本框名称为t1。 (2)在窗体ct中创建一个标签名称为b1标题为“欢迎你!”。 (3)在窗体ct中创建三个命令按钮名称分别为c1、c2、c3标题分别为“红色”、“绿色”、“蓝色”。,(4)设置各按钮的前景色,在属性窗口可查看颜色值。,(5)c1的click事件代码: t1.BackColor = 255 b1.ForeColor = 255,(6)c2的click事件代码: t1.BackColor = 33792 b1.ForeColor = 33792 (7)c3的click事件代码: t1.BackColor = 16711680 b1.ForeColor = 16711680,执行结果:,Docmd是Access的一个特殊对象,用来调用内置方法,在程序中实现对Access的操作,诸如打开窗口、关闭窗体、打开报表、关闭报表等。 DoCmd 对象的大多数方法都有参数,有些参数是必需的,有些则是可选的。若省略可选参数,参数将采用默认值。,8.2.2 Docmd对象,(1)用DoCmd 对象打开窗体 格式:DoCmd.OpenForm 窗体名 功能:用默认形式打开指定窗体。 例如:DoCmd.OpenForm 文本框练习,(2)用DoCmd 对象关闭窗体 格式1:DoCmd.Close acForm, 窗体名 功能:关闭指定窗体。 例如:DoCmd.Close acForm, 文本框练习 格式2:DoCmd.Close 功能:关闭当前窗体。 (3)用DoCmd 对象打开报表 格式:DoCmd.OpenReport 报表名,acViewPreview 功能:用预览形式打开指定报表。 例如:DoCmd.OpenReport 工资报表,acViewPreview,(4)用DoCmd 对象关闭报表 格式1:DoCmd.Close acReport, 报表名 功能:关闭指定报表。 例如:DoCmd.Close acReport, 工资报表 格式2:DoCmd.Close 功能:关闭当前报表。 (5)用DoCmd 对象运行宏 格式:DoCmd.RunMacro 宏名 功能:运行指定宏。 例如:DoCmd.RunMacro 宏1 (6)用DoCmd 对象退出Access。 格式:DoCmd.Quit 功能:关闭所有Access对象和Access本身。,(1)在窗体中建立5个按钮名称分别为c1、c2、c3、c4、c5标题分别为“打开文本框练习窗体”、“关闭文本框练习窗体”、“打开工资报表”、“关闭工资报表”、“退出Access” 。,例8-4:使用DoCmd对象,(2)c1代码:DoCmd.OpenForm 文本框练习 (3)c2代码:DoCmd.Close acForm, 文本框练习 (4)c3代码:DoCmd.OpenReport 工资报表, acViewPreview (5)c4代码:DoCmd.Close acReport, 工资报表 (6)c5代码:DoCmd.Quit,(7)转到窗体视图单击不同按钮执行不同操作。,8.2.3 数据类型与数据类型转换,VBA中的基本数据类型 VBA在数据类型和定义方式上均继承了传统的Basic语言的特点。 Access 数据表中的字段使用的数据(OLE对象和备注字段数据类型除外)在VBA中都有对应的类型。 在VBA中,数据类型用来决定变量可以保存何种数据。VBA支持多种数据类型,为用户编程提供了方便。,8.2.3 数据类型与数据类型转换,(1)标准数据类型,1.数值型数据类型 包括:Byte、Integer、Long、Single、Double和Currency。 (1)Byte 以一个字节的无符号二进制数存储,取值范围为0255。 (2)整数(integer和Long) 整数是不带小数点和指数符号的数,在机器内以二进制补码形式表示。 整型(Integer) 长整型(Long) 例如: 345、-345、345%均表示整型数。 345 Sum End Sub,良好的编程习惯应该是“先声明变量,后使用变量”,这样做可以提高程序的效率,同时也使程序易于调试。,声明而未赋值的变量的值为: 数值型变量初始化为0; 字符型变量为零长度字符串; 变体型变量初始化为 Empty。,变量的初始化,(5)一个特殊的模块变量 本地窗口打开时,自动生成一个名为“Me”的特殊模块变量。对于类模块,定义为Me。Me是对象的引用,引用当前模块中当前类的实例。 Me变量不需要专门定义,直接使用即可。 例如:用代码定义“学生信息”窗体中“Lab”标签的标题属性,以下两种方法效果是一样的: 标准方法:Forms! 学生信息!Lab.Caption=学生信息浏览 常用方法:Me!Lab.Caption=学生信息浏览,8.2.5 变量的作用域和生命周期,1变量的作用域 变量的作用域是变量在程序中起作用的范围。分3个层次,从低到高依次为:局部、模块、全局。 (1)局部变量 又称为本地变量,仅在声明变量的过程中有效。在过程和函数内部用dim声明或不用声明接使用的变量,都是局部变量。局部变量在本地拥有最高级,当存在同名的模块级变量时,模块级变量被屏蔽。 (2)模块变量 模块变量在所声明模块的所有函数和所有过程都有效,变量定义在模块所有过程之外的起始位置,通常是窗体变量或标准模块变量。 (3)全局变量 全局变量又称为公共变量,定义在标准模块所有过程之外,在所有模块的所有过程和函数中都有效。 定义格式:public 变量名 as 数据类型,变量的生命周期是指变量从首次出现到变量消失的代码执行时间。变量首次出现是指声明变量并为其分配存储空间,变量消失是指变量所在的程序执行完毕。 局部变量:的生命周期从过程或函数被调用到运行结束。 全局变量:的生命周期从声明到Access应用程序结束。 过程中用dim定义的变量,每次调用过程时都重新开始,过程结束时立即消失。 用static代替dim定义变量,可以在过程实例间保留局部变量的值。用static定义的变量称为静态变量,作用范围与dim相同,在整个模块执行时一直存在。,2变量的生命周期,例8-6:用static和dim定义局部变量,(1)在窗体中建立2个文本框分别命名为t1和t2附加标签的标题分别为“静态变量”和“局部变量”。 (2)在窗体中建立命令按钮名称为c1标题为“计算”。,(3)c1的click代码: Static x As Integer x变量的生命周期为全程 Dim y As Integer y变量的生命周期为局部 x = x + 1:y = y + 1 t1 = x:t2 = y,(4)执行时不断单击命令按钮,静态变量文本框中的值每次增加1,而局部变量文本框中的值总是1。,1. 数组的概念 数组是由一组具有相同数据类型的变量(称为数组元素)构成的集合。为了识别数组中不同的元素,数组元素可以通过下标来访问,数组下标默认从0开始。 说明: (1)数组要先定义后使用,VBA不允许隐式声明数组。 (2)同一过程中数组名不能与其他变量重名。,8.2.7 数组,2声明一维数组 格式1:dim 数组名(下标上限) as 数据类型 格式2:dim 数组名(下标下限 to 下标上限) as 数据类型 例如:dim a(6) as integer 功能:声明了有7个元素的数组a,元素下标从0到6,默认值均为0。 例如:dim b(1 to 6) as string 功能:声明了有6个元素的数组b,下标从1到6,默认值均为空串。 说明: (1)如果不定义数组下标的下限,默认下标下限为0。 (2)数组定义中的参数必须是常数。 (3)如果使用as语句定义数组类型,同一数组只能存放相同类型数据。,声明数组后,每个数组元素都被当作单个变量使用。 一维数组元素的引用格式:数组名(下标) 数组赋值与引用: bAge(0)50 bAge(1)20 bAge(2)70 Dim sum as Byte Sum= bAge(0)+ bAge(1)+ bAge(2),3声明多维数组 格式:dim 数组名(下标上限1,下标上限2,) as 数据类型 例如:dim c(3,4) as integer 功能:声明有20个元素的数组c,行下标从0到3,列下标从0到4。 例如:dim d(1 to 3,2 to 4) as integer 功能:声明有9个元素的数组d,行下标从1到3,列下标从2到4。 4使用数组 声明数组后,每个数组元素都被当作单个变量使用。 一维数组元素的引用格式:数组名(下标) 二维数组元素的引用格式:数组名(下标1,下标2),例8-7:使用符号常量和数组,(1)在窗体建文本框名称为t1。 (2)在窗体建命令按钮名称为c1标题为“确定”。 (3)命令按钮c1的单击事件代码:,const AA = “欢迎你!” 定义符号常量 dim b(1) As String 定义字符串数组 b(0) = AA b(1) = t1 MsgBox b(0) C1的单击事件代码: Private Sub c1_Click() Dim aa As String aa = InputBox(请写出您的姓名:, 输入框, ) bb = MsgBox(aa 建立2个命令按钮名称为c1、c2 标题为“清空”和“计算”,如图所示;,8-14 选择结构练习,C1的单击事件代码为: Private Sub c1_Click() Me!t1 = Me!t2 = Me!t3 = Me!t4 = End Sub c2的单击事件代码为:,8-14 选择结构练习,Private Sub c2_Click() If Me!t1 = Or Me!t2 = Or Me!t3 = Then MsgBox 成绩输入不全! Else Me!t4 = (Val(Me!t1) + Val(Me!t2) + Val(Me!t3) / 3 End If End Sub,8.4.3 多项选择语句,1格式 select case 表达式 case值1 语句序列1 case值2 语句序列2 case值n 语句序列n case else 语句序列n+1 end select 2功能:首先计算表达式的值,然后将表达式值与每个case的值比较,如果找到匹配的值,执行该case后的语句块,如果没有相匹配的值,执行case else后面的语句。,3说明 (1)多个分支中只能选择执行一个,执行了第一个符合条件的分支以后,即使有其他分支符合条件也不再执行。 (2)select case后面的表达式通常是一个变量的名字。 (3)select case与end select要成对出现,end select之间有空格。 (4)case后面的值有4种写法: 单一数值 一行并列数值,之间用逗号分隔。 数值1 to 数值2,前一个值必须比后一个值小。 用is开头的简单条件式,如 is10。不允许复杂条件式。,例8-15:select case练习 (1)建立文本框名称为t1建立命令按钮名称分别为c1。 (2)c1的click事件代码: Dim aa As String, bb As String aa = t1 Select Case aa Case a To z: bb = 英文字母 Case 0 To 9: bb = 数字 Case !, ?, :, ., , ;: bb = 标点符号 Case Else: bb = 特殊字符 End Select MsgBox bb,(3)转到窗体视图文本框中输入字母单击按钮显示消息框 。,8.4.4 选择函数与计时器事件,1iif函数 格式:iif(条件,表达式1,表达式2) 功能:如果条件为真,函数值为表达式1的值,否则,函数值为表达式2的值。 例:y=iif(ab,a大,b大) 2switch函数 格式:switch(条件1,表达式1,条件2,表达式,条件n,表达式n) 功能:从左到右依次判断,遇到第一个条件为真时返回对应表达式的值。 说明:条件与表达式成对,当多个条件为真时,只取第一个条件的对应表达式。 例:y=switch(x0,1),3choose函数 格式:choose(索引式,值1,值2,值n) 功能:根据索引项的值,返回对应的值。 说明:索引项通常是整型变量名,取值范围1n,超出范围时返回NULL。 例如:y=choose(x,优秀,良好,中等,及格,不及格),4计时器事件 VBA没有直接提供时间控件,通过timer事件实现定时功能。 方法:首先设置窗体的计时器间隔属性TimerInterval,然后给timer事件写过程代码。打开窗体时,每隔一个时间间隔激发一次timer事件,事件的过程就被执行一次,从而实现“定时”处理功能。 计时器间隔的时间单位为毫秒,1000毫秒=1秒。,例8-16:显示电子表,(1)建立2个标签名称为b1和b2标题都为数字1。 (2)打开窗体的属性窗口单击“事件”选项卡设置计时器 间隔属性为1000。 (3)在VBE窗口“通用-声明”写代码: Public a As Boolean a为逻辑型,默认false (4)Form的Timer事件代码: a = Not a b1.Caption = Time() b2.Caption = CInt(b2.Caption) + 1 b2.ForeColor = IIf(a = True, 255, 16711680),(5)转到窗体视图。b1中显示系统当前时间,b2中的数字每秒增加1,数字的颜色红、蓝交替,每秒换一次。,8.4.5 验证函数,VBA的常用验证函数,例8-17:检验字符串类型,(1)建文本框名称为t1附加标签标题为“输入年龄:”。 (2)建命令按钮名称分别为c1标题为“验证”。 (3)c1的click事件代码: If t1 = Or IsNull(t1) Then MsgBox 不能为空!, vbCritical, 提示 ElseIf IsNumeric(t1) = False Then MsgBox 必须是数字!, vbCritical, 提示 ElseIf t1 = 150 Then MsgBox 超出范围!, vbCritical, 提示“ Else MsgBox 验证通过!, vbInformation, 提示 End If,(4)转到窗体视图在文本框中输入一个字母单击【验证】按钮消息框显示消息“必须是数字!”。,8.4.6 循环语句,当某一程序段需要反复执行,用循环结构实现。循环结构对应两类循环语句: 先判断后执行的循环语句(当型循环结构) 先执行后判断的循环语句(直到型循环结构),1for-next循环 for-next循环能使语句序列运行指定次数,循环中有一个计数器变量,变量的值随每一次循环增加或减少。 for-next是当型循环结构,先判断后执行。,(1)格式:for 循环变量=初值 to 终值 step 步长 语句序列 next,(2)功能: 先将初值赋给循环变量,再将循环变量的当前值与终值做比较,如果比较结果为真执行语句序列,增加一个步长,再进行比较,如果比较结果仍为真,继续循环。如果比较结果为假,结束循环。,步长大于0时判断循环变量的当前值是否大于终值,步长小于 0判断循环变量的当前值是否小于终值。步长为0时导致循环 无法结束,所以步长不要设置为0。 步长可以是整数或小数,步长为1时可以省略。 除第一次循环以外,其他循环增加一个步长后与终值比较。 for循环可以嵌套。 在for循环中可以用exit for语句强行中止循环。,(3)说明,练习1:阅读下面程序段,循环结束后,各变量的值是多少? dim s as integer, i as integer s=0 for i=1 to 10 step 2 s=s+i i=i+2 next 结论:循环结束后,变量i的值是13,变量 s 的值是15。,1、i=1 s=0+1=1 i=1+2=3 step 2 i=i+2=5 2、i=5 s=1+5=6 i=5+2=7 step 2 i=i+2=9 3、i=9 s=6+9=15 i=9+2=11 step 2 i=i+2=13,步长相当于4: for i=1 to 10 step 4 s=s+i next,练习2:下面的程序段使得循环中途退出 Dim s as integer, i as integer S=0 For i=0 to 100 step 2 s=s+i if s=20 then exit for 中途退出循环 Next,分析:i=0 s=0+0=0 i=i+2=2 i=2 s=0+2=2 i=i+2=4 i=4 s=2+4=6 i=i+2=6,分析:i=6 s=6+6=12 i=i+2=8 i=8 s=12+8=20,结论:循环结束后,变量i的值是8, s 的值是20。,Dim s as integer, i as integer S=0 For i=0 to 100 step 2 s=s+i Next 1100之间的偶数之和,Dim s as integer, i as integer S=0 For i=0 to 100 s=s+i Next 1100之间的整数数之和,2do-while-loop循环 do-while-loop循环是当型循环结构,先判断后执行。 (1)格式 do while 循环条件 语句序列 loop (2)功能 先检查循环条件是否成立,若条件为真,执行语句序列。遇到loop语句时返回循环开始处重新判断,若条件仍然为真,再次执行语句序列。当条件为假时退出循环。,(3)说明 可以用exit do强行中止循环。 要考虑循环变量赋初值和给循环变量增加步长的问题。 如果将while换成until,当条件为真时循环结束。 练习:阅读下面的程序(注:大写字母A的ASCII码是65。) dim a(26) as string, b(26) as integer 字符数组 dim i as integer i=1 给循环变量赋初值 do while i=26 a(i)=chr(i+64) 将ASCII码变为字母 b(i)=Lcase(a(i) 将大写字母变为小写字母 i=i+1 使循环变量增加1 Loop,该循环结构循环26次,每次循环产生一个字母(大、小写),分别存放在a和b数组中。 即:通过循环产生26个大小写的英文字母,分别存放在A、B数组中。,3do-loop-while循环 是直到型循环结构,先执行后判断。 (1)格式 do 语句序列 Loop while 循环条件 (2)功能 先执行语句序列,遇到loop语句时判断循环条件,若条件为真,再次执行语句序列。当条件为假时退出循环。 (3)说明 可以用exit do强行中止循环。 要考虑给循环变量赋初值和给循环变量增加步长的问题。 如果将while换成until,当条件为真时循环结束。,4for-each 循环语句 for each循环用来遍历数组或对象集合中每一个元素,不需要指定循环次数,每个元素只遍历一次。如果不知道一个集合有多少个元素,用for each循环非常方便。 (1)格式 for each 循环变量 in 集合或数组 语句序列 next (2)功能 用循环变量依次遍历数组或对象集合中每一个元素,直到遍历结束。,练习:阅读下面程序。 dim a(50) as integer, i as integer, s as integer for i=1 to 50 给数组赋值 a(i)=i next s=0,for each i in a 遍历a中元素 if i mod 2 0 i和2进行模运算结果不为0 then s=s+a(i) 计算奇数之和 next,例8-18:显示Fibonacci数列的第15个元素,(Fibonacci数列的前两个数都是1,从第3个数开始,每个数都是前两个数之和。),(1)建立文本框名称为t1建立命令按钮名称为c1。 (2)c1的click事件代码: Dim f(15) As Integer f(1) = 1:f(2) = 1 For i = 3 To 15 f(i) = f(i - 1) + f(i - 2) Next t1 = f(15),8.5 过程调用与参数传递,8.5.1 认识过程和参数,1过程 过程是用来执行特定任务的一段独立的程序代码,这段代码能被反复调用。VBA的模块以过程为单元组成。 VBA的过程根据是否返回值分为两类:Sub过程和Function过程。 Sub过程只执行操作不返回值,不能用在表达式中,调用时就象使用基本语句一样。 Function过程又称为用户自定义函数,执行操作后返回结果,常用在表达式中,调用时就象使用基本函数一样。 过程名是标识符,不要与模块名重名,否则调用时会出现混乱。同一模块中,Sub过程也不要与Function过程重名。 过程不能嵌套定义,但可以嵌套调用。,2参数 如果在调用过程中,主调方(调用过程的语句)与被调方(过程)存在数据传递关系,表现这种传递关系的数据就是参数。 参数分为形参(形式参数)和实参(实际参数)。 形参用在被调方,只能是变量名或数组名。 实参用在主调方,可以是常量、已赋值的变量、有计算结果的表达式。 当形参和实参都是变量时,存在两种参数传递方式:值传递与地址传递。 值传递只能把实参的值传给形参,是“单向传递”。 地址传递能在实参与形参之间实现参数的“双向传递”,不但将实参的值传给形参,形参的值也可以传给实参。,8.5.2 sub过程,sub 过程是包含在 sub 和 end sub 之间的一组代码,调用sub过程时只执行其中的操作,不返回值。 1定义sub过程的格式 sub过程名(形参1 as 数据类型,形参2 as 数据类型,) 语句序列 end sub 2调用sub过程 格式1:call 过程名(实参1 ,实参2,) 格式2:过程名 实参1,实参2,,3说明 (1)参数之间用逗号分隔,对应的形参与实参之间要类型匹配。 (2)用格式1调用sub过程必须加括号,用格式2调用sub过程不加括号。 (3)用 exit sub 语句立即从 sub 过程中退出。 (4)定义sub过程时即使无任何参数,也必须包含空括号()。 (5)sub之前可以用public或private或static定义过程作用域。 (6)标准模块中的过程可以被所有对象调用,类模块中的过程只在本模块中有效。,例8-19:sub过程练习,(1)建2个文本框名称分别为t1和t2附加标签标题分别为“输入矩形长:”和“输入矩形宽:”。 (2)建命令按钮名称为c1标题为“计算”。 (3)建立标准模块 以“过程模块”为名保存模块。 (4)在“过程模块”中定义jxmj过程,代码如下:,Public Sub jxmj (h As Integer, w As Integer) Dim s As Integer s = h * w 计算矩形面积 MsgBox 矩形面积为: & s 显示矩形面积 End Sub,(5)命令按钮c1的click事件代码: Dim a1 As Integer, a2 As Integer a1 = t1:a2 = t2 Call jxmj (a1, a2) 用格式1调用sub模块 (6)转到窗体视图输入矩形长和宽单击“计算”按钮。,8.5.3 function过程,1定义function过程的格式 function过程名(形参1,形参2,)as 数据类型。 语句序列 过程名=表达式 end function 2调用function过程 调用function过程只有一种方式,即直接引用过程名,而且过程名在赋值号右端或在表达式中。,3说明 (1)参数之间用逗号分隔,对应形参与实参之间要类型匹配。 (2)“过程名=表达式”是function过程中不可缺少的语句。 (3)用 exit function 语句立即从 function 过程中退出。 (4)若function过程无任何参数,也必须包含空括号()。 (5)function之前可以用public或private或static定义过程的作用域。,例8-20:function过程练习,(1)建文本框名称为t1。 (2)建标签名称为Lab标题为“圆面积=” (3)建命令按钮名称为c1标题为“计算”。,(4)在已有的“过程模块”中添加ymj过程,代码如下:,(6)转到窗体视图在文本框中输入半径单击“计算”按钮计算结果显示在标签中。,Public Function ymj (r As Integer) As Single ymj = r * r * 3.14 End Function,(5)命令按钮c1的click事件代码: Dim a As Integer a = t1 Lab.Caption = Lab.Caption & ymj (a),8.5.4 参数传递,当实参是变量名时,既可以用传值方式传递参数,也可以用传地址的方式传递参数。,1参数的值传递 如果在过程的形参前加 byval说明符,参数的传递方式为“传值”。值传递的含义是指在过程中另外开辟存储单元存放从实参传过来的值,一旦过程结束,过程中开辟的存储单元被释放,该单元数据的改变不会保留下来。,2参数的地址传递 如果在过程的形参前加 byref 说明符,参数的传递方式为“传地址”,参数的地址传递是默认选项,不加任何说明符,默认就是传地址。 地址传递的含义是指过程中的形参与主调方的实参指向同一个存储单元,在过程中对存储单元所做的修改,当过程结束后成为实参的当前值。 地址传递通常用在sub过程中。,例8-21:参数传递练习,(1)建立2个文本框名称分别为t1和t2。 (2)建立命令按钮名称为c1标题为“调用过程”。 (3)在已有的“过程模块”中添加cscd过程,代码如下:,Public Sub cscd (ByRef a As Integer, ByVal b As Integer) a = a + 10 b = b + 10 End Sub,(4)命令按钮c1的click事件代码:,Dim x As Integer, y As Integer x = t1: y = t2 cscd x, y 用格式2调用sub过程 t1 = x: t2 = y (5)转到窗体视图在两个文本框中都输入10单击“调用过程”按钮计算结果仍显示在文本框中。,
展开阅读全文