我的range.find()是空的

时间:2014-05-07 16:31:32

标签: vba error-handling find

我搜索了这个问题的答案,然后非常接近

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(),然后继续下一行。

另外,我的错误处理有什么好处吗?我从来没有真正做过很多事情(主要是对我的宏非常简单)

1 个答案:

答案 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