SpecialCells(xlCellTypeVisible) 选择整个工作表

SpecialCells(xlCellTypeVisible) choose the whole worksheet

很抱歉让问题不清楚。这是来自 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 将给我第 3 行。但是,如果我设置条件 = 1。它 returns $1:$2,$7:$1048576 2. 发生了什么?

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

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