16

我有这个代码:

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 并不总能找到结果;但是当它没有找到结果时,在我什至可以错误检查下一行之前,该行就出错了。

错误:

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

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

4

3 回答 3

58

而不是WorksheetFunction.Vlookup,您可以使用Application.Vlookup. 如果将 a 设置为Variant等于此值,则如果未找到匹配项,则会返回错误 2042。然后,您可以测试变体 -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

和函数的Application版本允许您在不引发错误的情况下测试错误。如果您使用该版本,则需要复杂的错误处理,将您的代码重新路由到错误处理程序,返回到下一个语句进行评估等。使用这些函数,您可以避免这种混乱。VLOOKUPMATCHWorksheetFunctionApplication

IIF使用该功能可以进一步简化上述内容。If/Then此方法并不总是合适的(例如,如果您必须基于

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

考虑那些方法而不是 On Error ...语句。它们都更易于阅读和维护——没有什么比尝试遵循一堆GoToandResume语句更令人困惑的了。

于 2013-08-05T17:30:25.200 回答
8

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

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
于 2013-08-05T16:58:13.637 回答
2

根据我有限的经验,发生这种情况的主要原因有两个:

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

这里的简单解决方案是使用以结尾的错误处理程序Resume Next

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

如果你lookup_value是一个变量,你可以用TRIM()

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

于 2015-09-06T10:15:23.443 回答