エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法


create-document

photo credit: wuestenigel Pen pointing a word via photopin (license)

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

エクセルVBAでHTTPリクエストを行う方法についてお伝えしております。

前回の記事はコチラ。

エクセルVBAでHTTPリクエストをする最も簡単なプログラム
今回はエクセルVBAでHTTPリクエストをする最も簡単なプログラムをお伝えします。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ドキュメントへの変換手順としては以下のようになります。

  1. HTTPレスポンスからHTML文字列を取得
  2. 空のHTMLドキュメントオブジェクトを生成
  3. 空のHTMLドキュメントにHTML文字列を書き込む

ですから、生成というよりは、書き込むという感じですね。

Microsoft HTML Object Libraryを追加する

HTMLドキュメントオブジェクトを使いますので、参照設定から「Microsoft HTML Object Library」を追加します。

前回の「Microsoft XMLライブラリ」の追加方法と同じですが、VBEのメニュー「ツール」→「参照設定」を開いて…

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

「Microsoft HTML Object Library」をcheckして「OK」です。

エクセルVBAでHTML Object Libraryを追加

HTMLドキュメントの生成とセット

これで準備はOKですので、空のHTMLドキュメントを生成して、変数にセットしていきます。

書式は以下の通りです。

Dim 変数名 As Object
Set 変数名 = New HTMLDocument

変数の宣言をObject型ではなくて、HTMLDocument型にしたくなりますが、ここはObject型でないとダメみたいです(理由はハッキリしていないので、もしご存知の方がいればご一報を…!)。

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

ライブラリの追加が面倒な場合は、CreateObject関数で

Set 変数名 = CreateObject("htmlfile")

としてもHTMLドキュメントの生成は可能です。

ただ、データ型だけでなく、HTMLオブジェクトの長~いメソッド名などについての補完を使いたいのなら、ライブラリを追加したほうがいいでしょうね。

HTMLドキュメントにHTML文字列を書き込む

続いて、空のHTMLドキュメントにHTML文字列を書き込んでいきます。

その場合は、writeメソッドを使います。

HTMLDocumentオブジェクト.write HTML文字列

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行目ですね。

実行をすると、イミディエイトウィンドウに以下のように出力がされます。

エクセルVBAで生成したHTMLドキュメントの内容を出力

これで、IEを使わずにHTMLドキュメントの解析ができますね。

まとめ

エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法をお伝えしました。

  • HTMLドキュメントについて
  • writeメソッドでHTML文字列をHTMLドキュメントに書き込む

IEを使うほうが比較的簡単かつ視覚的に動作がわかりやすい、フォームなどの操作もしやすいなどのメリットがありますが、今回紹介した方法は高速かつIEに依存しない処理が可能です。

場合に応じて使い分けるといいですね。

次回は、HTTPリクエストを使ってAPIを操作する方法をお伝えしていきます。

エクセルVBAでチャットワークAPIにリクエストを送る最も簡単なプログラム
今回は、エクセルVBAでチャットワークAPIにリクエストを送る最も簡単なプログラムを紹介します。チャットワークAPIのリクエストURLについて、トークンの取得方法、ヘッダーのセットの方法などがポイントです。

どうぞお楽しみに!

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

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

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