Excel VBAでカラーダイアログを表示する|Windows APIを使用

Windows APIを使用しカラーダイアログを表示するVBAを掲載しています。




Homeに戻る > Excel 数値・文字列・検索・印刷のTipsへ

操作者にセルの色やフォント色を設定できるようにするアプリの場合、カラーダイアログを表示させ選択できるようにします。

カラーダイアログを表示するには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の解説

  1. COLORSTRUC構造体の宣言
  2. Windows APIのFindWindowを宣言
  3. Windows APIのFindWindowを宣言
  4. ExColorDialogプロシージャーの宣言
  5. lStructSizeに構造体のサイズをセット rgbResultに赤色 RGB(255,255,255)をセット
  6. hwndにExcelのウィンドウハンドルをセット
  7. flagsにCC_SOLIDCOLOR(基本色のうち、純色だけを表示)をセット
  8. lpCustColorsにString$でバッファをセット
  9. Windows APIのChooseColorを実行
  10. ChooseColorの戻り値が0の場合、赤色を返します。 戻り値が0でない場合、戻り値を返します。
  11. コマンドボタンのクリックイベント
  12. Windows APIのFindWindowでExcelのハンドルを取得します。
  13. ExColorDialogプロシージャーを実行します。
  14. 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 シートのコマンドボタンのフォント色が選択した色にセットされます。


Homeに戻る > Excel 数値・文字列・検索・印刷のTipsへ

■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


Copyright (c) Excel-Excel ! All rights reserved