【VBA×WindowsAPI】[色の設定]ダイアログを表示する

VBAマクロ開発時にユーザーに色を選択させたいという場面に出くわすことがあります。Excel VBAの場合、組み込みダイアログ「Application.Dialogs(xlDialogEditColor).Show()」を利用することで色選択のダイアログを表示させることができます。ただし、この組み込みダイアログはアプリケーションによってはサポートされていないものもあるため、利用できないケースがあります。

色選択ダイアログをUserFormを使って0から作るとかなりの労力ですが、色選択のダイアログ自体はWindowsの標準機能として用意されており、WindowsAPIを使うことでそのダイアログをVBAで呼び出すことが可能です。WindowsAPIの場合はアプリケーションによる利用制限は無くなるので、どのアプリケーションのVBAからも呼び出すことが可能です。そのため組み込みダイアログが利用できないアプリケーションでの色選択の1つの手段として非常に役立つ機能となっています。

[色の設定]ダイアログを表示する

Windowsにはどのアプリケーションからでもアクセスすることのできる「コモンダイアログ」というUI(ユーザインターフェース)が用意されています。コモンダイアログにはファイル選択ダイアログや検索ダイアログ、印刷ダイアログ、フォントダイアログなどの汎用的なダイアログが用意されており、メモ帳やペイントなどのWindows標準アプリケーションのダイアログとしても利用されています。

その中でも[色の設定]ダイアログボックスは名前の通り、ユーザが色を選択するためのダイアログです。VBAの「Application.Dialogs(xlDialog~).Show」でも同じような処理は可能ですが、ダイアログの見た目や使い勝手がWindowsAPIとは少し異なります。

VBAでクリップボード内の文字列を取得するには下記のWindows APIを利用します。
また、関数の引数として「CHOOSECOLOR構造体」という構造体を定義する必要があります。

icon-check-square ChooseColor関数  :[色]ダイアログボックスを表示する

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

サンプルコード

VBAでコモンダイアログの[色の設定]ダイアログを表示するためのサンプルコードは下記の通りです。
下記コードを標準モジュールにコピペして実行すると、[色の設定]ダイアログが表示されます。ダイアログで選択した色のカラーコードが取得され、アクティブシートのA1セルを選択した色に着色します。[色の設定]ダイアログではデフォルトカラーの選択だけでなく色の作成を行うことも可能です。

コード解説

icon-edit CHOOSECOLOR構造体の設定

[色の設定]ダイアログを表示するためのChooseColor関数には引数としてCHOOSECOLOR構造体を入力しますが、この構造体の値によって[色の設定]ダイアログの初期設定を変更することができます。

構造体の要素は多くありますが下記の要素を入力しておけば問題ありません。

関数名 内容
lStructSize  構造体のサイズ
hwndOwner 親ウィンドウのハンドル
rgbResult ダイアログの色情報
lpCustColors [作成した色]の値の配列へのポインタ
flags ダイアログボックスの初期化に使用可能なフラグ

lStructSizeは構造体のサイズを指定するための要素でLenB関数で取得した値を入力します。
hwndOwnerは[色の設定]ダイアログを属させる親ウィンドウのハンドルを入力します。値を入力しなかった場合、[色の設定]ウィンドウは独立したウィンドウとして表示されます。通常はFindWindow関数などを使って取得したアプリケーション(Excel等)のウィンドウを親として設定します。

rgbResultは[色の設定]ダイアログ内で選択されている色の値を保持する要素で、初期選択色(ダイアログ起動時に選択される色)が設定可能です。flagsで設定する値にCC_RGBINITが設定されている場合、この要素に入力された値の色が初期値となります。このとき入力した色の値が使用可能な色の中にない場合は、使用可能な最も近い純色が初期選択色となります。 rgbResultが0の場合、もしくはCC_RGBINITが設定されていない場合、ダイアログの初期選択色は黒色となります。

lpCustColorsは[色の設定]ダイアログ上でユーザーが任意で設定可能な[作成した色]の情報を格納するための配列のポインタを入力します。配列のポインタはVarPtr関数に配列の0番目の要素を入力することで取得することができます。このとき、この配列は値保持のためStaticステートメントを使って宣言しておく必要があります。また初期値として白色を設定していますが未入力の場合は黒色となります。予め各16要素にそれぞれ任意の色を設定しておくことも可能です。

flagsにはダイアログ作成時の設定に関するフラグ値を入力します。基本的には下記の3つさえ知っておけば問題ありません。(※その他のフラグはCHOOSECOLOR構造体ページ参照)

定数値 意味
CC_FULLOPEN = &H2 [色の作成]部分を拡張して表示する
CC_PREVENTFULLOPEN = &H4  [色の作成]ボタンを無効にする
CC_RGBINIT = &H1 rgbResultにセットされている色を初期の選択色とする

これら定数値をflagsに入力することで各種設定をおこなうことができます。
フラグを複数設定する場合はサンプルコードの通りOR演算子を使って指定します。
 

icon-edit [色の設定]ダイアログの表示

[色の設定]ダイアログを表示するにはChooseColor関数にはを使い下記のように記載します。

 ChooseColor関数 

lRet = ChooseColor(tChooseColor)

引数には前項で設定したCHOOSECOLOR構造体を入力します。戻り値はダイアログの[OK]ボタンが押されたら0以外の数値が返されます。

ダイアログ上で色の選択が行われると、引数で入力したCHOOSECOLOR構造体のrgbResultの値が選択された色の値に上書きされます。つまりダイアログの[OK]ボタンが押されたあとに、構造体のrgbResultの値を取得すればユーザーが選択した色を取得したことになります。

関連情報

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

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

icon-share-square 参考

Microsoft公式:[色] ダイアログ ボックス – Win32 apps

Excel, VBA, Windows API

Posted by Lic