我很抱歉让问题不清楚。以下是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.发生了什么?
答案 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白皮书,但遗憾的是我无法找到它。