2008-10-01 1317 views

回答

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("") 

另外,超過您可以代替MSXML2.ServerXMLHTTP使用WinHttp.WinHttpRequest.5.1 HTTP請求更大的控制權。

+8

爲了更好地控制HTTP請求,您可以使用「WinHttp.WinHttpRequest.5.1」而不是「MSXML2.ServerXMLHTTP」 – 2008-10-03 10:23:43

+5

值得注意的是,您也可以通過將「POST」更改爲「PUT」來使用它來發出HTTP PUT。內容到PUT進入.send()方法。您還需要按照User-Agent示例中使用的語法完成您需要設置的任何其他標頭。 – radicand 2012-01-24 04:47:52

4

通過添加對MSXML的引用,您可以在VBA項目中使用ServerXMLHTTP。

  1. 打開VBA編輯器(通常通過編輯宏)
  2. 轉到可用引用列表
  3. 選中Microsoft XML
  4. 單擊確定。

(從Referencing MSXML within VBA Projects

ServerXMLHTTP MSDN documentation具有所有屬性和ServerXMLHTTP的方法的全部細節。

總之,雖然,它的工作原理基本上是這樣的:

  1. 呼叫open方法連接到遠程服務器
  2. 呼叫send發送請求。
  3. 讀通過responseXMLresponseTextresponseStreamresponseBody
+0

該鏈接使用jscript,而不是VBA – 2016-08-19 04:16:24

+1

謝謝@JohnHenckel。我做出了一些更改,以使這個答案保持最新。 – 2016-08-19 11:39:52

49

如果你需要它同時支持Mac和Windows上運行,你可以使用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 

注:

  • 關於輸出...我不知道這是否是可能的將結果返回到調用VBA函數的同一單元格。在上面的例子中,結果寫入A2。
  • 關於輸入...如果希望在更改某些單元格時刷新結果,請確保這些單元格是VBA函數的參數。
  • 這不適用於Mac 2008的Excel,它不具有VBA。 Excel for Mac 2011讓VBA迴歸。

有關更多詳細信息,請參閱「using web services from Excel」的完整摘要。

31

除了對Bill the Lizard的anwser:

大多數後端的解析原始post數據。例如,在PHP中,您將有一個數組$ _POST,其中存儲發佈數據中的各個變量。在這種情況下,你必須使用一個額外的頭「內容類型:應用程序/ x-WWW的形式,進行了urlencoded」:

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

否則,您必須閱讀的變量「$ HTTP_RAW_POST_DATA」原始post數據。