<スポンサーリンク>

【簡単】VBAでIEの全要素のデータを取得する方法~VBA(マクロ)でIE操作

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

↓改良版です。こちら速度向上させましたので、こちらをご覧ください。

↓のサイトで、IEを表示することができました。
次は、HTMLの中身を確認し、任意の情報を取り出す方法を書いていこうと思います。

スポンサーリンク

VBAでIEの全要素のデータを取得する方法

マクロでIEを操作して行いたいことは、
①サイト内のデータを取得。
②検索ボックスなどテキストに代入。
③検索ボタンなどをプッシュする。
ことなどだと思います。この操作を行うためには、まずhtmlコードを読み解く必要があります。
下記コードは「グーグルの検索サイト」の
htmlコードを読み取るために、全ての要素をエクセルに書き出すコードです。
ダブルクリックでコピーできますのでとりあえずVBAに張り付けて実行してみてください。

Sub IEoutput2()
 
 Application.ScreenUpdating = False
  
'*****↓ここまでは以前と一緒***************************************************
'IEの起動
Dim objIE As Object
  
Set objIE = GetObject("", "InternetExplorer.Application")
  
objIE.Visible = True
      
      
    objIE.Navigate "https://www.google.com/?hl=ja"  ' このURLを任意に変更
      
    ' ページの表示完了待ち。
    While objIE.ReadyState <> 4 Or objIE.Busy = True
        DoEvents
    Wend
'*****↑ここまでは以前と一緒***************************************************
  
'****今日はここから↓***************************************************
  
    On Error Resume Next      '値がないとエラーが出るので、エラー回避用
 
    i = 1  '開始行を指定
    J = objIE.document.all.Length  '要素の数を知る
     
    Cells(i, 1).Value = "uniqueID"
    Cells(i, 2).Value = "tagname"
    Cells(i, 3).Value = "Type"
    Cells(i, 4).Value = "NAME"
    Cells(i, 5).Value = "ID"
    Cells(i, 6).Value = "className"
    Cells(i, 7).Value = "TABINDEX"
    Cells(i, 8).Value = "Vakue"
    Cells(i, 9).Value = "checked"
    Cells(i, 10).Value = "親のtagname"
    Cells(i, 11).Value = "innertext"
    Cells(i, 12).Value = "outertext"
    Cells(i, 13).Value = "outherhtml"
    Cells(i, 14).Value = "innerhtml"
     
     Dim A As Object
      
    For Each A In objIE.document.getElementsByTagName("*")
     
     

        Cells(i + 1, 1) = A.uniqueID                'uniqueID
        Cells(i + 1, 2) = A.TAGNAME                 '親のTAG
        Cells(i + 1, 3) = A.Type                    'タイプ ※selectボックスは”select-one”と取得
        Cells(i + 1, 4) = A.Name                    '名前
        Cells(i + 1, 5) = A.ID                      'ID
        Cells(i + 1, 6) = A.className               'クラス名
        Cells(i + 1, 7) = A.TabIndex                'フォーカス順序 (Tabでの移動順)
        Cells(i + 1, 8) = A.Value                   '値
        Cells(i + 1, 9) = A.Checked                 'チェック状態 (True = チェック有り、false = チェック無し)
                                                    'checkboxやradioボタンから取得します
        Cells(i + 1, 10) = A.parentElement.TAGNAME  '親のTAG
 
 
 
        If Len(A.innerHTML) > 50 Then
         
            Cells(i + 1, 11) = Left(A.innertext, 10) & "   ~~~   " & Right(A.innertext, 10)
            Cells(i + 1, 12) = Left(A.outertext, 10) & "   ~~~   " & Right(A.outerrext, 10)
            Cells(i + 1, 13) = Left(A.outerHTML, 10) & "   ~~~   " & Right(A.outerHTML, 10)
            Cells(i + 1, 14) = Left(A.innerHTML, 10) & "   ~~~   " & Right(A.innerHTML, 10)
 
        Else
         
            Cells(i + 1, 11) = A.innertext
            Cells(i + 1, 12) = A.outertext
            Cells(i + 1, 13) = A.outerHTML
            Cells(i + 1, 14) = A.innerHTML
                     
        End If
         
        Dim C(20) As String

        '階層を表示
        For Z = 1 To 20
            C(Z) = A.TAGNAME
            If A.TAGNAME = "HTML" Then Exit For
            Set A = A.parentElement
        Next

        For L = Z To 1 Step -1
            Cells(i + 1, 30 + Z - L) = C(L)
        Next
         
         
        i = i + 1
         
        'ステータスバーに進捗を表示
        Application.StatusBar = i & "/" & J
      
    Next
     
 
     Cells.WrapText = False
 
 
 Application.ScreenUpdating = True
 Application.StatusBar = False
 
