[[20090913182915]] 『表示の色がカラインデックスと合わない』(はんにゃ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『表示の色がカラインデックスと合わない』(はんにゃ)

 '-----------------------------------
  '番号   色          RGB()
 '1      黒          RGB(0,0,0)
 '2      白          RGB(255,255,255)
 '3      赤          RGB(255,0,0)
 '4      明るい緑    RGB(100,255,100)
 '5      青          RGB(0,0,255)
 '6      明るい黄色  RGB(255,255,0)
 '7      マゼンタ    RGB(255,0,255)
 '8      シアン      RGB(0,255,255)
 '9      茶          RGB(128,0,0)
 '10     緑          RGB(0,255,0)
 '11     紺          RGB(0,0,128)
 '12     うぐいす    RGB(128,128,0)
 'max 51
 の理解も下 
 Private Sub colorTestbar()
    With Sheets("系譜図")
     .Shapes.AddShape(msoShapeRectangle, 330, 30, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 3    '⇒10  緑
     .Shapes.AddShape(msoShapeRectangle, 340, 40, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 10   '⇒ 3 赤
     .Shapes.AddShape(msoShapeRectangle, 350, 50, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 5    '⇒ 6 明るい黄色

     .Shapes.AddShape(msoShapeRectangle, 360, 60, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 6    '7      マゼンタ
     .Shapes.AddShape(msoShapeRectangle, 370, 70, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 7    '8      シアン
     .Shapes.AddShape(msoShapeRectangle, 380, 80, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 1    '2      白
     .Shapes.AddShape(msoShapeRectangle, 390, 90, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 8    '1      黒
    End With
  End Sub
 '------
 で表示させたのですが、コードのコメントに書いた色になりました。
 どうしたら なおるでしょうか?
(はんにゃ)


 セルの塗りつぶしに使うColoindexの値とSchemeColorに指定する値に7の差があるみたいですよ
 従って、

 Sub colorTestbar()
    Const 調整値 = 7
    With Sheets("Sheet1")
       .Shapes.AddShape(msoShapeRectangle, 330, 30, 170, 10) _
          .Fill.ForeColor.SchemeColor = 3 + 調整値  '⇒10  緑

       .Shapes.AddShape(msoShapeRectangle, 340, 40, 170, 10) _
          .Fill.ForeColor.SchemeColor = 10 + 調整値 '⇒ 3 赤
       .Shapes.AddShape(msoShapeRectangle, 350, 50, 170, 10) _
          .Fill.ForeColor.SchemeColor = 5 + 調整値  '⇒ 6 明るい黄色

       .Shapes.AddShape(msoShapeRectangle, 360, 60, 170, 10) _
          .Fill.ForeColor.SchemeColor = 6 + 調整値  '7      マゼンタ
       .Shapes.AddShape(msoShapeRectangle, 370, 70, 170, 10) _
          .Fill.ForeColor.SchemeColor = 7 + 調整値  '8      シアン
       .Shapes.AddShape(msoShapeRectangle, 380, 80, 170, 10) _
          .Fill.ForeColor.SchemeColor = 1 + 調整値  '2      白
       .Shapes.AddShape(msoShapeRectangle, 390, 90, 170, 10) _
          .Fill.ForeColor.SchemeColor = 8 + 調整値 '1      黒
    End With
 End Sub

 このようにすると、御希望の色になると思います。

 ichinose


 こちらでも早速 ありがとうございました。
 不思議な数値の取り決めがあるのですね。
  これで一件落着です。
 はんにゃ

 一件落着との事ですが、これは質問せずに自力で解決出来るようになりたい所です。
 
当初の色の割当表をどのように取得したのかは分かりませんが、
何かしらの不明な事があり、それが「マクロの記録」で記録できる事ならば
マクロの記録を活用しましょう。
今回の件も図形に色を付ける過程を記録すれば、設定値は自力で判明出来たはずです。
 
とはいえ「なぜ色の設定値が違うんだ?」と言う疑問はごもっともですが。
(ご近所PG)マクロの記録は便利な先生

 はい、マクロ記録をして、描画のコードを作ったのですが 
 色のIndex数値は よく見ないで,
 色身がわかりやすい = RGB(x,y,z) で コードして どうもIndexでないといけないと
 きづき、Helpやこの学校ではみあたらなかったので 
 Web検索で "Excel Color Index RGB”などで 探してIndex値と色の対応が見たのが上の表です。
 まさか それら+7(0111)とはわかりませんでした。
 以上言い訳です

 以後記録を注意深くします。

 先生も この知識は記録ですか それとも 専門の教科か あるいは
 どこかで一般にしる Webなどから でしょうか?

 ありがとうございました。
 (はんにゃ

  


 RGB指定は以下の様にする事で設定出来そうです。
 
〜.Fill.ForeColor.RGB = RGB(0,0,0)
 
このプロパティに気付いたのは、例えば私の場合は
Sub test()
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 3
End Sub
といったコードのカラーを設定している箇所にブレークポイントを設定しておき、
「Selection.ShapeRange.Fill.ForeColor」部分を範囲選択し、
然る後に右クリックして出た「ウォッチ式の追加」を選択。
ウォッチウィンドウが表示され、その中にオブジェクトが持つプロパティ値などが表示される。
この中を眺めたら「お、RGBなんてのがあるじゃん」って事で使えそうだと気付いた、
 
みたいな流れです。
ただ、この方法が一般的だとは言いません。
なんとなーく経験則から
「ここ(今回の場合はForeColor)にはなにかありそうだなぁ」
と思ったら調べてみよう、と。
そしてその調べ方を知ってたので気付けた。そんなもんです。
 
ただ、WEBを検索すれば、見つかるとは思います。
キーワード「ForeColor RGB」等でグーグル先生に聞いてみるとか。
こういう「何を検索キーワードにすれば良いか」ってのが経験則?
 
ちなみに「SchemeColor」の設定値になぜ7の差があるのかは、私にはわからんちん。
(ご近所PG)経験は12年目

 なるほど ! 言語プログラムの開発者はいろいろかんがえるのですね。

 「ウォッチ式の追加」など ありがとうございました。
 はじめてのエクセル、マクロ VBで ひとつのプログラムを組むのみ
 大勢の助力(知恵)でここまできました。あとは出力での一歩です。

 ちなみに +7といか .SchemeColor の色数値はHelp等にでるでしょうか

 (はんにゃ)


 >+7といか
 ここだけ。

 これは、各インデックス?番号を自分で調べ、比較した結果が、
 7の誤差で統一されて規則性があったって事です。
 こういった、規則性も自分で見つけるようにしないとダメだと思う。
 BJ

 BJさんも言うように、設定値の数は見るからに有限なので、
自分で調べて〜ってパターンでしょうね。
探せばあるかも知れないけど……
 
ちょいと懐かしいものをペタリ
[[20050115131721]]『条件式書式を6つやりたいんですが・・・』(sirouto)
こちらで川野鮎太郎さんがセル色の一覧を提示されてますが、
多分、
セルに自分で色を1つ1つ付けて、
それに対するColorIndexを脇に出力するような簡単なマクロを作成して
調べられたのだと思います。
(ご近所PG)

 ご参考までに、Excel2003のVBAヘルプ PatternColorIndex プロパティ のページに
「標準のカラーパレットのインデックス番号」
というのが掲載されています。が、gif画像のせいなのか、
実際のセルの発色とはずいぶん違って見える。
(みやほりん)(-_∂)b

 はい、狙いをさだめて 規則性を得るようにします。
 それには
 〜応用する場合の考え方〜
 が大いに参考になります。
 こころします。ありがとうございます。

 実際

 グループ化をするのに マクロ記録では Index(というのかな)で
 図形をしていしているのですが
  ActiveSheet.Shapes.Range(Array("Rectangle 2461", "Rectangle 2462", _
        "Rectangle 2463", "Rectangle 2464" _
    , "Rectangle 2465", "Rectangle 2466", "Rectangle 2467")).Select
  Selection.ShapeRange.Group.Select 

 その取得を調査しています。
 Range("A1:AA20")のようなセルの範囲ではNGでした

    With Sheets("系譜図")
       .Shapes.AddShape(msoShapeRectangle, 330, 30, 170, 10) _
        .Fill.ForeColor.RGB = RGB(255, 0, 0) '赤
'        .Fill.ForeColor.SchemeColor = 3 + 調整値  '赤
       .Shapes.AddShape(msoShapeRectangle, 340, 40, 170, 10) _
          .Fill.ForeColor.SchemeColor = 10 + 調整値 '緑
       .Name = "shpOne"

       Range(Array("shpOne", "shpTwo")).Select
       Selection.ShapeRange.Group.Select
    End With
NGでした
 (はんにゃ

 7の差・・・、自分で設計するなら、これ同じにしますよね? ってことは、設計ミスかな?
 でも・・・、そうだとしたら、余りにもお粗末だよねえ・・・・。
 こういうのは、Excelの歴史を紐解かないとわからないものです。
 図形を扱うオブジェクトShapeは、
 Excel/VBAでは、まだ歴史的に新しいですよね?以前は、DrawingObjectでしたよね

 Shapeは、別のアプリからの仕様をそのまま受け継いできたため、元々Excelで定義した色番号とは、違ってきてしまったとかね(これ想像です)

 新規ブックにて試してみてください。

 '=============================================================================
 Sub test()
    Const 調整値 = 7
    Dim g0 As Long
    Dim rec As Shape
    Dim b1r As Range
    Set b1r = Range("b1")
    Set rec = ActiveSheet.Shapes.AddShape(msoShapeRectangle, b1r.Left, b1r.Top, b1r.Width, b1r.Height)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec.Fill.ForeColor.SchemeColor = g0 + 調整値
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec.Fill.ForeColor.SchemeColor
          g0 = g0 + 1
       Loop
    End With
 End Sub

 上記のtestを実行すると、前述の通り、セルA1の色番号 とB1に配置した四角形の色番号には
 7の差がありますが・・・、
 セルB1に作成した四角形を昔のオブジェクトで操作すると・・・、

 '============================================================================
 Sub test2()
    Dim g0 As Long
    Dim rec As Object
    Dim b1r As Range
    Set b1r = Range("b1")
    Set rec = ActiveSheet.Rectangles(1)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec.Interior.ColorIndex = g0
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec.Interior.ColorIndex
          g0 = g0 + 1
       Loop
    End With
 End Sub

 続けてtest2を実行すると、セルA1の色番号 とB1に配置した四角形の色番号は、同じ値で同じ色になっています。昔は、ちゃんと設計されてたんだよね。

 ということで歴史ができると、こういう摩訶不思議な仕様が出てきてしまうと言うことで・・・。

 VBAをやり始めたとき、

 sub aaa()
   With Sheets("sheet1")
     .Shapes.AddShape(msoShapeRectangle, 330, 30, 170, 10).Select
     Selection.ShapeRange.Fill.ForeColor.SchemeColor = 3
   end with 
 end sub

 これだって不思議でしたよ、私には。

 だって、図形を選択して、選択したものを取得するSelectionでオブジェクトの種類が変わってるんだもんね
 これも歴史があるアプリの互換性を保つために起こった摩訶不思議ですよね?

 ichinose


 ありがとうございます。
 システムが広がるときに いろいろのコードを引きづいているのでしょう。
 言語ですから。

 せっかく頂いたのですがTezt2で、A1は変わりますがB1はかわらないです
     Set b1r = Range("b1")
 がいかされていないようですが いかがでしょう 
(はんにゃ

 ん?おかしいな。私の環境では、正常に作動しますけどねえ(Win2000&Excel2002)

 仕切りなおしで新規ブックの標準モジュールに

 '=======================================================================
 Sub test()
    Const 調整値 = 7
    Dim g0 As Long
    Dim rec As Shape
    Dim rec2 As Object
    Dim b1r As Range
    Set b1r = Range("b1")
    Set rec = ActiveSheet.Shapes.AddShape(msoShapeRectangle, b1r.Left, b1r.Top, b1r.Width, b1r.Height)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec.Fill.ForeColor.SchemeColor = g0 + 調整値
          DoEvents
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec.Fill.ForeColor.SchemeColor
          g0 = g0 + 1
       Loop
    End With
    MsgBox "このようにセルA1の色とセルB1に配置した四角の色の差は7です" & vbCrLf & _
           "今度は、旧オブジェクトで図形を操作します"

    Set rec2 = ActiveSheet.Rectangles(1)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec2.Interior.ColorIndex = g0
          DoEvents
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec2.Interior.ColorIndex
          g0 = g0 + 1
       Loop
    End With
    rec2.Delete
    Set rec = Nothing
    Set rec2 = Nothing
 End Sub

 前投稿のtestとtest2の内容をまとめてみました。

 これで試してみてください。うまくいくようなら、前半と後半の違いを研究してみてください。

 ichinose


 もうひとつ新規ブックの標準モジュールに

 '============================================================================
 Sub test()
    Const 調整値 = 7
    Dim g0 As Long
    Dim ra As Range
    Dim rb As Range
    Dim rc As Range
    With ActiveSheet
       Set ra = .Range("a1:a12")
       Set rb = .Range("b1:b12")
       Set rc = .Range("C1:C12")
       For g0 = 1 To 12
          With ra.Cells(g0)
             .Interior.ColorIndex = g0
             .Value = g0
          End With
          With .Shapes.AddShape(msoShapeRectangle, rb.Cells(g0).Left, _
                       rb.Cells(g0).Top, _
                       rb.Cells(g0).Width, _
                       rb.Cells(g0).Height)
             .Fill.ForeColor.SchemeColor = g0 + 調整値
             .TextFrame.Characters.Text = g0 + 調整値
          End With
          With .Rectangles.Add(rc.Cells(g0).Left, _
                       rc.Cells(g0).Top, _
                       rc.Cells(g0).Width, _
                       rc.Cells(g0).Height)
             .Interior.ColorIndex = g0
             .Text = g0
          End With
       Next
       Set ra = Nothing
       Set rb = Nothing
       Set rc = Nothing
    End With
 End Sub

 上記のtestを実行してみてください。

 セルA1:A12には、セル自体を表示されている色番号で塗りつぶしています。

 セルB1:B12には、それぞれのセルにマッチした四角形を作成し、
 Shapeオブジェクトを使って、表示されている色番号で塗りつぶしています。

 セルC1:C12には、それぞれのセルにマッチした四角形を作成し、
 Rectangleオブジェクトを使って、表示されている色番号で塗りつぶしています。

 というように同じ四角形でも操作するオブジェクトによって、色番号が違うことがわかって
 頂ければよいのですが・・・。

 前々回、前回、今回の投稿は、コードは違っていますが、全て同じことがいいたいんです。

 一つぐらいは、正常に作動していますか?

 ichinose


 ありがとうございました。
 Sub test4()で
     With ActiveSheet
  に
    .Range("a1") = "セルに色づけ"
    .Range("b1") = "Addshapeに色づけ"
    .Range("c1") = "ObjectRectangleに色づけ"

 を追加し   
       Set ra = .Range("a2:a13")
       Set rb = .Range("b2:b13")
       Set rc = .Range("C2:C13")

 となおしました。
 よくわかり 同じ色が数値とともに表示されました。

 一方 test2 について 初めは以前と同じ様にB1が鶯色のままでした。
 コードはそのままで 4つをいろいろやっている内に今度は   
 Set rec2 = ActiveSheet.Rectangles(1)
 で プロパティが得られないのエラーが出て、
 改めてエクセルを起動しなおしたら 今度は正常 同じ色で動きました。
 また Test3をすると後半でB1の色が鶯色のままです。Test2もです。
 どうしてか 前のままで書き込まないようです。
 Excel 2003 WindowsXP 
 それと正確には一つのBookの中の各Testがことなるモジュールです。
(はんにゃ
 


 >よくわかり 同じ色が数値とともに表示されました。
 まっ、どれかひとつで私が申し上げたいことが御理解頂ければそれでよいです。

 >それと正確には一つのBookの中の各Testがことなるモジュールです。

 いえ、全部違う新規ブックで試してみてください(testとtest2は、同じブックでよいです
 が、test3--正確には、2番目の投稿のtest とtest4正確には、3番目の投稿のtestは、別のブックで
 試してください)。
 それと最初の投稿のtestとtest2は、testを実行してから,test2の実行です。
 又、繰り返し実行する場合は、作成された四角形を削除してから、行なってください。
 test実行の前に四角形があれば、削除。test実行。そのまま、test2実行 という手順です。
 testの中で一度図形を削除するコードを入れても良いです。

 MS社も最初から変わった仕様にしたわけではないのでしょう!!

 ichinose


 Test Test2のみを新規ブックにいれ、続けてTest Test2をすると やはりTeat2でB1がかわらないまま になります。
 以前の値設定などが 邪魔をしているようです。単純な重ね画きなら 上から指定した色になるはずです。
 削除の仕方(いろいろしてで どれと指定できない)
     Set rec = ActiveSheet.Rectangles(1)
 でエラーがでます。

 Test の終わりか Test2の初めに図形Deleteをしないといけないようです。

(はんにゃ

 


  '=======================================================================
 Sub test()
    Const 調整値 = 7
    Dim g0 As Long
    Dim rec As Shape
    Dim rec2 As Object
    Dim b1r As Range
    Set b1r = Range("b1")
    Set rec = ActiveSheet.Shapes.AddShape(msoShapeRectangle, b1r.Left, b1r.Top, b1r.Width, b1r.Height)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec.Fill.ForeColor.SchemeColor = g0 + 調整値
          DoEvents
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec.Fill.ForeColor.SchemeColor
          g0 = g0 + 1
       Loop
    End With
    MsgBox "このようにセルA1の色とセルB1に配置した四角の色の差は7です" & vbCrLf & _
           "今度は、旧オブジェクトで図形を操作します"

    Set rec2 = ActiveSheet.Rectangles(1)
    g0 = 1
    With Range("a1")
       Do Until g0 > 12
          .Interior.ColorIndex = g0
          rec2.Interior.ColorIndex = g0
          DoEvents
          DoEvents
          MsgBox "セルA1の色番号" & g0 & "---  セルB1にある図形の色番号" & rec2.Interior.ColorIndex
          g0 = g0 + 1
       Loop
    End With
    rec2.Delete
    Set rec = Nothing
    Set rec2 = Nothing
 End Sub

 これだけを本当の新規ブックで試された結果はいかがですか?
 2番目の投稿コードです(test3?)。

 Rectangles(1)というコードで四角形を取得していますから、四角形が二つ存在してそれが重なり合っている
 ようなことがあると(投稿したコードを全て同じブックで作動させたりしているとその可能性があります)、
 色が変わらないという現象も考えられます。
 仮に上記のtestが作動するようなら、これで解決としてください。

 しかし、全くの新規ブックで上記のコードを実行して、色が変わらないとなると、
 色を変更するタイミングをバージョンの違いでExcelが変えているのかもしれません。

 ichinose


 > これだけを本当の新規ブックで試された結果はいかがですか?
 > 2番目の投稿コードです(test3?)。
  報告がぬけていて すみません。これは問題なく 同じBookで 他のTestXと続けて 動作させても
 きれいに動いていました。
  はい これで解決といたします。
  ほんとうに ありがとうございました。

  最終的には ちょっと前に 以前のコードで使えなかった
  .ForeColor.RGB = RGB(255, 0, 0) '赤
  が使える書き方がわかり、 それと 数値で色味が想定できるので、つかうことにしました。
 いろいろ勉強になり、おせわになりました。
 (はんにゃ


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.