VBA デキる解る!IE操作編 【リストボックスを選択・取得する方法】

この記事は約10分で読めます。

VBA操作編7回目 サムネイル

どうも、マサヤです!

この記事は、VBAでのIE操作が初めて or 慣れていない方向けに『Webサイト・システムの情報を取得・設定する方法』をお伝えしていく連載記事となってます!

 

前回はチェックボックスチェック・判別する方法を紹介しました!

 

今回は「リストボックスを選択・取得する方法」をお伝えします!

ラジオボタンやチェックボックスのようにClickメソッドで出来そうですが、リストボックスは違うメソッドを使って選択することになります。

ちなみにリストボックスは、プルダウンやセレクトボックス、コンボボックスなど色々な呼び方をされていますが、ネットで調べてると意味が通じればどれでも良さそうですね)笑

さて、余談はこの辺にして本題にいきましょう!

本記事で習得できること

  • 複数のリストボックスの選択方法。
  • 選択しているリストボックスの値を取得する方法。

 

スポンサーリンク

【動画で確認】リストボックスを選択・取得する方法

 

今回もサンプル用ページを用意しましたので、こちらを見ながら本記事を読むことで理解しやすくなります。

では、動きをご覧ください。

※クリックすると大きくなります。 VBAIE操作 リストボックス クリック・取得

 

リストボックスを選択・取得するコード

 

動画で動きを確認できたら、次はコードです。

先にリストボックスのHTMLを確認して、その後でVBAコードを見ていきましょう。

 

リストボックスのHTML

<select id="like_sports__example">
    <option value=""></option>
    <option value="Baseball">野球</option>
    <option value="Football">サッカー</option>
    <option value="Rugby">ラグビー</option>
    <option value="volleyball">バレー</option>
    <option value="basketball">バスケ</option>
</select>

リストボックスはselectタグを使って記述されます。

今回のリストボックスにはid属性が付与されています。

紹介するVBAコードでは、このid「like_sports__example」を取得して操作してます。

属性が一つも付与されていない場合は、getElementsByTagNameでselectタグを取得しましょう。

 

VBAコード

Sub ieListBox()

    'IEオブジェクトを作成
    Dim ie As InternetExplorer
    Set ie = CreateObject("InternetExplorer.Application")
    
    'HTMLコレクションを取得 独自関数化
    Call IeGetObj(ie, "https://mmm-program.com/vba-test-selectbox/")
    
    '長いの変数に格納 可読性を高めるため
    Set sports = ie.document.getElementById("like_sports__example")
    
    'selectIndexで選択 野球を選択
    sports.selectedIndex = 1
    
    'Selectedで選択 サッカーを選択
    sports(2).Selected = True
    
    'Valueで選択 ラグビーを選択
    sports.Value = "Rugby"

    'リスト項目名で選択 バレーを選択
    For Each sport In sports.getElementsByTagName("option")
        If sport.innerText = "バレー" Then
            sport.Selected = True
        End If
    Next

    'リストの一番最後を選ぶ方法 バスケを選択
    sports.selectedIndex = sports.Length - 1
   
    '選択されている項目を取得
    For Each sport In sports.getElementsByTagName("option")
        If sport.Selected = True Then
            Range("C3") = sport.Value
            Range("C4") = sport.innerText
        End If
    Next

    'オブジェクトを閉じる
    ie.Quit
    
    'メモリからオブジェクトを破棄
    Set ie = Nothing
 
End Sub

'指定URLのオブジェクトを取得する独自関数
Sub IeGetObj(obj, url, Optional vFlg As Boolean = True)
    
    'IEを表示(見えるようにする)
    obj.Visible = vFlg
    
    '指定したURLをIEで開く
    obj.Navigate url
    
    'サイトの読み込みが完了するまで待つ
    Do While obj.Busy = True Or obj.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
End Sub

 

リストボックスの選択方法

 

リストボックスの選択方法を複数紹介します。

用途に合わせて使い分けていきましょう。

リストの順番で選択①:selectedIndex

リストの並び順(順番)で選択するコードです。

選ぶ項目がいつも一緒で並び順が変わらない場合は下記のように簡単に記述できますね。

