みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEを操作する便利なクラスの作り方をお伝えしています。
前回の記事はコチラ。
クラス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プロパティを使うのでした。
これでHTMLDocumentオブジェクトを取得できます。
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
この処理はいつもの定番的なやつなので、クラス化にもってこいです。
詳しくは以下の記事もどうぞご覧ください。
そして、このWaitメソッドを、Navigateメソッドのドキュメントの取得前に呼び出せばOKですね。
こんな感じです。
Public Sub Navigate(ByVal url As String)
IE.Navigate url
Wait
Set Document = IE.Document
End Sub
これで、SubプロシージャMySubを実行して確認してみましょう。
無事にドキュメントが取得できているようですね。
まとめ
以上、エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法をお伝えしました。
ドキュメントの取得や、読み込み待ち…これらの処理はIE操作では、いっつもやりますもんね。
クラス化をするとスッキリしますし、再利用が簡単です。
ぜひご活用を…!
次回は、ドキュメントからいろいろな要素を取得していきます。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作するクラスを作る
エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。- エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
- エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
- エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
- エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
- エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
- エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
- エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
- エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する