[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.154 IE SELECTタグの選択 .SelectedIndex=nで選択

IE SELECTタグの選択 .SelectedIndex=nで選択

概要:
objIE.Document.all.Ken.SelectedIndex = 5
objIE.Document.all.kansou.SelectedIndex = 2
など、.SelectedIndexでSELECTタグの項目を選択してみた。

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

<IE SELECTタグの選択 .SelectedIndex=nで選択>

どうも、三流プログラマーのKen3です。 今回は、 SELECT タグを探ってみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba154.lzh にvba154.xls(Excel2000版)が保存されています。 ※自分でテストページを作ったりして、遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板で、SELECTタグOPTIONの選択でJavaScriptが起動しない、 そんな問題にぶちあたりました。 もらった質問に対して、いつものように、違う方向に進んでいるんだけど。 今回、 実は、読者からの質問で、 自分だけが得してしまった情報/気が付いたプロパティを書いてみます。 ^^^^^^^^^^^^^^^^^^^^^^^^ 下記がもらった質問です。 ---- <FORM name=form1 onsubmit="mai('s');return false;"> <TBODY> <TR> <TD><B>場名</B><BR> <DIV align=right><SELECT onchange=Rdp(); name=JYO> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> <TD><B>レース</B><BR> <DIV align=right><SELECT onchange=Hdp(); name=Race> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> あるサイトの一部ぬきだしました。 ここで、おそわったのを、まねして WB1.Document.form1.jyo.selectedIndex = 1 WB1.Document.form1.jyo.Options(1).selected = "selected" WB1.Document.form1.jyo.Options(1).selected = True と、やると、コンボに選択された文字がでました。成功!と おもいきや、つぎのレースの選択項目が、からっぽです。 ためしに、マウスでクリックすると、選択項目が、 ふくまれます。documentも、かわるようです。 どうやら、onchangeが、おきてないためらしい。 これについて、いろいろ、しらべたけど、わかりません。 疑問1:rdp()という関数は、どこにあるんでしょうか。      このhtmlの、最後に、なにか、      scriptが、あるのですが、(よめない)      どうも、それではないみたいです。 疑問2: onchangeを、vbから、起こしてやることは      できないでしょうか。 ----

/* * 2.またまた、脱線昔話、いつになったら本題が完成するの? */

http://www.ken3.org/vba/test110.html の 入力フォーム <SELECT name="ken"> と 項目名はkenにして6球団を選択 <option value="1">阪神</option> <option value="2">中日</option> <option value="3">ヤクルト</option> <option value="4">巨人</option> <option value="5">広島</option> <option value="6">横浜</option> </SELECT><br> <SELECT name="kansou"> と 項目名はkansouにして3〜0を選択 <option value="3">IE最高</option> <option value="2">MSは日本語技術情報ハヤク作れ</option> <option value="1">イヤもっと英語力付けろ</option> <option value="0">メルマガふざけないで・・・まじめに書け</option> </SELECT> に対して、SELECT OPTIONを選択する時、 私は、下記のような感じで選択してました。 No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True /vba/backno/vba110.html で、やった方法は、 いま、どのSELECTタグを通過したかを覚えて、 下記のように処理しました。
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test110.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '項目名を探して、データをセットする
     Dim i As Integer
     Dim strSTAG As String  '最近のSELECTタグの名前を保存

     '全ての項目を調べる
     For i = 0 To objIE.Document.all.Length - 1
        'インプットのタグか?.tagnameを見る
        Debug.Print i & ":" & objIE.Document.all(i).tagname
        If objIE.Document.all(i).tagname = "SELECT" Then
            strSTAG = objIE.Document.all(i).Name 'SELECT名前を代入
        End If
        
        If objIE.Document.all(i).tagname = "OPTION" Then
            'さらに、値が2と保存したSELECTがKenかチェックする
            If objIE.Document.all(i).Value = "2" And strSTAG = "ken" Then
                'ここまで調べて、チェックを付ける
                objIE.Document.all(i).Selected = True
            End If
            'さらに、値が1と保存したSELECTがkansouかチェックする
            If objIE.Document.all(i).Value = "1" And strSTAG = "kansou" Then
                'ここまで調べて、チェックを付ける
                objIE.Document.all(i).Selected = True
            End If
        End If
     Next i

End Sub
ポイントは、 ~~~~~~~~~~~~ .tagname = "SELECT"の時、 strSTAG = objIE.Document.all(i).Name 'SELECT名前を代入 と、名前を保存します。 OPTIONよりも先にSELECTタグが現れるHTMLの仕様を利用してます。 ※OPTIONだけはありえないので。 で、あとは、保存されたstrSTAGと値を比べて、 必要なデータを選択してます。

/* * 3..SelectedIndexを使ってみた */

と、やって済ませてたけど、 今回の読者の質問見ると、あれ?これなんだ?って反応したのが、 >WB1.Document.form1.jyo.selectedIndex = 1 >WB1.Document.form1.jyo.Options(1).selected = "selected" >WB1.Document.form1.jyo.Options(1).selected = True の、 .selectedIndex = 1 ^^^^^^^^^^^^^^^^^^ これって、SELECTタグの選択位置じゃないの? 私は、OPTIONタグを一生懸命探して、 objIE.Document.all(i).Selected = True なんてやってたけど、 .SelectedIndexなんてのが使えるなら、 ~~~~~~~~~~~~~~ 上から0番目、上から3番目とか指定した選択が出来そうですね。 上からn番目なので、valueの値とは、連動しないことに注意してくださいね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <SELECT name="ken"> と 項目名はkenにして6球団を選択 <option value="1">阪神</option> <option value="2">中日</option> <option value="3">ヤクルト</option> <option value="4">巨人</option> <option value="5">広島</option> <option value="6">横浜</option> </SELECT><br> <SELECT name="kansou"> と 項目名はkansouにして3〜0を選択 <option value="3">IE最高</option> <option value="2">MSは日本語技術情報ハヤク作れ</option> <option value="1">イヤもっと英語力付けろ</option> <option value="0">メルマガふざけないで・・・まじめに書け</option> </SELECT> テストで、 Ken3が好きなヨハコマベイスターズ と 某掲示板で言われた最新情報ほしかったら英語のドキュメント読め を選択するために、 SELECTタグの.SelectedIndexに値をセットしてみます。 objIE.Document.all.Ken.SelectedIndex = 5 objIE.Document.all.kansou.SelectedIndex = 2 と、上から(0から数えたインデックス)でデータを選択してます。 下記が、ソースファイルです。 option valueと連動していない(残念)なことも含めて確認してみてください。
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")

    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ
    objIE.Navigate "http://www.ken3.org/vba/test110.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     'SELECTタグに付いた名前(Name)がKen上から6番目(5)をテストでセット
     '.SelectedIndexに5をセット(012345で6番目となる)
     objIE.Document.all.Ken.SelectedIndex = 5
     
     'kansouの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
     objIE.Document.all.kansou.SelectedIndex = 2

     '0からインデックスが始まるのがポイントです↑

End Sub
こんな方法もあるんですね・・・・逆に勉強になってしまった。 ______________________________ ---- 余談 試験問題のお話 ---- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ なんか、読者の質問に、別の回答が隠されて居たりしたので、 中学生の頃、英語の試験で、英単語が解らなかった時に、 別の和訳の問題に解答が書いてあった、 そんなかなり前のことをなぜか思い出してしまった。 現在の質問に過去問題の回答が隠されている。なんか面白いよね。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 現在の恋人とのケンカで、昔の恋人との簡単なもう一つの和解方法に気が付いたり? ※↑チョット違うかな。 えっ、過去には戻れないので、今後にその経験を活かせば良いって?  みなさん前向きなんですねメモメモ。過去はあまり引きずらないほうがいいよね!! おっと、昔の問題解決方法は置いといて、現在の問題を処理しないとね。

/* * 4.終わりの挨拶 */

今回は、 またまた、読者質問の本線をほっといて、 勝手に脱線して、 .SelectedIndexを使ってみた話でした。 ^^^^^^^^^^^^^^ だから、ハヤク、.SelectedIndexでJavaScriptが起動しない問題をヤレよ!! 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ) In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする", >日光が斜めから射すので、まっすぐに伸びない? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >植物の成長って、日光に向かって伸びるんですよね。 >太陽の光がナナメからだったら、ナナメに伸びる・・・ >(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) --- って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、 ※最初に教えたループで回してより、  今回の.SelectedIndexにセット方法がよかったみたいに、  教わったことだけじゃなく、さらに調べてくださいね。 

