本人一直在自学VBA,最近因为工作需要,设计了一份模板。其中有一小段的功能是实现某列数据的查重,并把重复数据所在行的整行删除,并保持此行下方所有行向上移动一行。实现这个功能的代码很简单,也很好理解。只是在测试的过程中发现了一个小小的问题,是关于Row和Rows这两个对象的。
我们知道Row和Rows都是指代Excel中“行”这个对象,不同的是Row是指代某行、单个的行,而Rows呢?则是指代行的集合。这就像Worksheet和Worksheets一样,VBA中像这样的对象有很多。
而上面阐述的问题呢,就是和Row和Rows相关的。我先贴出实现上面功能的小段代码:
Sub test()
Dim a, b As Integer
a = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For b = a To 3 Step -1
If Application.WorksheetFunction.CountIf(Range("A3:A" & b), Range("A" & b)) > 1 Then
Rows(b).Delete shift:=xlUp
End If
Next b
End Sub
我刚开始时,a = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row这里写的是a = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Rows.count。然后测试后发现a=1,我有想了下,才发现是Rows.count的问题。
Range(“A2”).Row或者cells(2,1).Row指的是某个单元格在第几行;而Rows.Count更多的是运用在某个区域中有多少行,比如:Range(“A1:A10”).Rows.Count,这里就是计算该区域行数为10。
这就是Rows和Row在运用中的区别之一了,也是我代码出现问题的核心原因了。所以大家在学习VBA中或者写VBA代码时需要特别关注哟,小小的细节常常决定了事物的发展和走向。
以上,2018年12月9日星期日。