エクセルVBAの自動設定のグラフ系列色のRGB

このQ&Aのポイント
  • エクセルで自動設定されたグラフ系列色(点のみ、線なし)のRGBを取得する方法を紹介します。
  • 他の系列にも同じ色を適用するためには、xlAutomaticで自動設定された色を使用する方法があります。
  • 詳しい説明を受けたい場合は、基礎的な知識から説明していただけると助かります。
回答を見る
  • ベストアンサー

エクセルVBA 自動設定のグラフ系列色のRGB

VBA初級者です。 エクセルで自動設定されたグラフ系列色(点のみ、線なし)の RGBを取得するにはどうしたらいいのでしょうか? 系列色を設定する方法は以下のようにすればいいようですが。。。 ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Select    With Selection .MarkerBackgroundColorIndex = 色番号 / xlAutomatic .MarkerForegroundColorIndex = 色番号 / xlAutomatic    または、     .MarkerBackgroundColor = RGB(?,?,?) .MarkerForegroundColor = RGB(?,?,?) End With 私がやりたいことは、上のような記述でxlAutomaticで自動的に設定された ある系列の色を他の系列にも適用したいのです。もう少し具体的に言うと、 系列1,2、系列3,4、のように隣り合う系列を同色にしたいのです。 系列数が少なければ各組合せに対してRGBを設定すればいいのですが、 系列が大量になってきますと、自分でRGBを設定するのも大変で、 系列1,3,5・・・に関しては、xlAutomaticで自動設定して、その色を 系列2,4,6・・・に適用しようと思ったのですが、よくわかりませんでした。 ActiveChart.SeriesCollection(1).Select  With Selection .MarkerBackgroundColorIndex = xlAutomatic Color = MarkerBackgroundColorIndex End With ActiveChart.SeriesCollection(2).Select  With Selection .MarkerBackgroundColorIndex = Color End With などとしてみましたがダメでした。恥ずかしながら基礎を 理解できていないので詳しく説明していただけると幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.5

#3-4です。#4お礼欄拝見しました。 > 系列13からは濃淡を変えるなどして、色分けするにはどうしたらよいでしょうか? 濃淡といっても、例えば、 セルの書式等にも使うカラーパレットは同系色5段階になっていますが、 これをチャート上で見分けられるかどうか、というと、 私の仕事環境でも、会議室のプレゼン環境でも、 モニターやスクリーンに全画面チャートを表示した場合で、 同系色2~3段階程度が限界と思います。 思う、のであって、他の環境では違う、他の人は違う、 と言うかも知れないので、非常に相対的です。 これがいい、とか、私の判断は全く介在しない事務的な仕事でしたが、 とりあえず、濃淡織り交ぜて、こちらの環境では見分けられる 適当な配色を20色で作ってみて、マクロを書き換えました。 あとは、マーカーのスタイル、マーカーのサイズ、等を工夫すれば、 と思います。 ブック固有の(既定の)配色パターンにある色は そもそも濃淡を表現するのが難しい色として選ばれているように思います。 強いて言えば[マーカーの塗りつぶし][透過性]を使うてもありますが、 これで見分けが付くのは原色系でも2段階が限界に思います。 独自の配色にしたのは、そういう理由からです。 組合わせ方は無限にあるでしょうから、方針とか目標とか必要条件とか、 そういうことから絞って考えていった方が決め易いかも知れませんね。 あくまでも一例、です。 Sub Re8916999_RndColors() Const S_ARRAY_HEX = "0000FF A03070 00FF00 0080FF FF0000 70A030 FF00FF 00FFFF FFFF00 000000" & _           " 8080FF 80FF80 FF8080 FFAAFF AAFFFF FFFFAA AAAAAA CCCCFF CCFFCC FFCCCC" Dim oSeries As Series Dim arrS() As String Dim arrN() As Long Dim nUbColor As Long Dim i As Long   arrS() = Split(S_ARRAY_HEX)   nUbColor = UBound(arrS())   ReDim arrN(0 To nUbColor) As Long   For i = 0 To nUbColor     arrN(i) = CLng("&H" & arrS(i))   Next i   nUbColor = nUbColor + 1   i = 0   For Each oSeries In ActiveChart.SeriesCollection     oSeries.MarkerBackgroundColor = arrN((i \ 2) Mod nUbColor)     oSeries.MarkerForegroundColor = arrN((i \ 2) Mod nUbColor)     ' ' oSeries.MarkerStyle = xlMarkerStyleSquare     i = i + 1   Next End Sub

