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