【VBA×WindowsAPI】Buttonコントロールを操作する

Buttnコントロール(プッシュボタン/オプションボタン/チェックボックス)は、ユーザーがクリックした際に何らかのアクションを発生させるためのコントロールです。本来、Excel VBAだけでは操作不能なExcel以外のアプリケーションのButtonコントロールですが、Windows APIと組み合わせることでボタンの押下をプログラムとして処理することが可能になります。これにより、ユーザーが手入力している作業をExcel外の領域でも自動化することができます。

本ページではそんなButtonコントロールをVBAで操作する方法について解説していきます。コントロールの種類の調べ方をはじめ、テキストボックスやコンボボックス等のその他コントロールの自動化は下記メインページを参照下さい。

Buttonコントロールを操作

Buttonコントロールはユーザーがクリックすることで何らかのアクションが実行されるコントロールです。名前からするといわゆる”プッシュボタン”がイメージされがちですが、チェックボックスやオプションボタン(ラジオボタン)などもこのButtonコントロールに含まれています。

本ページではButtonコントロールに対して「ボタンを押下する方法(プッシュ/オプションボタン)」「値を切り替える方法(チェックボックス)」「値を取得する方法(チェックボックス)」の3つの方法を解説します。RPA操作において操作の最後は[実行]ボタンや[保存]ボタンのようなプッシュボタンの押下であるケースが多いため、Buttonコントロールの操作はかなり重要な要素の1つとなります。

VBAで別アプリケーションのButtonコントロールを操作するには下記のWindows APIを利用します。
それぞれ関数のより詳細な使い方の解説は各関数のリンクページを参照下さい。

icon-check-square FindWindow関数     :指定のウィンドウのハンドルを取得する
icon-check-square FindWindowEx関数 :指定のウィンドウ内にある子ウィンドウのハンドルを取得する
icon-check-square SendMessage関数   :指定のウィンドウにメッセージを送信する

「そもそもWindows APIって何?」という方はコチラ(メインページ)も併せて参照下さい。

サンプルコード

指定のButtonコントロールを操作するサンプルコードは下記の通りです。プッシュボタンの押下、オプションボタンの押下(切り替え)、チェックボックスの値の取得と切り替えを行っています。

メモ帳の「検索」ウィンドウ([Ctrl]+[F])を開いた状態で下記を実行するとコメント記載の処理が各Buttonコントロールに対して行われます。サンプルコードではButtonコントロールとして「検索」ウィンドウの各ボタンを取得していますが、別の領域のButtonコントロールのハンドルを取得すればそのButtonコントロールを操作することが可能です。(1行ずつ実行すると処理内容が確認しやすいです)

コード解説

Windows APIを使ってButtonコントロールの文字列を操作するには下記の手順を行います。操作対象のButtonコントロールハンドルの取得はウィンドウ(アプリケーション)の構造により取得手順が変わるので、Spy++等のツールを使用してウィンドウの構造を調べる必要があります。構造の確認ができたらFindWindowEx関数を使うことで該当コントロールのハンドルを取得することが可能です。

1. 操作対象のButtonコントロールのハンドルを取得する
2. 取得したハンドルにボタン押下のメッセージを送信 (プッシュボタン/オプションボタン)
2. 取得したハンドルにチェックの切り替えのメッセージを送信 (チェックボックス)
2. 取得したハンドルにチェック状態取得のメッセージを送信 (チェックボックス)

 

icon-edit 取得したハンドルにボタン押下のメッセージを送信

Buttonコントロールのハンドルに対して”ボタン押下のメッセージ”を送信することで、そのButtonコントロールを押下する(押下されたことにする)ことができます。メッセージの送信はSendMessage関数を使い、下記のように書きます。

icon-code SendMessage関数 

Call SendMessage(hWndBtn, BM_CLICK, 0, 0)

第1引数のhWndBtnにはボタン押下を行う対象のButtonコントロール(基本的にはプッシュボタンかオプションボタン)のハンドル、第2引数にはボタン押下のメッセージ「BM_CLICK」(定数値)、第3引数、第4引数は今回の場合では使用しないので「0」をそれぞれ入力します。

