VBAの勉強を始めてみた

色々試しています。

VBAでIEを操る(DOMから要素を取得)

今回は、取得したIEからDOMを取得し、さらにそれぞれの要素を取得したいと思います。

DOMって何?

という声が聞こえたり、聞こえなかったり・・・・・・。

えーっと、私もあんまり詳しいわけじゃないですが、JavaScriptの書籍などから得た知識によると・・・・・・
Document Object Modelの略で、HTML文書をオブジェクトのように扱う仕組みのことだそうです。

前回、IEをオブジェクトとして取得するコードを掲載しましたが、IEには document というプロパティがあり、このプロパティから、HTML文書のオブジェクト化されたものを取得することができます。

こんな感じに図示してみました。

f:id:kouten0430:20180816115743j:plain

 

厳密には、このHTMLをオブジェクト化したものをDOMと呼ぶのか、これをオブジェクトのように扱う概念・仕様のことを DOM と呼ぶのか実はよく知らない(@_@;)

さて、このようにDOMを取得するのですが、少し勘違いしそうなのは、通常のオブジェクトツリーのように.(ピリオド)で区切って


ie.document.html.body.h1.プロパティ(またはメソッド)

 

というような記述には、残念ながらできません。

メンドウですが、要素、言い換えれば「タグ」を documentプロパティに用意された、getElementBy~(または、getElementsBy~) メソッド で、オブジェクトとして再取得する必要があります。(Element〔要素〕をget〔取得〕する)

f:id:kouten0430:20180816123316j:plain

 

たとえば、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タグを取得するのなら、こんなイメージ。

f:id:kouten0430:20180816120552j:plain

 

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 = "てすと" Then
        Set p = tmp
        Exit For
    End If
Next

 

さてさて、オブジェクトとして参照できたなら、あとはいつも通り

p.プロパティ
p.メソッド

のように、記述することができます。

オブジェクトにどのようなプロパティやメソッドが用意されているかは、インテリセンス(自動補完システム)で確認することができます。

DOMのインテリセンスをオンにするには、下記を参照設定します。

Microsoft HTML Object Library

 

ここまでをふまえ、当ブログ記事を表示したIEでちょっとした操作を試してみます。

2018-08-11の記事タイトルを変更してみる・・・・・・
ソースの表示などで、記事タイトルが<a>タグで挟まれていること、CSSを適用するためにClass属性が付加されていることに着目します。

f:id:kouten0430:20180816121720j:plain

f:id:kouten0430:20180816121731j:plain

 

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

 

 どちらも、結果、同じようになります。

 

変更前

f:id:kouten0430:20180816122447j:plain

 

変更後

f:id:kouten0430:20180816122500j:plain

 

でも・・・・・・、記事タイトルを変更してみたところで何のメリットもないっす(@_@;)←ぇ

 

次回以降、VBAから、テキストボックスに文字列を入力したり、セレクトボックスの項目を選択したり、チェックボックスラジオボタンをON・OFFしたり、リンクやボタンをクリックしたり、とか色々やってみたいと思います。