Wie wird man warten, bis ein IE9-frame zu laden über VBA-excel?
Es gibt viele online-Ressourcen, die veranschaulichen die Verwendung von Microsoft Internet Explorer-Steuerelemente in VBA Excel um eine grundlegende IE-automation-Aufgaben. Diese große Arbeit, wenn die Webseite in Frage hat eine grundlegende Konstrukt. Allerdings, wenn Webseiten mit mehreren frames Sie können schwierig sein, mit zu arbeiten. Aktuell habe ich Probleme bei der Bestimmung, ob eine Person Rahmen innerhalb einer Webseite vollständig geladen wurde. Zum Beispiel... Dieses Excel-VBA-code öffnet den IE, lädt eine Webseite, Schleifen thur einem excel-sheet platzieren von Daten in der Webseite, Felder, führt die Suche, und gibt dann die IE Ergebnisse der Daten in excel (ich entschuldige mich für das weglassen der Website-Adresse). Die rub ist hier, dass die Ziel-Webseite enthält zwei frames:
1) Der Suchleiste.asp-frame für die Suche Wert-Eingabe und ausführen der Suche
2) Die searchresults.asp-frame für die Anzeige von Suchergebnissen
In diesem Konstrukt die search bar ist statisch, während die Ergebnisse der Suche ändern sich je nach input-Kriterien. Weil die Webseite ist gebaut auf diese Weise, die IEApp.ReadyState-und IEApp.Beschäftigt nicht verwendet werden, um zu bestimmen, IEfr1 frame laden, Abschluss, wie Sie diese Eigenschaften ändern sich nicht nach der ersten Suche.asp-laden. Daher verwende ich eine große statische Wartezeit zu vermeiden, die runtime-Fehlern, die beim internet-Verkehr flucuates. Dieser code funktioniert schon, aber es ist lächerlich langsam... beachten Sie die 10 Sekunden warten, nachdem die cmdGO-Anweisung. Ich würde wirklich gerne verbessern die Leistung von diesem Prozess, indem Sie solide Logik, um zu bestimmen, welches Bild geladen Fortschritt.
Meine Frage ist - kennt jemand einen cleveren Weg, um zu bestimmen, ob eine autonome frame fertig geladen ist?
Dank,
~Z
' NOTE: you must add a VBA project reference to "Internet Explorer Controls"
' in order for this code to work
Dim IEapp As Object
Dim IEfr0 As Object
Dim IEfr1 As Object
' Set new IE instance
Set IEapp = New InternetExplorer
' With IE object
With IEapp
' Make visible on desktop
.Visible = True
' Load target webpage
.Navigate "http://www.MyTargetWebpage.com/search.asp"
' Loop until IE finishes loading
While .ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
End With
' Set the searchbar.asp frame0
Set IEfr0 = IEapp.Document.frames(0).Document
' For each row in my worksheet
For i = 1 To 9999
' Input search values into IEfr0 (frame0)
IEfr0.getElementById("SearchVal1").Value = Cells(i, 5)
IEfr0.getElementById("SearchVal2").Value = Cells(i, 6)
' Execute search
IEfr0.all("cmdGo").Click
' Wait a fixed 10sec
Application.Wait (Now() + TimeValue("00:00:10"))
' Set the searchresults.asp frame1
Set IEfr1 = IEapp.Document.frames(1).Document
' Retrieve webpage results data
Cells(i, 7) = Trim(IEfr1.all.Item(26).innerText)
Cells(i, 8) = Trim(IEfr1.all.Item(35).innerText)
Next
- Kannst du die aktuelle URL? Es ist schwer zu diagnostizieren, ohne es zu sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @JimmyPena sagte. es ist viel einfacher zu helfen, wenn wir können finden Sie unter der URL.
Wenn wir nicht können, hoffentlich in dieser übersicht können Sie in die richtige Richtung:
Hoffe, das hilft!
Ich verwendet loop-option zu prüfen, den Wert des Feldes bis zu seinem aufgefüllt, wie dies
Do While IE.Dokument.getElementById("USERID").Wert <> "test3"
DH.Dokument.getElementById("USERID").Value = "test3"
Loop
dies ist ein Rrrreeally alten thread, aber ich dachte, ich würde post meine Ergebnisse, denn ich kam hier nach einer Antwort zu suchen...
Blick in das Fenster, konnte ich sehen, dass der "readystate" - variable war nur "READYSTATE_COMPLETE" für die IE-App selbst. aber für den iframe, es war Kleinbuchstaben "komplett"
So erkundete ich diese mithilfe eines debug.print-loop auf .readystate-der Rahmen war ich arbeiten.
Also dies wird Ihnen zeigen, Zeile nach Zeile "laden" in das Direktfenster ein, schließlich zeigt "complete" und beenden die Schleife. es kann gekürzt werden, um entfernen Sie die debug.Abzüge natürlich.
andere Sache:
verzeihen Sie mir, wenn dies alles ist gemeinsames wissen. Ich wirklich nur abgeholt VBA-scripting vor ein paar Tagen...