【问题标题】:How to error handle 1004 Error with WorksheetFunction.VLookup?如何使用 WorksheetFunction.VLookup 错误处理 1004 错误?
【发布时间】:2013-08-06 10:59:59
【问题描述】:

我有这个代码:

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 属性

找到结果后,它工作正常。这里有什么处理错误的好方法?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您可以使用Application.Vlookup,而不是WorksheetFunction.Vlookup。如果将Variant 设置为等于此值,则如果未找到匹配项,则会返回错误 2042。然后,您可以使用 IsError 测试变体 - 在这种情况下为 cellNum

    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
    

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

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

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

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

    【讨论】:

    • +1 比公认的要好得多,(顺便说一句,Err.Number <> 0 时需要Err.Clear)。
    • 当我输入Application. 时,Vlookup 不显示。有什么帮助吗?
    • @krobel,尝试使用它,即使它不会自动填充。我不记得这是否可行,但值得一试。
    • @DougGlancy 试过了,但没用。不会编译。
    • @DougGlancy 它确实存在。不知道为什么它也不起作用......无论如何,我使用了On Error Resume Next 方法。谢谢你的关注。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 如果 VLookup 函数在 for 循环中,您可以通过以下方式清除每个循环的错误:err.Clear
    【解决方案3】:

    根据我有限的经验,这主要有两个原因:

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

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

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

    如果您的lookup_value 是一个变量,您可以用TRIM() 将其括起来

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

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2015-12-06
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多