第四章 VBA编程
? 序言
? 4.1 宏
? 4.2 控件与用户窗体
? 4.3 对象、属性、方法和事件
? 4.4 VBA语法基础
? 4.5 过程
? 4.6 流程控制语句
? 4.7 VBA应用程序的优化
? 4.8 信息及代码的保护
? 4.9 应用举例
章目录 节目录
序言
? VBA( Visual Basic for Applications)是 Microsoft Office 系
列的内置编程语言,是非常流行的应用程序开发语言
VB(Visual Basic) 的子集。它“寄生于” Office应用程序,
是 Office XP套装软件的一个十分重要的组件。它功能强大,
面向对象( OOP),非常适合入门级学习。利用它可以实现
繁琐、机械的日常工作的自动化,从而极大提高用户的办公
效率。
? VBA和 VB的主要区别是:
1,VB用于创建标准的应用程序,VBA是使已有的应用程
序 (Office)自动化。
2,VB具有自己的开发环境,VBA寄生于已有的应用程序
(Office)。
3,VB开发出的应用程序可以是可执行文件 (*.EXE),VBA
开发的程序必须依赖于它的“父”应用程序 (Office)。
章目录 节目录
? 用 VBA可以实现如下一些功能:
1,使重复的任务自动化。
2,自定义工具栏、菜单和界面。
3,简化模板的使用。
4,自定义 Office,使其成为开发平台。
5,创建报表。
6,对数据进行复杂的操作和分析。
? 用 Office作为开发平台的主要优点:
1,Office本身功能强大,包括打印、文件处理、格式化和
文本编辑等。
2,Office应用软件及其 VBA内置大量函数、语句、方法等,
功能非常丰富。
3,Office界面熟悉,便于软件推广应用。
4.便于发布。只需要发布含有 VBA代码的文档,无需考
虑运行环境,因为 Office是普遍配备的应用软件。
5.利用宏可以实现部分程序设计自动化,大大提高软件
开发效率。
章目录 节目录
4.1 宏
? 宏( Macro)是一组 VBA语句。可以理解为一个程序段,或
一个子程序。在 Office XP中,宏可以直接编写,也可以通过
录制形成。录制宏,实际上就是将一系列操作过程记录下来
并由系统自动转换为 VBA语句。这是目前最简单的编程方法,
也是 VBA最有特色的地方。
? 4.1.1 宏的录制与执行
? 4.1.2 宏的编辑
? 4.1.3 为宏指定快捷键
? 4.1.4 指定宏保存的位置
? 4.1.5 将宏指定给按钮
? 4.1.6 将宏指定给图片或工具栏按钮
章目录 节目录
? 4.1.1 宏的录制与执行
下面录制一个非常简单的宏,它的功能是将当前选中的单元格背景
置成蓝色。如下步骤:
①进入 Excel。
②在“工具 |宏”菜单中选“录制新宏”项。
③在“录制新宏”对话框中输入宏名“填充颜色”,单击“确定”按钮。此时,屏幕上显示出“停止录制”工具栏。
④在“格式”工具栏中单击“填充颜色”按钮右边的三角标志,选择
蓝色。
⑤单击“停止录制”工具栏按钮,结束宏录制过程。也可以选择“工具 |宏 |停止录制”菜单结束宏录制。录制完一个宏后就可以执行它了 。
? 4.1.2 宏的编辑
对已经存在的宏,我们可以查看代码,也可以进行编辑修改。
选择“工具 |宏 |宏”菜单,在“宏”对话框中选择列表中的“填充颜
色”,单击“编辑”按钮。可以在 VBA的编辑器窗口修改宏。
编辑宏同样非常简单。同时我们知道,通过编辑宏可以删除多余的语
句,提高运行速度,也可以加入判断或循环等无法录制的语句,增加宏
的功能。
许多过程可以用录制宏来完成。但录制的宏无判断或循环能力,人机
交互能力差,即用户无法进行输入,计算机无法给出提示,无法显示对
话框,无法显示自定义窗体。因此,需要对录制的宏进行编辑修改。
章目录 节目录
? 4.1.3 为宏指定快捷键
快捷键即快速执行某项操作的组合键。例如,CTRL+C 在许
多程序中代表“复制”命令。
当给宏指定了快捷键后,就可以用快捷键来执行宏,而不必
通过“工具”菜单。
可以在创建宏时指定快捷键,也可以在创建后再指定。
? 注意:当包含宏的工作簿打开时,为宏指定快捷键会覆盖原有快
捷键的功能。因此,在定义新的快捷键时,尽量避开系统已定义
的常用快捷键 。
? 4.1.4 指定宏保存的位置
宏可保存在三种位置:当前工作簿、新工作簿和个人宏工作簿。
将宏保存在当前工作簿或新工作簿,只有该工作簿打开时,相
应的宏才可以用。
个人宏工作簿是为宏而设计的一种特殊的具有自动隐藏特性的
工作簿。第一次将宏创建到个人宏工作簿时,会创建名为
,PERSONAL.XLS"的新文件。如果该文件存在,则每当 EXCEL
启动时会自动将此文件打开并隐藏在活动工作簿后面。在“窗口”
菜单中选择“取消隐藏”后,可以发现它的存在。
节目录章目录
? 4.1.5 将宏指定给按钮
VBA主要的目标是为自动化提供一个易于操作的界面。“按钮”是最
常见的界面组成元素之一。通过使用“窗体”工具栏,可以为工作簿中
的工作表添加按钮。在创建完一个按钮后,可以为它指定宏,然后就可 以通过单击按钮来执行宏了。
此后,单击按钮就可以运行该宏。在按钮上右击鼠标,可改变大小或
标题。
? 4.1.6 将宏指定给图片或工具栏按钮
除了将宏指定给按钮外,还可以指定给图片和工具栏按钮。
指定宏到图片十分简单,用“插入 |图片”菜单或其他方法在当前工作
表放置图片后,右击图片,在快捷菜单中选“指定宏”即可进行设置。
将宏指定给“工具栏按钮”,可按如下步骤进行:
①在 Excel中,选择“工具 |自定义”菜单,显示“自定义”对话框。
②在“命令”卡中,从“类别”列表框中选择“宏”,从“命令”
列表框中将“自定义按钮”拖动到任意一个工具栏上。
③右击该按钮,选择“指定宏”,显示“指定宏”对话框。
④选择需要的宏名并单击“确定”按钮。
⑤单击“关闭”按钮,关闭“自定义”对话框。
章目录 节目录
4.2 控件与用户窗体
? 4.2.1 控件
在 Excel工具栏上单击鼠标右键,从快捷菜单中选择“窗体”,显示出“窗体”
工具栏,其中有 16个控件,9个可放到工作表上。
1.标签:用于表现静态文本。
2.分组框:用于组合其它控件。
3.按钮:用于执行宏命令。
4.复选框:它是一个选择控件,通过单击可以选择和取消选择,可以多项选择。
5.选项按钮:通常几个选项按钮组合在一起使用,在一组中只能选择一个选项
按钮。
6.列表框:用于显示多个选项并从中选择。
7.组合框:用于显示多个选项并从中选择。可以选择其中的项目或者输入一个
其它值。
8.滚动条:是一种选择控制机制。包括水平滚动条和垂直滚动条。
9.微调控件:是一种数值选择机制,通过单击控件的箭头来选择数值。
要将控件添加到工作表上,可以在“窗体”工具栏中单击需要的控件,此
时鼠标变成十字形状,在当前工作表的适当位置按下鼠标左键并拖动鼠标画出一
个矩形,这个矩形代表了控件的大小,对大小满意后放开鼠标左键,这样一个控
件就添加到工作表上了。
节目录章目录
? 4.2.2 用户窗体
用户窗体。用户窗体可以作为程序的对话框和窗口。向用户
窗体添加控件类似于向工作表添加控件。
在 VBA编辑器中出现一个名为,UserForm1”的窗体,“控件工
具箱”同时出现,在其中有许多已经熟悉的控件,另外还有一些新的控件。
这些新的控件是:
1.切换按钮:该控件如果被选中,那么会保持被按下的状态。
如果再次单击它就恢复为没有按下的状态。
2.选项卡条 (TabStrip):它是包含多个选项卡的控件。通常
用来对相关的信息进行组织或分类。
3.多页:外观类似选项卡条,是包含一页或多页的控件。选
项卡条给人相似的外观,而多页控件的各页包含各自不同的控件,
有各自不同的布局。如果每一页具有相同布局,则应选择选项卡条,
否则应该选择多页。
4.图像控件:它允许向窗体上放置图片。
5,RefEdit:它外观象文本框,通过这个控件可以将用户窗
体折叠起来,以便选择单元格区域。
章目录 节目录
4.3 对象、属性、方法和事件
? 同其它任何面向对象的编程语言一样, VBA里也有对象, 属
性, 方法和事件 。 所谓对象, 就是代码和数据的组合 。 如表,
窗体或文本框等都是对象 。 所谓属性, 是指对象的特性, 像
大小, 颜色, 状态等 。 所谓方法指的是对象能执行的动作,
如刷新等 。 事件是一个对象可以辨认的动作, 像单击鼠标或
按下某键等, 并且可以写某些代码针对此述动作来做响应 。
? 在 VBA中, 窗口和它上面的, 关闭, 按钮, 是两个对象 。 窗
口及按钮的颜色, 大小是它们的属性 。 当你按下, 关闭, 按
钮时, 发生关闭事件, 通过相应的方法关闭窗口 。
【 例 4.1】
章目录 节目录
【 例 4.1】
?新建一个窗体,放置两个按钮和一个文字框
控件。按钮的标题分别定义为“显示”和
“清除”。单击“显示”按钮,在文字框中
显示一行文字,单击“清除”按钮,清除文
字框中的文字。
节目录章目录
4.4 VBA语法基础
?4.4.1 注释
?4.4.2 连写和断行
?4.4.3 变量和常量
?4.4.4 运算符
章目录 节目录
4.4.1 注释
? 好的程序一般都有注释, 这对程序的维护有很大的好处 。
? 在 VBA程序中, 注释可以通过以下两种方式实现:
? (1) 使用 Rem语句 。
? (2) 用单引号 ( ') 号 。
4.4.2 连写和断行
程序中,一般一个语句占一行,但有时候可能需要在一行中
写几个语句。这时需要用到,,, 来分开语句。例如:
a=1:b=2
有时一个语句太长,书写起来不方便,看上去也不美观,希
望将其分开写成几行。此时要用到空白加下划线 (_)。
章目录 节目录
4.4.3 变量和常量
?1,变量
?2,变量的数据类型
?3,声明变量
?4,声明数组
?5,变量赋值
?6,常量
章目录 节目录
1.变量
? 变量用于临时保存数据 。 程序运行时, 变量的数据可以改变 。 在 VBA代码中可
声明和使用变量来临时存储数据或对象 。
例如:
? Dim MyName As String '声明一个名为 MyName的字符串变量
? MyName="北京 " '给变量赋值
? MyName="上海 " '改变量的值
2.变量的数据类型
变量的数据类型控制变量允许保存何种类型的数据。表 4.1列出了 VBA支持的数据类型,
同时列出了各种类型的变量所需要的存储空间和能够存储的数据范围。进行程序设计
时,应选择占据存储空间尽量小的数据类型来保存所需要的数据。
表 4.1 数据类型
章目录 节目录
表 4.1 数据类型
数据类型 存储空间 数值范围
Byte(字节 ) 1字节 0~ 255
Booleam(布尔 ) 2字节 True或 False
Integer(整型 ) 2字节 -32768~ 32767
Long(长整型 ) 4字节 -2147483648~ 2147483647
Single(单精度 ) 4字节 负值范围,-3.402823E38 ~ -1.401298E-45
正值范围,1.401298E-45 ~ 3.402823E38
Double(双精度 ) 8字节 负值范围:
-1.79769313486232E308 ~ -4.94065645841247E-324
正值范围:
4.94065645841247E-324 ~ 1.79769313486232E308Currency(货币 ) 8字节 -922337203685477.5808 ~ 922337203685477.5807
Decimal 12字节 不包括小数时,+/-79228162514264337593543950335
包括小数时, +/-7.9228162514264337593543950335
Date(日期时间 ) 8字节 日期,100年 1月 1日 ~ 9999年 12月 31日
时间,00:00:00~ 23:59:59
Object(对象 ) 4字节 任何引用对象
String(字符串 ) 字符串
的长度
变长字符串,0~ 20亿个字符
定长字符串,1~ 64K个字符
Varient(数字) 16字节 Double范围内的任何数值
Varient(文本) 字符串
的长度
数据范围和变长字符串相同
3.声明变量
? 变量在使用之前, 最好进行声明, 也就是定义变量
的数据类型, 这样可以提高程序的可读性和节省存
储空间 。
? 变量的数据类型可以是表 4.1中的任何一种数据类型。
变量不经声明直接使用在语法上也是允许的,系统
会自动将变量定义为 Variant类型,VBA中默认的数
据类型是 Variant。缺点是占用存储空间较大,而且
影响程序的性能,因为 VBA必须辨别 Variant类型的
变量中存储了何种类型的数据。通常使用 Dim语句
来声明变量。
节目录章目录
?变量名必须以字母开始, 并且只能包含字母,
数字和特定的字符, 最大长度为 255个字符 。
可以在一个语句中声明几个变量 。
?声明语句可以放到过程中, 创建的变量在过
程内有效, 声明语句放到模块顶部, 创建的
变量在模块中有效 。
节目录章目录
4.声明数组
? 数组是具有相同数据类型并共同享有一个名字的一
组变量的集合 。 数组中的不同元素通过下标加以区
分 。
? 数组的声明方式和其它的变量是一样的, 可以使用
Dim,Static,Private 或 Public 语句来声明 。 若数组
的大小被指定的话, 则它是个固定大小数组 。 若程
序运行时数组的大小可以被改变, 则它是个动态数
组 。
? 数组的下标从 0还是从 1开始,可由 Option Base 语
句的设置。如果 Option Base没有指定为 1,则数组
下标从 0开始。
章目录 节目录
?在声明数组时, 不指定下标的上界, 即括号
内为空, 则数组为动态数组 。 动态数组可以
在执行代码时改变大小 。
?动态数组声明后, 可以在程序中用 ReDim语
句来重新声明 。 ReDim 语句可以重新定义数
组的维数以及每个维的上界 。 重新声明数组,
数组中存在的值会丢失 。 若要保存数组中原
先的值, 可以使用 ReDim Preserve 语句来扩
充数组 。
节目录章目录
5.变量赋值
变量或数组声明后,就可以进行赋值。
6.常量
变量用来存储动态信息 。 静态信息可以用常量表示 。
它可以供程序多次使用而且便于记忆 。 比如用 PI表
示圆周率比 3.1415926好得多 。
要声明常量并设置常量的值, 需要使用 const语句 。
常量通常用全大写字母以区别于变量 。 常量声明后,
不能对它赋一个新的值 。
与变量一样, 常量的定义的位置也决定了它的作用域 。
章目录 节目录
4.4.4 运算符
VBA中的运算符有四种:算术运算符, 比较运
算符, 逻辑运算符和连接运算符 。 用来组成
不同类型的表达式 。
? 1,算术运算符
? 2,比较运算符
? 3,逻辑运算符
? 4,连接运算符
? 5,运算符的优先级
章目录 节目录
1.算术运算符
VBA算术运算符有 7个,他们用于构建数值表达式或返回数值运算结果,各运算
符的作用和示
例见表 4.2
表 4.2 算术运算符
符号 作用 示例
+ 加法 3+5=8
- 减法、一元减 11-6=5,-6*3=-18
* 乘法 6*3=18
/ 除法 10/4=2.5
\ 整除 19\6=3
mod 取模 19 mod 6=1
^ 指数 3^2=9
节目录章目录
2.比较运算符
比较运算符用于构建关系表达式,返回逻辑值 True、
False或 Null(空 )。 名称、用法见表 4.3
表 4.3 比较运算符
符号 名称 用法
< 小于 〈 表达式 1〉 <〈 表达式 2〉
<= 小于或等于 〈 表达式 1〉 <=〈 表达式 2〉
> 大于 〈 表达式 1〉 >〈 表达式 2〉
>= 大于或等于 〈 表达式 1〉 >=〈 表达式 2〉
= 等于 〈 表达式 1〉 =〈 表达式 2〉
<> 不等于 〈 表达式 1〉 <>〈 表达式 2〉
Is 同引用 〈 对象 1〉 Is〈 对象 2〉
Like 匹配于 〈 字符串 1〉 Like〈 字符串 2〉
章目录 节目录
? 其中, 前 6个比较运算符所组成的关系表达式, 当符
合相应的关系时, 结果为 True,否则为 False。 如果
参与比较的表达式有一个为 Null,则结果为 Null。
? Is运算符用来比较两个对象引用 。 如果两者引用的
对象相同, 结果为 True,否则为 False。
? Like 运算符做字符串的方式比较。如果字符串 1与
字符串 2匹配,则返回 True,否则返回 False。可
以使用通配符、字符串列表或字符区间的任何组合
匹配字符串。通配符,?”代表任意一个字符,,*”
代表任意多个字符,,#”代表任何一个数字( 0~
9),,[charlist]”代表 charlist中任何一个字符,
,[!charlist]”代表任何一个不在 charlist中的字符。
节目录章目录
3.逻辑运算符
逻辑运算符用于构建逻辑表达式,返回逻辑值 True、
False或 Null(空 )。 名称、语法见表 4.4
表 4.4 逻辑运算符
符号 名称 语法
And 与 〈 表达式 1〉 And〈 表达式 2〉
Or 或 〈 表达式 1〉 Or〈 表达式 2〉
Not 非 Not〈 表达式 〉
Xor 异或 〈 表达式 1〉 Xor〈 表达式 2〉
Eqv 等价 〈 表达式 1〉 Eqv〈 表达式 2〉
Imp 蕴涵 〈 表达式 1〉 Imp〈 表达式 2〉
章目录 节目录
4.连接运算符
?字符串连接运算符有两个:, &”和, +”。
?其中, +”运算符既可用来计算数值的和, 也可
以用来做字符串的串接操作 。 不过, 最好还是
使用, &”运算符来做字符串的串接操作 。
5,运算符的优先级
?按优先级由高到低的次序排列的运算符如下:
?括号 → 指数 → 一元减 → 乘法和除法 → 整
除 → 取模 → 加法和减法 → 连接 → 比较 →
逻辑 ( And,Or,Not,Xor,Eqv,Imp) 。
节目录章目录
4.5 过程
?4.5.1 模块与过程
?4.5.2 过程的创建与运行
?4.5.3 子程序
?4.5.4 自定义函数
章目录 节目录
4.5.1 模块与过程
? 每个 VBA应用程序都存在于一个, 工程, 中 。 工程下面可分
为若干个, 模块, 。 模块包括标准模块, 类模块和对象模块
三种 。
? 模块中可以定义若干个, 过程, 。 过程中包含一系列用于执
行某个任务的语句 。 每个过程都有唯一的名字 。 过程可以是
函数, 也可以是子程序 。 函数执行一系列操作后返回一个函
数值 。 子程序只执行一个或多个操作, 而不返回数值 。 当录
制完宏查看代码时, 所看到的就是子程序 。 宏只能录制子程
序, 而不能录制函数过程 。
? 函数过程通常情况下称为函数, 要返回一个数值 。 这个数值
通常是计算的结果或是测试的结果, 例如 False 或 True。 可以
在模块中创建和使用自定义函数 。
节目录章目录
4.5.2 过程的创建与运行
?进入 Excel或打开一个工作簿, 系统自动建立
一个工程, 工程中自动包含 ThisWorkbook、
Sheet1等对象模块 。 过程可以在对象模块中
建立, 也可以在标准模块或类模块中建立 。
如果模块不存在, 首先需要向工程中添加一
个模块 。
?工作簿中的模块与过程随工作簿一起保存 。
在 VBA编辑器或工作簿窗口都可以通过, 文
件, 菜单保存工作簿 。
章目录 节目录
4.5.3 子程序
?子程序以 Sub开头, End Sub结尾 。 常用语法
格式如下:
[Public|Private] Sub 子程序名 ([<参数 >])
[<语句组 >]
[Exit Sub]
[<语句组 >]
End Sub
节目录章目录
?Public关键字可以使子程序在所有模块中有效 。
Private关键字使子程序只在本模块中有效 。
如果没有显式指定, 缺省情况是公用的 。
?子程序可以带参数 。
?Exit Sub 语句的作用是退出子程序 。
章目录 节目录
4.5.4 自定义函数
? 在 VBA中, 提供了大量的内置函数 。 比如字符串函
数 Mid(),统计函数 Max()等 。 在编程时直接引用就
可以了 。 但有时需要按自己的要求定制函数, 比如
计算半径为 R的圆的面积
A=3.14*R^2
? 我们不可能为每一个不同半径的园来写上相似的一
段代码, 而应该使用函数 。
? 用 Function 语句可以定义函数, 常用的语法 形式如
下,
节目录章目录
[Public|Private] Function 函数名 ([<参数 >]) [As
数据类型 ]
[<语句组 >]
[函数名 =<表达式 >]
[Exit Function]
[<语句组 >]
[函数名 =<表达式 >]
End Function
章目录 节目录
? 定义函数时用 Public关键字, 则所有模块都可以调
用它 。 用 Private关键字, 函数只用于同一模块 。 如
果没有显式指定, 则缺省为公用 。
? 函数名末尾可使用 As子句来声明返回值的数据类型,
参数也可指定数据类型 。 若省略数据类型说明, 系
统会自动根据赋值确定 。
? Exit Function 语句的作用是退出 Function 过程 。
节目录章目录
4.6 流程控制语句
?4.6.1 If语句
? 4.6.2 GoTo语句
?4.6.3 Select Case语句
?4.6.4 For...Next语句
? 4.6.5 Do...Loop语句
?4.6.6 With语句
章目录 节目录
4.6.1 If语句
If语句是我们最常用的一种分支语句 。 它符合人们通常的语言习惯和思
维习惯 。 If语句有三种语法形式 。
① if <条件 > then <语句 1> [else <语句 2>]
② if <条件 > then
<语句组 1>
[else
<语句组 2>]
end if
③ if <条件 1> then
<语句组 1>
[elseif <条件 2> then
<语句组 2>…
else
<语句组 n>]
end if
<条件 >是一个关系表达式或逻辑表达式 。 若值为真, 则执行紧接在关键字
then后面的语句组 。 若 <条件 >的值为假, 则检测下一个 elseif<条件 >或执
行 else关键字后面的语句组, 然后继续执行下一个语句 。
章目录 节目录
章目录 节目录
4.6.2 GoTo语句
用 GoTo语句可以无条件地转到另一条语句去执行 。 语法格式:
GoTo 标号或行号
标号以字母开头, 冒号结束, 不超过 40个字符 。 行号是一个数值

