Welcher VBA-Code ist erforderlich, um einen HTTP-POST aus einer Excel-Tabelle auszuführen?Wie kann ich eine HTTP-POST-Anfrage von Excel an einen Server mit VBA senden?
Antwort
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")
Alternativ kann für eine bessere Kontrolle über die HTTP-Anforderung Sie WinHttp.WinHttpRequest.5.1
anstelle von MSXML2.ServerXMLHTTP
verwenden können.
Sie können ServerXMLHTTP in einem VBA-Projekt verwenden, indem Sie einen Verweis auf MSXML hinzufügen.
- Öffnen Sie den VBA-Editor (in der Regel durch Bearbeiten eines Makros)
- Gehen Sie auf die Liste der verfügbaren Referenzen
- prüfen XML Microsoft
- Klicken Sie auf OK.
(von Referencing MSXML within VBA Projects)
Die ServerXMLHTTP MSDN documentation hat weitere Informationen über alle Eigenschaften und Methoden der ServerXMLHTTP. obwohl
Kurz gesagt, es funktioniert im Grunde wie folgt:
- Anruf open Methode zum Remote-Server
- Anruf verbinden send die Anfrage zu senden.
- Lesen Sie die Antwort über responseXML, responseText, responseStream oder responseBody
dieser Link verwendet Jscript, nicht VBA –
Dank @JohnHenckel. Ich habe einige Änderungen vorgenommen, um diese Antwort auf den neuesten Stand zu bringen. –
ich dies tat, bevor Sie die MSXML-Bibliothek und dann das XMLHttpRequest-Objekt. Siehe http://scriptorium.serve-it.nl/view.php?sid=40
Wenn Sie es brauchen auf Mac und Windows zu arbeiten, können Sie Querytables:
With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
.PostText = "origin_airport=MSN&destination_airport=ORD"
.RefreshStyle = xlOverwriteCells
.SaveData = True
.Refresh
End With
Hinweise:
- Bezüglich Ausgabe ... Ich weiß nicht, ob es möglich ist zu Geben Sie die Ergebnisse an dieselbe Zelle zurück, die die VBA-Funktion aufgerufen hat. Im obigen Beispiel wird das Ergebnis in A2 geschrieben.
- In Bezug auf Eingabe ... Wenn die Ergebnisse aktualisiert werden sollen, wenn Sie bestimmte Zellen ändern, stellen Sie sicher, dass diese Zellen das Argument für Ihre VBA-Funktion sind.
- Dies funktioniert nicht auf Excel für Mac 2008, die nicht über VBA verfügt. Excel für Mac 2011 hat VBA zurück.
Für weitere Details können Sie meine vollständige Zusammenfassung über "using web services from Excel."
+1: Ich brauche es nur unter Windows, aber eine plattformübergreifende Lösung könnte jemand anderem zugute kommen. –
Ich glaube nicht, dass Sie tatsächlich auf den HTML-Code zugreifen können, können Sie nur die Informationen auf der gerenderten Webseite erhalten (nicht den tatsächlichen HTML-Code) – user1493046
+1 für die Cross-Plattform-Lösung und +1 (wenn ich könnte) für die vollständige zusammenfassung mit dem gist link und all. Vielen Dank!! –
Neben dem anwser von Bill the Lizard:
Die meisten der Backends analysieren die rohen Post-Daten. In PHP zum Beispiel haben Sie ein Array $ _POST, in dem einzelne Variablen innerhalb der Post-Daten gespeichert werden.In diesem Fall müssen Sie einen zusätzlichen Header "Content-Type: application/x-www-form-urlencoded": Verwenden Sie
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")
Ansonsten haben Sie die rohen Post-Daten auf die Variable "$ HTTP_RAW_POST_DATA" zu lesen.
Ich versuche diese Anfrage (mit geschweiften Klammern) zu posten und Kompilierungsfehler zu bekommen ... kann helfen: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle
Für eine bessere Kontrolle über die HTTP-Anfrage können Sie "WinHttp.WinHttpRequest.5.1" anstelle von "MSXML2.ServerXMLHTTP" verwenden. –
Beachten Sie, dass Sie dies auch verwenden können, um einen HTTP-PUT durch Ändern von "POST" in "PUT" auszugeben. Inhalt zu PUT wird in der .send() -Methode verwendet. Alle zusätzlichen Header, die Sie festlegen müssen, können auch entsprechend der im User-Agent-Beispiel verwendeten Syntax ausgeführt werden. – radicand
Bitte verwenden Sie keine Klammern um Parameter, wenn Sie den Rückgabewert des Subs nicht verwenden: VBA Syntax erlaubt keine Klammern um Subs Parameter (sie werden jedoch für Funktionen benötigt), also sind diese Klammern tatsächlich arithmetische Klammern, um die Rangfolge des Operators zu klären . Abgesehen davon, dass es irreführend und unklar ist, kann dies zu einem Laufzeitfehler führen, wenn das Argument ein Objekt ist. Und obwohl nicht ausdrücklich verlangt, würden Sie normalerweise die HTTP-Antwort verwenden, die Sie erwähnen könnten, kann durch 'objHTTP.responseText' abgerufen werden. – Leviathan