[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『表示の色がカラインデックスと合わない』(はんにゃ)
'----------------------------------- '番号 色 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.