GoTo语句会影响程序的结构, 使程序阅读及调试困难 。 因此, 除
非万不得已, 尽量少使用 GoTo语句 。
章目录 节目录
4.6.3 Select Case语句
如果条件复杂, 程序需要多个分支, 用 If语句就会显得相当累赘, 而且程序变得不易阅
读 。 这时我们可以使用 Select Case 语句来写出结构清晰的程序 。
Select Case语法如下:
Select Case <检验表达式 >
[Case <比较列表 1>
[<语句组 1>]]

[Case Else
[<语句组 n>]]
End Select
其中的 <检验表达式 >是任何数值或字符串表达式 。
<比较元素 >可以是下列几种形式之一:
① 表达式
② 表达式 To 表达式
③ Is <比较操作符 > 表达式
说明:
如果 <检验表达式 >与 Case子句中的一个 <比较元素 >相匹配, 则执行该子句后面的语句
组 。
<比较元素 >若中含有 To关键字, 则第一个表达式必须小于第二个表达式, <检验表达式
>值介于两个表达式之间为匹配 。
<比较元素 >若含有 Is关键字, Is代表 <检验表达式 >构成的关系表达式的值为真则匹配 。
章目录 节目录
4.6.4 For...Next语句
For...Next是一个循环语句, 其语法形式如下:
For 循环变量 =初值 To 终值 [Step 步长 ]
[<语句组 >]
[Exit For
<语句组 >]
Next [循环变量 ]
该循环语句执行时, 首先把循环变量的值设为初值, 如果循环变
量的值没有超过终值, 则执行循环体, 遇到 Next,把步长加到循环
变量上, 若没有超过终值, 再循环, 直至循环变量的值超过终止时
,才结束循环, 继续执行后面的语句 。
步长可正, 可负, 为 1时可以省略 。 遇到 Exit For时, 退出循环 。
章目录 节目录
4.6.5 Do...Loop语句
Do...Loop语句可以循环执行语句组, 它有以下两种形式:
① Do[{While|Until}<条件 >]
[<过程语句 >]
[Exit Do]
[<过程语句 >]
Loop
② Do
[<过程语句 >]
[Exit Do]
[<过程语句 >]
Loop [{While|Until}<条件 >]
上面格式中, While和 Until的作用正好相反 。 使用 While,则当 <条件 >为真继
续循环 。 使用 Until,则当 <条件 >为真时, 结束循环 。
把 While或 Until放在 Do子句中, 则先判断后执行 。 把一个 While或 Until放在
Loop子句中, 则先执行后判断 。
章目录 节目录
4.6.6 With语句
在引用对象的时候,用 With可以简化代码中对复杂对象的引用
。可以用 With语句建立一个, 基本, 对象,然后进一步引用这
个对象上的对象、属性或方法,直至终止 With语句。其语法形
式如下:
With<对象引用 >
[<语句组 >]
End With
4.7.1 尽量使用系统提供的属性, 方法和函数
4.7.2 尽量减少使用对象引用
4.7.3 减少对象的激活和选择
4.7.4 关闭屏幕更新
4.7.5 变量和常量的使用
章目录 节目录
4.7 VBA应用程序的优化
章目录 节目录
4.7.1 尽量使用系统提供的属性, 方法和函数
Office对象有上百个, 对象的属性, 方法, 事件更是多不胜数, 对于初学者来
说可能对它们不全部了解, 因此不能很好地利用这些对象的属性, 方法和函数,
而另编 VBA代码段实现相同的功能 。 自编代码段一般要比原有对象的属性, 方法
和函数完成任务的效率低的多 。
充分利用 Worksheet函数是提高程序运行速度的有效的方法 。
4.7.2 尽量减少使用对象引用
每个对象的属性, 方法的调用都需要通过 OLE接口的一个或多个调用, 这些
OLE调用都是需要时间的, 减少使用对象引用能加快 VBA代码的运行 。
如果一个对象引用被多次使用, 则可以将此对象用 Set设置为对象变量, 以减
少对对象的访问次数 。
在循环中要尽量减少对象的访问 。
章目录 节目录
4.7.3 减少对象的激活和选择
如果你的通过录制宏来学习 VBA的, 则你的 VBA程序里一定充满了对象
的激活和选择, 但事实上大多数情况下这些操作不是必需的 。
4.7.4 关闭屏幕更新
关闭屏幕更新是提高 VBA程序运行速度的最有效的方法 。 关闭屏幕更新
的方法:
Application.ScreenUpdate = False
请不要忘记 VBA程序运行结束时再将该值设回来:
Application.ScreenUpdate = True
4.7.5 变量和常量的使用
尽管在代码中使用 Variant变量很方便, 但 VBA在处理 Variant变量值比处理显式
类型变量需要更多的时间 。 使用 Integer或 Long变量代替 Variant变量处理不带小数
的计算速度会更快 。
但使用显式变量会牺牲掉灵活性, 如此时可能会遇到溢出问题, 而使用 Variant
变量则能自动处理这种情况 。
章目录 节目录
4.8 信息及代码的保护
4.8.1 利用 VBA设置工作表使用权限
通常, 我们用 EXCEL菜单中的, 保护, 命令来保护工作表, 但有时尚嫌不
足 。 这时可以在 VBA编辑器中对需要保护的工作表编码 。
4.8.2 程序代码的保护
为了不让使用者查看和修改程序代码, 需要对代码进行保护 。 方法如下:
进入 VBA 编辑环境, 打开, 工程资源管理器, 窗口, 用鼠标右击工程
( VBAProject),在弹出菜单中选, VBAProject属性, 项, 在, VBAProject 工程
属性, 对话框的, 保护, 卡中, 选中, 查看时锁定工程, 复选框, 然后输入并确
认, 查看工程属性的密码,, 最后单击, 确定, 按钮, 保存当前工作簿并退出 。
再次打开工作簿时, 要查看或者修改程序代码, 必须输入正确的密码 。
章目录 节目录
4.9 应用举例
4.9.1 在 Excel中实现定时提醒
4.9.2 在 Word当前文档中插入多个文件的内容
4.9.3 用 Word VBA查汉字区位码
4.9.4 在 Word中快速输入 GB2312全部汉字
4.9.5 在 Word文档中统计指定字符的出现次数
4.9.6 中文小大写金额 转换函数
1,在上午 8点 45分显示一个提醒信息 。
进入 Excel的 VBA编辑环境, 在任意一个模块中定义两个过程:
运行过程 Run_it,到指定的时刻, 屏幕出现的信息如图所示 。
簿后, 每十分钟提醒依次存盘 。
进入 Excel的 VBA编辑环境, 在模块中定义三个过程:
auto_open过程在打开文档时自动运行, 它发出提示信息后, 调用过程 runtimer
,过程 runtimer用 Now+TimeValue("00:10:00") 指定在当前时间过 10分钟开始运行
Saveit这个过程 。
过程 Saveit 发出提示信息并提供三种选择:如果选择, 是,, 则通过
ActiveWorkbook.Save方法存盘;选择, 否,, 不存盘, 但再次调用 Runtimer;选
择, 取消,, 则结束程序, 不再提示 。 屏幕出现的提示信息如图所示 。
章目录 节目录
章目录 节目录
4.9.2 在 Word当前文档中插入多个文件的内容
在 Word应用中, 有时需要连续往当前文档插入多个文件的内容 。 一般我们是在, 插入, 菜
单中选, 文件, 项, 然后选择文件夹和文件进行插入 。 重复以上操作, 可插入需要的所有文件
内容 。 若插入的文件较多, 用这种办法就显得枯燥而低效 。 而用 VBA程序使上述工作自动化,
可以大大减轻操作负担, 提高工作效率 。
比如, 将长篇文稿分给几十个人录入, 最后合并到一个文档;将事先做好的十几个图形文件
插入当前文档;从中央电视台网站下载的节目时间表中, 各台节目是一个独立的文本文件, 将
它们合并到一个文档 。 尽管这些工作量不是很大, 但用一段小程序自动实现, 还是可以节省一
定时间的, 感觉也是大不一样的, 更重要的是应用水平, 应用技巧的提高会多方面受益的 。
下面以下载的中央电视台 1至 8套节目时间表合并为例, 介绍程序的设计过程和方法, 相信对
读者会有所启发 。
1,语句, 函数的选用和程序初稿的形成
用一个不太熟悉的编程环境或语言编写程序, Office XP的宏可以帮我们大忙, 它可以使部
分程序的设计自动化 。 将需要的操作过程录制为宏, 就得到了相应的程序, 其中该用哪些语句
,函数我们一看便知,
进入 Word 2002,选择, 工具 |宏, 菜单的, 录制新宏, 项, 在弹出的对话框中用默认的宏名
Macro1,单击, 确定, 按钮后就可以进行宏录制了 。
用, 格式, 工具栏的按钮设置号字为, 3号,, 对齐方式为, 居中,, 输入, 中央 1套,, 回
车 。
设置号字为, 5号,, 对齐方式为, 两端对齐,, 选, 插入, 菜单的, 文件, 项, 在对话框
中选择需要的文件夹和文件 ( 如 C:\My Documents\八套 \01.txt), 单击, 插入, 按钮, 在当前文
当中插入该文件的内容 。
停止录制宏 。
在“工具 |宏”菜单中选“宏”项,在弹出的对话框中选 Macro1,单击“编辑”按钮
章目录 节目录
2,加工初稿得到需要的程序
通过宏的录制过程和对应代码的分析, 我们不难发现各语句和函数的作用 。 上面录制的
宏, 只是设置了字号, 对齐方式, 输入了一行文字, 插入了一个文本文件的内容 。 我们的
目的是连续插入多个文本文件的内容, 并进行必要的格式控制 。 因此, 对录制的宏进行修
改 。
3,运行程序
在, 工具 |宏, 菜单中选, 宏, 项, 在弹出的对话框中选 Macro1,单击, 运行, 按钮,
就会将中央电视台 1至 8套节目时间表按顺序插入到当前文档, 每套节目前边有一个标注文
字 ( 三号字, 居中 ), 然后是具体节目时间表 ( 五号字, 两端对齐 ) 。
为便于操作, 也可以自定义一个工具栏, 将宏指定为工具栏上的一个按钮 。 不用时可删
除自定义工具栏和按钮 。
以上过程看起来好像也比较复杂, 实际上真正的意义是一次定义多次使用, 而且举一反
三, 类似的问题可以直接编程处理 。
比如, 要往当前文档插入多个图形文件, 文件路径为, D:\gif”,文件名为, bs01.gif”、
,bs02.gif”,……,, bs20.gif”,可直接创建一个宏或进入 VBA编程环境定义一个过程,
程序运行后, 将 15个图形文件依次插入当前文档 。 请读者自行分析代码 。
章目录 节目录
4.9.3 用 Word VBA查汉字区位码
为了保证汉字信息输入到计算机的准确性, 许多场合要使用汉字的区位码 。 因
此, 填报相关材料 ( 如中考, 高考志愿表等 ) 时, 汉字信息需要同时填写区位码
。 通常, 区位码可以查表得到, 但是如果手头暂时没有区位码表, 怎么查找每个
汉字的区位码呢? 下面的 VBA小程序可以帮助我们解决问题 。
进入 Word 2002,选, 工具 |宏, 菜单的, 宏, 项, 在, 宏, 对话框中输入宏名
,查区位码,, 单击, 创建, 按钮, 进入 VBA编辑环境
选中要查区位码的汉字, 选择, 工具 |宏, 菜单的, 宏, 项, 在, 宏, 对话框中
选中宏名, 查区位码,, 单击, 运行, 按钮, 就可得到该汉字的区位码 。
为了便于操作, 可以自定义一个工具栏, 将宏, 查区位码, 指定为工具栏上的
一个按钮:选择, 工具, 菜单的, 自定义, 项, 在, 自定义, 对话框中选, 工具
栏, 卡, 然后单击, 新建, 按钮, 设置工具栏名称后, 单击, 确定, 按钮 。 在,
自定义, 对话框的, 命令, 卡中选, 宏,, 将宏, 查区位码, 用鼠标拖到自定义
工具栏 。 以后, 只要单击自定义工具栏上的按钮, 就可以查出选定汉字的区位码