nolaneco
質問者

お礼

ご回答大変ありがとうございました。 あまり実用的に意味のない要望に対しても ご丁寧にご説明いただき、感謝しております。 コードの書き方はもとより、配色の考え方に ついても勉強になりました。 私は技術系で、データ数が数十になることも 珍しくなく、散布図で全て同色にして傾向だけを 示すか、グラフを複数にわけるか、それとも 自動配色にさせておいて一応データを探せるように しておくか、悩むことが多いです。今回の質問は シートに新しいデータを取り込んで、それと同時に グラフに新データの中の二種類のパラメータを追加する マクロを作っていたときに出てきた問題でした。 同じデータ中の二種類のパラメータは点の形状で区別し、 色は同じにしたかったのです。 データが増えてきますとご指摘のよう色の判別 が難しくなりますので、工夫が必要ですよね。  色々とありがとうございました。

その他の回答 (4)

回答No.4

#3です。こちらからの追加補足です。 #3のマクロ。 系列の数が12を超えると当然ながらエラーになりますね。 ちょとうっかりしました。もっと注意するべきでした。 系列の数が多いからこそ、生じる課題ですものね。 以下2行分、#3のコード、該当行と差し替えてください。     oSeries.MarkerBackgroundColor = arrTcsRgb((idx \ 2) Mod 6)     oSeries.MarkerForegroundColor = arrTcsRgb((idx \ 2) Mod 6) 系列12までで6色を使い切ると、Accent1に戻り、 12系統単位の繰り返しで色を替えます。 既定の色の場合も、6色6系統単位の繰り返しですから、 同じよう(相似)な規則性です。 系列の数を増やして作り直したサンプルでテストしてみて気が付いたのですが、 マーカーのスタイルについては、自動のままでいいのでしょうかね? 、、、あれこれ話が拡がりすぎるのも、難しいですから、 これは、次の段階での課題、ということで、、、。 実は、各ブック固有の配色パターンの数=6、 これに縛られる必要はない訳ですから、 数を増やした独自の配色パターンを用意すれば、 理論上は、RGB関数等でも 16777215 通りの色分けは出来ます。 色の数を増やし過ぎても現実的でないことは言うまでもありませんが、 8、10色程度なら独自の配色パターンを決めている企業も見かけます。 そもそも機能的な要求として、区別が付き易いように色を付けている訳ですが、 実際のグラフの大きさ・細かさ・表示の仕方・系列数など様々な状況から、 とても相対的に、機能性に対するアプローチは変わると思います。 また、デザイン性だとか、Corporate Identityからの要求もあるかも知れませんね。 案外、選択肢(決めていかないと次が出来ないこと)が多い課題ですから、 少しずつ進化させていった方が紛れなくていいかもです。 補足、以上です。

nolaneco
質問者

お礼

ご丁寧な説明ありがとうございました。 私のエクセルは2010です。書き忘れて失礼いたしました。 早速動作確認してみましたところ確かに隣り合う二系列が同色になりました。 ただ、配色はmsoThemeAccent1~6の繰り返しになって、12系列ごとの 色の組み合わせは同じになってしまうようです。(系列1と系列13は同色) 系列13からは濃淡を変えるなどして、色分けするにはどうしたらよいでしょうか? そもそもそんなにたくさんの系列をグラフで色分けすること自体意味がないのですが、 向学のためにご教授願えれば幸いです。 (本来は、あらかじめ見分けやすい色のRGBを用意しておいて、系列が多くなって きたら古いデータはまとめて同色にするなどするの方法が良い気がしてきました。)

回答No.3