フィードバック

ホームページに来た質問
----
>	<select name="abcedfg" class="NEEDOFF">
>		<option value=""></option>
>		<option value="12345678">12345678 東芝 FL32SW</option>
>
>例えば、7明細の内、1番目のデータを選択する場合の処理についてどの
>様にすればよいのでしょうか?
>
>  リストボックス名(インデックス).Selected = True
----
にたいして、↓下記の回答を行った。

こんにちは。

>例えば、7明細の内、1番目のデータを選択する場合の処理についてどの
>様にすればよいのでしょうか?
>
>  リストボックス名(インデックス).Selected = True

タグがSELECTなので、
<select name="abcedfg" class="NEEDOFF"
ここを押さえときます。

[No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True]
http://www.ken3.org/vba/backno/vba110.html
.Document.all(n).Selected=Trueを使用して、
フォーム内のSELECT タグのOPTIONを選択・・は、面倒なので(ぉぃぉぃ)
※↑は、見ないで、忘れてください。


[No.154 IE SELECTタグの選択 .SelectedIndex=nで選択]
http://www.ken3.org/vba/backno/vba154.html
の
objIE.Document.all.Ken.SelectedIndex = 5
objIE.Document.all.kansou.SelectedIndex = 2
など、
.SelectedIndexでSELECTタグの項目を選択する方法がいいと思います。

<select name="abcedfg" class="NEEDOFF"
なので、
objIE.Document.all("abcedfg").SelectedIndex = 1
でいけるかなぁ。※いけるといいんですが。

