- ベストアンサー
ExcelVBAで、ColorIndexの取得
エクセルのVBAで、組み込みダイアログを使用して、色の選択が出来ないか?奮闘しています。 Application.Dialogs(xlDialogColorPalette).Show を、使用することを考えたのですが、選択したカラーインデックスをどのように取得できるのか?判りません。どなたか詳しい方いらっしゃいましたら教えて貰えないでしょうか?よろしくお願いいたします。 エクセルのカラーパレットのインデックスナンバーの選択と取得が出来れば、どのような方法でもかまわないのですが・・・?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3の追伸です。 ためしに、UserForm に CommonDialog を付けて CommonDialog は、Office 2002? 以上には、ActiveX コントロールとして、標準的についています。 CommonDialog1.ShowColor として、カラーダイアログを使ってみましたが、個人的には、便利だとは思えませんでした。 こういうやり方もあるなって程度です。 UserForm モジュール UserForm ひとつと、CommandButton、TextBox それぞれ一つずつ。 MsgBox が出ないものは、ColorIndex がありません。 '----------------------------------- Const sCOLORS As String = "0,FFFFFF,FF,FF00,FF0000,FFFF,FF00FF,FFFF00,80,8000," & _ "800000,8080,800080,808000,C0C0C0,808080,FF9999,663399,CCFFFF,FFFFCC," & _ "660066,8080FF,CC6600,FFCCCC,800000,FF00FF,FFFF,FFFF00,800080,80,808000," & _ "FF0000,FFCC00,FFFFCC,CCFFCC,99FFFF,FFCC99,CC99FF,FF99CC,99CCFF,FF6633," & _ "CCCC33,CC99,CCFF,99FF,66FF,996666,969696,663300,669933,3300,3333,3399," & _ "663399,993333,333333" Private Sub CommandButton1_Click() Dim arColor As Variant Dim num As String Dim ret As Variant arColor = Split(sCOLORS, ",") CommonDialog1.Color = TextBox1.BackColor CommonDialog1.Flags = CommonDialog1.Flags Or MSComdlg.ColorConstants.cdlCCRGBInit CommonDialog1.CancelError = True On Error Resume Next CommonDialog1.ShowColor ret = Empty num = Hex(CommonDialog1.Color) ret = WorksheetFunction.Match(num, arColor, 0) TextBox1.BackColor = CommonDialog1.Color If Not IsEmpty(ret) Then MsgBox ret End If On Error GoTo 0 End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >組み込みダイアログを使用して、色の選択が出来ないか? それは、たぶん可能だとは思いますが、Excelの外の問題でしょうね。 Excel.Application側とダイアログの間で通信をしているはずですが、私には分かりません。 あまり難しく考えるよりも、UserFormで作ったほうが早いと思います。最初、簡単なマクロで作ってみましたが、質問者のためよりも、自分のアドインにするために、いろいろ付け加えてみました。 こういう内容が、サイトの趣旨に反するのか、私には分からないですが、何に使うかにもよります。どちらかというと、他人のためよりも、自分のために考えたほうがよいのかなって思いました。 左から、縦にColorIndex 順に、8個ずつ並ぶようにしてみました。しかし、Excelの組み込みのカラーパレットは、縦に5 × 8 の名前を付けた表と、2×8 の名前のない表のようですから、もう少し、マクロの工夫が必要かもしれません。 組み込みカラーパレットのColorIndexの並び 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 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ここら辺りは、各ユーザーの工夫にお任せすることにします。 ちょっと工夫すれば、このような並びも可能です。ラベルのインデックス自体は、別に組み込んでありますから、それを利用すれば可能です。ただし、それは、それは、ここの掲示板では公開しません。各ユーザーにお任せします。 ラベルに色が塗ってあって、それぞれに、イベントを付けてあります。 もともとは、全部のラベルにColorIndex が書いてあるのですが、濃い色の場合は、文字が見えませんので、左クリックすると、色番号のメッセージボックスが出てきます。右クリックすると、色の名前が出てきます。 名前の出てこないものもありますが、それらは、二段目のパレットにあるものです。 コントロールを何も付けない UserForm を一つ用意してください。 UserFormモジュール,標準モジュール,Class モジュールの三つを使います。Class は、一応、カプセル化されています。UserForm を立ち上げれば、 UserForm1.Show 0 カラーパレットが出てきます。 ひとつだけ問題は、Excelの本体(Application)のパレットを変更しても、以下は、標準のColorIndex のままです。 '--------------------------------------------------- 'UserForm モジュール Dim myClass(56) As Class1 Const sCOLORS As String = "0,FFFFFF,FF,FF00,FF0000,FFFF,FF00FF,FFFF00,80,8000," & _ "800000,8080,800080,808000,C0C0C0,808080,FF9999,663399,CCFFFF,FFFFCC," & _ "660066,8080FF,CC6600,FFCCCC,800000,FF00FF,FFFF,FFFF00,800080,80,808000," & _ "FF0000,FFCC00,FFFFCC,CCFFCC,99FFFF,FFCC99,CC99FF,FF99CC,99CCFF,FF6633," & _ "CCCC33,CC99,CCFF,99FF,66FF,996666,969696,663300,669933,3300,3333,3399," & _ "663399,993333,333333" Dim myLbl As Control Private Sub UserForm_Initialize() Dim i As Integer Dim arColor As Variant With Me .Height = 153 .Width = 240 .Caption = "ColorPalette" End With arColor = Split(sCOLORS, ",") For i = 1 To 56 With Controls.Add("Forms.Label.1") .Left = 2 * (Int((i - 1) / 8) * 15) .Top = 2 + 15 * ((i - 1) Mod 8) .Width = 30 .Height = 15 .Caption = "[" & i & "]" .BackColor = CLng("&h" & arColor(i - 1)) End With Next i Call SetClass End Sub Private Sub SetClass() Dim myLabels As New Collection Dim i As Integer For i = 1 To 56 myLabels.Add Me.Controls("Label" & i) Next i For i = 1 To 56 Set myClass(i) = New Class1 With myClass(i) .Lbl = myLabels(i) .Index = i End With Next i End Sub '--------------------------------------------------- '標準モジュール Public Const COLORNAMES As String = _ "黒,白,赤,明るい緑,青,黄,ピンク,水色," & _ "濃い赤,緑,濃い青,濃い黄,紫,25%灰,50%灰色," & _ "-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,スカイブルー," & _ "薄い水色,薄い緑,薄い黄,ペールブルー,ローズ,ラベンダー," & _ "ベージュ,薄い青,アクア,ライム,ゴールド,薄いオレンジ,オレンジ," & _ "ブルーグレー,40%灰色,濃い青緑,シーグリーン,濃い緑,オリーブ,茶,ライム,インディゴ,80%灰色" '--------------------------------------------------- 'Class1 モジュール Private WithEvents myLabel As MSForms.Label Private myIndex As Integer Private Sub myLabel_Click() MsgBox myIndex End Sub Public Property Get Lbl() As MSForms.Label Set Lbl = myLabel End Property Public Property Let Lbl(ByVal lbNewValue As MSForms.Label) Set myLabel = lbNewValue End Property Public Property Get Index() As Integer Index = myIndex End Property Public Property Let Index(ByVal intNewValue As Integer) myIndex = intNewValue End Property Private Sub myLabel_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim ColorName As Variant ColorName = Split(COLORNAMES, ",") If Button = 2 Then MsgBox ColorName(myIndex - 1) End If End Sub '--------------------------------------------------- 注:アップロードのために、定数(Const)の桁折「& _」をしていますが、本来は不要です。
- lark_0925
- ベストアンサー率63% (37/58)
本格的にやるなら、APIですが、私も面倒なのでDialogsオブジェクトで 代用してしまいす。 '============================================================ Sub main() Dim clx As Long If get_color(Range("a1"), clx) Then MsgBox clx End If End Sub 7=========================================================== Function get_color(rng As Range, clx As Long) As Boolean 'input rng --ダミーのセル 'oouput clx Colorindex Dim ans As Boolean rng.Parent.Parent.Activate rng.Parent.Activate rng.Select get_color = Application.Dialogs(xlDialogPatterns).Show If get_color = True Then clx = rng.Interior.ColorIndex rng.Interior.ColorIndex = xlNone End If End Function 因みにAPIでやる場合は、 http://www.loadsystem.net/api/lsapi3.txt ↑ここを参考にします。 Dialogsオブジェクトの使用では、 http://nyama.jpn.org/otto/xlstip.shtml#7 これも使いますね
- nayuta_lot
- ベストアンサー率64% (133/205)
こんにちは フォームを使ってボタンを押すとダイアログがでるような事をしたい のか、マクロの中で処理するのに使用したいのかよくわかりませんが、 取得・設定するなら、ColorIndexで取得・設定する方法とRGB指定で 取得・設定する方法があります。 (1)セル指定.Interior.ColorIndex = カラーNo. ※セル指定:Range,Cells,ActiveCellなど カラーNo.:1~56 (2)セル指定.Interior.Color = RGB(Red, Green, Blue) ※セル指定:Range,Cells,ActiveCellなど Red, Green, Blueは各0~255の値 使用例 ActiveCell.Interior.ColorIndex = 5(青)‥ アクティブセルのカラーパターンを青に設定 Dim i As Integer i = ActiveCell.Interior.ColorIndex アクティブセルのカラーパターン値をiに取得‥青なら5が入る 色見本のあるサイト↓ http://www.relief.jp/itnote/archives/000482.php 色見本を作るマクロを、ここに記載するのは簡単ですが本サイトの 趣旨に反しますので、For Nextや、ActiveCell.Offset(行,列)など を使ってご自身で色見本をつくるようなマクロを作ってみてください。 それだけでも勉強になると思いますので いきずまったら、またマクロを記載の上、質問してください^^ では、健闘を祈りますw。