こんにちは。 お求めのままにお応えすると、例えばこんな感じ。 (Excelのバージョン判らないですが、xl2010で書いてます) Sub Re8916999() ' このサンプルは必ず、Chart(総体)をアクティブにしてから実行 Dim oSeries As Series Dim iSc As MsoThemeColorSchemeIndex Dim arrTcsRgb(0 To 5) As Long Dim idx As Long   With ThisWorkbook.Theme.ThemeColorScheme     For iSc = msoThemeAccent1 To msoThemeAccent6 ' 5 To 10       arrTcsRgb(iSc - msoThemeAccent1) = .Colors(iSc).RGB     Next iSc   End With   idx = 0   For Each oSeries In ActiveChart.SeriesCollection     oSeries.MarkerBackgroundColor = arrTcsRgb(idx \ 2)     oSeries.MarkerForegroundColor = arrTcsRgb(idx \ 2)     idx = idx + 1   Next End Sub 【ThisWorkbook.Theme.ThemeColorScheme.Colors(index)】 という書式で各ブック固有の配色パターンから、 グラフ系列に用いる[アクセント]の色(Accent1-Accent6の6種類)を取得します。 その色を(使い回しがし易いようにする為に)一旦、 配列変数 arrTcsRgb(0 To 5) に格納しておきます。 ActiveChart.SeriesCollection の各Seriesを総当たりでループして、 > 系列1,2、系列3,4、のように隣り合う系列を同色に... します。 一応、こちらでは動作結果を確認していますが、 せっかく書いたので、そちらでも動かしてみて、 望みの結果が得られるか、教えて下さいね。 ところで、こんな感じで書いてはみたものの、 ブックの配色パターンをユーザー定義で追加登録しておけば、 既定の色で設定してある(変更を加えていない)グラフの色を 一斉に、簡単に切り替えることが出来ます。 予め追加登録しておくか、既存のグラフの色を弄っていない場合なら、 マクロなんて必要ないってことになるかもしれませんね。 (ここら辺は、実際にお使いになるユーザーさんのニーズの問題なので、  私には、どちらとも判断つきませんが) 『グラフの既定の配色を好きな色に設定する』 http://www.moug.net/tech/exopr/0010017.html ユーザー定義で追加登録した配色パターンを、 各ブックに適用させるマクロなら、マクロの記録で簡単に採れる筈です。 xl2010の場合   ActiveWorkbook.Theme.ThemeColorScheme.Load ("フォルダパス\配色パターン名\.xml") のような書式になります。 とりあえず。以上です。何か不足有れば補足ください。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

#1です。 すみません。うまくいかないようです。ごめんなさい。 #1回答は取り消します。「破棄」してください。お手数を煩わしました。

nolaneco
質問者

お礼

いえいえ。ご回答くださったことがありがたいです。 今後もよろしくお願いいたします。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

前景色については何も言ってないが、背景色を自動と同じにしても前景色はそのままなので、それも変えるには、MarkerForegroundColorを使えばいいでしょう。 bcolor をMarkerBackgroundColorIndexでとるとbcolor は相変わらず自動になって、SeriesCollection(2)も(本来の)自動になってしまう。変数にColor(予約語?)を使うのはどうかな。 下記でどうでしょう。 ActiveChart.SeriesCollection(1).Select With Selection .MarkerBackgroundColorIndex = xlAutomatic bcolor = .MarkerBackgroundColor ' fcolor = .MarkerForegroundColor End With ActiveChart.SeriesCollection(2).Select With Selection .MarkerBackgroundColor = bcolor ' .MarkerForegroundColor = fcolor End With

