Vba 为什么IfError返回错误?
我试图创建一个自定义函数,然后将其作为外接程序加载,从而为INDEX/MATCH lookup方法(比常规的VLOOKUP方法更快/更好)创建一个包装器 到目前为止还不错,但我希望的行为是,当找不到要查找的值时,它应该返回空白(“”),而不是#value!。因此,我尝试使用IfError WorksheetFunction来实现这一点,就像在Excel工作表上一样:Vba 为什么IfError返回错误?,vba,excel,Vba,Excel,我试图创建一个自定义函数,然后将其作为外接程序加载,从而为INDEX/MATCH lookup方法(比常规的VLOOKUP方法更快/更好)创建一个包装器 到目前为止还不错,但我希望的行为是,当找不到要查找的值时,它应该返回空白(“”),而不是#value!。因此,我尝试使用IfError WorksheetFunction来实现这一点,就像在Excel工作表上一样: Function FastLookup(parLookupKey As Variant, parLookupRange As Ra
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,如果它抛出错误,就跳过它。然后测试那个错误。不,我没有看到那个评论,我看到/看到的唯一帖子是你的。非常感谢您的帮助和反馈!