みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでHTTPリクエストを行う方法についてお伝えしております。
前回の記事はコチラ。
エクセルVBAでHTTPリクエストをする方法をお伝えしました。
しかし、この方法で取得したHTMLドキュメントは”文字列”なんですね。
正規表現を使って処理をすることはできますが、getElement~メソッドを使ってIDやClass、タグ名などを使って要素を取り出すということが残念ながらできません。
ということで、今回はエクセルVBAでHTTPリクエストにより取得したHTMLテキストから、HTMLドキュメントオブジェクトを生成する方法をお伝えします。
つまり、IEを使わずにHTMLドキュメントを取得するということになります。
では、行ってみましょう。
前回のおさらいと今回のお題
まずおさらいからです。
前回のプログラムはこちらです。
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
それぞれ新しいステートメントばかりでしたが、流れとしては以下の通りです。
- 3,4行目:IXMLHTTPRequestオブジェクトの生成とセット
- 6行目:IXMLHTTPRequestオブジェクトにメソッドとURLを与えて初期化
- 7行目:リクエストを送信
- 9~11行目:読み込み待ち
- 13行目:レスポンスから本体テキストをデバッグ出力
- 15行目:IXMLHTTPRequestオブジェクトを破棄
結果として、イミディエイトウィンドウにはこのブログのトップページのHTMLが「文字列」で出力されます。
しかし、取得したものはHTMLドキュメントオブジェクトではないので、getElement~メソッドなどで配下の要素を取得したりすることができません。
HTML文字列からHTLMドキュメントを生成する
そこで、今回取得したHTML文字列から、HTMLドキュメントを生成したいと思います。
HTMLドキュメントオブジェクトは、その名の通りHTMLドキュメントを操作するためのオブジェクトですので、それに変換ができれば、用意されている様々なメソッドやプロパティで解析をしたり、操作をしたりすることができるようになります。
さて、HTMLドキュメントへの変換手順としては以下のようになります。
- HTTPレスポンスからHTML文字列を取得
- 空のHTMLドキュメントオブジェクトを生成
- 空のHTMLドキュメントにHTML文字列を書き込む
ですから、生成というよりは、書き込むという感じですね。
Microsoft HTML Object Libraryを追加する
HTMLドキュメントオブジェクトを使いますので、参照設定から「Microsoft HTML Object Library」を追加します。
前回の「Microsoft XMLライブラリ」の追加方法と同じですが、VBEのメニュー「ツール」→「参照設定」を開いて…
「Microsoft HTML Object Library」をcheckして「OK」です。
HTMLドキュメントの生成とセット
これで準備はOKですので、空のHTMLドキュメントを生成して、変数にセットしていきます。
書式は以下の通りです。
Set 変数名 = New HTMLDocument
変数の宣言をObject型ではなくて、HTMLDocument型にしたくなりますが、ここはObject型でないとダメみたいです(理由はハッキリしていないので、もしご存知の方がいればご一報を…!)。
ライブラリを使わない場合
ライブラリの追加が面倒な場合は、CreateObject関数で
としてもHTMLドキュメントの生成は可能です。
ただ、データ型だけでなく、HTMLオブジェクトの長~いメソッド名などについての補完を使いたいのなら、ライブラリを追加したほうがいいでしょうね。
HTMLドキュメントにHTML文字列を書き込む
続いて、空のHTMLドキュメントにHTML文字列を書き込んでいきます。
その場合は、writeメソッドを使います。
HTTPリクエストで取得したテキストからHTMLドキュメントを生成する
では、実際にプログラムを作ってみましょう。
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
Dim htmlDoc As Object
Set htmlDoc = New HTMLDocument
htmlDoc.write httpReq.responseText
Debug.Print htmlDoc.Title
Debug.Print htmlDoc.getElementsByTagName("p")(0).innerText
Set htmlDoc = Nothing
Set httpReq = Nothing
End Sub
今回追加した部分は13~21行目ですね。
実行をすると、イミディエイトウィンドウに以下のように出力がされます。
これで、IEを使わずにHTMLドキュメントの解析ができますね。
まとめ
エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法をお伝えしました。
- HTMLドキュメントについて
- writeメソッドでHTML文字列をHTMLドキュメントに書き込む
IEを使うほうが比較的簡単かつ視覚的に動作がわかりやすい、フォームなどの操作もしやすいなどのメリットがありますが、今回紹介した方法は高速かつIEに依存しない処理が可能です。
場合に応じて使い分けるといいですね。
次回は、HTTPリクエストを使ってAPIを操作する方法をお伝えしていきます。
どうぞお楽しみに!