SpecialCells(xlCellTypeVisible)select整个工作表

我很抱歉让问题不清楚。 这里是一个错误的例子, 当我使用AutoCilter的SpecialCells获取可见的单元格在VBA中改变了代码:

Sub Sample(): ActiveSheet.AutoFilterMode = False Dim rRange As Range Dim Rnge As Range Dim last_Row As Integer Set rRange = Sheets("Sheet1").Range("A1:F6") '~~> Filter, With rRange .AutoFilter Field:=1, Criteria1:="=1" End With last_Row = Workbooks("Book1").Sheets("Sheet1").Range("A1048576").End(xlUp).Row '~~> Offset(to exclude headers) Set Rnge = Range("A2:A" & last_Row).SpecialCells(xlCellTypeVisible) Debug.Print Rnge.Address Debug.Print last_Row End Sub 

样本数据:

 Number1 Number2 Number3 Number4 Number5 Number6 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 

如果我设置标准= 2,那么debug.print会给我row3。 但是,如果我设置标准= 1.它返回$ 1:$ 2,$ 7:$ 1048576 2.发生了什么?

这是在单个第一行尝试.SpecialCells(xlCellTypeVisible)的已知问题.SpecialCells(xlCellTypeVisible)last_row是2时,范围是Range("A2:A2") )。 如果你设置.SpecialCells(xlCellTypeVisible从一行过滤的数据中包含的数据范围超出了过滤的范围,如果你在过滤之前设置了last_row ,你将得到正确的结果,假设你有不止一行的数据开始用。

  last_Row = Sheets("Sheet1").Range("A" & rows.count).End(xlUp).Row Set rRange = Sheets("Sheet1").Range("A1:F" & last_Row) '~~> Filter, With rRange .AutoFilter Field:=1, Criteria1:="=1" End With 

我更喜欢严格地在要过滤的范围内工作,并使用工作表函数.Subtotal来确定是否有任何单元格要处理。

 Sub Sample2() ActiveSheet.AutoFilterMode = False With Sheets("Sheet1").Cells(1, 1).CurrentRegion .AutoFilter .AutoFilter Field:=1, Criteria1:="=1" With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) If Application.Subtotal(103, .Columns(1)) Then Debug.Print .Columns(1).SpecialCells(xlCellTypeVisible).Address(0, 0) Debug.Print .SpecialCells(xlCellTypeVisible).Rows.Count Else Debug.Print "no cells were found" End If End With End With End Sub 

.CurrentRegion返回包含A1的date块或岛,直到遇到完全空白的行或列。 这与selectA1并点击Ctrl + A相同 。 严格限制在CurrentRegion的范围内(记住要在抵消时resize),可以避免可能溢出到工作表其余部分的范围引用,其中可见行将成为工作表单元格的其余部分。

有一个KB的白皮书,但遗憾的是我找不到它。