【问题标题】:Handle "No cells were found" error when filtered range is empty过滤范围为空时处理“未找到单元格”错误
【发布时间】:2015-10-21 12:26:11
【问题描述】:

我对一个范围进行一些过滤,并复制过滤后的范围

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

但我在Set rngFiltered 行中也收到错误“未找到单元格”。

我没有标题行,因为过滤器非常复杂,以至于我在没有使用.Sort 函数的情况下对其进行了编程

【问题讨论】:

  • 如果您进行过滤,应该始终有一行可见 - 标题行。您可以使用它来测试是否有不止一行可见 - 然后在复制之前将大小调整为少 1 行并偏移 1。
  • 嗨!不幸的是,我没有标题行,因为过滤器非常复杂,以至于我在没有使用 .Sort 函数的情况下对其进行了编程。
  • 那么它不是过滤器,它是手动隐藏行的负载。过滤器总是需要一个标题行。在这种情况下,您的代码应该能够确定它未隐藏的行数。 On Error 有什么问题?
  • 如何确定有多少行未隐藏?如果 rngStart.Rows.SpecialCells(xlCellTypeVisible).Count = 0 仍然给我上面提到的错误。我试图避免 On Error,因为我不想在代码中跳来跳去,只需要一个值来检查。胸围我刚刚写了一个函数来为我执行此操作,但出现错误。
  • 使用On Error Resume Next,将可见单元格分配给Range变量,然后On Error Goto 0,然后测试范围是否为Nothing。由于您尚未发布隐藏行的代码,因此很难提出其他方法。

标签: excel vba


【解决方案1】:
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
'...
'...

【讨论】:

  • 如果您之前使用过rngFiltered,请务必在此之前也Set rngFiltered = Nothing
  • @AlexM - 好点 - 在上面做了一些编辑以将其折叠起来
【解决方案2】:

我将解决方案存储到一个函数中。在这里,我在机制上使用了一个错误。

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

【讨论】:

  • 我知道已经过去一年了,但您的解决方案让我笑了。 +1 创意
【解决方案3】:

我所做的是计算过滤后的行数:

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

您可以根据需要更改列数

【讨论】:

    【解决方案4】:

    遇到了同样的问题,但是为了过滤命名表,这样解决了*:

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

    *我知道这个问题是从 2015 年开始的,但我在 2019 年在这里结束了谷歌搜索类似的问题,所以我将留下我的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2019-08-09
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2021-06-02
      相关资源
      最近更新 更多