エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法


wait

photo credit: indrarado I’ve been to Lisbon via photopin (license)

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

エクセルVBAでIEを操作する便利なクラスの作り方をお伝えしています。

前回の記事はコチラ。

エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
エクセルVBAでIEによるスクレイピングをするときに便利なクラスの作り方をシリーズでお伝えしています。InternetExplorerを操作するクラスでWebページを開くメソッドを追加する方法です。

クラスIEObjectに指定のURLを開くNavigateメソッドを追加しました。

今回は、IEで開いたページからドキュメントを取得していきます。

また、ドキュメントを取得する前に読み込み待ちの処理も必要ですよね…

ということで、エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法です。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

まずは前回のおさらいからです。

これまでで作成したIEを操作するクラスIEObjectはこちらです。

Public IE As InternetExplorer

Private Sub Class_Initialize()
    Set IE = New InternetExplorer
    IE.Visible = True
End Sub

Private Sub Class_Terminate()
    IE.Quit
End Sub

Public Sub Navigate(ByVal url As String)
    IE.Navigate url
End Sub

パブリック変数によるIEプロパティでInternetExplorerオブジェクトを持たせて、コンストラクタでその生成と表示を行います。

Navigateメソッドは、そのInternetExplorerオブジェクトで指定のURLのページを開くメソッドです。

デストラクタでそのInternetExplorerを閉じます。

それで、標準モジュールで以下のようなプロシージャを実行すると、IEを表示して、URLのページを開き、IEを閉じるという動作が実現できます。

Sub MySub()
    
    Dim ieObj As IEObject: Set ieObj = New IEObject
    ieObj.Navigate "https://tonari-it.com"
    
    Stop
    
End Sub

さて、IEでページを開いたらスクレイピングをしたいわけですから、そのドキュメントを取得しないといけませんよね。

今回はその機能をクラスに追加していきますよ。

IEを操作するクラスでHTMLドキュメントを取得する

開いているWebページのHTMLドキュメントを取得するには、InternetExplorerオブジェクトのDocumentプロパティを使うのでした。

InternetExplorerオブジェクト.Document

これでHTMLDocumentオブジェクトを取得できます。

HTMLドキュメントについては、以下の記事もどうぞご参考ください。

【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
初心者向けエクセルVBAでIEを操作するシリーズの第2回目です。今回はHTMLタグと要素について簡単に説明をしつつIEで開いたページのHTMLドキュメントを取得する方法についてお伝えします。

これを格納する場所と、格納する処理をIEObjectクラスに追加していきます。

HTMLドキュメントを格納するプロパティ

まず、HTMLドキュメントの格納先はパブリック変数で良いですね。

以下の一文をIEObjectクラスの宣言セクションに追加します。

Public Document As HTMLDocument

これで、プロパティとしてHTMLドキュメントを取得することもできますね。

HTMLドキュメントの取得

そして、その取得ですが、Propertyプロシージャでもいいのですが、Navigateメソッドでページにアクセスしたときに自動で取得してもいいですよね。

なので、Navigateメソッド内にHTMLドキュメントの取得の処理を追加しちゃいます。

Public Sub Navigate(ByVal url As String)
    IE.Navigate url
    Set Document = IE.Document
End Sub

Navigateメソッドからすぐにドキュメントを取得することはできない

では、実行して動作確認をしてみましょうか。

標準モジュールのプロシージャを以下のように変更して…

Sub MySub()
    
    Dim ieObj As IEObject: Set ieObj = New IEObject
    ieObj.Navigate "https://tonari-it.com"
    
    Debug.Print ieObj.Document.Title
    
End Sub

実行!

オートメーションエラー

はい、出ましたオートメーションエラー…!

そうなんです。

IEがWebページを開き切る前に、ドキュメントを取得しにいってしまうので、エラーになってしまうのです。

読み込み待ちをするWaitメソッドを追加する

ということで、IEObjectクラスに読み込み待ちの対策も入れて行きましょう。

まず、以下のように、Waitという読み込み待ち用のメソッドを追加します。

Public Sub Wait()
    Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop   
End Sub

この処理はいつもの定番的なやつなので、クラス化にもってこいです。

詳しくは以下の記事もどうぞご覧ください。

【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
エクセルVBAでIEを操作するシリーズの第3回、今回はIEの読み込み待ちの処理を入れていきます。この処理はVBAでIEを扱う限りはほとんどの場合で必要となる処理ですので、ぜひ覚えて頂ければと思います。

そして、このWaitメソッドを、Navigateメソッドのドキュメントの取得前に呼び出せばOKですね。

こんな感じです。

Public Sub Navigate(ByVal url As String)
    IE.Navigate url
    Wait
    Set Document = IE.Document
End Sub

これで、SubプロシージャMySubを実行して確認してみましょう。

HTMLドキュメントのタイトルを表示

無事にドキュメントが取得できているようですね。

まとめ

以上、エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法をお伝えしました。

ドキュメントの取得や、読み込み待ち…これらの処理はIE操作では、いっつもやりますもんね。

クラス化をするとスッキリしますし、再利用が簡単です。

ぜひご活用を…!

次回は、ドキュメントからいろいろな要素を取得していきます。

エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを追加していきます。

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作するクラスを作る

エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。
  1. エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
  2. エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
  3. エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
  4. エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
  5. エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
  6. エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
  7. エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
  8. エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
  9. エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
  10. エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する

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