操作者にセルの色やフォント色を設定できるようにするアプリの場合、カラーダイアログを表示させ選択できるようにします。
カラーダイアログを表示するにはWindows APIの、ChooseColorを使用します。
ChooseColorの引数にはウィンドウハンドルが必要になります。
ウィンドウハンドルを取得するにはWindows APIの、FindWindowを使用します。
ChooseColorの構文
Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As COLORSTRUC) As Long
引数COLORSTRUCは構造体で、下記のメンバーになります。
- lStructSize:構造体のサイズ
- hwnd:ダイアログボックスを表示するウィンドウハンドル
- hInstance:モジュールのインスタンス
- rgbResult:ダイアログの初期色
- lpCustColors:バッファへのポインタ
- flags:初期化フラッグ
- lCustData:lpfnHookで指定されたフック関数に渡す追加情報を指定
- lpfnHook:フック関数のポインタ
- lpTemplateName:使用するダイアログテンプレートの名前
引数Flagsで使用する定数
定数 |
値 |
解説 |
CC_ENABLEHOOK |
&H10 |
lpfnHook メンバで指定されたフック関数を有効にします |
CC_ENABLETEMPLATE |
&H20 |
nInstance メンバと lpTemplateName メンバで指定されたダイアログボックステンプレートを使ってダイアログを作成する |
CC_ENABLETEMPLATEHANDLE |
&H40 |
hInstance メンバがロード済みのダイアログボックステンプレートを含むメモリブロックを指していることを表します
このフラグが指定されている場合、lpTemplateName は無視されます |
CC_FULLOPEN |
&H2 |
カスタムカラー作成部を含む色の設定ダイアログボックス全体を表示します |
CC_PREVENTFULLOPEN |
&H4 |
「色の作成」ボタンを無効にします |
CC_RGBINIT |
&H1 |
rgbResult メンバで指定した値を初期設定カラーとしてダイアログに使用します |
CC_SHOWHELP |
&H8 |
ダイアログボックスに「ヘルプ」ボタンを追加します00
このフラグを指定した場合、hwndOwner を指定する必要があります |
CC_SOLIDCOLOR |
&H80 |
基本色のうち、純色だけを表示します |
CC_ANYCOLOR |
&H1 |
利用可能な基本色をすべて表示 |
FindWindowの使い方は「Excelでウィンドウハンドルを取得するVBA|APIで簡単に取得可能」の記事を参照してください。
カラーダイアログを表示するVBA
Excel VBA シートコード
VBAの解説
- COLORSTRUC構造体の宣言
- Windows APIのFindWindowを宣言
- Windows APIのFindWindowを宣言
- ExColorDialogプロシージャーの宣言
- lStructSizeに構造体のサイズをセット rgbResultに赤色 RGB(255,255,255)をセット
- hwndにExcelのウィンドウハンドルをセット
- flagsにCC_SOLIDCOLOR(基本色のうち、純色だけを表示)をセット
- lpCustColorsにString$でバッファをセット
- Windows APIのChooseColorを実行
- ChooseColorの戻り値が0の場合、赤色を返します。 戻り値が0でない場合、戻り値を返します。
- コマンドボタンのクリックイベント
- Windows APIのFindWindowでExcelのハンドルを取得します。
- ExColorDialogプロシージャーを実行します。
- ExColorDialogプロシージャーの戻り値をコマンドボタンの表示色にセットします。
Option Explicit
Private Type COLORSTRUC
lStructSize As Long
hwnd As Long
hInstance As Long
rgbResult As Long
lpCustColors As String
flags As Long
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Private Const CC_SOLIDCOLOR = &H80
'カラーダイアログAPI
Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" _
(pChoosecolor As COLORSTRUC) As Long
'ウィンドウハンドルを取得するAPI
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Function ExColorDialog(hwnd As Long, lcol As Long) As Boolean
Dim ln As Long
Dim COLS As COLORSTRUC
COLS.lStructSize = Len(COLS)
COLS.rgbResult = RGB(255, 255, 255)
COLS.hwnd = hwnd
COLS.flags = CC_SOLIDCOLOR
COLS.lpCustColors = String$(16 * 4, 0)
ln = ChooseColor(COLS)
If ln = 0 Then 'Cancel
lcol = RGB(255, 255, 255)
ExColorDialog = False
Exit Function
Else 'OK
lcol = COLS.rgbResult
End If
ExColorDialog = True
End Function
Private Sub CommandButton1_Click()
Dim ln As Long
Dim ret As Boolean
Dim hwnd As Long
ln = CommandButton1.ForeColor
'Excelのハンドルを取得
hwnd = FindWindow("XLMAIN", Application.Caption)
'カラーダイアログを開く
ret = ExColorDialog(hwnd, ln)
If ret Then
'フォント色をセット
CommandButton1.ForeColor = ln
End If
End Sub
Excelシート画面
ボタンをクリックするとカラーダイアログが開きます。
ダイアログで色を選択します。
Excel シートのコマンドボタンのフォント色が選択した色にセットされます。