次の方法で共有

Radio Button をVBAでClickする

Anonymous
2011-04-29T02:54:08+00:00

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

 1点目は、VBAでPostMessage API関数を使って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)

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

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

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

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2011-04-29T06:23:19+00:00

こんにちは。

どういったアプリケーションのどういったボタンをクリックしようとしているのかが分からないので何とも言えませんが、サンプルとしては下記のような感じでしょうか。

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hParent As Long, ByVal hChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const BN_CLICKED = 0&

Private Const WM_COMMAND = &H111&

Public Sub Sample()

'Windows 7(x64)で電卓の「16進」ボタンをクリック

  Dim hCalcFrame As Long

  Dim hDlg As Long

  Dim hBtn As Long

  Const CtrlID = &H139& '16進ボタンのID

  Shell "calc"

  If MsgBox("電卓は起動しましたか?", vbYesNo) = vbNo Then Exit Sub

  hCalcFrame = FindWindow("CalcFrame", vbNullString)

  hCalcFrame = FindWindowEx(hCalcFrame, 0&, "CalcFrame", vbNullString)

  If hCalcFrame = 0& Then Exit Sub

  hDlg = FindWindowEx(hCalcFrame, 0&, "#32770", vbNullString)

  hDlg = FindWindowEx(hCalcFrame, hDlg, "#32770", vbNullString)

  If hDlg = 0& Then Exit Sub

  hBtn = GetDlgItem(hDlg, CtrlID)

  If hBtn = 0& Then Exit Sub

  SendMessage hDlg, WM_COMMAND, BN_CLICKED * &H10000 + CtrlID, hBtn

End Sub

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

WM_SETTEXTはSendMessage専用です。

> Buttonを操作する場合は前記のようにPostMessageを使用することになっているようです。

ボタンだからPostMessage、というのはちょっと違うと思いますが、このあたりの使い分けは「SendMessage PostMessage 違い」「SendMessage PostMessage 使い分け」といったキーワードで検索すれば参考になる情報が出てくるかと思います。

どのみちWindows APIの話となるとVBAの範疇を超えていますので、Officeフォーラムよりも開発者向けフォーラムの方が良いかもしれませんね。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

6 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2011-05-01T17:05:42+00:00

    あ、これだけでは難なので連絡です。

    MSDN フォーラム側に新しい返信もついていますのでご確認ください。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2011-05-01T13:58:43+00:00

    Officeフォーラムで回答されているデベロッパーの方はあまり多くないように思うのですが…。

    私自身は開発系ですが、Answers を見る頻度は高くありません。

    Office が提供しているオブジェクトを使った範囲内の VBA であれば、Answers も妥当かと考えていますが、API を使った難易度の高いところは開発系のメンバーが多い MSDN フォーラムかなと考えています。

    オペレータに向けた問題提起は別途していくつもりです。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2011-04-30T08:48:07+00:00

    私も同意なのですが、オペレータが誘導してしまったという経緯があるんですよね。

    http://social.msdn.microsoft.com/Forums/ja-JP/windowsgeneraldevelopmentissuesja/thread/33a3f80d-03a0-4ec7-b212-11d655b3c581

    なるほど…。

    そういった経緯があったとは知りませんでした。

    Officeフォーラムで回答されているデベロッパーの方はあまり多くないように思うのですが…。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2011-04-30T03:33:12+00:00

    どのみちWindows APIの話となるとVBAの範疇を超えていますので、Officeフォーラムよりも開発者向けフォーラムの方が良いかもしれませんね。

    私も同意なのですが、オペレータが誘導してしまったという経緯があるんですよね。

    http://social.msdn.microsoft.com/Forums/ja-JP/windowsgeneraldevelopmentissuesja/thread/33a3f80d-03a0-4ec7-b212-11d655b3c581

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません