ie-excel

エクセル・マクロでie操作

Excel VBAでIEを操作 プルダウンで選択されている文字列を取得する

2018/11/11

プルダウンメニューの時HTMLのタグは、「Select」タグで表現されます。
実際の選択肢は「Select」タグの子タグの「Option」タグで構成されルこととなります。
そして現在選択されている選択肢は、プロパティである「Selected」が「True」もしくは「selected」となってます。

と書いてもわかりにくいので、Amazonでカテゴリー選択するプルダウンのメニューの実際のソースです。

Amazonのソース
<select class='nav-search-dropdown searchSelect'id='searchDropdownBox' name='url'>
  <option selected='selected' value='search-alias=aps'>すべてのカテゴリー</option>
  <option value='search-alias=amazonfresh'>Amazon フレッシュ</option>
  <option value='search-alias=amazon-devices'>Amazon デバイス</option>
</select>

上記ソースを簡単に説明します。

プルダウンが「Select」タグで宣言されています。

<select class='nav-search-dropdown searchSelect'id='searchDropdownBox' name='url'>

 ・・・・

</select>

選択肢は多数あったので、3つほどに限定したソースにしています。
「Option」タグで「すべてのカテゴリー」「Amazon フレッシュ」「Amazon デバイス」が選択可能となってます。

<option selected='selected' value='search-alias=aps'>すべてのカテゴリー</option>
<option value='search-alias=amazonfresh'>Amazon フレッシュ</option>
<option value='search-alias=amazon-devices'>Amazon デバイス</option>

以下のタグに対し、SelectedのプロパティがSelectedとなっているため、「すべてのカテゴリー」が選択されていることとなります。

<option selected='selected' value='search-alias=aps'>すべてのカテゴリー</option>

前準備

  • Visual Basic Editor の画面から「ツール」→「参照設定」を選択します。
  • 「Microsoft Internet Controls」と「Microsoft HTML Object Library」にチェックを入れて、OKを押す

IEのから対象ウィンドウを特定して、プルダウンで選択されている文字を取得する

IEを開いているとして、そこから対象ウィンドウを特定し、プルヅンで選択されている文字列を取得するためには以下が必要となります。

  1. 複数のウィンドウからIEを特定する
  2. 対象のサイトが開いているIEを特定する
  3. プルダウンメニューをすべて一つずつ以下の処理をする
  4. オプションタグを読み取り、選択されているタグの文字列を取得する

上記を実際のVBAで表現すると以下のようになります。

実際のコード
'変数を必ず定義すると宣言
Option Explicit

'変数を宣言
Dim objShell As Object
Dim objWindow As Object
Dim ieDoc As HTMLDocument
Dim selDoc As HTMLSelectElement
Dim optDoc As HTMLOptionElement

Const strSite As String = "Amazon"

Sub ie_select_value()

  'シェルのオブジェクトを作成
  Set objShell = CreateObject("Shell.Application")

  '立ち上がっているエクスプローラーをすべて検索
  For Each objWindow In objShell.Windows

    '対象をIEのみに限定
    If objWindow.Name = "Internet Explorer" Then
      Set ieDoc = objWindow.document
      
      'タイトルにAmazonの文字列があるIEのSelectタグの中で選択されている文字列をメッセージボックスとして出力する
      If InStr(ieDoc.Title, strSite) > 0 Then
      
        For Each selDoc In ieDoc.getElementsByTagName("select")

          For Each optDoc In selDoc.getElementsByTagName("option")
            If optDoc.Selected = True Then
              MsgBox optDoc.innerText
            End If
          Next
        Next
      End If
    End If
  Next
  
End Sub
selectタグに限定して1件ずつ処理
'変数を宣言
Dim selDoc As HTMLSelectElement

  ・・・・

For Each selDoc In ieDoc.getElementsByTagName("select")

  ・・・・

Next

変数「selDoc」にHTMLのSELECT要素をのオブジェクトであることを宣言しています。

読み込んだHTMLのドキュメントの中で「select」タグを限定。一件ずつ処理することとしています。

Selectタグの中のOptionタグを1件ずつ処理
'変数を宣言
Dim optDoc As HTMLOptionElement

 ・・・・

For Each optDoc In selDoc.getElementsByTagName("option")
  If optDoc.Selected = True Then

  ・・・・

  End If
Next

上記で対象としたSelectタグに対して、その子タグのうち「Option」タグを検索しています。

今回の対象は選択されているデータのため、プロパティである「selected」が「True」のデータを取得します。
※Selectedのプロパティには「Ture」もしくは「False」が設定されます。

-ExcelでIE操作