2008-10-01 14 views

Antwort

116
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.

+8

Für eine bessere Kontrolle über die HTTP-Anfrage können Sie "WinHttp.WinHttpRequest.5.1" anstelle von "MSXML2.ServerXMLHTTP" verwenden. –

+5

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

+2

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

4

Sie können ServerXMLHTTP in einem VBA-Projekt verwenden, indem Sie einen Verweis auf MSXML hinzufügen.

  1. Öffnen Sie den VBA-Editor (in der Regel durch Bearbeiten eines Makros)
  2. Gehen Sie auf die Liste der verfügbaren Referenzen
  3. prüfen XML Microsoft
  4. 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:

  1. Anruf open Methode zum Remote-Server
  2. Anruf verbinden send die Anfrage zu senden.
  3. Lesen Sie die Antwort über responseXML, responseText, responseStream oder responseBody
+0

dieser Link verwendet Jscript, nicht VBA –

+1

Dank @JohnHenckel. Ich habe einige Änderungen vorgenommen, um diese Antwort auf den neuesten Stand zu bringen. –

49

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."

+3

+1: Ich brauche es nur unter Windows, aber eine plattformübergreifende Lösung könnte jemand anderem zugute kommen. –

+0

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

+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!! –

31

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.

+0

Ich versuche diese Anfrage (mit geschweiften Klammern) zu posten und Kompilierungsfehler zu bekommen ... kann helfen: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle