VBAでIEの表の内容をエクセルに書き出す方法~
IEの表をVBAでエクセルに書き出したい!
でも、IDや名前もわからないし、どうやって抜き出すべきかわからない!
という人も多いかと思います。
そこで今回は、楽天証券の表の内容を書き出すプログラムを説明しながら、
その方法を解説したいと思います。
楽天証券の表の内容を書き出す
楽天証券の表を書き出すためのコードになります。簡単に説明すると、
①サイトを立ち上げて
②tagName=”tr”を検索 (”tr”は「行」を表します。)
③.chirdrenを用いてtrの中の子要素の「列」を取得、書き出し。
※何個列があるかわからないので、とりあえず20まで取得。
エラーが起こらないようにOn Error Resume Next入れてます。
という内容です。
Sub IE_table_output()
Application.ScreenUpdating = False
'IEの起動
Dim objIE As Object
Set objIE = GetObject("", "InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://www.rakuten-sec.co.jp/web/fund/find/search/result.html" ' このURLを任意に変更
' ページの表示完了待ち。
While objIE.ReadyState <> 4 Or objIE.Busy = True
DoEvents
Wend
On Error Resume Next '値がないとエラーが出るので、エラー回避用
I = 1 '開始行を指定
L = 0
J = objIE.document.all.Length '要素の数を知る
Cells(I, 1).Value = "No"
Dim A As Object
For Each A In objIE.document.getElementsByTagName("tr")
For L = 0 To 20
Cells(I, L + 1) = A.Children(L).innertext
Next
I = I + 1
'ステータスバーに進捗を表示
Application.StatusBar = I & "/" & J
Next
On Error GoTo 0
Cells.WrapText = False
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
上記のプログラムを実行すると楽天証券の下記の表を、エクセルに書き出すことができたと思います。
↓エクセルに書き出される
プログラムの解説
htmlの表(テーブル)の構成
htmlの表の構成は下記のようになっております。
trが行、th,tdが列を示し、trの中にthやtdが含まれております。
この特性を利用してプログラムを書いていきます。
※ちなみにthは「見出しで太字となり中央揃い」tdは「通常の文で左揃い」の違いです。
<table> <tr> <th>行1列1</th> <th>行1列2 </th> <th>行1列3 </th> </tr> <tr> <td>行2列1</td> <td>行2列2 </td> <td>行2列3 </td> </tr> <tr> <td>行3列1</td> <td>行3列2 </td> <td>行3列3 </td> </tr> </table>
For Each A In objIE.document.getElementsByTagName("tr")
まずは、for each構文を使って、タグの名前がtrのものをAに格納します。
objIE.document.getElementsByTagName("tr").Children(”番号”) .innertext
列の要素はtrタグの中にありましたので、
A.Children(”番号”).innerhtmlでtrタグの中のテキストを一つずつ書き出していきます。
注意していただきたいことは、番号が「0」から始まることです。
ちなみに今回は、列の要素が何個あるかわからなかったので、0~20と21回繰り返しています。
また、要素がないとエラーが起きますので、On Error Resume Next で無理やり実行しています。
セルへの書き出し
trは行を表していますので、trごとにi=i+1と加算していっています。
また、子要素tdは列でしたので、子要素を進めるのと同時にL=L+1と加算してセルに書き出していっています。
おまけ:Application.StatusBar = I & "/" & J
進捗状況を確認するため、ステータスバーに進捗状況を表示させています。
記事のまとめ
この記事のまとめは下記のとおりです。
その他、VBAでIEを動かすために必要な情報をまとめています!!
コメント欄
お世話になります。
ウェブスクレイピングのサイトを検索してたらこちらにたどり着きました。
他のサイトよりも私が目標にしている動きに一番合致していたためサンプルコードを
使用させて頂いております。
そこで一つ質問よろしいでしょうか?
objIE.Navigate "https://www.rakuten-sec.co.jp/web/fund/find/search/result.html" ' このURLを任意に変更
上記のコードですがセルに入力されたURLを取得する場合はどのように対応したらよいでしょうか。
objIE.navigate Range("A1").Value またはobjIE.navigate Cells(1,1).Value のようにしても
正しく実行されなかったため、もしよければご教示頂けないでしょうか?
以上、よろしくお願い致します。
どうやらURLの文字数が2000文字を超えていたため、正常に実行されなかったようです。
2000文字程のURLを取得する方法をもしご存じでしたらご教示頂けますと幸いです。
宜しくお願い致します。
コメントありがとうございます。
下記記事より、2083文字以上のURLについては難しそうな気がします。。。
そこまで長いURLをみたことがないのですが、何か参考になるページありますでしょうか?
返信ありがとうございます。
参考となるURLはあるのですが、個人的にやり取りさせていただくことは可能でしょうか?
お世話になります。
昨日メール頂きありがとうございました。
こちらから返信させて頂きましたが、無事届いていますでしょうか?