2012-11-15 63 views
3

这是另一个奇怪的。Range.SpecialCells不同的结果

我有这个代码,它使用过滤器从一张表中获取数据,并使用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行数据,我可以看到使用过滤器显示了至少几千个数据。这些陈述之间有什么意义上的差异?我希望他们在这里的背景下几乎是相同的。

谢谢!

回答

6

这实际上并不是真的与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 
+1

...好知道:) –