※コード:13~14行目
'selectIndexで選択 野球を選択
sports.selectedIndex = 1

 

VBAでは番号(順番)は0(ゼロ)から始まる

リストの順番は、1が最初ではなく0が最初の始まりになります。

今回のサンプルを例すると下記のようになります。

0:空白
1:野球
2:サッカー
3:ラグビー
4:バレー
5:バスケ
プログラムでの番号(順番)は、ほぼ0から始まることを覚えておくと、他のプログラム言語を習得する際も抵抗なく学べます。

リストの順番で選択②:Selected

これも並び順で選択する方法です。

※コード:16~17行目
'Selectedで選択 サッカーを選択
sports(2).Selected = True

()内の数字を変えることで順番を変えれます。

書き方が少しだけ違うだけで、先ほど紹介したselectedIndexと同じです。

 

値で選択:Value

Valueで選択する方法です。

'Valueで選択 ラグビーを選択
sports.Value = "Rugby"

Valueとは、ページ上で実際に見えている選択(リスト)項目名ではなく、HTML内のValue属性のことを指します。

サンプルのHTMLでは下記の赤文字がValueになります。

<select id=”like_sports__example”>
<option value=””></option>
<option value=”Baseball”>野球</option>
<option value=”Football”>サッカー</option>
<option value=”Rugby”>ラグビー</option>
<option value=”volleyball”>バレー</option>
<option value=”basketball”>バスケ</option>
</select>

選択する値が決まっているがリスト項目の順番が入れ替わる場合、Valueによる選択が有効です。

 

リスト項目名で選択:innerText

リスト項目自体で選択する方法もお伝えします。

'リスト項目名で選択 バレーを選択
For Each sport In sports.getElementsByTagName("option")
    If sport.innerText = "バレー" Then
        sport.Selected = True
    End If
Next

リスト項目を直接的に選択するメソッドはないため、リスト内のOptionタグを取得します。

取得したコレクションに対してFor Eachでループ処理し、if文でinnerText(リスト項目名)が選択したい項目になったら、現在のOptionタグの要素に対してSelected = Trueを行えば選択できます。

 

リスト項目の最後を選択:Length

使うシーンはあまり無そうですが、とりあえず一番最後の項目を選択したい場合の方法です。

※コード:29~30行目
'リストの一番最後を選ぶ方法 バスケを選択
sports.selectedIndex = sports.Length - 1

リスト項目に対して、Lengthメソッドを使うことでリスト数を取得することができます。

後は、SelectedIndexを使って選択すればOKです。

上記コードで-1になっているのは前述したとおり、順番が1ではなく0から始まるためです。

 

スポンサーリンク

リストで選ばれている項目の取得方法

 

Selectedメソッドを使うことで選択されているリスト項目を取得できます。

※コード:33~38行目
'選択されている項目を取得
For Each sport In sports.getElementsByTagName("option")
    If sport.Selected = True Then
        Range("C3") = sport.Value
        Range("C4") = sport.innerText
    End If
 Next

上記コードでは、Optionコレクションを取得・ループさせ、if文でselectedがTrueかを判定し、ExcelへValueとリスト項目自体(innerText)を出力しています。

Selected = Trueは、現在選択されているリスト項目となります。

 

手動なら動くのに、VBAで選択するとJavaScriptが動かない

 

VBAでリスト項目を選択する方法をお伝えしましたが、ここで一つ注意点があります。

リスト項目選択時に連動してページ内に動きが発生するといった、いわゆるJavaScriptが仕込まれていた場合、紹介した方法では上手くJavaScriptが発動してくれません

もちろん対処方法は存在するので安心してください。

ただ、ここまで結構長くなっているので、リスト項目選択時のJavaScript発動方法については次回お伝えしますね!

まとめ

 

リストボックスへの選択と取得方法を簡単にまとめると、

Name属性で要素を取得した上で、

  • チェック:リスト項目が変動しない場合、Selected or SelectIndexで選択。リスト項目に変動がある場合、ValueもしくはInnerTextで判別し選択。
  • 取得  :ForでSelectedがTrueを判別することで、選択リストを取得。

さて次回は、リストボックス選択時にJavaScriptを発動させる方法をお伝えしていきますね!

お楽しみに!

コメント