如何使用 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
VLOOKUP
和 MATCH
函数的 Application
版本允许您在不引发错误的情况下测试错误。如果您使用WorksheetFunction
版本,您需要复杂的错误处理,将您的代码重新路由到错误处理程序,返回到下一条语句进行评估等。使用Application
函数,您可以避免这种混乱。
使用IIF
函数可以进一步简化上述内容。这种方法并不总是合适的(例如,如果您必须根据If/Then
执行更多/不同的过程),但在这种情况下,您只是想确定在 MsgBox 中显示什么提示,它应该可以工作:
cellNum = Application.VLookup(currName, rngLook, 13, False)
MsgBox IIF(IsError(cellNum),"no match", cellNum)
考虑那些方法而不是 On Error ...
语句。它们都更易于阅读和维护——没有什么比尝试遵循一堆 GoTo
和 Resume
语句更令人困惑的了。
【讨论】:
+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 提交?