<スポンサーリンク>

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

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

要素取得のマクロの改良版です。
速度が半端なく上がりました。

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

【簡単】VBAでIEの任意のサイトを表示させる方法~VBA(マクロ)でIE操作
VBAでIEを操作する方法はネットを検索しても、まだ確立されきっていないように感じますので、素人が学びながら、そこまで深堀せずに簡単に説明していきたいと思います。VBAでIEの任意のサイトを表示させる方法VBAの入門編として、まずIEの画面...
スポンサーリンク

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

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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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
       
    Dim YOUSO(1000, 1 To 15) As String
     
        
    For Each A In objIE.document.getElementsbytagname("*")
       
       
  
        YOUSO(i + 1, 1) = A.uniqueID                'uniqueID
        YOUSO(i + 1, 2) = A.TAGNAME                 '親のTAG
        YOUSO(i + 1, 3) = A.Type                    'タイプ ※selectボックスは”select-one”と取得
        YOUSO(i + 1, 4) = A.Name                    '名前
        YOUSO(i + 1, 5) = A.ID                      'ID
        YOUSO(i + 1, 6) = A.className               'クラス名
        YOUSO(i + 1, 7) = A.TabIndex                'フォーカス順序 (Tabでの移動順)
        YOUSO(i + 1, 8) = A.Value                   '値
        YOUSO(i + 1, 9) = A.Checked                 'チェック状態 (True = チェック有り、false = チェック無し)
                                                    'checkboxやradioボタンから取得します
        YOUSO(i + 1, 10) = A.parentElement.TAGNAME  '親のTAG
   
   
   
        If Len(A.innerHTML) > 50 Then
           
            YOUSO(i + 1, 11) = Left(A.innertext, 10) & "   ~~~   " & Right(A.innertext, 10)
            YOUSO(i + 1, 12) = Left(A.outertext, 10) & "   ~~~   " & Right(A.outerrext, 10)
            YOUSO(i + 1, 13) = Left(A.outerHTML, 10) & "   ~~~   " & Right(A.outerHTML, 10)
            YOUSO(i + 1, 14) = Left(A.innerHTML, 10) & "   ~~~   " & Right(A.innerHTML, 10)
   
        Else
           
            YOUSO(i + 1, 11) = A.innertext
            YOUSO(i + 1, 12) = A.outertext
            YOUSO(i + 1, 13) = A.outerHTML
            YOUSO(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
      
    Range(Cells(2, 1), Cells(i, 14)) = YOUSO
 
     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. […] […]

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