15 vba
Download
1 / 131

第 15 章 VBA 程序设计 - PowerPoint PPT Presentation


  • 185 Views
  • Uploaded on

第 15 章 VBA 程序设计. 主要内容. 15.1 VBA 编程的基本概念 15.2 VBA 编程的基本知识 15.3 VBA 的编程界面 15.4 基本控制结构 15.5 过程 15.6 VBA 编辑的调试方法及错误处理. 15.1 VBA 编程的基本概念. VBA ( Visual Basic for Applications) 是在 Office 中开发高级应用时所使用的一个通用程序语言。. VBA 将 VB 引入 Office 中,使其成为其他 Office 组件通用的程序开发工具。. 15.1 VBA 编程的基本概念.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第 15 章 VBA 程序设计' - read


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
15 vba

15章 VBA程序设计


主要内容

15.1 VBA编程的基本概念

15.2 VBA编程的基本知识

15.3 VBA的编程界面

15.4 基本控制结构

15.5 过程

15.6 VBA编辑的调试方法及错误处理


15.1 VBA 编程的基本概念

VBA(Visual Basic for Applications) 是在Office中开发高级应用时所使用的一个通用程序语言。

VBA将VB引入 Office 中,使其成为其他Office组件通用的程序开发工具。


15.1 VBA 编程的基本概念

15.1.1 面向对象的编程思想

  • 1. 面向对象基本概念

  • 以对象为基础

  • 以事件或消息来驱动对象

  • 以数据为中心而不是以功能为中心

  • 将数据和对数据的操作封装在一起

  • 采用数据抽象和信息隐蔽技术


1)对象的概念与类的确定

对象是类的一个实例,是组成一个系统的基本逻辑单元,是具有某些特征的具体事物的抽象。

每个对象都具有属性和行为。

类是创建对象的模板,是一组具有相同属性和行为的对象的集合,它在整体上代表一组对象,它为属于该类的全部对象,提供了统一属性和行为两个主要部分的抽象描述。


1)对象的概念与类的确定

类与对象的关系就像刚才提到的具体的一个人和人类以及一辆具体的车和车类之间的关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实例。


1)对象的概念与类的确定

属性是一个对象的特征,如大小、颜色或屏幕位置,或某一方面的行为。不同的对象有许多相同的属性,也有许多不同的属性。对象的属性可以在设计程序界面时通过属性窗口设置,也可以在运行时通过程序代码设置。

通过程序代码设置属性的一般语法格式:<对象>.<属性>=<属性值> 。

如果想要获取对象的状态或特性,那就要读取对象的属性值。

语法格式:<变量>=<对象>.<属性>


  • 例如

    • Label1.Caption = “确认”

    • Command1.Caption = “确认”

    • Command1.FontName = “隶书”

    • Command1.FontSize = 22

    • Command1.FontUnderline = True

    • Command1.Enabled = False

    • a=Text1.Text



方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。

调用对象的一般格式:

[对象].方法 [参数名表]

如:

Forml.Print "欢迎使用Visual Basic"


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。)事件及事件驱动

事件是一个对象可以辨认的动作(像单击鼠标或按Alt+Tab键等),并且可以通过动作触发的过程来对动作做响应。

事件过程是为响应由用户或程序代码引发的事件或由系统触发的事件而运行的过程。例如,需要命令按钮响应Click事件,就把完成Chick事件功能的代码写到Chick事件的事件过程中。


事件代码的编写事件过程的语法格式:方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。

Private Sub 对象_事件名()

…’事件过程代码

End Sub


2.方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。对象的引用

在面向对象程序设计中,经常要引用对象的属性、事件和方法。

引用格式:

[<集合名>!][<对象名>.]<属性名>|<方法名>[<参教名表>]


2.方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。对象的引用

1)! 运算符

!运算符用来指出随后出现的是用户定义项(集合中的一个元素)。通常使用!运算符可以引用一个打开着的窗体、报表,或打开着的窗体或报表上的控件。例如,Forms![持卡人] ’打开着的持卡人窗体

其他例子见P187中的表15-1。


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。).(点)运算符

.(点)运算符通常用来指出随后出现的是Access定义的项。通常使用点运算符可以引用窗体、报表或控件的属性。另外,还可以使用点运算符引用 SQL 语句中的字段值 。

例如,Reports![持卡人报表]![姓名].Visible

其他例见P187中的表15-2 。


15.1.2 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。模块

VBA代码必须存放在某个位置,这个地方就是模块。

1)类模块

类模块是指包含新对象定义的模块。在用户新建一个类的实例的同时,也就创建了新的对象,在模块中定义的任何过程,都会变成这个对象的属性和方法。一般地,类模块又可以分成三种。

① 窗体模块:指与特定的窗体相关联的类模块。

② 报表模块:指与特定的报表相关联的类模块。

③ 独立的类模块:不依附于窗体和报表而独立存在的类模块。其可以为自定义对象创建定义。


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。)标准模块

标准模块是指存放整个数据库可用函数和程序的模块。它包含与任何其他对象都无关的通用过程,以及可以从数据库的任何位置运行的常规过程。


15.1.3 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。过程

过程被定义为VBA 代码的一个单元,过程中包括一系列用于执行某个任务或是进行某种计算的语句。每个过程都用唯一的名字加以区分。两种过程如下:

Sub子程序:只执行一个或多个操作,不返回数值。

Function函数:执行一个或多个操作,返回一个值。


15.2 VBA方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。编程的基本知识

书中的VBA项目采用的是支持基于VB6.O的VBA语言。

VBA与VB的区别如下:

1) VB以界面为中心的开发方式,重点在用户如何进行操作。VBA以文件为中心的开发方式,重点在用户最后看到什么。

2) VB是设计用于创建标准的应用程序,而VBA是使已有的应用程序自动化。

3) 运行VB开发的应用程序,用户可以不必安装VB的集成开发环境,因为VB应用程序是可执行文件(*.EXE),而VBA开发的程序必须依赖于它的宿主应用程序,不能单独运行。


15.2.1 VBA方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。的数据类型

在VBA程序设计中用到各种类型的数据。常用的有Integer(整型)、Single(单精度型)、Boolean(逻辑型)、String(字符型)、Date(日期型)、Variant(变体型)等,具体见P188中的表15-3。


