我搜索了这个问题的答案,然后非常接近
VBA: need decide if result of FIND method is NOTHING or "" (empty)
但我不太明白如何解决我的问题。它几乎是一样的,我使用find来查找另一个工作簿中的内容,如果find()找不到我正在寻找的内容,则会抛出错误。我尝试了上面链接中的建议,但我同意https://stackoverflow.com/users/478884/tim-williams,因为我的对象仍然是空的,所以IIF()仍然会出错。
Do Until Row > LastRow
On Error GoTo MFGPNError
PLRow = Workbooks(WB2).Sheets("5727").Range("C:C").Find(what:=Workbooks(WB1).Main.Cells(Row, 2).Value2, lookat:=xlWhole, searchorder:=xlByRows, MatchCase:=True).row
VREFLookup:
On Error GoTo VREFError
PLRow = Workbooks(WB2).Sheets("5727").Range("D:D").Find(what:=Workbooks(WB1).Main.Cells(Row, 2).Value2, lookat:=xlWhole, searchorder:=xlByRows, MatchCase:=True).row
然后我的错误陷阱:
Exit Sub
MFGPNError:
If PLRow Is Empty Then
Workbooks(WB1).Main.Cells(Row, 3) = ""
'If IIf(PLRow Is Empty, "", PLRow) = "" Then
'setting MPN to be "" and moving to VREF lookup
On Error GoTo -1
GoTo VREFLookup
End If
'-----
Exit Sub
VREFError:
If IIf(PLRow Is Nothing, "", PLRow) = "" Then
'setting MPN to be "" and then adding cleaned up pn to array?
WB1.Main.Cells(Row, 3) = ""
On Error GoTo -1
GoTo CleanPN
End If
在我的第一个错误陷阱上,我注释掉了IIF(),因为它抛出了一个错误,并尝试了一个常规的IF(),仍然是一个错误..
我的问题是,如果我的Find()抛出错误,我怎么能继续浏览我的宏?我想跳过那个特定的Find(),然后继续下一行。
另外,我的错误处理有什么好处吗?我从来没有真正做过很多事情(主要是对我的宏非常简单)
答案 0 :(得分:1)
我认为这是您的问题:.Find
方法的结果是范围对象,可以是Nothing
。您正在尝试评估引发错误的Nothing.Row
。
不是处理凌乱的错误处理程序和混淆GoTo
语句,而是最好只是捕获该错误并正确处理它。
首先,声明一个范围对象并使用它来返回.Find
的结果。
Dim rngFound as Range
'## Attempt the lookup in Column C:
Set rngFound = Workbooks(WB2).Sheets("5727").Range("C:C").Find( _
what:=Workbooks(WB1).Main.Cells(Row, 2).Value2, _
lookat:=xlWhole, searchorder:=xlByRows, MatchCase:=True)
然后,您可以处理此rngFound
变量,并测试它是否为Nothing
。如果是,则对D列执行另一个Find
:
'## If not found, look for it in column D:
If rngFound Is Nothing Then
Set rngFound = Workbooks(WB2).Sheets("5727").Range("D:D").Find( _
what:=Workbooks(WB1).Main.Cells(Row, 2).Value2, _
lookat:=xlWhole, searchorder:=xlByRows, MatchCase:=True)
End If
如果第二个发现也失败了,那么你做了一些你已经知道如何做的事情:
If rngFound Is Nothing Then
'## DO SOMETHING ELSE ##
End If
然后,您可以分配到PLRow
变量
If rngFound Is Nothing then
PLRow = Empty '## Or modify as needed.
Else:
PLRow = rngFound.Row
End If
作为最佳实践,您应该尽可能避免使用On Error GoTo...
语句,尤其是在没有错误处理程序的情况下可以适当地捕获错误时。此外,在您的错误处理程序中(如果您出于某些其他原因绝对必须使用它们),您应该Err.Clear
以及Resume Next
而不是GoTo VREFLookup
。