Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3206 / 13644 ツリー ←次へ | 前へ→

【63504】散布図グラフの点を数値によって色分けしたい Yu 09/11/13(金) 16:14 質問[未読]
【63506】Re:散布図グラフの点を数値によって色分け... Jaka 09/11/13(金) 17:16 発言[未読]
【63534】Re:散布図グラフの点を数値によって色分け... Yu 09/11/16(月) 10:29 お礼[未読]
【63507】Re:散布図グラフの点を数値によって色分け... kanabun 09/11/13(金) 21:53 発言[未読]
【63538】Re:散布図グラフの点を数値によって色分け... Yu 09/11/16(月) 14:53 発言[未読]
【63539】Re:散布図グラフの点を数値によって色分け... yoshi 09/11/16(月) 17:12 回答[未読]
【63547】Re:散布図グラフの点を数値によって色分け... Yu 09/11/17(火) 10:40 発言[未読]
【63552】Re:散布図グラフの点を数値によって色分け... yoshi 09/11/17(火) 13:25 回答[未読]
【63569】Re:散布図グラフの点を数値によって色分け... Yu 09/11/18(水) 14:05 お礼[未読]
【63559】Re:散布図グラフの点を数値によって色分け... n 09/11/17(火) 21:03 発言[未読]
【63570】Re:散布図グラフの点を数値によって色分け... Yu 09/11/18(水) 14:09 お礼[未読]
【63583】Re:散布図グラフの点を数値によって色分け... n 09/11/19(木) 0:57 発言[未読]

【63504】散布図グラフの点を数値によって色分けし...
質問  Yu  - 09/11/13(金) 16:14 -

引用なし
パスワード
   OS;WinXPpro,Excel2002
タイトルの通りなのですが、散布図のグラフがありまして
同じ行、別の列の数値(グラフには含まれない)によって
その要素の色を変えたいと思っています。
例)
 A B C・・・L
1 3 6   5
2 6 8   9
3 5 9   7
4 7 11   8  

散布図はA1:B4で作り、Lの数値によって
L=5→赤、L=6→緑・・・のように各点の色を変えたいのです。

作製したコードです。(例と数字は違います)

Sub test01()
Dim ritu As single
For i = 2 To 500 '最下行数
ActiveChart.SeriesCollection(1).Points(i).Select
With Selection
Worksheets("sheet1").Activate
ritu = Cells(i, "L").Value

Select Case ritu

Case Is >= 84
.MarkerBackgroundColorIndex = 3 '赤
.MarkerForegroundColorIndex = 2

Case Is >= 82
.MarkerBackgroundColorIndex = 7 'マゼンダ
.MarkerForegroundColorIndex = 2

Case Is >= 80
.MarkerBackgroundColorIndex = 6 '黄
.MarkerForegroundColorIndex = 2

Case Is >= 78
.MarkerBackgroundColorIndex = 4 '黄緑
.MarkerForegroundColorIndex = 2

Case Is >= 76
.MarkerBackgroundColorIndex = 8 'シアン
.MarkerForegroundColorIndex = 2

Case Is >= 74
.MarkerBackgroundColorIndex = 5 '青
.MarkerForegroundColorIndex = 2

End Select
End With

Next i
End Sub

・・・・・・・・・・・
セルの色分けで動くことを確認の上、手直しして
500点くらいあるグラフに適用したのですが
色分けが間違っている要素がいくつかあります。
例えば、L列;79.4なのに黄色に色分けされているとか。
(いくつかの点で確認して、大体は合っているのですが)

参照しているL列の数値は82.6、79.4のような小数点一桁の数値です。
間違っている点のみマクロを走らせても解決しません。

何かおかしなところがありましたら教えてください。
よろしくお願いします。

【63506】Re:散布図グラフの点を数値によって色分...
発言  Jaka  - 09/11/13(金) 17:16 -

引用なし
パスワード
   もうそろそろ帰る時間なので、感じたとこだけ。

>ActiveChart.SeriesCollection(1).Points(i).Select
 ↑
ここでせっかくグラフの何とかを選択しているのに。

>With Selection

別のシートを選択したら、無意味になるような。
 ↓
>Worksheets("sheet1").Activate
>ritu = Cells(i, "L").Value

直接、シート名セルを指定してやると良いかも。

ritu = Worksheets("sheet1").Cells(i, "L").Value

【63507】Re:散布図グラフの点を数値によって色分...
発言  kanabun  - 09/11/13(金) 21:53 -

引用なし
パスワード
   ▼Yu さん:

>タイトルの通りなのですが、散布図のグラフがありまして
>同じ行、別の列の数値(グラフには含まれない)によって
>その要素の色を変えたいと思っています。

つまりこういうことでしょうか?

