至此,我们已经了解了对象、属性和方法的基本概念,认识了Excel的对象模型以及常用的对象在VBA中的表示,以及如何使用对象的属性和方法,这些都是Excel VBA编程最基础的部分。熟悉和了解这些知识,对进一步学习VBA编程很重要。

为了进一步巩固已经学习的知识,我们引用Excel先生(Bill Jelen)的著作《VBA and Macros for Microsoft Excel》中的例子,稍作修改,再次形象化地说明相关的概念和表示对象的基础语法结构。

假设我们使用VBA来玩足球,那么踢球的指令应该类似下面这样:

“Kick the Ball”(中文为:“踢球”)

这就是我们平时说话的方式,具有很明确的意义,句子中有动词(Kick)和名词(the Ball)。还记得前面的系列文章中的VBA代码,也有动词(Add)和名词(Worksheets)。

虽然说平时我们用于踢球的指令听起来已经很自然,但是VBA代码并不是这样来表示的。如果使用VBA来踢足球,那么基础的语言结构应该是:

Ball.Kick

这里的名词(Ball),位于最前面,在VBA中,就是对象,也有动词(Kick)紧随在名词之后,在VBA中,就是方法

这也就是VBA中最基础的结构:

对象.方法(Object.Method

如果使用VBA编写程序,就一定要习惯于这样的结构。

接着来做假设。在绿色的草地上,放在你面前的有5个球,分别是足球、篮球、棒球、保龄球和网球。现在,你给足球队员发出一条指令:

Kick the soccer ball(中文为:踢足球)

如果你仅仅告诉他踢球(或者Ball.Kick),没有明确踢哪一个球,可能他就会踢离他最近的那一个,例如保龄球,这明显会出问题

对于任何名词或者对象,在VBA中,都会有一类对象集合。看看Excel中,可以有一行,也可以有多行;可以有一个单元格,也可以有多个单元格;可以有一个工作表,也可以有多个工作表。对象与对象集合的惟一不同之处就是需要在对象的名称后面加上一个表示复数的“s”,例如:

Workbook成为Workbooks

Worksheet成为Worksheets

Ball成为Balls

当所指的是某个对象集合时,就需要告诉VBA具体要操作的对象。可以使用不同的方法。

一种方法是使用数字来指明具体的对象:

Balls(2).Kick

然而,这种方式虽然可以达到目的,但也比较危险。例如,可能最初代码工作得很好,但某个时候某人调整了球的顺序,那么Balls(2).Kick可能就变为踢到其他的球了。

另一种方法是使用名称来指明具体的对象,这是一种比较安全的方式:

Balls(“Soccer”).Kick

很明确地知道是要踢足球。

在Excel VBA中,对于大多数动词或者方法,都会有参数告诉如何执行动作,这些参数相当于副词。你可能想把足球踢到左边并且是使劲踢:

Balls(“Soccer”).KickDirection:=Left,Force:=Hard

多数方法都有大量的参数告诉程序如何执行方法。

在查看VBA代码时,当看到冒号和等号的组合时,就说明是使用参数描述动词如何执行动作。(而对于属性来说,则是进一步描述形容词的特性)

有时,某个方法可能会有10个参数,其中有些参数是可选的,可能Kick方法有一个Elevation参数,使用下面的代码:

Balls(“Soccer”).KickDirection:=Left,Force:=Hard,Elevation:=High

这里容易让人搞糊涂。每个方法的参数都有默认的顺序,如果你碰巧知道参数的位置,那么可以不使用参数的名称,下面的代码等效于上面的代码:

Balls(“Soccer”).Kick Left,Hard,High

这也可能影响我们对代码的理解,没有冒号和等号的组合,参数的含义就不那么明显了。当然,知道参数的顺序,是可以理解其意思的,但大多数参数的顺序我们是无法全部记住的。

上面例子中的Left、Hard和Hign还是比较容易理解,但使用下面的参数时:

WordArt.Add Left:=10,Top:=20,Width:=100,Height:=200

将其简写成下面的代码:

WordArt.Add 10,20,100,200

这就让人困惑了!这也是一条有效的代码,但除非你知道Add方法默认的顺序分别是Left、Top、Width、Height,否则这条代码的意思很难明白。

再复杂一些。用户在一条代码中可以指定某个参数的名称,省略掉另外参数的名称。例如,用户在不指明参数名称的情况下在参数的默认位置设置参数,然后突然带上一个指明名称的参数,而且这个参数不一定在默认的位置上。如果想把踢高高地踢到左边,而不介意力量的大小(使用默认的力量),那么下面的两条语句是等效的:

Balls(“Soccer”).Kick Direction:=Left,Elevation:=High

Balls(“Soccer”).Kick Left, Elevation:=High

一旦开始指明参数名,后面的代码就都需要指明参数名称。

灵活的参数表示,方便的同时也带来了问题!

对于对象的属性的参数来说,也有类似的规则。

有些方法很简单,例如要模拟按下F9键(即重新计算工作表),可以使用如下代码:

Application.Calculate

有些方法可以执行一个动作并创建新的对象,例如,下面的代码添加一张工作表:

Worksheets.Add Before:=Worksheets(1)

可以将Add方法创建的新对象指定给一个变量,此时,必须使用括号将参数包住:

Set MyWorksheet= Worksheets.Add(Before:=Worksheets(1))

与很多解对象的书相似,一般代表对象的是名词,代表方法的是动词,而代表属性的则是形容词。前面我们过,代码中的:

ActiveCell

代表活动单元格。

现在,我们想将活动单元格的颜色更改为黄色,要用到其属性Interior.ColorIndex,代码如下:

ActiveCell.Interior.ColorIndex = 6

虽然代码中用到了两个句点,看似复杂一点,但是其结构仍然是“名词+点+其他内容”,这次是Object.Property(对象.属性)。

差别在于,给属性赋值时,等号前面没有冒号。

对象的属性总是被设置成等于什么,或者是获取属性的值给变量或其它对象的属性。

例如,要将当前单元格的颜色设置成单元格A1的颜色,代码如下:

ActiveCell.Interior.ColorIndex =Range(“A1”).Interior.ColorIndex

Interior.ColorIndex是属性,通过更改属性的值,可以将对象的表现进行相应的更改。更改形容词就可以对单元格进行某些设置。我们通常会说“将单元格设置为红色的”,而VBA会这样“说”:

ActiveCell.Interior.ColorIndex = 3

发表回复