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
,如果情况并非如此,则可能需要额外的逻辑。
我制作了一个代码,它将使用 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
,如果情况并非如此,则可能需要额外的逻辑。