bitte bitte helft mir. Ist mir sehr wichtig.
ich möchte eine Anwendung im Internet Explorer per VBA steuern.
Es klappt auch schon ganz gut, mittels Mausssteuerung und sendkeys.
Leider muss zwischendurch ab und zu ein link auf der Seite aufgerufen werden
und damit beginnt mein Problem, dass ich bisher mit einer selbstgeschreiben
Pause(zeit) Routine gelöst habe.
Nun wird die Anzahl der Zugriffe um einiges größer und ich möchte, statt der
von mir gewählten Standartpause, nur noch so lange warten bis die Seite
geladen wird und die Anwendung wieder definiert auf sendkeys beziehungsweise
auf Mausklicks reagieren kann.
Alle versuche mit WaitforSingleObject führten bei mir nicht zum Erfolg.
Das WindowHandel hab ich.
Welchessind die richtigen API's um das Programm Handle zu ermitteln, bzw.
auf das Ende des Ladens der Seite zu warten??
Freue mich auch über Teillösungen.
Gruß
Ronald Eichler
> Alle versuche mit WaitforSingleObject führten bei mir nicht zum Erfolg.
>
> Das WindowHandel hab ich.
>
> Welchessind die richtigen API's um das Programm Handle zu ermitteln, bzw.
> auf das Ende des Ladens der Seite zu warten??
>
> Freue mich auch über Teillösungen.
>
> Gruß
>
> Ronald Eichler
>
du hast dich sicher in der Tür geirrt. Hier ist das Excel-Forum. IExplorer
is woanders
Schöne Grüße an den Namensvetter
Peter
Hallo Namenvetter,
nein eigentlich habe ich mich nicht in der Tür geirrt. Es hadelt sich um
Excel VBA mit eingebunden API. Darum kommt man nicht herum wenn man in Excel
Daten aus anderen Anwendungen sammeln will und idese Anwendungen steuern
muss.
Weißt du sonst ein passenderes Forum?
Gruß Ronald
Wie waers mit
dim ie as object
set ie=createobject("internetexplorer.application")
ie.visible=true
Und wenn Du noch einen Verweis auf die MS Internet Controls setzt,
kannst Du mit
dim ie as InternetExplorer
perfekt via Intellisense weitere Erfahrungen sammeln, etwa
ie.Navigate "www.dr-e-pfeifer.net"
Und nun kannst Du noch einen Verweis auf die MS HTML-Bibliothek setzen
und hast das gesamte Dokument im Griff:
Dim doc As HTMLDocument
Set doc = ie.Document
MsgBox doc.body.innerHTML
Viel Spass und vor allem Erfolg.
--
MfG EP
Entwicklung - Beratung - Training (www.dr-e-pfeifer.net)
(Microsoft Certified Application Developer)
while ie.busy
wend
wartet aufs Ende. Es gibt auch was mit readystate=4 oder so, probiers
einfach aus.
vielen Dank für den Hinweis. Ich werde heute abend mit den Verweisen mal
rumspielen.
Leider kann ich createobject nicht verwenden, da ich in meinem Fall ein
laufendes Programm im IE übernehmen muss (sind vorher mehrere Passwort
Abfragen und Batchläufe nötig um die Application im IE zu starten)
Aber den Tip mit den Verweisen finde ich hochinteressant.
Danke
Ronald
"Dr. Eckehard Pfeifer" <pri...@dr-e-pfeifer.newsgroup.de> schrieb im
Newsbeitrag news:emMsZQZO...@TK2MSFTNGP11.phx.gbl...
"Ronald Eichler" schrieb:
> > du hast dich sicher in der Tür geirrt. Hier ist das Excel-Forum.
> > IExplorer is woanders
> nein eigentlich habe ich mich nicht in der Tür geirrt. Es hadelt
> sich um Excel VBA mit eingebunden API. Darum kommt man nicht herum
> wenn man in Excel Daten aus anderen Anwendungen sammeln will und
> idese Anwendungen steuern muss.
> Weißt du sonst ein passenderes Forum?
wenn die andere Anwendung Automatisierungsfähig ist, würde ich auf
jeden Fall auf die API verzichten, obwohl ich sehr gerne mit der API
arbeite.
Der IE zum Bleistift lässt sich sehr schön steuern. Zum Testen kann man
einen Verweis auf die Microsoft Internet Controls und auf die Microsoft
HTML Object Library setzen, dann hilft einem der Objektkatalog und
Intellisense weiter.
Wenn du Ereignisse wie NavigateComplete2 benötigst, musst du aber mit
Klassen arbeiten. Da aber der Code weiterläuft und nicht auf das
Ereignis wartet, musst du die Klasse am Leben erhalten, bis das
Ereignis gefeuert wird. Das kann man mit Objektvariablen oder
Collections auf Modulebene machen.
In dem folgenden, auf die Schnelle zusammengestrickten Bleistift warte
ich aber mit einer Schleife in der Klasse, bis das Ereignis gefeuert
hat.
In eine Klasse mit dem Namen clsIE:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" ( _
ByVal dwMilliseconds As Long _
)
Private WithEvents mobjIE As InternetExplorer
Private mstrUrl As String
Private mblnSichtbar As Boolean
Private mblnComplete As Boolean
Private mlngMyHwnd As Long
Private mobjDocument As HTMLDocument
Private mobjElement As HTMLFormElement
Private mobjForm As IHTMLElementCollection
'http://www.microsoft.com/germany/msdn/library/visualtools
'/vb6/FormularfelderImBrowserAnsprechenUndAuswerten.mspx
' Verweis auf Microsoft Internet Controls
' Verweis auf Microsoft HTML Object Library
Private Sub Class_Initialize()
Set mobjIE = New InternetExplorer
End Sub
Private Sub Class_Terminate()
' Beendet den IE
' mobjIE.Quit
End Sub
Private Sub mobjIE_NavigateComplete2( _
ByVal pDisp As Object, URL As Variant)
MsgBox URL, , "Navigate Complete"
mblnComplete = True
End Sub
Private Sub mobjIE_NavigateError( _
ByVal pDisp As Object, URL As Variant, _
Frame As Variant, StatusCode As Variant, _
Cancel As Boolean)
MsgBox URL, , "Navigate Error"
mblnComplete = True
End Sub
Public Property Let myUrl(ByVal vNewValue As String)
mstrUrl = vNewValue
End Property
Public Property Get MyHwnd() As Long
MyHwnd = mlngMyHwnd
End Property
Public Property Get IeSichtbar() As Boolean
IeSichtbar = mblnSichtbar
End Property
Public Property Let IeSichtbar(ByVal vNewValue As Boolean)
mblnSichtbar = vNewValue
End Property
Public Function GotoUrl() As Boolean
Dim i As Long
mblnComplete = False
mobjIE.Visible = mblnSichtbar
mobjIE.Navigate mstrUrl
Do
Sleep 500
DoEvents
Loop Until mblnComplete
mlngMyHwnd = mobjIE.Hwnd
' Aktuelles HTML-Dokument
Set mobjDocument = mobjIE.Document
Set mobjForm = mobjDocument.forms
Set mobjElement = mobjDocument.documentElement
For i = 0 To mobjElement.all.Length - 1
MsgBox mobjElement.all(i).nodeName
Next
End Function
Folgendermaßen wird die Klasse benutzt:
Option Explicit
Sub test()
Dim IE As clsIE
Set IE = New clsIE
With IE
.myUrl = "michael-schwimmer.de"
.IeSichtbar = True
.GotoUrl
MsgBox .MyHwnd
End With
End Sub
Eine schöne Anleitung dazu (in eine Zeile):
http://www.microsoft.com/germany/msdn/library/visualtools/vb6/Formularfe
lderImBrowserAnsprechenUndAuswerten.mspx
MfG
Michael
--
Michael Schwimmer http://michael-schwimmer.de
Excel VBA ISBN 3-8273-2183-2
Excel Programmierung - Das Handbuch ISBN 3-8606-3548-4
danke mit Hilfe euer Tips ist es mir gelungen, zuhause an meiner
Testumgebung mein VBA warten zu lassen bis der Internet Explorer wieder Zeit
für mich hat.
Ich werde dieses am Montag in der Praxis mal testen und mich wieder melden.
Jede Menge hochachtung vor Euch, da ich immer noch nicht alle Tips
verstanden habe und umsetzten konnte, aber ich arbeite daran.
Viele Grüße Ronald
*************************************
Für die anderen Forum Benutzer meine bisherige Lösung
' Verweis auf Microsoft Internet Controls
sub mein programm
dim ie as Object
blabla...
Set ie = GetIE("Ttitel der Seite vom InternetExplorer")
blabla....
Do While ie.Busy
Loop
blabla....
end sub
Private Function GetIE(ByVal WindowTitle As String) As Object
' Ermitteln des Objektverweises einer bestehenden IE-Instanz,
' hier auf Basis des zu übergebenden Dokumententitels.
Dim objShellWindows As New SHDocVw.ShellWindows
' Fehler beim Zugriff auf die Document-Eigenschaft ignorieren
On Error Resume Next
' Iterieren über alle Shell-Windows
For Each GetIE In objShellWindows
' Ist das Document vom Typ HTMLDocument, handelt es sich um ein
IE-Fenster:
If TypeName(GetIE.Document) = "HTMLDocument" Then
'debug.print GetIE.Document.Title ' Anzeige alle Titles im
Direktfenster
If GetIE.Document.Title = WindowTitle Then
Exit Function ' GetIE hat die passende Referenz
End If
End If
Next GetIE
' Bei fehlendem Erfolg ist 'GetIE' hier 'Nothing'.
' Hinweis: Bei VB.NET wäre das nicht der Fall.
End Function
mein erfahrungsbericht:
Doch toll es funktioniert, aber....
Da die Anwendung im IE die ich steuern will, nicht eine normale html Seite
ist, sondern wie ich schätze Java2 mit mehren Datenbankanfragen, wird wohl
nach jeder Datenbankabfrage ie.busy=false gemeldet. Da die Gesamtanwendung
dann noch nicht fertig ist habe ich eine Subroutine Pause geschrieben, die
über die Timerfunktion für 0,2 Sekunden prüft ob ein ie.busy Ereignis
auftritt, wenn dies Auftritt wird die Timmerfunktion wieder neu begonnen.
Diese Funktion rufe ich in Schleife 10x aus.
Leider führt dieses bisher, da die Anwendung öfter hakt nur in 95% aller
Fälle zum Erfolg.
Bin trotzdem zufrieden, würde aber gern nachbessern und spiele noch an
meiner Pauseroutine.
Nochmals vielen Dank für eure Tips
Gruß Ronald
"Ronald Eichler" <Bierdo...@web.de> schrieb im Newsbeitrag
news:dtl8rr$dgr$02$1...@news.t-online.com...