- ベストアンサー
カラーパレットの色名はVBAで取得できますか?
ご存じの方がいらしたらご教示お願いします。 http://oshiete1.goo.ne.jp/qa3061670.html を拝見して疑問に思ったことですが、塗りつぶし色のカラーパレットに表示するToolTipの「色名」はVBAで取得可能でしょうか 色だけであれば ActiveWorkbook.Colors(n) nは0~56 で取得できます。でもパレットの各色にマウスをポイントしたときにポップアップする「色名」はどんなコレクションで取得できるのでしょうか。 またカラーパレットで前回選択した色は「選択された状態」になっていますが、パレットの「この色が選択されている」ということを取得するプロパティもあるのでしょうか。 この質問は「現在選択されている色」は色名(文字列)としてなら Application.CommandBars("Drawing").Controls(n).TooltipText ( n は ID=1691 のコントロールのIndex番号 ) で取得できるので、各パレットの「色名」を取得できれば、現在選択されているColorも取得できると考えての質問です
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 おもしろそうだったので、色名からカラーインデックス変換までを関数 化してみましたが.... たぶん、カラーパレットの Click イベントをフックするのは無理では ないかと思います。 ' // 現在カラーパレットで選択されている色のカラーインデックスを返す Public Function GetColorIndexFromPallet() As Long ' // ※ セル着色用パレット分しか対応してませんが、一応カスタマイズ ' // ※ されたパレットでも大丈夫なようです Dim sText As String Dim vBuf As Variant Dim i As Long ' // Excel ディフォルトパレット Const COLOR_NAME As String = "自動," _ & "黒,茶,オリーブ,濃い緑,濃い青緑,濃い青,インディゴ,80% 灰色," _ & "濃い赤,オレンジ,濃い黄,緑,青緑,青,ブルーグレー,50% 灰色," _ & "赤,薄いオレンジ,ライム,シーグリーン,アクア,薄い青,紫,40% 灰色," _ & "ピンク,ゴールド,黄,明るい緑,水色,スカイブルー,プラム,25% 灰色," _ & "ローズ,ベージュ,薄い黄,薄い緑,薄い水色,ペールブルー,ラベンダー,白" Const COLOR_IDEX As String = "-4142," _ & "1,53,52,51,49,11,55,56," _ & "9,46,12,10,14,5,47,16," _ & "3,45,43,50,42,41,13,48," _ & "7,44,6,4,8,33,54,15," _ & "38,40,36,35,34,37,39,2" AppActivate (Application.Caption) With Application.CommandBars.Add(Temporary:=True) sText = .Controls.Add(ID:=1691).TooltipText sText = Mid$(sText, InStr(sText, "(") + 1) sText = Left$(sText, Len(sText) - 1) .Delete End With ' // ToolTipText からカラーインデックスを取得する vNam = Split(COLOR_NAME, ",") vIdx = Split(COLOR_IDEX, ",") For i = 0 To UBound(vNam) If sText = CStr(vNam(i)) Then GetColorIndexFromPallet = CLng(vIdx(i)) Exit For End If Next i End Function
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 いつも読ませていただいております。 >塗りつぶし色のカラーパレットに表示するToolTipの「色名」はVBAで取得可能でしょうか この前、この話は出ていたと思いますが、現在のは、ツールアイコン(ControlGrid) の中の選択に関してで、「塗りつぶし」の中に関してのみです。 最初の開いている状態での、マクロの登録した時の第一回目だけ、このマクロはデフォルトなのか、塗りつぶしなのか、区別がつかないことがあるだけですが、後は大丈夫だと思います。(理由は、Static 変数で、InstanceIdを確保していないからです。最初、デフォルトの色と塗りつぶしなしとは分からないからです。InstanceID自体は、何も意味がありませんが、マクロの第一回目を取得するためです。) Sub getColorName() Dim myColor As String Const DEFCOLOR As String = "黄" Static oldID As Long With Application.CommandBars("Formatting").FindControl(, 1691) oldID = .Controls("配色(&C)").InstanceId myColor = .Controls("配色(&C)").TooltipText If myColor Like "配色*" And oldID > 0 Then myColor = "色つぶしなし" ElseIf myColor Like "配色*" Then myColor = DEFCOLOR End If MsgBox myColor End With End Sub 前回、実は、この ControlGrid には、新たに、RaiseEventでイベントを付けようとしたのですが、それに失敗して、最初の思惑とはだいぶ規模の小さな解決になってしまいました。(^^;
お礼
いつも勉強させていただいております 先日の質問も拝見していましたが「Global変数で前回の塗りつぶし色を記憶しておく」方法を紹介されており、ボタンから色を取得する方法については参考程度に書かれていたので、自分なりに考えてみた次第です 今回教えていただいたことを手がかりに深堀りしてみます ご回答ありがとうございました
お礼
わざわざマクロを書いていただき、ありがとうございます やはり色名→ColorIndexの変換は、自分でテーブルもしくは配列を準備しないとならないのですね。もしカラーパレットのコレクションがあればより簡単に取得できるかと考えたのですが… 納得できました。回答ありがとうございました。