在 UDF 中使用 VBA 代码搜索时是否可以使用 FindPrevious?

Is it possible to use FindPrevious when searching with VBA code in a UDF?

我正在尝试将 VBA 用于 UDF 以根据 "Find" 函数处理其结果,因为它比轮询每个单元格以查找结果要快得多。

我已经将其切回到重现错误的基础,但我仍然在这部分遇到 "Object variable or With block variable not set" 错误 SearchRange.FindPrevious.Address(您必须停止该行并将其步进收到错误,UDF 只是退出而不在调试模式之外返回错误)

这是关键,当我尝试在 sheet 中使用 UDF 时出现错误:=testfind("3206-1",E:E) 但是当我在 VBE 中直接 window 使用它时像这样:?testfind("3206-1",Range("E:E")) 我得到 $E295 的正确结果,没有错误。

代码是:

Function TestFind(FindString As String, SearchRange As Range)
Dim ActiveAddress As Range
Set ActiveAddress = SearchRange.Find(FindString)
TestFind = SearchRange.FindPrevious.Address
End Function

修改了 L42 的更改,现在可以使用了:

Function TestFind(FindString As String, SearchRange As Range)
Dim ActiveAddress As Range
Set ActiveAddress = SearchRange.Find(FindString)
TestFind = SearchRange.Find(FindString, , , , , xlPrevious).Address
End Function

编辑 1:

这个代码

TestFind = SearchRange.FindPrevious.Address

并且如前所述:

TestFind = SearchRange.FindPrevious(ActiveAddress).Address

当您像 Dan 所经历的那样将它用作工作表函数时,它不起作用。
下面没有直接回答问题,只是一个替代方案。

备选方案: 更改 Find 方法中的 SearchDirection 参数。

Function TestFind2(FindString As String, SearchRange As Range)
    Dim ActiveAddress As Range
    Set ActiveAddress = SearchRange.Find(FindString, , , , , xlPrevious)
    TestFind2 = ActiveAddress.Address
End Function

注意:您需要添加错误处理程序来捕获未找到匹配项的搜索。

如何测试:

Sub marine()
    Debug.Print TestFind(4, [A:A])
End Sub