On Error无法使用IE自动化

时间:2017-03-01 11:02:50

标签: excel vba excel-vba internet-explorer error-handling

我的代码是从网站获取信息,但在某些情况下,包含信息的HTML代码并不存在,所以我使用On Error来处理它。

正如您在代码中看到的那样,我正在浏览列表并获取每行的信息(大约700行)。起初错误发生在第10行,然后我添加了On Error GoTo 0。之后,它开始被扔到第13行。

我的配置已设置为 Unundeled Errors Break

运行时错误号是:

  

91:未设置对象变量或With块变量。

发生在" ** **"

之间的界限
Sub GetData_DK()

    Dim IE As New InternetExplorer
    Dim URL As String
    Dim doc As HTMLDocument 'variable for document or data which need to be extracted out of webpage
    Dim onl As String
    Dim sto As String
    Dim pri As String
    FinalRow = tme.Cells(Rows.Count, "G").End(xlUp).Row

    Dim hyper As Workbook
    Set hyper = Workbooks.Open("path")
    FinalRowH = hyper.Sheets("tme").Cells(Rows.Count, "A").End(xlUp).Row
    ThisWorkbook.Activate

    For a = 5 To FinalRow

        onl = ""
        sto = ""
        pri = ""

        For b = 5 To FinalRowH
            If (ThisWorkbook.Sheets("tme").Cells(a, 7).Value = hyper.Sheets("tme").Cells(b, 1).Value) Then
                URL = hyper.Sheets("tme").Cells(b, 3).Value
                Exit For
            End If
        Next b

        IE.navigate URL
        IE.Visible = True

        Do
            If IE.readyState = READYSTATE_COMPLETE Then
                If IE.document.readyState = "complete" Then Exit Do
            End If
            Application.Wait DateAdd("s", 1, Now)
        Loop
        'Application.Wait (Now() + TimeValue("00:00:006")) ' For internal page refresh or loading


        Set doc = IE.document

        On Error Resume Next
        'gets HTLM class containing the value
        **onl = CStr(doc.getElementsByClassName("items-in-stock align-left")(0).innerText)**
        On Error GoTo 0
        If (onl = Chr(160) Or onl = " " Or onl = "   " Or onl = "" Or onl = vbNullString Or Left(onl, 9) = "Forventet") Then
            Cells(a, 8).Value = 0
        Else
            Cells(a, 8).Value = 1
        End If

        On Error GoTo price
        'repeats the process for stores
        sto = CStr(doc.getElementsByClassName("open-cas-tab")(0).innerText)
        sto = Left(sto, InStr(sto, " ") - 1)
        Cells(a, 9).Value = sto

price:
        On Error GoTo 0

        On Error Resume Next
        'repeats the process for price
        pri = CInt(CStr(doc.getElementsByClassName("product-price-container")(0).innerText))
        Cells(a, 10).Value = pri
        On Error GoTo 0
    Next a
End Sub

请让我知道我做错了什么(:

1 个答案:

答案 0 :(得分:1)

如果使用getElementsByClassName没有返回任何元素,那么您可以测试length属性,它将为0.如果您尝试访问第0个元素,尝试跳过生成的错误更可取因为你认为你会得到积极的结果。

所以你可以试试这个:

Set doc = IE.document

Dim objElements As Object
Set objElements = doc.getElementsByClassName("items-in-stock align-left")

If objElements.length > 0 Then
    ' some elements are returned - get the text from the first one
    onl = CStr(objElements(0).innerText)
Else
    ' nothing returned - lets handle it gracefully with no error
    MsgBox "No elements with that class!"
    '... prepare to exit 
End If

' do stuff with onl