IE操作【リスト選択~送信ボタン】

前回のIE操作【inputタグへの値の入力】ではユーザーフォームのHTMLで、inputのタグへの値の入力、チェックボックスやラジオボックスへのチェックを入れるところまでやりました。
今回の記事では、textareaのタグやselectタグの選択、IEの操作が終わった後の処理などについて解説していこうと思います。

では前回同様にサンプルページのユーザーフォームより、「メモ欄、Excelのバージョンのリスト、送信ボタン、IE終了後の処理」の操作について解説していきたいと思います。
フォームの入力【コード】より下記のコードの部分を解説していきます。
    'メモ欄への記載
        
    'objIEのHTMLの中からtextareaのタグをobjに代入しながら確認
    For Each obj In objIE.Document.GetElementsByTagName("textarea")
        
        'objに代入されたtextareaのタグのIDがnoteの場合
        If obj.ID = "note" Then
            'objに代入されたtextareaのタグにB7のセルの値を入れる
            obj.Value = Worksheets("情報").Range("B7").Value
        End If
    Next
    
    'Excelのバージョンの選択
    
    'objIEのHTMLの中からselectのタグをsltに代入しながら確認
    For Each slt In objIE.Document.GetElementsByTagName("select")
        
        'sltに代入されたselectタグのIDがversionだった場合
        If slt.ID = "version" Then
            'sltのタグに含まれるoptionのタグをoptに代入しながら確認
            For Each opt In slt.GetElementsByTagName("option")
                
                'optに代入されたoptionタグのInnerTextがB6のセルと同じだった場合
                If Trim(opt.InnerText) = Worksheets("情報").Range("B6").Value Then
                    'optに代入されたoptionタグを選択
                    opt.Selected = True
                End If
            Next
        End If
    Next
    
    '送信ボタンのクリック
    
    'objIEのHTMLにあるinputタグをobjに代入しながら確認
    For Each obj In objIE.Document.GetElementsByTagName("input")
        
        'objに代入されたinputタグのvalueの値が送信だった場合
        If Trim(obj.Value) = "送信" Then
            'objをクリック
            obj.Click
        End If
    Next
    
    '終了のメッセージボックスを表示
    MsgBox "終了"
    
    'objIEに代入したInternetExplorerを閉じる
    objIE.Quit
    
    'objIEを空にする
    Set objIE = Nothing
End Sub

テキストエリアへの入力

では上記コードより最初にメモ欄への記載について解説したいと思います。
今回もHTMLとVBAのコードを確認しながら解説していきた思いますので、まずは下記HTMLとVBAのコードをご覧ください。
メモ欄のHTML
<th>メモ欄</th>
<textarea id="note" rows="3" cols="40"></textarea>
VBAのコード
'メモ欄への記載
'objIEのHTMLの中からtextareaのタグをobjに代入しながら確認 For Each obj In objIE.Document.GetElementsByTagName("textarea") 'objに代入されたtextareaのタグのIDがnoteの場合 If obj.ID = "note" Then 'objに代入されたtextareaのタグにB7のセルの値を入れる obj.Value = Worksheets("情報").Range("B7").Value End If Next
結論を言うと、こちらのコードは前回とほとんど同じです。
取得するタグがtextareaになっているだけという感じなので解説は軽くにします。

For Each obj In objIE.Document.GetElementsByTagName("textarea")


これは前回のinputタグを取得した時と同じで、objの変数にobjIEのHTMLの中からtextareaというタグを取得していきます。
これはもうわかりますよね?

If obj.ID = "note" Then


こちらも上記と一緒で前回解説したobjに代入されたタグのIDがnoteだった時に次の処理に行くという内容です。

obj.Value = Worksheets("情報").Range("B7").Value


こちらも前回のハンドルネームと一緒で「noteというIDのtextareaタグにB7のセルの内容を入れますよ」という事なので、もうわかりますよね?

この様にHTMLのタグが違ってもIDなどから処理したい要素を探し、Valueなどで値を入れるということは一緒なので、この事を覚えておいてください。

リストボックスの選択

では次にExcelのバージョンのリスト選択について解説します。
ExcelのバージョンのHTML
<th>Excelのバージョン</th> <select id="version"> <option value="2016">Excel2016</option> <option value="2013">Excel2013</option> <option value="2010">Excel2010</option> <option value="2007">Excel2007</option> </select>
VBAのコード
'Excelのバージョンの選択 'objIEのHTMLの中からselectのタグをsltに代入しながら確認 For Each slt In objIE.Document.GetElementsByTagName("select") 'sltに代入されたselectタグのIDがversionだった場合 If slt.ID = "version" Then 'sltのタグに含まれるoptionのタグをoptに代入しながら確認 For Each opt In slt.GetElementsByTagName("option") 'optに代入されたoptionタグのInnerTextがB6のセルと同じだった場合 If Trim(opt.InnerText) = Worksheets("情報").Range("B6").Value Then 'optに代入されたoptionタグを選択 opt.Selected = True End If Next End If Next

