みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAでIEを操作するシリーズをお送りしています。
前回の記事はこちら。
IEでWEB上の表を取得し、その各行のテキストを取得する方法をお伝えしました。
さて、行を表すtr要素の配下には、さらにセルを表すtd要素というものがあります。
今回は、それを一つ一つ取り出していきたいと思います。
ということで、WEBページのテーブル要素からセルのデータを取り出す方法です。
では、行ってみましょう!
前回のおさらい
前回からテーマにしているのは、こちらのYahooファイナンスの時価総額ランキングのページです。
前回は、HTMLで表の構造がどのようになっているのか、Google Chromeのデベロッパーツールで確認をしつつ、以下のようなプロシージャを作成しました。
Sub MySub()
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.Document
Dim tr As HTMLTableRow
For Each tr In htmlDoc.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
Debug.Print tr.innerText
Next tr
End Sub
ページ内に、テーブルの本体セクションを表すtbody要素が1つしかありませんので、それをまず取得、その後それに含まれる行を表すtr要素をコレクションとして取得しました。
さて、今回はそのtr要素の配下にさらにtd要素がありますので、その取得をしていきたいと思います。
テーブルの各セルのテキストを取り出す
tr要素からtd要素のコレクションを取得する
前回のプロシージャの17~19行目で、tr要素についてのループになっていますが、このtr一つ一つについてtd要素を取得して、それについてループをするというネスト構造にしていけば良さそうです。
tr要素を表すHTMLTableRowオブジェクトに対しても、他のHTML要素と同じくgetElementsByTagNameメソッドを使うことができます。
これで、td要素HTMLTableCellオブジェクトのコレクションとして取得できるわけです。
td要素のコレクションをループしてテキストを取り出す
そのコレクションに対してループをしてあげれば、個々のセルのデータを取り出すことができます。
Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
'td要素に対する処理
Next td
今回も、innerTextプロパティでテキストを取り出してみましょう。
テーブルのtd要素のテキストを取り出すプロシージャ
では、以上を踏まえてプロシージャを作り直します。
こちらです。
Sub MySub()
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "https://info.finance.yahoo.co.jp/ranking/?kd=4"
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.Document
Dim tr As HTMLTableRow
For Each tr In htmlDoc.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
Dim td As HTMLTableCell
For Each td In tr.getElementsByTagName("td")
Debug.Print td.innerText,
Next td
Debug.Print
Next tr
End Sub
実行をすると、以下のような出力を得られます。
まとめ
以上、エクセルVBAでWEBページのテーブル要素からセルのデータを取り出す方法をお伝えしました。
入れ子状態にはなっていますが
- getElementsByTagNameメソッドでコレクションを取得
- For Each文でコレクションをループ
- 各要素に対して処理
という基本動作の組み合わせになっていることがわかりますよね。
テーブルはこのような階層構造を取得するには良い題材ですよね。
次回以降、さらに凝った取得の仕方についてお伝えできればと思います。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作してWEBスクレイピング
IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。
- 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
- 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
- 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
- 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
- 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
- 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
- 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
- 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
- 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
- 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
- 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
- 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
- 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
- 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
- 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする