【问题标题】:UDF as criteria for advanced filter within macro errorUDF 作为宏错误内高级过滤器的标准
【发布时间】:2018-02-20 07:59:23
【问题描述】:

如果我使用 UDF 生成高级筛选器的条件,并使用 VBA 运行高级筛选器,则会在 UDF 中生成 1004 错误。

如果从 Excel 调用高级筛选器,则筛选器按预期运行。

为什么不一样?

(是的,我知道还有其他方法可以使用。我试图了解使用此 UDF 作为标准时从 Excel 调用高级筛选器与 VBA 之间的区别)。

如果行中的任何项目具有红色字体 (RGB 255,0,0),我正在过滤以返回整行。 UDF 在下面的代码中。

在下面的截图中,标准公式是:

A2: =IsRed(A8)
B3: =IsRed(B8)
C4: =IsRed(C8)

屏幕截图显示从 Excel 调用高级过滤器时按设计运行

但是当运行下面的代码时,在将列标题复制到E1:G1 后,代码会在UDF 内 停止并显示上述错误消息。当时R.Address=A8

当我从 Excel 执行高级过滤器时,我还尝试记录代码,然后执行记录的代码而不是下面的代码。这导致了同样的错误。


Option Explicit
Sub marine()
    Dim rTable As Range
    Dim rCriteria As Range
    Dim rDestination As Range

Set rTable = Range("a7").CurrentRegion
Set rCriteria = Range("a1:c4")
Set rDestination = Range("E1")

rDestination.Resize(columnsize:=3).EntireColumn.Clear

With rCriteria
    .Rows(1).ClearContents
    .Cells(2, 1).Formula = "=IsRed(A8)"
    .Cells(3, 2).Formula = "=IsRed(B8)"
    .Cells(4, 3).Formula = "=IsRed(C8)"
End With

    rTable.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
        rCriteria, CopyToRange:=rDestination, Unique:=False
End Sub

Function IsRed(R As Range) As Boolean

'Runtime error '1004' on next line when above macro is run
    IsRed = (R.Font.Color = RGB(255, 0, 0))
End Function

【问题讨论】:

  • 对我来说看起来像一个错误 - 高级过滤器方法需要反复将不同的范围传递给 UDF,并且可能在使用从 VBA 调用时无法正常工作的快捷方式
  • @CharlesWilliams 感谢您的想法。我希望对 UDF 进行一些小的调整可以纠正这个问题。我唯一没有成功的尝试是让函数返回一个变体而不是布尔值。

标签: excel vba user-defined-functions advanced-filter


【解决方案1】:

这可能不能作为答案,但由于我无法在这里发表评论:

当从 Excel 计算或运行过滤器并查看局部窗口时,在“IsRed =”行上有一个断点,大多数表达式都已定义,包括从 CurrentArray 到 FormatConditions 的所有表达式。

运行宏时,在设置函数时会到达断点 3 次,假设自动计算。第一次通过时,CurrentArray、DirectPrecedents、Precedents 没有定义,当它们在常规函数调用中时。第二次,未定义 DisplayFormat。第三,显示格式。编辑:这些按预期返回 FALSE,但范围参考不同。

下次应用高级过滤器时,“无法获取 xxxx”似乎是主要值,但 a4 确实以公式和公式本地的形式出现。 1004 错误。

我的观点:当计算作为宏运行的一部分发生时,IsRed 函数和 Range 引用的行为似乎不同。希望这能为进一步的调查提供一些动力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多