Excel VBA質問箱 IV

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

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


2180 / 13645 ツリー ←次へ | 前へ→

【69481】複数の散布図を一度に作る方法について mayu 11/7/20(水) 21:35 質問[未読]
【69510】Re:複数の散布図を一度に作る方法について kanabun 11/7/26(火) 9:41 発言[未読]
【69512】Re:複数の散布図を一度に作る方法について kanabun 11/7/26(火) 10:17 発言[未読]

【69481】複数の散布図を一度に作る方法について
質問  mayu  - 11/7/20(水) 21:35 -

引用なし
パスワード
   VBA初心者です。
1系列ずつの複数(この場合7つ)の散布図を作成したいと思っています。
B1からF1にX値があり、A2からA8に系列名があります。
以下のような式を作成したのですが、このままでは7系列ある1つの図になってしまいます。
初歩的な誤りがあるのだと思いますが、どなたかご教授していただけないでしょうか?
よろしくお願いいたします。

Sub Graph()

ActiveSheet.Shapes.AddChart.Select
With ActiveChart
.ChartType = xlXYScatter

For i = 1 To 7
With .SeriesCollection.NewSeries
.Name = Sheets("data").Cells(1 + i, 1)
.XValues = Sheets("data").Range(Cells(1, 2), Cells(1, 6))
.Values = Sheets("data").Range(Cells(1 + i, 2), Cells(1 + i, 5))

End With
Next i

End With

End Sub

【69510】Re:複数の散布図を一度に作る方法について
発言  kanabun  - 11/7/26(火) 9:41 -

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

こんにちは〜

>このままでは7系列ある1つの図になってしまいます。

現状では、1つのグラフのなかに7つの系列をプロットするようなコード
になっています。

'ActiveSheetに 埋め込みグラフを1つ作成
>ActiveSheet.Shapes.AddChart.Select

'7回くりかえす
>For i = 1 To 7
  '系列を追加して
>  With .SeriesCollection.NewSeries
     'データをセットする
>    .Name = Sheets("data").Cells(1 + i, 1)
>    .XValues = Sheets("data").Range(Cells(1, 2), Cells(1, 6))
>    .Values = Sheets("data").Range(Cells(1 + i, 2), Cells(1 + i, 5))
>  End With
>Next i

そうではなく、

Dim ws As Worksheet
Dim myLocation As Range
Dim ChtObj As ChartObject

'7回 くりかえす
>For i = 1 To 7
  'グラフを置く場所と大きさをセル範囲で指定
  Set myLocation = 指定のワークシート(ws)の指定のセル範囲

  'その位置に埋め込みグラフ(ChartObject)を追加する
  Set ChtObj = ws.ChartObjects.Add(myLocation.Left, _
                myLocation.Top, _
                myLocation.Width, _
                myLocation.Height)
  With ChtObj.Chart 'ChartObjectのなかにできたChartに対して描画処理
    with .seriescollection.Add
     .Name =
     .XValues =
     .Values =
    end with
  End With

>Next i

のような感じで。

なお、
>  .Values = Sheets("data").Range(Cells(1 + i, 2), Cells(1 + i, 5))
のような範囲の指定の仕方は危険です。
これだと、Cellsのまえのシートが明示されてませんので、このコードを
標準モジュールに書いているときはActiveSheetが省略されていると解釈さ
れて実行されます。
  "data" という名のワークシートがアクティブでないとき、このコードは
  失敗します。 
さらに、注意しなくてはいけないのは、
> ActiveChart
で今作成したグラフを選択してしまっていると、その時点でアクティブなシート
は、グラフ(ActiveChart) になります。Chart にはCellsプロパティは当然ないので、
> Sheets("data").Range(Cells(1 + i, 2),
は、
 Sheets("data").Range(ActiveChart.Cells(1 + i, 2),
の意味になり、失敗します。
系列に範囲をセットするときは、やはり変数を用意して、
事前に系列の元データ範囲をその変数にセットしておくほうが
ベターです。




【69512】Re:複数の散布図を一度に作る方法について
発言  kanabun  - 11/7/26(火) 10:17 -

引用なし
パスワード
   参考までに
下のコードは「data」シートの範囲を元データとして、
「Sheet2」ワークシートのB列に 上から順に 一系列だけの
埋め込みグラフ(chartobject) を描画する例です。

Sub Try1()
 Dim ws1 As Worksheet
 Dim ws2 As Worksheet
 Dim rngX As Range
 Dim rngY As Range
 Dim rngN As Range
 Dim myLocation As Range
 Dim chtObj As ChartObject
 
 Set ws1 = Worksheets("data")
 Set ws2 = Worksheets("Sheet2")
 With ws1
  Set rngX = .Range("B1").Resize(, 5)
  Set rngY = rngX.Offset(1)   '最初のグラフのY軸データ範囲
  Set rngN = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
 End With
 Set myLocation = ws2.Range("B2").Resize(15, 6) '最初にグラフをおく場所
 
 Dim i As Long
 For i = 1 To rngN.Count  '系列の数だけ繰り返し
   With myLocation
     Set chtObj = .Worksheet.ChartObjects.Add( _
           .Left, .Top, .Width, .Height)
   End With
   With chtObj.Chart
     .ChartType = xlXYScatter
     .SetSourceData Union(rngX, rngY)
     .SeriesCollection(1).Name = rngN
     .HasLegend = False
     .HasTitle = False
   End With
   
   Set myLocation = myLocation.Offset(16) '次のグラフの場所
   Set rngY = rngY.Offset(1)        '次のY元データ範囲
   Set rngN = rngN.Offset(1)        '次の系列名範囲
 Next
 
End Sub

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