エクセルVBAでHTTPリクエストをする最も簡単なプログラム


request

photo credit: MTSOfan Art Here via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルからまさかHTTP通信をするときが来るなんて思ってもみなかったのですが、いよいよこのときがやってきました。

エクセルVBAでチャットワークAPIを活用する方法をシリーズでお伝えしていきます。

実際、GASのほうが簡単に実装できるのですが、企業によってはG Suiteが使いづらいという状況もあるようでして、実はニーズがあるようなのです。

今まで、気が付かずに申し訳ありませんでした。

てか、エクセルVBAとチャットワークの連携なんて、私が書かないで誰が書くんだ?というネタのはずなのに…

ということで、元気よくやって来ましょう。

まず、最初はチャットワークAPIを使う事前準備として、HTTPリクエストを送れるようにならないといけません。

ということで、エクセルVBAでHTTPリクエストをする最も簡単なプログラムを紹介します。

スポンサーリンク

HTTP通信の仕組み…HTTPリクエストとHTTPレスポンスとは

まず、HTTP通信の仕組みについて簡単に説明します。

HTTP通信は、私たちがブラウザを使ってURLにアクセスしたり、フォームに情報を入力して送信したりといったときに使われる通信方式です。

その際に、具体的には以下のようなことが行われています。

  1. ブラウザから以下のデータを渡しつつ「このデータをくださいな」とWebサーバーにリクエスト(HTTPリクエスト
    • リクエスト行:リクエストの種類を表すメソッド(GETやPOSTなど)、URLなど
    • ヘッダー:ブラウザの種類とか、クッキーとかいろいろ
    • ボディ:データ本体(空の場合も)
  2. URL先のサーバーがそれを受信して、何らかのレスポンスを返します(HTTPレスポンス
    • レスポンス行:リクエストの状態を表すステータスコードなど
    • ヘッダー:Webサーバーの情報など
    • ボディ:データ本体

簡単に言うと、HTTPリクエストをして、HTTPレスポンスを受け取るのです。

VBAでもHTTPリクエストをする仕組みと、HTTPレスポンスの中身を取り出す仕組みが用意されています。

Microsoft XMLライブラリを追加

HTTP通信をする機能は、「Microsoft XMLライブラリ」で提供されていますので、まず追加をしていきましょう。

VBEを開いて、メニューから「ツール」→「参照設定」です。

エクセルVBAで参照設定を開く

「参照設定」ダイアログが開くので、大量のライブラリファイルの中から「Microsoft XML, v6.0」を探しだしてチェックを入れてOKをしてください。

エクセルVBAでXMLv60ライブラリを追加する

これで、準備完了です。

エクセルVBAでHTTPリクエストをする

では、実際にHTTPリクエストをするプログラムを作ってみましょう。

エクセルVBAでHTTPリクエストをする場合にはIXMLHTTPRequestオブジェクトを使います。

IXMLHTTPRequestオブジェクトは、VBAからHTTPリクエストを送る際の設定をしたり、実際のリクエストを送ったりする機能を持っています。

リクエストのためのオブジェクトの生成とセット

まずは、このIXMLHTTPRequestオブジェクト用の変数の準備と、生成、セットをします。

Dim 変数名 As XMLHTTP60
Set 変数名 = New XMLHTTP60

これで、IXMLHTTPRequestオブジェクトの生成とセットが完了しました。

ライブラリを使わない場合

ちなみにですが、ライブラリを追加せずにCreateObject関数を使って

Set 変数名 = CreateObject(“MSXML2.XMLHTTP“)

としても、IXMLHTTPRequestオブジェクトの生成ができます。

ただ、ライブラリを追加しておいたほうがオブジェクトブラウザーにメンバーが登場したり、メンバー候補が使えたりして、進めやすいので今回はライブラリを追加しています。

慣れている人は好きなほうを選らんでOKです。

Openメソッドでリクエストの初期化をする

続いて、Openメソッドを使って、IXMLHTTPRequestオブジェクトの初期化をします。

なんとなく、Openだとリクエスト送っちゃいそうですが、まだ送りません。

書式はこうです。

IXMLHTTPRequestオブジェクト.Open メソッド, URL

メソッドは、ほとんどの場合GETかPOSTなのですが、URLにアクセスするとか、API経由でデータをもらうだけのときはGETが多いですかね。

フォームに情報を送るなどの、こちらからデータを送りたいときはPOSTを使ったりします。

Sendメソッドでリクエストを送信する

準備ができたらSendメソッドでリクエストを送信します。

書式はシンプル。

IXMLHTTPRequestオブジェクト.Send

これで送信できます。

readyStateプロパティで読み込み待ち

リクエストを送ると通信が発生しますので、返事が返ってくるまでに時間がかかります。

返事が来たかを確認してから次の処理に進まないとエラーになってしまいます。

そこで、readyStateプロパティを使います。

IXMLHTTPRequestオブジェクト.readyState

この値は0から4までの整数になっていて、「4」になれば完了です。

ですので、以下処理を挟めば読み込み待ちとなります。

Do While httpReq.readyState < 4
    DoEvents
Loop

レスポンスからテキストを取り出す

読み込みが完了すると、IXMLHTTPRequestオブジェクトにはWebサーバーからのお返事が届いているはず…

そこからレスポンスのデータを取り出すには、responseTextプロパティを使います。

IXMLHTTPRequestオブジェクト.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ドキュメントオブジェクトを取得する方法です。

エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法
エクセルVBAでHTTPリクエストにより取得したHTML文字列から、HTMLドキュメントオブジェクトを生成する方法です。つまり、IEを使わずにHTMLドキュメントを取得することができるようになります。

どうぞお楽しみに!

連載目次:エクセルVBAでチャットワークAPIにリクエストする方法

エクセルVBAではIXMLHTTPRequestオブジェクトを使うことでHTTP通信を行うことができます。このシリーズではエクセルVBAからHTTPリクエストを行うことで、チャットワークAPIを活用する方法を紹介していきます。
  1. エクセルVBAでHTTPリクエストをする最も簡単なプログラム
  2. エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法
  3. エクセルVBAでチャットワークAPIにリクエストを送る最も簡単なプログラム
  4. エクセルVBAでチャットワークに最もシンプルなメッセージを送る方法
  5. エクセルVBAでマクロの実行完了と処理時間をチャットワークに通知する方法

コメント

  1. sgunji より:

    Objectのスペルが違いますよ!

    Set 変数名 = CreateObjetct(“MSXML2.XMLHTTP“)
     →Set 変数名 = CreateObject(“MSXML2.XMLHTTP“)

タイトルとURLをコピーしました