3

这是另一个奇怪的问题。

我有这段代码,它使用过滤器从一张表中获取数据,并使用该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 行数据,我可以看到使用过滤器至少显示了几千行。这些陈述之间是否存在一些我缺少的含义?我希望它们在这里的上下文中几乎是等价的。

谢谢 !

4

1 回答 1

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
于 2012-11-15T15:59:05.010 回答