読者です 読者をやめる 読者になる 読者になる

【VBA】Excel VBAでHTTP通信

VBA snippet

ぐぐればいっぱい出てくるけど、断片的にしか見つからないのでまとめる。

MSXML2.XMLHTTPを作成する

VBAからHTTP通信をしたい場合はCreateObject(“MSXML2.XMLHTTP”)でIXMLHTTPRequestオブジェクトを作るのが一番簡単だと思う。XMLHttpRequestjavascriptでも使用されているので、ノウハウやtipsなどの資料が豊富にある。

Dim httpReq As Object
Set httpReq = CreateObject("MSXML2.XMLHTTP")

MSXML2.XMLHTTPのプロパティを設定する

Openメソッドメソッド、URLを指定する。
varAsyncは

リクエストの成功・失敗に関わらず次の処理を実行する場合があれば、asynFlag を False に。
それ以外は Ture にする。省略すると True で実行。

とのこと。(参考:解説 : XMLHttpRequest

認証が必要であればbstrUserとbstrPasswordも指定する。

URLのエンコードをしたい場合はこのあたりが参考になる。

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(バイトが返ってくる)やresponseStreamresponseXMLがあるが、まぁVBAから呼ぶならresponseTextで十分だろう。

ただし、VBAではこのresponseTextで返ってきた文字列を無理矢理utf-8で解釈しようとするため、適宜ADODB.Streamなどでエンコードしてやる必要がある。このあたりを参考にするとよい。

参考