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

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

メルマガ発行内容

<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系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に来た質問です。 ---- 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
-【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

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

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

フィードバック

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

評価・感想

No.148を読んだ満足度(評価)は?
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に流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・