Microsoft Excel

Herbers Excel/VBA-Archiv

Kurioser Logik-Fehler (DOM des IE)

Betrifft: Kurioser Logik-Fehler (DOM des IE) von: Zwenn
Geschrieben am: 22.10.2014 16:56:11

Hallo zusammen,

leider fällt mir keine Kurzbeschreibung für meine Beobachtung ein. Deshalb versuche ich zu veranschaulichen, was in meiner Funktion passiert bzw. nicht passiert.

Ich greife über das DOM des IE auf die Struktur einer HTML Seite zu. Um festzustellen, ob es sich um die richtige Seite handelt oder ob eine Fehlerseite geliefert wurde, frage ich ab, ob bestimmte HTML-Tags enthalten sind.

Da es sich bei dem HTML-Dokument um ein Objekt handelt, werden abgefragte Tags auch als Objekte zurück geliefert. Ist ein Tag jedoch nicht vorhanden, kann das entsprechende Objekt nicht erzeugt werden, was der IE 11 mit einer Fehlermeldung quittiert (zu IE 8 Zeiten wurde einfach NULL zurückgegeben bzw. man konnte auf "Is Nothing" testen).

Um diesen Fehler nun abzufangen und den Umstand auszunutzen, dass er aufgetreten ist, ist die einzige Möglichkeit "On Error Goto". Genau diese Fehlerbehandlung habe ich in eine Funktion ausgelagert, die entweder "true" (Tag gefunden) oder "false" (Fehler ausgelöst, weil das Objekt nicht erstellt werden konnte) zurück liefert.

Das funktioniert auch genau so, wie gewünscht. Allerdings nur mit einem Trick. Ich verstehe allerdings ums verrecken nicht, warum dieser Trick angewendet werden muss.

Der Code meiner Funktion:


Function TagVorhanden(oIE As Object, pruef_tag As String) As Boolean

Dim knoten As Object
Dim dummy As String

    On Error GoTo TagNichtGefunden
    Set knoten = oIE.document.getElementsByTagName(pruef_tag)
    dummy = knoten
    TagVorhanden = True

Exit Function
    
TagNichtGefunden:
    TagVorhanden = False

End Function



Ich übergebe das Objekt oIE, welches das HTML-Dokument enthält. Außerdem den HTML-Tag, auf den geprüft werden soll. Wird der Tag nicht gefunden, wird "false" zurück gegeben. Das funktioniert immer. Wird der Tag aber gefunden, wird nur "true" zurück gegeben, wenn vorher etwas mit dem erzeugten Objekt "knoten" angestellt wird.

Wird die Zeile dummy = knoten auskommetiert, gibt die Funktion "irgend etwas" zurück, aber niemals "true".

Weiß irgend jemand, warum das so ist und was zurück gegeben wird? Ich bin schon fast irre geworden, bis ich rausgefunden hatte, wie das passiert, was ich erwarte, verstehe das Verhalten aber nicht.

Viele Grüße,

Zwenn

  

Betrifft: Das wird kein Logik-Fehler sein, sondern ggf ... von: Luc:-?
Geschrieben am: 22.10.2014 17:50:47

…mit dem Err-Objekt zusammenhängen, Zwenn,
denn einer String-Variablen ein Objekt zuzuweisen ist ja nur dann sinnvoll, wenn in diesem Fall das Objekt die Standard­Eigenschaft .Value bzw .Text hat. Warum das nur so mit deiner Fkt fktioniert, kann ich dir auch nicht sagen, aber probiere doch mal Folgendes aus:

Function TagVorhanden(oIE As Object, pruef_tag As String) As Boolean
    On Error Resume Next
    If IsError(oIE.document.getElementsByTagName(pruef_tag)) Then 
        TagVorhanden = False
    Else: TagVorhanden = True
    End If
End Function
Das kann man in diesem Bsp auch nicht einfacher (bzw andersherum) schreiben, weil bei Auftreten eines Fehlers (wg Resume Next) immer die nächste Anweisung ausgeführt wird.
Gruß, Luc :-?


  

