第7章 工作簿和工作表对象

从本章开始就要具体学习Excel VBA中涉及到的各种对象。本章介绍了对象的含义以及工作簿和工作表对象。工作簿对象是工作表的容器,用户对Excel 2007的操作都会涉及到该对象,这些操作主要包括了工作簿的引用、新建、打开、保护和关闭等。工作表存在于工作簿内,是单元格区域的容器。用户对工作表的操作包括了工作表的引用、新建、删除和保护等操作。

7.1 对象简介

对象是用来表述事物的一个抽象概念。任何事物都可以看做是由对象构成的,Excel也不例外,它就是由各种大大小小的对象构成的。这些对象有机地组合构成了一个有序的层次结构。

7.1.1 对象的概念

Excel 2007 VBA采用的是面向对象的程序设计方法。在这种设计方法其考虑问题的思路就是要针对特定的对象进行描述。用户描述对象的手段主要是为对象设置属性、方法和事件。

1. 对象(Object)

在生活中,我们接触的任何实体都可以看做是一个对象。例如一个气球,它就是一个对象。气球有大小、颜色,这就是气球的属性,气球的飞行这就是气球的方法;气球在充气或者放气的时候会产生一些事情,描述这些事情的过程就是事件。

对象可以是一个具体的事物、一个实体、一个名词,任何用户可以描述的内容都可以认为是对象。用户为对象编程的过程,也可以看成是为对象的描述过程。

VBA中的对象实际上是对现实生活中对象的一个抽象。在Excel VBA中会遇到很多的对象例如工作簿、工作表、单元格区域、图表或者是窗体等都是对象。我们学习了解VBA就要从掌握Excel常用对象的属性、方法和事件入手。

2. 对象的属性

和气球有颜色大小属性一样,每个对象都有自身的属性,用户可以通过代码或者在属性窗口为对象设置属性。在VBA中,对象一旦形成就有一个默认的属性值。对象的属性值有两种,一种类型是属性值可以更改,大多数属性都属于这种情况,另一种是只读属性,用户无法通过属性窗口或者代码来更改这样的属性。

例7-01:打开Excel 2007,新建一个工作簿,在VBE环境中,将Sheet1工作表的名称更改为“资产负债表”,要求使用属性窗口和代码的方式分别予以修改。

在属性窗口修改的操作步骤如下所示。

(1)进入VBE编辑环境,在工程资源管理器中选中Sheet1。

(2)在属性窗口中,将“Name”属性值更改为“资产负债表”,如图7-1所示,完成属性值的设置。

图7-1 更改工作表属性

如果要使用代码进行修改,则可以在VBE中新建一个模块,设置代码如下所示:

    #001:  Sub更改工作表名()
    #002:     Sheet2.Name = "资产负债表 01"
    #003:  End Sub

运行上述代码,第2行代码运行的结果就是将Sheet1工作表的名称更改为“资产负债表01”。这也是典型的描述对象属性的代码结构。Sheet2表示对象,Name表示对象的属性,等号和等号右侧的内容表示属性的值。

如何在输入代码的时候知道对象存在哪些属性呢?实际上用户在输入代码的时候会给出指定对象的属性提示,如图7-2所示。其中提示项前为的表示该项内容是属性。

图7-2 属性提示

说明

在VBE环境中将工作表名称属性更改后,对应的工作表的标签名称也发生了变化。例如通过属性窗口和代码更改工作表名称后,单击工具栏上的视图按钮,返回工作表界面。可以看到工作表标签发生了如图7-3所示的变化。

图7-3 工作表名称对应工作表的标签名

3. 对象的方法

对象的方法是对象执行的动作,如果说对象的属性是针对对象的外在描述的话,那么对象的方法就是对象可以完成的一些功能。以单元格区域对象为例,Clear方法就可以将单元格区域中的内容予以清除,在这里“清除”描述的就是对象要做的动作。

在输入代码的时候,会有如图7-4所示的提示,其中提示项前为的表示该项是方法。

图7-4 方法提示

4. 对象的事件

事件是指对象发生的事情。每个事件都有一个过程来响应,在VBA中已经为对象预先设置好了事件。

