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版)》,大家可以注意一下此书,有书配合听课将有更佳效果。糊→啦啦
版权声明:本文标题:第十五课VBA对象的层次结构 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708597582h527439.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论