Цикл очистки кода в VBA после 3-й итерации завершился неудачно - PullRequest
2 голосов
/ 13 мая 2019

Я пытаюсь получить данные с нескольких веб-страниц (разные стоковые страницы с одного сайта). Я могу получить данные, извлеченные за первые 3 раза выполнения цикла, но на 4-й итерации возникает ошибка 91: Переменная объекта или переменная блока не установлены.

Я попытался передвигаться по команде открытия Internet Explorer, чтобы она открывала новый браузер в начале каждой итерации и закрывала его в конце цикла, чтобы убедиться, что объект IE как-то не вышел из строя. Это не сработало, та же проблема.

Sub GetStock()


    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim cellnum As Range: Set cellnum = Range(ActiveCell.Address)
    Dim i As Integer
    Dim IE As Object
    Dim text As String

    i = 1

    Do Until i > 10
        Set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = True

        cellnum = Range(ActiveCell.Offset(i, 7).Address)

        With IE
            .navigate cellnum.Value
            Do While .Busy And .readyState <> 4: DoEvents: Loop
            Sleep 1000
            text = .Document.getElementsByClassName("classname")(1).outerText
        End With

        ws.Cells(i, 12).Value = text
        i = i + 1

        IE.Quit
    Loop


End Sub

Ссылки на веб-страницу хранятся внутри ячеек, отсюда и код ячейки. Находит правильную ячейку, извлекает веб-страницу внутри нее, затем переходит к ячейке под ней. Код работает отлично для первых 3 итераций, но по какой-то причине не работает на 4-й. Код ошибки определяет строку «text = .document.getElementsByClassName ...» как ошибку.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Нашли решение! Команда Sleep.1000 не обеспечивала достаточно времени во всех случаях, и я предполагаю, что код пытался получить данные до того, как страница была доступна. Я думал, что цикл там решит это, но я думаю, что нет (очень плохо знакомый с этим). В любом случае, я изменил его на Sleep.3000, чтобы дать моему медленному интернету достаточно времени, чтобы наверстать упущенное, и он работает как сон.

Спасибо всем за помощь.

1 голос
/ 13 мая 2019

Я думаю, что ваша проблема, вероятно, из-за элемента, которого нет на веб-странице.Если он существует, вы уверены, что извлекаете нужный элемент из коллекции?

Попробуйте запустить его с

.document.getElementsByClassName("classname")(0).outerText.

Если это сработает, я бы посоветовал посмотреть, сколько элементов с классом "classname" находится на веб-странице.Хотя на других страницах у вас может быть 2 или более элементов, возможно, на 3-й странице у вас есть только один.

Можете ли вы опубликовать веб-страницы, которые вы просматриваете?

...