为什么IfError返回错误?

时间:2017-02-14 20:40:16

标签: excel vba excel-vba

我正在尝试通过创建自定义函数并在之后将其作为加载项加载来为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版本工作的任何想法?

1 个答案:

答案 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

我们现在捕获错误并忽略它。然后我们测试它并返回正确的值。