みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方のシリーズです。
前回の記事はこちら。
Webページのテーブルデータを取得するメソッドを作成しました。
それで、テーブルデータを取得しても、イミディエイトウィンドウに出力するだけではちょっと微妙ですよね…
せっかくエクセルVBAなので、ワークシートに書き出すというのが基本っすもんね。
ということで、今回はエクセルVBAによるIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを作成していきます。
では、行ってみましょう!
前回のおさらい
まず、前回のおさらいからです。
IEを操作するクラスIEObjectはこちらです。
Public IE As InternetExplorer
Public Document As HTMLDocument
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
Wait
Set Document = IE.Document
End Sub
Public Sub Wait()
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Public Sub PrintTableData(ByVal table As HTMLTable)
Dim tr As HTMLTableRow
For Each tr In table.getElementsByTagName("tr")
Dim th As HTMLTableCell
For Each th In tr.getElementsByTagName("th")
Debug.Print th.innerText,
Next th
Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
Debug.Print td.innerText,
Next td
Debug.Print
Next tr
End Sub
前回は、Webページのtable要素を表すHTMLTableを渡すことで、そのデータをイミディエイトウィンドウに出力するPrintTableDataメソッドを作りました(今回の内容で関わるメンバーだけ掲載しています)。
確認用の標準モジュールのSubプロシージャがこちらです。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
.PrintTableData .Document.getElementsByTagName("table")(0)
End With
End Sub
これで、IEで表示したページの最初のtable要素のデータを取得することができます。
Webテーブルのデータをシートに書き出すメソッド
今回は、取得したテーブルデータをシート上に出力するように変更していきたいと思います。
作ったメソッドがこちらのWriteTableDataメソッドです。
Public Sub WriteTableData(ByVal table As HTMLTable, ByVal cell As Range)
Dim i As Long: i = 0
Dim tr As HTMLTableRow
For Each tr In table.getElementsByTagName("tr")
Dim j As Long: j = 0
Dim th As HTMLTableCell
For Each th In tr.getElementsByTagName("th")
cell.Offset(i, j).Value = th.innerText
j = j + 1
Next th
Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
cell.Offset(i, j).Value = td.innerText
j = j + 1
Next td
i = i + 1
Next tr
End Sub
対象となるtable要素であるHTMLTableオブジェクトに加えて、データを書き出す基点となるRangeオブジェクトをパラメータcellで受けるようにしました。
その位置から、行方向にi、列方向にjというカウント変数を用います。
- tr要素内のth要素・td要素をすべて取り出したらiをプラス1
- th要素またはtd要素の内容をセルに書き込んだらjをプラス1
そのi,jを使って、Offsetプロパティで書き出し先のセルを移動させていくという作戦です。
WriteTableDataメソッドの動作確認
では、以下のようなSubプロシージャを作成して、WriteTableDataメソッドの動作の確認をしてみましょう。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
.WriteTableData .Document.getElementsByTagName("table")(0), Sheet1.Range("A1")
End With
End Sub
これまたシンプルですね。
書き出し先はオブジェクト名Sheet1のA1セルとします。
実行すると、IEが動作して以下のようにシートにテーブルデータが書き出されます。
51位以降を取得したい場合は
- ページをめくってtable要素を取得
- 書き出したシートの最終行を求める
- 最終行の次の行以降にテーブルデータを書き込む
という流れで作れば良さそうですね。
あと、一部見出しにセルの結合があったり、フッターにも見出し行があったりするので、その辺が気になれば、標準モジュールの処理で追加する必要がありますね。
必要に応じてチャレンジしてみてください。
まとめ
以上、エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する方法をお伝えしました。
縦横がきれいにそろっているtable要素であればだいたいうまく取得して書き出せると思いますので、便利かな~と思います。
次は、検索窓にテキストを入力するメソッドを作っていきます。
どうぞお楽しみに!
連載目次:エクセル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を操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する