admin 管理员组

文章数量: 887021


2024年2月22日发(作者:java能处理二维数组吗)

VBA讲师罗刚君<****************>20:00:42

1.有什么办法可以识别对象的属性是可读的还是可写的,或者既可读又可写?

VBA讲师罗刚君<****************>20:01:01

方法很多,善于动手测试者可以利用代码的测试,例如利用Msgbox函数获取属性的值,能获取成功就是可读

VBA讲师罗刚君<****************>20:01:11

而利用等号可以赋值成功的就是可写的,如果赋值出错则可能不是可写的。

VBA讲师罗刚君<****************>20:01:29

例如属性就是只读不能写的。

VBA讲师罗刚君<****************>20:01:37

如果不想动手测试,进入帮助中查看即可。

VBA讲师罗刚君<****************>20:01:45

2.如何区分对象的属性与对象的方法?

VBA讲师罗刚君<****************>20:02:08

可以根据成员列表中的图标来判断,带绿色图标的是方法,另一种则为属性。

VBA讲师罗刚君<****************>20:02:32

可以根据词性来判断,方法是动词,属性是名词。

VBA讲师罗刚君<****************>20:02:43

也可以在进入帮助中查看。

VBA讲师罗刚君<****************>20:03:05

3.执行以下代码会出错,出错的原因是什么?

Sub test()

End sub

VBA讲师罗刚君<****************>20:03:15

错了两个地方

VBA讲师罗刚君<****************>20:03:21

一是Worksheet应改用Worksheets

VBA讲师罗刚君<****************>20:03:33

二是只是声明一个属性而已,并没有说明如何处理这个属性,它不是一句完整的VBA代码。

VBA讲师罗刚君<****************>20:03:40

类似于“你”,完整的说法是“你干什么”或者“喜欢你”

VBA讲师罗刚君<****************>20:03:53

单独的一个字“你”不能成为一句完整的话。在VBA中属性值也不是一句完整的代码。

VBA讲师罗刚君<****************>20:04:01

4. 事件过程最主要的一个特点是什么?

VBA讲师罗刚君<****************>20:04:09

满足预先设计的条件时,代码可以自动执行。

VBA讲师罗刚君<****************>20:04:26

5.为了确保编写事件过程的代码时不会出错,应采用什么方法书写事件过程?

VBA讲师罗刚君<****************>20:04:41

通过对象与过程列列表选择的方式产生代码,而非手工拼写。

VBA讲师罗刚君<****************>20:05:16

VBA讲师罗刚君<****************>20:05:44

在上图中,左边的下拉列表是对象列表,右边的列表是过程列表

大家可以课后再复习一下上节课的内容,并多看看题目与答案,恐固上周的知识

现在讲今天的内容

第15课 对象的层次结构

Excel的对象是学习VBA的重点,而了解对象的同时必须了解对象与对象之间的层次结构。

所谓层次结构,可以理解为公司的组织架构图,例如经理以下是厂长,厂长以下是主任、主任以下是组长之类„„

VBA处理对象时按照严格的层次顺序,一旦顺序弄错就无法访问成功。

例如以下代码访问“生产表.xls”中的a1单元格的值,注定失败:

Sub test()

MsgBox Workbooks("生产表.xls").Range("a1")

End Sub

请看上图

这是错误提示,大家也可以新建一个工作簿,将它保存为生产表.xls,然后执行以上代码实际测试有助于理解和记忆

错误提示“对象不支持该属性或方法”,表示工作簿对象Workbook没有Range这个子对象,因此出错。

工作表才是的工作簿的子对象,而单元格是工作表的子对象。

工作簿->工作表->单元格

这其实就是对象的层次结构。

了解对象的层次结构可以从以下几个方面着手:

l 对象与对象集合

l 通过对象名称与索引号引用子对象

l 父对象与子对象

l 活动对象

l 利用With 语句简化对象引用

15.1 对象与对象集合

今天的第一个知识点

对象是一个应用程序中可操作的元素,对象集合则为一组具有相同性质的对象的集合。

例如工作表“Sheet1”是一个对象,当所有工作表加起来就是工作表集合

其中工作表通常用Worksheet表示,而工作表集合用Worksheets表示,表示对象的复数形式。

名称与名称集合:

Name——>Names

条件格式与条件格式集合:

FormatCondition——>FormatConditions

单元格与单元格集合:

Cells(行,列) ——>Cells

或者:

Cells(索引) ——>Cells

通常集合对象都以s结束,表示复数。

单数不构成集合对象与对象集合的另一个显著区别是对象没有Count属性,而对象集合是多个对象的组合体,则具有Count属性。

判断对象是单个对象还是对象集合除了看S外,上图中的方法就不错

输入对象后,看它是否支持count属性

绝大部分对象都有对象集合,最顶层的对象没有集合,例如VBA、Excel和Office是最3个最顶层的对象。

