我正在尝试通过创建自定义函数并在之后将其作为加载项加载来为INDEX / MATCH查找方法(比常规VLOOKUP方法更快/更好)创建包装器。
到目前为止一切顺利,但我希望的行为是,当找不到要查找的值时,它应该返回空白(“”)而不是#VALUE!。所以我试图使用IfError WorksheetFunction来实现这一点,就像我在Excel工作表上一样:
Function FastLookup(parLookupKey As Variant, parLookupRange As Range, parReturnRange As Range) As Variant
FastLookup = Application.WorksheetFunction.IfError(Application.WorksheetFunction.Index(parReturnRange, Application.WorksheetFunction.Match(parLookupKey, parLookupRange, 0)), "")
End Function
同样,这仍然会返回#VALUE!如果在parLookupRange范围内找不到值。
毋庸置疑,如果我直接在Excel工作表上使用= IFERROR(FastLookup(H6,E3:E6,F3:F6),“”),它就能正常工作。
有关如何使IfError的VBA版本工作的任何想法?
答案 0 :(得分:3)
因为错误永远不会超过vba中的MATCH函数。一旦抛出错误,代码就会停止。
请改用:
Function FastLookup(parLookupKey As Variant, parLookupRange As Range, parReturnRange As Range) As Variant
Dim t As Long
On Error Resume Next
t = Application.WorksheetFunction.Match(parLookupKey, parLookupRange, 0)
On Error GoTo 0
If t > 0 Then
FastLookup = parReturnRange(t)
Else
FastLookup = ""
End If
End Function
我们现在捕获错误并忽略它。然后我们测试它并返回正确的值。