Как пропустить строку, когда HTML-элемент не возвращает значение? - PullRequest
0 голосов
/ 17 сентября 2018

Вот разбивка того, что я пытаюсь сделать:

1) Возьмите значение из списка в электронной таблице

2) Поиск URL с этим значением

3) Возьмите ElementId из HTML и добавьте его в электронную таблицу (его не нужно было добавлять в электронную таблицу, но он мне нужен для следующего поиска, и я не был уверен, как это сделать иначе)

4) Используйте ElementId для поиска другого URL

5) Извлечь значение ClassName из HTML

Моя проблема возникает, когда значение в списке не содержит IDValue из моего поиска в HTML ElementId. Мне нужно пропустить эти значения и GoTo NextName, но я не нашел успешного способа сделать это.

Я пытался добавить таймер к циклу выполнения, но все еще не смог перейти к следующему i в списке.

Вот мой код:

Option Explicit

Public Sub CheckNames()
    Dim ws As Worksheet, i As Long, IE As InternetExplorerMedium
    Dim doc As HTMLDocument, docElement As Object
    Dim docClass As Object

Set ws = ActiveSheet
Set IE = New InternetExplorerMedium

1)

For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    IE.Visible = False

2)

    IE.navigate "Beginning of URL" & ws.Cells(i, 1).Value & "End of URL"
    Do
        DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE

    IE.Refresh

    Set doc = IE.document

3)

    Do
        Set docElement = Nothing
        On Error Resume Next
        Set docElement = doc.getElementById("IDValue")
        On Error GoTo NextName
        DoEvents

    Loop Until Not docElement Is Nothing

    ws.Cells(i, 3).Value = Right(Trim(docElement.innerText), 5)

4) * * тысяча тридцать-пять

    IE.navigate "Beginning of another URL" & ws.Cells(i, 3).Value & "End of URL"

5)

    Do
        Set docClass = doc.getElementsByClassName("CLass Name in HTML")(3)

        DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE

    ws.Cells(i, 4).Value = Trim(docClass.innerText)

    Set doc = Nothing
    Set docElement = Nothing

NextName:
Next i
IE.Quit
End Sub

Короче говоря, я ищу способ перейти к следующему i в списке, когда doc.getElementById("IDValue") не имеет значения.

Заранее спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Некоторые основные указатели:

  1. Как минимум, вам необходим тайм-аут в вашем цикле, чтобы предотвратить бесконечный цикл
  2. Вы можете использовать On Error Resume Next ..... On Error GoTo 0 чтобы завершить вашу попытку установить элемент
  3. Затем выполняется условное выполнение остальной части кода до Next i на основе If Not docElement Is Nothing Then, т.е. элемент был найден и установлен
  4. Добавлены некоторые напечатанныефункции для эффективности

Небольшая часть кода приведена в порядок, но не полный обзор.

Option Explicit
Public Sub CheckNames()
    Dim ws As Worksheet, i As Long, IE As InternetExplorerMedium
    Dim doc As HTMLDocument, docElement As Object
    Dim docClass As Object, t As Date
    Const MAX_WAIT_SEC As Long = 5

    Set IE = New InternetExplorerMedium

    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

        IE.Visible = False
        IE.navigate "Beginning of URL" & ws.Cells(i, 1).Value & "End of URL"

        While IE.Busy Or IE.readyState < 4: DoEvents: Wend

        IE.Refresh

        Set doc = IE.document
        t = Timer

        Do
            DoEvents
            Set docElement = Nothing
            On Error Resume Next
            Set docElement = doc.getElementById("IDValue")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop Until Not docElement Is Nothing

        If Not docElement Is Nothing Then
            ws.Cells(i, 3).Value = Right$(Trim$(docElement.innerText), 5)

            IE.navigate "Beginning of another URL" & ws.Cells(i, 3).Value & "End of URL"

            While IE.Busy Or IE.readyState < 4: DoEvents: Wend
            Set docClass = doc.getElementsByClassName("CLass Name in HTML")(3)

            ws.Cells(i, 4).Value = Trim$(docClass.innerText)

        End If
    Next i
    IE.Quit
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...