第2章 VBA程序设计入门
学习VBA首先需要了解VBE编辑器的构成。通过本章的学习用户可以了解到VBE各个组成部分的作用,掌握如何输入和运行代码,了解代码的编写规则。并通过一个简单的实例了解VBE各个组成部分的使用方法。
2.1 Excel VBA的开发环境
Excel VBA的开发环境又称为VBE编辑器。VBE(Visual Basic Editor)是编写VBA代码的工具,它不能单独打开,只有启用了Excel等应用程序后才能打开VBE。
2.1.1 VBE简介
VBE编辑器是书写VBA代码的地方,使用如下两种方法可以打开VBE编辑器。
● 同时按下键盘上的Alt和F11键,即可打开VBE窗口。
● 打开“开发工具”选项卡,执行“代码”组内的“Visual Basic”命令,即可打开VBE窗口。
虽然Excel 2007采用了选项卡功能区的设计方式,但是VBE编辑器的窗口和以前的版本从外观上来看并没有任何区别,依旧采用的是菜单加工具栏的方式。VBE编辑器窗口的外观如图2-1所示。
图2-1 VBE窗口
2.1.2 VBE窗口简介
VBE编辑器窗口是一个典型的Windows程序界面,具有菜单栏和工具栏,以及各种窗口构成。下面就重点介绍VBE窗口的组成部分。
1. 菜单栏
菜单栏一般位于VBE的最上端,如图2-2所示。
图2-2 菜单栏
2. 工具栏
工具栏通常位于菜单栏下方,标准的工具栏如图2-3所示。
图2-3 工具栏
工具栏中放置的是一些常见的命令,包括了编辑、标准、菜单条、调试、快捷菜单和用户窗体等几个类别。以标准工具栏为例,各按钮的作用如下表2-1所示。
表2-1 工具栏按钮描述
工具栏是可以定制的,用户可以根据自身的使用习惯来定制工具栏。定制工具栏的方法是:在菜单栏或者工具栏上右击,在弹出的快捷菜单中执行“自定义”命令,打开“自定义”对话框,切换到“工具栏”选项卡,如图2-4所示,用户可以自定义添加其他的工具栏。
图2-4 自定义对话框
3. 工程资源管理器
一个工作簿被称为一个工程。在工程中可以包括四类对象分别是Excel对象、窗体、模块和类模块四类对象。当用户初次进入VBE编辑环境的时候只有Excel对象。根据应用的需要,用户在编程的时候可以自行添加窗体、模块和类模块对象。工程资源管理器就能够显示上述四类对象。初次进入VBE时,“工程资源管理器”位于VBE窗口的左侧,如图2-5所示。
图2-5 工程资源管理器
该窗口是以树形的方式显示内容。如果工程资源管理器窗口被关闭,那么可以重新调出该窗口,调出工程资源管理器窗口的方法如下。
● 在VBE窗口中单击“视图”菜单,执行“工程资源管理器”命令。
● 在VBE中,同时按键盘上的Ctrl+R组合键的方式快速地调出该窗口。
4. 代码窗口
代码窗口是显示和编辑代码的位置。第一次打开VBE的时候,不会自动显示代码窗口,在右侧显示的是一块灰色区域,表示现在还没有出现代码窗口。调出代码窗口的方法可以双击左侧的工程资源管理器上的某个对象,例如Sheets1调出代码窗口;也可以在选中工程资源管理器中的对象后,单击F7功能键调出代码窗口。选中不同的对象,会打开该对象所对应的代码窗口。
不论哪个对象所对应的代码窗口,除了属下代码的代码编辑区外,还有对象列表框、过程列表框、边界标示条、视图按钮和过程分割线等几个部分,如图2-6所示。
图2-6 代码窗口
各个组成部分的含义如下。
● 对象列表框:显示对象列表。
● 过程列表框:显示相应对象所具有的过程列表。
● 边界标示条:放置中断标示和程序运行表示的区域。
● 视图按钮:包括过程视图和全模块视图。当处于过程视图的时候,代码窗口一次只显示一个过程。而处于全模块视图时,则会显示当前模块下所有的视图。
● 过程分割线:在全模块视图情况下,过程和过程之间的分割线。
5. 属性窗口
用来设置指定对象属性值的窗口。可以在属性窗口中,为有关属性赋予一个指定的值。有关对象属性的内容将在后续章节中介绍。
例2-01:将Sheet1工作表的标签显示内容更改为“销售记录”。
其具体操作过程如下。
(1)打开“开发工具”选项卡,执行“代码”组内的“Visual Basic”命令,打开VBE窗口。
(2)在工程资源管理器中选择“Sheet1(Sheets1)”,在属性窗口中,将Name属性的值由“Sheet1”更改为“销售记录”,如图2-7所示。
图2-7 更改属性值
如果用户关闭了属性窗口,那么可以用下述方法重新打开属性窗口。
● 执行“视图”菜单下的“属性窗口”命令,打开属性窗口。
● 按下F4功能键打开属性窗口。
6. 立即窗口
立即窗口的作用主要是用来调试VBA语句,在窗口中直接输入命令,就能将命令运行的结果显示出来。立即窗口的样式如图2-8所示,在默认情况下,立即窗口不会显示。
图2-8 立即窗口
如果用户关闭了立即窗口,那么可以用下述方法重新打开立即窗口。
● 单击“视图”菜单,执行“立即窗口”命令。
● 按Ctrl+G快捷键。
有关立即窗口的使用方法将在以后各章中进行介绍。
7. 对象浏览器窗口
对象浏览器窗口主要用于参考工程中可用对象的使用方法。打开对象浏览器窗口的方法如下。
● 单击“视图”菜单,执行“对象浏览器”命令。
● 在VBE编辑器中按F2功能键。
除了上述窗口外还有本地窗口、监视窗口等调试程序时所使用的窗口。
2.1.3 工程资源管理器窗口
工程资源管理器按照树形结构,以缩略图的方式排列出了对象。从工程资源管理器中看到的内容包括了工作簿及工作表对象、窗体、模块及类模块。包括各类对象的工程资源管理器,如图2-9所示。
图2-9 工程资源管理器
在工程资源管理器窗口的上端有3个按钮,表示的是查看代码和查看对象,按钮的作用是让用户选择所列示的对象是否以文件夹方式管理。
在最初运行的时候,由于用户没有添加窗体、模块或者类模块,因此上图所示的窗体、模块和类模块是不存在的,用户可以按照实际需要添加窗体、模块或者类模块。
1. 添加窗体
如果用户编写程序的程序会需要使用到窗体那么就需要添加窗体,添加窗体的方法有如下两种。
● 在工程资源管理器中右击鼠标,在弹出的快捷菜单中执行“插入”中的“用户窗体”命令,新增加一个用户窗体。
● 单击工具栏上的按钮,添加一个新窗体。
默认情况下,用户添加了一个窗体后就会产生一个窗体文件夹,今后所有的新增加的窗体都会放置在该文件夹中。
2. 添加模块
模块也称做标准模块,在模块中容纳的内容包括了Sub过程、Function过程和变量声明等内容。使用VBA编程,用户大多数时候都是在模块中进行操作。添加模块的方法通常有如下两种。
● 在工程资源管理器中右击鼠标,在弹出的快捷菜单中执行“插入”中的“模块”命令,添加一个新模块。
● 单击工具栏上的按钮,添加一个新模块。
3. 添加类模块
类模块可以看做是开发人员自己设计的对象。添加类模块的操作方法如下。
● 在工程资源管理器中右击鼠标,在弹出的快捷菜单中执行“插入”中的“类模块”命令,添加一个新的类模块。
● 单击工具栏上的按钮,添加一个新的类模块。
4. 移除窗体和模块
对于已经存在的窗体和模块也可以移除。和普通的删除对象不同,在窗体被移除之前会询问使用者是否需要将窗体导出。
移除窗体的方法是在“工程资源管理器”中选择要移除的窗体,右击鼠标,在弹出的快捷菜单中执行“移除窗体Userform1”命令,打开如图2-10所示的对话框,询问是否要在移除窗体前将其导出,如果选择“是”,则会将窗体导出为以frm为扩展名的文件,如果选择“否”即可移除指定的窗体。
图2-10 对话框
说明
userform1是要移除的窗体的名称。
移除模块的方法和移除窗体也是一样的。在移除模块之前会询问是否将模块导出,导出的模块会是一个以bas作为扩展名的文件。
2.1.4 对象浏览器窗口
对象浏览器窗口可以显示在工程中可用的类、属性、方法、事件和常量等,用户通过工程资源管理器可以参考和学习对象的使用方法。
1. 对象浏览器构成
在VBE环境中,单击F2功能键打开对象浏览器。对象浏览器由对象库列表框、工具栏、查找框、搜索结果列表、类列表框和成员列表框等组成,如图2-11所示。
图2-11 对象浏览器
对象库列表框中列示了工程包含的对象库,包括了Excel、Office、stdole、VBA和VBAProject等5类。
● Excel对象库:包含在Excel中的类和成员。
● Office对象库:包含在Office中的类和成员。
● stdole对象库:连接库中的类和成员。
● VBA对象库:在VBA中的类和成员。
● VBAProject对象库:在当前工程中的类和成员。
2. 使用对象浏览器
对象浏览器的作用主要是为对象库中类和成员的用法提供参考,用户只需要指定对象库,并在查找框中输入信息即可找到有关的信息。
例2-02:以常用的Msgbox函数为例,这是一个在VBA中常用的函数,其作用是为用户提供消息框。使用的方法如下:
(1)在对象浏览器的对象库中选择VBA,完成对象库的设置。
(2)在查找框中输入msgbox,Enter确认,在搜索结果列表中找到相关的信息。
说明
搜索的结果可能不止一个。凡是类和成员中包含msgbox这个单词的信息都会被显示出来。此时要搜索的是成员为msgbox的内容,搜索的结果如图2-12所示。
图2-12 搜索结果
(3)选中搜索结果列表框中选择成员信息为“Msgbox”的一项,单击工具栏上的帮助按钮,即可打开如图2-13所示的帮助窗口。
图2-13 帮助窗口
2.1.5 设置个性化的编辑环境
设置个性化的编辑环境的含义就是对用户今后使用VBE的操作习惯进行定义。这样做的结果能够提高程序代码的书写速度,保持代码的正确性。定制个性化的VBE环境的方法是执行VBE窗口下的“工具”菜单栏内的“选项”命令,打开如图2-14所示的“选项”对话框。
图2-14 “选项”对话框
该对话框有4个选项卡,用户需要设置的是“编辑器”选项卡。
1. 自动语法检测
在“编辑器”选项卡中,“自动语法检测”设置会在代码输入人员发生错误输入的时候弹出一个对话框,提示用户输入发生了错误。
自动语法检测功能实际上能起到的作用有限,因为弹出的对话框通常并没有能够正确的指出发生错误的原因。该对话框的作用应当被看做是用来提醒使用者该行代码发生了错误而不是错误发生的具体原因。
2. 要求变量声明
如果选中“要求变量声明”,也就是对代码进行强制变量声明。选中“要求变量声明”后在每个新的模块中都会给出代码“Option Explicit”。对代码来说强制进行变量声明是一个很好的习惯。VBA对变量的管理较为宽松,编程过程中不对变量进行声明一般也不会影响程序运行的结果,但是这是以牺牲运行速度为代价获得的。
说明
编写程序好比拍摄一部电影,最好的方法是在拍摄之前就让每个角色进行定位,变量声明实际上是预告哪些人将会以何种角色在场景中出场。
3. 自动列出成员
自动列出成员是一项非常有用的功能。即使是最熟练的用户也未必能够知道某个对象拥有那些方法和属性。对于初学者来说可以通过自动列出成员功能,依据提示完成代码。即使使用者对某些对象的属性或者方法不熟悉,也能够通过这样的方法来完成代码。
使用者只需要根据出现的提示,按上下方向键,选择其中的一项,按空格键或者是Enter键即可完成代码。这种输入方式可以加快输入速度。使用自动列出成员后,例如图2-15就给出了在代码输入时自动列出成员的效果。
图2-15 自动列出成员
说明
代码的输入方法将在本章后续小节中介绍。
4. 自动显示快速信息
自动显示快速信息也是一项非常有用的功能,使用者输入某个函数、属性和方法的时候,能够给出语法提示,列出该函数所需要设置的参数等信息。图2-16给出了自动显示快速信息的效果。
图2-16 自动显示快速信息
在提示信息中有一个部分的颜色较深,表示使用者即将要完成输入的部分,当输入完成该部分后,颜色较深的位置会换成下一个即将要完成输入的位置。
5. 自动显示数据提示
调试代码的时候,只要将鼠标指针移动到变量所在的位置,即可显示该变量的值。图2-17就给出了自动显示数据的效果。
图2-17 快速显示信息
说明
自动显示数据的时候,并不要求鼠标选中该变量,只要将鼠标悬停在该变量上即可。
6. 其他选项
还有其他的选项可以提供给使用者选择。自动缩进能够让每行代码自动缩进指定的字符数。选中“编辑时可拖放文本”项,则用鼠标可以直接将选中的部分拖放到其他的位置。如果不选中该项,则鼠标只能选中代码文本,但是无法进行拖放操作。
“缺省为查看所有模块”选项表示可以查看一个模块中的所有过程,否则一次只能查看一个过程。通常该选项应该保持选中状态。“过程分隔符”就是在一个过程和另外一个过程之间用一条细横线隔开,通过过程分隔符可以很容易地看出过程的开始位置和结束位置。
2.1.6 使用帮助
VBA可以操作的对象众多,相应地这些对象的方法和属性也很丰富,即使熟悉的用户也很难了解所有的对象的使用方法,用户需要经常使用帮助功能来查看相关的内容。善于使用帮助是学习VBA的一条捷径,能够快速地提高自身的VBA编程水平。
1. 打开帮助主界面
打开VBA帮助主界面的方法通常有如下三种。
第一种方法是在VBE窗口中单击“帮助”菜单,执行其中的“Microsoft Visual Basic帮助”命令,即可打开帮助主界面。
第二种方法是在VBE窗口的右上角“键入需要帮助的问题”直接输入关键字,如图2-18所示。然后按Enter键即可打开帮助的内容。
图2-18 键入需要帮助的问题
第三种方法是在VBE环境中直接按F1键,即可打开帮助窗口。按F1功能键打开帮助功能对很多Windows程序都是通用的。
2. 提供准确的帮助信息
上述方法打开的是帮助主界面,用户还是需要一步步地搜索特定的帮助内容。VBA还提供了一种更加精确的帮助方式,例如用户在输入代码的过程中,需要对输入的某个函数、方法等提供帮助。可以将鼠标在该函数单词内单击,定位在需要帮助的位置,然后按F1功能键,即可打开有关该函数的帮助。
例2-03:假设用户以Msgbox函数为例,用户在代码窗口中输入如图2-19所示的内容。
图2-19 输入内容
要求通过F1功能键找到Msgbox的相关帮助内容,其操作方法如下。
(1)将鼠标在Msgbox内点一下,使得光标的位置位于该单词内,然后单击F1功能键,即可打开Msgbox函数的相关帮助,如图2-20所示。
图2-20 帮助窗口
(2)在帮助窗口中通常包含一个“示例”的超链接。单击该超链接会给出该函数实际应用的例子,如图2-21所示。
图2-21 函数示例
说明
用户通常可以将示例中的内容复制放到自己编写的代码中,然后稍加修改即可直接运用。