如何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变种 – cellNum
– IsError
:
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
VLOOKUP
和MATCH
function的Application
版本允许您testing错误而不会引起错误。 如果您使用WorksheetFunction
版本,则需要进行复杂的error handling,将代码重新路由到error handling程序,返回到下一个语句进行评估等。使用Application
function,可以避免混乱。
使用IIF
function可以进一步简化上述过程。 这个方法并不总是合适的(例如,如果你必须根据If/Then
做更多/不同的过程),但在这种情况下,你只是试图确定在MsgBox中显示什么提示,它应该工作:
cellNum = Application.VLookup(currName, rngLook, 13, False) MsgBox IIF(IsError(cellNum),"no match", cellNum)
考虑这些方法而不是 On Error ...
语句。 它们都比较容易阅读和维护 – 与试图遵循一堆GoTo
和Resume
语句相比,有一些东西比较容易混淆。
从我有限的经验来看,这有两个主要原因:
- table_array (arg2)中不存在lookup_value (arg1)
这里的简单解决scheme是使用以Resume Next
结尾的error handling程序
- arg1和arg2的格式不正确解释
如果你的lookup_value
是一个variables,你可以用TRIM()
cellNum = wsFunc.VLookup( TRIM (currName),rngLook,13,False)