IE操作【表の取り出し】

ここまではVBAを使ったIE上のユーザーフォームの自動操作を説明してきました。
今回はIE上にある表のデータをExcelに抜き出してくるというマクロを解説していきます。

ではサンプルページの送信ボタンの下にある表をExcelに抜き出していきたいと思います。
表の取り出し用マクロのコードは表の取り出し【コード】に記載、HTMLはIE操作用テストページ【HTML】に記載しています。
表のHTML
<table border="1px" id="list">
  <tbody>
    <tr>
      <th>種類</th>
      <th>原価</th>
      <th>販売額</th>
    </tr>
    <tr>
      <th>軽油</th>
      <th align="right">80円</th>
      <th align="right">100円</th>
    </tr>
    <tr>
      <th>レギュラー</th>
      <th align="right">100円</th>
      <th align="right">120円</th>
    </tr>
    <tr>
      <th>ハイオク</th>
      <th align="right">120円</th>
      <th align="right">140円</th>
    </tr>
  </tbody>
</table>
VBAコード
Sub 表の取り出し()
Dim objIE As Object
Dim tbl As Object
Dim cel As Object
Dim x As Integer
Dim y As Integer
Dim snam As String

'新しいシートを作成し、名前を変更する
Worksheets.Add
snam = ActiveSheet.Name

'InternetExplorerをobjIEに代入し、IEのプロセスを起動
Set objIE = CreateObject("InternetExplorer.Application")
    
    'IEを可視化するか = はい
    objIE.Visible = True
    
    'IEのリンク先URLはB1のセルのURL
    objIE.Navigate Worksheets("情報").Range("B1").Value
    
    'IEの表示待ち
    wait objIE
    
    'objIEのHTMLの中からtableのタグをobjに代入しながら確認
    For Each tbl In objIE.Document.GetElementsByTagName("table")
        
        'objに代入されたtableタグのIDがlistの場合
        If tbl.ID = "list" Then
            
                'tblに代入されているtableタグにあるセルをExcelに移し変える
                
                '変数yに0を代入、tblに代入されているtableの行数まで繰り返す
                For y = 0 To tbl.Rows.Length - 1
                    '変数xに1を代入、tblに代入されているtableの列数まで繰り返す
                    For x = 0 To tbl.Rows(y).Cells.Length - 1
                        'Excelのx列、y行の位置にtableタグのx+1列、y+1行のセルの値を入れる
                        Worksheets(snam).Cells(y + 1, x + 1).Value = tbl.Rows(y).Cells(x).InnerText
                        '変数aの値をプラス1することで次のセルに進む
                    Next
                Next
        End If
    Next
    
    '終了のメッセージボックスを表示
    MsgBox "終了"
    
    'objIEに代入したInternetExplorerを閉じる
    objIE.Quit
    
    'objIEを空にする
    Set objIE = Nothing

End Sub

Sub wait(objIE As Object)
'objIEに代入されたInternetExplorerがビジー状態、もしくは読み込み待ちの間、処理を待つ
Do While objIE.Busy Or objIE.ReadyState < 4
    DoEvents
Loop
End Sub

HTMLの基礎

まず、HTMLの基礎として、tableタグで枠を作ります。
次にtbodyタグで「ここが tableの中身ですよ」と教えてあげます。
tbodyの中にtrタグ=行、thタグとtdタグ=セルを入れることで表が出来上がります。

マクロではtrタグやthタグとtdタグで出来上がったtableタグの表を、Excelのセルと同じような表として認識することが出来ます。
その為、tableタグを取得し、CellsやRowsなどでセルの位置を指定することが出来るのです。

ワークシートの作成~シート名の取得

では実際のコードの解説に入りたいと思います。
※VBAのコードより、変数の宣言については、過去の記事でも多数説明している為、省略します。

Worksheets.Add


上記のWorksheets.Addについては「Worksheetを加えてください」の意味になります。つまり、新しいシートを作成します。

snam = ActiveSheets.Name


次にsnamの変数にアクティブになっているシート=先程新しく作成したシートの名前を代入します。

IEの起動~状態~サイトへのアクセス~読み込み待ち

Set objIE = CreateObject("InternetExplorer.Application")


 こちらはIE操作【IE起動~読み込み】でも説明したようにobjIEというオブジェクト変数にInternetExplorerを代入してます。

objIE.Visible = True


次のVisibleは可視化なので、Trueで表示、Falseで非表示でIEを起動します。

objIE.Navigate Worksheets("情報").Range("B1").Value


最後にNavigateでB1のセルの値に入っているURLにアクセスします。

wait objIE


上記でIEの読み込み待ちをします。

ここまでは前回までの記事のおさらいのような内容なので大丈夫ですかね?
次から少しずつ変わっていきます。

表の取り出し

For Each tbl In objIE.Document.GetElementsByTagName("table")


上記でtableタグをtblの変数に代入しながら探します。

If tbl.ID = "list" Then


tblに代入されたtableタグのIDがlistの時、次の処理を実行します。

For y = 0 To tbl.Rows.Length - 1


変数yの値の0からtblに代入されたtableタグの表の行数まで繰り返します。
※Rows.Lengthで 行数を取得、その後に付いてる-1は、VBAではExcelの行数や列数は1から始まりますが、IE上の表やタグの数などは0から始まります。
その為、0からスタートし、最終行-1まで繰り返すという表記になります。

For x = 0 To tbl.Rows(y).Cells.Length - 1


変数xの値の0からtblに代入されたtableタグのy行のセルの数だけ繰り返します。
※こちらもIEの表のセルなので-1を忘れないようにしてください。

Worksheets(snam).Cells(y + 1, x + 1).Value = tbl.Rows(y).Cells(x).InnerText


上記が少し難しいのですが、まず、Worksheets(snam)で最初にsnamの変数に代入した新しいシートの名前のワークシートを指定し、Cells(y + 1, x + 1).Valueで、新しいシートのxとyの値+1のセルの位置に入力します。
入力する内容はtblに代入されたtableタグy行目左からx番目のセルの文字列です。

ここが少しわかりにくいと思いますが、コードの色分けの様に「xとyを使い、同じセルの位置に表を取り出すように」ということを意識しながら実行してみるとわかると思います。

終了のメッセージ~オブジェクトの解放

最後に前回と同様に下記3つのコードを実行し、終了のメッセージを出した後、IEを閉じ、IEの解放を行ないます。
MsgBox "終了"
objIE.Quit
Set objIE = Nothing

最後に

1つの記事にまとめての解説なので見づらかったりするかと思うのですが、IEの基本操作として、「For Eachでタグを選択し、Ifで操作したいタグなら中身を実行する」ということを忘れなければ、操作は出来ると思います。
後は発想力を使って自分なりでいいのでコーディングしてみてください。