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>
<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>
<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
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>
<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
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
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