2015-10-26 6 views
0

Я автоматизирую IE через VBA, и я не могу заставить код VBA ждать, пока страница не будет загружена до захвата документа. Это приводит к разным сбоям при слишком быстром моем коде. Как я могу заставить VBA ждать загрузки страницы IE? Многие из методов, которые я пробовал, я нашел в stackoverflow, но никто не работает для меня.Как заставить VBA ждать загрузки страницы IE?

ie is my InternetExplorer объект.

Я попытался, но безрезультатно:

Do 
    If ie.readyState = 4 Then 
     Exit Do 
    Else 
     DoEvents 
    End If 
Loop 

Также:

Do While ie.Busy Or Not ie.ReadyState = READYSTATE_COMPLETE 
    DoEvents 
Loop 

Также:

Do 
    DoEvents 
Loop Until ie.ReadyState = READYSTATE_COMPLETE 

Я даже попытался:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

... 

Do 
    Sleep 250 
Loop Until ie.readyState = READYSTATE_COMPLETE 

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

Я перехожу на страницу входа, заполняя имя пользователя и пароль и нажав кнопку входа в систему. После входа в систему мне нужно изменить некоторые поля (выпадающие списки и текстовые поля). После того, как я изменил эти поля, я использую VBA, чтобы нажать кнопку, чтобы сохранить настройки, а затем перейти на другую страницу. Код неправильно задает поля, потому что он пропускает предыдущее ожидание загрузки страницы, поэтому я вхожу в следующую часть своего кода с неправильными настройками.

Мне интересно, возможно ли это из-за запроса ajax? Я не знаю, как сказать.

У кого-нибудь есть надежное средство ожидания загрузки страницы в IE, прежде чем захватить html-документ?

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

При необходимости я могу добавить дополнительные разъяснения.

+0

Вы пытались дождаться события DocumentCompleted? – trincot

+0

У меня нет. Я не так хорошо знаком с использованием событий объекта в VBA. Я работаю в поисковых системах и не создаю отличную документацию. – Soulfire

+0

Хорошо, я привел пример в своем ответе. Кстати, это DocumentComplete без d в конце. Виноват. – trincot

ответ

-1

Извините, мне не хватает репутации, поэтому я должен добавить ответ, но вы попробовали 1000 или 2000 (1 или 2 секунды) в своем третьем варианте? В зависимости от того, что делает IE, для загрузки может потребоваться более 250 миллисекунд.

+0

Ну, это не имеет значения, так как он должен оставаться в цикле до тех пор, пока ReadyState не станет правым? Таким образом, он спит в течение 250 мс, затем снова проверяет, готова ли страница, если нет, снова спит 250 мс и так далее. По крайней мере, так я намеревался работать. – Soulfire

1

Вы можете дождаться события DocumentComplete. Но для этого вам нужно, чтобы браузер был установлен на листе. В коде этого листа, введите этот код (при условии, что вы назвали контроль браузера ie):

Private docComplete As Boolean 

Private Sub ie_DocumentComplete(ByVal pDisp As Object, url As Variant) 
    docComplete = True 
End Sub 

Public Sub NavigateAndWait(url As String) 
    docComplete = False 
    ie.Navigate url 
    Do 
     DoEvents 
    Loop Until docComplete 
End Sub 

Sub Main() 
    ' Example use 
    NavigateAndWait "www.google.com" 
    MsgBox "Ready" 
End Sub 

Делая NavigateAndWaitPublic Sub вы можете вызвать его из других модулей, которые вы могли бы иметь. Лучше всего переместить код, который нуждается в ie в модуль этого листа. Обратите внимание, что элемент управления браузера должен быть видимым и на активном листе для события DocumentComplete запускаться.

+0

Спасибо за этот пример. Кажется, не так, что 'ie' не объявляется в подпрограмме' NavigateAndWait', так как он дает мне переменную неопределенную ошибку. Звучит это правильно? Должен ли я передать свой объект 'ie' в эту подпрограмму? – Soulfire

+0

Ну, в вашем вопросе вы сказали, что вы назвали свой объект браузера 'ie', и вы предоставили код, используя' ie' ... поэтому я использовал 'ie'. Обязательно поместите этот код в модуль листа, который имеет объект браузера 'ie' – trincot

+0

. Да, мой объект' ie' должен иметь слишком узкий масштаб, я попытаюсь его изменить. – Soulfire

Смежные вопросы