如果我使用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
答案 0 :(得分:0)
这可能不是一个答案,但由于我不能在这里发表评论:
从Excel计算或运行过滤器并查看本地窗口时,在'IsRed ='行上有一个断点,大多数表达式都已定义,包括从CurrentArray到FormatConditions的所有表达式。
运行宏时,假设自动计算,在设置函数时会达到断点三次。第一次通过时,CurrentArray,DirectPrecedents,Precedents未定义,当它们在常规函数调用中时。第二次,没有定义DisplayFormat。三,DisplayFormat。编辑:这些按预期返回FALSE,但Range参考不同。
下一次应用高级过滤器时“无法获取xxxx”似乎是主要的值,但a4确实来自Formula和FormulaLocal。 1004错误。
我的观点:当计算作为宏运行的一部分发生时,IsRed函数和范围引用似乎表现不同。希望这为进一步调查提供了一些动力。