Vba 为什么IfError返回错误?

Vba 为什么IfError返回错误?,vba,excel,Vba,Excel,我试图创建一个自定义函数,然后将其作为外接程序加载,从而为INDEX/MATCH lookup方法(比常规的VLOOKUP方法更快/更好)创建一个包装器 到目前为止还不错,但我希望的行为是,当找不到要查找的值时,它应该返回空白(“”),而不是#value!。因此,我尝试使用IfError WorksheetFunction来实现这一点,就像在Excel工作表上一样: Function FastLookup(parLookupKey As Variant, parLookupRange As Ra

我试图创建一个自定义函数,然后将其作为外接程序加载,从而为INDEX/MATCH lookup方法(比常规的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
同样,这仍然返回#值!如果在PalookupRange范围内找不到值

不用说,如果我直接在Excel工作表上使用=IFERROR(FastLookup(H6,E3:E6,F3:F6),“”),它就会工作


关于如何使IfError的VBA版本工作,有什么想法吗?

,因为错误永远不会超过VBA中的匹配函数。一旦抛出错误,代码就会停止

改用这个:

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

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

因为错误永远不会通过vba中的匹配函数。一旦抛出错误,代码就会停止

改用这个:

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

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

Application.WorksheetFunction.Match
如果没有找到匹配项,则会导致VBA运行时错误-您无法使用
IfError
捕获该类型的错误,而是需要使用VBA错误处理,如@scott craner的回答所示。
Application.WorksheetFunction.Match
如果未找到匹配项,则会导致VBA运行时错误-您不能使用
IfError
捕获该类型的错误,而是需要使用VBA错误处理,如@scott craner的回答所示。这非常有效,我理解它以前失败的原因。谢谢但是为什么嵌套的IfError不起作用呢?(即,将内部匹配函数包装在一个IfError函数中,然后将外部索引函数包装在另一个IfError函数中)?您是否看到@TimWilliams注释。工作表函数IFERROR将不会捕获错误。vba抛出错误,一旦发现错误并退出函数而不测试公式中的下一步,它就会停止查看公式的其余部分。因此,我们需要隔离这一部分,并告诉vba,如果它抛出错误,就跳过它。然后测试那个错误。不,我没有看到那个评论,我看到/看到的唯一帖子是你的。非常感谢您的帮助和反馈!这很有效,我理解为什么以前失败了。谢谢但是为什么嵌套的IfError不起作用呢?(即,将内部匹配函数包装在一个IfError函数中,然后将外部索引函数包装在另一个IfError函数中)?您是否看到@TimWilliams注释。工作表函数IFERROR将不会捕获错误。vba抛出错误,一旦发现错误并退出函数而不测试公式中的下一步,它就会停止查看公式的其余部分。因此,我们需要隔离这一部分,并告诉vba,如果它抛出错误,就跳过它。然后测试那个错误。不,我没有看到那个评论,我看到/看到的唯一帖子是你的。非常感谢您的帮助和反馈!