当筛选范围为空时,处理“未找到单元格”错误

6

我对一个范围进行了筛选,并复制了那个筛选后的范围。

myRange.SpecialCells(xlCellTypeVisible).Copy

当筛选器过滤所有案例后,我收到以下错误:

错误1004:没有找到单元格。

我正在寻找一种方法(无需使用On Error)来检查筛选范围是否为空。

我已经尝试使用lastRow = .Cells(.Rows.Count, ColumnName).End(xlUp).Row创建一个范围并检查if lastRow > 0,但是这种方式也会计算被筛选(或隐藏)的行内容。

我还尝试过:

Sub test()
    Dim rngStart As Range
    Dim rngFiltered As Range

    Set rngStart = Sheets(1).Range("A1:A6")
    Set rngFiltered = rngStart.SpecialCells(xlCellTypeVisible).Select

    If rngFiltered.Rows.Count = 0 Then
        MsgBox ("No Cases")
    Else
        MsgBox ("Found Cases")
    End If
End Sub

但是在这里我得到了错误信息"No cells found",出现在Set rngFiltered行。

由于筛选器非常复杂,因此我没有使用.Sort函数,也没有标题行。


如果你正在进行筛选,应该始终有一行可见 - 表头行。你可以利用这个来测试是否有多于一行可见 - 然后调整大小为少1行,并在复制之前偏移1行。 - Rory
你好!很遗憾,由于筛选器非常复杂,我没有使用 .Sort 函数编程,因此没有标题行。 - ruedi
那么它就不是一个过滤器,而是一堆手动隐藏的行。过滤器总是需要一个标题行。在这种情况下,您的代码应该能够确定它留下了多少未隐藏的行。On Error有什么问题吗? - Rory
我该如何确定有多少行未被隐藏?如果rngStart.Rows.SpecialCells(xlCellTypeVisible).Count = 0仍然给我上述错误。我试图避免使用On Error,因为我不想在代码中跳来跳去,只需要一个值来检查。但我刚刚编写了一个带有错误的函数来为我执行此操作。 - ruedi
1
使用 On Error Resume Next,将可见单元格分配给 Range 变量,然后 On Error Goto 0 并测试范围是否为 Nothing。由于您没有发布隐藏行的代码,因此很难建议其他方法。 - Rory
4个回答

14
Dim rngStart As Range
Dim rngFiltered As Range

'...
'...
Set rngFiltered = Nothing '<<< reset rngFiltered if running this code in a loop...
On Error Resume Next
Set rngFiltered = rngStart.SpecialCells(xlCellTypeVisible)
On Error Goto 0

If not rngFiltered is Nothing then
    rngFiltered.Copy
End If
'...
'...

1
在执行此操作之前,请确保也将 Set rngFiltered = Nothing,如果您之前使用了 rngFiltered - AlexM
1
@AlexM - 很好的观点 - 我对上面进行了几次编辑,将其合并在一起。 - Tim Williams

7

我把解决方案存储在一个函数中。这里我使用了一个错误的机制。

Function errorCatchEmptyFilter(ByRef rngstart As Range) As Boolean

errorCatchEmptyFilter = False

'here I get an error if there are no cells
    On Error GoTo hell
    Set rngFiltered = rngstart.SpecialCells(xlCellTypeVisible)

Exit function

hell:
errorCatchEmptyFilter = True

End Function

我知道已经过去一年了,但是你的解决方案让我感到非常开心。为你的创意点赞! - al1en

2
我所做的是计算过滤行的数量:
Sheets("Sheet1").Range("A2:Z2").AutoFilter
Sheets("Sheet1").Range("A2:Z2").AutoFilter Field:=1, Criteria1:=filter1
If Sheets("Sheet1").AutoFilter.Range.Columns(4).SpecialCells(xlCellTypeVisible).Count > 1 Then

您可以更改列数以满足您的需要


0

遇到了同样的问题,但是针对命名表格进行筛选,我是这样解决的:

  1. 不是应用多个筛选器,而是在表格末尾添加了一列,其中包含一个公式,该公式将返回要筛选的行为true,筛选掉的行为false。
  2. 然后,我为该true值应用了一个筛选器,并添加了一个单元格,该单元格将计算该列中所有true值的数量
  3. 在vba中,首先重新应用表格的筛选器,然后如果该计数器大于0,则执行.SpecialCells(xlCellTypeVisible).Copy,否则跳过下一步(我在循环中执行此操作)

*我知道这个问题来自2015年,但我在2019年通过搜索类似的问题来到这里,所以我留下了我的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接