VBAでIEを操る(DOMから要素を取得)
今回は、取得したIEからDOMを取得し、さらにそれぞれの要素を取得したいと思います。
DOMって何?
という声が聞こえたり、聞こえなかったり・・・・・・。
えーっと、私もあんまり詳しいわけじゃないですが、JavaScriptの書籍などから得た知識によると・・・・・・
Document Object Modelの略で、HTML文書をオブジェクトのように扱う仕組みのことだそうです。
前回、IEをオブジェクトとして取得するコードを掲載しましたが、IEには document というプロパティがあり、このプロパティから、HTML文書のオブジェクト化されたものを取得することができます。
こんな感じに図示してみました。
厳密には、このHTMLをオブジェクト化したものをDOMと呼ぶのか、これをオブジェクトのように扱う概念・仕様のことを DOM と呼ぶのか実はよく知らない(@_@;)
さて、このようにDOMを取得するのですが、少し勘違いしそうなのは、通常のオブジェクトツリーのように.(ピリオド)で区切って
ie.document.html.body.h1.プロパティ(またはメソッド)
というような記述には、残念ながらできません。
メンドウですが、要素、言い換えれば「タグ」を documentプロパティに用意された、getElementBy~(または、getElementsBy~) メソッド で、オブジェクトとして再取得する必要があります。(Element〔要素〕をget〔取得〕する)
たとえば、HTML文書中にこんなタグがあったとしたら・・・・・・、
<p id="test1" class="test2" name="test3">てすと</p>
このタグを取得する方法は下表の通りです。
メソッド | 引数 | 使用例 |
---|---|---|
getElementById | id属性値で指定 | ie.document.getElementById("test1") |
getElementsByClassName | Class属性値で指定 | ie.document.getElementsByClassName("test2") |
getElementsByName | Name属性値で指定 | ie.document.getElementsByName("test3") |
getElementsByTagName | タグ名で指定 | ie.document.getElementsByTagName("p") |
idはHTML文書中で唯一無二なので単数形(Element)。他は同じ文書中に複数存在し得るので複数形(Elements)です。
タグ名でpタグを取得するのなら、こんなイメージ。
id以外は複数形でコレクション扱いされるため、対象の要素を絞り込むためには、インデックスを指定するか、For Each ~Next などでひとつずつ評価します。
classや、nameの値が文書中に一つしかないことが分かっていれば、次のように決め打ちで取得できます。(コレクションのインデックス番号は 0 から始まることに注意)
Set p = ie.document.getElementsByClassName("test2")(0)
Set p = ie.document.getElementsByName("test3")(0)
pタグに挟まれた文字列 "てすと" で評価するなら、次のように For Each ~Next から取得できます。
For Each tmp In ie.document.getElementsByTagName("p")
If tmp.innerText = "てすと" ThenSet p = tmp Exit For End If Next
さてさて、オブジェクトとして参照できたなら、あとはいつも通り
p.プロパティ
p.メソッド
のように、記述することができます。
オブジェクトにどのようなプロパティやメソッドが用意されているかは、インテリセンス(自動補完システム)で確認することができます。
DOMのインテリセンスをオンにするには、下記を参照設定します。
Microsoft HTML Object Library
ここまでをふまえ、当ブログ記事を表示したIEでちょっとした操作を試してみます。
2018-08-11の記事タイトルを変更してみる・・・・・・
ソースの表示などで、記事タイトルが<a>タグで挟まれていること、CSSを適用するためにClass属性が付加されていることに着目します。
ClassNameで決め打ちするなら次のようにします
Sub test()
Dim ie As InternetExplorer
Dim sh As Object
Dim win As Object
Set sh = CreateObject("Shell.Application")
For Each win In sh.Windows
If win.Name = "Internet Explorer" Then
Set ie = win
Exit For
End If
Next
ie.document.getElementsByClassName("entry-title-link bookmark")(0).innerText = "記事タイトルを変更してみた"
End Sub
aタグのコレクションを取得し、記事タイトルの文字列で評価するなら次のようにします
Sub test()
Dim ie As InternetExplorer
Dim sh As Object
Dim win As Object
Dim a As HTMLAnchorElement
Set sh = CreateObject("Shell.Application")
For Each win In sh.Windows
If win.Name = "Internet Explorer" Then
Set ie = win
Exit For
End If
Next
For Each a In ie.document.getElementsByTagName("a")
If a.innerText = "VBAでIEを操る(起動済みIEをシェルとして取得)" Then
a.innerText = "記事タイトルを変更してみた"
Exit For
End If
Next a
End Sub
どちらも、結果、同じようになります。
変更前
変更後
でも・・・・・・、記事タイトルを変更してみたところで何のメリットもないっす(@_@;)←ぇ
次回以降、VBAから、テキストボックスに文字列を入力したり、セレクトボックスの項目を選択したり、チェックボックス・ラジオボタンをON・OFFしたり、リンクやボタンをクリックしたり、とか色々やってみたいと思います。