VBA里的“对象”这个概念,我也不是很明白。就我的简单理解:VBA中常用对象:工作簿、工作表、单元格就这三种;再就是在代码中用SET赋值的 Set ** = CreateObject(**) ;CreateObject创建对象的意思,Set 后面的**就是对象,称为对象变量。“对象”的赋值必须用SET。为了加深理解标题写成单元格“对象”的属性,因为是“对象”才能有属性,不同类别的“对象”,属性不同。
语法:对象.属性(参数)。本节主要讲解 单元格的End属性,End属性返回当前单元格所在连续区域边界处的单元格。对连续区域简单解释:从选定单元格开始向相邻单元格扩展,只要单元格里的值不为“空”,则都是连续区域。(等同于在选定单元格按CTRL键 方向键(上下左右)得到的单元格)
语法表达形式:Range().End (参数);参数有4个值:向左 xlToLeft 数字简写 1,向右 xlToRight 数字简写 2,向上 xlUp 数字简写 3,向下 xlDown 数字简写4。End属性返回的是单元格对象,而不是单元格的值或是行、列的序号。如图:
图例中还跟上了个address属性,得到单元格的地址。A1最下边的是A7,最右边的是C1(见图中“本地窗口”中的值。
下面图例,不接任何属性看能得到什么:
可以看出不带属性得到的是单元格里的值。等同于Range(“a1”).End(xldown).Value。其实大多数情况下,单元格后不接属性,默认就是.Value,返回单元格的值。(但是在写本文时,我发现过n得到的值是7,也就是最下边A7单元格的行号。看来,省略“.属性”的代码写法是很不靠谱的。)
End属性通常的作用是用来找指定单元格的连续区域数据的边界;就是得到边界上单元格的行号和列号。通常使用如下语句:Range(“A1”).End(xldown).Row 或 Range(“A1”).End(xltoright).Column。如下图:
得到区域最大行号是7,最大列号是3,3 X 7 21个格子。
但是End属性 在使用时受“空”单元格影响,如下图:
End(xldown)向下遇到“空”单元格就停止了,所以n值等于5了。还有如下图情况:只有1行数据时,End(xldown)值会得到工作表最大行号1048576(EXCEL 2016版的最大行数)。
鉴于此,这些情况就要用end(xlup)。语句:Cells(Rows.count,”A”).End(xlup).Row。见下图:
此示例中用了Cells表示的单元格。Rows.count表示工作表的最大行号,语句意思:Cells(Rows.count,”A”)表示【 A1048576】单元格(A列最下面的单元格),End(xlup)向上找,找到最近的有数据的单元格。找到的单元格就是A列最后一个有数据的。这样就解决了“空”单元格问题与数据行只有1行的问题。(常见到语句写Range(”A65535”).End(xlup),同样的用意)
END(xltoleft)与END(xltoright)是同理的用法。
单元格.CurrentRegion属性
range().CurrentRegion返回指定单元格所在的连续区域,区域是以空行和空列为边界的区域。在工作表中点选单元格,然后按Ctrl A得到的区域就是CurrentRegion。下图两个示例:
从上图可看出,在区域外围是以空行和空列为边界。里面单一的“空”单元格不影响CurrentRegion区域大小。
附:Worksheet对象的UsedRange属性; UsedRange属性返回工作表中已经使用的单元格构成的矩形区域(不管这些区域间是否有空行,空列或空单元格)。区域中会含盖所有有数据(空格也算数据的)的单元格。
,