Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

XMLHTTP - ResponseText aktualisieren

Forumthread: XMLHTTP - ResponseText aktualisieren

XMLHTTP - ResponseText aktualisieren
08.12.2022 15:07:24
Speedy
Hallo Forum,
ich erzeuge mittels MSXML2.XMLHTTP und responseText ein htmlDocument, da ich administrativ kein Internet Explorer Application öffnen kann.
Das klassische und auch ehemals funktionierende:

Set ieApp = CreateObject("InternetExplorer.Application")
funktioniert nicht mehr.
Die alternative Lösung war das html-Dokument über die Funktion:

Function DataRead(Optional Link As String = "", _
Optional ByRef XMLReqAnfrage As MSXML2.XMLHTTP60)
Dim XMLReq As MSXML2.XMLHTTP60
Dim htmlDoc As New MSHTML.htmlDocument
Dim HTMLLinks As MSHTML.IHTMLElementCollection
Dim HTMLLink As MSHTML.IHTMLElement
Dim Hy As Hyperlink
If UCase(TypeName(XMLReqAnfrage)) = "NOTHING" And Link  "" Then
Set XMLReq = New MSXML2.XMLHTTP60
XMLReq.Open "Get", Link, False
Set XMLReqAnfrage = XMLReq
XMLReq.send
ElseIf Link = "" Then
Set DataRead = Nothing
Exit Function
Else
Set XMLReq = aktXMLReq
End If
Do Until XMLReq.Status = 200
Sleep 100
Loop
htmlDoc.body.innerHTML = XMLReq.responseText
Set DataRead = htmlDoc
End Function
auszulesen... funktioniert
Jetzt habe ich aber festgestellt, dass die Seite noch in Englisch angezeigt wird...
Hier kann ich über eine Schleife nach dem entsprechenden "HTMLSelectElement" suchen und es mittels

For Each Element In my_Elements.all
If InStr(1, UCase(Element.outerText), "DEUTSCH")  0 And _
Element.Selected = False and _
TypeName(Element) = "HTMLSelectElement" Then
Element.Selected = True
End If
Next Element
auch umschalten. Nur ändert das ja nichts an meinem eingelesenen responseText.
Gibt es eine Möglichkeit dies:
1. im Vorfeld schon auf Deutsch umzustellen oder
2. das htmlDocument über das Event "onchange" zu aktualisieren oder
3. das MSXML2.XMLHTTP60 als globale Variable nach der Aktualisierung (die Frage wäre hier wie ich dieses aktualisiere) neu einzulesen
- Senden von Parameteren mittels MSXML2.XMLHTTP60.Open "POST", ...
Hier komme ich einfach nicht weiter ... :-(
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: XMLHTTP - ResponseText aktualisieren
08.12.2022 15:20:37
Zwenn
Hallo Speedy,
generell ist xhr (XML HTTP Request, den Du mit MSXML2.XMLHTTP60 verwendest) statisch. Das bedeutet, Du kannst genau ein Dokument vom WebServer abfragen und dieses ist und bleibt dann genau so, wie es ist. Du kannst darin keinen Button anklicken, keine Auswahl in einem Dropdown auswählen oder sonst etwas machen, auf das Du eine Reaktion erwartest. Also, kannst Du schon, nur xhr ist nicht interaktiv und es passiert dann einfach nix, weil es keine weitere Kommunikation mit dem WebServer gibt. Auch JavaScript wird nicht ausgeführt.
Um sich das anzusehen müsstest Du den Link angeben. Ob sich da was über POST statt GET regeln lässt kann man so nicht sagen. Das kommt darauf an, was im Hintergrund passiert, wenn im Browser die Sprache gewechselt wird. Vielleicht kann man die deutsche Version der Seite auch gar nicht über xhr abrufen. Dann bliebe noch der Weg über SeleniumBasic. Das muss allerdings installiert werden, was Du auf Deinem Arbeitsrechner evtl. nicht darfst.
Viele Grüße,
Zwenn
Anzeige
AW: XMLHTTP - ResponseText aktualisieren
08.12.2022 15:29:34
Speedy
Hallo Zwenn,
erst einmal danke und Hut ab für die rassannt schnelle Antwort... Auch wenn diese mir nicht so gefällt, ich diese aber schon erwartet habe.
Da die Hoffnung aber zum Schluss stirbt hier mal der Link:
https://www.sapdatasheet.org/abap/func/
vielen Dank im Voraus...
Anzeige
AW: XMLHTTP - ResponseText aktualisieren
08.12.2022 17:37:24
Zwenn
Also die Sprache wird über ein Cookie gesetzt und das geht nicht über xhr, wie es aussieht. Ich habe selber recherchieren müssen und bin auf eine Lösung über einen WinHTTP Request gekommen. Dies ist ein Minimalbeispiel. Wenn Du im Direktfenster ganz nach oben scrollst (in der IDE mit Strg+G aufrufen), solltest Du den HTML Code für Eintrag 482 sehen (der Rest darüber wird nicht mehr im Direktfenster angezeigt, wurde aber geladen) und da siehst Du, dass als Erklärung Puffer initialisieren statt Initialize Buffer  drin steht. Also Deutsch.

Sub SAP()
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", "https://www.sapdatasheet.org/abap/func/", True
.setRequestHeader "Cookie", "sap-desc-langu=D"
.send
.WaitForResponse
Debug.Print .responseText
End With
End Sub

Anzeige
AW: XMLHTTP - ResponseText aktualisieren
09.12.2022 09:46:05
Speedy
Super... danke
werde es zeitnah testen und noch einmal ein Feedback geben...
Danke...
AW: XMLHTTP - ResponseText aktualisieren
09.12.2022 10:38:29
Speedy
Super... funktioniert einwandfrei...
Noch einmal Tausend Dank
Ergebnis für das einlesen sieht nun so aus:

Function DataRead(Optional Link As String = "")
Dim my_winhttpReq As WinHttpRequest
Set my_winhttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
With my_winhttpReq
.Open "GET", Link, True
.setRequestHeader "Cookie", "sap-desc-langu=D"
.send
.waitForResponse
htmlDoc.body.innerHTML = .responseText
End With
Set DataRead = htmlDoc
End Function
Danke
Anzeige
AW: XMLHTTP - ResponseText aktualisieren
09.12.2022 10:45:46
Speedy
Sorry...
kleine Korrektur an der Funktion:

Function DataRead(Link As String)
Dim my_winhttpReq As WinHttpRequest
Dim htmlDoc As New htmlDocument
Set my_winhttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
With my_winhttpReq
.Open "GET", Link, True
.setRequestHeader "Cookie", "sap-desc-langu=D"
.send
.waitForResponse
htmlDoc.body.innerHTML = .responseText
End With
Set DataRead = htmlDoc
End Function
hatte vergessen htmlDoc zu dimensionieren :-)
so geht's
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

