[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い

IE ラジオボタン(RADIO)の.Checkedと.Clickの違い

概要:
INPUT Type=RADIO(ラジオボタン)のオブジェクトに対して、
.Checkedだとイベントが起動しないが、
.ClickだとonClickのイベントが起動する、
そんな違いの話を少し書いてます。

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

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

メルマガ発行内容

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

<IE ラジオボタン(RADIO)の.Checkedと.Clickの違い>

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

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

VBA系の掲示板に来た質問です。 ---- WebBrowserコントロールからラジオボタン選択がうまくできません。 Googleの先頭ページのラジオボタン選択は過去ログを拝見してうまくできました がうまくできないページがあります。その他のラジオボタン選択方法についてよ ろしければ教えて下さい。 ---- と もらった質問にいつものように、質問に質問で返し(オイオイ) ※出来るだけ、質問に質問で返さないように心がけてるんだけど・・・ ---- こんな質問返しをしてみたり --- できたら、うまく行かなかったページの HTMLのフォーム部分だけでもUPしてもらえると、 何かしらアドバイスできるかもしれません。 ----

/* * 2.問題のページのソースファイル */

http://www.ken3.org/vba/test148.html に質問者からのHTMLをUPしました。下記のような感じのHTML文です。 <HTML> <BODY BGCOLOR="#ffffff"> <TABLE BORDER=0 frame="border"> <TR> <TD> <DIV ALIGN=LEFT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a1" tabindex="1" onClick="clickradio()" CHECKED><font size="3" color="#0066ff"><b>すみれ</b></font> </DIV> </TD> <TD> <DIV ALIGN=CENTER> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a2" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>たんぽぽ</b></font> </DIV> </TD> <TD> <DIV ALIGN=RIGHT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a3" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>ひまわり</b></font> </DIV> </TD> <TD> <DIV ALIGN=RIGHT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a4" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>チューリップ</b></font> </DIV> </TD> </TR> </TABLE> </BODY> </HTML> ぱっと見、フォーム?<FORM>使っていないのかなぁ?まぁいいや、 ^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 3..allから選択してみる */

_________________________ ---- 余談 ハマった話 ---- ~~~~~~~~~~~~~~~~~~~~~~~~~ INPUT type=radio Element | input type=radio Object http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/input_radio.asp を見ると、ラジオボタンは、 .Checked = True / False なんですね。 objIE.document.all.memo.Value = strPARA '感想をセット と同様に objIE.document.all.kubun.Value = "VBA" としたら、ダメだった・・・ なので、ループで探して、 .Checked = True としてます。 ※意外とハマリマシタ(笑) なんて感じで、 ラジオボタンのプロパティは.Checked = True / False ですよ と 偉そうに、 No.144 IE PostData付でURLを開く(データをPostする) http://www.ken3.org/backno/backno_vba29.html#144 で、書いてました。 Form(0)のループでフォームの構成要素から下記のようにして探していました。 '区分を探してセットする For Each objITEM In objIE.document.Forms(0) 'フォームのオブジェクトでループ '名前がKUBUNで値がVBAのラジオボタンを探す If objITEM.Name = "KUBUN" And objITEM.Value = "VBA" Then objITEM.Checked = True 'セレクト状態をtrueにする End If Next 今回は、 フォームが無さそうなので、同様に.Allから探してみました。 ^^^^^^^^^^^^^^^^^^^^^^^^ Dim strRADIO(0 To 3) As String 'ラジオボタンの値 '変数の初期化 strRADIO(0) = "a1" 'すみれ strRADIO(1) = "a2" 'たんぽぽ strRADIO(2) = "a3" 'ひまわり strRADIO(3) = "a4" 'チューリップ '種類を選択してみる strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0") nNO = Val(strWORK) If nNO < 0 Or nNO > 3 Then nNO = 0 '範囲外の時、番号を0にする End If なんて感じで、探したいa1〜a4を入力させ、 '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Checked = True 'セレクト状態をtrueにする End If Next とすると、見事にエラーが発生する。 オブジェクトはこのプロパティ・メソッドをサポートしてません ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ えっ?なんで? まぁ、文句言わないで、デバック押しますか。 If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then ここがエラーです。 う〜ん、なんだろうねぇ? プロパティがないのかぁ、.Nameにアクセスできないのか。 あっ、.Nameって<INPUT>のタグとか<FORM>とかの名前しかないのか。 試しにどのタグでこけたか見てみたかったので、 イミディエイト ウインドウで見てみると、 ? objitem.tagname HTML あらら、頭でエラーかよ。 たしかに<HTML>のタグは、.Nameを持っていないよね。 ※<HTML Name="AAAA">なんて無いよね・・・ ↑見せたくないエラーのイメージです(笑) とすると、 objITEM.Nameの前に、.TAGNameでINPUTのタグがチェックして、 それから、.Name = "sentaku" と.Value = strRADIO(nNO)をチェックしますか。 ※各タグによって、持っているプロパティが違うので、先にタグをチェックする '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.TAGName = "INPUT" Then 'まず、タグでINPUTか判断 Debug.Print objITEM.Name 'TESTで値を表示 Debug.Print objITEM.Value 'TESTで値を表示 If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Checked = True 'チェック状態をtrueにする End If End If Next ↑こんな感じで、.TAGName="INPUT"でチェック後に .Name .ValueへアクセスしているのでOKです。 'IEラジオボタンをチェック(.Checked=True)するサンプル
Sub TEST_RADIO_Checked()

    Dim strURL   As String
    Dim objIE    As Object
    Dim objITEM  As Object
    Dim strAAA   As String
    Dim nNO      As Integer '選択値を数値にしたいので
    Dim strWORK  As String  'ワーク変数
    Dim strRADIO(0 To 3) As String  'ラジオボタンの値

    '変数の初期化
    strRADIO(0) = "a1"  'すみれ
    strRADIO(1) = "a2"  'たんぽぽ
    strRADIO(2) = "a3"  'ひまわり
    strRADIO(3) = "a4"  'チューリップ

    '種類を選択してみる
    strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0")
    nNO = Val(strWORK)
    If nNO < 0 Or nNO > 3 Then
        nNO = 0  '範囲外の時、番号を0にする
    End If

    'IEオブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    
    'テストの選択ページを開く
    strURL = "http://www.ken3.org/vba/test148.html"
    objIE.Navigate "" & strURL  'アドレスを渡し表示する

    '表示完了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
        'ただ待ってるのつまらないので、タイトルバーをイタズラ
        If strAAA <> Format(Now(), "SS") Then
            strAAA = Format(Now(), "SS") '現在の秒数を代入
            Application.Caption = Now() & "読み込み処理待ちです"
        End If
    Loop
    Application.Caption = "読み込みは終了"

    '区分を探してセットする
    For Each objITEM In objIE.document.all  '.allからオブジェクトを探す
        '名前がsentakuで値がa?のラジオボタンを探す
        If objITEM.TAGName = "INPUT" Then  'まず、タグでINPUTか判断
            Debug.Print objITEM.Name       'TESTで値を表示
            Debug.Print objITEM.Value      'TESTで値を表示
            If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then
                objITEM.Checked = True  'チェック状態をtrueにする
            End If
        End If
    Next

    '終了メッセージ
    MsgBox "データが選択されたか、確認してください"

End Sub

/* * 4.javascriptのクリックイベントが発生してないのでは? */

ふぅ〜、なんとか出来ましたね。 これでOKかなぁ。 だからアンタは三流って呼ばれるんだよキット。 えっ、だって、テストで選択できたよ、エラー発生したけど、 今回は、親切に、固定値じゃなくてINPUTBOXだけど違う選択できるし。 サンプル的には、手前味噌だけどおいしく出来ていると思うけど。 何かヤバイ空気を感じない?何年メルマガ書いてるの?何年人のプログラム見てるの? あっ、 <INPUT TYPE=RADIO NAME="sentaku" VALUE="a2" tabindex="1" onClick="clickradio()" の onClick="clickradio()" って何だ? 右脳と左脳の小芝居は、このくらいにして、 ~~~~~~~~~~~~~~~~~~~~ ラジオボタンの選択時イベントで、clickradio()って処理を呼んでますね。 確かに、ヤバイニオイがしますね。 下記のHTMLをAlatを確認の関数として、イベントの発生をチェックしてみます。 <script type="text/javascript"> <!-- function clickradio(){ // イベントのテスト alert("Hello イベント発生テスト"); } // --> </script> <noscript> <b>JavaScriptON</b>でテストしてください。 </noscript> を http://www.ken3.org/vba/test148.html にJavaScriptを追加して、テストしてみると、 ラジオボタンのチェックは変更されるが、イベントは発生していないみたいです。 ※手作業で、ラジオボタンを変更すると、メッセージが表示される。

/* * 5.素直にクリック(.Click)してみる */

危なかったね、発行後に気が付くと、質問者からできませんなんて再質問が来たね。 人の質問をひねくれて、深読みする、そんな腐った心だから気が付いたのかもね。 まぁまぁ、そんなこと言わないで、素直に行こうよ、素直に。 じゃ、素直な心で、.Clickとクリックメソッドにすればいいのかよ。 それで動くのかよコラ。 ~~~~~~~~~~~~~~~~ 誰に聞いてるの?マイクロソフトのサポートに? 別に壊れないんだし、素直に修正してやってみたら? テストで、 .Checked = True 'チェック状態をtrueにする のチェック状態のプロパティを変更する方法から、 .Clickのクリックメソッドを実行する方法に。 なんか悔しくてさ、 途中まで偉そうに、INPUTタグを探して.Checked = Trueってやってた自分にさ。 なんて、得意の小芝居は、置いといて、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ データを探す処理までは同じように、行い、 見つけたオブジェクトに対して、.Clickしてみました。 '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.TAGName = "INPUT" Then 'まず、タグでINPUTか判断 Debug.Print objITEM.Name 'TESTで値を表示 Debug.Print objITEM.Value 'TESTで値を表示 '↓の条件でクリックするオブジェクトを探す If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Click '素直にクリックしてみた(笑) Exit For '目的の処理が終わったので、ループを抜ける End If End If Next ついでに、.Click後、Exit Forで抜けました(その後、調べる必要ないので) 'IEラジオボタンをクリック(.Click)するサンプル
Sub TEST_RADIO_Click()

    Dim strURL   As String
    Dim objIE    As Object
    Dim objITEM  As Object
    Dim strAAA   As String
    Dim nNO      As Integer '選択値を数値にしたいので
    Dim strWORK  As String  'ワーク変数
    Dim strRADIO(0 To 3) As String  'ラジオボタンの値

    '変数の初期化
    strRADIO(0) = "a1"  'すみれ
    strRADIO(1) = "a2"  'たんぽぽ
    strRADIO(2) = "a3"  'ひまわり
    strRADIO(3) = "a4"  'チューリップ

    '種類を選択してみる
    strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0")
    nNO = Val(strWORK)
    If nNO < 0 Or nNO > 3 Then
        nNO = 0  '範囲外の時、番号を0にする
    End If

    'IEオブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    
    'テストの選択ページを開く
    strURL = "http://www.ken3.org/vba/test148.html"
    objIE.Navigate "" & strURL  'アドレスを渡し表示する

    '表示完了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
        'ただ待ってるのつまらないので、タイトルバーをイタズラ
        If strAAA <> Format(Now(), "SS") Then
            strAAA = Format(Now(), "SS") '現在の秒数を代入
            Application.Caption = Now() & "読み込み処理待ちです"
        End If
    Loop
    Application.Caption = "読み込みは終了"

    '区分を探してセットする
    For Each objITEM In objIE.document.all  '.allからオブジェクトを探す
        '名前がsentakuで値がa?のラジオボタンを探す
        If objITEM.TAGName = "INPUT" Then  'まず、タグでINPUTか判断
            Debug.Print objITEM.Name       'TESTで値を表示
            Debug.Print objITEM.Value      'TESTで値を表示
            '↓の条件でクリックするオブジェクトを探す
            If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then
                objITEM.Click  '素直にクリックしてみた(笑)
                Exit For       '目的の処理が終わったので、ループを抜ける
            End If
        End If
    Next

    '終了メッセージ
    MsgBox "データが選択されたか、確認してください"

End Sub

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

今回は、小芝居がうざかったけど、 IEでラジオボタンの選択を .Checked = True で チェック状態をtrueにする と .Clickのクリックメソッドを実行する そんな2つの方法を行い、違いも少し書いてみました。 IEお嬢様、やはり強敵でしたね。 ^^^^^^^^ 小芝居してほしい、VBAの質問あったら、 メールや掲示板で気軽に書いてください。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ) In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする", >日光が斜めから射すので、まっすぐに伸びない? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >植物の成長って、日光に向かって伸びるんですよね。 >太陽の光がナナメからだったら、ナナメに伸びる・・・ >(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) --- って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、 ※調べ方やプログラム作法ってのも、頭に入れて、作成してくださいね・・・・

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

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

[三流君 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へ]