151

从 Excel 电子表格执行 HTTP POST 需要什么 VBA 代码?

4

6 回答 6

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

或者,为了更好地控制 HTTP 请求,您可以使用WinHttp.WinHttpRequest.5.1.MSXML2.ServerXMLHTTP

于 2008-10-01T17:03:29.323 回答
56

如果您需要它同时在 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 函数的参数。
  • 这不适用于没有 VBA 的 Excel for Mac 2008。Excel for Mac 2011 恢复了 VBA。

有关更多详细信息,您可以查看我关于“使用 Excel 中的 Web 服务”的完整摘要。

于 2011-01-06T17:07:15.407 回答
53

除了蜥蜴比尔的回答:

大多数后端解析原始帖子数据。例如,在 PHP 中,您将拥有一个数组$_POST,其中将存储发布数据中的各个变量。在这种情况下,您必须使用附加标头"Content-type: application/x-www-form-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"

于 2013-07-10T12:03:06.183 回答
10

要完成其他用户的响应:

为此,我创建了一个“WinHttp.WinHttpRequest.5.1”对象。

使用 VBA 从 Excel 发送包含一些数据的发布请求:

Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")

使用 VBA 从 Excel 发送带有令牌身份验证的 get 请求:

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send
于 2019-12-11T11:30:36.180 回答
8

您可以ServerXMLHTTP通过添加对MSXML.

  1. 打开 VBA 编辑器(通常通过编辑宏)
  2. 转到可用参考列表
  3. 检查微软 XML
  4. 单击确定。

(来自在 VBA 项目中引用 MSXML

ServerXMLHTTP MSDN 文档包含有关ServerXMLHTTP的所有属性和方法的完整详细信息。

简而言之,它的工作原理基本上是这样的:

  1. 调用open方法连接远程服务器
  2. 调用send发送请求。
  3. 通过responseXMLresponseTextresponseStreamresponseBody读取响应
于 2008-10-01T17:01:08.517 回答
1

我在使用 MSXML 库然后使用 XMLHttpRequest 对象之前执行了此操作,请参见此处

于 2008-10-01T17:03:18.170 回答