Application对象其实就代表Excel,因此有些教材也会将它看作最顶层的对象之一。

15.2通过对象名称与索引号引用子对象

今天的第二个知识点

引用对象集合直接采用对象名称加S即可

常见的是单元格集合Cells、工作簿集合Workbooks、工作表集合Worksheets、表集合sheets、图表集合Charts、图形对象集合Shapes、批注集合Comments„„

引用对象集合中的子对象时,有以下两种方法:

1)用子对象的名称或者地址作为对象集合的参数

例如Workbooks("一月生产表.xls")

其中Workbooks表示工作簿对象集合,“一月生产表.xls”是对对象名称

整个代码的含义是引用工作簿集合中的名为“一月生产表.xls”的子对象。

因此,不要看到有s就表示这是引对象集合,它的参数“一月生产表.xls”已经限定了引用对象是子对象,而非对象集合。

注意:不要写成Workbooks("一月生产表")

因为任意工作簿保存后总是有后缀名的,包括xls、xlsx或者xlsm等,

只有未保存过的工作簿才没有后缀名,但是它通常是“Book1”或者“工作簿1”,永远不可能是“一月生产表”。

更不要写成Workbook("一月生产表")

因为Workbook不是复数形式,没有子对象。

Worksheets("生产表")

其中Worksheets表示工作表集合

“生产表”是工作表名称,因此整个代码的含义是引用工作表集合中的名为“生产表”的子对象。

不能写成Worksheet("生产表")或者Worksheets("一月生产表.xls ")。

原因,大家思考吧

Shapes ("VBA")表示引用名为“VBA”的图形对象。

2)用索引号作为对象集合的参数

索引号通常指子对象的位置或者顺序。

索引号一定是数值,不能是文本。

Workbooks(2)-->表示引用第二个工作簿

Worksheets(22)-->表示引用第22个工作表(从左向右的顺序)

Cells(5) -->表示第5个单元格,即E1单元格

Shapes(10) -->表示引用第10个图形对象

Shapes() -->表示引用最后一个图形对象。

因为表示图形对象的总数量。

workSheets() -->表示最后一个工作表。

Sub 添加新表放在最后位置()

after:=Worksheets()

Worksheets().Name = "看什么,就是我啦"

End Sub

以上代码表示创建一个新工作表

after参数的值是Worksheets(),因此新工作表放在最右边的位置。

然后对工作表命名时要引用最后一个工作表,也使用了Worksheets()。

VBA中没有backSheet或者endsheet之类的对象,而用Worksheets()来表示最后面的一个工作表。

看上图,这是代码的执行结果

可以印证Worksheets()代表最末一个工作表

这种用法在工作中相当常识,大家要课后式加练习

Range("B2:F10").Cells (6)

表示Range("B2:F10")区域的第6个单元格,即B2单元格。

可能会有人想,为什么会是B2呢?

上图已经清晰地说明了索引号6的计算规则

Cells是一个比较特殊的对象集合,它支持单索引号和双索引号。采用双索列号时,两个参数分别代表行数与列数。

Cells(5,6)表示工作表中第5行第6列的单元格,具体是哪一个单元格?

请同学们动手测试一下,可用以下代码获得其地址:

MsgBox Cells(5, 6).Address

索引号是相当有用的功能,常在循环语句中使用索引号来逐一引用每一个子对象。

例如批量重命名工作表,代码如下:

Sub 批量重命名()

Count:=4 '一次创建4个空表

For i = 1 To 7 '从第1个到第7个

Sheets(i).Name = Format(i, "DDDD") '逐一命名工作表

Next

End Sub

这是代码执行结果,如果看不到图可以发言

为什么第一个工作表的名称是Sunday,而不是Monday?

这个常识不用说吧?

索引号在工作中的应用相当广泛,几乎所有循环语句中都需要使用对象集合的索引号,当然有时是对数组使用索引号。

以下代码是通过双索引号引用单元格,并在单元格中输出编号和颜色:

Sub 获得颜色索引号()

For i = 1 To 56

Cells(i, 1) = i

Cells(i, 2).ndex = i

Next

End Sub

用法同上:

打开Excel后,按下Alt+F11组合键进入VBE界面

然后单击菜单“插入”-->“模块”,

15.3父对象与子对象

Excel VBA中通过索引号或者名称参数来引用子对象,那么如何引用父对象呢?

VBA提供了一个专用的名词来表示父对象——Parent

工作表是单元格的父对象,因此以下代码可以获得工作表名称

Sub 获取工作表名称()

MsgBox Range("A1").

End Sub

可能会有人说想知道工作表名称直接用就行了,Parent永远没有用武之地。

那么请看以下案例:

工作表中有若干个批注,要求找出第二个批注在哪个单元格。

