エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する


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

エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方のシリーズです。

前回の記事はこちら。

エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセル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が動作して以下のようにシートにテーブルデータが書き出されます。

シートに書き出したWebページのテーブルデータ

51位以降を取得したい場合は

  1. ページをめくってtable要素を取得
  2. 書き出したシートの最終行を求める
  3. 最終行の次の行以降にテーブルデータを書き込む

という流れで作れば良さそうですね。

あと、一部見出しにセルの結合があったり、フッターにも見出し行があったりするので、その辺が気になれば、標準モジュールの処理で追加する必要がありますね。

必要に応じてチャレンジしてみてください。

まとめ

以上、エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する方法をお伝えしました。

縦横がきれいにそろっているtable要素であればだいたいうまく取得して書き出せると思いますので、便利かな~と思います。

次は、検索窓にテキストを入力するメソッドを作っていきます。

エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAでIEを操作するクラスに検索窓の入力&ボタンクリックのメソッドを追加する方法をお伝えします。

どうぞお楽しみに!

連載目次:エクセル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を操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

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