如何error handling与WorksheetFunction.VLookup 1004错误?

我有这个代码:

Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction Dim ws As Worksheet: Set ws = Sheets("2012") Dim rngLook As Range: Set rngLook = ws.Range("A:M") 'within a loop currName = "Example" cellNum = wsFunc.VLookup(currName, rngLook, 13, False) 

VLookup预计不会总是find结果; 但是当它没有find一个结果的行错误之前,我甚至可以错误检查下一行。

错误:

运行时错误“1004”:无法获取WorksheetFunction类的VLookup属性

当find结果时它工作正常。 这里处理错误的好方法是什么?

有一种方法可以跳过代码中的错误,然后继续循环,希望它有助于:

 Sub new1() Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction Dim ws As Worksheet: Set ws = Sheets(1) Dim rngLook As Range: Set rngLook = ws.Range("A:M") currName = "Example" On Error Resume Next ''if error, the code will go on anyway cellNum = wsFunc.VLookup(currName, rngLook, 13, 0) If Err.Number <> 0 Then ''error appeared MsgBox "currName not found" ''optional, no need to do anything End If On Error GoTo 0 ''no error, coming back to default conditions End Sub 

而不是WorksheetFunction.Vlookup ,您可以使用Application.Vlookup 。 如果你设置一个Variant等于这个,它将返回错误2042,如果没有find匹配。 然后你可以在这种情况下testing变种 – cellNumIsError

 Sub test() Dim ws As Worksheet: Set ws = Sheets("2012") Dim rngLook As Range: Set rngLook = ws.Range("A:M") Dim currName As String Dim cellNum As Variant 'within a loop currName = "Example" cellNum = Application.VLookup(currName, rngLook, 13, False) If IsError(cellNum) Then MsgBox "no match" Else MsgBox cellNum End If End Sub 

VLOOKUPMATCHfunction的Application版本允许您testing错误而不会引起错误。 如果您使用WorksheetFunction版本,则需要进行复杂的error handling,将代码重新路由到error handling程序,返回到下一个语句进行评估等。使用Applicationfunction,可以避免混乱。

使用IIFfunction可以进一步简化上述过程。 这个方法并不总是合适的(例如,如果你必须根据If/Then做更多/不同的过程),但在这种情况下,你只是试图确定在MsgBox中显示什么提示,它应该工作:

 cellNum = Application.VLookup(currName, rngLook, 13, False) MsgBox IIF(IsError(cellNum),"no match", cellNum) 

考虑这些方法而不是 On Error ...语句。 它们都比较容易阅读和维护 – 与试图遵循一堆GoToResume语句相比,有一些东西比较容易混淆。

从我有限的经验来看,这有两个主要原因:

  1. table_array (arg2)中不存在lookup_value (arg1)

这里的简单解决scheme是使用以Resume Next结尾的error handling程序

  1. arg1和arg2的格式不正确解释

如果你的lookup_value是一个variables,你可以用TRIM()

cellNum = wsFunc.VLookup( TRIM (currName),rngLook,13,False)