関連するQ&A

  • 積み上げグラフ 系列ごとの自動塗り分け

    現在、オフィス2003で業務の時刻表を作成しています。 写真(左上)のように業務内容と所要時間ような表があり、(右上)のようなグラフにして輸送の部分だけを色付き、他を白色で塗りわけしています。 しかし(左下)のように、順番が1行でも変わると塗り分もずれてしまます。 現在、この塗り分けを自動化するためにマクロやVBAなどを考えていて、以下のようなVBAを作り実行をさせましたが、思うように表示されません。 Sub Macro2() ' ActiveSheet.ChartObjects(1).Activate ActiveChart.ChartArea.Select Dim scname As String Dim colidx As Variant Dim i As Integer With ActiveChart For i = 1 To .SeriesCollection.Count scname = .SeriesCollection(i).Name Select Case Split(scname, " ") Case "輸送": colidx = 4 End Select .SeriesCollection(i).Interior.ColorIndex = colidx Next End With End Sub 何かよい方法は(VBAやマクロなども踏まえて)ありますでしょうか? ご教授宜しくお願いします。 (最終的に凡例は表示させたくはありませんが、らラベルとして系列名を表示させたく思っています。)

  • Excel マクロ グラフの線とマーカーの太さ変更

    Excel2010でのマクロで折れ線グラフをマクロで作ろうとしています。 線の太さを2.25pt、マーカーの太さを1.25ptにしたいのですが、 マクロの記録では ActiveChart.SeriesCollection(2).Select '線の太さ With Selection.Format.Line .Visible = msoTrue .Weight = 2.25 End With 'マーカーの太さ With Selection.Format.Line .Visible = msoTrue .Weight = 1.25 End With となり、同じ太さになってしまいます。 手動でデータ系列の書式設定をすると各々別の太さになるのですが、 マクロではどうすればいいでしょうか? 宜しくお願いいたします。

  • エクセルマクロのグラフ操作

    エクセルにてグラフの線の色を変えるマクロを記録し そのまま実行するとエラーになります。 (Lineメソッドは失敗しました) どこを変更すれば上手くいきますでしょうか。 '------------------------記録したマクロ ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.Legend.Select ActiveChart.Legend.LegendEntries(1).Select With Selection.Format.Line .Visible = msoTrue .ForeColor.RGB = RGB(192, 0, 0) .Transparency = 0 End With 環境 Windows 7 Office 2010

  • VBAでのグラフの系列の設定について

    グラフの系列設定(線種やマーカースタイル)をマクロで行おうとしていますが、 With Selection.Border .LineStyle = LST(I + 1) .ColorIndex = CID(I + 1) .WEIGHT = WGT(I + 1) End With With Selection .MarkerStyle = MST(I + 1) .MarkerBackgroundColorIndex = MBC(I + 1) .MarkerForegroundColorIndex = MFC(I + 1) .MarkerSize = MSZ(I + 1) .Shadow = SDW(I + 1) .Smooth = False End With というふうに設定を変数にすると、うまく走りません。 LST()はSTRINGで定義しています。 カラーインデックスはINTEGERで定義していますが、これはいけます。 どうしたらいいのでしょうか?

  • Excel VBAのグラフ化自動マクロがうまくできません。

    Sub 自動グラフ作成() For i = 5 To 32 Step 3 Charts.Add ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=distance!R18C1:R1009C1" ActiveChart.SeriesCollection(1).Values = "=distance!R18C" & (i + 2) & ":R1009C" & (i + 2) Next End Sub 上記のように表の中の決められたセルからデータを取り出して自動的にグラフを作成してくれるマクロを作成したのですが、奇数個めのグラフは正常に生成されるのですが、偶数個めのグラフになぜか x= y=distance!$M$18:$M$1009 x= y={1} みたいな必要なグラフ以外に上記の2つのグラフを混じってしまいます。これってどこがおかしいのでしょうか? どなたか助けて下さい。 お願いいたします。

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について (続き1)

    http://oshiete1.goo.ne.jp/qa3258443.html の質問の続きです。 ------------------------------------------------------------- Sub sample() Dim myRange As Range Set myRange = Range("A1:D2") With Worksheets("Sheet1").ChartObjects.Add(50, 50, 300, 200).Chart .ChartType = xlPie .SetSourceData Source:=myRange, PlotBy:=xlRows .ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True End With End Sub ------------------------------------------------------------- この手法でグラフ作成した場合について、 1. グラフ作成時に以下と同じように NumberFormatLocal を設定する方法はありますか? (通常の記述例) ActiveChart.SeriesCollection(1).DataLabels.Select Selection.NumberFormatLocal = "0.0%" といいますのは、現在作成しているマクロはユーザーの操作によっては 円グラフと棒グラフが順不同に作成される場合があり、 SeriesCollection の INDEX番号 が分からない場合があるためです。 または、グラフの名前等を指定することなどにより、 SeriesCollection の INDEX番号 を取得する事が可能でしたら その方法を教えて頂きたいのですが・・・。 2. 同じく、グラフ作成時にデータラベルのフォントを設定する方法はありますか? (通常の記述例) With Selection.Font .Name = "MS Pゴシック" .Size = 10 End With 3. 同じく、横棒グラフ作成時に、以下と同じ事はできますか? '反転 ActiveChart.Axes(xlCategory).Crosses = xlMaximum ActiveChart.Axes(xlCategory).ReversePlotOrder = True '横軸100% ActiveChart.Axes(xlValue).MaximumScale = 1 以上、何卒ご教授のほど、よろしくお願い致します。

  • Excellのvbaにおける、グラフの設定

    このたびは、Excellのvbaにおける、グラフの設定がわからず質問させていただきます。 具体的に、行いたいこととしましては、 円グラフを新規に作成し、データ範囲を指定し、グラフを表示させるということをしたいと考えております。 しかし、項目軸ラベルに使用するデータの設定がうまくいきません。 以下にソースコードをのせますのでアドバイス願います。 Sub AddGrafh()      Range("J4:O4").Select      Dim NowSheetName As String   NowSheetName = ActiveSheet.Name      ActiveSheet.ChartObjects.Add(50, 200, 338, 220).Select   ActiveChart.ChartType = xlPie   ActiveChart.ChartWizard Source:=Range("J4:O4"), PlotBy:=xlRows   ActiveChart.SeriesCollection(1).Name = "=""項目別支出割合"""   ActiveChart.ChartTitle.Font.Size = 14     ActiveChart.SeriesCollection(1).XValues = """=" & NowSheetName & "!$J$3:$O$3"""      End Sub 上記の ActiveChart.SeriesCollection(1).XValues = """=" & NowSheetName & "!$J$3:$O$3""" という箇所の記述がおかしいのですが、なんてかいてよいかわかりません。 ちなみに、項目軸ラベルに設定したいデータは、現在のシートのJ$3:$O$3です。 よろしくお願いします。

  • Excelでのグラフ作成用マクロについて。

    「新しいマクロを記録する」でグラフ作成用のマクロを作りました。 内容は、 1.sheet1のBC列を散布図でsheet2に出力。(4つほど別々のグラフを作成) 2.プロットエリアの拡大 3.図の位置調整・図の大きさ調整。(4つが重ならないように) というものです。 一応出来たのですが、何故か選択列を変更して(マクロ内の列選択を変更)出力・プロットエリア拡大までは出来るのですが、3が出来ません。 それで、分からないなりにマクロ内を覗いてみたところ、図の位置を調整する際に、対象となる図が ActiveSheet.Shapes("グラフ 17").IncrementLeft -177.75 などと言うように、グラフ17を参照してしまっているためにうまく動かないのだと思いました。 (そもそも、名前なんて付けていないはず・・・と思って調べていたら、どうやら「グラフウインドウ」で見ることが出来る名前を参照しているようでした。) いっそのこと、グラフをクリック・ドラッグで移動させるのではなく、出力する際に整然と並ぶように設定したいです。どうすればよいでしょう? 一応、作成したものを載せておきます。 ・1~2 Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B1:C32158"), _ PlotBy:=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet2" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "mass" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "counts" End With ActiveChart.HasLegend = False ActiveChart.PlotArea.Select With Selection.Interior .ColorIndex = 2 .Pattern = xlSolid End With Selection.Top = 1 Selection.Width = 323 Selection.Height = 180 Selection.Left = 15 Selection.Width = 334 Selection.Height = 194 ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = 0 .MaximumScale = 50 .MinorUnitIsAuto = True .MajorUnit = 5 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With End Sub 3. ActiveSheet.Shapes("グラフ 17").IncrementLeft -182.25 ActiveSheet.Shapes("グラフ 17").IncrementTop -105.75 End Sub

  • EXCELVBAグラフ凡例表示部分の系列の名称非表

    すいません。VBAの記述の方法がわからないのでお手数ですが教えてください 使用アプリ・使用OS:Excel2010 VBA Windows7 ■教えてほしい内容 グラフを作成し、その後以下のVBAでグラフの系列を追加しています。 dk = ActiveChart.SeriesCollection.Count + 1 ActiveChart.SeriesCollection.NewSeries '系列名の設定 ActiveChart.SeriesCollection(dk).Name = "cp-" & dk 'y軸の値設定 ActiveChart.SeriesCollection(dk).Values = "={" & aaa & "}" '散布図設定 ActiveChart.SeriesCollection(dk).ChartType = xlXYScatter その後、グラフの凡例部分でこの追加した系列cp-○の凡例内の系列を非表示にしたいのですがわかりません。 申し訳ありませんが教えてください。

  • グラフマクロで系列を変数にする方法を教えてください

    エクセルのグラフマクロについて質問します。 系列のxの値(Yの値も)の設定で、 グラフ化したいワークシートと範囲を変数にすることはできますか? 目的は、複数あるシートの複数のセルをグラフ化したい、というものです。 変数にてシート名と範囲を指定したいです。 ↓のようなプログラムを作成してみましたが、どうもうまく動きません。 12行目で止まってしまいます。 13行目はでたらめですが、範囲も変数bにできないかなぁと、勝手にイメージで作ってみました。 Sub () n = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To n Sheets("SHEET1").Select Range("A" & i).Select a = ActiveCell.Value Sheets(a).Select Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets(a).Range("V22") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=sheets(a)!R2C4:R5C4" ActiveChart.SeriesCollection(1).Values = "=sheets(a)!range(b)" ActiveChart.Location Where:=xlLocationAsObject, Name:=Sheets(a) Next i End Sub 当方、マクロかじりたての初心者です。 どなたか、よろしくおねがいします!

専門家に質問してみよう