这是另一个奇怪的地方。
我有这段代码,它使用过滤器从一张工作表中获取数据,并使用Range.SpecialCells()
方法查找要复制和粘贴的适当行。但是,如果使用Rows().SpecialCells()
或使用SpecialCells
返回的范围的row属性,则行数是错误的。这就是我的意思:
With Worksheets("ret-" & sNumRet)
.EnableAutoFilter = True
.AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
iLast = Range("C1").End(xlDown).Row
numRows = .Range("B2:B" & iLast).SpecialCells(xlCellTypeVisible).Cells.Count
End With
此代码产生约8k行,这是一个有意义的数字。
With Worksheets("ret-" & sNumRet)
.EnableAutoFilter = True
.AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
iLast = Range("C1").End(xlDown).Row
numRows = .Rows("2:" & iLast).SpecialCells(xlCellTypeVisible).Rows.Count
End With
结果是4。
With Worksheets("ret-" & sNumRet)
.EnableAutoFilter = True
.AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
iLast = Range("C1").End(xlDown).Row
numRows = .Range("B2:B" & iLast).SpecialCells(xlCellTypeVisible).Rows.Count
End With
结果也产生4。两者当然都是错误的。我有45,000行数据,并且可以看到使用过滤器至少显示了几千行。这些陈述之间我缺少一些含义上的区别吗?我希望它们在本文中几乎是等效的。
谢谢 !
最佳答案
这实际上与SpecialCells
无关,而是Excel如何计算行数。 Rows.Count
返回计数范围内每个连续Area
的计数。例如,在立即窗口中:
? range("a2:a3,a5:a7").cells.Count
返回5
? range("2:3,5:7").rows.Count
返回2
? range("2:3,5:7").areas(1).rows.Count
返回2
? range("2:3,5:7").areas(2).rows.Count
返回3
如您所见,如果您未指定区域,则会返回第一个区域。
要获得所有区域的答案,请遍历它们:
Sub CountRows()
Dim i As Long
Dim RowTotal As Long
With ActiveSheet.Range("2:3,5:7")
For i = 1 To .Areas.Count
RowTotal = RowTotal + .Areas(i).Rows.Count
Next i
End With
Debug.Print RowTotal
End Sub