[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True

IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True

メルマガ発行内容

<IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True>

どうも、三流プログラマーのKen3です。 今回は、 掲示板でもらった質問、 IEを起動してSELECTタグのoptionを選択 を少し、探ってみたいと思います。 いつものように、たいした解説、回答内容じゃないので、 暇つぶしに休み時間などに拾い読みしてください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba110.lzh にtest110-book.xlsが保存されています。

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

掲示板に下記の質問をもらいました。 ---- > すみません。どうしても分からなかったので質問します。 > AccessからIEを起動してフォームに値を入れるというのは > 前回のめるまがでとても参考になりました。ありがとうございます。 > で、そこからなんですが、ドロップダウンの値を直接指定して入力 > することはできるんでしょうか。 > 【ソース例】 > <SELECT name="ken"> > <option value="1">1</option> > <option value="2">2</option> > <option value="3">3</option> > </SELECT> > Htmlソースは上の感じなんですが、これを > objIE.document.all.ken.value = "3" > と指定するとエラーが出ます。 > 指定の仕方が違うと思うのですが、検索しても分からなかったのです。 > プロの人だと「当たり前じゃねえか」と思われるかも知れませんが > 宜しくお願い致します。 ---- なんで、 > プロの人だと「当たり前じゃねえか」 なんて私は、思ったりしないんだけど、 あと、ご教授くださいとか多いんだろう?・・・・ それだけお偉いプログラマー様の回答者が世の中多いんだろうけど。。。 そんな偉いシステム屋さんと私も、同じ扱いを受けて光栄です そこまでレベル上げたいよね、 じゃなくって、なんか悲しいよね(涙) ※全体に言っている独り言なので、質問者の人には言ってないので、  気にしないでね(聞いてほしい独り言が多いってば・・・)  文句を言いたいのは、お偉い回答者さん達とそれを支える熱狂的なご教授信者さん  まぁ、そんなこと言っててもダメってのがツライよね。  また、ある掲示板へ戦いにじゃなくって宣伝に行くかな(ある掲示板って?どこ?) えっ、ハヤク解説始めろって? 質問の回答以外は聞きたくも無いって? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ それが三流作者のメルマガの特徴なので。 いつもの前置きが長かったですね(謎?)

/* * 2.語学力無いので、かなり苦戦する(笑) */

そんなの「当たり前じゃねえか」とは、言えないぐらいに苦戦しました(笑) いろいろと試行錯誤するが私も出来なかった。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 一流読者の人に、私も、そんなの「当たり前じゃねえか」なんて言われてんだろうなぁ と思いつつ、調べ始めます。 ※なかなか最後まで行き着かないので、  先に回答の3.サンプルを見たほうがいいかも。  で、見てからこちらに戻ってきてください。 IE ドキュメントオブジェクトは、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 私のパターンは、下記のリンクから探り始めてます。 http://msdn.microsoft.com/workshop/browser/webbrowser/reference/properties/document.asp を見ると、 Microsoft Visual Basic programs that early bind to the HTMLDocument object can reference it through the IHTMLDocument, IHTMLDocument2, and IHTMLDocument3 interfaces. HTMLDocument objectは、 IHTMLDocument IHTMLDocument2 IHTMLDocument3 なんて、インターフェース?を持ってんの?だからなに? ※ここから下も勝手な和訳が続くので適当に読んでね。 (Ken3の独り言が続く(笑)) IHTMLDocument2 に .allがあって http://msdn.microsoft.com/workshop/browser/mshtml/reference/ifaces/document2/get_all.asp を見ると、 You can use the IHTMLElementCollection::length property to determine the number of element objects in the collection, and the IHTMLElementCollection::item or IHTMLElementCollection::tags function to retrieve individual objects or collections of objects from the collection. You can 何いってんのか、わかんないよ。 日本に来たら、日本語話せよとコンビニ店長時代ならレジ打ったあと言ってたけど、 .comに来たら、英語ぐらい読めと言われそう・・・ なんて話は置いといて、 IHTMLElementCollection って、Elementのコレクションがあるんだってさ。 オブジェクトって階層構造になっていて、 コレクションが階層構造になっているのと、 一番下にプロパティやメソッドがあるので、 それをイメージしながら探ると、英語読めなくても探れると思う。 ※ExcelならExcelアプリの下にブックがあってシートにセル、  セルは値や書式を持っている(プロパティ)、  セルのクリアやコピーの動作(メソッド)がある  なんてのが基本です。  *途中のブックにたいして、Saveなどのメソッドもあり、   一番下だけにプロパティ・メソッドがあるんじゃないことも注意かなぁ。 Document.All は、そんなコレクションからできてるんだってさ。 ^^^^^^^^^^^^^^^^^ だからなんだっつうの・・・オレは三流プログラマーだってばさ、 英語なんか読めないよ。 ハヤクサンプルソースまでたどり着きたい・・・ で、ここがDHTMLのオブジェクトだって・・・ http://msdn.microsoft.com/workshop/author/dhtml/reference/objects.asp おっ、ここに、HTMLでよく見かけるタグが存在する。 やっとたどり着いた? ※ここ、新たなブックマーク候補です。  ここから調べると、タグ単位で探りやすそうです。 相変わらず英語だけど、いろいろと出てきた。 input Creates a variety of form input controls. input type=button Creates a button control. input type=checkbox Creates a check box control. input type=hidden Transmits state information about client/server interaction. などなど、いろいろあるけど、 目的のオブジェクトは、 ~~~~~~~~~~~~~~~~~~~~~~ SELECT タグのOPTIONでしたね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ option Denotes one choice in a SELECT element. http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/option.asp にやっと書いてありました。 Syntax HTML <OPTION SELECTED ... > Scripting OPTION.selected [ = bSelected ] Possible Values bSelected Boolean that specifies or receives one of the following values.false Default. Item is not selected as the default. true Item is selected as the default. よくわかんないこと書きやがって、、、 えっと、 OPTION.selected = bSelected と代入しろだって? で、bSelected Booleanだって? だったら初めから、 OPTION.selected = True/Falseって書けよ、、と怒り出すぞオイ。

/* * 3.サンプルを作成して、テストする */

http://www.ken3.org/vba/test110.html に、下記のテスト用HTMLを書きました。 <html> <head> <title>IE SELECT への セットをテストするためのHTML</title> </head> <body bgcolor=#ffffff text=#000000> <hr> <h1>IE SELECT への セットをテストするためのHTML</h1> <hr> <FORM ACTION="http://www.ken3.org/cgi-bin/test/test041-1.asp" METHOD="POST"> <font color="blue">TYPE=SELECT の入力テスト</font><br> <br> あなたの好きなセリーグの球団は? <SELECT name="ken"> <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> <br> 感想: <SELECT name="kansou"> <option value="3">IE最高</option> <option value="2">MSは日本語技術情報ハヤク作れ</option> <option value="1">イヤもっと英語力付けろ</option> <option value="0">メルマガふざけないで・・・まじめに書け</option> </SELECT> <br> <INPUT TYPE="submit" NAME="btn" VALUE="送信"> <INPUT TYPE="reset" VALUE="入力し直す"> </FORM> </body> </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> Excelでテストルーチンを作成。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 6番の横浜を選択してみます。
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

     '全ての項目を調べる
     For i = 0 To objIE.Document.all.Length - 1
        'インプットのタグか?.tagnameを見る
        Debug.Print i & ":" & objIE.Document.all(i).tagname
        If objIE.Document.all(i).tagname = "OPTION" Then
            'さらに、値が6(横浜)かチェックする
            If objIE.Document.all(i).Value = "6" Then
                'ここまで調べて、チェックを付ける
                objIE.Document.all(i).Selected = True
            End If
        End If
     Next i

End Sub
1つ1つ、タグを調べて行き、 .tagname = "OPTION" .Value = "6" だったら、 .Selected = True にしてみました。 よし、動いたよ。 あのさぁ、 .tagname = "OPTION" .Value = "6" だからいいけどさ、 .tagname = "OPTION" .Value = "2" 中日を選択にしたいから、 'さらに、値が2(中日)かチェックする If objIE.Document.all(i).Value = "2" Then とすると、全てのデータを回しているので、 <option value="2">MSは日本語技術情報ハヤク作れ</option> もONになるんじゃないの? あっ、確かに・・・ ↑中日とMSは日本語技術情報ハヤク作れが選択されたバグ。 さてと、どうしましょうかねぇ。 また、止めてオブジェクトを見てみます。 If objIE.Document.all(i).Value = "6" Then で、止めて、中身を確認してみます。 確認方法の詳細は No.52 InternetExplorer.application .document.body.innerText http://www.ken3.org/backno/backno_vba11.html#52 を参照してください。 止めて、オブジェクトを見てみると、 おっ、.Textってのがあるよ。 ↑オブジェクトの中身 .textに横浜と球団名が出てるから、これを使用して、 中日を選択するには、 '全ての項目を調べる For i = 0 To objIE.Document.all.Length - 1 'インプットのタグか?.tagnameを見る Debug.Print i & ":" & objIE.Document.all(i).tagname If objIE.Document.all(i).tagname = "OPTION" Then 'さらに、値が2とテキストが中日かチェックする If objIE.Document.all(i).Value = "2" _ And objIE.Document.all(i).Text = "中日" Then 'ここまで調べて、チェックを付ける objIE.Document.all(i).Selected = True End If End If Next i と、 objIE.Document.all(i).Value = "2" _ And objIE.Document.all(i).Text = "中日" の条件でチェックしました。 なんか情けないよねぇ、、、だとすると、 <option value="0">メルマガふざけないで・・・まじめに書け</option> をチェックするときは、 If objIE.Document.all(i).Value = "0" _ And objIE.Document.all(i).Text = "メルマガふざけないで・・・まじめに書け" Then 'ここまで調べて、チェックを付ける objIE.Document.all(i).Selected = True End If と書くの? 選択肢のテキストが変わったら、使えないよね・・・ また、 好きな球団横浜、 嫌いな球団XX をチェックするプログラム作りたかったら? SELECTのタグが違っても、同じ値をセットしてしまうよ・・・

/* * 4.1つ前のタグ、SELECTを覚える */

そもそも、 <SELECT name="ken"> と 項目名はkenにして6球団を選択 <SELECT name="kansou"> と 項目名はkansouにして3〜0を選択 これを無視しているからだよね。 いま、どのSELECTタグを通過したかを覚えて、 下記のように処理しました。 '項目名を探して、データをセットする 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 ポイントは、 ~~~~~~~~~~~~ .tagname = "SELECT"の時、 strSTAG = objIE.Document.all(i).Name 'SELECT名前を代入 と、名前を保存します。 OPTIONよりも先にSELECTタグが現れるHTMLの仕様を利用してます。 ※OPTIONだけはありえないので。 で、あとは、保存されたstrSTAGと値を比べて、 必要なデータを選択してます。

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

もっと、直接指定する方法がありそうなんだけどなぁ・・・ ループでまわして、調べてみました。 今回は、 objIE.Document.all(i).Selected = True で、OPTIONを選択してみました。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba110.lzh にtest110-book.xlsが保存されています。 いろいろと三流プログラマーらしくハマった。 そんなお話でした。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

フィードバック

読者より 2007/10/19 いただいたメッセージ
---

以下のようにSELECT タグの下をチェックするのがスマートだと思います。

Sub setSelect(objElement As Object, nValue As String)
' Webフォームのコンボボックスを選択する
    For Each objOpt In objElement.tags("OPTION")
        If objOpt.Value = strValue Then
            objOpt.Seleted = True
        End If
    Next
End Sub

' 呼び出し
  set objElement = objIE.Document.GetElementsByName("ken")(0)
  Call setSelect(objElement, "1")
---

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.110を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります


ページフッター(リンクや広告など)

[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・