2017-07-05 7 views
0

Hallo Ich habe dieses seltsame Problem, wo ich Fehler 91 ("Objektvariable oder mit Blockvariable nicht gesetzt") bekomme. Ich bekomme den Fehler nicht immer, wenn ich das Skript ausführe, nur hin und wieder (zufällig). Ich habe versucht, so viel wie möglich ohne Erfolg zu tun.VBA EXCEL Fehler 91 Objektvariable oder mit Blockvariable nicht gesetzt

Ich kratze eine Website, um die neuesten Preise einiger PC-Komponenten zu erhalten.

Um das zu tun, habe ich ein Skript erstellt und das Skript mehrere Male nacheinander für verschiedene Teile aufrufen. Der Fehler bezieht sich nicht auf ein bestimmtes Teil. Ich bekomme den Fehler zufällig auf allen Teilen. Manchmal kann ich alle Anrufe ohne Fehler machen.

Das Skript (nicht das vollständige Skript, nur das, was Sie brauchen):

Sub ImportUrlData(url As String) 

    Dim ie As InternetExplorer 
    Dim html As HTMLDocument 
    Dim varListingIDElement As IHTMLElement 
    Dim varShopName As String 
    varShopName = "" 

    Set ie = New InternetExplorer 
    ie.Visible = False 
    ie.navigate url 

    Do While ie.readyState <> READYSTATE_COMPLETE 
     DoEvents 
    Loop 

    Set html = ie.document 

    Set varListingIDElement = html.getElementById("listing") 
    varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 

Ich erhalte den Fehler immer auf dieser letzten Zeile:

varShopName = getXPathElement("/table/tbody/tr[" & count & "]/td[1]/p/a", varListingIDElement).innerText 

(Der Fehler innerhalb der nicht auftritt 'getXPathElement' Funktion, also keine Notwendigkeit, das auch zu zeigen.Wenn Sie es sich ansehen wollen, fragen Sie einfach und ich poste es hier in einer Bearbeitung.)

Wenn ich von Anfang bis Ende mit F8 debuggen Ich werde nie bekommen der Fehler. Ist es möglich, dass der nächste Anruf bereits beginnt, bevor der vorherige noch nicht fertig ist?

Vielen Dank im Voraus!

(Sorry, wenn es einige holländische Worte, die ich übersehen haben.)

Antwort

0

Es gibt einige Fälle, in denen Sie ein Problem wie dieses begegnen kann (wo F8 ​​immer funktioniert, aber ein normaler Lauf nicht), wenn das Objekt Rückkehr, in welcher Art auch immer, ist nicht vollständig verbunden. Es ist schwer zu sagen, ob dies der Fall ist, und ich habe dies nur festgestellt, wenn ich ein Objekt auf etwas setze, das seinen eigenen Initialisierungsvorgang hat, und wenn dieser Prozess außerhalb der Kontrolle der VBA-Routine liegt.

Für Ihr Problem, und zwar, es gibt ein paar Ansätze können Sie nehmen:

Set varListingIDElement = html.getElementById("listing") 
If Not varListingIDEElement is Nothing Then 
    varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 
End If 

Der obige Ansatz vollständig den Fehler vermeiden sollte, aber es bedeutet auch varShopName kann nicht eingestellt werden.

Auf der anderen Seite:

Set varListingIDElement = html.getElementById("listing") 

Application.Wait(Now + TimeValue("00:00:03")) 

varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 

dies die Anwendung zwingen wird 3 Sekunden zwischen der ersten Einstellung der Variablen zu warten, und der endgültigen Berufung der Variablen. Sie könnten diesen Ansatz verwenden, wenn es sich tatsächlich um ein Problem des vorherigen Prozesses handelt, der nicht vor dem Beginn des neuen Prozesses abgeschlossen wird. Sie können diesen Ansatz auch mit dem ersten kombinieren, um das Beste aus beiden herauszuholen.

Viel Glück!

+0

Ich versuchte nur die erste Annäherung und es arbeitete so lange, dass ich dachte, dass es repariert wurde, bis ich den Fehler wieder erhielt. Jetzt füge ich den zweiten Ansatz hinzu. (Sie haben ein ')' nach 'Application.Wait (Now + TimeValue ("00:00:02")' vergessen. Ich kann es nicht bearbeiten, weil ich mindestens 6 Zeichen hinzufügen oder ändern muss.) –

Verwandte Themen