VBA-веб-соскабливание по интрасети

Я написал код VBA, чтобы я мог отказаться от данных из интрасети моей компании на работе.

Вопросы:

Когда я запускаю код, появляется ошибка ниже.

Run-time error '91': object variable or with block variable not set 

Это происходит в нижней строке кода.

 myPoints = Trim(Doc.getElementsByName("price")(0).getAttribute("value")) 

когда я отлаживаю его и запускаю по строкам, он может получить все значение.

Может быть, я пропустил обработчик ошибок?

Вход и выход:

Я ввожу несколько идентификаторов продукта в столбец B и извлекаю данные в столбце C:

Столбец B = идентификатор продукта

Столбец C = цена

HTML:

 <td id="myPower_val_9" style="visibility: visible;"> <input type="text" disabled="disabled" value="300" name="price"></input> </td> 

VBA:

 Sub Button1_Click() Dim ie As Object Dim r As Integer Dim myPoints As String Dim Doc As HTMLDocument Set ie = New InternetExplorerMedium For r = 2 To Range("B65535").End(xlUp).Row With ie .Visible = 0 .navigate "www.example.com/product/" & Cells(r, "B").Value Do Until .readyState = 4 DoEvents Loop End With Set Doc = ie.document myPoints = Trim(Doc.getElementsByName("price")(0).getAttribute("value")) Cells(r, "C").Value = myPoints Next r End Sub 

    Вам нужно дождаться, когда документ будет полностью отображен, а DOM доступен перед доступом к любым элементам. ie.ReadyState изменяется на READYSTATE_COMPLETE после того, как страница подключится и начнет загружаться. Причина, по которой ваш код работает при отладке, заключается в том, что за пару секунд вам нужно начать работу с отладчиком, страница заканчивает загрузку.

     With ie .Visible = True .Navigate "www.example.com/product/" & Cells(r, "B").Value Do Until .ReadyState = READYSTATE_COMPLETE DoEvents Loop Do Until .Document.ReadyState = "complete" DoEvents Loop End With 

    Я также рекомендую вам сделать видимым окно Window, по крайней мере, во время разработки. После того, как ваша функциональность будет завершена и отлажена, вы можете сделать окно невидимым. Имейте в виду, если вы забудете закрыть невидимые окна IE, когда ваш код закончится, ваши пользователи в конечном итоге будут работать с runaway iexplore.exe.

    Если вы хотите проигнорировать ошибку и продолжить следующую итерацию, используйте этот модифицированный код:

     Sub Button1_Click() Dim ie As Object Dim r As Integer Dim myPoints As String Dim Doc As HTMLDocument Set ie = New InternetExplorerMedium For r = 2 To Range("B65535").End(xlUp).Row With ie .Visible = 0 .navigate "www.example.com/product/" & Cells(r, "B").Value Do Until .readyState = 4 DoEvents Loop End With Set Doc = ie.document 'Edit: myPoints = "" On Error Resume Next myPoints = Trim(Doc.getElementsByName("price")(0).getAttribute("value")) On Error Goto 0 Cells(r, "C").Value = myPoints Next r End Sub 
    Interesting Posts

    Подсчет количества пустых ячеек в неопределенном диапазоне и суммирование значений в следующем столбце

    Открытие UTF-8 CSV, содержащего HTML с Excel

    возвращает значение ячейки, если другая ячейка сопоставляется в той же строке

    Ожидаемый конец заявления в формуле с кавычками

    Как отключить функцию вырезания, копирования и вставки в excel с помощью c #?

    Excel добавляет столбец серийного номера на основе другого столбца, сгруппированного

    VBA – прочитайте CSV с utf-8 и выпишите еще один CSV с utf-8

    Delphi – определение наличия в Excel фильтров

    Я пытаюсь загрузить данные из данных Excel (данные в формате валюты) в таблицу SQL с типом данных Number (28, 10), используя SSIS

    Согласование с ID и копирование ячеек другого столбца в виде блока на другой лист

    VBA Excel – Solver в цикле возвращает ошибку в ссылке на меняющиеся ячейки и условия

    Автоматическое обновление импортированных макросов в excel

    IF (ISBLANK (V4), "", СЕГОДНЯ () – V4) за просроченный день

    VBA Excel regex – \ b граница слова не совпадает, если слово находится в начале строки

    GemBox Spreadsheet: несколько цветов шрифта в одной ячейке

    Давайте будем гением компьютера.