【发布时间】: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