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

在UDF中使用VBA代码进行搜索时,是否可以使用FindPrevious?,vba,excel,user-defined-functions,udf,Vba,Excel,User Defined Functions,Udf,我正在尝试使用VBA对UDF进行操作,使其结果基于“Find”函数,因为它比轮询每个单元格查找结果快得多 我已经把它缩减到基本的部分来重现错误,但我仍然在这一部分上得到“Object variable or With block variable not set”(对象变量或块变量未设置)错误SearchRange.FindPrevious.Address(您必须在该行上放置一个停止符并逐步执行以获得错误,UDF只是退出,而不会在调试模式之外返回错误) 更重要的是,当我尝试在这样的工作表中使用U

我正在尝试使用VBA对UDF进行操作,使其结果基于“Find”函数,因为它比轮询每个单元格查找结果快得多

我已经把它缩减到基本的部分来重现错误,但我仍然在这一部分上得到“Object variable or With block variable not set”(对象变量或块变量未设置)错误
SearchRange.FindPrevious.Address
(您必须在该行上放置一个停止符并逐步执行以获得错误,UDF只是退出,而不会在调试模式之外返回错误)

更重要的是,当我尝试在这样的工作表中使用UDF时,会出现错误:
=testfind(“3206-1”,E:E)
但是当我在VBE的即时窗口中使用它时,比如:
?testfind(“3206-1”,Range(“E:E”)
我得到了
$E$15295
的正确结果

代码是:

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

Edit1:

此代码

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

…从原始公式调用时,您是否需要将
E:E
放在引号中?请注意,您的即时窗口查询有
“E:E”
,但您发布的示例没有。@Dan该函数还可以。只有在范围内未找到
FindString
时,才会出现错误。因此,请使用
错误处理程序
。也可以从
子对象调用
函数
。谢谢,但不需要,它需要一个范围,调试窗口一使用双引号,因为这就是在VBA中指定范围的方式。@harun24hr,谢谢,但为什么它在工作表一中不起作用,而在VBA一中起作用?VBA使用函数返回的数据必须存在。最后一条注释是,为什么要设置所有这些逗号,而不是只设置
TestFind=SearchRange.Find(FindString,Searchorder:=xlPrevious)。Address
?同样的错误。在即时窗口中调用时,任何语法错误都会阻止它工作。@DanDonoghue真的吗?刚刚测试过,它在我这边工作。当“FindString”不存在时,它仍然会返回错误。因此,使用“错误恢复下一步”
跳过错误。没有戏剧,只是为了显示错误而缩小了比例,我的最终功能中有错误检查。再次感谢