【问题标题】:On Error - Using loop that won't be interrupted irregardless of the errorOn Error - 使用无论错误如何都不会中断的循环
【发布时间】:2016-10-10 14:02:59
【问题描述】:

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

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

错误是运行时错误“91”:对象变量或未设置块变量

代码:

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

【问题讨论】:

  • 当您单步执行代码时,它是否真的命中了您的 ErrorHandler?
  • 不是。它不会让我开始代码说:编译错误:未定义子或函数
  • 我怀疑它可能是使用 IE 未打开的参考。第三个点msdn.microsoft.com/en-us/library/…
  • 如果您遇到编译错误,您如何识别运行时错误?你的实际问题是什么?编译还是运行时?
  • 如果我拿出下面的代码,代码就可以了。然后我会收到错误 91。原因是有时我使用的网站无法识别正在搜索的名称。 "On Error GoTo ErrorHandler Error Handler Resume Next"

标签: excel for-loop onerror vba


【解决方案1】:

这可能会引发错误:

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,如果不是这样,可能需要额外的逻辑。

【讨论】:

    【解决方案2】:

    使用这个:

    Dim objIE As Object
    
    Set objIE = CreateObject("InternetExplorer.Application")
    
        objIE.Top = 0
        objIE.Left = 0
        objIE.Width = 800
        objIE.Height = 600
        objIE.Visible = True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多