事件过程是由事件触发而执行的,这就是“事件”驱动。当对象满足特定的条件时候,这些事件就会被触发。对象响应了某个事件后所执行的操作是通过一段代码来实现的。例如工作簿中有一个Save事件,当工作簿保存的时候就会触发保存事件。VBA代码就可以描述在保存过程中发生的事件。有关对象的事件将在以后章节中进行专门介绍。

7.1.2 Excel对象层次结构

在Excel 2007中到处都是对象,初次接触的用户就会有一种疑问,那就是Excel 2007中到底存在有哪些对象?我需要掌握哪些对象?这些对象有什么属性和方法及事件?

实际上由于在Excel 2007中对象众多,加之VBA还可以引用其他程序的对象,因此用户无法也没有必要掌握全部的对象。同时VBA的学习过程并不是孤立的学习语言的过程,由于Excel VBA和Excel是密不可分的,随着用户Excel 2007操作水平的提高,对VBA对象的掌握能力也会相应提高。通常来说掌握只要掌握本书所介绍的最常用的对象即可解决基本问题。

打开Excel 2007用户最直观感受到的是下述4个对象。

● Application对象:表示Excel应用程序。应用程序本身就是一个对象。

● Workbook对象:工作簿对象。直接地处于Application对象的下层,表示一个Excel工作簿文件。

● Worksheet对象:工作表对象。包含于Workbook对象中,表示一个Excel工作表。

● Range对象:单元格区域。表示Excel工作表中的一个或多个单元格。

从上述的4个对象可以看出对象的以下特点。

1. 对象通常是对象集合中的成员

打开了Excel 2007后,还可以发现一个有趣的现象那就是对象总是扎堆出现的。例如用户打开工作簿后,在一个工作簿中默认会存在有3张工作表。这些实质相同内容不同的对象就构成了对象的集合。例如工作表就构成了工作表集合,每一张工作表就是集合中的一个成员。

推而广之,例如图表会有图表的集合,每一张图表就是图表集合的一个成员;批注会有批注的集合,每个批注就是批注集合中的成员。

同一类的对象就构成了对象的集合。使用者称呼这些对象的时候,可以用如下所示集合中成员的方式来进行。

● 对象集合(对象名称)

● 对象集合(索引号)

例如以工作表为例,打开Excel 2007的时候看到的是3个工作表,因此是这些工作表就构成了一个工作表集合,引用工作表Sheets1的时候就可以使用如下代码。

Worksheets("Sheet1")或者Worksheets(1)

说明

对象集合通常是以s结尾的复数形式。例如单张的工作表称为Worksheet,而工作表集合就称为Worksheets。Sheet1就是对象的名称,而后者的1表示的是索引号,也就是集合中第1个成员。不论是用名称来引用,还是用索引号来引用,名称和索引号在同一个集合中都是唯一的,不能在同一个集合中包含两个同名的成员。

2. 对象是分层次的

对象是分层次的。例如Application对象下包含了工作簿,这就是说一个打开Excel程序可以同时打开若干个工作簿。每个工作簿下包含了若干张工作表,工作表中又包含了单元格区域,这些对象是按照从大到小有机排序的。

由于对象是分层次的。因此对象在引用的时候通常用“.”来分隔对象层次,句点左侧的对象包含了句点右侧的对象。例如引用某个工作簿中的工作表Sheet1,完整的代码如下所示。

Application.Workbooks("book1").Worksheets("Sheeet1")

这个引用的过程简单地来说有点类似于写信时候的书写地址。例如有一个地址“河北省石家庄市藁城XX镇”。那么在这个地址中,河北省是包含了石家庄市的,石家庄市又是包含藁城的。

不过很显然我们在实际的VBA编程中并不都是采用这样的引用方法,通常会将引用某个工作簿中的工作表Sheet1简略地书写为:

Worksheets("Sheeet1")

这样做的原因也可以从我们日常书写地址的过程中找到理由。例如石家庄市的一个人写信到藁城的时候,只需要将地址直接写成“藁城XX镇”即可,因为默认情况下,石家庄市的人都知道藁城是位于石家庄市,只要不引起误解,完全可以用省略的方式。同样道理对一个对象引用,如果只打开了一个工作簿,那么就不用再写工作簿名称,而直接以Worksheets("Sheeet1")来表示。