Sub Try1()
  Dim Cht As Chart
  Dim Ser As Series
  Dim ss As String
  Dim rngY As Range
  Dim v, i As Long
  Dim co As Long
  Dim bo As Long
  Set Cht = ActiveSheet.ChartObjects(1).Chart
  Set Ser = Cht.SeriesCollection(1)
  ss = Ser.Formula         '系列の元データ範囲式より
  Set rngY = Excel.Range(Split(ss, ",")(2)) 'Y軸データ範囲を取得
  i = rngY.Column              'その行範囲の
  v = rngY.Offset(, 12 - i)         'L列の値を配列に入れる
  For i = 1 To UBound(v)
    Select Case v(i, 1)
     Case Is >= 84: co = 3: bo = 2
     Case Is >= 82: co = 7: bo = 2
     Case Is >= 80: co = 6: bo = 2
     Case Is >= 78: co = 4: bo = 2
     Case Is >= 76: co = 8: bo = 2
     Case Is >= 74: co = 5: bo = 2
     Case Else:   co = 2: bo = 2
    End Select
    With Ser.Points(i)
      .MarkerBackgroundColorIndex = co
      .MarkerForegroundColorIndex = bo
    End With
  Next
  
End Sub

【63534】Re:散布図グラフの点を数値によって色分...
お礼  Yu  - 09/11/16(月) 10:29 -

引用なし
パスワード
   Jakaさま
アドバイスありがとうございます。

>Worksheets("sheet1").Activate
>ritu = Cells(i, "L").Value
のかわりに

ritu = Worksheets("sheet1").Cells(i, "L").Value
にしましたが、結果は変わりませんでした。

kanabunさまのコードできちんと色分けできることを確認できました。
(まだ手直しが必要な部分はあるのですが)

今後ともよろしくお願いします。

【63538】Re:散布図グラフの点を数値によって色分...
発言  Yu  - 09/11/16(月) 14:53 -

引用なし
パスワード
   kanabunさま
アドバイスありがとうございます。
まさに、頂いたコードで正しく色分けができました!

重ねて、いくつかわからないことがあるのですが
ご教授いただけますでしょうか。

1.もともとのコードでは、何の値を参照して各データポイントの色を
 決めていたのでしょうか?
 (データがある行の範囲を指定して、その範囲のループを回し、
  データポイントと同じ行のL列の値を参照させたつもりだったのです。
  一応、10行ぐらいのデータではちゃんと動くことを確認しました)

2.>Set Cht = ActiveSheet.ChartObjects(1).Chart
 ここで指定しているChartObjects(1)は、インデックスNo1のグラフ
 という理解でよろしいでしょうか。
 頂いたコードでは、グラフがたくさんあるときに対応しづらいので
 Activechartのインデックスを得るということで

  Dim chtid As String '←追加
  Dim Cht As Chart
  Dim Ser As Series
  Dim ss As String
  Dim rngY As Range
  Dim v, i As Long
  Dim co As Long
  Dim bo As Long
  chtid = ActiveChart.Index
  Set Cht = ActiveSheet.ChartObjects("chtid").Chart '←変更
  
  としたのですが、「アプリケーション定義又はオブジェクト定義のエラー」
  となってしまいます・・
  複数のグラフがあるときに、指定する方法を教えていただけますでしょうか。

3.>  Set Cht = ActiveSheet.ChartObjects(1).Chart
 >  Set Ser = Cht.SeriesCollection(1)
 >  ss = Ser.Formula         '系列の元データ範囲式より
 >  Set rngY = Excel.Range(Split(ss, ",")(2)) 'Y軸データ範囲を取得
 >  i = rngY.Column              'その行範囲の
 ここまでは理解できたのですが
 
 >  v = rngY.Offset(, 12 - i)         'L列の値を配列に入れる
 vの定義を理解できていません。
 12 - iでL列を指定しているのは分かるのですが、上の式で
 セル(i, v)の値を指定している ということでいいのですか?

 上のことがわかっていないので、これ以降の
 For i = 1 To UBound(v)         
    Select Case v(i, 1) がぴんとこないのです。

お忙しいところ恐れ入りますが、よろしくお願いします。

【63539】Re:散布図グラフの点を数値によって色分...
回答  yoshi  - 09/11/16(月) 17:12 -

引用なし
パスワード
   kanabunさんではありませんが、つなぎで解説を!
>1.もともとのコードでは、何の値を参照して各データポイントの色を
> 決めていたのでしょうか?
お望み通りデータポイントと同じ行のL列の値を参照して決めています。

>2>  Set Cht = ActiveSheet.ChartObjects("chtid").Chart '←変更
chtidは文字型の変数でしょう。変数名を""で囲ってどうするつもりですか。
単に、
 Set Cht = ActiveChart
でいいのでは。

>3>  v = rngY.Offset(, 12 - i)         'L列の値を配列に入れる
> vの定義を理解できていません。
Variant型の変数vにL列の値を取得しています。
結果vは2次元の配列となる。

> 上のことがわかっていないので、これ以降の
> For i = 1 To UBound(v)         
>    Select Case v(i, 1) がぴんとこないのです。
UBoundがわからなければヘルプで調べましょう。
v(i, 1)はL列のi番目のデータです。

【63547】Re:散布図グラフの点を数値によって色分...
発言  Yu  - 09/11/17(火) 10:40 -

