我们经常需要知道工作表中有数据的最后一行,以确定已经使用的单元格区域,从而方便对所有数据进行操作。然而,很多时候工作表最后一行是不确定的,可能是由于我们插入行或者删除行,也可能是由于我们不断地在后面添加数据。
在Excel工作表界面中,我们可以很直观地看到数据所在的最后一行是哪一行。但是,在编写VBA程序时,我们怎么样才能确定最后一行呢?
下面,我们先介绍查找最后一行的一段典型的VBA代码,然后再看看一些其他可以达到同样效果的代码。
目的
查找工作表中的带有数据的最后一行,从而确定工作表中已使用的数据单元格区域。
程序代码
代码解析
下面对上述代码进行详细说明:
变量ws为一个Worksheet对象,代表要查找最后一行的工作表。
Rows.Count获取工作表的总行数。
ws.Cells(Rows.Count, 1)表示变量ws代表的工作表中列A最底部的单元格。对于Excel 2003,该单元格是A65536;对于Excel 2007及以上版本,该单元格是A1048576。由于使用了Rows.Count,代码对于所有Excel版本通用。
End(xlUP)表示从最底部的单元格向上到达列A中最后一个含有数据的单元格。
Row属性获取单元格所在的行的行号,并将行号值赋给函数过程名FindLastRow。
代码使用情形
在编写VBA代码时,很多情形下都需要知道数据所在的最后一行。
通常情况下,我们以列A为基准列来确定工作表中已使用的数据区域。因此,在下列情形下可以调用该段代码:
需要确定列A中最后一个数据单元格所在的行。
在数据随时增减的工作表中动态确定工作表中最后一行。
确定所需操作的单元格区域。
应用示例
FindLastRow函数过程使用起来很方便,我们可以将它放置在一个存放标准代码的公用模块中或者在类模块中,方便在其它模块中的过程对其调用。
示例1:获取列A中最后一个数据单元格所在行的行号
如下图所示的工作表,我们编写代码调用FindLastRow函数过程来获取列A中数据所在的最后一行。
代码如下:
示例2:对工作表中数据单元格区域的偶数行添加背景色
如下图所示,要求对工作表中数据区域的偶数行添加背景色。
代码如下:
说明:
代码首先调用FindLastRow过程获取当前工作表已使用的最后一行,接着遍历第1行到最后1行,并对偶数行添加背景色。
示例3:在工作表中单元格区域数据增减时偶数行添加或删除背景色
仍以上文图示工作表为例,我们希望增加数据时会自动对偶数行添加背景色,在删除数据后也会自动更新偶数行背景色。只需将示例2中的代码复制到当前工作表的SelectionChange事件中并略作修改,代码如下:
下面的视频演示了代码的效果:
示例4:在工作表中动态增加数据
如下图所示的工作表,以当前数据为基础,在其下面再增加数据,例如本工作表中原有6行数据,在第8行增加数据,然后在第10行再增加数据。
代码如下:
说明:
代码首先调用FindLastRow过程获取当前工作表已使用的最后一行,然后在其下第2行增加数据,再次调用FindLastRow过程获取添加数据后工作表中的最后一行,在其下第2行增加数据。
这段代码的思路可以用于从数据工作表中提取不同数据形成一份报表,具体示例我们将在以后详解。
示例5:在数据工作表中查找并获取数据
如下图,数据工作表为Sheet1工作表,存放着数据信息。现在,要在Sheet1工作表中查找“建筑工程”并将该行数据复制到工作表Sheet4中。
代码如下:
说明:
通常,我们需要在存储数据的工作表或者区域中查找数据并放置在指定的位置,而数据工作表的行数往往是不确定的,因此我们可以使用FindLastRow过程查找最后一行,确定要查找的单元格区域,如上述代码所示。
本例涉及到跨工作表操作,代码运行时的活动工作表为当前工作表,因此需将工作表Sheet4作为活动工作表。代码中使用工作表名称代码Sheet1来限定数据工作表。
局限
FindLastRow函数只是求出列A中含有数据的最后一行,但如果列B中含有数据的一行比列A大,那么获取的最后一行的行号就不准确了。
正如上文中所说的,通常我们以列A为基准列,即我们认为列A控制数据工作表中所使用的区域,列A中含有数据的最后一行就是工作表中使用了的最后一行,其它列中使用数据的行不会起过列A中使用数据的行。
但是,有些工作表设计时没有考虑列A为基准列。此时,如果我们知道哪列可能就是数据使用最长的那一列,那么我们可以把FindLastRow函数中的Cells(Rows.Count, 1)进行相应替换,例如,如果我们知道列B可能含有的数据最多,那么可以改为Cells(Rows.Count, 2)。
扩展
当然,针对不同情况,我们还有很多其他方法来获取工作表中最后使用的行。下面简要介绍,如果您还有其他好的方法,欢迎留言交流。
方法1:使用CountA函数
说明:
代码统计指定工作表列A中非空单元格个数,如果列A中数据区域含有空单元格,那么结果不准确。因此,使用上面的代码时,要确保列A中的数据区域没有空单元格,这样列A中数据单元格的个数等于最后一行的行号。
若要通过统计其他列来计算最后一行的行号,修改ws.Range('A:A')为相应的列号。
方法2:使用UsedRange属性
说明:
数据必须从工作表的第1行开始才能获得正确的结果。否则,只获取工作表已使用区域的行数。
如果工作表中有单元格没有数据但是设置了格式,也会进行统计。
方法3:使用SpecialCells方法
说明:
如果工作表中有单元格没有数据但是设置了格式,也会进行统计。
如果最后一行被隐藏,那么该行不会被统计在内。
只要是对工作表单元格进行了操作,都会被统计在内。
方法4:使用Find方法
说明:
无论最后一行是否被隐藏,该行都会被统计。
不会统计没有数据但设置了格式的单元格所在的行。
如果您对本文介绍的内容还有什么好的示例,欢迎发送邮件给我:xhdsxfjy@163.com
也可以在本文下方留言,提出您的看法或建议。
本文属原创文章,转载请联系我或者注明出处。
联系客服