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区域大小 。
【二 Excel VBA学习笔记:单元格对象的属性】附:Worksheet对象的UsedRange属性; UsedRange属性返回工作表中已经使用的单元格构成的矩形区域(不管这些区域间是否有空行,空列或空单元格) 。区域中会含盖所有有数据(空格也算数据的)的单元格 。