章目录 节目录
4.9.4 在 Word中快速输入 GB2312全部汉字
我国于 1981年颁布了信息交换用汉字编码字符集 ——基本集的国家标准, 即 GB2312。
对 6763个汉字, 628个图形字符进行了统一编码, 为信息处理和交换奠定了基础 。 我们用
计算机处理的汉字一般都没有超出这 6763个 。
由于某种特殊需要 ( 比如:打印字帖, 打印区位码表等 ), 应该输入 GB2312的全部汉
字 。 一个个从键盘输入既慢又容易出错, 显然不是好办法 。 用 Word的 VBA编一个小程序
,可以轻松地解决这个问题 。 具体做法:
进入 Word2002,选, 工具 |宏, 菜单的, 宏, 项, 在, 宏, 对话框中输入宏名, 输入汉
字集,, 单击, 创建, 按钮, 进入 VBA编辑环境
该程序是一个双重循环结构, 外层循环得到汉字内码的高位 ( 范围是 176到 247之间的整
数 ),内层循环得到汉字内码的低位 ( 范围是 161到 254之间的整数 ),将内码的高位和低位
以十六进制数字符形式拼接, 即得到一个汉字的完整内码, 用 chr函数将内码转换为汉字
,可输入到当前文档 。 整个循环程序结束后, GB2312的全部汉字便输入到当前文档 。
上述宏创建后, 在 Word 2002种选择, 工具 |宏, 菜单的, 宏, 项, 在, 宏, 对话框中选
中宏名, 输入汉字集,, 单击, 运行, 按钮, 便可得到 GB2312的全部汉字 。
4.9.5 在 Word文档中统计指定字符的出现次数
有时候, 要对某些字符 ( 或汉字 ) 在文档中的出现次数进行统计 。 要完成这一任务, 可用 Word
2002中的 VBA程序 。
1,定义窗体和控件
在 Word 2002中, 按 Alt+F11键, 进入 VBA编辑环境 。 在, 插入, 菜单中选, 用户窗体, 项, 新建
一窗体 Userform1,右击窗体, 在快捷菜单中选, 属性, 项, 设置窗体的 caption属性为, 字符统计,
。 在窗体中放置以下控件:
复选框 CheckBox1,Caption=“区分大小写, 。
文字框 TextBox1。
命令按钮 CommandButton1,Caption=“统计, 。
标签 Label1,Caption=“输入您要统计的字符 ( 或汉字 ),,
2,编写程序代码
3,使用
打开要统计的文档, 运行上面定义的窗体 。 在窗体的文本框中输入要统计的字符, 如, VBA”,然
后选择是否区分大小写, 单击, 统计, 按钮, 便可以进行统计了 。
统计完成后, 弹出消息框, 报告统计的结果, 如图所示 。
章目录 节目录
章目录 节 目录
4.9.6 中文小大写金额转换函数
各种计算机报刊, 网站介绍的小写到大写金额转换程序为数不少, 通过设置
Excel 2002单元格的特殊格式, 也可以将数字转换为中文大写数字 。 但这些程序
或方法有的不够实用, 有的输出格式不符合财会规定, 也有的程序过于冗长 。
这里给出一个用 VBA实现的函数, 能够将小写金额转换成规范的中文大写金
额, 程序短小精悍, 调用方便, 有实用性 。
1,函数的定义
注意:函数的调用参数小写金额要求必须是文字型, 而且一定要有两位小数 。
2,函数的调用
函数在 Office XP的应用程序中定义之后, 就可以象内部函数一样调用 。 比如,
在 Excel任意一个工作表的 B2单元个输入公式, =xdx(A2)”,然后用填充句柄向下
填充若干行, 只要在 A列输入小写金额, B列马上就可以显示出对应的大写金额

注意,A列单元个的格式要设置为, 数字作为文字处理,, 输入的数值要带有
两位小数 。