XMLHTTP - ResponseText aktualisieren in Excel VBA


Schritt-für-Schritt-Anleitung

Um mit MSXML2.XMLHTTP oder WinHttp.WinHttpRequest in Excel VBA HTTP-Anfragen zu stellen, kannst du folgende Schritte befolgen:

  1. Referenzen hinzufügen: Stelle sicher, dass du die benötigten Objekte in deinem VBA-Projekt verwendest. Du kannst das durch das Hinzufügen von Verweisen auf Microsoft XML, v6.0 und Microsoft HTML Object Library tun.

  2. Funktion erstellen: Verwende den folgenden Code, um eine Funktion zu erstellen, die eine GET-Anfrage an eine URL sendet:

    Function DataRead(Link As String) As MSHTML.HTMLDocument
       Dim my_winhttpReq As WinHttpRequest
       Dim htmlDoc As New MSHTML.HTMLDocument
       Set my_winhttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    
       With my_winhttpReq
           .Open "GET", Link, True
           .setRequestHeader "Cookie", "sap-desc-langu=D"
           .send
           .WaitForResponse
           htmlDoc.body.innerHTML = .responseText
       End With
    
       Set DataRead = htmlDoc
    End Function
  3. Aufruf der Funktion: Du kannst die Funktion dann aufrufen, um Daten von einer bestimmten URL abzurufen.

    Sub TestDataRead()
       Dim doc As MSHTML.HTMLDocument
       Set doc = DataRead("https://www.sapdatasheet.org/abap/func/")
       Debug.Print doc.body.innerHTML
    End Sub

Häufige Fehler und Lösungen

  1. Fehler: "Status 200" wird nicht erreicht
    Lösung: Stelle sicher, dass die URL korrekt ist und dass du die Anfrage mit WaitForResponse abschließt, bevor du auf den responseText zugreifst.

  2. Fehler: Die Sprache wird nicht geändert
    Lösung: Um die Sprache zu ändern, musst du den Cookie setzen, wie im obigen Beispiel gezeigt (.setRequestHeader "Cookie", "sap-desc-langu=D").


Alternative Methoden

Wenn du mit MSXML2.XMLHTTP Probleme hast, kannst du stattdessen WinHttp.WinHttpRequest verwenden. Dieses Objekt ist in der Lage, Cookies zu handhaben und ist oft zuverlässiger für HTTP-Anfragen.

Ein Beispiel für eine POST-Anfrage könnte so aussehen:

Sub PostData()
    Dim httpReq As WinHttpRequest
    Set httpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

    With httpReq
        .Open "POST", "https://example.com/api", True
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .send "param1=value1&param2=value2"
        Debug.Print .responseText
    End With
End Sub

Praktische Beispiele

Um die Funktionalität von xmlhttp60 zu demonstrieren, hier ein Beispiel für das Abrufen von Daten:

Sub GetSAPData()
    Dim htmlDoc As MSHTML.HTMLDocument
    Set htmlDoc = DataRead("https://www.sapdatasheet.org/abap/func/")
    MsgBox htmlDoc.body.innerHTML
End Sub

Tipps für Profis

  • Nutze Debug.Print regelmäßig, um den Inhalt von responseText während der Entwicklung zu überprüfen.
  • Experimentiere mit den Headern, die du mit .setRequestHeader festlegst, um unterschiedliche Antworten von dem Server zu erhalten.
  • Wenn du mit JavaScript interagieren musst, ziehe die Verwendung von Selenium in Betracht, da XMLHTTP keine JavaScript-Ausführung unterstützt.

FAQ: Häufige Fragen

1. Wie kann ich eine HTTPS-Anfrage senden?
Die oben genannten Methoden funktionieren sowohl für HTTP als auch für HTTPS, solange der Server die Verbindung akzeptiert.

2. Was mache ich, wenn die Seite nicht geladen wird?
Überprüfe die URL und stelle sicher, dass du die richtige Methode (GET oder POST) verwendest. Achte auch darauf, dass alle erforderlichen Header gesetzt sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige