Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1388to1392
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kurioser Logik-Fehler (DOM des IE)

Kurioser Logik-Fehler (DOM des IE)
22.10.2014 16:56:11
Zwenn
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

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das wird kein Logik-Fehler sein, sondern ggf ...
22.10.2014 17:50:47
Luc:-?
…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 :-?

Anzeige
AW: Das wird kein Logik-Fehler sein, sondern ggf ...
23.10.2014 09:42:45
Zwenn
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

Anzeige
AW: Kurioser Logik-Fehler (DOM des IE)
22.10.2014 18:01:34
Tino
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

AW: Kurioser Logik-Fehler (DOM des IE)
23.10.2014 09:47:40
Zwenn
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

Anzeige
bei mir ist es anders?!
23.10.2014 13:07:46
Tino
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

Das wäre ja ein Indiz dafür, dass der Fehler ...
23.10.2014 17:10:02
Luc:-?
…ganz woanders entsteht und nur bis zu dieser Stelle „mitgezogen“ wird, Zwenn (& Tino)!
Gruß, Luc :-?

Anzeige
AW: Das wäre ja ein Indiz dafür, dass der Fehler ...
24.10.2014 13:49:19
Zwenn
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige