WebBrowserでコンボ内のデータを選択するには?

解決


MAKOTO  2003-09-29 20:58:34  No: 79591

すみません。また質問させてください。
コンボの内容を選択したいのですが
どうもうまくいかないので教えてください。

フレームで上下に分かれていて
下のページに

<select name="Combo1" size="1">
<option>Test1</option>
<option>Test2</option>
<option>Test3</option>
<option>Test4</option>
</select>

というコンボがあります。

On Error Resume Next

    Set objDoc = WBMain.Document
    Set objTag = objDoc.Frames.Item(1).Document
    Set objText = objTag.getElementsByName("Combo1")

    i = 0

    For Each objSelect In objText.Options
        If objSelect.Value = "Test3" Then
            objSelect.Options(i).Selected = True
            Exit For
        End If

        i = i + 1
    Next

と書いているのですが。


MAKOTO  2003-09-29 21:00:51  No: 79592

すみません。途中で切れてしまいました。

と書いているのですが、
そのまま素通りになってコンボを選択できません。
どうすればよいのか悩んでいるので
教えてください。よろしくお願いいたします。


魔界の仮面弁士  2003-09-29 23:13:27  No: 79593

multiple属性の無いOPTIONエレメントに対しては、
selectedIndexプロパティを利用してみてください。


MAKOTO  2003-09-30 00:23:27  No: 79594

魔界の仮面弁士さんお早いお返事ありがとうございます。
selectedIndexプロパティを使用して色々試してみたのですが
うまくいきませんでした。

上の方で書いたソースのように Test3 を選択したいのですが、
selectedIndexプロパティの使い方が良くわからないので、
もしよろしければサンプルをお願いできませんか?


MAKOTO  2003-09-30 18:29:24  No: 79595

色々試してみていて、

    Set objDoc = WebBrowser1.Document
    Set objTag = objDoc.Frames.Item(1).Document
    Set objText = objTag.getElementsByName("Combo1")

    For Each objSelect In objText.Item
        If objSelect.Text = "Test3" Then
            objSelect.Selected = True
            Exit For
        End If
    Next

でうまく選択できるようになりました。
ありがとうございました。


魔界の仮面弁士  2003-09-30 19:15:48  No: 79596

> 色々試してみていて、
(中略)
> でうまく選択できるようになりました。

解決済みのようですが、一応、補足しておきます。

getElementBy**** 系メソッドと、
getElementsBy**** 系メソッドを混同しないように注意してください。

前者は、対象のエレメントその物を返しますが、
後者は、対象のエレメントを含むコレクションを返します。

そして、指定されたエレメントが無い場合、前者はNothingを返し、
後者の場合は、要素数(lengthプロパティ)が0のコレクションとなります。
(コレクションの個々の要素を得るには、itemプロパティまたはFor Eachを使います)

# なお、前者に相当するのはgetElementByIdメソッド、後者は
# getElementsByNameメソッドおよびgetElementsByTagNameメソッドです。

> Set objText = objTag.getElementsByName("Combo1")

つまり上記のコードで、getElementsByNameメソッドで得られる戻り値は、
Combo1のエレメントではなく、「Combo1を含むコレクション」なのです。

Combo1自体を得たい場合には、
   Set objText = objTag.getElementsByName("Combo1")(0)
もしくは、
   Set objText = objTag.getElementsByName("Combo1").item(0)
のように記述する必要があります。

# 一番初めの投稿では、objTextがエレメントのコレクションのままでしたので、
# 『For Each objSelect In objText.Options』の行でエラーになっていたハズです。
## SELECTエレメント オブジェクトには、optionsプロパティがありますが、
## エレメントコレクション オブジェクトには、optionsプロパティはありませんから。

それを踏まえて、元のソースで使われている「.options(i)」を生かすなら、
  Set Opts = objSelect.options
  For i = 0 To opts.length - 1
      If opts(i).value = "Test3" Then
          opts(i).selected = True
          Exit For
      End If
  Next
という感じになります。

seletedIndexで処理するなら、
  Set Opts = objSelect.options
  For i = 0 To opts.length - 1
      If opts(i).value = "Test3" Then
          objSelect.selectedIndex = i
          Exit For
      End If
  Next
となります。

For Each によるコードを生かすなら、
  For Each objOption In objText.options
      If objOption.value = "Test3" Then
          objOption.selected = True
          Exit For
      End If
  Next
と書きます。

---
ちなみに、MAKOTOさんが自己解決されたコードがうまくいくのは、
「objText.Item」が「objText(0)」と同義だからです。

# エレメントコレクションのItemプロパティは、引数指定が
# 省略された場合、コレクションの先頭要素を返します。


魔界の仮面弁士  2003-09-30 19:48:45  No: 79597

なお、私の回答中の『Set Opts = objSelect.options』などで
使われている objSelect という変数は、
   Set objSelect= 〜〜.getElementsByName("Combo1")(0)
などとして得た、単一のSELECTエレメントを現すオブジェクトだと思ってください。

# MAKOTOさんが使っていた、『objText』という変数名に違和感があったので、
# 勝手に、『objSelect』に置き換えた次第です。すみません。

> ちなみに、MAKOTOさんが自己解決されたコードがうまくいくのは、
> 「objText.Item」が「objText(0)」と同義だからです。
もう一つ補足。

SELECTエレメントのoptionsプロパティは、省略可能プロパティです。
その為、MAKOTOさんの解決投稿 (2003/09/30 09:29:24) のコードの
   『For Each objSelect In objText.Item』
というのが、結果として、
   『For Each objSelect In objText(0).options』
のように扱われていたわけです。

    Set objText = objTag.getElementsByName("Combo1")
    'エレメントコレクション型
    Debug.Print TypeName(objText)

    'SELECTエレメント型
    Debug.Print TypeName(objText.item)    '普通は、こういう書き方はしない
    Debug.Print TypeName(objText.item(0)) 'これが一般的な書き方
    Debug.Print TypeName(objText(0))      'この方法も良く使われる

    'OPTIONエレメント型
    Debug.Print TypeName(objText(0).options.item(0))
    Debug.Print TypeName(objText(0).options(0))


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加