VBA: Readystate = 4 und Laufzeitfehler

Moderator: ModerationP

VBA: Readystate = 4 und Laufzeitfehler

Beitragvon turbosoeckchen » 14. Jun 2019, 11:37

Hallo liebe Leute!

Folgende Frage:
Über ein Makro steuere ich den Internetexplorer, um mir bestimmte Bilder aus dem Internet zu ziehen.

Auf meinem Rechner funktioniert das Makro einwandfrei, jedoch bei einem Kollegen nicht:
Hier kommt es immer zu dem Laufzeitfehler 462 - ...System existiert nicht.

Der Debugger meckert über folgenden Code:
Code: Alles auswählen
              Do Until objIE.ReadyState = 4: DoEvents: Loop


objIE ist der Internetexplorer der vorher gestartet wurde.

Woran könnte das liegen? Auf meinem Rechner funktioniert es einwandfrei, auf einigen anderen nicht.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon 1Matthias » 14. Jun 2019, 20:56

Moin!
Mal als Frage, existiert der IE bei den Rechnern mit Fehler wirklich? Also wird da auch eine Seite angezeigt oder wird gar kein IE gestartet? Das am besten mal im Einelschritt und mit sichtbaren IE testen. Ansonsten könntest du ggf. noch probieren, an stelle von . readystate = 4 mit .busy zu arbeiten. Vermute aber eher mal, dass es zum selben Ergebnis führt. Kannst du sonst mal den anderen COde posten, der davor kommt und wo de IE gestartet wird.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 602
Registriert: 15. Aug 2017, 18:36

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon DerHoepp » 15. Jun 2019, 19:09

Moin,

bei externen Bibliotheken hängst du am Fliegenfänger. Unterstützt eine Version nicht mehr alle Eigenschaften der Vorversion, wird es einen Fehler geben (du könntest noch dazuschreiben, wie der fehler wirklich heißt und was du sonst so machst). Ich persönlich würde auf das Ganze Gepäck des IE-Verzichten und einfach ein xmlhttp-Objekt und ein HTMLDocument als Objekte nutzen. Die können eigentlich alles, ohne die Seite auch darstellen zu wollen.

Viele Grüße
derHÖpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8143
Registriert: 14. Mai 2013, 11:08

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon theoS » 15. Jun 2019, 20:11

Ich persönlich würde auf das Ganze Gepäck des IE-Verzichten und einfach ein xmlhttp-Objekt und ein HTMLDocument als Objekte nutzen.

Jetzt würde mich bei deiner Methode interessieren, wie du das löst, wenn du dich an eine Seite anmelden musst (https) und dann angemeldet weitermachen.
Dafür habe ich bis jetzt noch keine Lösung. Alles was ich zu dem Thema gefunden hatte war mit gewöhnlichem http.
Hast du da ein Beispiel?
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4707
Registriert: 19. Apr 2008, 00:14

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon DerHoepp » 17. Jun 2019, 19:55

Hallo Theo,
Sobald es um sessiontokens, cookietokens und tls-handshakes geht, würde ich bei meinem aktuellen Kenntnisstand auf Python umschwenken. Ich schaffe es derzeit nicht in VBA einen ordentlichen REST-Header mit Tokenverifikation zu setzen. Das steht aber auf meiner to-learn Liste der nächsten Jahre. Aber, soviel kann ich schon mal verraten, Probleme mit Tls-Handshakes bei https Seiten sind in hohem Maße von der Serverseitigen Umgebung abhängig.Cookkes und SessionIDs sind davon unabhängig aber nicht weniger komplex. Pauschale Antworten passen da leider nie (aber ich glaube, das hatten wir schon mal, ohne konkrete Angabe des serverskripts ist Hilfe schwierig).
Viele Grüße
DerHoepp
Vom Mobiltelefon gesendet
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8143
Registriert: 14. Mai 2013, 11:08

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon Fen » 17. Jun 2019, 20:33

@DerHoepp

ich dachte, ich hätte etwas über http-headers gelernt, aber was ist ein "Rest-header"?

Bis jetzt lese ich headers entweder im Browser-debugger im Reiter "Netzwerk" (cntr-shift-E) oder mit curl -I aus, z.B.

cmd:>curl -I www.office-loesung.de

oder VBA

Code: Alles auswählen
MSXML2.ServerXMLHttp
hd = .GetAllRespsonseHeaders
Srv = .GetResponseHeader("Server")


mfg
Fen
 

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon theoS » 18. Jun 2019, 05:46

Schätze SET sollte das heissen. GET krieg ich hin, aber set geht nur ohne https.
Also doch weiter das ie-object.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4707
Registriert: 19. Apr 2008, 00:14

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon DerHoepp » 18. Jun 2019, 08:16

DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8143
Registriert: 14. Mai 2013, 11:08

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon Fen » 18. Jun 2019, 09:40

@DerHoepp:

auch wenn ich keinen direkten Zusammenhang mit der ursprünglichen Frage erkennen kann:

M.W.n. kann MSXML2 alle in dem Wiki genannten http-Protokolle (head, option usw) abschicken genauso wie beliebige header-Informationen. Da "gute" Webseiten aber gegen CSRF ua geschützt sind, müssen header und Cookies parallel übergeben werden. Die Syntax ist so kompliziert, dass gute Beispiele notwendig sind.

Bei einem oder zwei Versuchen kam ich ziemlich "ins Schleudern".

mfg
Fen
 

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon DerHoepp » 18. Jun 2019, 11:48

Hallo fen,

ich bin auf Theos Zusatzfrage eingegangen. Und meine letzte Herausforderung war es eben, eine REST-API zu bedienen. Daran bin ich gescheitert.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8143
Registriert: 14. Mai 2013, 11:08

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon turbosoeckchen » 19. Jun 2019, 11:44

DerHoepp hat geschrieben:Moin,

bei externen Bibliotheken hängst du am Fliegenfänger. Unterstützt eine Version nicht mehr alle Eigenschaften der Vorversion, wird es einen Fehler geben (du könntest noch dazuschreiben, wie der fehler wirklich heißt und was du sonst so machst). Ich persönlich würde auf das Ganze Gepäck des IE-Verzichten und einfach ein xmlhttp-Objekt und ein HTMLDocument als Objekte nutzen. Die können eigentlich alles, ohne die Seite auch darstellen zu wollen.

Viele Grüße
derHÖpp


Hallo Ihr beiden.

Schon einmal vielen Dank für eure Antworten.

Hier der Code, der durchgegeangen wird:

Code: Alles auswählen
Sub Gesamthebel()
    Application.ScreenUpdating = False
    Dim i As Integer
    Call public_work.work
    Dim objIEDoc As Object
    Dim strURL As String
    Dim objIE As Object
    Dim objBildURL As Object
    Dim BildURL As String
    Dim x As Integer
    Dim bildAs Object
    Dim Nr As String
   
    Dim objNr As Object
    Dim objMetaTag As Object
   
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
   
    Dim m As Integer


   
   
    For x = 1 To m 'Anfang Werte durchgehen
        If gesamt.Cells(x, 1) = "x" Then 'Anfang Bildauswahl
            strURL = ""
            With objIE
                .Navigate strURL
                Do Until objIE.ReadyState = 4: DoEvents: Loop
               
'                While .Busy
'                Application.Wait (Now + TimeValue("00:00:01"))
'                Wend
               
                Set objIEDoc = .document
            End With
           
            With objIEDoc
                Set cover = .getElementsByClassName("row product")(0)
                Set objMetaTag = cover.getElementsByTagName("meta")
                    If Not objMetaTag Is Nothing Then
                    'Alle Meta-Tags durchgehen und auf das Attribut itemprop = "sku" prüfen
                        For Each objNr In objMetaTag
                            If objNr.getAttribute("itemprop") = "sku" Then
                                Nr = objNr.getAttribute("content")
                                gesamt.Cells(x, 2).Value = Nr
                                Exit For
   
                            End If
                        Next objNr
                    End If
            End With
        End If 'Ende Auswahl
    Next x 'Ende Werte durchgehen
   
    Set objIEDoc = Nothing
    Set cover = Nothing
    Set objNr = Nothing
    Set objMetaTag = Nothing
    Set objIE = Nothing
end sub


Die busy-Methode funktioniert, jedoch eher mittelprächtig, da z.T. nicht lange genug gewartet wird.
Am Freitag kann ich die genaue Fehlerbschreibung posten, dann habe ich wieder Zugang zu den Rechnern auf denen es nicht funktioniert.

@derHoepp

Hast du ggf. irgendwo ein Tutorial wie das ganze mit dem xmlhttp funktioniert. Das hört sich interessant an, nur habe ich diesbezüglich noch keine Erfahrung.
PS:
Natürlich steht in der URL eine valide Variable.
Der IE wird ebenfalls als neues Objekt geöffnet, hat aber scheinbar schon eine Startseite.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon turbosoeckchen » 25. Jun 2019, 14:33

