如何使用 WorksheetFunction.VLookup 错误处理 1004 错误?

Posted

技术标签:

【中文标题】如何使用 WorksheetFunction.VLookup 错误处理 1004 错误?【英文标题】:How to error handle 1004 Error with WorksheetFunction.VLookup? 【发布时间】: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 属性

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

【问题讨论】:

【参考方案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】:

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

    lookup_value (arg1) 不在 table_array (arg2) 中

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

    arg1 和 arg2 的格式解释不正确

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

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

【讨论】:

以上是关于如何使用 WorksheetFunction.VLookup 错误处理 1004 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?