С Excel VBA получить веб-элемент, если элемент присутствует, пропустить, если нет

Я новичок в очистке веб-страниц, но уже привыкаю. Мне удалось успешно получить данные с веб-страницы с помощью следующей команды:

sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value

Моя проблема заключается в том, что не на всех веб-страницах, которые я ищу, есть эти элементы, поэтому сценарий останавливается с ошибкой времени выполнения 424 — требуется объект.

Я попробовал команду On Error GoTo, но она работает только для первого инцидента, а затем останавливается на второй веб-странице с отсутствующими элементами.

Этот код:

Next_sku:
Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error GoTo Next_sku

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

Может ли кто-нибудь помочь мне с кодом, который либо вернет пустой результат, либо ручной ввод, такой как f.eks «Не существует», либо просто перейдет к следующей командной строке, если элемент не существует. Самое главное, что скрипт не останавливается.

Спасибо :-)


person Hermann    schedule 11.07.2015    source источник


Ответы (2)


Я думаю, проблема в том, что ваш код не возобновился с первой ошибки. Вы не можете проверить наличие ошибки в обработчике ошибок. Добавив оператор возобновления в свой код, VBA больше не будет думать, что вы находитесь внутри обработчика ошибок, и ваш код возобновится как обычно.

Вот пример:

On Error GoTo Next_sku
   sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
   sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
Next_sku:
   'Do something on error
Resume Next

Приведенный выше код оставит пустой результат, если артикул не найден. Вы можете добавить код после метки Next_sku: для возврата «Не существует».

Вы также можете попробовать использовать оператор on error resume next.

person Hubvill    schedule 11.07.2015

Большое спасибо @Hubvill за найденный ответ.

Код On Error Resume Nextисправил это. Мой код теперь выглядит следующим образом:

Do
    RowCount = RowCount + 1
    SKU = sht.Range("a" & RowCount).Value

    With ie
    .Visible = False
    .navigate "http://www.staples.no/search?keywords=" & SKU

        Do While .Busy Or _
            .readyState <> 4
            DoEvents
        Loop

    sht.Range("b" & RowCount).Value = .document.getElementById("PriceLabel").getElementsByTagName("span")(3).innerText
    sht.Range("c" & RowCount).Value = .document.getElementById("QuantityInput").Value
    On Error Resume Next

    End With

Loop While sht.Range("a" & RowCount + 1).Value <> ""

В результате поле остается пустым и продолжается вниз по списку SKU для поиска и захвата данных для них.

Отличное решение.

person Hermann    schedule 11.07.2015