Я знаю, что такие вопросы были заданы раньше, но мой немного отличается и был довольно тревожным. Я имею дело с веб-страницей с формой с несколькими событиями, которые загружают большую часть страницы, когда заполняются некоторые элементы в поле ввода. Когда эти события снова перезагружают страницу, но остаются с тем же URL-адресом с тем же именемprop. Я использую следующие типы методов как отдельно, так и в совокупности, чтобы обрабатывать ожидание загрузки страницы, но иногда VBA по-прежнему удается продолжить выполнение и установить переменную HTMLDocument на страницу без соответствующей информации, вызывающей макрос для отладки. Вот виды вещей, которые я пытался до сих пор:VBA Internet Explorer ждет загрузки веб-страницы
While IE.Busy
DoEvents
Wend
Do Until IE.statusText = "Done"
DoEvents
Loop
Do Until IE.readyState = 4
DoEvents
Loop
Я даже попытался поместить эти события в петлю, как в следующем, но это не совсем работает, потому что LastModified свойство возвращает только значение вплоть до второй и макро раскручивает через поля достаточно быстро, что она возвращает новую страницу в ту же секунду:
Do Until IE.statusText = "Done" And IE.Busy = False And IE.ReadyState = 4 _
And IE.document.lastModified > LastModified ----or---- IE.document.nameprop = _
"some known and expected name prop here"
While IE.Busy
DoEvents
Wend
Do Until IE.statusText = "Done"
DoEvents
Loop
Do Until IE.readyState = 4
DoEvents
Loop
Loop
Даже то, что не может ждать достаточно долго, чтобы установить объект HTMLDocument, ведущий к отладке , Я предполагал установить следующий элемент ввода и проверить, что ничто не способствует дальнейшему кодированию, но даже это не будет успешным в течение 100% времени, потому что обычно элементы ввода существуют в HTML, но скрыты до тех пор, пока соответствующее событие не будет запущено , что не будет проблемой, но они не загружают их возможные варианты выбора до тех пор, пока не будет запущено событие. Это может быть странная страница.
В любом случае ... не уверен, что еще добавить. Если есть что-то еще, что может быть полезно, просто спросите. Я предполагаю, что то, что я ищу, - это способ заставить VBA подождать, пока IE не узнает, что другая страница не на пути. Кажется, он загружается несколько раз, прежде чем он будет полностью выполнен.
Итак ... У кого-нибудь есть идеи?
EDIT: Нашли несколько новых вещей, чтобы попробовать. Тем не менее, нет кубиков. Было высказано предположение, что я добавляю эти попытки. Вот код, по какой-то причине экземпляр VBE и excel становятся невосприимчивыми при использовании этого подхода после запуска события, которое должно заполнить параметры на элементе select ... думать о попытке xml ... вот код:
intCounter = 0
Do until intCounter > 2
Do Until IE.Busy = False: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
Set HTMLDoc = IE.Document
Do Until HTMLDoc.ReadyState = "complete"
Set HTMLSelect = HTMLDoc.getElementById("ctl00$ctl00$MainContent$ChildMainContent$ddlEmployeeBranchCodes")
intCounter = 0
For each Opt in HTMLSelect
intCounter = intCounter + 1
Next Opt
Loop
Основываясь на том, что я вижу на веб-странице, я знаю, что именно в этом цикле VBE и Excel становятся невосприимчивыми.
Надеюсь, что это поможет ... Я знаю, это не помогло мне ... Драты.
EDIT: Просто подумал, что я бы добавил это. Когда дело доходит до автоматизации веб-страницы, по большей части, я больше не использую IE. Я нашел, что это намного лучше, и полностью обойти эту проблему асинхронного материала, просто выполнить сообщения и получить себя. Не может быть лучшим решением в зависимости от того, что вы пытаетесь сделать, но он работает довольно надежно, если вы внимательно посмотрите на трафик и хорошо оцените параметры.
Если вы имеете дело со страницей, которая динамически добавляет/удаляет компоненты интерфейса, то у вас действительно есть только два варианта: 1) добавьте фиксированное время ожидания х секунд для учета обновлений; 2) проверьте фактические элементы, которые вам нужны для взаимодействовать с помощью кода и цикл до тех пор, пока они не будут найдены. Я не думаю, что есть какой-либо способ надежно рассказать в общем смысле, когда (например, все ожидающие запросы AJAX завершены. –
@TimWilliams Да, я думаю, это то, к чему я иду. Я думаю, что мне придется посмотреть на элементы ввода, но они действительно существуют до того, как будут запущены события, но у них нет опций. Итак, я думаю, что я застрял в подсчете вариантов, пока не станет доступным. – MattB
Ну ... как оказалось, подсчет опций на входном элементе заставляет код становиться невосприимчивым. Так что я вроде как ручей. – MattB