这种前提下,通过Comments引用批注集合,使用索引号2引用第2个批注,再通过Parent属性引用批注的父对象才是上策。

完整代码如下:

Sub 计算第二个批注在哪里单元格中()

MsgBox ts(2).s

End Sub

大家可以课后去测试一下代码,此情况下用,用Parent才是上策

还有一种情况不得不用Parent

使用ox创建一个对话框让用户选择区域,并将它赋值给变量后,变量的地址只包含单元格地址,不包含父对象工作表的名称,因而常由此造成诸多怪事。

VBA讲师罗刚君 发表动态 20:38:10

"分享图片"

请大家下载群共享中的动画,用IE查看(Win 7删除了动画播放器,XP才有)

VBA讲师罗刚君 分享文件 20:39:03

"怪事一桩.xls" 下载

动画都看完了吧

15.4活动对象

活动对象是指定当前正在操作的对象,通常用Active表示活动的对象。

例如ActiveSheet表示活动表,切不可写作ActiveWorkSheet

ActiveWorkbook表示活动工作簿

ActiveChart表示活动图表

ActiveComment表示?

这是不存在的对象,它不是活动批注,不能随意拼写!

如何判断是否存在活动工作表?是否存在活动批注呢?

活动对象的父对象都是application,因此可以通过以下方式判断:

上图中没有的活动对象就是不存在的。

书写代码要看提示,切不可凭想象组合代码。

群里喜欢凭自己的想象拼写代码的人不少

例如ActiveWorkSheet、ActiveComment、ActiveExcel、ActiveColumn等等,都不是正确的对象名称

活动对象是当前正在操作的对象,由于正在操作的对象只有一个,因此引用活动对象时可以简写。

简写时,可以忽略活动对象,只书写其子对象

引用“生产表.xls”工作簿的“生产”工作表的“A1”单元格

可用以下代码:

Workbooks("生产表.xls").Worksheets("生产").Range ("A1")

此代码正好体现了对象的层次结构!

如果“生产表.xls”工作簿是活动工作簿,那么代码可以简写为:

Worksheets("生产").Range ("A1")

而不是:

eets("生产").Range ("A1")

如果“生产”工作表是活动工作表,那么代码可以简写为:

Range ("A1")

也就是引用活动对象的子对象时只需要书写子对象名称即可。

基于以上原则,同学们要注意:Range ("A1")表示活动工作表的A1单元格,

假设Sheet3是活动工作表,那么引用Sheet1的A1单元格时只能如下方式书写:

Worksheets("sheet1").Range ("A1")

或者:

Sheets("sheet1").Range ("A1")

15.5利用With 语句简化对象引用

对象具有层次结构,有时需要引用的对象包含很多层,而且需要反复引用,那么此时应该采用With语句简化引用。

例如:

eets("生产").Range ("A1"). Comment

此代码使用了3个小圆点,引用了四个层级的对象。

如果需要反复引用对象,那么应采用With语句简化引用。

例如:

Sub 修改批注()

Workbooks("生产表.xls").Worksheets("生产").Range("A1").e = True

Workbooks("生产表.xls").Worksheets("生产").Range("A1").

Workbooks("生产表.xls").Worksheets("生产").Range("A1"). = 20

Workbooks("生产表.xls").Worksheets("生产").Range("A1"). = 20

Workbooks("生产表.xls").Worksheets("生产").Range("A1"). Text:="你看我帅不?"

Workbooks("生产表.xls").Worksheets("生产").Range("A1").

ze = True

End Sub

上图是代码执行前后的效果对比

执行代码前,应在A1单元格随意插入一个批注

以上代码有三个问题:

1.书写不方便,工作量大

2. 查看不方便,例如其中夹杂一句以下代码:

Workbooks("生产表.xls").Worksheets("生管").Range("A1"). = 20

用户很难看出差异来,会误以为全都一样。

3.运算效率低。VBA需要多次引用工作簿、工作表、单元格和批注。

为了解决以上问题,采用With是必然选择。

以下代码是简化的代码:

Sub 修改批注2()

With Workbooks("生产表.xls").Worksheets("生产").Range("A1").Comment

.Visible = True

.

. = 20

. = 20

.Text Text:="你看我帅不?"

.

End With

ze = True

End Sub

请大家将两段代码复制到一起,比较它们的异同

显然,第二段代码更有利于阅读和理解

同时也便于书写

而且执行效率更高

Workbooks("生产表.xls").Worksheets("生产").Range("A1").Comment

对象只引用了一次,而不像前面的过程,需要每个对象引用6次。

关于With还有很多很多技巧,今天的课程主要在于对象的层次结构,因此不再多讲。

请关注后续的课程。

另外,本套课程多数内容来自《Excel VBA程序开发自学宝典(第2版)》,大家可以注意一下此书,有书配合听课将有更佳效果。糊→啦啦


本文标签: 对象 工作 代码 集合 引用