「BM_CLICK」は該当のヘッダーファイル内に定義されていますが、VBAでは関数の呼び出しを行っているだけなので定数自体の定義はされていません。そのため「Const BM_CLICK = &HF5」というかたちでコードの初めに定義しています。(引数として直接「&HF5」を入力しても可)

これにより、指定のButtonコントロールを押下することができます。ボタンの種類としてはプッシュボタンとオプションボタンのいずれかが想定されており、プッシュボタンの場合は押下、オプションボタンの場合は値の切り替えというような手動でマウスクリックしたときと同じ処理が行われます。チェックボックスのハンドルを渡すことでもチェックの切り替えは可能ですが、チェックボックスに対するフォーカスの有無によって動作が不安定であることや、チェックボックス用のメッセージが提供されていることから、チェックボックスの操作においては後述の方法を用いる方が安定した結果が得られます。
 

icon-edit 取得したハンドルにチェックの切り替えのメッセージを送信

Buttonコントロールのハンドルに対して”チェック切り替えのメッセージ”と合わせてチェックON/OFFのパラメータを送信することで、そのButtonコントロールのチェック状態をONもしくはOFFに切り替えることができます。メッセージの送信はSendMessage関数を使い、下記のように書きます。

icon-code SendMessage関数 

Call SendMessage(hWndBtn, BM_SETCHECK, BST_CHECKED, 0)       ‘チェックON
Call SendMessage(hWndBtn, BM_SETCHECK, BST_UNCHECKED, 0) 
‘チェックOFF

第1引数のhWndBtnにはチェックの切り替えを行う対象のButtonコントロール(チェックボックス)のハンドル、第2引数にはチェックの切り替えメッセージ「BM_SETCHECK」(定数値)、第3引数にはチェック状態を表す「BST_CHECKED」(定数値)もしく「BST_UNCHECKED」(定数値)、第4引数は今回の場合では使用しないので「0」をそれぞれ入力します。

「BM_SETCHECK」「BST_CHECKED」「BST_UNCHECKED」はそれぞれ該当のヘッダーファイル内に定義されていますが、VBAでは関数の呼び出しを行っているだけなので定数自体の定義はされていません。そのため「Const BM_SETCHECK = &HF1」「Const BST_CHECKED = &H1」「Const BST_UNCHECKED = &H0」というかたちでコードの初めに定義しています。

チェックの切り替えは第3引数に入力する定数値により指定することができ、「BST_CHECKED」を入力した場合はチェック状態をONに、「BST_UNCHECKED」を入力した場合はチェック状態をOFFに設定することができます。
   

icon-edit 取得したハンドルにチェック状態取得のメッセージを送信

Buttonコントロールのハンドルに対して”チェック状態取得のメッセージ”を送信することで、そのButtonコントロールのチェック状態を取得することができます。メッセージの送信はSendMessage関数を使い、下記のように書きます。

icon-code SendMessage関数 

hRet = SendMessage(hWndBtn, BM_GETCHECK, 0, 0)

第1引数のhWndBtnにはチェック状態の取得対象のButtonコントロール(チェックボックス)のハンドル、第2引数にはチェック状態取得のメッセージ「BM_GETCHECK」(定数値)、第3引数、第4引数は今回の場合では使用しないので「0」をそれぞれ入力します。これによりチェック状態を表した定数値が戻り値hRetとして取得できます。

「BM_GETCHECK」は該当のヘッダーファイル内に定義されていますが、VBAでは関数の呼び出しを行っているだけなので定数自体の定義はされていません。そのため「Const BM_GETCHECK = &HF0」というかたちでコードの初めに定義しています。

戻り値hRetには「BST_CHECKED」もしく「BST_UNCHECKED」が返されます。
これら定数は上項のチェック切り替えをする際に引数として入力するものと同じです。hWndBtnのチェックがONの場合は「BST_CHECKED」、OFFの場合は「BST_UNCHECKED」が返されます。この戻り値からチェックの有無で分岐処理をすることが可能となっています。

関連情報

icon-share-square VBA×WindowsAPIまとめページ

その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。

icon-share-square 参考

Microsoft公式:ウィンドウ メッセージ (Windows とメッセージ) – Win32 apps

2024年2月4日Excel, RPA, VBA, Windows API

Posted by Lic