'表示を固定
Columns(1, 9).AutoFit
Cells(1, 2).EntireColumn.Interior.ColorIndex = 6
Cells(2, 3).Select
ActiveWindow.FreezePanes = True
objIE.document.getElementsByName("q")(0).Value = "テスト"
  
End Sub


プログラムを簡単に説明

少々長くなりましたが、やっていることは簡単で、サイトを表示させた後、
For Each A In objIE.document.getElementsByTagName("*") ~~~ Next
で全要素を検索し、要素内の属性やデータを抜き出して、エクセルに張り付けていっています。
.document.getElementsByTagName("○○") でTagNameが○○のものを取り出せるのですが、
*を使うことで、ワイルドカードとして全種類検索することを可能としています。

実行結果を確認する。

実行すると、下記のようなデータがエクセルに書き出されたと思います。
抜き出す属性やデータとしては、

①uniqueID ②tagname ③Type ④NAME ⑤ID ⑥className ⑦TABINDEX ⑧Vakue ⑨checked ⑩親の⑪tagname ⑫innertext ⑬outertext ⑭outherhtml ⑮innerhtml

を取り出してみました!
基本的に、VBAでIEを操作するときには、
②のTagNameを使って要素を取り出し、④⑤⑧などのデータを用いて要素を特定。
その後「.Click」などを使ってIEを操作していきます。

ちなみにこのプログラムでは最後に、google検索欄に「テスト」と入力するために下記コードを入れておきました。
objIE.document.getElementsByName("q")(0).Value = "テスト”。
次からはこのように抜き出した要素を使って、IEを操作していきたいと思います!

P.S.
document.getElementByなどなどvbaではあまり見ない関数だなと思っていたら、
javasprictからきているようですね。まだまだ奥が深いようです…

[JavaScript] あらゆる要素を取得する
最近JavaScriptの勉強をしている@yasumohaです。始めたばかりなのでまだまだ基本ができていません。そんな訳で、今回はDOM要素を取得するメソッドをまとめてみたいと思います。IDを指定して取得するdocument.getElem

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

コメント欄

  1. 質問です。
    上記マクロを
    "IEでページを開いてそれに対し全要素のデータを取得する"
    ではなく
    "開いているIEページの全要素のデータを取得する"
    ことは可能でしょうか。

    可能であれば、方法を是非教えて頂きたいです。

    • 加山さん

      コメントありがとうございます。

      既に開いているページでしたら、
      ページを起動する部分を↓のプログラムに入れ替えてもらえればいけるかなとおもいます。

      開いているページの名前を参照する必要がありますので、
      ○○○○をページ名に入れ替えていただければと思います。

      '*****↓ここまでは以前と一緒***************************************************
      'IEの起動
      Dim objIE As Object 'IEを格納する変数(オブジェクト型)
      Dim sh As Object '起動中のShellWindow一式を格納する変数
      Dim win As Object 'ShellWindowを格納する変数

      Dim document_title As String 'ドキュメントタイトルの一時格納変数
      '起動中のShellWindow一式を変数winsに格納
      Set sh = CreateObject("Shell.Application")
      'ShellWindowから1つずつ取得して処理
      For Each win In sh.Windows
      'ドキュメントタイトル取得失敗を無視(処理継続)
      On Error Resume Next
      document_title = ""
      document_title = win.DOCUMENT.Title

      Debug.Print document_title

      On Error GoTo 0
      'タイトルバーに○○○○が含まれるかチェック
      If InStr(document_title, "○○○○") > 0 Then
      '変数ieに取得したwinを格納
      Set objIE = win
      'ループを抜ける
      Exit For
      End If
      Next

      '*****↑ここまでは以前と一緒***************************************************

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