プロが教えるわが家の防犯対策術!

VBAでグラフのデータポイントの色分けをしたいと考えています。

例えば:

年齢区分, 身長, 体重
20代, 180, 70
20代, 175, 68
10代, 149, 50
30代F, 160, 55

のようなデータがあって、横軸を身長、縦軸を体重として散布図を描き、年齢区分によって色を変えたいという状況です(例えば20代だけを赤のデータポイントで描く、といったように)。

基本的にはMとFをそれぞれ別の系列として描くという方法しかないのでしょうか?

また、データ範囲は可変するのでいつも決まったセル範囲に20代のデータが入力されているとは限りません。

冗長ですが

・20代のセル範囲を別範囲にコピー
・20代以外のセル範囲を別範囲にコピー
・それぞれのセル範囲のデータを取得して別系列として描く

という方法がベターでしょうか。。。

何かアイディアをください!!

A 回答 (3件)

徒然なるままにやってみました。


既存の相関図の「点」を分類に応じて色分けします。
X軸のデータの左隣の列に分類のデータがあるとします。
なお、xl2000で試しております。ご参考まで。
Sub test()
Dim myGraph As ChartObject
Dim mySeries As Series
Dim xValueRange As Range
Dim myFormula As String
Dim i As Long, myColorIndex As Long
Dim colorChangeFlag As Boolean

Set myGraph = ActiveSheet.ChartObjects(1) 'Indexの数字は実情に合わせて調整して下さい。
Set mySeries = myGraph.Chart.SeriesCollection(1) '同上
myFormula = Split(mySeries.Formula, ",")(1)
Set xValueRange = Sheets(Split(myFormula, "!")(0)).Range(Split(myFormula, "!")(1))
For i = 1 To xValueRange.Cells.Count
Select Case xValueRange.Cells(i).Offset(0, -1).Value
Case "10代"
colorChangeFlag = True
myColorIndex = 3
Case "20代"
colorChangeFlag = True
myColorIndex = 5
’以下必要に応じて場合分けを記述して下さい。

End Select
If colorChangeFlag Then
With mySeries.Points(i)
.MarkerBackgroundColorIndex = myColorIndex
.MarkerForegroundColorIndex = myColorIndex
End With
End If
colorChangeFlag = False
Next i
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ChartObjectを宣言して Set myGraph = ActiveSheet.ChartObjects(1) なんて取得の仕方ができるのですか。。。 う~ん、まだ全然勉強が足りませんね(^_^;) VBAは奥が深い。。。

でも基本的には系列名を取得していって、条件にマッチしたものだけを色指定するという操作になるのですね。勉強になりました。

お礼日時:2011/08/14 18:05

データ範囲を指定してLoopし、年齢区分の内容によって色づけ処理する感じでしょうか。


ついでに、散布図系列よりデータ範囲を取得するところから始めるとすれば
下記のようなコードになります。

Sub test()
  Dim sr As Series
  Dim s() As String
  Dim r  As Range
  Dim i  As Long

  With ActiveSheet.ChartObjects(1).Chart
    .HasLegend = False
    Set sr = .SeriesCollection(1)
  End With
  sr.MarkerBackgroundColor = vbBlue
  sr.MarkerForegroundColor = vbBlue
  s = Split(sr.Formula, ",")
  '系列のSERIES関数をカンマで区切ってXValuesの範囲を取得して _
   左に1列Offsetした範囲をLoopして調べる
  For Each r In Excel.Range(s(1)).Offset(, -1)
    i = i + 1
    With sr.Points(i)
      Select Case r.Value
      Case "20代"
        .MarkerBackgroundColor = vbRed
        .MarkerForegroundColor = vbRed
      End Select
    End With
  Next
  Set sr = Nothing
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

グラフの操作をVBAでやったことがなかったのですが、Seriesという型の変数で参照範囲を取得するようなことができるのですね!? なるほど、Splits関数を使ってのこういう操作は全く知りませんでした。

お礼日時:2011/08/14 18:02

 描きたいグラフは想像できるのですが、その後のデータ範囲が云々についての話がイマイチわかりません。

特に冗長云々以下の話はさっぱり意味が分かりません。

 データ範囲が可変するということは、サンプル数が決まっていないと言う意味ですよね?

 サンプル数がどれくらいかわかりませんが、散布図であれば空欄は無視されますから、40~50件程度の範囲でサンプル数が変わる可能性があるなら100件分の範囲を割り当ててしまうという手もあります。
 せっかくVBAを使うのですから、Endを使ってデータ入力範囲をマクロに探させたらいかがですか?
 複数のデータが同じセル範囲に混在しているのであれば、別のセル範囲にVBAでピックアップさせれば良いわけですし。

 ともかくあなたが何をしたいのか、どれくらいのスキルがあるのかが良くわからないので具体的にアドバイスできません。
 試しに自分でどういう処理をしたいのかVBAプログラムの文例でも掲示してくれれば、アドバイスもできると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

たしかに例コードを提示すべきでした。ただ、私自身がどういう方法でやろうか考えている状態だったのすが、少し不親切な質問でした(^_^;)

お礼日時:2011/08/14 17:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!