用户可以使用方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。Type语句定义任何数据类型。用户自定义数据类型,可以包括数据类型数组,或当前定义的用户自定义类型的一种或多种元素。

1)语法格式

[Private|Public] Type <类型名>

<元素名> As <数据类型>

[<元素名> As <数据类型>]

……

End Type


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。15-1 自定义一个教师的基本信息数据类型,其中包括姓名、性别、年龄的信息。

Public Type Teacher

Name As String*10 ’字符串变量可存10个字符名字

Sex As String*4 ’字符串变量存储性别

Age As Integer ’定义整形变量存储年龄

End Type


  • 2) 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。定义完自定义类型后,声明变量

  • Dim Teacher1 as Teacher

  • 3)引用数据

    • Teacherl.Name="张力"

    • Teacherl.Sex="男"

    • Teacherl.Age=28


15.2.2 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。常量

1.VBA的变量或常量命名规则

1)名字必须以英文字母开头,长度≤255个字符。

2)除英文字母、数字、下划线外,其他字符尽量避免使用,VBA变量不区分大小写。

3)名字不能使用VB的关键字(如,Integer、If、 Then等)作为变量名,不能与VBA本身的函数过程、语句以及方法同名。

4)变量名在同一作用域内不能相同。

例如,4ab、a*b、a bc、Dim、Cos都是错误或不当的变量名。


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.常量的概念与分类

在程序运行中其值不可以被改变的量叫常量。有符号常量、固有常量和系统定义常量三种类型。

1) 符号常量:需要声明的常数都是符号常量。用户也可以使用自己定义的常量,但在使用之前必须声明,以便分配内存空间。

语法格式:[Public|Private] Const <常量名> [As <数据类型>]=<表达式>

其中Public用于公共模块、 Private用于过程或私有模块级别,例如:

Const Pi=3.14 ’声明Pi为圆周率的近似值3.14

Public Const A as Integer=l ’声明一个值为1的公有整型常量A


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。)固有常量:是 Access 或引用对象库的一部分。固有常量是系统自动定义的,可以直接使用。它由应用程序列与控件提供,采用下面两种方法来限定常数:

①通过前缀 ( VBA对象库的常数都以VB开头,如 VB Tile Horizontal)

②通过库应用([Libyan]|[mdul name] Constant)。

3)系统定义常量:True 和 False 用于表示逻辑值,Null表示一个无效值。


15.2.3 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。变量

在程序运行中其值可以改变的量叫变量。变量为临时存储单元,可存放文字、数值、日期和对象属性。每个变量都有一个名字,程序通过变量名对变量进行存取操作。在使用一般需要先声明变量的名称和类型,以便系统为它分配存储单元。


1方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.变量声明

1) 用Dim语句显性声明变量

语法:Dim <变量名> [As <类型>]

说明:① [As <类型>]为可选项,若不选,则默认是变体类型。

例如:

Dim X,Y,Z ’X, Y, Z 均为变体类型变量

Dim W As Integer ’声明W为整形变量

Dim B As Currency ’声明B为货币型变量


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。对于字符串型,根据其存放字符串的长度是否固定,有两种定义方法。

Dim <字符串变量名> As String ’用于声明不定长字符串

Dim <字符串变量名> As String*<字符数> ’用于声明定长字符串

例如:Dim strl As String*20 ’声明strl为可存放20个字符的定长字符变量


2方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.数组

数组是同类型变量的一个有序的集合。数组必须先声明后使用。

1) 声明数组

语法格式:

[Public|Private|Stati] Dim <数组名>([<下标下界> T0] <上界>)[As<数据类型>]

说明:若数组的下标下界缺省,则默认其值为 0。一维数组的大小为:上界-下界+1。下标必须为常数。

例如,Dim A(5) As Integer

Dim B(-2 T0 5) As String *3


2) 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。二维数组和多维数组

语法格式:[Public|Private|Stati] Dim <数组名>([<下标下界1> T0] <上界1>,[[<下标上界2> T0] <上界2>,……])[As <数据类型>]

说明:① 下标个数决定数组的维数,最多60维。

② 每一维的大小=上界-下界+1;数组的大小=每一维大小的乘积。

例如,Dim C1( -1 To 5,5) As Long

’声明了长整型二维数组C1的第一维下标范围为 -l~5,第二维下标的范围是0~5,有42个元素。


3) 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。动态数组

如果在程序运行时,可根据用户的需要动态的分配数组的存储单元。

语法格式:Dim Array( )

说明:动态数组要先声明,然后用 ReDim 语句配置数组个数。ReDim语句声明只能用在过程中,它是可执行语句,可以改变数组中元素的个数,但不能改变数组的维数。每次用ReDim配置数组时,原有数组的值全部清零。


15.2.4 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。运算符

运算符是表示实现某种运算功能的符号。按运算的操作对象和操作结果的不同,VB中的运算符有算术运算符、字符连续运算符、比较运算符、逻辑运算符和位运算符等多种类型。

1.算术运算符

算术运算符用来进行数学计算。按从低到高的运算顺序为:+(加)、-(减)、mod(取余)、\(整除)、/(除)、*(乘)、-(负号)、^(指数)。其中“-”运算符在单目运算(单个操作数)中取负号运算,在双目运算 (两个操作数)中取减号运算;其余运算符为双目运算。详见P192的表15-5。


2. 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。字符串运算符

字符串运算符用来连接两个字符串,它有两种符号:“&”和“+”,在用“&”时注意,变量和运算符“&”间要添加一个空格。

例如:

"a"+"b"   ’结果为"ab"

"a" & "b"   ’结果为"ab"

再例如:“123”+1 ’结果为124(先转“123”为123)

"123"+"1" ’结果为"1231"

"abc"+1 ’出错

"abc"+“1” ’结果为"abc1"

123 & 1 ’结果为“1231”(等价于“123”&"1" )


3.方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。关系运算符

