VBA Internet Explorer warten Sie, bis die web-Seite zu laden

Ich weiß, Fragen wie diese wurden vorher gefragt, aber mir ist ein bisschen anders und wurde ziemlich beunruhigend. Was ich zu tun ist eine web-Seite mit einem Formular mit ein paar Ereignissen, die Last mehr von der Seite, wenn bestimmte Elemente in Eingabe-Felder ausgefüllt sind. Wenn diese Ereignisse ausgelöst werden, die Seite lädt wieder, aber bleibt an der gleichen URL mit der gleichen nameprop. Ich habe mit den folgenden Arten von Methoden, die beide separat und aneinander zu behandeln, warten auf die Seite zu laden, aber manchmal sind die VBA immer noch gelingt, weiter ausgeführt, und legen Sie die HTMLDocument-variable auf eine Seite ohne die entsprechenden Informationen auf verursacht das makro Debuggen. Hier sind die Arten von Dinge, die ich versucht habe, so weit:

While IE.Busy
    DoEvents
Wend

Do Until IE.statusText = "Done"
    DoEvents
Loop

Do Until IE.readyState = 4
    DoEvents
Loop

Ich habe sogar versucht, diese Ereignisse in eine Schleife, wie die folgenden, aber es hat nicht ganz funktioniert, weil die lastModified-Eigenschaft nur einen Wert zurückgibt, runter in den zweiten und der makro-spins durch die Felder schnell genug, dass es wieder eine neue Seite in der gleichen Sekunde:

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

Gar nicht warten, lange genug, um das HTMLDocument-Objekt führt zu einem debug. Ich habe erwogen, die Einstellung der nächsten input-element und überprüfen, die für nichts weiter zu dem code, aber selbst das würde nicht erfolgreich sein, 100% der Zeit, weil in der Regel die Input-Elemente gibt es in HTML aber erst dann sichtbar, wenn das entsprechende Ereignis ausgelöst wird, was kein problem wäre, aber Sie wissen nicht, laden Sie Ihre Auswahlmöglichkeiten, bis nach dem Ereignis ausgelöst wird. Könnte es eine ungerade Seite ist.

Sowieso... nicht sicher, was anderes zu fügen. Wenn es etwas anderes gibt, die hilfreich sein könnten, um zu sehen, Fragen Sie einfach. Ich denke, was ich Suche, ist ein Weg, um VBA zu warten, bis der IE kennt eine andere Seite ist nicht auf dem Weg. Es scheint, laden ein paar mal, bevor es vollständig fertig.

Also... Jemand irgendwelche Ideen haben?

EDIT: Gefunden, ein paar neue Dinge zu versuchen. Noch, keine Würfel. Es wurde vorgeschlagen, dass ich diese versuche. Hier ist der code, für einige Grund, der VBE und die excel-Instanz nicht mehr reagiert, wenn Sie diesen Ansatz, nach dem Brand ein event, das sollten füllen Sie die Optionen auf das select-element... das denken über das versuchen, xml... hier ist der code:

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

Basierend auf dem, was ich sehen kann, was auf der web-Seite, ich weiß, dass es irgendwo in dieser Schleife, der VBE und Excel nicht mehr reagiert.

Hoffe, das hilft... ich weiß es nicht helft mir... Drats.

EDIT: dachte Nur, ich würde noch etwas hinzufügen. Wenn es um die Automatisierung einer web-Seite, für die ich in den meisten Fällen nicht mehr den IE nutzen. Ich habe festgestellt, es ist viel besser, und umgeht das Problem der asynchronen Zeug völlig, um einfach die Beiträge und erhält sich selbst. Vielleicht nicht die beste Lösung, je nachdem, was Sie zu tun versuchen, aber es funktioniert Recht zuverlässig, wenn man sich die traffic-eng und parametrieren Sie die Dinge gut.

  • Wenn man sich mit einer Seite, die dynamisch Hinzugefügt/entfernt-interface-Komponenten, dann hast du wirklich nur zwei Möglichkeiten: 1.) eine Feste Wartezeit von x Sekunden, um Konto für updates 2) überprüfen Sie die tatsächlichen Elemente, die Sie benötigen, um die Interaktion mit per code, und Schleife, bis Sie gefunden werden. Ich glaube nicht, dass es irgendeinen Weg, um zuverlässig sagen, in einem Allgemeinen Sinn, wenn (z.B.) alle ausstehenden AJAX-requests vollständig sind.
  • Ja, ich denke, das ist, was ich will. Ich denke, ich werde ein Blick auf die input-Elemente, sondern Sie tatsächlich existieren, bevor die Ereignisse ausgelöst werden, aber Sie sind Optionen nicht. Also, ich denke, ich bin stecken, zählen Optionen bis Dinge zur Verfügung stehen.
  • Naja... wie es sich herausstellt, zählen die Optionen, die auf das input-element bewirkt, dass der code nicht mehr reagiert. Also ich bin ein bisschen ein großes Problem.
  • Schlage vor, Sie aktualisieren Sie Ihre Frage mit dem code versucht: jemand könnte haben einen anderen Ansatz.
  • Es ist in all seinem scheitern Herrlichkeit. Ich dachte, es sah ziemlich schön, wenn ich im Begriff war, für Sie. Nur nicht ganz geklappt. Darüber nachzudenken, versuchen einige xml-option.
InformationsquelleAutor MattB | 2013-11-12
Schreibe einen Kommentar