VBAを使用してExcelからサーバーにHTTP POSTリクエストを送信するにはどうすればよいですか?


回答:


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

または、の代わりに使用WinHttp.WinHttpRequest.5.1して、HTTPリクエストをより詳細に制御できますMSXML2.ServerXMLHTTP


9
HTTPリクエストをより詳細に制御するには、「MSXML2.ServerXMLHTTP」の代わりに「WinHttp.WinHttpRequest.5.1」を使用できます
Matthew Murdoch

5
注目すべきは、「POST」を「PUT」に変更することで、これを使用してHTTP PUTを発行することもできることです。PUTするコンテンツは.send()メソッドに入れます。設定する必要がある追加のヘッダーは、User-Agentの例で使用されている構文に従っても実行できます。
radicand 2012年

7
Subの戻り値を使用しない場合は、パラメーターの前後にかっこを使用しないでください。VBA構文では、Subのパラメーターの前後にかっこを使用できません(ただし、関数には必要です)。これらのかっこは、演算子の優先順位を明確にするために実際に使用される算術かっこです。誤解を招きやすく不明確であるだけでなく、引数がオブジェクトである場合、これは最終的にランタイムエラーになる可能性があります。また、明示的に要求されていませんが、通常はで取得できるHTTP応答を使用することをお勧めしますobjHTTP.responseText
Leviathan

4
@Leviathan括弧は、実際にはもっとよります:彼らはVBAのランタイムを作る値として式を評価し、方法のByValに渡し かかわらず、メソッドのシグネチャが言うかどうかのByRefか。そのため、既定のメンバーを持たない型のオブジェクト変数でそれらを使用すると、実行時エラーが発生します。オブジェクトにそれらを使用しないデフォルトのメンバーを持って、実際のオブジェクトではなく、デフォルトのメンバーの値を渡します。
Mathieu Guindon 2017年

1
百万回ありがとうございます。他の例では表示されなかったため、理由はわかりませんが、「User-Agent」ヘッダーは私にとって非常に重要でした。それ以外の場合、リクエストで本文が送信されなかったためです。
redOctober13

51

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サービスの使用」に関する私の完全な要約をご覧ください。


3
+1:私はWindowsでのみ必要ですが、クロスプラットフォームソリューションは他の誰かに利益をもたらす可能性があります。
マシューマードック

実際にHTMLコードにアクセスできるとは思いません。実際のHTMLコードではなく、レンダリングされたWebページの情報しか取得できません
user1493046

1
クロスプラットフォームソリューションの場合は+1、要旨リンクを含む完全な要約の場合は+1(可能な場合)。ありがとう!!
空爆

私はWindowsとMacの両方をサポートする必要があり、このソリューションは正しかった!PostTextを指定する場合、URLはPOSTリクエストを処理する必要があります。それ以外の場合は、GETリクエストを処理する必要があります。
amolk 2013年

1
結果をRangeではなく変数に出力することは可能ですか?Jsonの構文解析を行う必要があります。
Stanislasdrgがモニカを復活

42

anwserに加え、トカゲのビル

ほとんどのバックエンドは生の投稿データを解析します。たとえば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"


1
私はこのリクエストを(中括弧で)投稿してコンパイルエラーを取得しようとしています... can u pls help: "{" request ":{" carName ":" Honda "、" model ":" 1A5 "}}"
フィドル

6

ServerXMLHTTPへの参照を追加することにより、VBAプロジェクトで使用できますMSXML

  1. VBAエディターを開く(通常はマクロを編集して)
  2. 利用可能な参照のリストに移動します
  3. Microsoft XMLを確認する
  4. OKをクリックします。

VBAプロジェクト内でのMSXMLの参照から)

ServerXMLHTTPのMSDNドキュメントは、 ServerXMLHTTPでのすべてのプロパティとメソッドについての完全な詳細を持っています。

要するに、基本的には次のように機能します。

  1. オープンコールメソッドをてリモートサーバーに接続します
  2. コール送信をてリクエストをします。
  3. 経由で応答を読む responseXMLresponseTextresponseStreamまたはresponseBodyを

1
そのリンクはVBAではなくjscriptを使用しています
John Henckel

1
@JohnHenckelに感謝します。その答えを最新のものにするために、いくつか変更を加えました。
Mark Biek

3

他のユーザーの応答を完了するには:

このために、「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

デビッド、リクエストを送信したら、どのようにレスポンスを読みますか?
ps0604

応答は内部にありTCRequestItem Object、次のように読むことができます。実行TCRequestItem.ResponseTextTCRequestItem.send
David Q

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.