关系运算符是双目运算符,用来确定两个表达式之间的关系,其优先级低于数学运算符,各个关系运算符的优先级是相同的,结合顺序从左到右。关系运算符为:=(等)、<>(不等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、Like(字符串模式匹配)、Is (对象一致比较),详见P193的表15-6。

说明:① 当比较的两个操作数是数值型时,则直接比较大小。

② 当比较的两个操作数是字符型时,则按字符的ASCII码值比较,从左到右依次比较。

③ 汉字大于西文字符。


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。关于通配符“?”、“*”、“#”的说明:“?”表示任意一个字符,“*”表示任意多个字符,“#”表示任意一个数字(0~9)。


4. 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。逻辑运算符

逻辑运算符除Not是单目运算符外,其余都是双目运算符。逻辑运算符用于判断运算数之间的逻辑关系。详见P193表15-7列出了VB的逻辑运算符(T 为True, F为False) 的功能。


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。15-2 判断闰年的条件是下列条件之一:

1)能被4整除,但不能被100整除的年份都是闰年。

2)能被100整除,又能被400整除的年份都是闰年。

设变量y表示年份,写出判断y是否是闰年的表达式。

解:条件1的布尔表达式为:y mod 4=0 and y mod 100<>0

条件2 的布尔表达式为:y mod 100=0 and y mod 400=0

两个表达式用or链接起来为:(y mod 4=0 and y mod 100<>0) or (y mod 100=0 and y mod 400=0) 即为判断闰年的条件。


15.2.5 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。表达式

1.表达式组成

VB中的表达式是由常量、变量、运算符、函数和圆括号组成的。根据表达式结果的数据类型,可把表达式分为数值表达式、字符表达式和逻辑表达式等。


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.书写规则

1)运算符不能相邻,例, a + -b 是错误的。

2)乘号不能省略,如a乘以b应写成:a*b。

3)括号必须成对出现,均使用圆括号。

4)表达式从左到右在同一基准上书写,无高低、大小之分。


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.不同数据类型的转换

VB中运算不同精度的操作数时,为了保证运算的精度,运算结果的数据类型自动向精度高的数据类型转换。即:

Integer < Long < Single < Double < Currency


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。.优先级

在一个表达式中出现了算术运算符,字符运算符,关系运算符,逻辑运算符时,不同类型的运算符优先级如下:

算术运算符 >= 字符运算符 > 关系运算符 > 逻辑运算符


  • 5. 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。在VB中常用的内部函数

    • 1) 数学函数

    • 2) 转换函数

    • 3) 字符函数

    • 4)日期与时间函数

    • 5) InputBox函数与MsgBox函数


15.3 VBA 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。的编程界面

在编写VB程序前,就需要先了解VB的开发环境。也就是“Visual Basic编辑器”窗口。“Visual Basic 编辑器”是一个集程序界面设计、代码编写、调试于一体的集成开发环境。


15.3.1 方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。打开一个VBA的编程器

首先在Access窗口打开帮助菜单,用鼠标指向“帮助”下拉菜单中的“示例数据库(D)”弹出示例数据库级联菜单,单击该级联菜单内的“罗斯文实例数据库”如图 15-1所示。弹出如图15-2所示的示例数据库界面。

图15-1 Access 界面


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。15-2 罗斯文示例数据库

单击“确定”按钮,弹出如图15-3所示的“主切换面板”对话框,单击“显示数据库窗口”按钮,立即切换到罗斯文示例数据库的窗口界面如图15-4所示。


方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。15-3 主切换面板

图15-4 启动Visual Basic 编辑器


单击方法是针对特定对象执行一项任务的特殊过程或函数,是对象本身所固有的动作。Access工具下拉菜单中的宏级联菜单中的“Visual Basic 编辑器 ”命令,立即打开“Visual Basic 编辑器 ” ,如图15-5所示。

图 15-5 Visual Basic 编辑器


它主要由主窗口(标题栏、菜单栏和工具栏)、模块代码窗口、工程资源管理器和模块属性窗口等部分组成。所有的 Visual Basic 程序都是在模块代码窗口中编写的。

1)工程资源管理器窗口

该窗口用于浏览应用程序中所包含的模块文件。可以单击“查看代码”按钮显示相应的对象窗口,还可以单击“切换文件夹”按钮,显示或隐藏对象文件夹,如图15-10 所示。工程资源管理器窗口部件功能详见P201表15-16。


15-10工程资源管理器窗口


2 )属性窗口

其中列出了对选定窗体和控件的属性设置值。 VB中正是通过改变属性来改变对象的特征,如大小、标题或颜色。只有在窗体处于设计状态时才能看到属性窗口的内容。属性窗口的主要部件包括:


对象框:列出当前所选的对象,但只能列出现用窗体中的对象。图15-11 所示的属性窗口的第一行的订单 “Form_产品“就是一个所选对象。

② 属性列表:又分为按字母序选项卡和按分类序选项卡两种方式,可以单击“按分类序”或“按字母序”标签,显示相应的属性窗口。按字母序选项卡可参见图 15-11。

图15-11 属性窗口


按分类序选项卡 是根据性质列出所选对象的所有属性,可以折叠这个列表,也可以展开一个分类.

图15-12 属性窗口按分类序选项卡


3) 代码窗口

该窗口用来输入“模块”的VBA代码,在如图15-13所示的“代码窗口”中还可以编辑VBA的代码。

对象框

过程/事件框

图15-13 代码窗口


4 )对象浏览器

单击视图下拉菜单中的“对象浏览器”,可弹出如图15-14所示的对象浏览器窗口。在该窗口中,列出了工程中有效的对象,并提供

图15-14 对象浏览器

在编码中浏览的快速方法。可用“对象浏览器”浏览在VB中的对象和其他应用程序,查看对那些对象有效的方法和属性,并将代码过程粘贴进自己的应用程序。


5 )立即、本地和监视窗口

从视图下拉菜单中,可以打开立即、本地和监视窗口,这些附加窗口是为调试应用程序提供的,它们只在 VBA 之间运行应用程序时才有效,如图15-15所示。

图15-15 三个调试窗口


15.3.2 创建 VBA 的过程

1. VB 编码规则

1)语言元素

VB 的语言基础是 BASIC 语言,VB程序的语言元素主要组成如下:

① 关键字(如,Dim、Print、Cls)

② 函数(如,Sin( )、Cos( )、Sqr( ))

③ 表达式(如,Abs(-23.5)+ 45 * 20/3)

④ 语句(如,X=X +5、IF ... ElSE ...END IF)


15.3.2 创建 VBA 的过程

1. VB 编码规则

