ie-excel

エクセル・マクロでie操作

Excel VBAでIEを操作 テーブルをエクセルのシートにコピー

2018/11/16

Excelで目的のURLを自動的に開き、そのページにあるハイパーリンクから次のページへと遷移。
検索窓に文字を入れ、検索先へと遷移する方法は前回例示しました。

今回はテーブルデータをエクセルに貼り付けることを例示したいと思います。

そこで今回のお題は
・「Yahoo!ファイナンス」で「任天堂」の株価のサイトを表示
・「任天堂」株価ページの時系列データのテーブルをエクセルのセルに貼り付ける
を実践。

上記お題は、以下の操作をすることにより可能となります。
・エクセルを起動
・(バージョンによっては)マクロを有効にする
・マクロの編集画面で、以下のコードをコピー&ペースト
・マクロを実行

コピペするコード

マクロを実行したら、実行したExcelの"Sheet1"に「任天堂」の株価がコピペされていませんか?
(Yahoo!側でソース修正されたらうまく動かないかもしれません。)

ではソースの解説です。

Yahoo!ファイナンスを開くところまで(上記の青字箇所)は解説済みのために、それ以降を説明します。
(念のため、上記ソースにはおさらいの意味を込めて簡単なコメントを掲載しています。)

前回までは、検索するタグを指定していました。
実際の指定方法は、
getElementsByTagName("タグ名")
とするとしていましたが、今回は全タグを対象とします。
というのも、複数のタグを対象にし、タグによって処理を振り分けたいからです。
全タグを指定する場合は、単純に
all
と指定するだけです。

続いてのコードです。

Tableタグの構造の中でも、取得したいのはデータの項目用タグであるTDとヘッダーの項目用タグであるTHタグ。
そして、行の単位であるTRタグを抽出します。
(抽出後の利用方法は後述)

IF文で記載してもよかったのですが、or文が嫌いなので、Select命令を使っています。
タグ名はtagNameに収録されています。
ここで注意です。
「tagNameは大文字」であることに注意ください。
実際のタグが大文字であっても、小文字であっても、tagNameを小文字で記述した場合は、該当タグが処理されません。

続いてのコードです。

該当のサイトには複数のtableタグがあります。
そのうち、株価が時系列に掲載されるtableのみを対象に今回は処理をします。
このtableタグをどうにか特定できないかと、目印をさがすと「Class」が指定されています。

以下は実際のYahoo!ファイナンスのコードです。
始値>
高値

 

同一Classは同一ファイル何に複数設定が可能ですが、今回はたまたまclass="boardFin yjSt marB6"が幸いにもひとつだけ定義されていました。
そこで、これを目印に処理をします。
ただし、処理対象にしているのは、tableタグの子や孫、子孫要素であるTR,TH,TDの各タグです。
それぞれのタグには、IDやClassが設定されていません。
しかしながら、Excelでは当該タグの親要素(直上要素ではありません)のIDやClassを参照することが可能できるのです。
その方法が
offsetparent
です。
したがって、今回のようにtableタグのClassを参照したい場合は、上記ソースにあるとおり
offsetparent.className
と記述すればいいこととなります。

なお、offsetparentが設定されるのはTableなど親子関係のある一部のタグだけですので、ご注意ください。
そのため、

続いてのコードです。

これは単純に行を表すTRタグの場合は、行をカウントアップさせ
TDもしくはTHタグの場合、列カウンターをカウントアップさせながら、タグ内のテキストをセルに貼り付けています。

なお、上記コードではセルが結合されている場合などに対応できませんので、次回はセルが結合されていた場合にも対応可能な方法を紹介します。

今回のポイントの整理です。
・全タグを個別に判定したい場合、 For Each Obj In ObjIE.document.all ~ Nextを使用
・タグ名を取得するにはtagNameを使用(大文字のみ)
・Tableの子要素から、Tableタグのプロパティなどを参照するには offsetparentを使用
・Class名を取得するにはclassNameを使用
・タグで囲まれた内側のテキストを取得するのはinnertextを使用
といった5点かと思います。

-ExcelでIE操作