
第8章模块与VBA编程基础.ppt
168页第第8章章 模块与模块与VBA编程基础编程基础考试大纲考试大纲VBA程序设计基础程序设计基础 1. 面向对象程序设计的基本概念 2. 模块的基本概念 (1)类模块 (2)标准模块 3. 创建模块 (1)创建VBA模块 (2)编写常用事件代码 Click,Load,Init,GetFocus,LostFocus 4. VBA编程基础 (1)常量,变量,常用内部函数,表达式 (2)VBA程序流程控制:顺序控制,选择控制,循环控制 (3)过程的定义与调用:子过程,函数过程,参数传递 Contents模模块的基本概念的基本概念创建模建模块VBA流程控制流程控制语句句412VBA程序程序设计基基础35过程程调用和参数用和参数传递6VBA程序运行程序运行错误处理理7VBA程序的程序的调试 模块是模块是Access数据库中的一个重数据库中的一个重要对象,它以要对象,它以VBA(( Visual Basic for Applications ))为基础编写以函为基础编写以函数过程(数过程(FunctionFunction)或子过程为单元)或子过程为单元的集合方式存储。
的集合方式存储 Access中,模块分为中,模块分为类模块类模块和和标标准模块准模块两种类型两种类型8.1 模块的基本概念模块的基本概念*模块和宏区别“模块”和“宏” 有什么区别?•使用“宏”更加简单,不需要编程,而是用“模块”,要求对编程有基本知识,比较复杂•“模块”的运行速度比较快,而“宏”运行速度比较慢•“宏”的每个基本操作在VBA中都有相应的等效命令,如果在“模块”中使用这些语句就可以实现所有的单独的“宏”命令,所以“模块”的功能比“宏”更加强大Ø 类模块类模块(文件扩展名为文件扩展名为 .cls)) 类模块是含有类模块是含有类类定义的模块,包括其属性、定义的模块,包括其属性、事件和方法的定义与窗体、报表、控件等紧密事件和方法的定义与窗体、报表、控件等紧密关联,如:关联,如:窗体模块和报表模块窗体模块和报表模块窗体模块和报表模块窗体模块和报表模块都是都是类类模块模块8.1.1 类模块类模块ØØ窗窗窗窗体体体体和和和和报报报报表表表表模模模模块块块块通通通通常常常常都都都都含含含含有有有有事事事事件件件件过过过过程程程程,,,,该该该该过过过过程程程程用用用用于于于于响响响响应应应应窗窗窗窗体体体体或或或或报报报报表表表表中中中中的的的的事事事事件件件件。
可可可可以以以以使使使使用用用用事事事事件件件件过过过过程程程程来来来来控控控控制制制制窗窗窗窗体体体体或或或或报报报报表表表表的的的的行行行行为为为为,,,,以以以以及及及及它它它它们们们们对对对对用用用用户户户户操操操操作作作作的的的的响响响响应应应应,,,,例例例例如如如如::::用用用用鼠鼠鼠鼠标标标标单单单单击击击击某个命令按钮某个命令按钮某个命令按钮某个命令按钮 ØØ窗窗窗窗体体体体和和和和报报报报表表表表模模模模块块块块具具具具有有有有局局局局部部部部特特特特性性性性,,,,其其其其作作作作用用用用范范范范围围围围局局局局限限限限在在在在所所所所属属属属窗窗窗窗体体体体和和和和报报报报表表表表内内内内部部部部,,,,而而而而生生生生命命命命周周周周期期期期则则则则是是是是伴伴伴伴随随随随着着着着窗窗窗窗体体体体和和和和报报报报表表表表的的的的打打打打开开开开而开始,关闭而结束而开始,关闭而结束而开始,关闭而结束而开始,关闭而结束8.1.1 类模块类模块Ø 类模块类模块(文件扩展名为文件扩展名为 .cls)) 8.1.1 类模块类模块例:form1Ø标准模块标准模块(文件扩展名为文件扩展名为 .bas)) 标准模块作用是合理组织程序或控制程序执标准模块作用是合理组织程序或控制程序执行流程,纯代码,不与任何对象(窗体、报表、行流程,纯代码,不与任何对象(窗体、报表、控件等)相关联,可放置在数据库中的任何位置,控件等)相关联,可放置在数据库中的任何位置,可以被工程内数据库对象调用。
可以被工程内数据库对象调用8.1.2 标准模块标准模块Ø标准模块标准模块(文件扩展名为文件扩展名为 .bas)) 标准模块中的标准模块中的公共变量和公共过程公共变量和公共过程具有局部特具有局部特性,其作用范围在整个应用程序里,而性,其作用范围在整个应用程序里,而生命周生命周期期则是伴随着应用程序的运行而开始,关闭而则是伴随着应用程序的运行而开始,关闭而结束 8.1.2 标准模块标准模块Ø标准模块标准模块(文件扩展名为文件扩展名为 .bas))8.1.2 标准模块标准模块例:form1uAccess宏实质上就是宏实质上就是VBA程序,宏的操作都是由程序,宏的操作都是由VBA代代码实现的码实现的u宏的用法简单,上手容易,比较适合没有编程基础的用户宏的用法简单,上手容易,比较适合没有编程基础的用户开发普通应用程序宏的不足是功能较弱、运行效率较差开发普通应用程序宏的不足是功能较弱、运行效率较差u Access模块中内嵌的模块中内嵌的VBA功能强大,具有较完功能强大,具有较完 善的语法体系和强大的开发功能它采用目前主流善的语法体系和强大的开发功能它采用目前主流 的面向对象机制和可视化编程环境,适用于开发的面向对象机制和可视化编程环境,适用于开发 高级高级Access数据库应用系统。
数据库应用系统 8.1.3 将宏转换为模块将宏转换为模块 每一个宏操作都有自己对应的VBA代码,根据需要我们可以把宏转换为模块8.1.3 将宏转换为模块将宏转换为模块 过程是模块的组成单元,由VBA代码编写而成 过程分两种类型:Sub子过程和Function函数过程8.2 创建模块创建模块一一一一 在模块中加入过程在模块中加入过程在模块中加入过程在模块中加入过程●●声明:声明(定义)变量声明:声明(定义)变量●●过程过程((若干个):过程是模块的组成单元,分若干个):过程是模块的组成单元,分2 2种:种: ①①子子(Sub)(Sub)过程过程 子过程没有返回值,它的定义格式如下:子过程没有返回值,它的定义格式如下:SubSubSubSub过程名过程名过程名过程名 [ [ [ [程序代码程序代码程序代码程序代码] ] ] ]End SubEnd SubEnd SubEnd Sub 其中的程序代码表示要完成的一系列操作调用其中的程序代码表示要完成的一系列操作调用子过程用子过程用Call Call Call Call 过程名。
过程名 8.2 创建模块创建模块一一一一 在模块中加入过程在模块中加入过程在模块中加入过程在模块中加入过程 ②②函数函数(Function)(Function) 函数过程又称为函数过程又称为FunctionFunction过程,函数过程有返回过程,函数过程有返回值,它的值,它的定义格式如下定义格式如下Function Function Function Function 过程名过程名过程名过程名 [ [ [ [程序代码程序代码程序代码程序代码] ] ] ]End FunctionEnd FunctionEnd FunctionEnd Function 调用函数过程时,调用函数过程时,直接引用函数过程的名称直接引用函数过程的名称直接引用函数过程的名称直接引用函数过程的名称8.2 创建模块创建模块一一一一 在模块中加入过程在模块中加入过程在模块中加入过程在模块中加入过程8.2 创建模块创建模块二二 在模块中执行宏在模块中执行宏 在模块的过程定义中,使用在模块的过程定义中,使用DocmdDocmd对象的对象的RunMacroRunMacro方法,方法,执行宏,其格式:执行宏,其格式:Docmd.RunMacroDocmd.RunMacro MacroName[,RepeatCount][,RepeatExpressionMacroName[,RepeatCount][,RepeatExpression] ]ØMacroNameMacroName:当前数据库中宏的名字;:当前数据库中宏的名字;ØRepeatCountRepeatCount:可选项,计算宏运行次数的整数值;:可选项,计算宏运行次数的整数值;ØRepeatExpressionRepeatExpression:可选项,数值表达式,在每次运:可选项,数值表达式,在每次运行宏时进行计算,结果为行宏时进行计算,结果为FalseFalse,停止运行宏。
停止运行宏8.2 创建模块创建模块8.3 VBA程序设计基础程序设计基础 VBA 是微软Office中的内置编程语言,其语法与VB的兼容,在Access程序设计中,当某些操作不能使用其他Access对象实现,或者实现较难时,就可利用VBA语言编写程序代码8.3.1 8.3.1 面向面向对象程序象程序设计的基本的基本概概念念1.集合(类)和对象集合(类)和对象•集合集合:含有相同属性的事物的总称成为集合,比如所有的:含有相同属性的事物的总称成为集合,比如所有的学生就构成一个集合(类)学生就构成一个集合(类)•对象:对象:集合中的某一个实体,例如学生集合中的某一个学集合中的某一个实体,例如学生集合中的某一个学生就是一个对象生就是一个对象•在自然界中,一个对象就是一个实体,如一辆汽车就是一在自然界中,一个对象就是一个实体,如一辆汽车就是一个对象在面向对象的程序设计中,对象代表应用程序中个对象在面向对象的程序设计中,对象代表应用程序中的元素,如表、窗体、按钮等的元素,如表、窗体、按钮等•Access有几十个对象,其中包括有几十个对象,其中包括对象和对象集合对象和对象集合所有对象和对象集合按象和对象集合按层次结构层次结构组织,处在最上层的是组织,处在最上层的是Application对象对象,即,即Access应用程序,其他对象或对象应用程序,其他对象或对象集合都处在它的下层或更下层。
集合都处在它的下层或更下层8.3.1 面向对象程序设计的基本概念2.属性和方法属性和方法 属性属性是对象的特征如汽车有颜色和型号属性,按钮有标是对象的特征如汽车有颜色和型号属性,按钮有标题和名称属性对象的类别不同,属性会有所不同同类题和名称属性对象的类别不同,属性会有所不同同类别对象的不同实例,属性也有差异例如,同是命令按钮,别对象的不同实例,属性也有差异例如,同是命令按钮,名称属性不允许相同名称属性不允许相同描述对象的性质和行为,引用方式:描述对象的性质和行为,引用方式:对象对象.属性属性或者或者对象对象.行为行为DoCmd对象对象:通过调用包含在内部的方法来实现通过调用包含在内部的方法来实现VBA编程编程中中对对Access的操作具体调用格式具体调用格式::DoCmd.OpenReportDoCmd.OpenReport ““报表名报表名” [ [,视图,视图][,][,查询名称查询名称][,][,条件条件] ] DoCmd.OpenReport “教师信息教师信息“ Docmd是Access的一个特殊对象,用来调用内置方法,在程序中实现对Access的操作,诸如打开窗口、关闭窗体、打开报表、关闭报表等。
DoCmd 对象的大多数方法都有参数,有些参数是必需的,有些则是可选的若省略可选参数,参数将采用默认值 DocmdDocmd对象象 (1)用DoCmd 对象打开窗体 格式:DoCmd.OpenForm "窗体名" 功能:用默认形式打开指定窗体 例如:DoCmd.OpenForm "文本框练习"((2 2)用)用DoCmdDoCmd 对象关闭窗体对象关闭窗体 格式格式1 1::DoCmd.CloseDoCmd.Close acFormacForm, ", "窗体名窗体名" " 功能:关闭指定窗体功能:关闭指定窗体 例如:例如:DoCmd.CloseDoCmd.Close acFormacForm, ", "文本框练习文本框练习" " 格式格式2 2::DoCmd.CloseDoCmd.Close 功能:关闭当前窗体功能:关闭当前窗体3 3)用)用DoCmdDoCmd 对象打开报表对象打开报表 格式:格式:DoCmd.OpenReportDoCmd.OpenReport " "报表名报表名",",acViewPreviewacViewPreview 功能:用预览形式打开指定报表。
功能:用预览形式打开指定报表 例如:例如:DoCmd.OpenReportDoCmd.OpenReport " "工资报表工资报表",",acViewPreviewacViewPreviewDocmdDocmd对象象 (4)用DoCmd 对象关闭报表 格式1:DoCmd.Close acReport, "报表名" 功能:关闭指定报表 例如:DoCmd.Close acReport, "工资报表" 格式2:DoCmd.Close 功能:关闭当前报表DocmdDocmd对象象 (5)用DoCmd 对象运行宏 格式:DoCmd.RunMacro "宏名" 功能:运行指定宏 例如:DoCmd.RunMacro "宏1"(6)用DoCmd 对象退出Access 格式:DoCmd.Quit 功能:关闭所有Access对象和Access本身DocmdDocmd对象象 (1)在窗体中建立5个按钮→名称分别为c1、c2、c3、c4、c5→标题分别为“打开窗体”、“关闭窗体”、“打开报表”、“关闭报表”、“退出Access” 。
实例:使用实例:使用DoCmdDoCmd对象对象(2)c1代码:DoCmd.OpenForm "教师基本情况“(3)c2代码:DoCmd.Close acForm, "教师基本情况“(4)c3代码:DoCmd.OpenReport “按年龄段统计报表",acViewPreview(5)c4代码:DoCmd.Close acReport, "按年龄段统计报表“(6)c5代码:DoCmd.Quit例:使用例:使用DoCmdDoCmd对象对象8.3.1 面向对象程序设计的基本概念面向对象程序设计的基本概念3.事件和事件过程事件和事件过程•事件:Access窗体或者报表及其上控件等对象可以“辨识”的动作,如单击、双击、某一个按键等•事件过程:为某个事件编写VBA代码过程,来完成指定的动作•在类模块每一个过程的开始行,都显示对象名和事件名•如:Private Sub c1_Click()例:动态设置控件属性 (1)在窗体中建1个文本框→名称为t12)在窗体中建1个标签→名称为b1→标题为“欢迎你!”3)在窗体中建3个命令按钮→名称分别为c1、c2、c3→标题 分别为“红色”、“绿色”、“蓝色”。
8.3.1 面向对象程序设计的基本概念面向对象程序设计的基本概念3.事件和事件过程事件和事件过程(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 执行结果:8.3.2 VBE8.3.2 VBE编程程环境境1.进入进入VBE编辑环境编辑环境•类模块:类模块:1)定位窗体或者报表,单击工具栏)定位窗体或者报表,单击工具栏“代码代码”按钮;按钮; 2)或者通过窗体、报表或者控件)或者通过窗体、报表或者控件“属性属性”窗口中窗口中“事件事件”选选项卡的项卡的“事件过程事件过程”项进入•标准模块:标准模块:1))已有模块已有模块,在数据库窗体选择,在数据库窗体选择“模块模块”对象,双击要查看对象,双击要查看的模块;的模块;2))新建模块新建模块,在数据库窗体选择,在数据库窗体选择“模块模块”对象,单击对象,单击“新建新建” 按钮;按钮;3)在数据库对象窗体中,单击)在数据库对象窗体中,单击“工具工具”菜单菜单——“宏宏”——“Visual basic Visual basic 编辑器编辑器”。
工具栏工具栏属属属属性性性性窗窗窗窗口口口口代码窗口代码窗口代码窗口代码窗口工程窗口工程窗口工程窗口工程窗口8.3.2 Visual Basic编程环境编程环境((1 1)标准工具栏)标准工具栏 按按按按 钮钮钮钮名名名名 称称称称功功功功 能能能能Access视图视图用于从用于从VBE切换到数据库窗口切换到数据库窗口插入模块插入模块插入新的模块插入新的模块运行子过程运行子过程/用户窗体用户窗体运行模块程序运行模块程序中断运行中断运行中断正在运行的程序中断正在运行的程序重新设置重新设置结束正在运行的程序,重新进入模块设计状态结束正在运行的程序,重新进入模块设计状态设计模式设计模式进入和退出设计模式进入和退出设计模式工程资源管理器工程资源管理器打开工程资源管理器窗口打开工程资源管理器窗口属性窗口属性窗口打开属性窗口打开属性窗口对象浏览器对象浏览器打开对象浏览器窗口打开对象浏览器窗口 ((((2 2 2 2)工程窗口)工程窗口)工程窗口)工程窗口工程资源管理器,显示应用程序的所有模块文件工程资源管理器,显示应用程序的所有模块文件。
3 3个按钮:个按钮:● ●查看代码查看代码查看代码查看代码 按钮可以打开相应的代码窗口按钮可以打开相应的代码窗口● ●查看对象查看对象查看对象查看对象 按钮可以打开相应的对象窗口按钮可以打开相应的对象窗口● ●切换文件夹切换文件夹切换文件夹切换文件夹 可以隐藏或显示对象的分类文件夹可以隐藏或显示对象的分类文件夹3 3 3 3)代码窗口)代码窗口)代码窗口)代码窗口 代码窗口主要是用来编写、显示以及编辑代码窗口主要是用来编写、显示以及编辑VBAVBA代码,代码,如下图所示如下图所示8.3.2 Visual Basic编程环境编程环境((3 3)) 代代码窗口窗口•对象浏览器对象浏览器•快速访问子过程快速访问子过程•自动显示提示信息自动显示提示信息•F1F1帮助帮助代码窗口代码窗口数据库引擎数据库引擎数据库引擎数据库引擎((((4 4 4 4)属性窗口)属性窗口)属性窗口)属性窗口 列出了所选对象的属性,由列出了所选对象的属性,由“对象对象”框和框和“属性属性”列表组列表组成● ●对象框对象框对象框对象框:: 用于列出当前所选的对象。
用于列出当前所选的对象● ●属性列表属性列表属性列表属性列表::按字母或分类对对象属性进行排序按字母或分类对对象属性进行排序 ●可以在属性窗口中直接用前面用到的方法设置可以在属性窗口中直接用前面用到的方法设置 对象的属性(静态设置方法)对象的属性(静态设置方法) ●可以在代码窗口中用可以在代码窗口中用VBAVBA代码编辑对象的属代码编辑对象的属 性(动态设置方法)性(动态设置方法)5 5 5 5)立即窗口)立即窗口)立即窗口)立即窗口用来进行快速的表达式计算、简单方法的操作寄进行程序测用来进行快速的表达式计算、简单方法的操作寄进行程序测试的工作窗口试的工作窗口8.3.2 Visual Basic编程环境编程环境二、进入二、进入VBE编程环境编程环境VBE将模块分成对象、标准和类模块 进入其编辑环境有多种方式: 一、对象模块:可以直接定位到窗体或报表,然后单击视图下的“代码”按钮进入;或定位到窗体、报表和控件上通过指定对象事件处理过程进入。
其方法有两种:(1)右键单击控件对象,单击快捷菜单上的“事件生成器命令”,打开“事件生成器”对话框,选择其中的“代码生成器”,单击 “确定”按钮即可进入;(2)单击属性窗口的“事件”选项卡,选中某个事件直接单击属性右侧的“…”按钮,打开“事件生成器”对话框,选择其中的“代码生成器”,单击“确定”按钮即可进入 二、进入二、进入VBE编程环境编程环境二、对于标准模块:有3种方法进入:(1)对于已存在的标准模块,只需从数据库窗体对象列表上选择“模块”,双击要查看的模块对象即可进入;(2)要创建新的标准模块,需要从数据库窗体对象列表上选择“模块”,单击工具栏上的“新建”按钮即可进入;(3)在数据库对象窗体中,选择“工具”菜单里“宏”子菜单的“Visual Basic编辑器”选项即可进入 使用Alt+F11组合键,可以方便的在数据库窗口和VBE之间进行切换三、三、VBE环境中编写环境中编写VBA代码代码•VBA代码是由语句组成的,一条语句就是一行代码例如•intCount=3 ’将3赋值给变量intCount•Debug. Print intCount ’在立即窗口打印变量intCount的值3三、三、VBE环境中编写环境中编写VBA代码代码•Access的VBE编辑环境提供了完整的开发和调试工具。
其中的代码窗口顶部包含两个组合框,左侧为对象列表,右侧为过程列表操作时,从左侧组合框选定一个对象后,右侧过程组合框中会列出该对象的所有事件过程,再从该对象过程列表选项中选择某个事件名称,系统会自动生成相应的事件过程模块,用户添加代码即可 双击工程窗口中的任何类或对象都可以在代码窗口中打开相应代码进行编辑处理 四、程序语句书写原则四、程序语句书写原则1 语句书写规定Ø通常一个语句写在一行,若要分行用续行符”-”;Ø”:“将一行中多条语句隔开;Ø若语句中出现红色表示有错误四、程序语句书写原则四、程序语句书写原则2 注释语句一个好的程序都要有注释语句在VBA中使用下列格式:ØRem 注释语句Ø‘(单引号)注释语句 Rem 定义两个变量 Dim Str1,Str2 Str1=“beijing” Str2=“Shanghai”四、程序语句书写原则四、程序语句书写原则3 采用缩进格式书写程序 编辑缩进(或凸出)4 F1帮助信息一、标准数据类型一、标准数据类型•VBA提供了多种数据类型的支持,这样也是为了大家进行编程提供方便•各种数据类型所占的存储空间、所表示数据范围大小、以及所支持的数据运算不同。
•数据类型可以分为数值型、布尔型、日期型、字符型、对象型、变体型和用户自定义的数据类型8.3.3 8.3.3 数数据据类型和型和数数据据库对象象8.3.3 8.3.3 数数据据类型型与数与数据据库对象象数据类数据类型型类型标识类型标识符符号号字段类型字段类型取值范围取值范围整型整型Integer%字节字节/整数整数/是是/否否-32768~~32767之间的整数之间的整数长整型长整型Long&长整数长整数/ /自动编号自动编号-2147483648~~2147483647之间的之间的整数整数单精度单精度Single!单精度单精度负数:负数:-3.402823E38~~-1.401298E-45正数:正数:1.401298E-45~~3.402823E38双精度双精度Double#双精度双精度负数:负数:-1.79769313486232E308∼∼ -4.94065645841247E-324正数:正数:4.94065645841247E-324∼∼ 1.79769313486232E308货币货币Currency@货币货币-922337203685477.5808∼ ∼ 922337203685477.5807字符串字符串String$文本文本0∼∼65535个字符个字符布尔布尔Boolean逻辑值逻辑值true或或false日期日期Date日期日期/时间时间January 1,100到到December 31,9999变体类变体类型型Variant任何任何January 1 /10000(日期日期)数字和双精度同数字和双精度同,文本和字符串同文本和字符串同数据类型转换函数数据类型转换函数函数函数转换后类转换后类型型说明说明CByte(xCByte(x) )ByteBytex x取值范围同取值范围同ByteByte,小数部分四舍五入,超出,小数部分四舍五入,超出范围显示范围显示“溢出溢出”CInt(xCInt(x) )IntegerIntegerx x取值范围同取值范围同IntegerInteger,小数部分四舍五入,小数部分四舍五入CLng(xCLng(x) )LongLongx x取值范围同取值范围同LongLong,小数部分四舍五入,小数部分四舍五入CSng(xCSng(x) )SingleSinglex x取值范围同取值范围同SingleSingleCDbl(xCDbl(x) )DoubleDoublex x取值范围同取值范围同DoubleDoubleCCur(xCCur(x) )CurrencyCurrencyx x取值范围同取值范围同CurrencyCurrencyCBool(xCBool(x) )BooleanBooleanx x取值范围是任何有效数字或字串取值范围是任何有效数字或字串CDate(xCDate(x) )DateDatex x取值范围是任何有效日期表达式取值范围是任何有效日期表达式CStr(xCStr(x) )StringString无无CVar(xCVar(x) )VariantVariantx x如果是数值范围同如果是数值范围同DoubleDouble,否则,与,否则,与StringString相同相同 例:例:在立即窗口中计算函数值在立即窗口中计算函数值(1)在VBE界面→“视图”菜单→“立即窗口”,显示立即窗口。
2)输入表达式x=“true”→回车→输入表达式y=“false”→回车→输入表达式 ?x+y→回车,显示结果为:truefalse3)输入表达式 ?cbool(x)+cbool(y)→回车,显示结果为:-1说明:每行写完后必须回车才能生效问号与print语句相同,在立 即窗口显示计算结果数据类型数据类型- -布尔型型•布尔数据类型以16位数字形式存储•布尔数据类型只有True和False两个值•布尔数据支持逻辑与、或、非等运算•当其他的数值类型转化为布尔型时,0转化为False,其他转化为True•当布尔型转化为其他的数值类型时, False转化为 0 , True转化为-1标识符:标识符:Boolean数据类型数据类型- -日期型型•日期数据类型以64位浮点数值形式存储•日期数据类型前后必须用#封住如:#2012/4/1#•日期变量根据计算机中的短日期格式显示,时间则根据计算机的时间格式显示•当其他数值类型转化为时间类型时,整数部分表示日期,小数部分表示时间,负数表示1899年12月31日以前的日期标识符:标识符:Date数据类型数据类型- -变体型型•变体数据类型所代表的数据类型是不确定的,可以成为任何类型的变量。
•变体的数据类型的变量可以存储特殊值,如:Empty,Error,Nothing,Null等•变体数据类型中的数值类型可以代表任何的整型和实型数可以用VarType和TypeName函数检查变体中的数据标识符:标识符:Variant数据类型数据类型- -字符型型•每个字符以一个字节(8位)进行表示,对应的数值的范围是0—255•字符中的前128个字符对应于ASCII字符集中的定义,字符集后128个字符代表特定的字符•字符数据类型两种:变长字符和定长字符变长字符可以包括的字符数量为0到约20亿个定长字符可以包括的字符数量为1到约64K个字符标识符:String数据类型数据类型- -数值型型•VBA中数值型包括整型、长整型、单精度、双精度和货币等•数据的存储从8位到64位不等•数据支持加、减、乘、除等运算•货币类型的数据保持小数点左边15位数字,右边4位数字,以满足精度的需要整型长整型单精度双精度货币integer longsingledouble currency标识符二二 用户用户定义的数据类型数据类型•前面所介绍的数据类型都是原子型的数据类型,即不可以再分割的数据类型,使用Type语句可以定义任何结构型数据类型,如: 定义格式:Type 数据类型名 域名1 as 数据类型 域名2 as 数据类型 … End Type二二 用户用户定义的数据类型数据类型•例如: Type newstudent txtno As String*7 txtname As String txtsex As string*1 txtage As Integer End Type 这样就定义了“newstudent”这种数据类型,它包括“编号“、“姓名”、“性别”、“年龄”四个数据域。
二二 用户用户定义的数据类型数据类型•用户定义数据类型变量的取值可指明变量名及分量名,两者用句号分开,如: Dim NewStu as NewStudent NewStu.txtSno=“980306” NewStu.txtName=“冯伟冯伟” NewStu.txtSex=“女女” NewStu.txtAge=20 二二 用户用户定义的数据类型数据类型•也可以使用With简化程序的重复部分,将上面的变量赋值: With NewStu .txtSno=“980306” .txtName=“冯伟冯伟” .txtSex=“女女” .txtAge=20 End With 三三 数据库对象数据库对象•如数据库、表、查询、窗体、报表等也有对应的VBA对象数据类型,这些数据类型由引用的对象库所定义,对应关系见:• P208 表8.38.3.4 8.3.4 常量和常量和变量量一、变量一、变量在VBA中变量的概念是怎么样呢?•变量是程序运行时值会发生变化的数据。
•变量的命名规则与字段命名一样,不能使用VBA的关键字•在VBA中不必先声明变量再使用变量,但是先声明再使用是良好编程的习惯•变量的数据类型可以是前面所介绍的数据类型中的任何一种,也可以是用户自定义的数据类型变量变量- -变量名命名原则变量的命名原则有以下几点:•第一个字母必须是英文字母•不能在变量名中使用空格、句点等符号•变量名的长度不能超过255个字符•变量名不区分大小写•不能在某一范围内的相同层次中使用重复的变量名•变量不能与函数名、过程名相同以下是合法的变量名: a,x, x3, BOOK_1,sum5以下是非法的变量名: 3s s*T -3x bowy-1 if 一一 变量的声明变量的声明1 1、、显式式声声明明 VBA中定义变量的格式为: Dim 变量名 [AS 类型] 格式中Dim是一个VBA命令,此处用于定义变量;As是关键字,此处用于指定变量的数据类型 例如:Dim x as Integer ’ x为整型变量 Dim x%,y! ‘x是整型,y为单精度一一 变量的声明变量的声明2 2、、隐含含声声明明 VBA允许用户在编写应用程序时,不声明变量而直接使用,这就是隐式声明。
所有隐式声明的变量都是Variant数据类型例如:Dim m,n, NewVar=258’m,n为变体Variant变量 , NewVar为Variant类型变量,其值为258二二 强制声明强制声明在默认情况下,在默认情况下,VBA允许在代码中使用未声明的允许在代码中使用未声明的变量,如果在模块设计窗口的顶部变量,如果在模块设计窗口的顶部“通用通用—声声明明”区域中区域中,加入语句:,加入语句: Option Explicit 说明:说明:强制要求所有变量强制要求所有变量必须定义才能使用必须定义才能使用这种方法只能为当前模块设置了自动变量声明这种方法只能为当前模块设置了自动变量声明功能,如果想为所有模块都启用此功能,可以功能,如果想为所有模块都启用此功能,可以单击菜单命令单击菜单命令“工具工具”下下“选项选项”对话框中,对话框中,选中选中“要求变量声明要求变量声明”选项即可选项即可三三 变量的作用域变量的作用域1 1、局部范、局部范围((LocalLocal)) 变量定义在模块的过程内部,过程代码执行时才可见在子过程或函数过程中定义的或直接使用的变量作用范围都是局部的。
在子过程或函数内部使用Dim、Static…As关键字说明的变量就是局部范围的2 2、模、模块范范围((ModuleModule)) 变量定义在模块的所有过程之外的起始位置,运行时在模块所包含的所有子过程或函数过程中可见在模块的通用说明区,用Dim、Static、Private…As关键字定义的变量作用域都是模块范围三三 变量的作用域变量的作用域3 3、全局范、全局范围((PublicPublic))•变量定义在标准模块的所有过程之外的起始位置,运行时在类模块和标准模块的所有子过程或函数过程中都可见在标准模块的变量定义区域,用Public…As 或 Global…As说明的变量就属于全局的范围•变量的持续时间(生命周期)是从变量定义语句所在的过程第一次运行,到程序代码执行完毕并将控制权交回调用它的过程为止的时间四数据库对象变量四数据库对象变量Access建立的数据库对象及其属性,均可被看成是VBA程序代码中的变量及其指定的值来加以引用 例如,Access中窗体和报表对象的引用格式为: Forms !窗体名称 !控件名称 [.属性名称]或 Reports !报表名称 !控件名称 [.属性名称]关键字Forms或Reports分别表示窗体或报表对象集合。
感叹号“!”分隔开对象名称和控件名称属性名称”部分缺省,则为控件基本属性如果对象名称中含有空格或标点符号,就要用方括号把名称括起来四数据库对象变量四数据库对象变量如: Forms!学生管理!编号=”980306“ Forms!学生管理![编 号]=”980306“ 对象名称含空格如果要多次引用对象可以用Set关键字来建立控件对象的变量如: Dim txtname As Control Set txtname =Forms!学生管理!姓名 txtname=”冯伟“ 返一个特殊的模块变量一个特殊的模块变量 本地窗口打开时,自动生成一个名为本地窗口打开时,自动生成一个名为““MeMe””的特殊模块变量的特殊模块变量对于类模块,定义为对于类模块,定义为MeMeMeMe是对象的引用,引用当前模块中当前类是对象的引用,引用当前模块中当前类的实例 MeMe变量不需要专门定义,直接使用即可变量不需要专门定义,直接使用即可例如,用代码定义例如,用代码定义““学生信息学生信息””窗体中窗体中““LabLab””标签的标题属性,以标签的标题属性,以下两种方法效果是一样的:下两种方法效果是一样的:标准方法:标准方法:Forms! Forms! 学生信息学生信息! !Lab.CaptionLab.Caption="="学生信息浏览学生信息浏览" "常用方法:常用方法:Me!Lab.CaptionMe!Lab.Caption="="学生信息浏览学生信息浏览" "例:用例:用staticstatic、、dimdim和和publicpublic定义变量定义变量 ((1 1)在窗体中建立)在窗体中建立2 2个文本框个文本框→→分别命名为分别命名为t1t1和和t2→t2→附加标签附加标签的标题分别为的标题分别为““静态变量静态变量””和和““局部变量局部变量””。
2 2)在窗体中建立命令按钮)在窗体中建立命令按钮→→名称为名称为c1→c1→标题为标题为““计算计算”” ((3 3))c1c1的的clickclick代码:代码: Static a As IntegerStatic a As Integer Dim b As Integer Dim b As Integer a = a + 1: b = b + 1: c = c + 1 a = a + 1: b = b + 1: c = c + 1 T1 = a: T2 = b: T3 = c T1 = a: T2 = b: T3 = c 新建一个模块,添加代码:新建一个模块,添加代码: Public c As IntegerPublic c As Integer((4 4)执行时不断单击命令按钮,观察值的变化然后关闭)执行时不断单击命令按钮,观察值的变化然后关闭窗体,再次打开,再观察值的变化窗体,再次打开,再观察值的变化 五五 数组数组•数组是在有规则的结构中包含一种数据类型的一组数据,也称作数组元素变量•数组变量由变量名和数组下标构成,使用数组必须先定义数组。
通常用Dim语句来定义数组,定义格式为: Dim 数组名([<下标下限>to]<下标上限>)[As <数据类型>] •缺省情况下,下标下限为0,数组元素从“数组名(0)”至“数组名(下标上限)”;如果使用to选项,则可以安排非0下限 五五 数组数组例如,dim score(10)as Integer ’定义了11个整形数构成的数组,数组元素为score(0) 至score(10)再如, dim score(1 to 10)as Integer’定义了10个元素的整型数组,数组元素为score(1)至 score(10) 注:(1)所有数组元素在内存连续存放 (2)根据下标区分数组元素五五 数组数组关于数组的定义,还有下面的几点说明:(1)定义数组时数组名的命名规则与变量名的命名规则相同2)一般在定义数组时应给出数组的上界和下界但也可以省略下界,<下界>缺省 为0例如,Dim a(10) As Single默认情况下,数组a由11个元素组成若希望下标从1开始,可在模块的通用声明段使用Option Base语句声明其使用格式为Option Base 0|1 ' 后面的参数只能取 0 或 1五五 数组数组(3)<下界>和<上界>不能使用变量,必须是常量,常量可以是字面常量或符号常量,一般是整型常量。
4)如果省略As子句,则数组的类型为Varient变体类型二维数组的定义 :格式为:Dim 数组名([<下界>to]<上界>,[<下界>to]<上界>)[As <数据类型>]例如,Dim c(1 To 3, 1 To 4)As Single五五 数组数组•VBA还支持动态数组,定义和使用方法是:先用Dim显式定义数组但不指明数组元素数目,然后用ReDim关键字决定数组包含的元素数,以建立动态数组创建方法: Dim NewArray() As Long…ReDim NewArray(9,9,9) •如果想释放数组占用的空间可将ReDim设置0个元素 六六 变量标识命名法则变量标识命名法则• 在编写VBA程序代码时,会用到大量的变量名称和不同的数据类型对于控件对象,可以用VBA的Set关键字将每个命名的控件对象指定为一个变量名称 目前,VB和VBA均推荐使用Hungarian符号法作为命名法则该方法也被广泛用在C和C++等一些程序中 Hungarian符号法使用一组代表数据类型的码用小写字母作为变量名的前缀• 见P212 表8.4 如七七 符号常量符号常量如果程序中多处用到某个常量,将其定义成符号常量可增加代码的可读性,也便于维护。
符号常量用关键字Const来定义,格式如下: Const 符号常量名称=常量值 例如: Const PI as single=3.1415926定义了一个符号常量PI,其值为3.1415926若是在模块的声明区中定义符号常量,则建立一个所有模块都可以用的全局符号常量一般是Const前加Global或Public关键字 七 符号常量•说明:说明:说明:说明:1.符号常量名一般用大写字母,以便与变量名符号常量名一般用大写字母,以便与变量名符号常量名一般用大写字母,以便与变量名符号常量名一般用大写字母,以便与变量名区分2.如果符号常量定义在模块声明区,所有模块如果符号常量定义在模块声明区,所有模块如果符号常量定义在模块声明区,所有模块如果符号常量定义在模块声明区,所有模块的过程都能使用该变量,通常在前面加上的过程都能使用该变量,通常在前面加上的过程都能使用该变量,通常在前面加上的过程都能使用该变量,通常在前面加上GlobalGlobal或或或或PublicPublic 如:如:如:如:Public Const PI=3.14Public Const PI=3.143.如果符号常量定义在事件的过程中,该符号如果符号常量定义在事件的过程中,该符号如果符号常量定义在事件的过程中,该符号如果符号常量定义在事件的过程中,该符号常量只在本过程中可用。
常量只在本过程中可用常量只在本过程中可用常量只在本过程中可用4.符号常量定义时不用指明数据类型符号常量定义时不用指明数据类型符号常量定义时不用指明数据类型符号常量定义时不用指明数据类型八八 系统常量(内部常量系统常量(内部常量/ /固有常量)固有常量)这是一类特殊的符号常量,Access系统内部包含若干个启动时就建立的系统常量,有True、False、Yes、No、On、Off和Null等在编码时可以直接使用 例如:VBA类库中,vbRed代表红色,vbBlue代表蓝色这里开始的两个字母表示所在的类库Access类库的常量以ac开始,如acForm等ADO类库的常量以ad开始,如adOpenKeyset例:使用符号常量和数组例:使用符号常量和数组 ((1 1)在窗体建文本框)在窗体建文本框→→名称为名称为t1t12 2)在窗体建命令按钮)在窗体建命令按钮→→名称为名称为c1→c1→标题为标题为““确定确定””3 3)) c1c1的代码:的代码:const AA = const AA = ““欢迎你欢迎你! !”” ‘‘ 定义符号常量定义符号常量 dim b(1) As String dim b(1) As String ‘‘ 定义数组定义数组 b(0) = AA b(0) = AA b(1) = t1 b(1) = t1 MsgBoxMsgBox b(0) & Chr(13) & Chr(13) & b(1), b(0) & Chr(13) & Chr(13) & b(1), vbInformationvbInformation, ", "消息框消息框" "说明:说明:Chr(13)Chr(13)生成一个回车,用单引号开始的字符串为注释语句。
生成一个回车,用单引号开始的字符串为注释语句((4)转到窗体视图)转到窗体视图→在文本框中输入在文本框中输入“张三张三”→单击单击“确定确定”按钮 函数实际上是系统事先定义好的内部程序,用来完成函数实际上是系统事先定义好的内部程序,用来完成函数实际上是系统事先定义好的内部程序,用来完成函数实际上是系统事先定义好的内部程序,用来完成特定的功能特定的功能特定的功能特定的功能VBAVBA提供了大量的内部函数,供用户在提供了大量的内部函数,供用户在提供了大量的内部函数,供用户在提供了大量的内部函数,供用户在编程时使用编程时使用编程时使用编程时使用 函数的调用形式为:函数的调用形式为:函数的调用形式为:函数的调用形式为: 函数名函数名函数名函数名( (参数表参数表参数表参数表) )uu其中,参数可以是常量、变量或表达式,可以有一个其中,参数可以是常量、变量或表达式,可以有一个其中,参数可以是常量、变量或表达式,可以有一个其中,参数可以是常量、变量或表达式,可以有一个或多个uu每个函数被调用时,都会有一个返回值每个函数被调用时,都会有一个返回值。
每个函数被调用时,都会有一个返回值每个函数被调用时,都会有一个返回值uu根据函数的不同,参数与返回值都有特定的数据类型根据函数的不同,参数与返回值都有特定的数据类型根据函数的不同,参数与返回值都有特定的数据类型根据函数的不同,参数与返回值都有特定的数据类型与之对应与之对应与之对应与之对应uu内置函数按其功能可分为内置函数按其功能可分为内置函数按其功能可分为内置函数按其功能可分为数学函数数学函数数学函数数学函数、、、、转换函数转换函数转换函数转换函数、、、、字符字符字符字符串函数串函数串函数串函数、、、、日期函数日期函数日期函数日期函数和和和和格式输出函数格式输出函数格式输出函数格式输出函数8.3.5 8.3.5 常用常用标准函准函数数8.3.5 8.3.5 常用常用标准函准函数数常用标准函数•数学函数:abs()、int()、fix()、sin()、cos()•字符串函数:instr()、left()、right()、mid()•日期/时间函数:date()、time()、now()、year()month()、day()、weekday()•类型转换函数:asc()、chr()、str()、val()1 1 1 1.算.算.算.算术术函函函函数数数数((((1 1 1 1))))abs(xabs(xabs(xabs(x) ) ) ),返回,返回,返回,返回x x x x的绝对值。
的绝对值的绝对值的绝对值2 2 2 2))))int(xint(xint(xint(x) ) ) ),返回,返回,返回,返回x x x x的整数部分,的整数部分,的整数部分,的整数部分,x<0x<0x<0x<0时,返回值小于等于时,返回值小于等于时,返回值小于等于时,返回值小于等于x x x x fix(xfix(xfix(xfix(x) ) ) ),返回,返回,返回,返回x x x x的整数部分,的整数部分,的整数部分,的整数部分,x<0x<0x<0x<0时,返回值大于等于时,返回值大于等于时,返回值大于等于时,返回值大于等于x x x x3 3 3 3))))sqr(xsqr(xsqr(xsqr(x) ) ) ),返回,返回,返回,返回x x x x的平方根要求的平方根要求的平方根要求的平方根要求x x x x大于等于大于等于大于等于大于等于0 0 0 04 4 4 4))))rnd(xrnd(xrnd(xrnd(x) ) ) ),返回,返回,返回,返回0 0 0 0~~~~1 1 1 1之间的随机数,为单精度类型之间的随机数,为单精度类型之间的随机数,为单精度类型。
之间的随机数,为单精度类型说明:若说明:若说明:若说明:若x>0x>0x>0x>0,每次产生不同随机数;若,每次产生不同随机数;若,每次产生不同随机数;若,每次产生不同随机数;若x=0x=0x=0x=0,产生最近生成的随机数;,产生最近生成的随机数;,产生最近生成的随机数;,产生最近生成的随机数;若若若若x<0x<0x<0x<0,每次产生相同随机数当,每次产生相同随机数当,每次产生相同随机数当,每次产生相同随机数当x>0x>0x>0x>0时可直接写时可直接写时可直接写时可直接写rndrndrndrnd,省略括号和,省略括号和,省略括号和,省略括号和参数8.3.5 8.3.5 常用常用标准函准函数数例如:例如:例如:例如: intintintint (100* (100* (100* (100*rndrndrndrnd) ) ) ),产生,产生,产生,产生0 0 0 0~~~~99999999之间的随机整数之间的随机整数之间的随机整数之间的随机整数 intintintint (101* (101* (101* (101*rndrndrndrnd) ) ) ),产生,产生,产生,产生0 0 0 0~~~~100100100100之间的随机整数。
之间的随机整数之间的随机整数之间的随机整数 intintintint (100*rnd+1) (100*rnd+1) (100*rnd+1) (100*rnd+1),产生,产生,产生,产生1 1 1 1~~~~100100100100之间的随机整数之间的随机整数之间的随机整数之间的随机整数 intintintint (100*rnd+100) (100*rnd+100) (100*rnd+100) (100*rnd+100),产生,产生,产生,产生100100100100~~~~199199199199之间的随机整数之间的随机整数之间的随机整数之间的随机整数 intintintint (101*rnd+100) (101*rnd+100) (101*rnd+100) (101*rnd+100),产生,产生,产生,产生100100100100~~~~200200200200之间的随机整数之间的随机整数之间的随机整数之间的随机整数5 5 5 5))))round(x,nround(x,nround(x,nround(x,n) ) ) ),,,,n n n n是小数位数,是小数位数,是小数位数,是小数位数, 对对对对x x x x的小数做四舍五入,的小数做四舍五入,的小数做四舍五入,的小数做四舍五入,返回有返回有返回有返回有n n n n位小数的位小数的位小数的位小数的x x x x值。
值 例如:例如:例如:例如:round(12.735,2)round(12.735,2)round(12.735,2)round(12.735,2),返回,返回,返回,返回12.7412.7412.7412.748.3.5 8.3.5 常用常用标准函准函数数2 2 2 2.字符串函.字符串函.字符串函.字符串函数数数数((((1 1 1 1))))len(xlen(xlen(xlen(x) ) ) ),返回,返回,返回,返回x x x x的长度,即字符个数要求的长度,即字符个数要求的长度,即字符个数要求的长度,即字符个数要求x x x x为字符串类型为字符串类型为字符串类型为字符串类型2 2 2 2))))space(nspace(nspace(nspace(n) ) ) ),返回由,返回由,返回由,返回由n n n n个空格组成的字符串,个空格组成的字符串,个空格组成的字符串,个空格组成的字符串,n n n n为数字3 3 3 3))))ucase(xucase(xucase(xucase(x) ) ) ),将,将,将,将x x x x中的小写字母转大写中的小写字母转大写。
中的小写字母转大写中的小写字母转大写 lcase(xlcase(xlcase(xlcase(x) ) ) ),将,将,将,将x x x x中的大写字母转小写中的大写字母转小写中的大写字母转小写中的大写字母转小写4 4 4 4))))trim(xtrim(xtrim(xtrim(x) ) ) ),去掉,去掉,去掉,去掉x x x x的首部和尾部空格的首部和尾部空格的首部和尾部空格的首部和尾部空格 ltrim(xltrim(xltrim(xltrim(x) ) ) ),去掉,去掉,去掉,去掉x x x x的首部空格的首部空格的首部空格的首部空格 rtrim(xrtrim(xrtrim(xrtrim(x) ) ) ),去掉,去掉,去掉,去掉x x x x的尾部空格的尾部空格的尾部空格的尾部空格5 5 5 5))))instrinstrinstrinstr( ( ( (起始位置,字串起始位置,字串起始位置,字串起始位置,字串s1s1s1s1,字串,字串,字串,字串s2s2s2s2,比较方式,比较方式,比较方式,比较方式) ) ) );;;; 返回字串返回字串返回字串返回字串s2s2s2s2在字串在字串在字串在字串s1s1s1s1中最早出现的位置,返回值是一个整数。
中最早出现的位置,返回值是一个整数中最早出现的位置,返回值是一个整数中最早出现的位置,返回值是一个整数6 6 6 6)字符串截取函数)字符串截取函数)字符串截取函数)字符串截取函数Left(
的整数,表示星期几的整数,表示星期几的整数,表示星期几说明:说明:说明:说明:n n为可选项,默认值为可选项,默认值为可选项,默认值为可选项,默认值1 1当n n取值为取值为取值为取值为1 1时,星期天返回时,星期天返回时,星期天返回时,星期天返回1 1,星期一返回,星期一返回,星期一返回,星期一返回2 2,,,,……,依次类推若,依次类推若,依次类推若,依次类推若n n取值为取值为取值为取值为2 2,则星期一返回,则星期一返回,则星期一返回,则星期一返回1 1,星期二返回,星期二返回,星期二返回,星期二返回2 2,,,,……,星期天返回,星期天返回,星期天返回,星期天返回7 73 3))))截取时间分量函数截取时间分量函数截取时间分量函数截取时间分量函数hour(x),minute(x),second(xhour(x),minute(x),second(x) )8.3.5 8.3.5 常用常用标准函准函数数(4)时间间隔函数DateAdd(<间隔类型>,<间隔值>,<表达式>),对表达式表示的日期按照间隔类型加上或减去指定的时间间隔值5)计算两个日期的间隔值函数DateDiff(<间隔类型>,<日期1>,<日期2>[,W1][,W2]),返回日期1和日期2之间按照间隔类型所指定的时间间隔数目。
6)返回日期指定时间部分函数DatePart (<间隔类型>,<日期>[,W1][,W2])(7)返回包含指定年月日的日期函数DateSerial(表达式1,表达式2,表达式3),返回由表达式1值为年、表达式2值为月、表达式3值为日组成的日期值8.3.5 8.3.5 常用常用标准函准函数数4 4 4 4....类类型型型型转换转换函函函函数数数数函数函数转换后类型转换后类型说明说明CByte(xCByte(x) )ByteBytex x取值范围同取值范围同ByteByte,小数部分四舍五入,超出,小数部分四舍五入,超出范围显示范围显示“溢出溢出”CInt(xCInt(x) )IntegerIntegerx x取值范围同取值范围同IntegerInteger,小数部分四舍五入,小数部分四舍五入CLng(xCLng(x) )LongLongx x取值范围同取值范围同LongLong,小数部分四舍五入,小数部分四舍五入CSng(xCSng(x) )SingleSinglex x取值范围同取值范围同SingleSingleCDbl(xCDbl(x) )DoubleDoublex x取值范围同取值范围同DoubleDoubleCCur(xCCur(x) )CurrencyCurrencyx x取值范围同取值范围同CurrencyCurrencyCBool(xCBool(x) )BooleanBooleanx x取值范围是任何有效数字或字串取值范围是任何有效数字或字串CDate(xCDate(x) )DateDatex x取值范围是任何有效日期表达式取值范围是任何有效日期表达式CStr(xCStr(x) )StringString无无CVar(xCVar(x) )VariantVariantx x如果是数值范围同如果是数值范围同DoubleDouble,否则,与,否则,与StringString相同相同8.3.5 8.3.5 常用常用标准函准函数数表8.8 “C-”开头的类型转换函数4 4 4 4....类类型型型型转换转换函函函函数数数数((((1 1 1 1))))asc(xasc(xasc(xasc(x) ) ) ),返回首字符的,返回首字符的,返回首字符的,返回首字符的ASCIIASCIIASCIIASCII码,其中,码,其中,码,其中,码,其中,x x x x是字符串或字符串变量名。
是字符串或字符串变量名是字符串或字符串变量名是字符串或字符串变量名 说明:说明:说明:说明:ASCIIASCIIASCIIASCII码是美国标准信息转换码,共码是美国标准信息转换码,共码是美国标准信息转换码,共码是美国标准信息转换码,共128128128128个字符,对应十进制数个字符,对应十进制数个字符,对应十进制数个字符,对应十进制数0 0 0 0~~~~1271271271272 2 2 2))))chr(nchr(nchr(nchr(n) ) ) ),将数字,将数字,将数字,将数字n n n n转换成相应字符,转换成相应字符,转换成相应字符,转换成相应字符,n n n n的取值范围的取值范围的取值范围的取值范围0 0 0 0~~~~1271271271273 3 3 3))))str(nstr(nstr(nstr(n) ) ) ),将数字转换为字符串,,将数字转换为字符串,,将数字转换为字符串,,将数字转换为字符串,n n n n是数字或数字表达式是数字或数字表达式是数字或数字表达式是数字或数字表达式 说明:当数字转换为字符串时,总会在前头留一个符号位,如果是正说明:当数字转换为字符串时,总会在前头留一个符号位,如果是正说明:当数字转换为字符串时,总会在前头留一个符号位,如果是正说明:当数字转换为字符串时,总会在前头留一个符号位,如果是正数,符号位显示空格。
数,符号位显示空格数,符号位显示空格数,符号位显示空格4 4 4 4))))val(xval(xval(xval(x) ) ) ),将数字型字符串转换为数字,,将数字型字符串转换为数字,,将数字型字符串转换为数字,,将数字型字符串转换为数字,x x x x是数字型字符串是数字型字符串是数字型字符串是数字型字符串 说明:转换时自动将空格、制表符、换行符去掉,当遇到第一个不能说明:转换时自动将空格、制表符、换行符去掉,当遇到第一个不能说明:转换时自动将空格、制表符、换行符去掉,当遇到第一个不能说明:转换时自动将空格、制表符、换行符去掉,当遇到第一个不能识别为数字的字符时即停止读入识别为数字的字符时即停止读入识别为数字的字符时即停止读入识别为数字的字符时即停止读入 比较:csng() cdbl() cint() clng() ccur() cbool() cdate()8.3.5 8.3.5 常用常用标准函准函数数(5)字符串转日期函数 datevalue(x) 如:datevalue(“february 29,2004”) (6)处理空值的函数 Nz• Nz函数可以将Null值转换为数字0、空字串或自定义的返回值。
• 格式:Nz(变量/表达式/字段属性名[,指定值])• 说明:指定值是可选项若给出指定值,Nz函数返回指定值若省略指定值,当类型为数值型且值为Null,Nz函数返回数字0当类型为字符型且值为Null,Nz函数返回空字串例:如果文本框为空,显示提示信息 (1)在窗体建文本框→名称为t1→附加标签标题为“输入数值”2)在窗体建标签→名称为b1→标题为“空”; 建标签→名称为label2→标题为“输入的内容为:”(3)在窗体建命令按钮→标题为“验证”→名称为c14)c1的click事件代码: Dim aa As String aa = Nz(t1.Value, "文本框不能为空!") MsgBox aa b1.Caption = Nz(t1.Value)(5)转到窗体视图,文本框为空时单击命令按钮,显示消息 (6)在文本框中输入字串“abc123”,单击命令按钮,显示结果 补充:充:1 1 1 1....输输出函出函出函出函数数数数MsgBoxMsgBoxMsgBoxMsgBox 格式:格式:格式:格式:msgboxmsgboxmsgboxmsgbox((((显示信息显示信息显示信息显示信息,,,,按钮数目按钮数目按钮数目按钮数目+ + + +图标类型图标类型图标类型图标类型,,,,标题栏字符串标题栏字符串标题栏字符串标题栏字符串))))功能:功能:功能:功能:在对话框中显示消息,等待用户单击按钮,返回一个整数,在对话框中显示消息,等待用户单击按钮,返回一个整数,在对话框中显示消息,等待用户单击按钮,返回一个整数,在对话框中显示消息,等待用户单击按钮,返回一个整数,该值代表用户单击了哪个按钮。
该值代表用户单击了哪个按钮该值代表用户单击了哪个按钮该值代表用户单击了哪个按钮值值值值按钮数目与样式按钮数目与样式按钮数目与样式按钮数目与样式0只显示确定按钮1显示确定和取消2显示放弃、重试和取消3显示是、否和取消4显示是、否5显示重试和取消2 2 2 2....输输入函入函入函入函数数数数inputboxinputboxinputboxinputbox格式:格式:格式:格式:inputboxinputboxinputboxinputbox((((提示信息提示信息提示信息提示信息,,,,标题栏字符串标题栏字符串标题栏字符串标题栏字符串,,,,默认值默认值默认值默认值))))功能:功能:功能:功能:提示用户输入一个字符串或数值提示用户输入一个字符串或数值提示用户输入一个字符串或数值提示用户输入一个字符串或数值说明:说明:说明:说明:((((1 1 1 1))))““““提示信息提示信息提示信息提示信息””””是必选项,是一个字符串,显示在输入是必选项,是一个字符串,显示在输入是必选项,是一个字符串,显示在输入是必选项,是一个字符串,显示在输入框中2 2 2 2))))““““标题栏字符串标题栏字符串标题栏字符串标题栏字符串””””是可选项,省略此项,标题栏将显是可选项,省略此项,标题栏将显是可选项,省略此项,标题栏将显是可选项,省略此项,标题栏将显示应用程序名。
示应用程序名示应用程序名示应用程序名3 3 3 3)默认值是可选项,是字串或数字,省略此项,系统会)默认值是可选项,是字串或数字,省略此项,系统会)默认值是可选项,是字串或数字,省略此项,系统会)默认值是可选项,是字串或数字,省略此项,系统会自动匹配数据类型自动匹配数据类型自动匹配数据类型自动匹配数据类型4 4 4 4)函数返回值是在输入框中输入的数字或字符串函数返回值是在输入框中输入的数字或字符串函数返回值是在输入框中输入的数字或字符串函数返回值是在输入框中输入的数字或字符串3..验证函数验证函数函数名功能IsNumeric(x)验证x是否为数值,若返回true, 是数值IsDate(x)验证x是否为日期值,若返回true, 是日期或可识别的有效日期IsNull(x)验证x是否为无效值,若返回true,是无效值IsEmpty(x)验证x是否已被初始化,若返回true,未被初始化IsArray(x)验证x是否为数组,若返回true,是数组IsError(x)验证x是否为一个错误值,若返回true,有错误IsObject(x)验证x是否为对象变量,若返回true,是对象VBAVBAVBAVBA的常用验证函数的常用验证函数的常用验证函数的常用验证函数 补充 计算外部数据源数据的函数2 2..DavgDavg函数函数格式:格式:DavgDavg((" "字段名字段名" ",," "表名表名" ",," "条件表达式条件表达式" "))功能:对指定字段求平均值。
功能:对指定字段求平均值说明:若省略条件表达式,对全体字段求平均值说明:若省略条件表达式,对全体字段求平均值例如:例如:davgdavg("("年龄年龄","","学生学生","","性别性别='='男男'")'")3 3..DsumDsum函数函数格式:格式:DsumDsum((" "字段名字段名" ",," "表名表名" ",," "条件表达式条件表达式" "))功能:对指定字段求和功能:对指定字段求和说明:若省略条件表达式,对全体字段求和说明:若省略条件表达式,对全体字段求和例如:例如:dsumdsum("("年龄年龄","","学生学生","","性别性别='='男男'")'") 除了之前介绍过的函数除了之前介绍过的函数, ,还有以下函数还有以下函数: : 1.dlookup 1.dlookup函数函数 格式格式: :dlookupdlookup((““字段名字段名””,,““表名表名””,,““条件表达式条件表达式””)) 功能功能: :获取特定字段的值获取特定字段的值 例如例如:?:?dlookupdlookup("("姓名姓名","","教师教师","","性别性别='='男男'")'") 4 4..DcountDcount函数函数格式:格式:DcountDcount((" "字段名字段名" ",," "表名表名" ",," "条件表达式条件表达式" "))功能:对指定字段统计个数。
功能:对指定字段统计个数说明:若省略条件表达式,对全体字段统计个数说明:若省略条件表达式,对全体字段统计个数例如:例如:DcountDcount("("编号编号","","教师教师","","性别性别='='女女'")'") 5.dmax 5.dmax函数函数 6.dmin6.dmin函数函数例例: :统计外部表数据统计外部表数据 外部数据外部数据: :(1)(1)在窗体建在窗体建5 5个文本框个文本框→→名称为名称为t1t1、、t2t2、、t3t3、、t4t4、、t5→t5→附加标签附加标签的标题分别为的标题分别为““考试科目数考试科目数””、、““考试总分考试总分””、、““平均学分平均学分””、、““最高分最高分””,,““最高分科目最高分科目””2)(2)在窗体建立标签在窗体建立标签→→名称为名称为b1b1((3 3)代码如下:)代码如下:Option Compare DatabaseOption Compare DatabasePublic Public xmxm As String As StringPrivate Sub Private Sub Form_LoadForm_Load()() xmxm = = InputBoxInputBox("("请输入要统计的姓名请输入要统计的姓名:"):") b1.Caption = b1.Caption = xmxm + " + "的成绩统计的成绩统计" " t1 = t1 = DCountDCount("("课程名称课程名称", "", "学生个人成绩学生个人成绩", "", "姓名姓名= =xmxm")") t2 = t2 = DSumDSum("("成绩成绩", "", "学生个人成绩学生个人成绩", "", "姓名姓名= =xmxm")") t3 = t3 = DAvgDAvg("("学分学分", "", "学生个人成绩学生个人成绩", "", "姓名姓名= =xmxm")") t4 = t4 = DMaxDMax("("成绩成绩", "", "学生个人成绩学生个人成绩", "", "姓名姓名= =xmxm")") t5 = t5 = DLookupDLookup("("课程名称课程名称", "", "学生个人成绩学生个人成绩", "", "姓名姓名= =xmxm and and 成绩成绩=t4")=t4")End SubEnd Sub一、运算符一、运算符•算术运算符: + 、 - 、*、 / 、\、 ^、 Mod•关系运算符:=、<、> 、<= 、 >= 、 < >•逻辑运算符:AND、OR、NOT•连接运算符:&、+8.3.6 运算符和表达式运算符和表达式8.3.6 8.3.6 运运算符算符与与表表达达式式 1. 运算符运算符VBA中的运算符可分为中的运算符可分为4种类型:算术运算符、字种类型:算术运算符、字符串运算符、关系运算符和逻辑运算符。
符串运算符、关系运算符和逻辑运算符1) (1) 算术运算符算术运算符 算术运算符是常用的运算符,用来执行简单的算术算术运算符是常用的运算符,用来执行简单的算术运算,运算,VBA提供了提供了7个算术运算符个算术运算符 乘幂(乘幂(^)、乘法()、乘法(*)、除法()、除法(/)、整数除法()、整数除法(\)、)、求模(求模(mod)、加法()、加法(+)、减法()、减法(-)运运运运算符算符算符算符算术运算符算术运算符算术运算符算术运算符 将两个将两个将两个将两个操作操作操作操作数数数数进进行大小比行大小比行大小比行大小比较较,,,,结结果果果果为逻辑值为逻辑值, , , ,即即即即真真真真(True)(True)(True)(True)或假或假或假或假(False)(False)(False)(False) 相等相等相等相等 = = = =、、、、 不相等不相等不相等不相等 <><><><>、、、、 大于大于大于大于 > > > >、、、、 大于等于大于等于大于等于大于等于 >=>=>=>=、、、、 小于小于小于小于 < < < <、、、、 小于等于小于等于小于等于小于等于 <=<=<=<=。
注意:注意:注意:注意: ? ? ? ? 字符串比字符串比字符串比字符串比较较, , , ,则则按字符按字符按字符按字符从从从从左到右一一比左到右一一比左到右一一比左到右一一比较较,直到出,直到出,直到出,直到出现现不同的字符不同的字符不同的字符不同的字符为为止 默默默默认认不不不不区区区区分大小分大小分大小分大小写写写写2) (2) 关系运算符关系运算符(2) (2) 关系运算符关系运算符将将将将操作操作操作操作数数数数进进行行行行逻辑逻辑运运运运算,算,算,算,结结果是果是果是果是逻辑值逻辑值 与与与与andand、或、或、或、或oror、非、非、非、非notnot 对对两个两个两个两个逻辑值进逻辑值进行比行比行比行比较较,,,,结结果仍然是果仍然是果仍然是果仍然是逻辑值逻辑值3) (3) 逻辑运算符逻辑运算符(3) (3) 逻辑运算符逻辑运算符 (4) (4) 字符串连接运算符字符串连接运算符 字符串连接运算就是将两个字符串连接起来生成字符串连接运算就是将两个字符串连接起来生成一个新的字符串。
一个新的字符串字符串运算符包括:字符串运算符包括: +运算符运算符 &运算符运算符 + + + + 运运运运算符:算符:算符:算符:用来连接两个用来连接两个字符串字符串字符串字符串表达式,形成一个新的字表达式,形成一个新的字符串注意:注意:注意:注意:“ “+”+”运算符要求两边的操作数都是字符串运算符要求两边的操作数都是字符串运算符要求两边的操作数都是字符串运算符要求两边的操作数都是字符串例例】】 “ +”运算符应用示例运算符应用示例4321”+1234 ‘结果为数值:结果为数值:5555“4321”+“1234”‘结果为结果为 "43211234""abcd"+1234 '出错出错4321+“1234” & 100 ‘结果结果"5555100" & & & & 运运运运算符:算符:算符:算符:将两个不同类型的数据(将两个不同类型的数据(表达式的值表达式的值表达式的值表达式的值)作字符串连接作字符串连接 例如:例如:1&“+”&2&“等于等于”&1+2 ‘结果为:结果为: “1+2等于等于3”注意:注意:由于符号由于符号“&”还是长整型的类型定义符,在字符串变量后使还是长整型的类型定义符,在字符串变量后使用运算符用运算符“&”时,时,变量与运算符变量与运算符变量与运算符变量与运算符“ “&”&”之间应加一个空格之间应加一个空格之间应加一个空格之间应加一个空格。
运算符运算符“&”两边的操作数可以是字符型,也可以是数值型两边的操作数可以是字符型,也可以是数值型不管是字符型还是数值型,进行连接操作前,系统先进行操作不管是字符型还是数值型,进行连接操作前,系统先进行操作数类型转换,数值型转换成字符型,然后再做连接运算数类型转换,数值型转换成字符型,然后再做连接运算 例如:例如:12&56 ‘结果为结果为 “1256”(5) (5) 对象运算符对象运算符对象运算符用来指示随后出现的项目类型,有对象运算符用来指示随后出现的项目类型,有对象运算符用来指示随后出现的项目类型,有对象运算符用来指示随后出现的项目类型,有叹号运算符叹号运算符叹号运算符叹号运算符! ! ! !和和和和点运算符点运算符点运算符点运算符. . . .1 1)叹号运算符)叹号运算符)叹号运算符)叹号运算符 ! !,引用一个窗体、报表或控件引用一个窗体、报表或控件引用一个窗体、报表或控件引用一个窗体、报表或控件 例如:例如:例如:例如:forms!forms!学生信息窗体学生信息窗体学生信息窗体学生信息窗体!t1!t1((((2 2)点运算符)点运算符)点运算符)点运算符 . . ,引用对象的属性。
引用对象的属性引用对象的属性引用对象的属性 例如:例如:例如:例如:Me!t1.forecolor=255Me!t1.forecolor=255二二 表表达达式和式和优先先级(1) (1) 表达式的组成表达式的组成表达式的组成表达式的组成 表达式由常量、变量、运算符、函数、逻辑量表达式由常量、变量、运算符、函数、逻辑量表达式由常量、变量、运算符、函数、逻辑量表达式由常量、变量、运算符、函数、逻辑量和括号等按一定的规则组成的式子表达式通过运和括号等按一定的规则组成的式子表达式通过运和括号等按一定的规则组成的式子表达式通过运和括号等按一定的规则组成的式子表达式通过运算得出结果,运算结果的类型由操作数的数据和运算得出结果,运算结果的类型由操作数的数据和运算得出结果,运算结果的类型由操作数的数据和运算得出结果,运算结果的类型由操作数的数据和运算符共同决定算符共同决定算符共同决定算符共同决定书写规则书写规则书写规则书写规则 (1) (1) 运算符不能相邻例运算符不能相邻例运算符不能相邻例运算符不能相邻例a+ -ba+ -b是错误的是错误的。
是错误的是错误的 (2) (2) 乘号不能省略例乘号不能省略例乘号不能省略例乘号不能省略例x x 乘以乘以乘以乘以y y 应写成:应写成:应写成:应写成:x*yx*y (3) (3) 括号必须成对出现,均使用圆括号括号必须成对出现,均使用圆括号括号必须成对出现,均使用圆括号括号必须成对出现,均使用圆括号 (4) (4) 表达式从左到右在同一基准上书写,无高低表达式从左到右在同一基准上书写,无高低表达式从左到右在同一基准上书写,无高低表达式从左到右在同一基准上书写,无高低运算优先级运算优先级运算优先级运算优先级 算术运算符算术运算符算术运算符算术运算符 > > 连接运算符连接运算符连接运算符连接运算符 > > 关系运算符关系运算符关系运算符关系运算符 > > 逻辑运算符逻辑运算符逻辑运算符逻辑运算符 优先级相同的从左到右顺序处理优先级相同的从左到右顺序处理优先级相同的从左到右顺序处理优先级相同的从左到右顺序处理 括号优先级最高括号优先级最高括号优先级最高括号优先级最高 二 表达式和优先级二、表达式和优先级•将常量和变量用各种运算符连接在一起构成的式子就叫表达式。
优先级优先级 高高 低低高高低低算术运算符算术运算符连接运算符连接运算符关系运算符关系运算符逻辑运算符逻辑运算符^&+=<><><=>=NOT负数负数(-)AND* 和和 /OR整数除法整数除法(\)Mod+和和-例:例:例:例:用人单位招聘:年龄小于用人单位招聘:年龄小于用人单位招聘:年龄小于用人单位招聘:年龄小于4040岁的女性,学历专科或本科岁的女性,学历专科或本科岁的女性,学历专科或本科岁的女性,学历专科或本科 年龄年龄年龄年龄<40<40,性别,性别,性别,性别= =“ “女女女女” ”,,,,( (学历学历学历学历= =“ “专科专科专科专科” ”,学历,学历,学历,学历= =“ “本科本科本科本科” ”) ) And And OrAnd And Or例:例:例:例:算术表达式:算术表达式:算术表达式:算术表达式:正确的正确的正确的正确的VBAVBA表达式:表达式:表达式:表达式: 3<=x And x <=73<=x And x <=7错误的错误的错误的错误的VBAVBA表达式:表达式:表达式:表达式: 3<=x<=7 3<=x<=7 或或或或 3<=x Or x<=73<=x Or x<=7 考虑:考虑:考虑:考虑:若分别写成:若分别写成:若分别写成:若分别写成:年龄年龄年龄年龄<40 And <40 And 性别性别性别性别= "= "女女女女" And (" And (学历学历学历学历= "= "专科专科专科专科" And " And 学历学历学历学历= "= "本科本科本科本科")")年龄年龄年龄年龄<40 Or <40 Or 性别性别性别性别= "= "女女女女" Or (" Or (学历学历学历学历= "= "专科专科专科专科" Or " Or 学历学历学历学历= "= "本科本科本科本科")")二 表达式和优先级8.4 VBA8.4 VBA程序流程控制程序流程控制语句句1.VBA程序语句按照功能不同分为:•声明语句:用于给变量、常量或者过程定义命名。
•执行语句:用于执行赋值操作、调用过程、实现各种流程控制2.执行语句分类:•顺序结构:按照语句的顺序顺次执行•条件结构:又称选择结构,根据条件选择执行•循环结构:重复执行某一段程序8.4.1 8.4.1 赋值语句句赋值语句是最基本的语句它的功能是给变量或对象的属性赋值其格式为[Let]<变量名>=<表达式> 或 <对象名.属性>=<表达式>例如:Rate = 0.1 ‘给变量Rate赋值0.1Me!Text1.Value = “欢迎来到闽科 " “给控件的属性赋值8.4.2 条件语句1..if – end if 语句语句格式:格式:格式:格式:if if if if 条件条件条件条件 thenthenthenthen 语句序列语句序列语句序列语句序列 end ifend ifend ifend if功能:若条件成立,执行语句序列,否则,什么也不做功能:若条件成立,执行语句序列,否则,什么也不做功能:若条件成立,执行语句序列,否则,什么也不做。
功能:若条件成立,执行语句序列,否则,什么也不做说明:如果语句序列只有一条语句,可简写在一行,说明:如果语句序列只有一条语句,可简写在一行,说明:如果语句序列只有一条语句,可简写在一行,说明:如果语句序列只有一条语句,可简写在一行,并省略并省略并省略并省略 end ifend ifend ifend if语句语句语句语句例:例:例:例:dim a as integer, b as integerdim a as integer, b as integerdim a as integer, b as integerdim a as integer, b as integer a=12 a=12 a=12 a=12::::b=8b=8b=8b=8 if a Then <语句块语句块1>Else <语句块语句块2>End If•说明:说明:•((1))<表达式表达式>可以是任何表达式,一般为关系表达式或布尔表达式。
可以是任何表达式,一般为关系表达式或布尔表达式如果是其他表达式,则非如果是其他表达式,则非0认为是认为是True,,0认为是认为是False•((2)执行时,先判断表达式的值,为)执行时,先判断表达式的值,为True则执行语句块则执行语句块1,否则执,否则执行语句块行语句块28.4.2 条件语句2..If…Then…Else 语句语句 Ø例如:输入两个数并在立即窗口输出其中较大的数例如:输入两个数并在立即窗口输出其中较大的数ØDim x As Integer, y As IntegerØx = InputBox("请输入请输入x的值的值:")Øy = InputBox("请输入请输入y的值的值:")ØIf x > y ThenØ Debug.Print xØElseØ Debug.Print yØEnd If8.4.2 条件语句3..If…Then…ElseIf 语句语句 语句格式为语句格式为If <表达式表达式1> Then <语句块语句块1>ElseIf <表达式表达式2>Then <语句块语句块2>…[ElseIf <表达式表达式n>Then <语句块语句块n>Else <语句块语句块 n+1> ]End If运行时,从表达式运行时,从表达式1开始逐个测试条件,当找到第一个为开始逐个测试条件,当找到第一个为True的条件时,的条件时,即执行该条件后所对应的语句块。
即执行该条件后所对应的语句块8.4.2 条件语句8.4.2 条件语句If <条件表达式条件表达式1> Then <执行语句系列执行语句系列1>Else If <条件表达式条件表达式2> Then<执行语句系列执行语句系列2>Else<执行语句系列执行语句系列3>End IfEnd IfIf <条件表达式1> Then <执行语句系列1>ElseIf <条件表达式2> Then<执行语句系列2>Else<执行语句系列3>End If选择结构练习1.1.新建窗体;新建窗体;新建窗体;新建窗体;2.2.在窗体中建立在窗体中建立在窗体中建立在窗体中建立4 4个文本框个文本框个文本框个文本框→→名称为名称为名称为名称为t1t1, , t2t2, , t3t3, , t4t4 → →标签分标签分标签分标签分别为成绩别为成绩别为成绩别为成绩1 1、成绩、成绩、成绩、成绩2 2、成绩、成绩、成绩、成绩3 3、平均成绩、平均成绩、平均成绩、平均成绩; ;3.3.建立建立建立建立2 2个命令按钮个命令按钮个命令按钮个命令按钮→→名称为名称为名称为名称为c1c1、、、、c2c2 → →标题为标题为标题为标题为“ “清空清空清空清空” ”和和和和“ “计算计算计算计算” ”,如图所示;,如图所示;,如图所示;,如图所示;4. 4.C1C1的单击事件代码为:的单击事件代码为:的单击事件代码为:的单击事件代码为: Private Sub c1_Click() Private Sub c1_Click() Me!t1 = "" Me!t1 = "" Me!t2 = "" Me!t2 = "" Me!t3 = "" Me!t3 = "" Me!t4 = "" Me!t4 = "" End Sub End Sub选择结构练习5.5. c2c2的单击事件代码为:的单击事件代码为:的单击事件代码为:的单击事件代码为: Private Sub c2_Click()Private Sub c2_Click()If Me!t1 = "" Or Me!t2 = "" Or Me!t3 = "" ThenIf Me!t1 = "" Or Me!t2 = "" Or Me!t3 = "" Then MsgBoxMsgBox " "成绩输入不全成绩输入不全成绩输入不全成绩输入不全!"!"ElseElse Me!t4 = (Val(Me!t1) + Val(Me!t2) + Val(Me!t3)) / 3 Me!t4 = (Val(Me!t1) + Val(Me!t2) + Val(Me!t3)) / 3End IfEnd IfEnd SubEnd Sub选择结构练习4. Select Case…End Select语句•语句结构:Select Case <表达式表达式>Case <表达式表达式1><执行语句系列执行语句系列>Case <表达式表达式2 To 表达式表达式3 ><执行语句系列执行语句系列>Case Is <关系运算符关系运算符 表达式表达式4 ><执行语句系列执行语句系列>Case Else <执行语句系列执行语句系列>End Select8.4.2 条件语句4. Select Case…End Select语句Private Sub Command4_Click() Dim m As Integer, dj As String m = Text0.Value \ 10 Select Case m Case 9, 10 dj = "优秀优秀" Case 6 To 8 dj = "合格合格" Case Is < 6 dj = "不合格不合格" Case Else dj = "缺考缺考" End Select Text2. value= djEnd Sub8.4.2 条件语句4..Select Case—End Select 语句语句 说明:说明:((1))Select Case后的变量或表达式只能是数值型或字符型表后的变量或表达式只能是数值型或字符型表达式。
达式2)执行过程是先计算)执行过程是先计算Select Case后的变量或表达式的值,后的变量或表达式的值,然后从上至下逐个比较,决定执行哪一个语句块如果有多然后从上至下逐个比较,决定执行哪一个语句块如果有多个个Case后的表达式列表与其相匹配,则只执行第一个后的表达式列表与其相匹配,则只执行第一个Case后的语句块后的语句块3)语句中的各个表达式列表应与)语句中的各个表达式列表应与Select Case后的变量或表后的变量或表达式同类型各个表达式列表可以采用下面的达式同类型各个表达式列表可以采用下面的4种写法形式种写法形式 ·单一数值或表达式单一数值或表达式 a +5 ·一行并列数值,之间用逗号分隔一行并列数值,之间用逗号分隔 2, 4, 6, 8 ·数值数值1 to 数值数值2,前一个值必须比后一个值小前一个值必须比后一个值小 60 to 100 ·用用is开头的简单条件式,如开头的简单条件式,如 is>10不允许复杂条件式不允许复杂条件式8.4.2 条件语句1 1 1 1....iifiifiifiif函数函数函数函数格式:格式:格式:格式:iifiifiifiif( ( ( (条件,表达式条件,表达式条件,表达式条件,表达式1 1 1 1,表达式,表达式,表达式,表达式2)2)2)2)功能:功能:功能:功能:如果条件为真,函数值为表达式如果条件为真,函数值为表达式如果条件为真,函数值为表达式如果条件为真,函数值为表达式1 1 1 1的值,否则,函数值为表的值,否则,函数值为表的值,否则,函数值为表的值,否则,函数值为表达式达式达式达式2 2 2 2的值。
的值例:例:例:例:Max=IIf(a>b,a,b)2 2 2 2....switchswitchswitchswitch函数函数函数函数格式:格式:格式:格式:switch(switch(switch(switch(条件条件条件条件1 1 1 1,表达式,表达式,表达式,表达式1 1 1 1,条件,条件,条件,条件2 2 2 2,表达式,,表达式,,表达式,,表达式,…………,条件,条件,条件,条件n n n n,表,表,表,表达式达式达式达式n)n)n)n)功能:功能:功能:功能:从左到右依次判断,遇到第一个条件为真时返回对应表达式从左到右依次判断,遇到第一个条件为真时返回对应表达式从左到右依次判断,遇到第一个条件为真时返回对应表达式从左到右依次判断,遇到第一个条件为真时返回对应表达式的值说明:说明:说明:说明:条件与表达式成对,当多个条件为真时,只取第一个条件的条件与表达式成对,当多个条件为真时,只取第一个条件的条件与表达式成对,当多个条件为真时,只取第一个条件的条件与表达式成对,当多个条件为真时,只取第一个条件的对应表达式对应表达式对应表达式对应表达式例:例:例:例:y= Switch(x>0,1,x=0,0,x<0,-1)5 条件函数3 3 3 3....choosechoosechoosechoose函数函数函数函数格式:格式:格式:格式:choose(choose(choose(choose(索引式,值索引式,值索引式,值索引式,值1 1 1 1,值,值,值,值2 2 2 2,,,,…………,值,值,值,值n)n)n)n)功能:功能:功能:功能:根据索引项的值,返回对应的值。
根据索引项的值,返回对应的值根据索引项的值,返回对应的值根据索引项的值,返回对应的值说明说明说明说明::::索引项通常是整型变量名,取值范围索引项通常是整型变量名,取值范围索引项通常是整型变量名,取值范围索引项通常是整型变量名,取值范围1 1 1 1~~~~n n n n,超出范围时返回,超出范围时返回,超出范围时返回,超出范围时返回NULLNULLNULLNULL例如:例如:例如:例如:y= Choose(x,5,m+1,n)4 4 4 4.计时器事件.计时器事件.计时器事件.计时器事件 VBAVBAVBAVBA没有直接提供时间控件,通过没有直接提供时间控件,通过没有直接提供时间控件,通过没有直接提供时间控件,通过timertimertimertimer事件实现定时功能事件实现定时功能事件实现定时功能事件实现定时功能方法方法方法方法:首先设置窗体的计时器间隔属性:首先设置窗体的计时器间隔属性:首先设置窗体的计时器间隔属性:首先设置窗体的计时器间隔属性TimerIntervalTimerIntervalTimerIntervalTimerInterval,然后给,然后给,然后给,然后给timertimertimertimer事事事事件写过程代码。
打开窗体时,每隔一个时间间隔激发一次件写过程代码打开窗体时,每隔一个时间间隔激发一次件写过程代码打开窗体时,每隔一个时间间隔激发一次件写过程代码打开窗体时,每隔一个时间间隔激发一次timertimertimertimer事事事事件,事件的过程就被执行一次,从而实现件,事件的过程就被执行一次,从而实现件,事件的过程就被执行一次,从而实现件,事件的过程就被执行一次,从而实现““““定时定时定时定时””””处理功能处理功能处理功能处理功能计时器间隔的时间单位为毫秒,计时器间隔的时间单位为毫秒,计时器间隔的时间单位为毫秒,计时器间隔的时间单位为毫秒,1000100010001000毫秒毫秒毫秒毫秒=1=1=1=1秒 ( ( ( (补充例补充例补充例补充例 倒计时)倒计时)倒计时)倒计时)例例8-16:8-16:显示示电子表子表((((1 1 1 1)建立)建立)建立)建立2 2 2 2个标签个标签个标签个标签→→→→名称为名称为名称为名称为b1b1b1b1和和和和b2→b2→b2→b2→标题都为数字标题都为数字标题都为数字标题都为数字1 1 1 12 2 2 2)打开窗体的属性窗口)打开窗体的属性窗口)打开窗体的属性窗口)打开窗体的属性窗口→→→→单击单击单击单击““““事件事件事件事件””””选项卡选项卡选项卡选项卡→→→→设置计时器设置计时器设置计时器设置计时器 间隔属性为间隔属性为间隔属性为间隔属性为1000100010001000。
3 3 3 3)在)在)在)在VBEVBEVBEVBE窗口窗口窗口窗口““““通用通用通用通用- - - -声明声明声明声明””””写代码:写代码:写代码:写代码: Public a As Boolean 'aPublic a As Boolean 'aPublic a As Boolean 'aPublic a As Boolean 'a为逻辑型,默认为逻辑型,默认为逻辑型,默认为逻辑型,默认falsefalsefalsefalse((((4 4 4 4))))FormFormFormForm的的的的TimerTimerTimerTimer事件代码:事件代码:事件代码:事件代码: a = Not aa = Not aa = Not aa = Not a b1.Caption = Time() b1.Caption = Time() b1.Caption = Time() b1.Caption = Time() b2.Caption = CInt(b2.Caption) + 1 b2.Caption = CInt(b2.Caption) + 1 b2.Caption = CInt(b2.Caption) + 1 b2.Caption = CInt(b2.Caption) + 1 b2.ForeColor = b2.ForeColor = b2.ForeColor = b2.ForeColor = IIf(aIIf(aIIf(aIIf(a = True, 255, 16711680) = True, 255, 16711680) = True, 255, 16711680) = True, 255, 16711680) ((((5 5 5 5)转到窗体视图。
转到窗体视图转到窗体视图转到窗体视图b1b1b1b1中显示系统当前时间,中显示系统当前时间,中显示系统当前时间,中显示系统当前时间,b2b2b2b2中中中中的数字每秒增加的数字每秒增加的数字每秒增加的数字每秒增加1 1 1 1,数字的颜色红、蓝交替,每,数字的颜色红、蓝交替,每,数字的颜色红、蓝交替,每,数字的颜色红、蓝交替,每秒换一次秒换一次秒换一次秒换一次 6. 条件语句综合实例例8.10设计一个登录窗体,用户名和密码为空给出提示,正确的时候给出“欢迎使用”信息8.4.2 条件语句 当某一程序段需要反复执行,用循环结构当某一程序段需要反复执行,用循环结构当某一程序段需要反复执行,用循环结构当某一程序段需要反复执行,用循环结构实现循环结构对应两类循环语句:实现循环结构对应两类循环语句:实现循环结构对应两类循环语句:实现循环结构对应两类循环语句:pp先判断后执行的循环语句(当型循环结构)先判断后执行的循环语句(当型循环结构)先判断后执行的循环语句(当型循环结构)先判断后执行的循环语句(当型循环结构)pp先执行后判断的循环语句(直到型循环结构)先执行后判断的循环语句(直到型循环结构)先执行后判断的循环语句(直到型循环结构)先执行后判断的循环语句(直到型循环结构)8.4.3 循环语句1 1 1 1....for-nextfor-nextfor-nextfor-next循循循循环环 for-nextfor-nextfor-nextfor-next循环能使语句序列运行指定次数,循环中有一个计循环能使语句序列运行指定次数,循环中有一个计循环能使语句序列运行指定次数,循环中有一个计循环能使语句序列运行指定次数,循环中有一个计数器变量,变量的值随每一次循环增加或减少。
数器变量,变量的值随每一次循环增加或减少数器变量,变量的值随每一次循环增加或减少数器变量,变量的值随每一次循环增加或减少 for-nextfor-nextfor-nextfor-next是当型循环结构,先判断后执行是当型循环结构,先判断后执行是当型循环结构,先判断后执行是当型循环结构,先判断后执行1 1 1 1))))格式:格式:格式:格式:for for for for 循环变量循环变量循环变量循环变量= = = =初值初值初值初值 to to to to 终值终值终值终值 step step step step 步长步长步长步长 语句序列语句序列语句序列语句序列 nextnextnextnext((((2 2 2 2))))功能:功能:功能:功能: 先将初值赋给循环变量,再将循环变量的当前值与终值做比先将初值赋给循环变量,再将循环变量的当前值与终值做比先将初值赋给循环变量,再将循环变量的当前值与终值做比先将初值赋给循环变量,再将循环变量的当前值与终值做比较,如果比较结果为真执行语句序列,增加一个步长,再进行比较,如果比较结果为真执行语句序列,增加一个步长,再进行比较,如果比较结果为真执行语句序列,增加一个步长,再进行比较,如果比较结果为真执行语句序列,增加一个步长,再进行比较,如果比较结果仍为真,继续循环较,如果比较结果仍为真,继续循环较,如果比较结果仍为真,继续循环较,如果比较结果仍为真,继续循环……………………。
如果比较结果为假,如果比较结果为假,如果比较结果为假,如果比较结果为假,结束循环结束循环结束循环结束循环 pp步长大于步长大于步长大于步长大于0 0 0 0时判断循环变量的当前值是否大于终值,步长小于时判断循环变量的当前值是否大于终值,步长小于时判断循环变量的当前值是否大于终值,步长小于时判断循环变量的当前值是否大于终值,步长小于 0 0 0 0判断循环变量的当前值是否小于终值步长为判断循环变量的当前值是否小于终值步长为判断循环变量的当前值是否小于终值步长为判断循环变量的当前值是否小于终值步长为0 0 0 0时导致循环时导致循环时导致循环时导致循环 无法结束,所以步长不要设置为无法结束,所以步长不要设置为无法结束,所以步长不要设置为无法结束,所以步长不要设置为0 0 0 0pp步长可以是整数或小数,步长为步长可以是整数或小数,步长为步长可以是整数或小数,步长为步长可以是整数或小数,步长为1 1 1 1时可以省略时可以省略时可以省略时可以省略pp除第一次循环以外,其他循环增加一个步长后与终值比较除第一次循环以外,其他循环增加一个步长后与终值比较除第一次循环以外,其他循环增加一个步长后与终值比较。
除第一次循环以外,其他循环增加一个步长后与终值比较ppforforforfor循环可以嵌套循环可以嵌套循环可以嵌套循环可以嵌套pp在在在在forforforfor循环中可以用循环中可以用循环中可以用循环中可以用exit forexit forexit forexit for语句强行中止循环语句强行中止循环语句强行中止循环语句强行中止循环3 3 3 3))))说明说明说明说明8.4.3 循环语句1. For…Next•格式:格式:For 循环变量循环变量=初值初值 To 终值终值 [Step 步长步长]循环体循环体[条件语句系列条件语句系列Exit For结束条件语句系列结束条件语句系列]Next [循环变量循环变量]例子例子 计算计算1~100所有所有整数的和整数的和8.4.3 循环语句练习练习练习练习1 1 1 1::::阅读下面程序段,循环结束后,各变量的值是多少?阅读下面程序段,循环结束后,各变量的值是多少?阅读下面程序段,循环结束后,各变量的值是多少?阅读下面程序段,循环结束后,各变量的值是多少? dim s as integer, i as integerdim s as integer, i as integerdim s as integer, i as integerdim s as integer, i as integer s=0 s=0 s=0 s=0 for i=1 to 10 step 2 for i=1 to 10 step 2 for i=1 to 10 step 2 for i=1 to 10 step 2 s= s= s= s=s+is+is+is+i i=i+2 i=i+2 i=i+2 i=i+2 next next next next结论:循环结束后,变量结论:循环结束后,变量结论:循环结束后,变量结论:循环结束后,变量i i i i的值是的值是的值是的值是13131313,变量,变量,变量,变量 s s s s 的值是的值是的值是的值是15151515。
1 1、、、、i=1 s=0+1=1 i=1+2=3i=1 s=0+1=1 i=1+2=3 step 2 i=i+2=5 step 2 i=i+2=52 2、、、、i=5 s=1+5=6 i=5+2=7i=5 s=1+5=6 i=5+2=7 step 2 i=i+2=9 step 2 i=i+2=93 3、、、、i=9 s=6+9=15 i=9+2=11i=9 s=6+9=15 i=9+2=11 step 2 i=i+2=13 step 2 i=i+2=13步长相当于步长相当于步长相当于步长相当于4 4::::for i=1 to 10 step 4for i=1 to 10 step 4 s= s=s+is+i next next练习练习练习练习2 2:下面的程序段使得循环中途退出:下面的程序段使得循环中途退出:下面的程序段使得循环中途退出:下面的程序段使得循环中途退出Dim s as integer, i as integerDim s as integer, i as integerS=0S=0For i=0 to 100 step 2For i=0 to 100 step 2 s= s=s+is+i if s>=20 then exit for ‘ if s>=20 then exit for ‘中途退出循环中途退出循环中途退出循环中途退出循环NextNext分析: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 i的值是的值是的值是的值是8 8,,,, s s 的值是的值是的值是的值是2020。
Dim s as integer, i as integerDim s as integer, i as integerS=0S=0For i=0 to 100 step 2For i=0 to 100 step 2 s= s=s+is+iNextNext1~1001~100之间的偶数之和之间的偶数之和之间的偶数之和之间的偶数之和Dim s as integer, i as integerDim s as integer, i as integerS=0S=0For i=0 to 100 For i=0 to 100 s= s=s+is+iNextNext1~1001~100之间的整数数之和之间的整数数之和之间的整数数之和之间的整数数之和2 2 2 2....do-while-loopdo-while-loopdo-while-loopdo-while-loop循循循循环环 do-while-loopdo-while-loopdo-while-loopdo-while-loop循环是当型循环结构,先判断后执行。
循环是当型循环结构,先判断后执行循环是当型循环结构,先判断后执行循环是当型循环结构,先判断后执行1 1 1 1)格式)格式)格式)格式 do while do while do while do while 循环条件循环条件循环条件循环条件 语句序列语句序列语句序列语句序列 looplooplooploop((((2 2 2 2)功能)功能)功能)功能 先检查循环条件是否成立,若条件为真,执行语句序列先检查循环条件是否成立,若条件为真,执行语句序列先检查循环条件是否成立,若条件为真,执行语句序列先检查循环条件是否成立,若条件为真,执行语句序列遇到遇到遇到遇到looplooplooploop语句时返回循环开始处重新判断,若条件仍然为真,语句时返回循环开始处重新判断,若条件仍然为真,语句时返回循环开始处重新判断,若条件仍然为真,语句时返回循环开始处重新判断,若条件仍然为真,再次执行语句序列再次执行语句序列再次执行语句序列再次执行语句序列……………………。
当条件为假时退出循环当条件为假时退出循环当条件为假时退出循环当条件为假时退出循环8.4.3 循环语句((((3 3 3 3)说明)说明)说明)说明····可以用可以用可以用可以用exit doexit doexit doexit do强行中止循环强行中止循环强行中止循环强行中止循环····要考虑循环变量赋初值和给循环变量增加步长的问题要考虑循环变量赋初值和给循环变量增加步长的问题要考虑循环变量赋初值和给循环变量增加步长的问题要考虑循环变量赋初值和给循环变量增加步长的问题····如果将如果将如果将如果将whilewhilewhilewhile换成换成换成换成untiluntiluntiluntil,当条件为真时循环结束当条件为真时循环结束当条件为真时循环结束当条件为真时循环结束练习:练习:练习:练习:例子例子 计算计算1~100所有所有整数的和整数的和3..Do Until…Loop语句语句 形式如下:形式如下:Do Until <条件条件> 循环体循环体 Exit Do 语句块语句块Loop8.4.3 循环语句3..Do Until…Loop语句语句 说明:说明:((1)这里的条件可以是任何类型的表达式,非)这里的条件可以是任何类型的表达式,非0为为真,真,0为假。
为假2)执行过程是:在每次循环开始时测试条件,)执行过程是:在每次循环开始时测试条件,对于对于Do Until语句,如果条件不成立,则执行循语句,如果条件不成立,则执行循环体的内容,然后回到环体的内容,然后回到Do Until处准备下一次循处准备下一次循环;如果条件成立,则退出循环环;如果条件成立,则退出循环3))Exit Do语句的作用是提前终止循环语句的作用是提前终止循环8.4.3 循环语句3..Do Until…Loop语句语句 例如例如 ::下面的程序用下面的程序用Do Until…Loop语句求语句求1+2+3…+10之和Dim s As Integer, i As Integers = 0i = 1Do Until i > 10 s = s + i i = i + 1LoopDebug.Print s8.4.3 循环语句4..Do Loop While语句语句 格式如下:格式如下:Do 循环体循环体 Exit Do 语句块语句块Loop While<条件条件>8.4.3 循环语句4..Do Loop While语句语句 说明:说明:和和Do While…Loop不同的是,不同的是, Do—Loop While语句在每次循环结束时测试条件。
因此,语句在每次循环结束时测试条件因此,二者的区别是如果一开始循环条件就不成立,则二者的区别是如果一开始循环条件就不成立,则Do While…Loop中的循环体部分一次也不执行,中的循环体部分一次也不执行,而而Do—Loop While 中的循环体部分被执行一中的循环体部分被执行一次 8.4.3 循环语句5..Do - Loop Until语句语句 格式如下:格式如下:Do 循环体循环体 Exit Do 语句块语句块Loop Until<条件条件>8.4.3 循环语句5..Do - Loop Until语句语句 说明:说明:和Do Until…Loop不同的是, Do—Loop Until语句在每次循环结束时测试条件因此,二者的区别是如果一开始循环条件就不成立,则Do Until…Loop中的循环体部分一次也不执行,而Do—Loop Until中的循环体部分被执行一次 8.4.3 循环语句6. While…Wend•格式:格式:While 条件式条件式循环体循环体Wend和和Do…While语句功语句功能一样,所以很少能一样,所以很少用,主要是为了兼用,主要是为了兼容容Qbasic8.4.3 循环语句6..While…Wend说明:说明:(1) While---Wend循环与循环与 Do While …Loop结构结构类似,但不能在类似,但不能在While---Wend循环中使用循环中使用Exit Do语句。
语句2)在在VBA中,尽量不要使用中,尽量不要使用While---Wend循环8.4.3 循环语句8.4.4 其他语句-标号和GoTo语句GoTo语句用于实现无条件转移使用格式为:GoTo标号 程序运行到此结构,会无条件转移到其后的“标号”位置,并从那里继续执行GoTo语句使用时,“标号”位置必须首先在程序中定义好,否则转移无法实现 循循循循环结环结构构构构示例:示例:示例:示例:显显示示示示FibonacciFibonacciFibonacciFibonacci数数数数列的第列的第列的第列的第15151515个个个个元素元素元素元素 ((((FibonacciFibonacciFibonacciFibonacci数列的前两个数都是数列的前两个数都是数列的前两个数都是数列的前两个数都是1 1 1 1,从第,从第,从第,从第3 3 3 3个数开始,每个个数开始,每个个数开始,每个个数开始,每个数都是前两个数之和数都是前两个数之和数都是前两个数之和数都是前两个数之和 ((((1 1 1 1)建立文本框)建立文本框)建立文本框)建立文本框→→→→名称为名称为名称为名称为t1→t1→t1→t1→建立命令按钮建立命令按钮建立命令按钮建立命令按钮→→→→名称为名称为名称为名称为c1c1c1c1。
2 2 2 2))))c1c1c1c1的的的的clickclickclickclick事件代码:事件代码:事件代码:事件代码: Dim f(15) As IntegerDim f(15) As IntegerDim f(15) As IntegerDim f(15) As Integer f(1) = 1 f(1) = 1 f(1) = 1 f(1) = 1::::f(2) = 1f(2) = 1f(2) = 1f(2) = 1 For i = 3 To 15 For i = 3 To 15 For i = 3 To 15 For i = 3 To 15 f(if(if(if(i) = ) = ) = ) = f(if(if(if(i - 1) + - 1) + - 1) + - 1) + f(if(if(if(i - 2) - 2) - 2) - 2) Next Next Next Next t1 = f(15) t1 = f(15) t1 = f(15) t1 = f(15) A(1)A(1)A(2)A(2)A(3)A(3)A(4)A(4)…………A(50)A(50)1 11 12 23 3…………A(48)+a(49)A(48)+a(49)回回顾:: 认识过程和程和参数参数1 1 1 1....过过程程程程pp过程是用来执行特定任务的一段独立的程序代码过程是用来执行特定任务的一段独立的程序代码过程是用来执行特定任务的一段独立的程序代码过程是用来执行特定任务的一段独立的程序代码,,,,这段代码能被反这段代码能被反这段代码能被反这段代码能被反复调用复调用复调用复调用。
VBAVBAVBAVBA的模块以过程为单元组成的模块以过程为单元组成的模块以过程为单元组成的模块以过程为单元组成ppVBAVBAVBAVBA的过程根据是否返回值分为两类:的过程根据是否返回值分为两类:的过程根据是否返回值分为两类:的过程根据是否返回值分为两类:SubSubSubSub过程和过程和过程和过程和FunctionFunctionFunctionFunction过程l lSubSubSubSub过程只执行操作过程只执行操作过程只执行操作过程只执行操作不返回不返回不返回不返回值值,不能用在表达式中,调用时就象,不能用在表达式中,调用时就象,不能用在表达式中,调用时就象,不能用在表达式中,调用时就象使用基本语句一样使用基本语句一样使用基本语句一样使用基本语句一样l lFunctionFunctionFunctionFunction过程又称为用户自定义函数,执行操作后过程又称为用户自定义函数,执行操作后过程又称为用户自定义函数,执行操作后过程又称为用户自定义函数,执行操作后返回返回返回返回结结果果果果,,,,常用在表达式中,调用时就象使用基本函数一样常用在表达式中,调用时就象使用基本函数一样。
常用在表达式中,调用时就象使用基本函数一样常用在表达式中,调用时就象使用基本函数一样pp过程名是标识符,不要与模块名重名,否则调用时会出现混乱同过程名是标识符,不要与模块名重名,否则调用时会出现混乱同过程名是标识符,不要与模块名重名,否则调用时会出现混乱同过程名是标识符,不要与模块名重名,否则调用时会出现混乱同一模块中,一模块中,一模块中,一模块中,SubSubSubSub过程也不要与过程也不要与过程也不要与过程也不要与FunctionFunctionFunctionFunction过程重名过程重名过程重名过程重名pp过程不能嵌套定义,但可以嵌套调用过程不能嵌套定义,但可以嵌套调用过程不能嵌套定义,但可以嵌套调用过程不能嵌套定义,但可以嵌套调用8.5 过程调用和参数传递2 2 2 2....参数参数参数参数pp如果在调用过程中,主调方(调用过程的语句)与被调方(过程)如果在调用过程中,主调方(调用过程的语句)与被调方(过程)如果在调用过程中,主调方(调用过程的语句)与被调方(过程)如果在调用过程中,主调方(调用过程的语句)与被调方(过程)存在数据传递关系,表现这种传递关系的数据就是参数。
存在数据传递关系,表现这种传递关系的数据就是参数存在数据传递关系,表现这种传递关系的数据就是参数存在数据传递关系,表现这种传递关系的数据就是参数pp参数分为形参(形式参数)和实参(实际参数)参数分为形参(形式参数)和实参(实际参数)参数分为形参(形式参数)和实参(实际参数)参数分为形参(形式参数)和实参(实际参数)l l形参用在被调方,只能是变量名或数组名形参用在被调方,只能是变量名或数组名形参用在被调方,只能是变量名或数组名形参用在被调方,只能是变量名或数组名l l实参用在主调方,可以是常量、已赋值的变量、有计算结果的实参用在主调方,可以是常量、已赋值的变量、有计算结果的实参用在主调方,可以是常量、已赋值的变量、有计算结果的实参用在主调方,可以是常量、已赋值的变量、有计算结果的表达式pp当形参和实参都是变量时,存在两种参数传递方式:值传递与地当形参和实参都是变量时,存在两种参数传递方式:值传递与地当形参和实参都是变量时,存在两种参数传递方式:值传递与地当形参和实参都是变量时,存在两种参数传递方式:值传递与地址传递l l值传递值传递值传递值传递只能把实参的值传给形参,是只能把实参的值传给形参,是只能把实参的值传给形参,是只能把实参的值传给形参,是““““单向传递单向传递单向传递单向传递””””。
l l地址传递地址传递地址传递地址传递能在实参与形参之间实现参数的能在实参与形参之间实现参数的能在实参与形参之间实现参数的能在实参与形参之间实现参数的““““双向传递双向传递双向传递双向传递””””,不但,不但,不但,不但将实参的值传给形参,形参的值也可以传给实参将实参的值传给形参,形参的值也可以传给实参将实参的值传给形参,形参的值也可以传给实参将实参的值传给形参,形参的值也可以传给实参subsub过程程 sub sub sub sub 过程是包含在过程是包含在过程是包含在过程是包含在 sub sub sub sub 和和和和 end sub end sub end sub end sub 之间的一组代码,调之间的一组代码,调之间的一组代码,调之间的一组代码,调用用用用subsubsubsub过程时只执行其中的操作,不返回值过程时只执行其中的操作,不返回值过程时只执行其中的操作,不返回值过程时只执行其中的操作,不返回值1 1 1 1.定.定.定.定义义subsubsubsub过过程的格式程的格式程的格式程的格式subsubsubsub 过程名(形参 过程名(形参 过程名(形参 过程名(形参1 as 1 as 1 as 1 as 数据类型,形参数据类型,形参数据类型,形参数据类型,形参2 as 2 as 2 as 2 as 数据类型,数据类型,数据类型,数据类型,…………)))) 语句序列语句序列语句序列语句序列end subend subend subend sub2 2 2 2....调调用用用用subsubsubsub过过程程程程格式格式格式格式1 1 1 1::::call call call call 过程名(实参过程名(实参过程名(实参过程名(实参1 1 1 1 ,实参,实参,实参,实参2 2 2 2,,,,…………))))格式格式格式格式2 2 2 2::::过程名过程名过程名过程名 实参实参实参实参1 1 1 1,实参,实参,实参,实参2 2 2 2,,,,…………3 3 3 3....说说明明明明((((1 1 1 1)参数之间用逗号分隔,对应的形参与实参之间要类)参数之间用逗号分隔,对应的形参与实参之间要类)参数之间用逗号分隔,对应的形参与实参之间要类)参数之间用逗号分隔,对应的形参与实参之间要类型匹配。
型匹配2 2 2 2)用格式)用格式)用格式)用格式1 1 1 1调用调用调用调用subsubsubsub过程必须加括号,用格式过程必须加括号,用格式过程必须加括号,用格式过程必须加括号,用格式2 2 2 2调用调用调用调用subsubsubsub过程不加括号过程不加括号过程不加括号过程不加括号3 3 3 3)用)用)用)用 exit sub exit sub exit sub exit sub 语句立即从语句立即从语句立即从语句立即从 sub sub sub sub 过程中退出过程中退出过程中退出过程中退出4 4 4 4)定义)定义)定义)定义subsubsubsub过程时即使无任何参数,也必须包含空括过程时即使无任何参数,也必须包含空括过程时即使无任何参数,也必须包含空括过程时即使无任何参数,也必须包含空括号()5 5 5 5))))subsubsubsub之前可以用之前可以用之前可以用之前可以用publicpublicpublicpublic或或或或privateprivateprivateprivate或或或或staticstaticstaticstatic定义过程定义过程定义过程定义过程作用域。
作用域6 6 6 6)标准模块中的过程可以被所有对象调用,类模块中)标准模块中的过程可以被所有对象调用,类模块中)标准模块中的过程可以被所有对象调用,类模块中)标准模块中的过程可以被所有对象调用,类模块中的过程只在本模块中有效的过程只在本模块中有效的过程只在本模块中有效的过程只在本模块中有效 8.5 过程调用和参数传递一一. 子过程定义调用子过程定义调用•定义格式:定义格式:[Public][Private][Static] Sub 子过程名子过程名 ([形参形参]) [As 数据类型数据类型][<子过程语句子过程语句>][Exit sub][<子过程语句子过程语句>]End Sub•调用格式:调用格式:Call 子过程名(子过程名([实参实参]))或或 子过程名子过程名 [<实实参参>]例8.18编写一个打开指定窗体的子过程functionfunction过程程 1 1 1 1.定.定.定.定义义functionfunctionfunctionfunction过过程的格式程的格式程的格式程的格式 functionfunctionfunctionfunction 过程名(形参 过程名(形参 过程名(形参 过程名(形参1 1 1 1,形参,形参,形参,形参2 2 2 2,,,,…………))))as as as as 数据类型。
数据类型数据类型数据类型 语句序列语句序列语句序列语句序列 过程名过程名过程名过程名= = = =表达式表达式表达式表达式 …………………… end function end function end function end function2 2 2 2....调调用用用用functionfunctionfunctionfunction过过程程程程 调用调用调用调用functionfunctionfunctionfunction过程只有一种方式,即过程只有一种方式,即过程只有一种方式,即过程只有一种方式,即直接引用过程名直接引用过程名直接引用过程名直接引用过程名,而,而,而,而且过程名在赋值号右端或在表达式中且过程名在赋值号右端或在表达式中且过程名在赋值号右端或在表达式中且过程名在赋值号右端或在表达式中3 3 3 3....说说明明明明((((1 1 1 1)参数之间用逗号分隔,对应形参与实参之间要类型匹配参数之间用逗号分隔,对应形参与实参之间要类型匹配。
参数之间用逗号分隔,对应形参与实参之间要类型匹配参数之间用逗号分隔,对应形参与实参之间要类型匹配2 2 2 2))))““““过程名过程名过程名过程名= = = =表达式表达式表达式表达式””””是是是是functionfunctionfunctionfunction过程中不可缺少的语句过程中不可缺少的语句过程中不可缺少的语句过程中不可缺少的语句3 3 3 3)用)用)用)用 exit function exit function exit function exit function 语句立即从语句立即从语句立即从语句立即从 function function function function 过程中退出过程中退出过程中退出过程中退出4 4 4 4)若)若)若)若functionfunctionfunctionfunction过程无任何参数,也必须包含空括号()过程无任何参数,也必须包含空括号()过程无任何参数,也必须包含空括号()过程无任何参数,也必须包含空括号()5 5 5 5))))functionfunctionfunctionfunction之前可以用之前可以用之前可以用之前可以用publicpublicpublicpublic或或或或privateprivateprivateprivate或或或或staticstaticstaticstatic定义过程的定义过程的定义过程的定义过程的作用域。
作用域8.5 过程调用和参数传递二二. 函数过程定义和调用函数过程定义和调用•定义格式:定义格式:[Public][Private][Static] Function 函数名函数名 ([形参形参]) [As 数据类型数据类型][<函数过程语句函数过程语句>][函数过程名函数过程名=<表达式表达式>][Exit Function][<函数过程语句函数过程语句>][函数过程名函数过程名=<表达式表达式>]End Function•调用格式:调用格式:函数过程名(函数过程名([实参实参]))例8.19编写一个求解圆面积的函数过程8.5.2 8.5.2 参数参数传递 当实参是变量名时,既可以用传值方式传递参数,当实参是变量名时,既可以用传值方式传递参数,当实参是变量名时,既可以用传值方式传递参数,当实参是变量名时,既可以用传值方式传递参数,也可以用传地址的方式传递参数也可以用传地址的方式传递参数也可以用传地址的方式传递参数也可以用传地址的方式传递参数 1 1 1 1....参数参数参数参数的的的的值传递值传递 如果在如果在如果在如果在过过程的形程的形程的形程的形参参参参前加前加前加前加 byvalbyvalbyvalbyval说说明符,明符,明符,明符,参数参数参数参数的的的的传递传递方式方式方式方式为为““““传值传值””””。
值传递的含义是指在过程中另外开辟存储单元存值传递的含义是指在过程中另外开辟存储单元存值传递的含义是指在过程中另外开辟存储单元存值传递的含义是指在过程中另外开辟存储单元存放从实参传过来的值,一旦过程结束,过程中开辟的存储单放从实参传过来的值,一旦过程结束,过程中开辟的存储单放从实参传过来的值,一旦过程结束,过程中开辟的存储单放从实参传过来的值,一旦过程结束,过程中开辟的存储单元被释放,该单元数据的改变不会保留下来元被释放,该单元数据的改变不会保留下来元被释放,该单元数据的改变不会保留下来元被释放,该单元数据的改变不会保留下来2 2..参数参数的地址的地址传递 如果在如果在如果在如果在过过程的形程的形程的形程的形参参参参前加前加前加前加 byrefbyrefbyrefbyref 说说明符,明符,明符,明符,参数参数参数参数的的的的传递传递方式方式方式方式为为““““传传地址地址地址地址””””,,,,参数参数参数参数的地址的地址的地址的地址传递传递是默是默是默是默认选项认选项,不加任何,不加任何,不加任何,不加任何说明符,默认就是传地址说明符,默认就是传地址。
说明符,默认就是传地址说明符,默认就是传地址 地址传递的含义是指过程中的形参与主调方的实参指地址传递的含义是指过程中的形参与主调方的实参指地址传递的含义是指过程中的形参与主调方的实参指地址传递的含义是指过程中的形参与主调方的实参指向同一个存储单元,在过程中对存储单元所做的修改,当向同一个存储单元,在过程中对存储单元所做的修改,当向同一个存储单元,在过程中对存储单元所做的修改,当向同一个存储单元,在过程中对存储单元所做的修改,当过程结束后成为实参的当前值过程结束后成为实参的当前值过程结束后成为实参的当前值过程结束后成为实参的当前值 地址传递通常用在地址传递通常用在地址传递通常用在地址传递通常用在subsubsubsub过程中 8.5 过程调用和参数传递3. 3. 参数参数传递•形参参数格式:形参参数格式:[Optional][ByVal|ByRef][ParamArray] 形参名形参名 [( )] [As 类型类型][=defaultvalue]•形参说明(形参说明(P236))•调用过程:实参调用过程:实参(或者地址或者地址)传值给形参传值给形参8.6 VBA程序运行错误处理程序运行错误处理•VBA中提供On Error GoTo语句来控制当有错误发生时程序的处理。
On Error GoTo指令的一般语法如下: On Error GoTo标号 On Error Resume Next On Error GoTo 0 “On Error GoTo标号”语句在遇到错误发生时程序转移到标号所指定位置的代码处执行 “On Error Resume Next”语句在遇到错误发生时不会考虑错误,并继续执行下一条语句•“On Error GoTo 0”用于关闭错误处理8.7 VBA程序的调试程序的调试一 设置断点 所谓“断点”就是在过程的某个特定语句上设置一个位置点以中断程序的执行断点”的设置和使用贯穿在程序调试运行的整个过程中 在程序中人为设置断点,当程序运行到设置了断点的语句时,会自动暂停运行并进入中断状态设置断点的方法是:在代码窗口中单击要设置断点的那一行语句左侧的灰色边界标识条再次单击边界标识条可取消断点8.7 VBA程序的调试程序的调试二 单步跟踪 也可以单步跟踪程序的运行,即每执行一条语句后都自动进入中断状态单步跟踪程序的方法是:将光标置于要执行的过程内,单击“调试”工具栏的“逐语句”按钮,或选择“调试”→“逐语句”命令8.7 VBA程序的调试程序的调试三 设置监视点 即设置监视表达式。
一旦监视表达式的值为真或改变,程序也会自动进入中断模式设置监视点的方法如下1)选择“调试”→“添加监视”命令,弹出“添加监视”对话框2)在“模块”下拉列表框中选择被监视过程所在的模块,在“过程”下拉列表框中选择要监视的过程,在“表达式”文本框中输入要监视的表达式3)最后在“监视类型”栏中选择监视类型第八章第八章 结束结束。
