资源描述
第1章 VBA基础知识
1.1 VBA及其特点
一、什么是VBA ?
VBA(Visual Basic for Applications)是Microsoft Office 系列的内置编程语言,即应用程序中的VB(Visual Basic)。
它“寄生于”Office应用程序,是Office 套装软件的一个重要组件。
它面向对象(OOP),可视化,容易入门,可以实现日常工作的自动化。
二、VBA编程优点
1.程序只起辅助作用,大部分功能用Office的,因此简化了程序设计。打印、文件处理、格式化和文本编辑等功能不必另行设计。
2.通过宏录制,可以部分地实现程序设计的自动化,大大提高软件开发效率。
3.发行方便,只要发行含有VBA代码的文档或模板即可,属于绿色软件。Office界面熟悉,便于软件推广应用。
4. Office界面对于广大计算机应用人员来说比较熟悉,符合一般操作人员的使用习惯,便于软件推广应用。
5.用VBA编程非常简单,即使非计算机专业人员,也可以很快编出自己的软件。
三、VBA应用前景
Bill Gates说过:VBA已经不再是单纯的技术了,它正快速地朝着一个标准化的程序开发平台的目标前进,就好像现在的Windows、Internet的角色一样。
VBA是即将兴起的、很有前途的编程语言,在Office环境下用VBA开发应用软件,将成为软件开发人员和计算机应用人员首选方式。
目前在众多的Office应用人员当中,80%以上的人,仅仅在使用这些软件20%左右的基本功能,真正精彩的部分——VBA编程,没有被开发和使用。
四、VBA和VB的主要区别
1. VB用于创建标准的应用程序,VBA是使已有的应用程序(Office)自动化。
2. VB具有自己的开发环境,VBA寄生于已有的应用程序(Office)。
3. VB开发出的应用程序可以是可执行文件(*.EXE),VBA开发的程序必须依赖于它的“父”应用程序(Office)。
1.2 宏
宏(Macro)—— 子程序
一、宏的安全性
为了防止“宏病毒”,Office提供了一种安全保护机制,就是设置“宏”的安全性。
当我们需要频繁使用带有VBA代码的应用软件时,完全可以把“宏”的安全性设置为“低”,而把宏病毒与其他成千上万种病毒同样对待,用统一的防护方式和防毒工具进行防毒。
二、宏的录制与执行
1.录制
①进入Excel。
②在“工具|宏”菜单中选“录制新宏”项。
③在“录制新宏”对话框中输入宏名,单击“确定”按钮。
④进行需要的操作。
⑤单击“停止录制”工具栏按钮,或选择“工具|宏|停止录制”菜单结束宏录制。
2.执行
“工具|宏|宏”菜单
三、宏的编辑
1.进入编辑状态
①“工具|宏|宏”菜单
②选择宏名
2.代码说明
Sub、End Sub —— 子程序开始、结束
单引号 —— 注释
With、End With —— 结构语句
圆点 —— 对象之间,或者对象及其属性、事件、方法、事件之间的分隔符。表示隶属关系。
3.代码修改
①删除注释和无关语句
②加入循环结构
“&”—— 字符串连接运算符
4.编码方法
①录制
②改编
四、指定宏保存的位置
Excel:当前工作簿、新工作簿、个人宏工作簿。
◆保存在当前工作簿或新工作簿 —— 只有该工作簿打开时,相应的宏才可以用。
◆保存在个人宏工作簿 —— 在当前机器上多个工作簿都能使用。
Word: Normal模板、当前文档中。
◆保存在当前文档 —— 只有该文档打开时,相应的宏才可以用。
◆保存在Normal模板—— 在当前机器上都能使用。
五、为宏指定快捷键
1.创建宏时指定快捷键
2.录制宏后指定快捷键
①“工具|宏|宏”菜单
②选择宏
③单击“选项”按钮
【例1.1】利用Word宏快速录入上角标。
六、将宏指定给按钮
①在Excel中打开“窗体”工具栏(Word的窗体工具栏没有“按钮”)
②在工作表添加按钮
③为它指定宏
④按钮属性设置 —— 右击
七、将宏指定给图片或工具栏按钮
1.指定宏到图片
①用“插入|图片”菜单工作表中放置图片
②右击图片,在快捷菜单中选“指定宏”
2.指定给“工具栏按钮”
①选择“工具|自定义”菜单。
②在“命令”卡中,从“类别”列表框中选择“宏”,从“命令”列表框中将“自定义按钮”拖动到任意一个工具栏上。
③右击该按钮,选择“指定宏”。
④选择需要的宏名并单击“确定”按钮。
⑤单击“关闭”按钮。
3.从工具栏中删除自定义按钮
①选择“工具|自定义”菜单
②用鼠标将按钮从工具栏中拖出
4.创建新的工具栏
①在“自定义”对话框的“工具栏”卡中,单击“新建”按钮。
②输入工具栏名,单击“确定”按钮。
范例1-1 在Word当前文档中插入多个文件的内容
1.要求
将从中央电视台网站下载的1至8套节目时间表合并到一个文档中,并进行格式控制。
2.实现步骤
①语句、函数的选用和程序初稿的形成
录制宏 —— 设置3号字、居中,输入“中央1套”,回车。
设置5号字,两端对齐”。
插入文件(01.txt)。
②加工初稿得到需要的程序
设置路径
循环
使用变量
③运行程序。定义快捷健、工具栏。
范例1-2 设计一个名片制作模板
1. 页面及图文框设置
进入Word,在“页面设置”对话框中设置“纸张”宽度和高度分别为19.5厘米和29.5厘米,“页边距”上、下、左、右边距均为0.7厘米。
“插入”→“文本框|横排”
将“文本框”转换为“图文框”
设置图文框固定宽度、高度值分别为8.6厘米和5.4厘米,无边框。
2. 定义“复制排版”工具按钮并进行宏录制
在“录制新宏”对话框中:
① 指定一个宏名“复制排版”。
② 指定将宏保存在当前文档。
③ 新建工具栏“名片”,将宏“Project.NewMacros.复制排版”拖动到新建工具栏。改名为“复制排版”。
进行宏录制:
按Ctrl+X,剪切选定的图文框。然后按十次Ctrl+V快捷键,将图文框粘贴十份。
按Alt+↑键,选中一个图文框,设置水平位置为“左侧”,相对于“页边距”。设置垂直位置为“底端”,相对于“页边距”。
再按Alt+↑键,选中下一个图文框,用类似的方式设置水平位置为“右侧”,相对于“页边距”。垂直位置为“底端”,相对于“页边距”,停止宏录制。
3. 对代码进行加工和优化
去掉一些用于进行默认设置的不必要语句,添加循环语句,得到“复制排版”子程序。
4. 使用方法
① 直接用鼠标双击“名片模板”或进入Word 2003后,打开“名片模板”。
② 在图文框中输入名片的具体内容、设置字体字号、进行排版,也可以插入图片和进行艺术加工,设计出一张名片样板。
③ 选中名片样板图文框。
④ 单击“名片”工具栏上的“复制排版” 按钮,Word便自动将设计好的名片样板复制10份并均匀地排列在整张名片纸上。
⑤ 用“文件”菜单中的“打印”命令将整联名片打印输出。
1.3 VBA语法基础
一、注释、连写和断行
两种注释方式:
(1) 使用Rem语句。
(2) 用单引号(')号。
连写:
在一行写几个语句,用“:”分隔。
断行:
一个语句分开写成几行,用空白加下划线(_)。
二、变量和常量
1.常用的变量数据类型
数据类型
存储空间
数值范围
Boolean(布尔)
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.79769313486232E308
Date(日期时间)
8字节
日期:100年1月1日 ~ 9999年12月31日
时间:00:00:00~23:59:59
Object(对象)
4字节
任何引用对象
String(字符串)
字符串
的长度
变长字符串:0 ~ 20亿个字符
定长字符串:1 ~ 64K个字符
2.声明变量
变量可以不经声明直接使用,但占用存储空间较大,效率较低。
Dim语句声明局部变量 —— 声明语句放到过程中,变量在过程内有效;声明语句放到模块的声明部分,变量在模块中有效。
Public语句用来声明公共变量。公共变量可用于工程中的任何过程。
3.声明数组
通常用 Dim 或 Public 语句来声明。
默认的下标下限是0,用Option Base 语句可设置为1。
例:
Dim MyArray(10,10) As Integer
声明了一个11行乘以11列的Integer型二维数组。
Dim sngArray() As Single
声明的是一个动态数组。
4.常量
声明常量用const语句。
例:
Const PI As Single = 3.1415926
Public Const E As Single = 2.7182
三、运算符
1.算术运算符
符号
作用
示例
+
加法
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.比较运算符
符号
名称
用法
<
小于
〈表达式1〉<〈表达式2〉
<=
小于或等于
〈表达式1〉<=〈表达式2〉
>
大于
〈表达式1〉>〈表达式2〉
>=
大于或等于
〈表达式1〉>=〈表达式2〉
=
等于
〈表达式1〉=〈表达式2〉
<>
不等于
〈表达式1〉<>〈表达式2〉
Is
同引用
〈对象1〉Is〈对象2〉
Like
匹配于
〈字符串1〉Like〈字符串2〉
Is运算符用来比较两个对象引用。如果两者引用的对象相同,结果为True,否则为False。
假如MyObject、OtherObject是两个不同的对象,执行语句
Set YourObject = MyObject
Set ThisObject = MyObject
Set ThatObject = OtherObject
MyCheck1 = YourObject Is ThisObject
MyCheck2 = ThatObject Is ThisObject
后,MyCheck1 返回 True,MyCheck2返回 False。
Like 运算符做字符串的方式比较。如果字符串1与字符串2匹配,则返回 True,否则返回 False。
可以使用通配符、字符串列表或字符区间的任何组合匹配字符串。通配符:
“?”代表任意一个字符
“*”代表任意多个字符
“#”代表任何一个数字(0~9)
“[charlist]”代表charlist中任何一个字符
“[!charlist]”代表任何一个不在charlist中的字符
例如:
MyCheck = "aBBBa" Like "a*a" ' 返回 True。
MyCheck = "F" Like "[A-Z]" ' 返回 True。
MyCheck = "F" Like "[!A-Z]" ' 返回 False。
MyCheck = "a2a" Like "a#a" ' 返回 True。
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' 返回 True。
MyCheck = "BAT123khg" Like "B?T*" ' 返回 True。
MyCheck = "CAT123khg" Like "B?T*" ' 返回 False。
3.逻辑运算符
符号
名称
语法
And
与
〈表达式1〉And〈表达式2〉
Or
或
〈表达式1〉Or〈表达式2〉
Not
非
Not〈表达式〉
Xor
异或
〈表达式1〉Xor〈表达式2〉
Eqv
等价(同或)
〈表达式1〉Eqv〈表达式2〉
Imp
蕴涵(条件)
〈表达式1〉Imp〈表达式2〉
其中:P等价Q,当P和Q的真值相同时,结果为真,否则为假。
P蕴含Q,当P为真Q为假时,结果为假,否则为真。
4.连接运算符
“+” —— 既可计算数值的和,也可以做字符串的连接。
“&” —— 字符串连接。
例如:
MyStr = "Check " & 123 ' 返回 "Check 123"。
MyNumber = "34" + 6 ' 返回 40。
MyNumber = "34" + "6" ' 返回 "346"(字符串被串接起来)。
5.运算符的优先级
由高到低次序如下:
括号 → 指数 → 一元减 → 乘法和除法 → 整除 → 取模 → 加法和减法 → 连接 → 比较 → 逻辑(Not、And、Or、Xor、Eqv、Imp)。
【例1.4】百钱买百鸡问题
假设公鸡每只5元,母鸡每只3元,小鸡3只1元。要求用100元钱买100只鸡,问公鸡、母鸡、小鸡可各买多少只?请编一个VBA程序求解。
设公鸡、母鸡、小鸡数分别为x、y、z,则可列出方程组:
x+y+z=100
5x+3y+z/3=100
这里有三个未知数、两个方程式,说明有多个解。可以用穷举法求解。
范例1-3 用Word VBA查汉字区位码
1.开发背景
2.程序代码
3.自定义工具栏
4.改进——在每个汉字的右边填写对应的区位码
宏录制——获取代码(光标右移、填写文本)
改写代码
范例1-4 在Word中快速输入“国标”全部汉字
1、试验——输入一个汉字
①通过录制获得代码 —— 输入汉字。
②修改代码
nm = &HB0A1
Selection.TypeText Text:=Chr(nm)
2、编程——输入汉字集
汉字内码高位字节BO(176)~F7(247),低位字节A1(161)~FE(254)
1.4 对象、属性、事件和方法
对象 —— 将数据和操作过程结合在一起的数据结构。如窗体、命令按钮、文本框等都是对象。
属性 —— 对象的特性。如大小、颜色、状态等。
事件 —— 是一个对象可以辨认的动作。如单击鼠标或按下某键等。
方法 —— 对象能执行的动作。如刷新等。
【例1.5】用Excel工作表制作一个会议签到单。当每个与会人员报道时,在其姓名右边的单元格单击鼠标,自动填入当前日期和时间。
设计要点:
工作表、SelectionChange事件
获取行列号——两种方法(Row、Column;Address)
填写当前日期、时间——两种方法(Date、Time;Format)
若删除单元格中输入的内容,可按Del键。
范例2-5在Excel中实现定时提醒。
1.在上午8点45分显示一个提醒信息。
进入Excel的VBA编辑环境,在任意一个模块中定义以下两个宏:
Sub Run_it()
Application.OnTime TimeValue("8:45:00"), "Show_my_msg"
End Sub
Sub Show_my_msg()
MsgBox "现在是8点45分,9点钟您有个约会!", vbInformation, "提醒"
End Sub
2.模仿“自动保存”功能,在打开Excel工作簿后,每10秒钟提醒依次存盘。
利用Excel“工具|宏”菜单的“宏”项,创建以下三个宏:
Sub auto_open()
MsgBox "在这篇文档里,每10秒钟出现一次保存提示!", vbInformation, "注意"
Call runtimer
End Sub
Sub runtimer()
Application.OnTime Now + TimeValue("00:00:10"), "SaveIt"
End Sub
Sub SaveIt()
msg = MsgBox("您已经10秒钟没存盘了,现在就存盘吗?" & Chr(13) & Chr(13) _
& "选 择 是:立刻存盘" & Chr(13) _
& "选 择 否:暂不存盘" & Chr(13) _
& "选择取消:不再出现这个提示", vbYesNoCancel + 64, "提醒")
If msg = vbYes Then
ActiveWorkbook.Save
ElseIf msg = vbCancel Then
Exit Sub
End If
Call runtimer
End Sub
1.5 过程
一、工程、模块与过程
每个VBA应用程序都存在于一个“工程”中。工程下面可分为若干个“模块”。
模块包括标准模块、类模块和对象模块三种。通常,大部分工作集中在标准模块(简称为模块)中。
模块中可以定义若干个“过程”。过程可以是函数、子程序或属性。
【例1.6】子程序过程
Sub cmdSmallFont_Click()
With Selection.Font
.Name="Arial"
.FontStyle="Regular"
.Size=16
End With
End sub
【例1.7】函数过程
下面是一个计算运费的函数过程:
Public Function Shipping(Price)
Shipping = Price * 0.1
End Function
二、过程的创建
【方法1】直接输入代码。
①打开要编写过程的模块。
②键入Sub、Function或 Property,分别创建Sub、Function 或 Property过程。
③在其中键入过程的代码。
【方法2】用“插入过程”对话框。
①打开要编写过程的模块。
②在“插入”菜单上选择“过程”项。
③在“插入过程”对话框中的“名称”框键入过程的名称。选定要创建过程的类型:Sub、Function 或 Property。设置过程的范围为 Public 或 Private。
如果选定“把所有局部变量声明为静态变量”,则在过程的定义中会加上Static 关键字。
【例1.8】创建一个显示消息框的过程。
①在Excel中,选择“工具|宏|Visual Basic编辑器”菜单。
②在工具栏上单击“工程资源管理器”按钮,或按Ctrl+R键,在VBA编辑器的左面打开“工程资源管理器”窗口。
③在工程资源管理器窗口的任意位置单击鼠标右键,在快捷菜单中选择“插入|模块”项。
④在VBA编辑器右面的代码窗口中,选择“插入|过程”菜单。
⑤输入“显示消息框”作为过程名字。在“类型”分组框中,选择“子程序”。
⑥在过程中输入语句,得到下面代码段:
Public Sub 显示消息框()
Msgbox "这是我的第一个过程"
End Sub
⑦运行一个过程。使用“运行”菜单的“运行子程序/用户窗体”项,也可以工具栏按钮或F5快捷键。
三、代码的运行与调试
1. 运行
【方法1】使用“运行”菜单的“运行子过程/用户窗体”命令。
【方法2】单击工具栏的“运行子过程/用户窗体”按钮。
【方法3】用F5快捷键。
如果要中断执行,可用以下几种方法:
【方法1】选择“运行”菜单中的“中断”命令。
【方法2】用Ctrl+Break快捷键。
【方法3】使用工具栏中的“中断”按钮。
【方法4】选择“运行”菜单中的“重设置”项。
【方法5】使用工具栏中的“重新设置”按钮。
要继续执行,可用以下几种方法:
【方法1】在“运行”菜单中选择“继续”项。
【方法2】按F5键。
【方法3】按ALT+F5 键,跳过错误处理程序并继续执行。
【方法4】使用工具栏中的“执行宏”按钮。
【方法5】在“调试”菜单中选择“逐语句”、“逐过程”、“跳出”或“运行到光标处”等命令或使用相应的快捷键F8、SHIFT+F8、CTRL+SHIFT+F8或CTRL+F8。
2. 跟踪代码的执行
在“调试”菜单中选定“逐语句”、“逐过程”、“跳出”或“运行到光标处”命令,或使用相应的快捷键F8、Shift+F8、Ctrl+Shift+F8或Ctrl+F8。
在跟踪过程中,只要将鼠标指针移动到任意一个变量名上,就可以看到该变量当时的值。
3. 设置与清除断点
将光标定位在需要设置断点的代码行,然后用以下方法可以设置或清除断点:
【方法1】在“调试”菜单中单击“切换断点”。
【方法2】按F9键。
【方法3】在对应代码行的左边界标识条上单击鼠标。
【方法4】使用“调试”工具栏的“切换断点”按钮。
要清除应用程序中的所有断点,可在“调试”菜单中选择“清除所有断点”命令。
四、子程序
语法格式:
[Public|Private] Sub 子程序名([<参数>])
[<语句组>]
[Exit Sub]
[<语句组>]
End Sub
(Public可省略不写)
【例1.9】求矩形面积的子程序。两个参数L和W,分别表示矩形的长和宽。
Sub mj(L, W)
Dim S As Single
If L = 0 Or W = 0 Then
Exit Sub
End If
S = L * W
MsgBox S
End Sub
调用子程序例:
Call mj(8,9)
【例1.10】在Word中编写一个VBA子程序,输出所有的“玫瑰花数”到当前文档。
玫瑰花数(水仙花数):三位数,其各位数字立方和等于该数本身。
Sub 玫瑰花数()
For n = 100 To 999
i = n \ 100
j = n \ 10 - i * 10
k = n Mod 10
If (n = i * i * i + j * j * j + k * k * k) Then
Selection.TypeText Text:=Format(n, "@@@@@")
End If
Next
End Sub
五、自定义函数
语法:
[Public|Private] Function 函数名([<参数>]) [As 数据类型]
[<语句组>]
[函数名=<表达式>]
[Exit Function]
[<语句组>]
[函数名=<表达式>]
End Function
(Public可省略不写)
若省略返回值类型说明,系统会自动根据赋值确定。
例:
定义一个求圆面积的函数。
Public Function area(R As Single) As Single
area = 3.14 * R ^ 2
End Function
该函数也可简化为:
Function area(R)
area = 3.14 * R ^ 2
End Function
自定义函数调用方式与系统内部函数相同。
【例1.11】制作一个如图1.10所示的“XX单位党员应交党费清单”。标准为:“基础工资”与“基础津贴”之和不超过600元者,按1%交纳党费;超过600元但不超过800元者,按1.5%交纳党费;超过800元但不超过1500元者,按2%交纳党费;超过1500元者,按3%交纳党费。要求用自定义函数计算“比率”。
制作方法:
①进入Excel,建立一个工作簿,在工作表中输入基本信息。
②进入VBA编辑环境,在当前工程中插入一个模块,然后建立自定义函数。
③在相应的单元格输入计算公式和函数,并将公式和函数填充到需要的区域。
【例1.12】打印一个如图1.12所示的“XX高校教师信息表”。项目包括:姓名、性别、年龄、职称、身份证号。要求年龄由身份证号求出并填入表格。
实现方法:
①进入Excel,建立一个工作簿,在工作表中输入基本信息。
②进入VBA编辑环境,在当前工程中插入一个模块,然后建立自定义函数。
③在相应的单元格输入计算公式和函数,并将公式和函数填充到需要的区域。
【例1.13】用VBA程序,在Word当前文档中输出若干素数。
子程序:
Sub out_p()
For n = 3 To 8000
If isprime(n) Then
ActiveDocument.Content.InsertAfter Text:=n & " "
End If
Next
End Sub
自定义函数:
Function isprime(n)
For k = 2 To Sqr(n)
If n Mod k = 0 Then
isprime = False
Exit Function
End If
Next
isprime = True
End Function
范例1-6 中文小大写金额转换函数。
通过设置Excel单元格的“特殊”格式,也可以将小写数字转换为中文大写数字,但不够实用。
1.设计简单函数、调试、分析
2.函数的调用
与内部函数调用方式相同。
注意:函数的调用参数小写金额要求必须是文字型,而且一定要有两位小数。所以,单元个的格式要设置为“数字作为文字处理”,输入的数值要带有两位小数。
3.分析范例代码
展开阅读全文