Range.SpecialCells具有不同的结果

这是另一个奇怪的。

我有这样的代码,它使用filter从一张表中获取数据,并使用Range.SpecialCells()方法来查找要复制和粘贴的相应行。 但是,如果我使用了Rows().SpecialCells()或者如果我使用了由SpecialCells返回的范围的行属性,那么行数是错误的。 这是我的意思:

 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。 这两个当然是错的。 我有45k行的数据,我可以看到至less有几千个使用filter显示。 这些陈述之间有什么意义上的差异? 在这里,我希望他们几乎是相同的。

谢谢 !

这并不是真的与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