2)VB代码书写规则

① 程序中不区分字母的大小写,ab与AB等效。

② 系统对用户程序代码进行自动转换。

对于VB中的关键字,首字母被转换成大写,其余转换成小写。

若关键字由多个英文单词组成,则将每个单词的首字母转换成大写。

对于用户定义的变量、过程名,以第一次定义的为准,以后输入的自动转换成首次定义的形式。


3 )语句书写规则

① 在同一行上可以书写多行语句,语句间用冒号“:”分隔。

② 单行语句可以分多行书写,在本行后加续行符:空格和下划线“_ ”。

③ 一行允许多达255个字符。


4)程序的注释方式

① 整行注释一般以Rem开头,也可以用单撇号“'”。

② 用撇号“'”引导的注释,即可以是单独成行,也可以直接放在语句的后面。

5)保留行号和标号

VB源程序接受行号与标号,但不是必须的(早期的BASIC语句中必须用行号)。标号是以字母开始以冒号结束的字符串,一般用在 GO TO 语句中(现在很少用)。


. 在“代码窗口”中编辑

在“工程资源管理器”窗口双击任何一个对象都可以在“代码窗口”打开相应的代码,然后单击可以打开对象框或事件过程组合框,可以在下拉的组合框中看到当前模块中用到的对象及过程。

VB是可视化的编程方式,它有很多辅助功能,如,自动显示快速信息、常数列表、自动完成关键字等。它能为开发者编写正确的程序代码提供很大的帮助。


.创建VBA

Access包含类模块和标准模块。类模块可以独立存在,窗体和报表模块都是类模块而且它们各自与某一窗体或报表相关联。通常都含有用于响应窗体或报表中的事件过程的代码。例如,用鼠标单击某个命令按钮为窗体或报表创建一个事件过程,这就是使用事件驱动的编程机制。


模块中可以包含一或多个过程,过程是由 VBA代码组成。下面通过一个示例介绍标准模块的创建方法:

例15-3 使用Inputbox函数和Msgbox语句,在屏幕上实现进行一个输入和输出。创建该模块步骤如下:

1)首先打开“罗斯文示例数据库”。

2)单击工具菜单下宏级联菜单中的“Visual Basic 编辑器”,显示相应的编辑器窗口。单击插入菜单中的“模块”命令,进入代码窗口,如图15-16 所示。

3) 选择插入下拉菜单中的“过程”命令,弹出“添加过程” 对话框;在“名称”框中输入 “Welcome”;在“类型”组框中选择“子程序”;在“范围”组框中选择“公有的”,如图15-17 所示。


15-16 代码窗口

图15-17添加过程对话框


4) 单击“确定”按钮,关闭“添加过程”对话框。在代码编辑窗口出现函数过程框架,如图15-18所示。

图15-18 函数过程框架

5) 在函数过程框架中输入下列代码:

Dim a As String '定义字符串变量a

a=InputBox(“请输入你的名字”) '将输入的字符赋a

MsgBox a + "欢迎使用VBA !" ’显示消息对话框


6) 单击“工具栏”上的“保存”按钮弹出“另存为”对话框,在该对话框的模块名称框输入“练习1”并单击“确定”按钮保存。

7) 单击“工具栏”上的“运行”按钮,在弹出的Inputbox 对话框中输入“我们”两个字符,单击“确定”按钮,如图15-20 所示。

图15-20 输入名字


8) 执行此模块,显示结果如图15-21 所示。

图15-21 显示结果

由上可知,创建一个过程需要两个基本步骤:首先需要添加一个模块;然后需要向模块中添加一个过程。对于创建的每一个应用程序,可以添加一次模块,也可以添加多个模块。某些开发人员喜欢使用多个模块,以便根据自己的目的或者窗体对过程进行组织。


15.4 基本控制结构

基本控制结构是编写程序的基础,一个完整的程序还要包括算法的设计,在介绍基本控制结构之前先简单回顾一下算法的知识。

1) 算法的概念

算法是指用计算机解决某一问题的方法和步骤,其特征是:确定性、可行性、有穷性、输入性、输出性。

2)算法的描述

一般常用流程框图来描述,其基本常识可见表15-17。

3) 基本算法结构

算法有三种基本结构:顺序结构、选择结构和循环结构。无论多复杂的程序都是由它们构成的。


15.4.1 顺序结构

1.赋值语句

赋值语句是程序设计中最基本的语句,该语句都是顺序执行的。赋值语句的格式为:

<变量名>=<表达式>

例如,a=2+6,’先计算2+6,再将结果8赋值给变量a

StrA="hello"’将字符串"hello"赋值给变量StrA


2. 使用说明

1) 当表达式为数值型而与左边变量精度不同时,强制转换成左边变量的精度。

2)当表达式是数字字符串,左边变量是数值类型,自动转换成数值类型再赋值,但当表达式中有非数字字符或空串,则出错。

3)非字符类型赋给字符类型,自动转换为字符类

4)当逻辑型赋给数值型时,True转换为-1,False转换为0;反之非0转换为True,O转换为False。

5)赋值号左边只能是变量。

6)不能在一条赋值语句中,同时给多个变量赋值。

7)在条件表达式中出现的符号“=”是等号,系统会根据“=”号的位置,自动判断是否为赋值号。


15.4.2 选择结构

VB中提供了多种形式的条件语句来实现选择结构(或称分支结构),即对条件进行判断,根据判断结果,选择执行不同的分支。

1. IF条件语句

1) If … Then语句(单分支结构)

单分支IF条件语句有两种格式:块结构和行结构。

① 块结构格式

If <表达式> Then

<语句块>

End If

② 行结构格式

If <表达式> Then <语句>


功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。If语句单分支结构流程如图15-22所示。

说明:① 表达式一般为关系表达式、逻辑表达式,也可以为算术表达式,非O为True,O为False.

② 在块结构中,语句块可以是一条或多条语句;在行结构中,语句可以是一条语句,也可以是用冒号分隔的多条语句,但必须书写在一行上。

x=5:y=12

If x<y Then

t=x:x=y:y=t

End If

MsgBox x

MsgBox y

例15-4 已知两个数x和y,比较它们的大小,使得x大于y。

分别用行和块结构的语句如下:

If x<y Then t=x:x=y:y=t


