2017-02-14 110 views
0

我试图通过创建一个自定义函数并将其作为加载项加载后,为INDEX/MATCH查找方法(比常规VLOOKUP方法更快/更好)创建一个包装。为什么IfError返回错误?

到目前为止这么好,但我期望的行为是,当没有找到要查找的值时,它应该返回空白(“”)而不是#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),“”),它就可以工作。

关于如何使VBA版本的IfError工作的任何想法?

+2

'Application.WorksheetFunction.Match'会导致* VBA运行时错误*如果找不到匹配项 - 您无法使用IfError捕获该类型的错误,而是需要使用@scott craner's中显示的VBA错误处理回答。 –

回答

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 

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

+0

这很好,我明白为什么它失败之前。谢谢。但为什么不嵌套IfError的工作? (即,将内部匹配函数包装在IfError函数中,然后用另一个IfError函数包装外部索引函数)? – biyectivo

+0

您是否看到@TimWilliams发表评论。工作表函数IFERROR不会捕获错误。错误是由vba引发的,一旦发现错误并停止查看公式的其余部分,并退出该函数而不测试公式中的下一步。所以我们需要隔离一个部分,并告诉vba如果抛出错误就跳过它。然后测试那个错误。 –

+0

不,我没有看到那个评论,我看到/看到的唯一的帖子是你的。非常感谢您的帮助和反馈! – biyectivo

相关问题