第2部分 VBA编程开发
第3章 VBA入门
本章包括
◆ 什么是VBA
◆ 录制、管理宏
◆ VBA开发环境
◆ 简单VBA开发实例
Excel具有强大的数据计算、分析和处理能力,已经在社会经济生活的各个领域得到广泛应用。但是在实际的工作中若将软件运用到办公室的文件制作及数据处理上,Excel现有的一般功能并不能满足用户全部的工作需要。绑定在Microsoft Office中的VBA编辑器弥补了这一缺陷。
本章将讲述什么是VBA, VBA的特点,录制、管理宏,及VBA开发环境各部分的详细讲解。
3.1 VBA概述
Microsoft Office目前最新版本是Office 12,即Office 2007。从Office 97开始,微软为所有的Office组件引入了统一的应用程序自动化语言——Visual Basic For Application(VBA),并提供了VBA的IDE环境。
3.1.1 关于VBA与Office
VBA是Visual Basic For Application的缩写,它是以Visual Basic为发展基础的语言。在Office软件中,VBA应用程序能够在Word、Access、Excel、PowerPoint、FrontPage和Outlook等之间进行交互式应用,加强了应用程序间的互动。本书著重讲解Excel中VBA的办公应用。
VBA是VB的应用程序版本,可以理解为“寄生在Office办公软件中的VB”,可以把它看做VB语言的一个子集。因此VBA与Visual Basic非常相似,但二者也有许多不同的地方。VBA与Visual Basic的区别有以下几点。
Visual Basic用于开发Windows应用程序,其代码最终被编译为可执行程序。而VBA是用于控制已有应有程序的自动化操作,其代码为解释。
Visual Basic拥有独立的开发环境,而VBA必须集成在已有的应用程序中。
Visual Basic开发出来的应用程序在脱离开发环境后仍能执行,而VBA编写出来的程序必须在访问集成应用程序的基础上运行。
尽管存在这些不同,但它们仍然非常相似。VBA与Visual Basic都使用相同的语言结构。两者的程序的语法及程序流程完全一样。如果已经了解了VB,那学习VBA将会很容易。正因为如此,VBA集成了VB语言易学易用的特点,让用户更容易上手,也让VBA得到了广泛应用。
注意
由于VBA集成在Office中,所以要使用VBA必须先安装Microsoft Office软件,本书中的所有实例均在Office 2007中运行通过。
在Microsoft Office中,由于Excel具有概念直观性、操作简易性等特征及其电子表格的优良性能,加之能绘制和制作各类商业图表和统计图表,因此Excel结合VBA的开发,能最大限度满足办公用户的各类工作需要。在Excel中使用VBA具有以下优点。
◆ 能将重复、烦琐的任务自动化,如数据项的计算、格式的批量设置等。
◆ 能自定义工具栏、菜单及界面,使用户的操作更快捷、方便。
◆ 能简化模板的使用,在开发初期,使初级用户能更快掌握办公工作中所需的功能。
◆ 能自定义Excel,使其成为开发平台。虽然Excel提供各种强大的功能,但是由于需求差异,Excel自带的模板很难满足用户的全部需求。
◆ 能创建报表。在Excel中,自带的报表向导远远不能满足各行各业特定的需要。
◆ 能对数据进行复杂的操作和分析。对于复杂的数据,简单的处理不能得到明确的结果,使用VBA能更好地辅助决策。
实际上,Excel VBA可以完成Excel的全部功能。Excel VBA真正吸引人的地方在于,使用VBA可以组合Excel的各种操作,例如设置单元格的格式,给单元格填充数据,自动计算等。当再次需要该操作时,只需设置一个动作,鼠标轻轻一点,即可让以上操作自动执行。这能让办公更有效率、更轻松。
3.1.2 VBA和宏
在Excel中,每个用键盘或者菜单命令完成的动作均能被记录下来,可以将这些操作组合为宏,并将其记录为VBA代码。在办公应用中,使用这一功能,很多程序代码可以通过录制宏来获得,大大节省了时间。而且,对于不熟悉的操作,例如绘制图表,删除工作表的一行等,可以录制一个宏,通过查看录制的VBA代码进行学习。录制的宏也可以在VBA集成开发环境(IDE)中修改,成为应用程序的子程序或者部分代码。可以通过为宏指定按钮、快捷键来运行宏。实际编写的代码也可以像宏一样运行。
关于通过宏来学习VBA,将在学习宏之后进行讲解。
3.2 宏
在讲Excel VBA之前,首先要介绍什么是宏。宏(Macro)是由VBA编写的一段代码,由系列命令和函数组成,存储在VBA的模块中。它可以代表一段任何操作的组合。宏既可以通过Excel自带的宏录制器录制,也可以人工编写,可以把宏指定到自定义按钮或者快捷键。当需要执行时,通过按钮或快捷键即可执行,免去重复操作的烦琐性。本节将对宏的录制、编辑及运行进行讲解。
3.2.1 准备工作
在学习VBA与录制宏之前,因为Excel 2007中某些功能是禁用的,所以必须完成一些准备工作才能正常顺利地开始学习VBA。
有一部分计算机病毒是以宏的形式存在的,因此大部分杀毒软件都有禁止宏的设置。Excel 2007中默认的是禁用所有宏,可以通过如下操作进行更改。
单击Office按钮,在弹出的“Office按钮”菜单中单击“Excel选项”按钮,在“Excel选项”对话框的左侧选择“信任中心”选项,然后在对话框右侧单击“信任中心设置”按钮,将弹出如图3-1所示的“信任中心”对话框。
图3-1 “信任中心”对话框
本书所应用的所有实例均无任何病毒及恶意代码,所以可以在“宏设置”区域选择“启用所有宏”单选按钮即可更改宏安全设置。
由于在VBA开发中,必须用到许多自定义窗体、宏、查看代码等按钮。这些按钮包含在Excel的“开发工具”选项卡中。在Excel 2007中,默认不显示“开发工具”选项卡,可以通过如下方式设置显示该选项卡。
单击Office按钮,单击右下角“Excel选项”按钮,进入如图3-2所示界面,选中“在功能区显示“开发工具”选项卡”复选框,单击“确定”按钮后即可看到“开发工具”选项卡。
图3-2 显示“开发工具”选项卡设置
在出现的“开发工具”选项卡中,可以看到“代码”组中关于宏的很多按钮。其中单击“宏安全性”即可进行宏的安全设置,如图3-3所示。
图3-3 “开发工具”选项卡
3.2.2 录制宏
创建宏有两种方式。第一种是通过Excel自带的宏录制器录制,另一种是在VBA环境中直接编写代码。在实际工作中,一般将二者结合使用,完成复杂的数据处理。
录制宏跟录音机的使用是同样的原理,不同的是录音机录下的是声音,而宏录下的是对Excel工作簿的操作。
在办公应用中,经常要对某些单元格进行格式的设置,如颜色、字体、填充色等。下面在如图3-4所示的数据表中制作一个更改单元格格式的宏,其具体操作步骤如下。
图3-4 员工数据表
step 1 进入“开发工具”选项卡“代码”组中(如图3-3所示),单击“录制宏”按钮,弹出如图3-5所示的“录制新宏”对话框。
图3-5 “录制新宏”对话框
step 2 宏名默认为“Macro1”。为了便于管理,可以自己输入,此处修改为“设置单元格格式”,快捷键设置为“Ctrl+Shift+P”,也可以不设置,在运行时指定给按钮事件。设置完毕后单击“确定”按钮,返回工作表中。
step 3 在工作表中选择F4单元格,单击右键,从快捷菜单中选择“设置单元格格式”命令,弹出如图3-6所示的“设置单元格格式”对话框。
图3-6 “设置单元格格式”对话框
step 4 在“字体”列表框中选择“黑体”选项,“字形”列表框中选择“加粗”选项,“字号”中选择“16”选项,单击“确定”按钮后返回工作表,结果如图3-7所示。
图3-7 设置格式效果
step 5 进入“开发工具”选项卡“代码”组中(如图3-8所示),单击“停止录制”按钮停止录制宏。宏录制完成。
图3-8 停止录制宏
如果要录用一个简单宏用来计算两个指定的单元格的数据的和,这是一个功能非常单一的宏。其详细录制步骤如下。
step 1 在单元格A2与B2中分别输入数据5和6。
step 2 进入“开发工具”选项卡的“代码”组,单击“录制宏”按钮,如图3-9所示。
图3-9 录制宏
step 3 选中单元格区域A2:C2,在功能区单击“公式”选项卡中“函数库”组的“自动求和”下拉按钮,从下拉菜单中选择“求和”命令,如图3-10所示。
图3-10 插入函数
step 4 效果如图3-11所示。在功能区单击“开发工具”选项卡中“代码”组的“停止录制”按钮,完成宏的录制。
图3-11 停止录制
3.2.3 执行宏
执行宏有多种方式,可以通过对话框或设置的快捷键运行,也可以插入自定义按钮并将按钮事件指向该宏来运行。快捷键方式的操作非常简单,即选中要执行宏的单元格后使用快捷键,此处不再多讲。这一小节将讲解通过按钮来执行宏。
以3.2.1节中建立的员工数据表及宏为例,执行宏的具体操作步骤如下。
step 1 进入“开发工具”选项卡“控件”组中,单击“插入”按钮,弹出如图3-12所示菜单。
图3-12 插入控件菜单
step 2 选择第一个控件“按钮”,此时鼠标指针变为十字形,将鼠标移动到工作表指定区域,按住左键不放开,拖动鼠标,在工作表中画出一个适当大小的矩形,松开左键,将弹出如图3-13所示的“指定宏”对话框。
图3-13 “指定宏”对话框
step 3 选择“设置单元格格式”宏,单击“确定”按钮,回到工作表。此时可以通过在按钮上单击鼠标右键,然后在弹出菜单上选择“编辑文字”来更改按钮的文字或者选择“指定宏”来进行指定宏设置,如图3-14将按钮文字更改为“设置”。
图3-14 更改按钮文字
step 4 按钮设置完毕后,即可执行宏。选定要执行宏的单元格或者区域,然后单击“设置”按钮,执行完毕,如图3-15所示,选择F9:F11单元格区域,单击按钮执行完毕。
图3-15 单元格区域执行宏效果
3.2.4 查看、编辑宏
Excel会自动将录制的宏以VBA代码的形式记录下来。为了修改录制的宏或者扩展宏的功能,经常需要查看和编辑已录制的宏。查看宏的具体操作步骤如下。
step 1 进入“开发工具”选项卡“代码”组中,单击“宏”按钮,弹出如图3-16所示的“宏”对话框。
图3-16 “宏”对话框
step 2 选择要查看的宏的名字,如本例中的“设置单元格格式”,单击“编辑”按钮,即可进入宏的代码查看窗口,如图3-17所示。
图3-17 宏代码窗口
“设置单元格格式”宏的代码如下.
'源码位于3-1.xlsx Sub设置单元格格式() '' 设置单元格格式Macro '' 快捷键: Ctrl+Shift+P ' With Selection.Font .Name = "黑体" .FontStyle = "加粗" .Size = 16 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic .TintAndShade = 0 .ThemeFont = xlThemeFontNone End With End Sub
从上述代码中可以看出,宏的VBA代码由两部分组成,即注释语句和主题语句。
说明
注释语句是对代码的解释说明,并不参与执行。增加注释语句是为了增加VBA代码的可读性,并让用户对代码的执行效果有一个大概的认识。所有的注释语句都以“' ”或者“Rem”语句开头。在VBA中,所有的注释语句及语法错误的代码都用绿色显示,可以执行的语句则是黑色显示,因此可以根据字体的颜色来阅读代码。
在上述代码中,“Sub设置单元格格式()”代表了宏的名称,之下的注释为与宏有关的说明,包括宏的名称、当前用户、录制时间、录制说明及快捷键。
在VBA代码中,所有执行动作都是从With开始,到End With结束。With之后的要进行操作的对象,如本例中的With Selection.Font, Selection表示选择的单元格或者区域,Font为Selection对象的一个属性。两者之间用“.”连接,表示从属关系。
由于在With行说明了对象及属性,所以在下面的执行语句中省略,例如“.Name=”黑体””的完整格式应为“Selection.Font.Name=”黑体””。在With后加对象及属性可以达到优化代码的效果。
下面为“设置字体格式”宏的操作代码详细分析。
.Name = "黑体":设置字体的类别名称,本例将字体设为黑体。
.FontStyle = "加粗":设置字体的字形,本例将字形设为加粗。
.Size = 16:设置字体的大小,本例设为16号字体。
.Strikethrough = False:设置字体删除线,本例为无删除线;如果为True,则为有删除线。
.Superscript = False:设置字体上标,本例为无上标;如果为True,则为有上标。
.Subscript = False:设置字体下标,本例为无下标;如果为True,则为有下标。
.OutlineFont = False:设置字体边框,本例为无边框;如果为True,则为有边框。
.Shadow = False:设置字体阴影,本例为无阴影;如果为True,则为有阴影。
.Underline = xlUnderlineStyleNone:设置字体下划线,本例为无下划线。
.ColorIndex = xlAutomatic:设置字体颜色,xlAutomatic代表自动。
.TintAndShade = 0:设置字体颜色深浅,-1最暗,1最亮,0为中间值,超出范围将会出错。
.ThemeFont = xlThemeFontNone:设置字体相关联的应用字体方案中的主题字体。
可以在代码中直接进行编辑,在相应的属性上更改值后,返回工作表执行宏,即可观察到相应的效果。
3.2.5 通过宏学习VBA
在VBA开发中,一些复杂的Excel操作的对象或属性如果不清除或者不明了功能,可以通过录制一个宏,并在宏代码中找到。因为Excel VBA运行的机制是将每一个应用程序看做一个Application,每一个Application都由各自的对象代表。如所有的菜单栏、工具栏、工作簿及工作表对象。VBA的代码功能就是通过操作这些对象执行动作来完成的。
3.3 VBA开发环境介绍
在学习编写VBA代码之前,必须先了解其开发环境。VBA集成在Office中的开发环境成为VBE(Visual Basic Editor)。在该环境下,可以实现VBA代码程序的编写。本节将详细介绍VBE环境启动、各个部分窗口的功能及应用方法。
3.3.1 VBE的启动方式
在Excel工作表界面中,分别有如下方式可以进入VBE编辑环境。
◆ 在3.2.4节查看、编辑宏中已经介绍过,通过查看宏的编辑按钮可以进入VBE环境。
◆ 进入“开发工具”选项卡“代码”组,单击“Visual Basic”按钮即可进入VBE环境。
◆ 进入“开发工具”选项卡“控件”组,单击“查看代码”按钮也可进入。
◆ 在工作表界面中,直接按Alt+F11组合键即可进入。
通过以上4种方式,进入到VBA的编码环境,可看到如图3-18所示的窗口。
图3-18 VBA开发环境界面
3.3.2 VBA开发环境界面介绍
如图3-18所示,VBA开发环境界面共分为标题栏、菜单栏、工具栏、工程资源管理器、属性窗口、代码窗口、立即窗口、本地窗口、监视窗口等部分。用户打开此环境如果窗口不全,可通过“视图”菜单进行设置显示。
1. 标题栏和菜单栏
标题栏用来显示当前环境的标题,如Excel文件名等。菜单栏包含11类菜单列表,如图3-19所示。通过单击菜单上的选项或命令即可进行相应的操作。
图3-19 菜单栏
2. 工程资源管理器
在工程资源管理器窗口中可以看到所有打开和加载的Excel文件及其加载宏。在VBA开发环境中,每一个Excel文件都是一个工程。如果打开多个Excel文件,则在该环境下能看到多个工程。工程的命名为VBAProject+文件名。
在工程名上单击右键,在弹出菜单上将鼠标移到“插入”选项,然后依次插入“用户窗体”、“模块”、“类模块”,如图3-20所示。
图3-20 工程资源管理器
从图中可以看出工程资源管理器中每个工程通常包含四种对象,分别为“Microsoft Excel对象”、“用户窗体”、“模块”和“类模块”。这四种对象的含义及应用分别介绍如下。
◆ Microsoft Excel对象:在VBA中,每一个Excel文件都是一个Microsoft Excel对象。其中的Sheet为工作表,workbook表示工作簿。双击这些对象即可打开相应代码框。
◆ 用户窗体:在VBA程序中也可以生成标准的Windows窗口,这些窗口在VBA中被称为用户窗体。窗体可以为对话框或者界面。在该对象下存储窗体及其控件的图形描述,包括它们的属性设置、函数和过程代码。
◆ 模块:用于保存VBA应用程序代码段的对象、录制的宏,以及编写的代码。
◆ 类模块:类是VBA程序中的一种特殊的语言要素,它们需要被保存在单独的类模块中。
工程资源管理器窗口的工具栏有3个按钮,分别为“查看代码”按钮、“查看对象”按钮、“切换文件夹”按钮,如图3-21所示。
图3-21 工程资源管理按钮
其功能分别如下。
◆ “查看代码”按钮:工程资源管理器窗口的四种对象(Microsoft Excel对象、用户窗体、模块、类模块)都有相应的代码窗口。选择资源管理器中的某个对象,然后单击该按钮即可打开相应的代码编写窗口。
◆ “查看对象”按钮:选择工程资源管理器中的某个工作表或工作簿对象,再单击该按钮,将切换到Excel的应用程序并显示对应的工作表或工作簿。
◆ “切换文件夹”按钮:工程资源管理器会将其包含的对象分为Microsoft Excel对象、用户窗体、模块、类模块4种,并放置在不同的文件夹下。单击该按钮,可以在分类放置对象和不分类放置对象两种状态之间切换。当工程资源管理器中的对象太多时,应采取分类放置的方法浏览;当对象较少时,可以采用不分类放置的方法浏览。其效果分别如图3-22所示。
图3-22 浏览效果
3. 属性窗口
属性窗口默认在工程资源管理器之下,主要用于对象属性的交互式设计和定义。在工程资源管理器中选择某个对象,在属性窗口即会显示其相应的属性。例如选择“模块1”,在属性窗口即会显示它的名称属性,通过这个属性可以更改模块1的名称。属性窗口最主要的功能是在用户窗体的交互式设计。
属性窗口分为如下两部分。
◆ 对象下拉列表:可以从对象下拉列表中选择需要列出属性的对象。
◆ 属性列表:在这个窗口中会列出所选对象的所有有关属性,通过“按字母序”和“按分类序”选项卡可以以不同的排序查看。
通过属性窗口来设置窗体的属性能大大提高VBA开发效率。
4. 代码窗口
代码窗口的功能是输入和编辑VBA程序代码。在工程资源管理器中选择要查看或编辑的对象,鼠标双击该对象即可打开该对象的代码窗口。其窗口结构如图3-23所示。
图3-23 代码窗口结构
各部分功能说明如下。
◆ 对象列表框:该列表中包含了与代码窗口有关的对象的名称。单击右侧的箭头可以显示该窗体的所有对象。
◆ 事件/过程列表:在该列表中列出了所选对象有关的过程及事件。当在该列表中选择过程后,该过程将在代码窗口中显示,鼠标光标也将移到该过程的代码处。
◆ 分割栏:通过向下拖动分割栏可以将代码窗口分割成两个独立的都具有滚动条的水平窗格,并且这两个窗格可以在同一时间独立显示代码中的不同部分。如果想关闭窗口,可以将分割栏拖到顶部、底部或者双击分割栏。
◆ 过程视图按钮:单击该按钮后在代码窗口中只显示当前选中过程的代码。
◆ 全模块视图按钮:单击该按钮后将在代码窗口显示模块中所有的代码。
在VBA代码编写时,具有自动完成功能。
在代码窗口中,当输入的VBA代码涉及对象或者数据类型时,窗口会显示一个消息列表,用来帮助用户输入正确的数据类型,如图3-24所示,当输入“Dim a as”时,就会弹出消息框,如果要将a定义为integer类型,可以通过光标移动到该类型,也可以输入int,系统会自动根据输入字符将光标移到以“int”开头的类型上。此时按下Tab键即可输入该类型。
图3-24 VBA自动完成功能
当输入的VBA代码涉及函数或者子程序时,窗口显示一个提供函数的参数、数据类型及参数顺序的消息框,以提示用户输入正确的函数或子程序参数。
5. 工具栏
在VBA开发中,有很多常用命令和操作。在VBA环境中将它们都以按钮的形式置于工具栏里,如图3-25所示,为一个标准工具栏。
图3-25 工具栏
通过工具栏上的按钮,可以快捷方便地执行相应的命令和操作,能大大提高工作效率。VBA提供了“编辑”、“调试”、“用户窗体”和“标准”4种工具栏,分别包含相应类别的快捷操作按钮。可以在工具栏位置单击鼠标右键,在弹出的菜单上选择显示。
6. 对象浏览器
打开“视图”菜单,选择“对象浏览器”即可打开对象浏览器。在此窗口内可以查看到当前工程及其引用对象的属性、方法和事件。对象浏览器对于熟悉和查看相应的Excel对象、引用对象(包括COM对象、其他Excel程序)所包含的类、属性、方法和时间非常有用,特别是在没有相应的帮助资料或者文档的情况下,对象浏览器是查看一个对象的组成和结构最有效的工具,如图3-26所示为对象浏览器。
图3-26 对象浏览器
7. 立即窗口
立即窗口可以帮助用户进行代码调试。用户在立即窗口输入的代码,可以被VBA立即执行。可以根据运行结果判断代码是否正确。但是立即窗口并不能存储代码,所以用户必须将代码复制到代码窗口才可以保存下来。
立即窗口中的代码如果要立即执行只需在要执行的语句之前加上“? ”,按下回车键后即可看到结果,如图3-27所示。
图3-27 立即窗口语句示例
8. 本地窗口和监视窗口
本地窗口和监视窗口主要为调试和运行应用程序提供的。在本地窗口中,可以自行调试过程查看每一个变量的值。监视窗口中可以在调试时,添加指定的变量,并在运行中监视。在监视窗口中单击鼠标右键,即可看到相应的操作选项。
3.3.3 VBA程序的调试
在应用程序中查找并修改错误的过程称为调试。为了分析应用程序的操作方式,VBA提供了几种工具。利用这些工具不但可以帮助查出错误的根源,而且还能用来尝试改变应用程序或用来了解其他应用程序的工作方式。
VBA中的调试包括:设置断点、中断表达式、监视表达式、逐语句、逐过程等。
1. 调试工具栏
调试工具的作用是帮助处理逻辑错误和运行时错误,以及观察无错代码的状况。VBA提供的调试工具栏包含了常用的调试方式。可以在工具栏上单击鼠标右键,然后在如图3-28所示的菜单上选择“调试”。
图3-28 工具栏右键菜单
显示的调试工具栏如图3-29所示。
图3-29 “调试”工具栏
该工具栏中包含执行程序、中断程序、重新设置程序、切换断点、监视及调用堆栈等常用的调试命令按钮。通过使用调试工具栏的命令按钮能大大提高调试的效率。
2. 使用中断模式
使用中断模式,可以随时中止应用程序的执行,并提供有关应用程序的情况快照。在中断模式下,所有变量和对象属性的值都将被保留下来。开发者可以在中断模式下查看应用程序当前的状态,还可以修改程序代码继续程序运行。
手动进入中断模式有三种方法。
◆ 按Ctrl+Break组合键。
◆ 进入“运行”菜单,选择“中断”选项。
◆ 单击工具栏的中断按钮。
3. 设置断点
设置断点可以让程序在运行到该断点的时候自动中断。设置断点能更加精确地观察和跟踪变量的变化。设置断点的方法如下。
step 1 将光标移到要进行断点设置的语句行。
step 2 进入“调试”菜单,选择“切换断点”选项或单击工具栏上的“切换断点”按钮,或者按下切换断点的快捷键F9。另外,通过单击语句行左侧灰色区域也能快速设置和删除断点,如图3-30所示。
图3-30 设置断点
删除断点的方法与设置断点相同,用户也可以执行“调试”菜单中的“清除所有断点”来删除本程序中的所有断点设置。
4. 更正错误继续运行
一个程序要一遍编完没有任何错误是不可能的。在更正已发现的错误后,可以单击工具栏的“继续”按钮,或者进入“运行”菜单,选择“继续”选项来继续运行程序。此时,通过监视窗口可以观察错误更正是否正确。
3.4 VBA编程思想
3.4.1 概述
VBA采用了面向对象的编程技术,其对象是封装有数据和代码的客体,对象有自己的属性和方法。属性是封装在对象内部的数据,它反映了对象的特征,例如Excel的单元格有Font属性、工作簿有Name属性等。VBA中每个对象都拥有许多属性,几乎所有对象的属性是可读的,但不是可写的。对象的方法是封装在对象中用来操作对象属性的代码。这些代码对用户来说既不可读,也不可写。用户在使用VBA对象的方法时,只需关心方法的名称和参数,无需关心方法的具体实现过程。
在VBA中要访问一个对象,必须清除该对象在对象体系中处于何种位置,然后通过对象访问符“.”,从包含该对象的最外层对象开始,由外及里逐次取其子对象,一直到达要访问的对象为止。例如要访问当前工作表的第4列第3行单元格的存储内容,应按照下列格式书写代码:
Application.ActiveSheets.Range(“D3”).Value
1. 对象的概念
对象代表应用程序中的元素,例如工作表、单元格、图标、窗体等都是对象。在VBA开发中,在使用对象的任一方法或者改变其某一属性的值之前,必须先识别对象。
对象集合是一个包含几个其他对象的对象,这些对象通常但并不总是相同的类型。例如,在Microsoft Excel中的Workbooks对象包含了所有已打开的Workbook对象。而Forms集合则包含了所有在它所属应用程序中Form对象。
集合中的项目可以通过号码或名称来识别。例如,语句“Workbooks(2).Close”的功能是关闭第二个被打开的工作簿对象,语句“Workbooks(“Book2”).Close”的功能是关闭工作簿集合中名称为Book2的工作簿,语句“Workbooks.Close”的功能是关闭所有打开的工作簿。
2. 属性
属性就是对象的一个方面,它代表的是对象在这个方面的特征。例如单元格的属性有行高、列宽、填充颜色等。改变对象的属性的值,就能改变对象的特征。在VBA代码中若要访问对象的属性,可以通过在对象名的后面用“.”符号连接属性名称来实现。例如“Font.Size=12”即可设置单元格字体的大小为12号字体。
3. 方法
对象的方法是指对象能够执行的动作。每一种对象做的操作都被称为方法,例如,使用Add方法添加一个新工作簿或者工作表,或者为某些窗体控件增加一个新的项目。
对象可以使用不同的方法。例如,区域(range)对象有专门的方法让用户清除单元格内容(ClearContents方法),清除格式(ClearFormats方法)以及同时清除内容和格式(Clear方法),还有让用户选择、复制或移动对象的方法。
4. 事件
事件是一个对象可以辨认的动作,像单击或按下某键等,并且可以编写代码来响应该动作。用户执行动作或程序代码可能导致事件的发生,或由系统引发。
例如,在下列两种情况下都可以发生Click事件:(1)单击控件,(2)在几种可能的值中为控件选择一个值。第一种情况用于命令按钮、框架、图像、标签、滚动条和数值调节按钮控件,而第二种情况应用与复选框、组合框、列表框、多页、TabStrip和切换按钮控件。当选项按钮控件的值变为True时,也会触发Click事件。
3.4.2 Excel中的对象简介
Excel中主要有4层基本对象,由上至下分别为Application(Excel程序本身)、Workbook(工作簿)、Worksheets(工作表对象)和Range(一个单元格或者多个单元格构成的区域对象)。
一般情况下,Application对象是指Excel程序本身,其属性可以控制Excel应用程序的工作环境。通过Application对象可以访问和操作Excel应用程序的所有对象。有关其常用属性将在今后的学习中详细讲解。
Workbooks对象是指工作簿对象,它包含了Excel程序的所有工作簿。
Workbooks对象的下一层是工作表对象Worksheets。Worksheets对象集中的每一个对象都是一个工作表。
Range对象是工作表中的某个单元格或者单元格区域,是VBA开发中最常用的对象,也是最重要的对象。
交叉参考
有关Excel对象内容将在第9章中进行详细讲解。
3.4.3 简单VBA实例开发
在对VBA开发有一定的了解之后,通过一个简单的VBA实例来加深对VBA编程思想的理解。
有如图3-31所示的一个数据表,该表为某公司的员工某个月的工资数据。
图3-31 员工工资数据表
工程要求:设计一个用户窗体,该窗体能更改第一个工作表的名称,还能往第一个工作表中插入新的记录。
这个实例将带领用户学习常用窗体控件的操作和一些对象的简单属性,通过它能对VBA的工作模式有一定的了解。该实例实现的详细步骤如下。
step 1 按Alt+F11组合键进入VBA开发环境。在工程资源管理器中,选择VBAProject(3-4.xlsx),单击鼠标右键,选择“插入”->“用户窗体”菜单命令。效果如图3-32所示。
图3-32 插入用户窗体
step 2 图3-32中,右侧布满标尺格点的灰色区域即为主窗体。飘在主窗体上层的为工具箱。在这个工具箱内,包含了所有常用的窗体控件。可以选择需要插入的控件,单击该控件的图标,然后按住鼠标左键将该图标拖到主窗体中即可创建一个控件。在本实例中,需要用到“标签”、“文字框”、“命令按钮”等。
step 3 将鼠标放到主窗体4个角上,拖动鼠标调整主窗体到适当的大小。从工具箱内拖出相应的控件到恰当的位置,如图3-33所示。
图3-33 “标签”的属性
step 4 图3-33中显示的为标签“Label1”的属性,通过该窗口可以设置“Label1”的各项属性。本例中设置“Caption”属性即在窗体内显示的文字为“工作表名称”,双击Font属性窗口,设置字体为“宋体”“小四”字体。其他属性可以不进行设置。单击命令按钮“CommandButton1”即可看到其属性窗口,如图3-34所示。
图3-34 “命令按钮”的属性
step 5 在标签属性窗口类型,本例修改“Caption”属性为“修改名称”,设置字体Font为“宋体”“小四”字体。根据本例需要,复制标签、文字框、按钮,调整行、列和属性,得到界面如图3-35所示。
图3-35 完整界面
step 6 如图3-35所示,文本框的名字均为默认。在后续章节实例讲解中,所有控件如果采用默认编号,都依据先后顺序设定名字,不再一一标识。
step 7 双击“修改名称”按钮,进入窗体userform1代码窗口,如图3-36所示。
图3-36 窗体代码窗口
step 8 图3-36所示为命令按钮的单击事件,此按钮事件的功能为更改第一个工作表的名称,其名称为窗体中第一个文字框的内容。在此窗口中输入如下代码:
Private Sub CommandButton1_Click() '设置编号1的工作表的名称为文字框TextBox1的值 Application.Worksheets (1).Name = TextBox1.Text End Sub
step 9 双击“插入记录”按钮,此按钮事件的功能为在数据表最底端插入一条记录,其数据为窗体文本字的内容。进入代码窗口输入如下代码:
Private Sub CommandButton2_Click() '选择工作表中任意一个单元格 Range("F11").Select '将单元格选择移动到所选单元格所在列的最后一个单元格 Selection.End(xlDown).Select '将单元格选择移动到所选单元格所在行最左端的单元格 Selection.End(xlToLeft).Select '开始新增一条记录 ActiveCell.Offset(1, 0).Range("A1") = TextBox2.Text ActiveCell.Offset(1, 0).Range("B1") = TextBox3.Text ActiveCell.Offset(1, 0).Range("C1") = TextBox4.Text ActiveCell.Offset(1, 0).Range("D1") = TextBox5.Text ActiveCell.Offset(1, 0).Range("E1") = TextBox6.Text ActiveCell.Offset(1, 0).Range("F1") = TextBox7.Text End Sub
step 10 双击“清空”按钮,此按钮事件的功能为清空窗体中所有文字框中的内容。当要输入多条记录时,能方便地进行多次输入。进入代码窗口输入如下代码:
Private Sub CommandButton3_Click() '设置第一个文字框的内容为空 TextBox1.Text = "" '设置第二个文字框的内容为空 TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" End Sub
step 11 用户窗体userform1的编码完成,其事件完整代码如下:
'更改工作表名称按钮事件 Private Sub CommandButton1_Click() '设置编号1的工作表的名称为文字框TextBox1的值 Application.Worksheets(1).Name = TextBox1.Text End Sub '向工作表添加一条新记录按钮事件 Private Sub CommandButton2_Click() '选择工作表中任意一个单元格 Range("F11").Select '将单元格选择移动到所选单元格所在列的最后一个单元格 Selection.End(xlDown).Select '将单元格选择移动到所选单元格所在行最左端的单元格 Selection.End(xlToLeft).Select '开始新增一条记录 ActiveCell.Offset(1, 0).Range("A1") = TextBox2.Text ActiveCell.Offset(1, 0).Range("B1") = TextBox3.Text ActiveCell.Offset(1, 0).Range("C1") = TextBox4.Text ActiveCell.Offset(1, 0).Range("D1") = TextBox5.Text ActiveCell.Offset(1, 0).Range("E1") = TextBox6.Text ActiveCell.Offset(1, 0).Range("F1") = TextBox7.Text End Sub '清空用户窗体所有文字框内容按钮事件 Private Sub CommandButton3_Click() '设置第一个文字框的内容为空 TextBox1.Text = "" '设置第二个文字框的内容为空 TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" End Sub
step 12 回到工作表,进入“开发工具”选项卡“控件”组,单击“插入”按钮,在弹出的对话框中选择“按钮”,并用鼠标在工作表合适的位置拖动创建按钮,如图3-37所示。在弹出的指定宏对话框中不要操作,单击取消即可。
图3-37 插入按钮
step 13 选中按钮后,单击“开发工具”选项卡“控件”组中的“查看代码”按钮,弹出如图3-38所示代码窗口。
图3-38 按钮事件代码窗口
step 14 因为这个按钮的功能是调出用户定义的窗体,因此在该代码窗口中输入如下代码:
Sub按钮1_Click() '显示用户窗体userform1 UserForm1.Show End Sub
step 15 返回工作表,所有代码编写完毕,单击按钮1,弹出如图3-39所示界面。
图3-39 实现界面效果
step 16 在工作表后的文字框输入“员工工资数据”,单击“修改名称”按钮。在员工号及各字段后分别输入数据“20060231”、“刘成”、“男”、“23”、“2006”、“4500”,单击“插入记录”按钮,结果如图3-40所示。
图3-40 插入记录成功
step 17 此时如果想再添加记录,必须先把所有的文字框清空,否则将添加的是上一次添加的内容,单击“清空”按钮,效果如图3-41所示。
图3-41 清空操作
step 18 如图3-41所示,清空操作成功,所有功能完全实现。
通过这个实例,可以初步了解VBA运行的机制和模式,对VBA开发的思想有更深刻的理解。最重要的是能对VBA中的对象及属性进行访问和设置,有一定的概念,对后续章节的学习就能更轻松。如果对本例中的对象及属性尚看不太懂,可先放一边。当对VBA的了解更多,应用更熟练时,就能轻松地完成本例。
此外,本书所有实例均在Office Excel 2007中调试通过,不存在有害代码或太大的程序冲突,可以放心调试。
3.5 小结
VBA是Visual Basic For Application的缩写,它是以Visual Basic为发展基础的语言。在Office软件中,VBA应用程序能够在Word、Access、Excel、PowerPoint、FrontPage和Outlook等之间进行交互式应用,加强了应用程序间的互动。VBA是VB的应用程序版本,可以理解为“寄生在Office办公软件中的VB”,可以把它看做VB语言的一个子集。
宏(Macro)是由VBA编写的一段代码,由系列命令和函数组成,存储在VBA的模块中。它可以代表一段任何操作的组合。本章通过宏的各种操作来初识VBA的奇妙之处,并带领大家进入VBA的学习。然后讲解到VBA开发环境及程序的调试方法。最后综述VBA程序开发的灵魂,使读者能对VBA开发有综合的了解。