none
Radio Button を Click する方法 RRS feed

  • 質問

  •  2点質問させて頂きます。

     1点目は、VBAでPostMessage関数を使ってExe形式アプリケーションが表示するRadio ButtonをClickしようとしているのですが、うまくいきません。Buttonのタイプは押すとマークが付いたり消えたりする2状態のものです。

    lngRtn = PostMessage(hDlg, WM_COMMAND, BN_CLICKED, hBtn)

     コードは上記のようにしています。通常の押すだけのButtonはこれでうまく動作するのですが、Radio Buttonの場合は別のコマンドがあるのでしょうか。

     

     2点目は、Edit Classのフィールドに数字や文字を入力する場合には、SendMessage関数を使って以下のように記述するようですが、

    lngRtn = SendMessage(lngTB, WM_SETTEXT, 0, ByVal strID)

    Bottunを操作する場合は前記のようにPostMessageを使用することになっているようです。試しにSendMessage関数で前記のPostMessage関数の代わりにBottan操作をしてみたところ、PostMessageで効果のあったBottunに対しても効果がありませんでした。

     Edit ClassとBottun Classでこのように関数を使い分ける理由についてお教え下さい。

     よろしくお願い申します。


    2011年4月27日 18:34

回答

  • >第 3 引数の指定が違っているようです。単に BN_CLICKED だけではなくて、下位ワードに対象コントロールの ID を入れないといけません。

    ご紹介頂いたリンクでこの内容を確認致しました。ただ、具体的にコントロールIDをどの様にして取得し、又、第3引数の部分にどの様にして指定するのかを教えて頂けないでしょうか。


    コントロールの ID は Spy++ や UI Spy ツールを使えば取得できます。

      UI Spy(UISpy.exe)が含まれているWindows SDK Version « tech@winginfo
      http://techwing.wordpress.com/2010/07/15/ui-spyuispy-exe%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bwindows-sdk-version/

    第 3 引数の記述については、C/C++ ですと MAKEWPARAM というマクロを使って記述することが多いです。
    「MAKEWPARAM VB」なとど検索するといくつかヒットするはずですので参考にするのもいいですし、自力でビット演算のコードを書くのも難しいことではないと思います。
    コントロールの ID を下位 16 ビットに、BN_CLICKED を上位 16 ビットに配置するだけです。(BN_CLICKED は 0 なので、コントロールの ID を &HFFFF& でマスクしても同じ値ですが。)
    • 回答としてマーク karankoron 2011年12月14日 8:04
    2011年5月5日 7:32

すべての返信

  • こんにちは、karankoron さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。

    開発されている VBA と exe の関係や、exe がどういったものかなどの詳細情報がないと回答者には karankoron さんがやりたいことが分かりにくいかもしれません。。
    VBA での開発には限りがあるので、内容によっては karankoron さんがやりたいことができるかどうか。。。ということになるかもしれません。

    なお、VBA での開発に関するご質問でしたら、弊社には OFFICE 製品に関するコミュニティがあります。
    VBA での開発といった場合にはそちらのほうが何らかのレスポンスが得られやすいかもしれません。

    Microsoft Answers > Office カテゴリ
    http://answers.microsoft.com/ja-jp/office

    よろしければ、ご検討くださいね。よろしくお願いいたします。
                                                                      
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年4月28日 5:36
  •  山本 様

     ご案内ありがとうございます。

     Microsoft Answersの方にも質問をPostさせて頂きました。

     ご指摘の点を補足させて頂きます。

     

     Exeは、ある証券会社のWebサイトからダウンロードしてこちらのPC上で稼働させるアプリケーションです。

     私がやりたいことは以下のようなことです。

     それらのアプリケーションは私などのUserから情報を得るためにButtonや入力フィールドなどを表示して入力させる形になっており、通常はキーボードやマウスを使って情報を入力し送信Buttonを押して送信するという形を取ります。

     私はこのアプリケーションへの入力情報をExcelで管理しており、VBAを使ってExcelからデータを取り出してそのアプリケーションの入力フィールドに入力し、Radio ButtonのON/OFFで選択項目を選択するかしないかを指定し、送信Buttonを押して入力情報を送信するという処理を自動化しようとしております。

     質問の1点目は、送信Buttonなどの押すだけのButtonは以下のPostMessage API関数を実行すれば、マウスでButtonを押したのと同じことをできるのですが、ON/OFFで選択するかしないかを指定するRadio Buttonに対しては効果がないので、その方法をお尋ねしています。

    lngRtn = PostMessage(hDlg, WM_COMMAND, BN_CLICKED, hBtn)

     質問の2点目は、同じアプリケーションが表示している入力フィールドへ入力データを送信する場合にはSendMessage API関数を使用して送信するという方法をある方から教えて頂いたのですが、その方もButtonと入力フィールドでこの様に使い分ける理由についてはご存じないということなので、この場を借りてご確認させて頂いている次第です。

     

     ご指導の程、よろしくお願い申します。

    2011年4月29日 3:31
  • Buttonのタイプは押すとマークが付いたり消えたりする2状態のものです。

    このようなコントロールは Radio Button ではなくて Check Box ではないかという気がするのですが、それはさておき。

    lngRtn = PostMessage(hDlg, WM_COMMAND, BN_CLICKED, hBtn)

    第 3 引数の指定が違っているようです。単に BN_CLICKED だけではなくて、下位ワードに対象コントロールの ID を入れないといけません。

      BN_CLICKED Notification Code (Windows)
      http://msdn.microsoft.com/en-us/library/bb761825(VS.85).aspx

    うまく動いているように見える Button の方はたまたまコントロール ID に依存しないコーディングになっているだけで、Radio Button (Check Box?) の方は普通に ID に依存するコーディングになっているだけではないかと。

    2 点目のご質問についてはよく分かりません。今回のケースでは SendMessage も PostMessage も同じ動きをして然るべきではないかと思います。
    ただし上記のように、そもそも引数の指定が正しくありませんので、このことが影響しているかどうかについては分かりかねます。
    ちなみに SendMessage の戻り値は正常な値が返ってくるのでしょうか?
    2011年5月1日 12:01
  •  totojo 様

     ご回答ありがとうございます。

    >このようなコントロールは Radio Button ではなくて Check Box ではないかという気がするのですが、

     ソフトウェア部品の正確な名称に不案内なため申し訳ありません。Check Box が正しいのかもしれません。

    >第 3 引数の指定が違っているようです。単に BN_CLICKED だけではなくて、下位ワードに対象コントロールの ID を入れないといけません。

     ご紹介頂いたリンクでこの内容を確認致しました。ただ、具体的にコントロールIDをどの様にして取得し、又、第3引数の部分にどの様にして指定するのかを教えて頂けないでしょうか。

    >ちなみに SendMessage の戻り値は正常な値が返ってくるのでしょうか?

     VBAでAPI関数をCallした場合、エラーになっても通常のErrオブジェクトには何も返されないのでエラーになっている可能性はあります。別途確認してご報告致します。

     今後とも、よろしくお願い申します。



    2011年5月4日 20:55
  •  totojo 様

    >ちなみに SendMessage の戻り値は正常な値が返ってくるのでしょうか?

     戻り値の件ですが、0が返ってきていいるのでエラーにはなっているのですが、Err.NumberにもErr.LastDllErrorにもコードは入っておりません。

     よろしくお願い申します。


    2011年5月5日 6:13
  • >第 3 引数の指定が違っているようです。単に BN_CLICKED だけではなくて、下位ワードに対象コントロールの ID を入れないといけません。

    ご紹介頂いたリンクでこの内容を確認致しました。ただ、具体的にコントロールIDをどの様にして取得し、又、第3引数の部分にどの様にして指定するのかを教えて頂けないでしょうか。


    コントロールの ID は Spy++ や UI Spy ツールを使えば取得できます。

      UI Spy(UISpy.exe)が含まれているWindows SDK Version « tech@winginfo
      http://techwing.wordpress.com/2010/07/15/ui-spyuispy-exe%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bwindows-sdk-version/

    第 3 引数の記述については、C/C++ ですと MAKEWPARAM というマクロを使って記述することが多いです。
    「MAKEWPARAM VB」なとど検索するといくつかヒットするはずですので参考にするのもいいですし、自力でビット演算のコードを書くのも難しいことではないと思います。
    コントロールの ID を下位 16 ビットに、BN_CLICKED を上位 16 ビットに配置するだけです。(BN_CLICKED は 0 なので、コントロールの ID を &HFFFF& でマスクしても同じ値ですが。)
    • 回答としてマーク karankoron 2011年12月14日 8:04
    2011年5月5日 7:32