【Excelマクロ(VBa)】IEの操作(データを取得する)


IE起動~終了までは述べたので、起動後のIEの操作をExcelマクロ(VBa)で行います。尚、コーディングするにあたっては、多少htmlの知識が必要です。(読めないと記述できません)

操作するページは引き続きYahooの乗換案内です。(サンプルソース)


   画面の値


IEの操作でテキストボックスラジオボタンコンボボックスチェックボックス、【検索】ボタンのクリックをご紹介しましたが、今回は検索した結果のデータ取得をご紹介します。

東京 ~ 渋谷までの乗換案内検索をすると、下記のような結果が取得できました。




   html


これをhtml上で確認すると、下記となります。(今回は「ルート1」時間・金額・乗換回数に限定)
idが設定されていれば getElementById("~") を使う事で簡単に値を取得する事ができるのですが、今回はidが設定されていないので、dlタグliタグclass="~"に注目します。

<dl>
<dt><a href="#route01"><span class="icnAnchor">[↓]</span>ルート1</a></dt>
<dd >
<ul>
<li class="time">26分</li>
<li class="fare"><span class="mark">194円</span></li>
<li class="transfer">乗換:<span class="mark">0回</span></li>
<li class="priority"><span class="icnPriTime">[早]</span><span class="icnPriTrans">[楽]</span><span class="icnPriFare">[安]</span></li>

</ul>
</dd>
</dl>


   html(dlタグ)


dlタグは乗換案内の検索結果のページに多く出てくるので、ループして該当の箇所を見つけます。見つけ方はルート1の文字列を含むものを特定します。

  <乗換案内html>
<dl>
<dt><a href="#route01"><span class="icnAnchor">[↓]</span>ルート1</a></dt>
<dd >
<ul>
  ・
  ・
</ul>
</dd>
</dl>

  <Excelマクロ(VBa)>
'変数定義
Dim dl As IHTMLElement

'dlタグ分ループする
For Each dl In objIE.document.getElementsByTagName("dl")

  '「ルート1」を含むかチェックする
  If InStr(dl.innerText, "ルート1") > 0 then
    ・
    ・
  End If

Next dl


   html(liタグclass)


liタグは上記dlタグ(ルート1)に4回出てくるので、dlタグと同じようにループを使います。該当のデータを見つけるにはclassで特定します。

今までは文書全体からデータを取得していたので、
  objIE.document.getElementsByTagName
を使ってましたが、今回は該当のdlタグが取得できたので、
  dl.getElementsByTagName
を使います。

また、classはタグではなく属性なので getAttribute("属性") を使います。但し、class の場合には getAttribute("className") と記述する点は注意が必要です。(getAttribute("class")ではない)

  <乗換案内html>
<li class="time">26分</li>
<li class="fare"><span class="mark">194円</span></li>
<li class="transfer">乗換:<span class="mark">0回</span></li>
<li class="priority"><span class="icnPriTime">[早]</span><span class="icnPriTrans">[楽]</span><span class="icnPriFare">[安]</span></li>

  <Excelマクロ(VBa)>
'変数定義
Dim dl_li As IHTMLElement

'dlタグ内をループする
'  (注)上記「If InStr(dl.innerText, "ルート1") > 0 then」内に記述する
For Each dl_li In dl.getElementsByTagName("li")

  '時間を特定
  If dl_li.getAttribute("className") = "time" Then
    ・
    ・
  End If

  '金額を特定
  If dl_li.getAttribute("className") = "fare" Then
    ・
    ・
  End If

  '乗換回数を特定
  If dl_li.getAttribute("className") = "transfer" Then
    ・
    ・
  End If

Next dl_li

 

   データの取得


これでようやく該当のデータに辿り着けたので、innerText を使って該当の値を取得します。

  <乗換案内html>
<li class="time">26分</li>

  <Excelマクロ(VBa)>
dl_li.innerText


   乗換案内のルート1の金額を取得する


最後に通して記述すると下記のようになります。

'変数定義
Dim dl As IHTMLElement
Dim dl_class As IHTMLElement
Dim dl_li As IHTMLElement

'dlタグ分ループする
For Each dl In objIE.document.getElementsByTagName("dl")

  '「ルート1」を含むかチェックする
  If InStr(dl.innerText, "ルート1") > 0 Then

    'dlタグ内をループする
    For Each dl_li In dl.getElementsByTagName("li")

      '金額を特定
      If dl_li.getAttribute("className") = "fare" Then
        '乗換案内のルート1の金額を取得する
        MsgBox dl_li.innerText
      End If

    Next dl_li

  End If

Next dl

管理人 について

趣味:映画鑑賞・音楽鑑賞・ゲーム・旅行 仕事:会社員(IT関連)
カテゴリー: VBa(Excelマクロ), システム開発 パーマリンク

コメントを残す