みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルからまさかHTTP通信をするときが来るなんて思ってもみなかったのですが、いよいよこのときがやってきました。
エクセルVBAでチャットワークAPIを活用する方法をシリーズでお伝えしていきます。
実際、GASのほうが簡単に実装できるのですが、企業によってはG Suiteが使いづらいという状況もあるようでして、実はニーズがあるようなのです。
今まで、気が付かずに申し訳ありませんでした。
てか、エクセルVBAとチャットワークの連携なんて、私が書かないで誰が書くんだ?というネタのはずなのに…
ということで、元気よくやって来ましょう。
まず、最初はチャットワークAPIを使う事前準備として、HTTPリクエストを送れるようにならないといけません。
ということで、エクセルVBAでHTTPリクエストをする最も簡単なプログラムを紹介します。
HTTP通信の仕組み…HTTPリクエストとHTTPレスポンスとは
まず、HTTP通信の仕組みについて簡単に説明します。
HTTP通信は、私たちがブラウザを使ってURLにアクセスしたり、フォームに情報を入力して送信したりといったときに使われる通信方式です。
その際に、具体的には以下のようなことが行われています。
- ブラウザから以下のデータを渡しつつ「このデータをくださいな」とWebサーバーにリクエスト(HTTPリクエスト)
- リクエスト行:リクエストの種類を表すメソッド(GETやPOSTなど)、URLなど
- ヘッダー:ブラウザの種類とか、クッキーとかいろいろ
- ボディ:データ本体(空の場合も)
- URL先のサーバーがそれを受信して、何らかのレスポンスを返します(HTTPレスポンス)
- レスポンス行:リクエストの状態を表すステータスコードなど
- ヘッダー:Webサーバーの情報など
- ボディ:データ本体
簡単に言うと、HTTPリクエストをして、HTTPレスポンスを受け取るのです。
VBAでもHTTPリクエストをする仕組みと、HTTPレスポンスの中身を取り出す仕組みが用意されています。
Microsoft XMLライブラリを追加
HTTP通信をする機能は、「Microsoft XMLライブラリ」で提供されていますので、まず追加をしていきましょう。
VBEを開いて、メニューから「ツール」→「参照設定」です。
「参照設定」ダイアログが開くので、大量のライブラリファイルの中から「Microsoft XML, v6.0」を探しだしてチェックを入れてOKをしてください。
これで、準備完了です。
エクセルVBAでHTTPリクエストをする
では、実際にHTTPリクエストをするプログラムを作ってみましょう。
エクセルVBAでHTTPリクエストをする場合にはIXMLHTTPRequestオブジェクトを使います。
IXMLHTTPRequestオブジェクトは、VBAからHTTPリクエストを送る際の設定をしたり、実際のリクエストを送ったりする機能を持っています。
リクエストのためのオブジェクトの生成とセット
まずは、このIXMLHTTPRequestオブジェクト用の変数の準備と、生成、セットをします。
Set 変数名 = New XMLHTTP60
これで、IXMLHTTPRequestオブジェクトの生成とセットが完了しました。
ライブラリを使わない場合
ちなみにですが、ライブラリを追加せずにCreateObject関数を使って
としても、IXMLHTTPRequestオブジェクトの生成ができます。
ただ、ライブラリを追加しておいたほうがオブジェクトブラウザーにメンバーが登場したり、メンバー候補が使えたりして、進めやすいので今回はライブラリを追加しています。
慣れている人は好きなほうを選らんでOKです。
Openメソッドでリクエストの初期化をする
続いて、Openメソッドを使って、IXMLHTTPRequestオブジェクトの初期化をします。
なんとなく、Openだとリクエスト送っちゃいそうですが、まだ送りません。
書式はこうです。
メソッドは、ほとんどの場合GETかPOSTなのですが、URLにアクセスするとか、API経由でデータをもらうだけのときはGETが多いですかね。
フォームに情報を送るなどの、こちらからデータを送りたいときはPOSTを使ったりします。
Sendメソッドでリクエストを送信する
準備ができたらSendメソッドでリクエストを送信します。
書式はシンプル。
これで送信できます。
readyStateプロパティで読み込み待ち
リクエストを送ると通信が発生しますので、返事が返ってくるまでに時間がかかります。
返事が来たかを確認してから次の処理に進まないとエラーになってしまいます。
そこで、readyStateプロパティを使います。
この値は0から4までの整数になっていて、「4」になれば完了です。
ですので、以下処理を挟めば読み込み待ちとなります。
Do While httpReq.readyState < 4
DoEvents
Loop
レスポンスからテキストを取り出す
読み込みが完了すると、IXMLHTTPRequestオブジェクトにはWebサーバーからのお返事が届いているはず…
そこからレスポンスのデータを取り出すには、responseTextプロパティを使います。
HTMLドキュメントを取得するVBAプログラム
では、以上を踏まえてプログラムを作ってみましょう。
Sub HTTPリクエスト()
Dim httpReq As XMLHTTP60
Set httpReq = New XMLHTTP60
httpReq.Open "GET", "https://tonari-it.com/"
httpReq.Send
Do While httpReq.readyState < 4
DoEvents
Loop
Debug.Print httpReq.responseText
Set httpReq = Nothing
End Sub
実行すると、イミディエイトウィンドウにHTMLテキストが出力されます(全部表示できないですけどね)。
ちなみに、15行目ではIXMLHTTPRequestオブジェクトを破棄してあげています。
まとめ
エクセルVBAでHTTPリクエストをする最も簡単なプログラムを紹介しました。
- HTTP通信、HTTPリクエストとHTTPレスポンスとは
- IXMLHTTPRequestオブジェクトとその一連の使い方
わかってしまえば、そんなに難しくないですかね。
逆に、色々やらなくてはいけないので、HTTP通信の仕組みの理解は進むかもです(ポジティブ)。
では、次回はレスポンスを使ってHTMLドキュメントオブジェクトを取得する方法です。
どうぞお楽しみに!
コメント
Objectのスペルが違いますよ!
Set 変数名 = CreateObjetct(“MSXML2.XMLHTTP“)
→Set 変数名 = CreateObject(“MSXML2.XMLHTTP“)
sgunjiさん
ご指摘ありがとうございます!
修正させていただきました。