听说没有对象放假不好回家?那就聊聊啥是对象~

嗨,大家好,我是星光。今天给大家聊聊啥是VBA对象。
谈到对象,有的朋友可能会想到单身dog,有的朋友可能会想到已为人妇的苍井不空姐姐,有的朋友可能想到万物皆对象的Python——其实年岁渐长波澜不惊的VBA也是一种面向对象的编程语言。我们学习VBA的目的,就是控制各种对象完成各种任务,所以理解什么是对象;如何用代码表达对象,就成了极其重要的事儿——那么什么是对象?
什么是对象
男朋友是对象,女朋友也是对象,但对象并非单指男/女朋友,而是一种东西,或者说物体。相比于现实世界,从概念上来说,编程世界的对象就是一种虚拟的物体,除此之外,并无太大区别。
什么是属性
既然是物体,必然有特征,特征就是对象的属性。

我举个例子,假设你有个女朋友。你这女朋友有什么特征?没有特征?没有特征岂不是人人都成了你女朋友?咦,这样想想好像也——醒醒,醒醒,小同志!天都亮了~

打个响指,我换个比方。假设你小时候有一本特别漂亮的日记本,有一天不小心弄丢了,你很伤心,怎么办呢?当然是去找老师啦。

你先去找语文老师。
'老师,我的日记本丢了,呜呜呜。'
'小胖啊别哭,你的日记本有什么特征啊?'
'我有在扉页上写我的名字。'
'哦,知道了。日记本.名字是小胖'

……

然后你又去找数学老师。
'老师,我的日记本丢了,呜呜呜。'
'小胖啊别哭,你的日记本有什么特征啊?'
'它是黄色的,很黄很黄。'
'哦,知道了。日记本.颜色很黄'

然后你又去找生活老师。
'老师,我的笔记本丢了,呜呜呜。'
'小胖啊别哭,你的日记本有什么特征啊?'
'……里……里面有我给小柔写的情书,我……我背给你听啊……'
'哦,知道了。日记本.内容是'小柔啊太阳,我啊星星,没有她的日子再璀璨也是黑夜啊啊啊'。'

你小时候的日记本是一个物体,是对象;名字、颜色、内容、大小……这些都是日记本的特征,也就是对象的特征。只不过在编程世界中我们不用特征这个词,而是用属性,因此对象的属性也就是对象的特征。

什么是方法
物体会有行为,行为便是方法。

我举个例子。第二天下午,体育老师帮你把日记本找到了,原来是你偷看小柔打乒乓球时落在操场上了。

拿到日记本后,你得赶紧打开看看有没有损坏。打开是一种行为,在编程的世界代码是这么描述的:日记本.打开

然后你在笔记本里写了一段话:失而复得,不甚快哉。写也是一种行为:日记本.写 '虽然我还没娶到小柔,但我很快乐'

最后你心满意足把日记本关上,关上还是一种行为:日记本.关闭

你有一个对象,是日记本,这个日记本会有各种行为,比如打开、关闭、写入;这些行为在编程的世界中被称为方法,因此方法就是行为。

是不是很简单?

什么是对象的集合

你的日记本是一个个体,我的日记本是一个个体,她的日记本也是一个个人……所有人的日记本合在一起也就组成了一个群体,这就是对象的集合。所以所谓对象的集合,就是多个相同类型小对象的集合而成的大对象。

当你对老师请求帮助时,你会说,我的日记本丢了,而不是日记本丢了。说日记本丢了会怎么样?在现实世界中,老师可能会确认一下谁的日记本丢了,而在虚拟世界中,系统会认为所有的日记本都丢了。你会想这不现实,怎么可能所有的日记本都丢了,傻子才会这么想——那么你还记得咱们讲过的程序员买包子的段子吗?

打个响指,下面是见……进入虚拟编程世界的时刻。

VBA中的对象
日记本是现实世界的真实对象,现在我们把它换成编程世界的一个虚拟对象,比如咱们很熟悉的Excel中的工作表。

如下图所示,一个名为'我学VBA'的工作簿包含了三张工作表。

现在,我们需要将名称为'星光'的工作表删除。

在VBA中,工作表使用单词Worksheet表示;所有的工作表,也就是工作表的集合,用复数形式Worksheets表示;我们要删除的不是所有的工作表,而是工作表集合中一个名称为'星光'的,也就是Worksheets('星光')

删除是一个行为,是方法,还记得方法怎么表示吗?代码如下:

Worksheets('星光').Delete
新建一个模块,在代码窗口将这个语句写到Sub过程里,按F5键运行,就可以删除名称为'星光'的工作表了。
Sub 删除工作表()    Worksheets('星光').DeleteEnd Sub
这是方法,再举个属性的例子。

假设你想代码告诉你当前工作表的A1单元格的内容,内容是特征,也就是属性。A1单元格我们可以用Range('A1')表示,它的属性内容呢?

Range('a1').Value
……

是不是很简单?不要怀疑,VBA就是这么简单~

什么是对象的层次
什么是层次?在前面的章节咱们讲过,所谓层次,可以理解为上下级的隶属关系。对象也是有隶属关系的。比如说你小时候的日记本,日记本自身是第一层对象;日记本里的每一页纸,也是对象,属于第二层;每一页纸里的每一行,还是对象,属于第三层……

同样的道理,Excel程序是第一层对象,某个工作簿是第二层对象,这个工作簿内的工作表是第三层对象,工作表里的单元格是第四层对象……

了解对象的层次有什么用?

如果你女朋友对你说,给我把第三行的字删掉,立刻!马上!赶快!!——你知道她在说什么吗?哪里的第3行字?是黑板?是考卷?还是日记本?如果是日记本的话,是第几页的第三行?——摊手,耸肩,你知道我知道你不知道。

但也有一种特殊的情况;比如,你和她坐在草坪上一起看小时候的日记,她对你说,给我把第三行的字删掉,立刻!马上!赶快!!这个时候不用她说是哪里的第三行字,你都知道是当前日记本当前页的第三行字——这就是对象层次的默认性。

举个VBA编程中的例子。

你还记得如何删除名称为'星光'的工作表吗?

Sub 删除工作表()    Worksheets('星光').DeleteEnd Sub
这里我们并没有说删除Excel程序内哪一个工作簿的工作表,但Excel里的VBA代码天然隶属于Excel,所以系统都默认你要删的是Excel程序内的工作表,而不是电脑里的其他程序。

同时我们没有指定工作簿,系统就默认为当前活动工作簿,因此这段代码删除的是Excel程序内当前工作簿内名字为'星光'的工作表。

再看另外一个例子,以下代码可以使用消息框的形式显示A1单元格的内容。

Sub 单元格的内容() '当前工作表 MsgBox Range('a1').ValueEnd Sub
我们并没有说是哪一个工作簿哪一个工作表的A1单元格,因此系统便默认为当前工作簿当前工作表的A1单元格。

那如果你需要知道的不是当前工作表的A1单元格的内容,而是当前工作簿~名称为'朕要学习'的工作表~A1单元格呢?

不同层次之间的对象,我们可以用点号.来表示。同属性和方法一样,这里的点号可以理解为中文意思的。

代码如下:

Sub 指定单元格的内容()    MsgBox Worksheets('朕要学习').Range('a1').ValueEnd Sub
……
(0)

相关推荐