SpecialCells(xlCellTypeVisible)选择整个工作表

时间:2015-01-10 00:54:44

标签: excel excel-vba vba

我很抱歉让问题不清楚。以下是Error when I use SpecialCells of AutoFilter to get visible cells in 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.发生了什么?

1 个答案:

答案 0 :(得分:3)

这是在单个第一行上尝试.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的日期块或岛,直到它遇到完全空白的行或列。这与选择A1并点击 Ctrl + A 相同。通过严格地在CurrentRegion的范围内工作(记得在偏移时调整大小),可以避免范围引用可能溢出到工作表的其余部分,其中可见行将是工作表单元格的其余部分。

有关于此的KB白皮书,但遗憾的是我无法找到它。