表达式功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。

语句块

F

T

2)If ...Then ... Else语句(双分支)

双分支语句也有块结构和行结构两种格式。

① 块结构格式

If <表达式> Then

<语句块1 >

Else

<语句块2 >

End If

F

表达式

T

语句块

图15-22 If语句单分支结构流程图


表达式功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。

T F

语句块1

语句块2

② 行结构格式

If <表达式> Then <语句1 > Else <语句2>

功能:先条件表达式的结果为真,则执行语句1后转去执行后继语句;若为假,则直接执行语句2后也转去执行后继语句。该结构流程,如图15-24所示。

表达式

T

F

语句块1

语句块2

图15-24 双分支结构流程图


功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。15-5 求下列分段函数的值。

Dim x As Integer

x = InputBox(“请输入x值!”)

If X<>0 Then

Y=X+1

Else

Y=X-1

End If

MsgBox "y="+Str(y)

根据条件可以用双分支的行结构来实现,代码为:

If X<>0 Then Y=X+1 Else Y=X-1

或块结构来实现的代码为:

3)If ... Then ... Else If (多分支结构)

当需要判断的表达式多于两个时,就需要多分支结构来完成,格式如下:


If < 功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。表达式> Then

<语句块1>

ElseIf <表达式2> Then

<语句块2>

...

[Else <语句块n+1>]

End If

说明:

功能:在执行时,按表达式的先后顺序判断,一旦遇到表达式的结果为真时,就执行其下面的语句块,该语句块执行结束,直接转去执行End If的后继语句。多分支结构流程,见P209图15-25。

①不管有几个分支,程序执行了一个分支后,其余分支不再执行。② ElseIf 不能写成Else If 。

③当多分支中有多个表达式同时满足时,则只执行第一个与之匹配的语句块。


功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。15-6 设计一个个人收入调节税的程序,假定月收入Money≤1000元的税率为0.1,1000<Money ≤5000的税率为0.15, Money>5000元的税率为0.2的代码如下

Dim Money As Integer

Dim Tax As Single

Money=InputBox(“输入Money值”)

If Money>5000 Then

Tax = Money * 0.2

ElseIf Money > 1000 Then

Tax = Money * 0.15

Else

Tax = Money * 0.1

End If

MsgBox(“个人收入调节税:” & Tax)


2.Select Case 功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。语句(情况语句)

它是多分支语句的又一种形式,它具有结构清晰易读的优点,语法格式如下:


Select Case <功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。表达式>

Case <表达式列表1>

<语句块1>

Case <表达式列表2>

<语句块2>

...

[Case Else

<语句块n+1>]

End Select

功能:首先计算Select Case <表达式>中表达式的值,然后从第一个Case开始找满足该值的Case语

句,遇到第一个表达式列表值与<表达式>值相匹配的Case语句,则执行其后的语句块,然后跳出Select Case结构,而不再判断其后是否还有相匹配的Case语句。当所有的Case语句中找不到匹配的语句时,若存在Case Else语句,则执行其后的语句块n+1;若不存在Case Else语句,则退出Select Case结构。


表达式功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。

语句块1

表达式

语句块2

T

F

T

F

T

F

表达式

语句块n

语句块n+1

Select Case 语句流程如图15-26 所示。

说明:

① <表达式>可以是数值型或字符串表达式。②并不是所有的多分支结构都可以用情况语句代替的。

T

表达式

语句块1

F

T

表达式

语句块2

F

T

表达式

语句块n

F

语句块n+1

图15-26 Select Case语句流程图


3. 功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。条件函数

1) IIf函数语法:

IIf(<表达式>, 当条件为True时的值, 当条件为False时的值)

2) Choose函数语法:

Choose(整数表达式,选项列表)

如果整数表达式的值是1,则选择列表中的第一项,依次类推;如果小于1或大于列表项数时,则返回NULL 。


15.4.3 功能:先判断表达式的真假结果,若为真则执行语句,否则就跳过语句,继续向下执行。循环结构

循环是在指定的条件下多次重复执行一组语句。VB中提供了两种基本类型的循环语句:For循环语句和条件型循环语句。

1.For 循环语句(知道循环次数的计数型循环)

语法格式:

For<循环变量>=<初值> To <终值>[Step<步长>]

<语句块>

[Exit For]

<语句块>

Next <循环变量>


功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到Next时,循环变量的值自动增加一个步长值,然后转去再给终值进行比较,就这样重复执行,直到循环变量的值超过终值时退出循环,转去执行Next的后继语句。若循环体(语句块)中含有Exit For语句时,且当执行时遇到Exit For语句,就立即退出当前循环。(流程如图15-27 所示)

说明:① 循环变量必须为数值型。

② 步长一般为正,初值小于终值,若为负,初值大于终值,缺省步长为1。

③ 语句块可以是一句或多条语句,称为循环体。


T功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

F

图15-33 For循环流程图

循环变量=初值

循环变量超终值?

执行循环体

循环变量值增1个步长

执行Next后继语句

④遇到Exit For,退出循环体,执行Next后继语句。

⑤退出循环后,循环变量保持退出时的值。

⑥在循环体内对循环变量可多次引用,但不要对其赋值。

⑦ “超过”有两种含义,即大于或小于。当步长为正值时超过示大于;当步长为负值时超过示小于。

循环变量=初值

T

循环变量超终值否?

F

执行循环体

循环变量值增1个步长

执行Next后继语句

图15-33 For循环流程图


2. Do ... Loop 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到循环(不知道循环次数的条件型循环)

用于控制循环次数未知的循环结构,有两种形式:

1)形式1(当型):

Do [While|Until <条件>]

[<语句块>]

[Exit Do]

[<语句块>]

Loop

当型循环的流程图如图15-28和图15-29所示


条件功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

条件

执行循环体

执行循环体

F

T

条件

条件

T

F

执行循环体

执行循环体

图15-2 8 Do While…Loop 流程

图15-2 9 Do Until…Loop流程

二者的共同特点都是先判断条件后执行循环体,所以这种形式的循环,有可能由于一开始条件不满足而一次也不执行。不同点在于,Do While …Loop语句是,若条件为真,则执行循环体;Do Until …Loop语句是若条件为假,则执行循环体。


2功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到)形式2(直到型):

Do

