すみません。また質問させてください。
コンボの内容を選択したいのですが
どうもうまくいかないので教えてください。
フレームで上下に分かれていて
下のページに
<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
と書いているのですが。
すみません。途中で切れてしまいました。
と書いているのですが、
そのまま素通りになってコンボを選択できません。
どうすればよいのか悩んでいるので
教えてください。よろしくお願いいたします。
multiple属性の無いOPTIONエレメントに対しては、
selectedIndexプロパティを利用してみてください。
魔界の仮面弁士さんお早いお返事ありがとうございます。
selectedIndexプロパティを使用して色々試してみたのですが
うまくいきませんでした。
上の方で書いたソースのように Test3 を選択したいのですが、
selectedIndexプロパティの使い方が良くわからないので、
もしよろしければサンプルをお願いできませんか?
色々試してみていて、
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
でうまく選択できるようになりました。
ありがとうございました。
> 色々試してみていて、
(中略)
> でうまく選択できるようになりました。
解決済みのようですが、一応、補足しておきます。
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プロパティは、引数指定が
# 省略された場合、コレクションの先頭要素を返します。
なお、私の回答中の『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))
ツイート | ![]() |