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 白皮书,但遗憾的是我找不到它。
很抱歉让问题不清楚。这是来自 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 白皮书,但遗憾的是我找不到它。