• ベストアンサー

ExcelVBAで、ColorIndexの取得

エクセルのVBAで、組み込みダイアログを使用して、色の選択が出来ないか?奮闘しています。 Application.Dialogs(xlDialogColorPalette).Show を、使用することを考えたのですが、選択したカラーインデックスをどのように取得できるのか?判りません。どなたか詳しい方いらっしゃいましたら教えて貰えないでしょうか?よろしくお願いいたします。 エクセルのカラーパレットのインデックスナンバーの選択と取得が出来れば、どのような方法でもかまわないのですが・・・?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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)
回答No.3

こんにちは。 >組み込みダイアログを使用して、色の選択が出来ないか? それは、たぶん可能だとは思いますが、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)
回答No.2

本格的にやるなら、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 これも使いますね

回答No.1

こんにちは フォームを使ってボタンを押すとダイアログがでるような事をしたい のか、マクロの中で処理するのに使用したいのかよくわかりませんが、 取得・設定するなら、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。

関連するQ&A

  • Excel VBAの組み込みダイアログについて

    ExcelのVBAの組み込みダイアログで、 Application.Dialogs(xlDialogInsertPicture).Show についてですが、ヘルプの組み込みダイアログボックス引数一覧をみると xlDialogInsertPicture file_name、filter_number とあります。 これは、ダイアログボックスの図の挿入で、ファイル名とファイルの種類の引数になると思いますが、 ダイアログボックスの右上に表示される、表示の縮小表示を選択することってできるのでしょうか?また、ファイルの場所の指定ってできるのでしょうか?どなたか、詳しい方いらっしゃいましたら教えてください。よろしくお願いいたします。

  • 「プリンタの設定」ダイアログボックスのプリンタを指定したい。

    Excel VBAにて以下のコードを書き,接続されているプリンタ一覧の表示と設定は出来るのですが、のダイアログに表示されるプリンタを指定した物だけにしたいのです。 Application.Dialogs(xlDialogPrinterSetup).Show ダイアログの組み込み定数「xlDialogPrinterSetup」は引数でプリンタ名を持てる筈なのですが、どう書いてもエラーになってしまいます。 Application.Dialogs(xlDialogPrinterSetup).Show arg1:="プリンタ名" Application.Dialogs(xlDialogPrinterSetup).Show ("プリンタ名") Application.Dialogs(xlDialogPrinterSetup).Show(arg1:="プリンタ名") やりたい事は接続されているマシンの一覧の中から一つのプリンタを選択肢、それだけの設定ダイアログを出したいのです。

  • Excel 埋め込みオブジェクトのファイル名取得

    Excelファイルに挿入>オブジェクト>ファイルから ・・・ で選択し、埋め込んだオブジェクトのファイル名をVBAで 取得する事はできますか? 実際には上記のように手動ではなく、 Application.Dialogs(xlDialogInsertObject).Show , " ", , True でダイアログを表示し、ファイルを選択させています。 埋め込んだファイルがフォルダ階層が深かったりすると、 ファイル名まで表示されないので、ファイル名を取得して、 別のセルに入力するまでをVBAで処理をしたいと考えています。 既に埋め込まれているオブジェクトの名前を取得する、もしくは ダイアログで選択されたファイルの名前を取得する、ということが できるのであれば教えていただけますでしょうか?

  • ExcelVBA/ダイアログボックスで選んだファイルのファイル名を取得したい

    ExcelのVBAについて教えてください。 「ファイルを開く」の時に出てくるようなダイアログボックスを表示させ、そこで選択したファイルのフルパス+ファイル名を文字列形式で取得したいのですが、どのようにしたら良いでしょうか? 自分でヘルプファイルもある程度調べてみたのですが、よく分かりませんでした。 最終的には、ワークシート上に画像ファイルを挿入し、その作成日付をセルに表示するようなものを作りたいのですが、 Application.Dialogs(xlDialogInsertPicture).Show では、画像は挿入されるものの、挿入した画像のファイル名を取得できないので、日付が調べられないのです。 宜しくお願いします。

  • オートシェイプの書式設定(線と色)の組み込みダイアログボックスを表示することは可能?

    オートシェイプの書式設定の組み込みダイアログボックスをEXCEL VBAから表示させることは可能でしょうか? Application.Dialogs(xlDialogPatterns).Show を使っても、セルやグラフ系のオブジェクトの書式設定はできるようですが、オートシェイプの書式となると、輪郭線の色や太さ(ポイント単位)が指定できないようです。 オートシェイプの書式設定はExcelの組み込みダイアログボックスに入っていないのでしょうか。

  • 保存ダイアログのファイルの種類を限定したい

    Excel 2003を使用しております。 VBAで以下のように保存ダイアログを表示させたときの 「ファイルの種類」をxlsだけにしたいのですが どうすればいいのでしょうか? Application.Dialogs(xlDialogSaveAs).Show

  • エクセルでCSVファイルをユーザーに選択させたい

    エクセルVBAで、特定のフォルダ(C:\Data)に入っているCSVファイルをユーザーに選択させたいのです。 ただ、その際、選択肢に表示させるファイルに、例えば”企画“という文字列があることを条件にしたいのです。 組み込みダイアログであれば OpenFileName = Application.Dialogs(xlDialogOpen).Show("C:\Data\*企画*.csv") で大丈夫だと思います。 しかし、組み込みダイアログでは実際にそのファイルがエクセルで開かれてしまい、先頭の数字の0が消える等の不都合が起きてしまいます。 そのため、ファイルは指定させますが実際には開かずファイル名だけを取得する Application.GetOpenFilenameを使おうと思いました。 これでファイル名さえ所得できればあとは外部データの取り込みでCSVデータを取得できます。 ところが、 OpenFileName = Application.GetOpenFilename("C:\Data\*企画*.csv") はエラーになってしまいます。ネットで検索すると、Application.GetOpenFilenameではファイル名にワイルドカードは使えないようです。 このような場合、どのような方法をとればよいでしょうか?

  • Excel VBA xlDialogSort引数リストの使い方

    いつもお世話になっております。 Excel VBA の使い方で困っていますので、どちらかご教授いただけると幸いです。 状況: 手動で並べ替えセル範囲を選択後、ボタンを押すと、 Application.Dialogs(xlDialogSort).Show を実行して、Excel組込み(標準)の並べ替えダイアログを表示させて、並べ替機能を利用したいのですが、この並べ替えダイアログの「範囲の先頭行」の指定が自動で「データ」となってしまい、困っています。 正しくは、常時「タイトル行」を指定したいと思っています。 そこで、VBAのヘルプを調べて、引数リストなるものを見つけましたが、使い方が判らなくて困っています。 (引数リスト) xlDialogSort orientation、key1、order1、key2、order2、key3、order3、header、custom、case (質問) Application.Dialogs(xlDialogSort).Show に、上記引数リストのいずれかを加えて、並べ替えダイアログでは常に「タイトル行」が選択されるようには、どうしたらよいのでしょうか?

  • vb6を使用しています。VBAの構文をvb6に置き換えて作りましたがう

    vb6を使用しています。VBAの構文をvb6に置き換えて作りましたがうまくいきません。 VBAの構文はプリンターのダイアログボックスを表示するもので Application.Dialogs(xlDialogPrinterSetup).Show これをvb6で下記のようにしました Set objXL = CreateObject("Excel.Application") objXL.Dialogs(xlDialogPrinterSetup).Show ところがxlDialogPrinterSetupの部分で「変数が定義されてません」とでます。 どうすればいいのでしょう?

  • カラーパレットの色名は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も取得できると考えての質問です

専門家に質問してみよう