[<语句块>]

[Exit Do]

[<语句块>]

Loop [While|Until <条件>]

直到型流程图如图15-30和图15-31所示

二者的共同特点是先执行循环体后判断条件,所以这种形式的循环至少执行一次循环体。

二者的不同点是Do...Loop While语句,当执行完循环体,若判断Loop While后面的条件为真时,则返回Do继续执行下一次循环,否则就跳出循环;对于Do...Loop Until语句,当执行完循环体,判断


执行循环体功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

执行循环体

条件

条件

Loop Until后面的条件时,若该条件为假,则返回Do继续执行下一次循环,否则就跳出循环,执行Loop Until的后继语句。

执行循环体

执行循环体

F

T

条件

条件

F

T

图15-30 Do...Loop While 流程

图15-31 Do...Loop Until 流程

说明:① 当省略了While|Until条件子句,循环仅由Do ......Loop 构成时,表示无条件循环,这时循环体内应该有Exit Do 语句,否则为死循环。


② Exit Do功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到语句表示当遇到该语句时,退出循环,执行Loop的下一条语句。

例15-10 计算1~100 的奇数之和Sum。

Dim sum, i, n As Integer

n=InputBox("请输入正整数 n 的值 :")

i=1

Do While i<=n

sum=sum+i

i=i+2

Loop

MsgBox ("sum= " & sum)

i=1

Do Until i >100

Sum=Sum+i

i=i+2

Loop

MsgBox Sum

这是使用当型循环的两种格式分别编写的两段等价代码。


功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到.循环嵌套

循环嵌套是指在循环体内又包含了一个完整的循环结构。循环嵌套对for循环和Do...Loop 循环均适用。

例如

For i=<初值> To <终值>  ’外层循环

For j=<初值> To <终值> ’内层循环

<语句块>

Next j

Next i

注意:① 内外层的循环变量不能重名。

② 内外层的循环不能相互交叉。


15.5 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到过程

在程序设计中,为各个相对独立的功能模块所编写的一段程序称之为过程。一个过程是一个VBA函数单元,过程被定义为子程序,过程可以分为:子过程、函数过程等。在其他程序中通过名字访问。

15.5.1 Sub过程

Sub过程执行一个操作或多个操作,而不会返回任何值。用户可以自行创建Sub过程,也可以使用Access所创建的事件过程模板来创建。

1.事件过程

1) 窗体事件过程的语法格式:


Private Sub Form_功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到事件名([参数列表])

[局部变量和常数声明]

<语句块>

End Sub

注意:① 窗体事件过程名由“Form_事件名”组成。

② 每个窗体事件过程名前都有一个Private的前缀,表示该事件过程不能在它自己的窗模块之外被调用。

③ 事件过程有无参数,完全由VB提供的具体事件本身决定,用户不可以随意添加。


2) 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到控件事件过程语法:

Private Sub 控件名_事件名([参数列表])

[局部变量和常数声明]

<语句块>

End Sub

注意:控件名必须与窗体中某控件相匹配。


3)功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到建立事件过程的方法

① 打开代码编辑器窗口 ( 两种打开方法:双击对象或从工程管理器中单击“查看代码”按钮 )。

② 在代码编辑器窗口中,选择所需要的“对象”和“事件过程”。

③ 在 Private Sub … End Sub之间键入代码。

④ 保存工程和窗体。

4)事件过程的调用

事件过程,可以由一个发生在VB中的事件来自动调用,或者由同一模块的其他过程显示调用。


2.功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到通用过程

是一个必须从另一个过程显示调用的程序段。

1) 语法格式:

[Private|Public][Static] Sub 过程名([参数列表])

[局部变量和常数声明] ’用Dim或Static声明

<语句块>

[Exit Sub]

<语句块>

End Sub


说明:① 缺省功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到[Private|Public]时,系统默认为Public。

② Static 表示过程中的局部变量为“静态”变量。

③ 过程名的命名规则与变量命名规则相同,在同一个模块中,同一符号名不得既用作Sub过程名,又用作Function过程名。

④ 参数列表中的参数称为形式参数,它可以是变量名或数组名,只能是简单变量,不能是常量、数组元素、表达式;若有多个参数时,各参数之间用逗号分隔,形参没有具体的值。VB的过程可以没有参数,但一对圆括号不可以省略。不含参数的过程称为无参过程。形参语法格式:

[ByVal]变量名[()][As 数据类型]


⑤ Sub功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到过程不能嵌套定义,但可以嵌套调用。

⑥ End Sub示该过程的结束。ByVal表明其后的形参是按值传递参数,若缺省或用ByRef则表明形参是按地址传递参数。

⑦ 过程中可以用Exit Sub提前结束过程,并返回。


2) 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到建立Sub过程的方法

一般建立Sub过程的步骤:

① 打开代码编辑器窗口。

② 选择插入下拉菜单中的“过程”,弹出“添加过程”。

③ 在对话框中输入过程名,并选择类型和范围。

④ 在新创建的过程中输人内容。

例15-11 利用输入输出函数和lF结构创建Sub过程。


Sub GetInfo() 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

’声明过程命名为 GetInfo,该Sub过程没有参数

Dim answer As String ’字符串变量命名为answer

answer=InputBox(Prompt:="What is your name?")

’指定InputBox函数的返回值给变量answer

If answer=Empty Then ’条件If…Then…Else语句

MsgBox Prompt:= "You did not enter a name."

Else

MsgBox Prompt:="Your name is" & answer

’MsgBox函数与answer变量连接,调用MsgBox函数

End If

End Sub


3. Sun功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到子过程的调用

1) Sub 子过程的调用语法格式:

Call 过程名(实际参数表)

实际参数的个数、类型和顺序,应该与被调用过程的形式参数相匹配,有多个参数时,用逗号分隔。例15-11 中可以写成 Call GetInfo( )。

2) 把过程名作为一个语句的调用语法格式:

过程名[参数1 [ ,实参 2 ... ] ]

它与1)的不同点是:去掉了关键字和实参列表的括号,如例15-11 中可以改成:

GetInfo

例如,创建一个仅调用GetInfo过程的代码如下:


Public Sub calInfo( )功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

Call GetInfo ’第1次调用

GetInfo ’第2次调用

End Sub

