On Error - 使用无论错误如何都不会被中断的循环

On Error - Using loop that won't be interrupted irregardless of the error

我制作了一个代码,它将使用 A 列中的单元格并在网站中搜索它并下拉我需要的某个 table。但是,有时我会遇到错误(因为名称错误或其他原因),我希望代码跳过它并继续。

示例:如果搜索 A3 有问题,我希望代码搜索 A4 等

错误是运行-time error '91': object variable or With block variable not set

代码:

Sub SearchBot()

Dim objIE As InternetExplorer 
Dim aEle As HTMLLinkElement 
Dim y As Integer 
Dim result As String 
Dim tbl As Object, obj_tbl As Object
Dim lastRow As Long
Dim start_time As Date
Dim end_time As Date
Dim cookie As String
Dim result_cookie As String

Set objIE = New InternetExplorer  

objIE.Visible = True  

objIE.navigate "https://website.com" 

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

For i = 2 To 1829


objIE.document.getElementById("SearchTopBar").Value = _
Sheets("Sheet2").Range("A" & i).Value  '

Set oNode = objIE.document.getElementsByClassName("iPadHack tmbsearchright"
(0) 
oNode.Click

On Error GoTo ErrorHandler

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

Dim tblEle As Object
Set tblEle = objIE.document.getElementsByClassName("cTblListBody")(5) 

Sheets("Sheet2").Range("B" & i).Value = tblEle.innerText
Debug.Print tblEle.innerText

Next

ErrorHandler

Resume Next

objIE.Quit 
End Sub

使用这个:

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")

    objIE.Top = 0
    objIE.Left = 0
    objIE.Width = 800
    objIE.Height = 600
    objIE.Visible = True

这会引发错误:

Set tblEle = objIE.document.getElementsByClassName("cTblListBody")(5) 

例如,如果没有找到具有类名 "cTblListBody" 的匹配元素,或者找到的元素少于 6 个,等等。在这种情况下,您的错误处理程序将接管,并且 tblEle 将是 Nothing.

这条语句 Resume Next 将尝试在 下一行 (从引发错误的行开始)恢复执行,如果tblEle 尚未分配(即 Is Nothing)。

Sheets("Sheet2").Range("B" & i).Value = tblEle.innerText
Debug.Print tblEle.innerText

你不想Resume Next,你想在循环的下一次迭代中恢复,所以你可以用另一个标签来做到这一点:

On Error GoTo ErrorHandler

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

    Dim tblEle As Object
    Set tblEle = objIE.document.getElementsByClassName("cTblListBody")(5) 

    Sheets("Sheet2").Range("B" & i).Value = tblEle.innerText
    Debug.Print tblEle.innerText

NextItem:
Next

ErrorHandler

Resume NextItem

或者,更恰当地说(恕我直言),捕获此错误:

'## THIS LINE IS NOT NEEDED: 
' On Error GoTo ErrorHandler

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

    Dim tblEle As Object
    Set tblEle = objIE.document.getElementsByClassName("cTblListBody")
    If Not tblEle Is Nothing Then
        If tblEle.length > 5 Then
            Sheets("Sheet2").Range("B" & i).Value = tblEle(5).innerText
            Debug.Print tblEle(5).innerText
        End If
    End If
Next

'## THESE ARE NOT NEEDED:
'ErrorHandler
'Resume NextItem

注意:这假定至少找到 6 个 cTblListBody,如果情况并非如此,则可能需要额外的逻辑。