【VBA】Excel VBAでHTTP通信
ぐぐればいっぱい出てくるけど、断片的にしか見つからないのでまとめる。
MSXML2.XMLHTTPを作成する
VBAからHTTP通信をしたい場合はCreateObject(“MSXML2.XMLHTTP”)でIXMLHTTPRequestオブジェクトを作るのが一番簡単だと思う。XMLHttpRequestはjavascriptでも使用されているので、ノウハウやtipsなどの資料が豊富にある。
Dim httpReq As Object Set httpReq = CreateObject("MSXML2.XMLHTTP")
MSXML2.XMLHTTPのプロパティを設定する
Openメソッドでメソッド、URLを指定する。
varAsyncは
リクエストの成功・失敗に関わらず次の処理を実行する場合があれば、asynFlag を False に。
それ以外は Ture にする。省略すると True で実行。
とのこと。(参考:解説 : XMLHttpRequest)
認証が必要であればbstrUserとbstrPasswordも指定する。
Call httpReq.Open("GET", url, False, user, password)
Openメソッドは実際に通信するわけではなく、どちらかと言うとコンストラクタに近い。実際にリクエストを飛ばすのはSendメソッドとなる。引数にはContentが入るので、Getであれば何も指定しなくて良い。
ちなみに、ここの引数に渡す型はVariantでなければならないのでその点は気をつけよう。
Call httpReq.Open("GET", url, False, user, password) Call httpReq.Send
Call httpReq.Open("POST", url, False, user, password) Dim postData As Variant postData = "name=hoge&body=piyo" Call httpReq.Send(postData)
ヘッダを設定したい場合にはsetRequestHeaderメソッドを使う。
複数指定したい場合はその分だけsetRequestHeaderを呼べばいい。
Call httpReq.Open("POST", url, False, user, password) Call httpReq.setRequestHeader("Content-Type", "application/json;charset=utf-8") Call httpReq.setRequestHeader("User-Agent", "fuga") Dim postData As Variant postData = "name=hoge&body=piyo" Call httpReq.Send(postData)
レスポンスを取得する
Sendした後はStatusプロパティを見て適当に判断し、必要であればresponsTextプロパティを取得する。返ってきたヘッダを取得したい場合はgetResponseHeaderメソッドもしくはgetAllResponseHeadersメソッドを使用する。
Dim respData As String If httpReq.Status = 200 Then respData = httpReq.responseText End If
responseから始まるプロパティは他にもresponseBody(バイトが返ってくる)やresponseStream、responseXMLがあるが、まぁVBAから呼ぶならresponseTextで十分だろう。
ただし、VBAではこのresponseTextで返ってきた文字列を無理矢理utf-8で解釈しようとするため、適宜ADODB.Streamなどでエンコードしてやる必要がある。このあたりを参考にするとよい。