在 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
我正在尝试将 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