Betrifft: AW: Das wird kein Logik-Fehler sein, sondern ggf ... von: Zwenn
Geschrieben am: 23.10.2014 09:42:45

Hallo Luc:-?,

danke für den Hinweis auf IsError. Daran habe ich vor lauter Betriebsblindheit gar nicht gedacht. Meine erste Version der Funktion enthielt auch On Error Resume Next, was aber mehr Problem als Lösung war. Deshalb bin ich umgeschwenkt und habe mich dann verbissen.

Da im Moment alles so funktioniert, wie ich es brauche und noch ettliche andere Funktionalitäten ins Makro müssen, stelle ich den Test deines Vorschlags erstmal zurück (Makro muss fertig werden und es gibt Menschen, die denken, man muss nur drei Zeilen tippen für die Eierlegende-Wollmilchsau und das kann doch alles nicht so lange dauern. Ich sitze da schon zwei Tage länger dran, als "jemand" erwartet hat ;-) Dafür wirds gut :-))

Ich gebe aber nochmal eine Rückmeldung, wenn ich es getestet habe.

Gruß,

Zwenn


  

Betrifft: AW: Kurioser Logik-Fehler (DOM des IE) von: Tino
Geschrieben am: 22.10.2014 18:01:34

Hallo,
habe dies jetzt nicht ausgiebig getestet.
Müsste der Code nicht in etwa so gehen?

    Set knoten = oIE.Document.getElementsByTagName(pruef_tag)
    dummy = knoten.Item(0).tagname
    TagVorhanden = True
Warum dir ein Boolean-Datentyp was anderes zurückgibt wie Wahr o. Falsch (True o. False)
kann ich mir nicht erklären! Oder wie kommst Du zu der erkenntnis?

Gruß Tino


  

Betrifft: AW: Kurioser Logik-Fehler (DOM des IE) von: Zwenn
Geschrieben am: 23.10.2014 09:47:40

Hallo Tino,

auch dir besten Dank für deinen Beitrag. Die Funktion, die ich gepostet habe funktioniert so, wie sie dort steht. Sie liefert bei den richtigen Eingabeparametern "true", wenn dummy = knoten als (überflüssige) Codezeile drin steht. Nehme ich die Zeile raus, liefert die Funktion bei gleichen Eingabeparametern aber "false" zurück.

Meine Frage ist: Warum ist das so?

Gruß,

Zwenn


  

Betrifft: bei mir ist es anders?! von: Tino
Geschrieben am: 23.10.2014 13:07:46

Hallo,
bei mir ist es dann anders?! (auch IE 11)

die Zeile

Set knoten = oIE.document.getElementsByTagName(pruef_tag)

(ohne dummy = knoten)
läuft bei mir nie auf einen Fehler, egal was in pruef_tag steht!
Also die Function gibt immer True zurück!

Setze ich Deine Zeile dummy = knoten rein,
wird immer ein Fehler erzeugt und die Funktion gibt immer False aus!
(wegen On Error GoTo TagNichtGefunden)

Gruß Tino


  

Betrifft: Das wäre ja ein Indiz dafür, dass der Fehler ... von: Luc:-?
Geschrieben am: 23.10.2014 17:10:02

…ganz woanders entsteht und nur bis zu dieser Stelle „mitgezogen“ wird, Zwenn (& Tino)!
Gruß, Luc :-?


  

Betrifft: AW: Das wäre ja ein Indiz dafür, dass der Fehler ... von: Zwenn
Geschrieben am: 24.10.2014 13:49:19

Den Verdacht habe ich auch bereits. Leider komme ich erst nächste Woche dazu mir das nochmal genauer anzusehen. Ich will es vor allem rausfinden, um keine böse Überraschung an anderer Stelle zu erleben und keinen direkten Ansatz zu haben, wo ich suchen muss.

Gruß,

Zwenn