あと、Select関係は、
こっちが下から
http://ken3-info.blog.ocn.ne.jp/objie/2009/04/2r_option_selec.html
↑OPTIONから攻めてます。
<option value="12345678"
				>12345678 東芝 FL32SW</option>
↑こちらから攻めたい時など、参考にしてみてください。


うまく説明できませんが、何かの参考となれば、幸いです。
三流プログラマー ken3


質問者より、続きの質問をもらう。。。。

----
>選択したテーブルの値を確認するのに.VALUE指定を駆使しましたが、
>結果を得ることが出来ませんでした。
>
>どの様なコードを記述すれば良いのか、また、IEに関連する推奨教本があり
>ましたならば併せて、教えて頂けないでしょうか。
>
><option value="12345678"
>"12345678" ← objIE.Document.all("abcedfg").VALUE
>
>>12345678 東芝 FL32SW</option>
>"12345678 東芝 FL32SW" ← コード???????
----

に対して、下記の回答を行った。

こんちには。
運悪く、一番紛らわしい
SELECT OPTION 
を操作しないといけないとは、、、
同情します、じゃなかった、

日本語で書く 
OPTIONの値ってのが、
~~~~~~~~~~~
曲者で、
値と聞くと、.VALUEなんですが、
もうひとつ、値として使われるのが、
.InnerTEXTかなぁ。
この InnerTEXT(タグの内側のテキスト) が ONTIONタグの中身、中身=値として、使いたい場合もあるってことで、

動画だと、このあたりかなぁ。
http://www.youtube.com/watch?v=QRe8y_BLE3I&feature=channel_page

まとまってないけど、
FORM SELECT OPTION の攻略(選択)サンプル
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp#Document_Forms_Select
の中の先に進んで、
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp#Select_Multiple
に
.InnerTEXT を 使って、
        '.InnerTEXT(表示テキスト)が 愚痴系(GUCHI) のオブジェクトを探す
        If objOPTION.InnerTEXT = "愚痴系(GUCHI)" Then  '.InnerTEXTを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
とか、やってます。
もちろん、 .Valueを使って、
        '.Value(値)がVBAのオブジェクトを探す
        If objOPTION.Value = "VBA" Then  '.Valueを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
も可能です。

    'Form(0).All.Tags("OPTION")でOPTIONオブジェクトのみ取り出す
    For Each objOPTION In objIE.Document.Forms(0).All.Tags("OPTION")
        '.Value(値)がVBAのオブジェクトを探す
        If objOPTION.Value = "VBA" Then  '.Valueを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
        '.InnerTEXT(表示テキスト)が 愚痴系(GUCHI) のオブジェクトを探す
        If objOPTION.InnerTEXT = "愚痴系(GUCHI)" Then  '.InnerTEXTを見てチェック
            objOPTION.Selected = True    '.Selected = Trueで選択状態にする
        End If
    Next

ってことなんで、

><option value="12345678"
>"12345678" ← objIE.Document.all("abcedfg").VALUE

値 valueは、書かれているように、
objIE.Document.all("abcedfg").VALUE

>>12345678 東芝 FL32SW</option>
↑12345678 東芝 FL32SW
値 IE上で画面で見えてるテキストは、内側のテキストなので、
objIE.Document.all("abcedfg").InnerTEXT
かなぁ。

何かの参考となれば、幸いです。
※SELECT OPTION の 値が一番厄介だと思うけど・・・うまく組み込めることを願いつつ、失礼します。

三流プログラマー Ken3

あっ、間違えた?
objIE.Document.all("abcedfg")
↑、オプションに名前が付いていないから、
SELECTから、ひっぱってくるなら

入力FORM SELECTの情報を取り出す
http://ken3-info.blog.ocn.ne.jp/objie/2009/05/form_select_4bd.html

.Options(n番目)とか使い、

>	<select name="abcedfg" class="NEEDOFF">
>		<option value=""></option>
>		<option value="12345678">12345678 東芝 FL32SW</option>

なら、
objIE.Document.all("abcedfg").Options(1).InnerTEXTかぁ。
あっ、1番目とか決まっていないから、
選択されている位置が、.SelectedIndexなので、
n = objIE.Document.all("abcedfg").SelectedIndex
を実行後、
objIE.Document.all("abcedfg").Options(n).InnerTEXT
かなぁ。

n(選択位置) = objIE.Document.all("abcedfg").SelectedIndex  'SELECTの位置を.SelectedIndexで
objIE.Document.all("abcedfg").Options(n).InnerTEXT 'SELECTの.Options(n選択位置)の.InnerTEXT 内側のテキスト

これで、やっと、選択されているSELECT OPTIONのテキストがわかるのかぁ。

自分で
>運悪く、一番紛らわしい
>SELECT OPTION 
>を操作しないといけないとは、、、
>同情します、

とか言ってて、間違えた・・・スミマセン。

間違いを反面教師の意味をこめて、そのまま、載せときます。。。。(ぉぃぉぃ)

このページを見た人が、うまく行き、笑顔で笑えますように、、と思いつつ、失礼します。
※※やっぱり、三流だなぁ・・・?と、自分自身に言ってみた。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]