Hallo,

ich wollte mich nur noch einmal hier kurz melden und die Fehlermeldung posten:
Bild
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon Zwenn » 25. Jun 2019, 16:40

Hallo turbosoeckchen,

da Du nun den Code gepostet hast, fallen mir zwei Dinge dazu ein:
  • Du verwendest schon Application.wait. Es kann durchaus sein, dass der IE meldet, er sei nicht mehr beschäftigt und die Schleife wird trotzdem zu früh verlassen. Viele Webseiten laden nochmal Code nach. Z.B. in iFrames. Setze die Application.wait Zeile einfach nochmal hinter die Schleife und warte manuell ein paar Sekunden ab. Ich würde konservativ mit 5 Sekunden starten. Wenn das geht, kannst Du die Zeit reduzieren, bis Du einen Wert hast, mit dem es stabil läuft. Stabil heißt, bei jedem Aufruf.
  • Es kann auch sein, dass der IE "verloren geht". Dann muss man ihn erstmal wieder einfangen und kann dann weitermachen. Code muss ich nachsehen. Nimm das erstmal als Hinweis und prüfe ob du mit Application.wait schon ans Ziel kommst.

Noch als Hinweis: Ohne die richtige URL sind solche Probleme schwer zu lösen, weil die Helfer nix selbst ausprobieren können. Das bedeutet auch, niemand weiß, ob Du die Vorschläge richtig angewendet hast.

Viele Grüße,

Zwenn
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon Zwenn » 26. Jun 2019, 12:00

Hallo nochmal,

für den Automatisierungsfehler gibt es auch den Grund, dass im IE das automatische Löschen von Coockies und Cache beim Beenden eingeschaltet ist. Dann versucht das Makro den IE erneut zu starten, der ist aber noch mit Löschen beschäftigt. Also das automatische Löschen ausschalten. Ob der IE eine Startseite hat spielt meines Wissens nach keine Rolle. Obwohl ich die auch immer auf blank setze.

Ich habe mal Deinen geposteten Code überarbeitet und ein paar Anmerkungen reingeschrieben. Ausserdem habe ich alle nicht verwendeten Variablen rausgeschmissen. Das Deklarieren aller Variablen gehört immer an den Anfang eines Makros. Verwende unbedingt Option Explicit als erste Zeile in jedem Modul, um zur Variablendeklaraiton gezwungen zu werden.

Code: Alles auswählen
Sub Gesamthebel()
 
  Dim x As Integer
  Dim m As Integer
  Dim strURL As String
  Dim Nr As String
  Dim objIE As Object
  Dim cover As Object '<-- War nicht deklariert
  Dim objNr As Object
  Dim objMetaTag As Object
 
  Application.ScreenUpdating = False '<-- Wozu?
  Call public_work.work '<-- Was macht diese Zeile?
 
  'Anfang Werte durchgehen
  For x = 1 To m '<-- Woher kommt der Wert für m?
    'Anfang Bildauswahl
    If gesamt.Cells(x, 1) = "x" Then '<-- Woher kommt die Tabelle gesamt?
      strURL = "" '<-- Echte URL wäre hilfreich
     
      'IE bei unabhängigen Seitenaufrufen für mehrere URLs immer in der
      'Schleife initialisieren und vor dem nächsten Schleifendurchlauf
      'beenden. Weil der IE bei vielen Aufrufen nacheinander innerhalb
      'einer Instanz nicht immer stabil läuft
      '
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.Visible = True
      objIE.Navigate strURL
      Do Until objIE.ReadyState = 4: DoEvents: Loop
     
      Set cover = objIE.document.getElementsByClassName("row product")(0)
      Set objMetaTag = cover.getElementsByTagName("meta")
      If Not objMetaTag Is Nothing Then
      'Alle Meta-Tags durchgehen und auf das Attribut itemprop = "sku" prüfen
        For Each objNr In objMetaTag
          If objNr.getAttribute("itemprop") = "sku" Then
            Nr = objNr.getAttribute("content")
            gesamt.Cells(x, 2).Value = Nr
            Exit For
          End If
        Next objNr
      End If
    End If 'Ende Auswahl
   
    'Aufräumen
    objIE.Quit
    Set objIE = Nothing
    Set cover = Nothing
    Set objNr = Nothing
    Set objMetaTag = Nothing
  Next x 'Ende Werte durchgehen
