2011年7月12日火曜日

VBAでHTMLのTableタグ内データを取得する

HTMLファイルからデータを取得するプログラムをVBAで作りました。

具体的にはhtml、body、table、tdタグをキーにしてTableタグ内のデータを取得する仕組みです。
tdタグ内に記述されたデータ(innertext)が取得対象となります。
実行環境はExcel VBA、IE6です。
VBA側の参照設定はデフォルトのままで実行できます。


TDタグ内のデータを取得するプロシージャ



Sub getTDinnertext()

    Dim intIndex As Integer
    Dim objTag As Object
    Dim objTagTable As Object
    Dim varTDinner(371) As Variant
  
    intIndex = 0
  
    For Each objTag In objIE.document.body.all
      
        If objTag.tagname = "TABLE" Then
      
            For Each objTagTable In objTag.all
              
                If objTagTable.tagname = "TD" Then
              
                    varTDinner(intIndex) = objTagTable.innertext
                  
                    '取得したデータに対する処理
                    'Debug.Print intIndex &  "::" & varTDinner(intIndex)
                    'Cells(intIndex + 1, 1).Value = intIndex
                    'Cells(intIndex + 1, 2).Value = varTDinner(intIndex)
          
                    intIndex = intIndex + 1
                  
                End If
              
            Next objTagTable
          
        End If
      
    Next objTag
  
End Sub


取得した値は配列型の変数に格納しています。
このプログラムではTD要素が371個存在したので371個の要素を持つ配列を宣言しています。
(動的配列を使った方がスマートに書けるのかな)
なのでTD要素の個数が372以上の場合、上記プログラムでは「インデックスが有効範囲にありません」というエラーが発生します。

また、このプログラムは先にIEオブジェクトを生成して取得対象のWebページを開いておく必要があります。
実際には以下のようなプログラムの中で上記プロシージャを呼び出して使っています。


アクセスしたサイトからデータを取得するプロシージャ

Sub test110712()

    'IEオブジェクトを作るサブルーチン
    Call CreateIE
    
    objIE.navigate "http://www.shimatetsu.co.jp/bus/busjikoku/bust01.htm"
    
    'ページの読み込みを待機するサブルーチン
    Call WaitIE
    
    objIE.Visible = True
    
    Call getTDinnertext

    Set objTag = Nothing
    Set objTagTable = Nothing
    Set objIE = Nothing
    
End Sub


※CreateIEプロシージャとWaitIEプロシージャについてはお手数ですがVBAでJavaScriptが埋め込まれたリンクをクリックするエントリーを参照してください。


例えば長崎空港線(島原港⇔長崎空港)のデータを取得すると次のような結果が返ってきます。

仕事場の環境的な制約でVBAを使ってこんなものを作っていますが、これが意外に役に立っていたりします。

0 件のコメント:

コメントを投稿