<スポンサーリンク>

【簡単】VBAでIEの表をエクセルに書き出す方法~VBA(マクロ)でIE操作

IE関係
この記事は約5分で読めます。
コピーボタン
記事のタイトルとURLをコピー
スポンサーリンク

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

進捗状況を確認するため、ステータスバーに進捗状況を表示させています。

記事のまとめ

この記事のまとめは下記のとおりです。

・表のデータは、chirdrenを用いて要素を特定すると簡単に書き出すことができる!
・番号は(0)から始まるので注意すること!

その他、VBAでIEを動かすために必要な情報をまとめています!!

コメント欄

  1. お世話になります。
    ウェブスクレイピングのサイトを検索してたらこちらにたどり着きました。
    他のサイトよりも私が目標にしている動きに一番合致していたためサンプルコードを
    使用させて頂いております。

    そこで一つ質問よろしいでしょうか?
    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については難しそうな気がします。。。

        Internet Explorer の URL の最大長は 2,083 文字です - Microsoft サポート

        そこまで長いURLをみたことがないのですが、何か参考になるページありますでしょうか?

        • 返信ありがとうございます。
          参考となるURLはあるのですが、個人的にやり取りさせていただくことは可能でしょうか?

        • お世話になります。
          昨日メール頂きありがとうございました。
          こちらから返信させて頂きましたが、無事届いていますでしょうか?

<スポンサーリンク>
タイトルとURLをコピーしました