End Sub


Es wäre einfacher Dir zu helfen, wenn Du eine Mappe mit dem gesamten Code und mit der richtigen URL zur Verfügung stellst.

Viele Grüße,

Zwenn
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18

Re: VBA: Readystate = 4 und Laufzeitfehler

Beitragvon turbosoeckchen » 27. Jun 2019, 17:07

Zwenn hat geschrieben:Hallo nochmal,

für den Automatisierungsfehler gibt es auch den Grund, dass im IE das automatische Löschen von Coockies und Cache beim Beenden eingeschaltet ist. Dann versucht das Makro den IE erneut zu starten, der ist aber noch mit Löschen beschäftigt. Also das automatische Löschen ausschalten. Ob der IE eine Startseite hat spielt meines Wissens nach keine Rolle. Obwohl ich die auch immer auf blank setze.

Ich habe mal Deinen geposteten Code überarbeitet und ein paar Anmerkungen reingeschrieben. Ausserdem habe ich alle nicht verwendeten Variablen rausgeschmissen. Das Deklarieren aller Variablen gehört immer an den Anfang eines Makros. Verwende unbedingt Option Explicit als erste Zeile in jedem Modul, um zur Variablendeklaraiton gezwungen zu werden.

Code: Alles auswählen
Sub Gesamthebel()
 
  Dim x As Integer
  Dim m As Integer
  Dim strURL As String
  Dim Nr As String
  Dim objIE As Object
  Dim cover As Object '<-- War nicht deklariert
  Dim objNr As Object
  Dim objMetaTag As Object
 
  Application.ScreenUpdating = False '<-- Wozu?
  Call public_work.work '<-- Was macht diese Zeile?
 
  'Anfang Werte durchgehen
  For x = 1 To m '<-- Woher kommt der Wert für m?
    'Anfang Bildauswahl
    If gesamt.Cells(x, 1) = "x" Then '<-- Woher kommt die Tabelle gesamt?
      strURL = "" '<-- Echte URL wäre hilfreich
     
      'IE bei unabhängigen Seitenaufrufen für mehrere URLs immer in der
      'Schleife initialisieren und vor dem nächsten Schleifendurchlauf
      'beenden. Weil der IE bei vielen Aufrufen nacheinander innerhalb
      'einer Instanz nicht immer stabil läuft
      '
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.Visible = True
      objIE.Navigate strURL
      Do Until objIE.ReadyState = 4: DoEvents: Loop
     
      Set cover = objIE.document.getElementsByClassName("row product")(0)
      Set objMetaTag = cover.getElementsByTagName("meta")
      If Not objMetaTag Is Nothing Then
      'Alle Meta-Tags durchgehen und auf das Attribut itemprop = "sku" prüfen
        For Each objNr In objMetaTag
          If objNr.getAttribute("itemprop") = "sku" Then
            Nr = objNr.getAttribute("content")
            gesamt.Cells(x, 2).Value = Nr
            Exit For
          End If
        Next objNr
      End If
    End If 'Ende Auswahl
   
    'Aufräumen
    objIE.Quit
    Set objIE = Nothing
    Set cover = Nothing
    Set objNr = Nothing
    Set objMetaTag = Nothing
  Next x 'Ende Werte durchgehen
End Sub


Es wäre einfacher Dir zu helfen, wenn Du eine Mappe mit dem gesamten Code und mit der richtigen URL zur Verfügung stellst.

Viele Grüße,

Zwenn


Hallo Zwenn,

vielen Dank für deinen Hinweis.
Zu aller erst: Interessanter Weise funktioniert der Code nun auch auf meinen Endgeräten nicht mehr. Nach einem bzw. mehreren Updates möchte der Code jetzt auf den Rechnern die vorher keine Probleme bereitet haben, nicht mehr laufen.
Ich kann mir also vorstellen, dass die Updates Einstellungen verändern, ohne das ich das bemerke.
Bezüglich der Anmerkungen im Code:

Ich habe in einem anderen Makro recht viele Public Variablen deklariert, da auch andere Makros auf die immer gleichen Variablen zugreifen. Da ich keine Lust hatte, eine endlose Menge Variablen immer wieder neu zu definieren, sind die alle in einem eigenständigen Modul ausgelagert. Variablen, die nicht in dem Skript aufgeführt sind, werden dort definiert und mit Werten versehen.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 Gäste