VBA: Попытка получить доступ к веб-сайту, но иногда веб-сайт не загружается

Текущий код выглядит следующим образом:

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "https://www.website.com/"
Application.StatusBar = "https://www.website.com/ is loading. Please wait..."
Do While IE.Busy
    Application.Wait DateAdd("s", 1, Now)
    Loop
Application.StatusBar = "Search form submission. Please wait..."

Проблема, с которой я сталкиваюсь, заключается в том, что " https://www.website.com/" не удается загрузить время от времени (я полагаю, это связано с тем, что я неоднократно обращался к нему). В результате код никогда не выходит за пределы этого цикла:

Do While IE.Busy
    Application.Wait DateAdd("s", 1, Now)
    Loop

Логичное решение, на мой взгляд, состоит в том, чтобы убить IE и перезапустить весь процесс после того, как будет достигнут определенный срок (30 секунд?). Посоветуйте, пожалуйста, как кодировать это решение и / или как полностью кодировать более эффективное решение. Спасибо, любезно! И я использую IE10, если это вообще имеет значение.

Кроме того, вот ссылка, которую я нашел, которая имеет несколько связанной и актуальной информации: http://www.ozgrid.com/forum/showthread.php?t=161094

3 ответа

Решение

Вы можете попробовать изменить код для чтения

Sub LoadWebsite()
Dim iSecondCounter As Integer
Static iAttempts As Integer

iAttempts = iAttempts + 1

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "https://www.website.com/"
Application.StatusBar = "https://www.website.com/ is loading. Please wait..."

iSecondCounter = 0
Do While ie.Busy And iSecondCounter < 30
    Application.Wait DateAdd("s", 1, Now)
    iSecondCounter = iSecondCounter + 1
Loop
If iSecondCounter = 30 Then
    ie.Quit
    If iAttempts <= 3 Then Call LoadWebsite
End If

Set ie = Nothing
End Sub

Возможно, вы можете добавить код, который поможет вам ждать его загрузки, и через X секунд вы можете решить, стоит ли ждать, или вы можете грациозно выйти / сделать что-то еще (опубликовать сообщение и т. Д.)

ie.Navigate "http://www.website.com"
Application.Wait Now + TimeSerial(0, 0, 3)

Do While ie.Busy
    DoEvents
Loop

Хорошо, вы, кажется, задаете новый вопрос о получении набора элементов HTML, поэтому я опубликую его как новый ответ. Причина, по которой вы получаете ошибку объекта, заключается в том, что вы не указали размер objCollection для правильного объекта. Я изменил код в исходном ответе, чтобы сделать это, и установил коллекцию, как в вашем фрагменте. Чтобы использовать этот код, мне пришлось включить ссылку на библиотеку объектов Microsoft HTML.

Обратите внимание, что этот код уничтожает коллекцию элементов перед выходом из подпрограммы, вы, вероятно, захотите что-то с ней сделать.

Sub LoadWebsite()
Dim iSecondCounter As Integer
Static iAttempts As Integer
Dim objCollection As IHTMLElementCollection
iAttempts = iAttempts + 1

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "https://www.website.com/"
Application.StatusBar = "https://www.website.com/ is loading. Please wait..."

iSecondCounter = 0
Do While ie.Busy And iSecondCounter < 30
    Application.Wait DateAdd("s", 1, Now)
    iSecondCounter = iSecondCounter + 1
Loop
If iSecondCounter = 30 Then
    ie.Quit
    If iAttempts <= 3 Then Call LoadWebsite
End If


Set objCollection = (ie.Document.getElementsByTagName("INPUT"))

Cleanup:

Set ie = Nothing
Set objCollection = Nothing

End Sub
Другие вопросы по тегам