运行此过程,将会看到两次调用的结果相同。


15.5.2 功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到自定义函数过程

1.函数过程的定义

VBA 包含很多内置的函数,用户可以很方便的从中调用它们。但是有些特殊的函数可能没有,为此VBA提供了自定义函数(Function )过程,亦称为函数过程,它是实现某一数据处理功能并返回处理结果的代码段。

创建Function过程方法:在代码窗口中,利用“插入”菜单下的“过程”命令,在添加过程对话框中的“类型”组框中选择“函数”,单击“确定”,插入一个函数模板。


创建函数过程的语法格式:功能:将初值赋予循环变量,判断循环变量的值是否超过终值,若没有超过,则执行语句块,遇到

[Private|Public][ Static ] Function <函数名>([参数列表])[As <数据类型>]

[局部变量和常数声明] ’用Dim 或Static 声明

[语句块]

[函数名 = 表达式]

[Exit Function ]

<语句块>

[函数名 = 表达式]

End Function


注意:① 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。

② 如果函数体内没有给函数名赋值,则返回对应类型的缺省值,数值型返回0,字符型返回空字符串。

③ 函数过程内部不得再定义Sub或Function过程。

2. Function过程的调用

语法格式:<过程名>([实参列表])

说明:1)必须给参数加上括号,即使没有参数也不可省略括号。

2)VB中也允许像调用Sub过程一样来调用Function,但这样就没有返回值。


函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。15-12编写一个计算圆周长的函数过程。

代码如下:

Public Function js(r!) As Single

’定义名为js的函数,参数为半径r,类型为单精度

js=2*3.14*r ’定义函数表达式

End Function

Public Sub diaoyong( ) ’名为diaoyong的子过程。

Dim x!,y! ’定义变量,叹号! 为单精度类型标识。

X=InputBox(“请输半径”) ’输入结果赋给变量x

y=js(x) ’调用js 函数,将结果赋值给变量y

MsgBox( “周长为:” & y) ’显示输出语句的结果

End Sub


3. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。调用其他模块中的过程

1)调用窗体中的过程

从窗体模块的外部调用窗体中的公有过程,必须用窗体的名字作为调用前缀。例如,

Call Forml.Examsub([实参表])

2)调用标准模块中的过程

如果在应用程序中,过程名是唯一的,则调用时不必加模块名。如果有同名,则在同一模块内调用时可以不加模块名,而在其他模块中调用时必须加模块名。

调用类模块的公有过程时,要求用指向该类某一实例的变量修饰过程,即首先要声明类的实例为对象变量,并以此变量作为过程名前缀修饰词,不可直接用类名作为前缀修饰词。


15.5.3 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。参数的传递

1.形参与实参的概念

形参指出现在Sub和Function过程形参表中的变量名、数组名,在过程被调用前,没有分配内存,其作用是说明自变量的类型和形态,以及在过程中的角色。


实参是在调用 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。Sub和Function过程时,传送给相应过程的变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但个数、类型和位置必须对应起来。

形参与实参的关系:形参如同公式中的符号,实参就是符号具体的值;调用过程即实现形参与实参的结合,也就是把值代人公式进行计算。


2. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。按值传递参数

按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。注意:按值传递参数定义时加 ByVal


3. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。按地址传递参数

按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。如果实参是一个常数或表达式,VB会按“传值”方式来处理。注意:按地址传递参数定义时没有修饰词或带关键字ByRef 。

4.数组参数

语法格式为:<形参数组名>()[As <数据类型>]

形参数组只能按地址传递参数,对应的实参也必须是数组,且数据类型相同。调用过程时,把要传递的数组名放在实参表中,数组名后面不跟圆括号。


5. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。对象参数

VB中可以向过程传递对象,在形参表中,把形参变量的类型声明为“Control”,可以向过程传递控件;若声明为“Form”,则可以向过程传递窗体。对象的传递只能按地址传递。


15.5.4 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。变量的作用域

1.变量概述

不同级别的变量有不同的应用范围,变量三个级别。

1)过程级别

在程序中声明的变量就属于“过程级”的变量。只有在声明此变量的过程中才可使用的变量称为局部变量。用户可以使用Dim或Static关键字来定义。。


2 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。)私有模块级别

用户可以在窗体、报表和标准模块顶部的通用声明区,用Dim或Private定义模块级的变量。由Dim语句在声明部分所声明的变量,其范围默认为是私有的。私有变量,一旦离开该程序,这些变量也就消失,别的程序或函数无法使用这些变量。

在程序中,公共模块中的变量对于全部模块的所有过程均可用,而私有模块中的变量只对所属模块过程可用。


3 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。)公共模块级别

在模块的通用声明区中,以Public声明的变量。

如果将一个变量声明为公共模块变量,那么它就可以被工程所有过程调用。因此,其生命周期将延续至该应用程序结束为止。

注意:在P219的表15-19中,列出了过程定义、作用域和访问规则。

2.变量的作用域

在P219的表15-20中,列出变量定义、作用域和访问规则。


3. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。静态变量

用Static声明的静态变量,在每次调用过程时保持原来的值,不重新初始化。而用 Dim声明的变量,每次调用过程时,重新初始化。

4. 同名变量

对不同范围内出现的同名变量,可以用模块名加以区别。一般情况下,当变量名相同而作用域不同时,优先访问局限性大的即范围最小的变量。


15.5.5 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。控件及应用

控件是窗体、报表中用于显示数据、执行操作或装饰窗体、报表的对象。例如,可以在窗体报表中使用文本框显示数据,在窗体上使用命令按钮打开另一个窗体或报表,或者使用线条或矩形来分隔与组织控件以增强它们的可读性。

Access包含以下控件类型:标签、文本框、选项组、切换按钮、单选按钮、复选框、组合框、列表框、命令按钮、图像控件、未绑定对象框、绑定对象框、分页符、选项卡控件、子窗体/子报表、线条、矩形以及ActiveX自定义控件。它们可以通过窗体或报表“设计”视图中的工具箱访问,VBA工具箱如图15-32所示。


文本框 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。

标签

子窗体/子报表

选项卡控件

分页符

绑定对象框

复选框

单选按钮

切换按钮

选项组

图像

命令按钮

列表框

组合框

其它控件

矩形

文本框

标签

复选框

单选按钮

