Excel VBA程序开发自学通 2015-6-15 第 46页 /共 510页
图4.1 工作表属性列表 图4.2 从对象浏览器调整显示隐藏属性
然而,这种方式仍然有局限制,即下拉列表即有属性又有方法,不利于查看。所以方法2可以有针对性的查看属性。
2.查看帮助
在VBA的帮助中有着完善的对象、属性、方法查询系统。仍然Worksheets 对象为例,需要查看其属性的步骤如下:
(1)在VBE窗口中按下快捷键【F1】调出帮助窗口; (2)在搜索栏中输入“Worksheets 对象成员”并回车;
(3)查找结果中包含了100项关于Worksheets 对象成员的信息,见图4.3所示。单击第一项“Worksheets 对象成员”即可查看到Worksheets对象的成有属性和方法属性和方法是分开罗列出来的,见图4.4所示。
图4.3 查找Worksheets 对象成员 图4.4 帮助中的Worksheets属性列表
Excel VBA程序开发自学通 2015-6-15 第 47页 /共 510页
4.1.3 如何理解方法
方法指的是对象能执行的动作。它是一个动词,而对象是一个名词。但是初学者需要记住,它的语法与汉语语法是不同的。
“创建工作表”:创建是动词,表示方法,“工作表”是名词,代表对象。 在VBA中却需要对象在前,方法在后,示例如下:
worksheets.add:worksheets是工作表对象,add是方法,表示新建。
和4.1.2小节中的办法一致,在帮助中可以到关于worksheets的所有方法,见表4-2所示:
表4-2 worksheets方法一览
名称 说明 新建工作表、图表或宏表。新建的工作表将成为活Add 动工作表 Copy 将工作表复制到工作簿的另一位置 Delete 删除对象 将单元格区域复制到集合中所有其他工作表的同一FillAcrossSheets 位置 Move 将工作表移到工作簿中的其他位置 PrintOut 打印对象 PrintPreview 按对象打印后的外观效果显示对象的预览 Select 选择对象 4.1.4 判断对象的属性与方法
从图4.1中可以看出,每个对象的属性和方法都同时出现在成员列表中。那么如
何区分哪个项目是属性,哪一个是方法呢?主要要三种办法:
1.根据自动成员列表中的图标判断
成员列表中带绿色图标是方法,另一种图标即为属性。
2.看帮助
在VBA的帮助中有完善的解说,从中可以看到其性质及功能详解。只是每一个列表中的成员都逐一查看效率不高。
3.判断词性
方法是动词,它有一个动作,每个动作会产生一个可见的结果。例如: Worksheets.Add:Add动作的结果是产生一个新工作表
Worksheets.Select:Select动作的结果是选择当前工作簿所有工作表
Worksheets.PrintPreview:PrintPreview动作的结果是当前表进入预览状态 而属性是名词,表示一种状态或者特征,可以将对象的这个状态显示在单元格中。例如:
[a1] = Worksheets.Count:Count表示工作表的数量,执行本语句可以在A1单元
Excel VBA程序开发自学通 2015-6-15 第 48页 /共 510页
格返回一个值
[a1] = Worksheets.Item(1).Name:Item是工作表集合的属性,代表Worksheets的子集,但Item本身却是一个对象集合,在本例中,Item(1)代码第一个工作表
[a1] = Worksheets(1).Visible:Visible表示工作表的可见性属性,可以读取,也可以改变这一属性。如Worksheets(1).Visible=False即可将第一个工作表隐藏起来
4.2 认识VBA的事件
所有对象都有属性与方法,同时也具有事件。充分地利用事件可以使程序实现自动化。
4.2.1 什么是事件
事件是对象在某个状态下引发的动作。每个对象都会有很多的事件,不同的事件有不同的触发条件。
如果更形象地阐述,路人甲不小心踩了路人乙,路人乙则骂他“没长眼?”。在这个过程中,被踩是一个事件。路人甲踩了路人乙则引发路人乙“被踩”的事件,而路人乙回骂则是事件所触发的动作。同一个事件可以触发多个动作,例如路人乙骂完之后再踢回一脚等等。
而Excel的事件也是类似的情形。例如以下代码:
Private Sub Workbook_Open() Sheets(1).Select [a1]=date End Sub
此代码是一个工作簿开启事件,由开启事件引发了两个动作:进入第一个工作表和在A1单元格显示当前日期。
4.2.2 事件的分类及其用途
VBA有很多类事件,分类的标准由对象来决定。表4-3是对象其及事件的对应关系表。其它分类方式在后面的章节将进行介绍。
表4-3 事件分类
对象 Application Workbook Worksheet Chart UserForm Label Image 事件 应用程序事件 工作簿事件 工作表事件 图表事件 窗体事件 标签事件(窗体中的控件) 图像事件(ActiveX控件) 表中并没有罗列完所有事件。因为每一个控件都有自己的事件,而VBA可以调
用的对象有超过100种。
Excel VBA程序开发自学通 2015-6-15 第 49页 /共 510页
虽然具有事件的对象很多,不过常用的是工作簿事件、工作表事件及窗体事件。 事件在工作中非常有用,常用于实现过程的自动化。例如工作簿打开时自动执行某程序,工作表切换也自动执行一个程序,鼠标移动窗体时……通过这些事件的运用,可以在某个条件全自动执行数据计算或者环境设置、变量赋值等等,从而减少手工执行代码,提升工作效率。
对于事件的具体用法和实例,在本书第8章中将再详述,本章仅仅了解基本概念。
4.3 VBA的运算符
VBA最主要的两项任务是计算和界面设计。在进入程序运算前需要了解VBA中有哪些运算符,以及其运算规则。
4.3.1 VBA中运算符的分类
VBA中有很多运算符,大致可以分为四类,见下表。
表4-4 运算符分类
种类 算术运算符 比较运算符 连接运算符 逻辑运算符 功能 用来进行数学计算的运算符 用来进行比较的运算符 用来合并字符串的运算符 用来执行逻辑运算的运算符 4.3.2 算术运算符
算术运算符包括7个,其符号及功能见下表:
表4-5 算术运算符列表
运算符 ^ * / \\ Mod + - 功能 求一个数字的某次方,如 A^B 乘法运算 除法运算 对两个数作除法并返回一个整数 求两数的余数 加法运算 减法运算 4.3.3 比较运算符
比较运算符包括6个,其符号及功能见下表:
表4-6 比较运算符列表 符号
功能 Excel VBA程序开发自学通 2015-6-15
< <= > >= = <> 第 50页 /共 510页
小于 小于或等于 大于 大于或等于 等于 不等于 4.3.4 逻辑运算符
逻辑运算符包括6个,其符号及功能见下表:
表4-7 逻辑运算符列表
符号 And Eqv Imp Not Or Xor 功能 用来对两个表达式进行逻辑连接 用来对两个表达式进行逻辑等价运算 用来对两个表达式进行逻辑蕴涵运算 用来对表达式进行逻辑否定运算 用来对两个表达式进行逻辑析取运算 用来对两个表达式进行逻辑互斥或运算 最常用的是And、Not、Or三种运算 1.And运算符
And运算符的运算规律见表4-8所示:
表4-8 And运算符运算规则
如果条件一为 TRUE TRUE TRUE FALSE FALSE FALSE Null Null Null 且条件二为 TRUE FALSE Null TRUE FALSE Null TRUE FALSE Null 则结果为 TRUE FALSE Null FALSE FALSE FALSE Null FALSE Null 实例:
Sub AND运算() Dim A, B, C A = 20 B = 15 C = 12
MsgBox (A > B And B > C) ' 返回 TRUE End Sub
2.Or运算的运算符
Or运算符的运算符规则见表4-9所示:
Excel VBA程序开发自学通 2015-6-15 第 1页 /共 510页
目 录
入门篇:VBA优势、功能与概念(1-3章) ................................................................................. 2 第一章 从Excel插件认识VBA ................................................................................................ 2 第二章 VBA概述 ........................................................................................................................... 10 第三章 巧设VBA编辑器提升编程效率 .............................................................................. 26 进阶篇:VBA语法、过程与事件(4-12章) ............................................................................. 44 第四章 VBA基本概念 ........................................................................................................... 44 第五章 VBA数据类型与变量、常量 ................................................................................... 59 第六章 认识VBA过程及开发自定义函数 .......................................................................... 72 第七章 VBA的对象模型与对象表示法 ............................................................................. 111 第八章 自动宏与Excel事件 ................................................................................................ 151 第九章 VBA程序常规则 ..................................................................................................... 165 第十章 常用语法剖析 ........................................................................................................... 186 第十一章 Excel常见对象的应用技巧 ................................................................................. 272 第十二章 Excel的事件应用案例 ......................................................................................... 400 登堂篇:VBA数组、窗体与控件(13-17章) ......................................................................... 426 第十三章 数组基础 ............................................................................................................... 426 第十四章 开发数组函数与数组应用 ................................................................................... 439 第十五章 认识窗体与控件 ................................................................................................... 450 第十六章 窗体控件运用案例 ............................................................................................... 471 第十七章 表单控件与ActiveX控件 ................................................................................... 486 入室篇:文件管理、菜单、API、VBE与加载项(18-32章) .............................................. 487 第十八章 VBA命令处理文件 ............................................................................................. 487 第十九章 使用FileSystemObject和WScript ...................................................................... 489 第二十章 磁盘与系统信息管理 ........................................................................................... 491 第二十一章 认识Excel的内置命令栏对象 ............................................................................ 492 第二十二章 创建新工具栏 ....................................................................................................... 493 第二十三章 创建新菜单栏 ....................................................................................................... 494 第二十四章 操作快捷菜单 ....................................................................................................... 495 第二十五章 认识类和类模块 ................................................................................................... 495 第二十六章 API基础与API应用案例 ................................................................................... 496 第二十七章 VBA与注册表 ..................................................................................................... 497 第二十八章 VBE的对象模型与对象控制 .............................................................................. 498 第二十九章 VBE的高级运用 .................................................................................................. 499 第三十章 加载宏与加载项概述 ........................................................................................... 500 第三十一章 利用VBA编写XLAM加载宏 ........................................................................... 501 第三十二章 利用VB6.0编写COM加载项 ........................................................................... 502 攀峰篇:开发“Excel百宝箱”(33-34章) ............................................................................ 503 第三十三章 程序开发思想 ....................................................................................................... 503 第三十四章 开发“Excel百宝箱” ......................................................................................... 503
Excel VBA程序开发自学通 2015-6-15 第 2页 /共 510页
入门篇:VBA优势、功能与概念(1-3
章)
第一章 从Excel插件认识VBA
简单的说,Excel VBA是依附于Excel程序的一种自动化语言,它可以使常用的
程序自动化,类似于DOS(磁盘操作系统)中的批处理文件(后缀名“.bat”)。那么它有什么具体的功能?在工作中与常规操作方式相比,具有哪些优势?笔者试图通过一个简单却实用的插件来展现。
本章要点:
? 从身份证号获取个人信息
? 在工作中如何发挥Excel插件的优势
1.1 从身份证号获取个人信息
制作人事资料时,通常需要录入职员身份证号码,以及生日、年龄、性别等等。除身份证号码需要手工逐一录入以外,其它三项信息的录入有四种方法:手工录入、内置公式、自定义函数法、插件法。手工输入方式效率极差,且出错机率也最高,本节通过后三种方式来实现并比较,从而让读者对VBA之优势与用法得以初步认知。
1.1.1 常觃公式法
以图1.1数据为例,利用公式从身份证中提取生日、年龄、性别等信息,可以有多种方法。本例列举其中之一。
图1.1 根据身份证号提取职工年龄、生日与性别
通过公式计算职工的年龄、出生日期与性别,步骤如下: (1)在单元格C3输入以下公式,用于计算年龄:
=DATEDIF(DATE(MID(B3,7,4-(LEN(B3)=15)*2),MID(B3,11-(LEN(B3)=15)*2,2),
Excel VBA程序开发自学通 2015-6-15 第 3页 /共 510页
MID(B3,13-(LEN(B3)=15)*2,2)),NOW(),\
(2)在单元格D3输入以下公式,用于计算出生日期:
=TEXT(RIGHT(19&MID(B3,7,LEN(B3)/2-1),8),\年##月##日\(3)在单元格E3输入以下公式,用于计算性别: =IF(ISODD(MID(B3,15,3)),\男\女\
注意:在Excel 2003中,ISODD函数默认状态下无法使用,需要加载“分析工具库”才可以正常使用,为了使公式通用,通常改用MOD函数。即公式改为:=IF(MOD(MID(B3,15,3),2),\男\女\(4)选择C3:E3区域,将公式向下填充即完成身份证信息提取。效果如下:
图1.2 公式法获取身份证信息
点评:相对于手工输入法,利用公式从身份证号码获取个人信息有着效率更高、错误率更低之优点,人员越多时越能体现出其高效优势。
本例文件参见光盘:..\\ 第一章\\提取身份证信息.xlsm 1.1.2 自定义函数法
自定义函数是指利用VBA编写的外置函数。在本例的随书光盘中已经录入了相关的VBA代码,可以随时调用。对于代码的含义和录入方式在后面的章节后有详细介绍,本章仅通过具体应用了解其用法与优势。具体操作步骤如下:
(1)进入“自定义函数法”工作表;
(2)在C3:E3区域分别输入以下三个公式,用于计算年龄、出生日期和性别: =SFZ(B3,\=SFZ(B3,\
=SFZ(B3)或者=SFZ(B3,\
(3)选择C3:E3单元格,将公式向下填充,结果见图1.3所示。
Excel VBA程序开发自学通 2015-6-15 第 4页 /共 510页
图1.3 自定义函数法获取身份证信息
本例中的函数SFZ即身份证函数,用于从身份证号码中获取年龄、生日与性别等信息。它不属于Excel内置函数,需要利用VBA编写代码才可以使用。读者可以从随书光盘中获取该完整代码。
SFZ函数有两个参数,第一参数为单元格引用,第二参数为信息描述,即用于指定需要获取身份证中哪一部分信息。当它为“NL”(不区分大小写)时,获取年龄;当它为“SR”时,获取生日,当它为“XB”或者省略第二参数时,获取性别。
点评:相对于内置函数法/公式法,自定义函数法是借用VBA编写的外置函数完成,它的优势在于公式简短,且容易理解。任何不熟悉函数与VBA者皆可一分钟内学会操作并理解其公式含义。
1.1.3 插件法
插件法是指借用Excel插件操作工作表,该插件不隶属于当前工作簿,但却可以实现与当前工作簿交互的功能,批量、迅速完成身份证信息提取工作。
操作步骤如下:
(1)关闭Excel程序的前提下,将随书光盘中的插件(位置:..\\第一章\\批量获取身份证信息.xlam)复制到以下自启动文件夹中即安装完成:
C:\\Program Files\\Microsoft Office\\Office12\\XLSTART
注意:如果您的OFFICE没有装在C盘,那么上面的磁盘号需要根据实际情况做修改;如果您使用OFFICE 2003,则将其中“Office12”修改为“Office11”。 (2)打开光盘文件“提取身份证信息.xlsm”,进入“插件法”工作表;
(3)选择单元格区域B3:B6,单击右键,从右键中选择【批量获取身份证信息】菜单,程序将弹出一个对话框“确定计算区域”。该对话框中默认显示当前选区地址,如果需要修改地址,可以输入新的地址,也可以用鼠标在工作表中选择身份证存放区域,该区域的地址会自动产生在对话框中。见图1.4所示;
(4)单击“确定”按钮,程序在瞬间就会从选区的所有身份证中提取年龄、生日和性别等信息。
Excel VBA程序开发自学通 2015-6-15 第 5页 /共 510页
图1.4 插件法批量获取身份证信息
点评:插件法从身份证号码中获取信息的优点是速度快,通用性好。相对于内置函数法,它在操作上更简单,不需要任何函数知识,不需要输入长长的公式,只点几次鼠标即可;相对于自定义函数,它的优点是通用性好,在任何工作表、任何工作簿皆可使用本工具。而前一方法之自定义函数非插件方式存在,只能在当前工作簿中使用。
1.1.4 浅谈VBA优势
前面三个案例中我们可以看出,Excel具有强大的计算功能,但常规方式对于某些大型数据运算显得比较繁琐。用户需要学习复杂的函数知识,设置长长的公式才可以解决某些运算。而VBA可以使公式简化、易懂,甚至根本不需要公式,一个字母不用录入即可完成一些专业性较强的计算。
具体说来,相对于Excel自带的功能,VBA或者说VBA开发的插件具有以下优势:
? 批量地对操作对象进行数据处理
以前一节插件法完成身份证信息进行例证,它可以瞬间完成多个单元格数据的运算,甚至多个工作表中存放的身份证号码也可瞬间完成信息提取。较传统的逐一处理方式在效率上有大幅提升。
? 多任务一键完成
多任务是指对同一个对象需要进行多个操作,例如前一节是从身份证号码中获取三类信息,VBA可以单击一个按钮后瞬间完成,完全感觉不到它在分三步逐一完成任务。这是高效办公地最佳体现。
? 将复杂的任务简化
Excel是很多很多小工具的综合体。这些工具可以嵌套运用,完成更强大的数据处理。但当嵌套过多时,就需要用户要较深的功底才能操纵或者理解。另一方面,对于某些特殊行业的工作、任务,也要经过很复杂的操作才可以完成,而对于某些只需要应用不需要深入研究、理解的普通办公文员们来说是一个技能考验。而通过VBA进行二次开发可以将复杂的任务变得更简单。简单是指理解和操作上同时简化。
就像1.1.3节中通过右键菜单提取身份证号码三类信息一样,不需要用户去录入长长的公式,以及理解信息是如何提取出来的,单击菜单即可完成。再如企业中生成工资条,10000个人的资数用手工操作需要处理10000*N次,而利用Excel插件可以
Excel VBA程序开发自学通 2015-6-15 第 41页 /共 510页
2.显示工具提示
该选项表示工具栏的所有按钮。如果勾选该选项,鼠标指向按钮时可以显示它的功能与快捷键提示,这对于学习VBA有较大的帮助。
3.错误捕捉
错误捕捉包括“发生错误时则中段”、“在类模块中中断”和“遇到未处理的错误时中断”三个选项。各选项含义见表3-1所示。
表3-1 错误捕捉含义
类型 发生错误则中断 在类模块中中断 在失去句柄错误时中断 含义 任何错误都会使工程切换到中断模式,不管错误处理程序是否为活动的,也不管代码是否在类模块中。 任何在对象类模块中失去句柄的错误会让工程进入中断模式。 任何其他失去句柄的错误会让工程进入中断模式。 其中第一项和第三项可以演示一下差异。 (1)清空当前表A1:B1,在模块中录入以下代码:
Sub 错误捕捉()
On Error Resume Next Dim i As Byte i = [a1] / [b1]
IF err.Number <> 0 Then GoTo err: MsgBox i Exit Sub err:
MsgBox \出错了\End Sub
(2)将错误捕捉设为第一项;
(3)光标定位于代码中任意位置,按下快捷键【F5】执行代码,程序立即弹出运行时错误对话框;
(4)从对话框中单击“调试”按钮,“i = [a1] / [b1]”语句呈黄色显示,表示该语句在错误;
(5)将错误捕捉设置为第三项后再执行代码,程序不再弹出错误提示。
调试代码或者初学时,应该将选项设置为第一项;代码编写完成正式执行时则需要设置为第三项。
3.2.4 VBA代码保护
VBA代码是需要保护的,基于两种目的:保护成果、防止无意中破坏。 保护VBA代码有两种方式:共享工作簿、代码加密。
1.共享法
共享法是指对工作簿共享,从而实现不可查看代码的目的。听起来像悖论,按下
Excel VBA程序开发自学通 2015-6-15 第 42页 /共 510页
面的步骤操作却一定可以达成需求。
(1)在工VBA模块中录入代码后按下快捷键【Ctrl+S】保存工程,必须是xls格式或者xlsm、xlam、xla格式;
(2)返回工作表界面,进入【审阅】功能区,单击【共享工作簿】按钮,将“允许多用户同时编辑”打勾,然后保存;
(3)重新打开该工作簿,进入VBE界面后双击当前工作簿工程,将弹出3.41所示的提示:
图3.40 共享工作簿 图3.41 保护后状态
2.加密法
VBA的选项对话框提供了代码加密的功能,步骤如下: (1)在VBE界面下单击菜单【工具】\\【VBAProject属性】,每个工程的默认名称是“VBAProject”,但该名称可以手工修改。如果曾经修改过,以实际名称为准;
(2)在“工程属性”对话框中,切换到“保护”选项卡,选择“查看时锁定工程”,并在下面的两个文字框录入两次相同的密码;
(3)保护工作簿后重启该文件,使用【Alt+F11】进入VBE界面,双击工程名称时将弹出图3.43所示对话框,如果未录入正确密码将禁止查看。
图3.42 设置工程密码 图3.43 开启已保护的工程时确认权
Excel VBA程序开发自学通 2015-6-15
限
第 43页 /共 510页
上面的两种方法也可以同时使用。
注意:不管如何设置,VBA的保护措施是很脆弱的,不需要很专业的程序员就可以攻破它。所以如果对自己的代码安全性要求较高,可以使用COM加载宏,而不是Excel VBA编写。在本书第32章将讲述用VB开发COM加载项的具体方法。
Excel VBA程序开发自学通 2015-6-15 第 44页 /共 510页
进阶篇:VBA语法、过程与事件
(4-12章)
第四章 VBA基本概念
VBA语言是面向对象的一种程序语言。在VBA中有很多很多对象,每个对象涉及自己范畴的很多属性和方法,还拥有各自专属的事件。在本章中将详细介绍以上VBA的基础知识。
本章要点:
? 理解VBA的对象、属性与方法 ? 认识VBA的事件 ? VBA的运算符
? 简单的字符处理函数
4.1 理解VBA的对象、属性与方法
几乎90%以上的VBA程序都是在操作对象,利用对象的方法来读取或者写入对象属性……在编写代码前必须对Excel的对象有全面的认识。
4.1.1 什么是对象
一个最简单的故事都一定有人物、事件、或者时间、地点。人物是故事的核心,那么VBA也相应的有对象、属性、方法和事件,其中对象是VBA的核心。
很多很多软件都带有VBA环境,那么VBA在不同软件中的操作对象也是不同的。如WORD中的Application对象是Word,Excel中的Application对象则是Excel。
VBA对对象的操作语句格式总是遵循这样的格式:“对象.属性”、“对象.方法”或者“父对象.子对象.属性”……例如在下面的实例:
Sheets(\工作表\——Sheets(\工作表\是对象,Name是对象的属性 Workbooks(2).Close——Workbooks(2)是对象,Close是对象的方法
Range(\——Range(\是父对象,Comment是子对象,Delete是方法
Excel有数百个对象,表4-1是常见对象名称其及含义。
表4-1 常见对象及其含义
对象名 Application
含义 代表整个 Excel 应用程序。 Excel VBA程序开发自学通 2015-6-15
Window Worksheet Sheets ShapeRange PivotTable Workbook 第 45页 /共 510页
代表窗口 代表一个工作表 指定的或活动工作簿中所有工作表的集合 代表形状区域,它是文档中的一组形状 代表工作表上的数据透视表 代表一个 Excel 工作簿 代表绘图层中的对象,例如自选图形、任意多边形、OLE 对象或图Shape 片 代表某一单元格、某一行、某一列、某一选定区域,或者某一三维Range 区域 代表单元格区域的定义名。名称可以是内置名称(如Print_Area)或Name 自定义名称 Chart 代表工作簿中的图表 提供文件对话框,其功能与 Office 应用程序中标准的“打开”和“保FileDialog 存”对话框类似 CommandBarPopup 代表命令栏上的一个弹出式控件 CommandBar 代表容器应用程序中的一个命令栏 4.1.2 如何理解属性
属性是一个对象的外部和内部特征,包括大小、颜色或边距、数量,或者某一方面的行为,例如对象是否可以激活、是否可见的、是否可以刷新等等。可以通过修改对象的属性值来改变对象的特性。
可以打一个比方,桌子是一个对象,桌面是方形的、有四只脚、由木头组成、可以拆解等等就是属性。而拆解这个动作则属于方法。
一个工作表具有哪些属性?可以用下列两种方法获取。
1.自动成员列表
任何对象都有属性,而且在录入代码时可以从自动成员列表中看到其属性。例如图4.1中,输入“worksheets.”后将会看到一个下拉列表,在该列表中包含了工作表的属性及方法,其中带有手形图标的是属性,另一种是方法。
然而很多很多对象还有一些隐藏属性,在该列表中没有罗列出来。可以按下列步骤调用其隐藏属性。
(1)按下快捷键【F2】打开对象浏览器;
(2)在空折区单击右键,从菜单中选择【显示隐含成员】,见图4.2.
(3)再返回模块代码窗口,输入“worksheets.”后将会看到一个新的下拉列表,里面有灰色的隐藏属性。
Excel VBA程序开发自学通 2015-6-15 第 31页 /共 510页
5.代码窗口
代码窗口是用于存放VBA代码的处所,它是VBE中最核心的组件。代码窗口包括工作表代码窗口、工作簿代码窗口、窗体代码窗口、模块代码窗口和类模块代码窗口。
6.对象与过程窗口
对象与过程窗口是指位于代码窗口上方的对象列表和窗过程列。见图3.13所示。
图3.13 对象与过程列表
图3.13中左上角的下拉列表是对象列表,单击下拉箭头可以罗列出所有可用的对象名称;右边的下拉列表是可用的过程列表,单击下拉箭头可以罗列出所有可用的过程名称。
这两个列表对用于辅助代码录入,以及提示当前对象所支持的对事件。用户也可以永远不用它,采用手输入代码。但是在输入工作表事件或者工作簿事件时,通过对象与过程下拉列表自动产生代码比手工输入的效率更高,且更准确。关于它们的用法在后面关于事件的章节会详细的说明。
7.立即窗口
立即窗口有两个功能:显示调试代码时产生的结果(信息),以及执行单句的代码。
立即窗口默认是隐藏状态,可以使用快捷键【Ctrl+G】将其调出。 现分别演示立即窗口的两种功能与操作步骤:
(1)在开启任意工作簿后按下快捷键【Alt+F11】进入VBE界面; (2)单击菜单【插入】\\【模块】;
(3)按下快捷键【Ctrl+G】显示立即窗口; (4)在模块中输入以下代码:
Sub 显示当前工作簿全名()
IF Len(ThisWorkbook.Path) = 0 Then Debug.Print \当前工作簿未保存\ Else
Debug.Print ThisWorkbook.FullName End IF End Sub
(5)将光标定位于代码中任意位置,单击快捷键【F5】执行代码,在立即窗口将会显示代码执行结果。如果当前工作簿未保存,则立即窗口显示“当前工作簿未保存”,则否显示工作簿全名,包括其路径。见图3.14所示;
Excel VBA程序开发自学通 2015-6-15 第 32页 /共 510页
(6)清除立即窗口中的字符,然后录入以下代码:
Workbooks.Add (xlWBATChart)
然后单击回车键,注意必须是光标位于当前代码行最右边时单回车,此时可以发现Excel新建了包含一个工图表的工作簿。
(7)在第二行输入以下代码然后回车,则当前工作簿中立即新建10个工作表。
Sheets.Add Count:=10
执行代码后,工作簿中将有13个工作表,见图3.15所示。
图3.14 在立即窗口显示信息 图3.15 在立即窗口执行单行程序
8.工具箱
工具箱对于VBA程序开发是非常重要的工具。默认状态工具箱包括了15种工具,用户可以利用这些工具设置出和其它任何软件程序类似的界面。如果默认工具不够用,还可以右键定义新的工具。
调用工具箱的方式和前面的任何组件的方式都不同,它是建立在UserForm的基础上的。当用户选择UserForm对象时才出现,其它状态下一律隐藏。
显示工具箱的方法是单击菜单【插入】\\【用户窗体】,此时工具箱将自动显示出来。工具箱的外观见图3.16所示。如果已经有窗体,不想再建立窗体,则可以双击窗体名(默认为UserForm1,根据实际情况,用户可能修改为其它名称),然后单击菜单【视图】\\【工具箱】即可。
工具箱是可以定制的,包括新建页、附件控件等等。步骤如下:
(1)在窗体的右上角空白区单击右键,从菜单中选择【新建页】即可建立一个名为“新页”的页面;
(2)在“新页”二字上面单击右键,从菜单中选择【重命名】,并录入名称“我的新工具”;
(3)新建的页是完全空白的,可以对其任意添加新的组件。在当前页中间空白区单击右键,从菜单中选择【附件控件】,弹出“附件控件”对话框;
(4)在对话框中将需要的组件打勾,然后返回工具箱。工具箱的定制效果见3.17所示:
Excel VBA程序开发自学通 2015-6-15 第 33页 /共 510页
图3.16 工具箱外观 图3.17 定制工具箱
3.1.3 VBE中不同代码窗口的作用
前一小节中谈过VBE界面中的代码窗口用于存放VBA代码,但是了解这一点还远远不够。在VBE中有五类代码窗口,代码在不同窗口中将产生不同作用,哪怕代码完全一致。
1.工作表代码窗口
工作表代码窗口用于存放工作表事件代码,该代码仅仅在当前表中调用。普通Sub过程保存在工作表事件代码中虽然也可以执行,而且其它模块或者工作表也可以调用,但却有诸多不便。所以正常情况下,大家都达成一个共识:工作表事件代码存放工作表代码窗口,Function过程和Sub过程保存在模块中。
工作表代码窗口的开启方式为:使用快捷键【Ctrl+R】调出工程资源管理器,然后双击工作表名称,右边立即出现工作表事件代码窗口。
每个工作表都有自己的代码窗口,在窗口中储存自己的事件相关的代码,该代码只有在当前表才可以调用。例如在“生产表”的代码窗口录入以下报告选区地址的代码,见图3.18所示:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox Target.Address End Sub
图3.18 在“生产表”代码窗口录入SelectionChange事件代码
使用快捷键【Alt+Q】返回Excel工作表,在“生产表”工作表中选择任意区域,
Excel VBA程序开发自学通 2015-6-15 第 34页 /共 510页
立即弹出当前选区地址的信息,见图3.19所示。如果选择多个区域,同样提示多区域的地址,中间用逗号分隔,见图3.20所示。而在其它任何工作表选择区域则没有任何反应。
如果一定要在其它工作表调用当前工作表事件的代码,也可以采用以下步骤完成:
(1)将“生产表”中代码前的Private删除; (2)在“Sheet2”的代码窗口录入以下代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call Sheets(\生产表\End Sub
其中call表示调用其它过程。按下【Alt+F11】返回工作表,进入Sheet2工作表中,选择任意区域也会同样弹出选区地址信息。
图3.19 提示选区地址 图3.20 提示多区域地址
注意:工作表事件的代码中Private表示将当前Sub程序声明为私有,即只有当前工作表模块或者工作表才可以调用。本例中为了让Sheet2中可以调用,必须去除Private。对于Private的更多知识,参阅本书第五章。 2.工作簿代码窗口
工作簿代码窗口的名字为ThisWorkbook,该窗口用于存放工作簿级别的事件代码。虽然它也可以存放Function过程和普通的Sub过程,但根据习惯,以及使用上的方便性,该窗口仅仅存放工作簿事件相关代码。
例如图3.21是工作簿级别的事件代码,表示不管任何时候关闭工作簿都保存一次。该代码仅仅在关闭工作簿时执行,其它任何窗口无法调用该事件代码。
Excel VBA程序开发自学通 2015-6-15 第 35页 /共 510页
图3.21 工作簿及关闭事件的代码
3.窗体代码窗口
窗体代码窗口用于存放窗体、控件相关的代码。它的代码只能在窗体中使用,其它任何窗口无法执行。
查看窗体中代码的方法是在工程资源管理器中的窗体上单击右键,从菜单中选择【查看代码】。例如图3.22中的代码位于UserForm1的代码窗口,表示启动窗体时设置它的左边距为100。在UserForm1以外的任何窗口以任何方式都无法调用此代码。
图3.22 窗体代码窗口
4.模块代码
工作中使用最多的就是模块代码窗口。在模块代码窗口中存放Sub过程和Function过程。这些过程可以在当前模块执行,也可以供其它任何窗口调用。工作表事件、工作簿事件、窗体事件和类模块都可以使用模块中的程序,而模块与模块之间也可以相互调用。
5.类模块
类模块是用户自定义类的属性和方法的模块。单击菜单【插入】\\【类模块】即可创建一个类模块,其图标为
。
类模块的代码通常用于应用程序级别的事件,在应用程序对应的事件中调用该代码。在本书第十五章将详述类模块的用法。
3.2 VBE中选项设置
VBE中的选项设置对于VBA爱好者来说至关重要,如果该选项设置不当,会对编程带来无限烦恼。例如无法捕捉错误、没有函数提示、控件无法对齐等等。
打开VBA编辑器选项的方法是单击菜单【工具】\\【选项】。选项对话框外观见图3.23所示。
本节对选项对话框中所有组件做详细讲解,并建议如何优化设置。
Excel VBA程序开发自学通 2015-6-15 第 36页 /共 510页
图3.23 VBE选项
3.2.1 编辑器选项
选项对话框中第一个选项卡即可“编辑器”。该选项卡中各项目功能介绍如下:
1.自动语法检测
自动语速法检测是指编写代码时自动对每句代码检查是否有错误,如果有错误则弹出警告框,同时将错误的语句红色显示,提示用户代码有误。
例如下图中,在输入For语句时忘记了In,使代码产生错误。当录入该句代码并回车时,程序会立即弹出一个编译错误的提示,告知错误类型,同时红色标示错误语句。
图3.24 自动语法检测
建议勾选此选项,以协助自己了解当前代码中的错误类型,从而快速修正。
2.要求声明变量
该选项表示强制用户在编写代码时声明所有变量,否则程序无法执行。其具体表现为在任何新建模块、工作表代码窗口和工作簿代码窗口都产生“Option Explicit”语句。
强制声明变量的优点有三个: ? 提升代码运行效率
? 防止因变量类型错误带的错误
? 在输入对象变量时可以自动列出快速信息
Excel VBA程序开发自学通 2015-6-15 第 37页 /共 510页
从图3.25中可以看到,变量rng未声明,所以运行代码时会产生一个编译错误,提示变量未定义。
图3.25 提示变量未定义错误
建议勾选该选项。
3.自动列出成员
该选项可以在录入代码时自动产生语法提示,包括类型与对象的属性、方法等等。 例如在输入“dim rng as ”语句时,VBA会列出所有可用的变量类型供用户选择,而不需要手工录入,从而防止输入错误的变量类型,见图3.26所示和3.27所示:
图3.26 自动列变量名称 图3.27 自动列表对象的属性与方式
如果不勾选该选项,则无法弹出提示,只能手工录入。建议勾选。
4.自动显示快速信息
该选项表示在录入代码时对参数进行提示,方便用户核查录入的参数是否正确。 该提示主要体现在三方面: ? 参数个数 ? 参数类型 ? 当前参数
从图3.28的快速信息中可以看出,MID函数有三个参数,第一参数是String型,第二参数是Long型,第三参数是可选参数,它代表长度……这些信息都为编程提供了便利。
而图3.29的快速信息可以看出,Range有两个参数,第二个参数是可选参数。当前正在录入第二个参数,因为第二参数已加粗显示。
Excel VBA程序开发自学通 2015-6-15 第 38页 /共 510页
图3.28 提示MID的参数信息 图3.29 提示当前参数
建议勾选该选项。
5.自动显示数据提示
该选项是指中断模式下,设定一个断点,则当执行代码并且鼠标指针指到变量上面时,数据提示窗口就会显示出变量的值。具体操作步骤如下:
(1)在模块中输入以下代码:
Sub Test()
Dim temp As Byte temp = 100 MsgBox temp End Sub
(2)在第四句代码在前面单击一次,表示将该句设置为断点。也可以光标定位于该句代码,然后按下F9来设置断点;
(3)按下F8进入调试语句状态,它后逐句执行代码。在执行代码时将鼠标指针指向Msgbox后面的变量temp上,查看提示信息;
(4)在多次按下F8后,该提示会产生变化。因为变量temp在初期值为0,而在“temp=100”语句执行后就变成了100,所以提示信息也会相应的变化。
图3.30 数据提示1 图3.31 数据提示2
本选项用途不是很广,用户可以勾选也可以不勾选。
6.编辑时可拖动文本
该选择表示用鼠标可以拖动代码,等同于剪切、粘贴之功能。
图3.32中演示了从test1程序中将其代码拖到test2程序中的方法。具体步骤为: (1)选择需要拖动的代码;
(2)按下左键不放,鼠标下会呈现一个虚框,表示当前可以拖动代码;
(3)拖到目标位置后松开鼠标。如图3.32,当前的插入点是过程test2的第一行,当松开鼠标后,代码就会插到入该位置。类似于剪切、粘贴。最后效果见图3.33所示。
图3.32 拖动代码 图3.33 拖动后的效果展示
建议勾选该选项,以方面代码移动。
Excel VBA程序开发自学通 2015-6-15 第 39页 /共 510页
7.缺省查看所有模块
该功能是在模块代码中显示所有过程的代码。当模块中有多个过程时,该功能极其有用,减少切换时间。
如果不勾选该选项,窗口中仅仅显示当前过程或者声明部分的代码。如果需在查看另一个过程代码需要从过程下拉列中切换。见图3.34所示。
建议勾选该选项,使代码阅读更方便。
8.过程分隔符
该选项表示利用一条横线将多个过程的代码或者变量声部分开。 图3.34是不分隔代码时的外观,可以发现它的缺点是不利于代码查看。与图3.33相比不够分明。
图3.34 切换显示不同过程 图3.35 未分隔所有过程及声明
建议勾选该选项,使代码阅读更方便。
9.自动缩进
该选项表示定位代码的第一行后,所有接下来的代码会在该定位点开始。更通俗地说法即为统一设定左边距。
如果勾选该选项,那么第一行左边距为4时,第二行默认状态也是4,否则默认为0.
建议勾选该选项,使代码更美观,也方面阅读。
3.2.2 编辑器格式选项
编辑器格式选项卡中包括了所有与代码显示方式相关的选项。它可以决定不同代码如标准文本、断点、标签等等以什么字体、颜色、大小显示来出,使用户方便区分。
在默认状态下,VBA的设置已经非常合理,虽然用户可以随意定制,但建议不要做任何修改。
图3.36即编辑格式选项卡的界面,而图3.37是默认状态下的执行点、标签和断点样式。
Excel VBA程序开发自学通 2015-6-15 第 40页 /共 510页
图3.36 编辑器选项卡 图3.37 默认状态下的代码格式
3.2.3 通用选项
通用选项的项目较多,其中最重的几个项目包显示网格、错误捕捉和显示工具提示。
通用选项的外观
1.显示网格
该选项是针对用户窗体的,即窗体在设计状态下,显示网格线,而窗体中的控件也以网格为基准对齐。它的优点是窗体内有多个控件时可以轻松地对齐。
图3.38是通用选项卡的外观,图3.39是勾选“显示窗线”和“对齐控件到网格”状态下的窗体。
图3.38 通过选项卡 图3.39 让设计状态的窗体显示网格
对于“对齐控件到网格”可根据需要来设置。当需要多控件对齐时可勾选该选项;在对控件微移时则不能勾选。比对某控件需要向右微调4个单位,另一个控件需要向左微调3个单位,那么对齐控件到网格后就无法完成。