For Each slt In objIE.Document.GetElementsByTagName("select")


上記のコードも今までの解説とほとんど同じで、sltの変数にobjIEのHTMLの中からselectのタグを取得しています。
これはもう簡単ですよね?

If slt.ID = "version" Then


これもまたまた今まで通りで、sltの変数に入ったselectタグのIDがversionの時、次の処理をします。

For Each opt In slt.GetElementsByTagName("option")


やっとここから今までとは違った処理をします。
まず、optの変数にoptionを代入することはわかると思います。

ただ、ここが違います。
【slt.GetElementsByTagName】
このように先程sltに代入したタグの中にあるoptionというタグを取得するようにしています。

まず、HTMLを見ながら確認してもらうと分かりやすいと思うのですが、<select>~</select>の間に<option>~</option>というタグが挟まれていると思います。
このようにselectタグで囲まれているoptionタグの中の値がリストのパーツになります。

では上記のslt.GetElementsByTagNameselectタグに挟まれたoptionタグをあわせて考えると、sltにはselectタグが代入されています。
その「sltに代入されたselectタグの範囲からoptという変数にoptionのタグを代入していく」という処理をしていっているのです。

注意点としては、Documentを入れないことです。
Documentを入れてしまうとHTML全体から探してしまうので、他にoptionタグがあった時、全てのoptionタグに対して処理をしてしまうので、sltに代入されたリストだけを操作したい時には、必ずDocumentを抜いてあげましょう。

ボタンのクリック

次は送信ボタンの実行について説明します。
送信ボタンのHTML
<input onclick="inf(frm)" id="date" value=" 送信 " type="submit">
VBAのコード
'送信ボタンのクリック 'objIEのHTMLにあるinputタグをobjに代入しながら確認 For Each obj In objIE.Document.GetElementsByTagName("input") 'objに代入されたinputタグのvalueの値が送信だった場合 If Trim(obj.Value) = "送信" Then 'objをクリック obj.Click End If Next
こちらは前回のIE操作【inputタグへの値の入力】で解説した、ラジオボックスの選択とほとんど一緒です。

For Each obj In objIE.Document.GetElementsByTagName("input")


こちらはもうお分かりですよね?
objにobjIEのHTMLからinputタグを代入していきます。

If Trim(obj.Value) = "送信" Then


こちらが少しだけ違いますが、objに代入されたinputタグのvalueの値が送信だった時に次の処理に進みます。

obj.Click


こちらもわかりますよね?
objをクリックするだけです。

前回の記事からここまで理解できたら、ユーザーフォームの操作は出来るようになってると思います。
何度も言いますが、基本の流れは
【For Eachで変数へタグを代入し、そのタグが操作したいタグかをIfで確認する】
という流れになります。
この事を覚えたら、後はHTMLを確認してどのタグの何を確認して処理をするかを考えるという事になります。

オブジェクトの解放

ここで最後に1つ、やっておかないといけないことがあります。
'objIEに代入したInternetExplorerを閉じる
objIE.Quit
'objIEを空にする
Set objIE = Nothing

objIE.Quit


上記でIEを閉じます。

Set objIE = Nothing


ここが大事で、objIEにInternetExplorerを代入したままだと、objIE.QuitでIEを消しても、PCのプロセスとしては起動したままになります。
なのでSetを使い、objIEの中身をNothingで空にして終了してください。

またマクロ実行後にInternetExplorerを目視で確認したい時もあると思います。
そういう時にはobjIE.Quitは省くことでIEを閉じないように出来ますので、必要に応じてobjIE.Quitは入れてください。
ただし、Set objIE = Nothingは入れておくことでマクロからIEを解放できますので、こちらはIEの自動操作をする場合、必ず最後に入れておいた方が良いと思います。

最後に

このIEの操作の解説はいかがでしたか?
結果実際に動かして、何をしているかを確認しながら理解することが一番覚えれるので、このブログを参考にしながら、コピペでもいいので動かしてみて、分からなければコメントなどで質問頂ければお答えしますので実践してみてください。

次からはIE上の表の出力を解説していきたいと思います。