切换按钮

选项组

图象

命令按钮

列表框

组合框

子窗体\报表

选项卡控件

分页符

绑定对像框

其他控件

矩形

15-32 VBA工具箱

1. 常用的控件

1)命令按钮(Command Button)

可以在窗体或数据访问页上,使用命令按钮,来执行某个操作或某些操作。例如,可以创建一个命令按钮来打开一个表。使用命令按钮向导可以创建30多种不同类型的命令按钮 。


2) 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。标签(Label)

用于在窗体或报表中显示描述性文本(如标题或说明),标签可以是一个独立的控件(通常用于标题或数据输入说明)。例如,抬头标题或简短的提示标签,并不显示字段或表达式的数值。

3)文本框(Textbox)

用于显示数据,或让用户输入或编辑信息。在窗体报表或数据访问页上,可以使用绑定文本框来显示记录源上的数据。因为它与某个字段中的数据相绑定。文本框也可以是未绑定的。例如,可以创建一个未绑定文本框,来显示计算的结果,或接受用户所输入的数据。在未绑定文本框中的数据,并没有保存在任何位置。


4) 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。切换按钮(Toggle)

在窗体上可以使用切换按钮作为单独的控件来显示基础表、查询或SQL语句上的“是/否”值。例如,切换按钮绑定到数据库的“产品”表中的中止字段,此字段的数据类型为“是/否”。当按下按钮时其值为“是”,如果没有按下其值为“否”。切换按钮在有其他按钮的选项组中使用时最为有用。在选项组中可以很容易地知道是否按下了按钮。


5) 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。选项组(Frame)

选项组可包含多个选项按钮、复选框或切换按钮。可以在窗体或报表中使用它来显示一组限制性的选项值。如果在运行时选择选项组框中的对象时,每次只能选择一个,选项组中的控件不再是两种状态,它们基于在组中的位置返回一个数值。在这样的组中。按钮的最大数目是四个,如果需要按钮的数目超过四个,可以使用下拉式列表框。


6) 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。复选框(Checkbox)

在窗体报表或数据访问页上可以使用复选框作为单独控件来显示基础表、查询或SQL语句中的“是/否”值,例如复选框绑定到“产品”表中的“中止”字段,该字段的数据类型为“是/否”。如果在复选框内包含了检查符号,则其值为“是”。如果不包含则其值是为“否”。

其他控件由于不常用,这里就不详细介绍了,下面举例来介绍控件的使用与编程。


2. VBA 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。编程与控件综合举例

例15-13 设计一个如图15-33(P221)所示的窗体,在上面可以完成对文本框字体的设置,数据库表的打开、关闭、和删除的操作。

1)创建一个名字为“DB1”的数据库,在该库中任意创建一个表,名字为“表1”。

2)再在此数据库中创建一个窗体,名字为“VBA练习”,然后在窗体上创建一个文本框、两个命令按钮、两个选项组、两个复选按钮、一个标签、一个日历对象。创建日历对象时,可在工具箱上选择“其他控件”,再选择“日历控件11.0”(随系统不同而异)。

3)设置对象的属性。具体见P222中的表15-21。


15.6 VBA 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。编辑的调试方法及错误处理

15.6.1 错误类型

1.编译时错误

当用户在代码窗口编辑代码或编译程序时,VB会对程序进行语法检查,当发现语句没有输完、关键字输错、未定义变量、遗漏关键字,系统会弹出对话框,提示出错,并在错误处加亮显示,以便用户修改,在屏幕上显示为 “编译错误”。

例15-14 图15-34所示的代码中,将“InputBox语句中的双引号" "”去掉,就会发生出错提示。


函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。15-34 编译错误

2.运行时错误

指VB在编译通过后,运行代码时发生的错误,一般是由于指令代码执行了非法操作引起的,如表达式中除数为零、数据类型不匹配、视图打开一个不存在的文件等,系统会报错并加亮显示,等候处理。


函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。15-15 如图15-35所示,将代码中的“Msgbox A + ...”中的“+”换为减号“_”,就会出现错误的提示。

图15-35 运行错误


3. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。逻辑错误

逻辑错误是指程序可以正常运行,并且运行时没有

出错,但产生的结果和我们已经知道的结果不能吻合或相差得特别多,出错原因不宜判断,并且改正的难度较大,需要进行代码级的检查,如运算符使用不正确,语句的次序不对、循环语句的起始、终止不正确都会产生逻辑错误。这种错误系统不会报错,需要用户自己分析判断。


15.6.2 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。调试与排错

  • 1.VBA 的三种模式

  • 在VBA设计器的标题栏上会显示当前设计器所处的工作状态。

    • 1)设计模式

    • 2)运行模式

    • 3)中断模式


2. 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。程序调试方法

1)进入/退出中断状态,进入中断状态有四种方法

① 程序运行时发生错误自动进入中断。

② 程序运行中用户按中断键强制进入中断。

③ 用户在程序中预先设置了断点,程序执行到断点处即进入中断状态。

④ 采用单步调试方式,每运行一个可执行代码后,即进入中断状态。

2)利用调试窗口


3 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。)插入断点和逐句跟踪

在调试程序时,通常可以设置断点来中断程序的运行,然后逐句跟踪检查相关变量、属性和表达式的值是否在预期的范围内。可在中断模式下或设计模式时设置或删除断点,在代码窗口选择怀疑存在问题的地方作为断点,按下F9键,则程序运行到断点处即停下,进入中断模式,在此之前所关心的变量、属性、表达式的值都可以看到。

在VBA菜单中提供了调试菜单和调试工具栏,调试工具栏集中了程序调试的主要工具。


调用堆栈 函数名的命令规则与变量命名规则相同;函数过程必须由函数名返回一个值。

快速监视

切换断点

重新设置

中断

跳出

逐过程

逐语句

监视窗口

立即窗口

本地窗口

运行子过程

/用户窗体

设计模式

3.VB的调试工具

该工具栏可以通过单击“视图”菜单内“工具栏”下的“调试”命令来显示。利用该工具栏可以执行运行程序、中断运行、在程序中设置间断点、监视变量、单步调试、过程跟踪等操作,调试工具栏如图15-36所示。在P225中的表15-22 是具体的功能介绍。

图15-45 调试工具栏


ad