UDF作为宏错误中高级过滤器的条件

时间:2017-09-12 01:25:43

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

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

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

为什么会有差异?

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

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

在下面的屏幕截图中,标准公式为:

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

屏幕截图显示了从Excel调用时高级过滤器的设计功能

enter image description here

但是,当运行以下代码时,将列标题复制到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

1 个答案:

答案 0 :(得分:0)

这可能不是一个答案,但由于我不能在这里发表评论:

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

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

下一次应用高级过滤器时“无法获取xxxx”似乎是主要的值,但a4确实来自Formula和FormulaLocal。 1004错误。

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