引用なし
パスワード
   yoshiさま
解説ありがとうございます。だいぶ理解できてきました。
Activeなグラフの指定もOKでした。

まだ分からないことが一つあります。
※この「もともとのコード」というのはスレッドの最初に書いた
 うまく色分けできなかったコードです。

>>1.もともとのコードでは、何の値を参照して各データポイントの色を
>> 決めていたのでしょうか?
>お望み通りデータポイントと同じ行のL列の値を参照して決めています。

であるとすれば、なぜうまく色分けできなかったのでしょうか???
教えていただいたコードで目的の作業は達成したのですが
最初のコードのどこが悪かったかを理解したいので
お時間あるときで結構ですから教えていただけるとありがたいです。

重ね重ねよろしくお願いします。

【63552】Re:散布図グラフの点を数値によって色分...
回答  yoshi  - 09/11/17(火) 13:25 -

引用なし
パスワード
   >まだ分からないことが一つあります。
>※この「もともとのコード」というのはスレッドの最初に書いた
> うまく色分けできなかったコードです。
kanabunさんが示されたSub Try1()のコードをさしてコメントしました。

> うまく色分けできなかったコードです
については、試したところ実行時エラーになりました。
ritu = Cells(i, "L").Value
の行で
実行時エラー '1004' :
'Cells' メソッドは失敗しました: '_Global' オブジェクト
です。
(グラフはsheet1の埋め込みグラフと想定しています)
エラーになるくらいだからうまく色分けできないのも当然かな...

>最初のコードのどこが悪かったかを理解したいので
>お時間あるときで結構ですから教えていただけるとありがたいです。
Jaka さんのスレにあるよう、まずは
Selectとか、SelectionとかActivateとかを使わないで
各オブジェクト(シート、グラフ)に対して操作するよう直されてはどうでしょう。

【63559】Re:散布図グラフの点を数値によって色分...
発言  n  - 09/11/17(火) 21:03 -

引用なし
パスワード
   『もともとのコード』がエラー無く動くとは思えないのですが、
仮にグラフシートのChartだったら、Loopの終わりで
Sheets("Graph1").Activate
などとやっていたら取り敢えずは動きますね。

うまくいかなかった可能性として、
>For i = 2 To 500
でL2からLoopしてます。という事は
>ActiveChart.SeriesCollection(1).Points(i).Select
この i は2から始まります。
それで良かったのかどうか確認してみてください。
要は、Pointsがズレてたんじゃないかという事なんですが。


後は余談ですが、
Chartがアクティブの時は
~~~~~~~~~~~~~~~~~
>ritu = Worksheets("sheet1").Cells(i, "L").Value
この書き方は型不一致のエラーになります。
ritu = Worksheets("sheet1").Cells(i, 12).Value
これなら通ります。
ちょっと気をつけておいたほうが良いかも。

【63569】Re:散布図グラフの点を数値によって色分...
お礼  Yu  - 09/11/18(水) 14:05 -

引用なし
パスワード
   yoshiさま

>Selectとか、SelectionとかActivateとかを使わないで
>各オブジェクト(シート、グラフ)に対して操作するよう直されてはどうでしょう。

わかりました。
もともとのコードがマクロの記述をつぎはぎしていじったものだったので
kanabunさんのコードを見て勉強します。
ありがとうございました。

【63570】Re:散布図グラフの点を数値によって色分...
お礼  Yu  - 09/11/18(水) 14:09 -

引用なし
パスワード
   nさま

>要は、Pointsがズレてたんじゃないかという事なんですが。

データは2行目から入っていたので大丈夫ではないかと思いますが・・・

>後は余談ですが、
>Chartがアクティブの時は
>~~~~~~~~~~~~~~~~~
>>ritu = Worksheets("sheet1").Cells(i, "L").Value
>この書き方は型不一致のエラーになります。
>ritu = Worksheets("sheet1").Cells(i, 12).Value

アドバイスありがとうございます。
もともとのコード自体がエラーなしには動かないシロモノのようですので
教えていただいたことをよく読んで勉強します。

ありがとうございました。

【63583】Re:散布図グラフの点を数値によって色分...
発言  n  - 09/11/19(木) 0:57 -

引用なし
パスワード
   >データは2行目から入っていたので大丈夫ではないかと思いますが・・・
だ か ら、.Points(1)はどうなっちゃうの?って事です。

Sub try()
  Dim i As Long

  With Sheets.Add
    .Range("A2:B3").Value = [{1,3;2,4}]
    With .ChartObjects.Add(200, 200, 200, 200).Chart
      .ChartType = xlXYScatter
      .SetSourceData Range("A2:B3"), xlColumns
      'あえてActivate
      .Parent.Activate
      With .SeriesCollection(1)
        For i = 2 To 3
          'あえてSelect
          .Points(i).Select
          Selection.ApplyDataLabels ShowCategoryName:=True, _
                       ShowValue:=True
          Stop
          '次の3はエラー
        Next
      End With
    End With
  End With
End Sub

3206 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free