質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

7715閲覧

VBA エクセルマクロ グラフを重ねたいがうまくいきません。

macro-beginner

総合スコア25

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/03/28 07:54

編集2017/04/03 05:01

グラフをそれぞれのシートから数値をひっぱってきて重ねたいのですが、
上手くいきません。

下記のコードだとシート1の指定した系列をXとして使い、Yをシート毎ひっぱるのでグラフがおかしくなってしまいます。

XもYもシート毎にひっぱてきたいのですがどうすればよいのでしょうか?

データ範囲の取得 If i = 1 Then '初回は見出し列も取得 cht.Chart.SetSourceData Source:=.Range("T1014:T3014, N1014:N3014") cht.Chart.SeriesCollection(1).XValues = .Range("T1014:T3014") cht.Chart.SeriesCollection(1).Values = .Range("N1014:N3014") Else '2回目以降はデータ系列を追加 Set rng = .Range("N1014:N3014") cht.Chart.SeriesCollection.Add rng End If

全体のコード

Sub GrapfGS() Dim op As Worksheet, sn As Worksheet, i As Integer, names As String, xname As String Dim cht As ChartObject Dim rng As Range Dim chart1 As Chart Set op = Workbooks("CAB-Grapf.xls").ActiveSheet Application.ScreenUpdating = False 'グラフ作成 Set cht = ActiveSheet.ChartObjects.Add(100, 100, 350, 260) cht.Chart.ChartType = xlXYScatterSmoothNoMarkers cht.Name = "G-S" cht.Top = Range("H4").Top cht.Left = Range("H4").Left cht.Chart.Axes(xlValue).MinimumScaleIsAuto = True cht.Chart.Axes(xlValue).MaximumScaleIsAuto = True cht.Chart.Axes(xlCategory).MaximumScale = 300 cht.Chart.Axes(xlCategory).MinimumScale = 0 cht.Chart.Legend.IncludeInLayout = False cht.Chart.Legend.Position = xlLegendPositionCorner cht.Chart.Legend.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1 cht.Chart.Axes(xlValue).TickLabels.NumberFormatLocal = General cht.Chart.Axes(xlCategory).TickLabels.NumberFormatLocal = General cht.Chart.HasTitle = True cht.Chart.ChartTitle.Text = "G-S" 'データ取得ループ For i = 1 To Worksheets(1).Range("H1").Value If i > 10 Then MsgBox "データーがそんなにないよ(V)o¥o(V)" Exit For End If With Worksheets(2 + i) 'データ範囲の取得 If i = 1 Then '初回は見出し列も取得 cht.Chart.SetSourceData Source:=.Range("T1014:T3014, N1014:N3014") cht.Chart.SeriesCollection(1).XValues = .Range("T1014:T3014") cht.Chart.SeriesCollection(1).Values = .Range("N1014:N3014") Else '2回目以降はデータ系列を追加 Set rng = .Range("N1014:N3014") cht.Chart.SeriesCollection.Add rng End If End With 'グラフの名前をDATAシートから取得>Grapfシートを選択して貼り付け。 names = Worksheets(2 + i).Range("B" & 9).Value Worksheets(2).Select cht.Chart.SeriesCollection(i).Name = names

イメージ説明
X軸だけ参照シートが同じになってしまいます。
これをシート毎から参照したいです。
上記の画像でいいますとX軸はCIMO01425からでしがとってませんが
これをCIMP01425はCIMP01425で、CIMP01426はCIMP01426から参照したいです。


以前のグラフはX軸がシート毎、不変の数値だったので例えばシート1のA列の数値をX軸に指定して
Y軸はシート1のC列、シート2のC列とすればグラフが重なってできたのですが、
今回はX軸もY軸もそれぞれシート毎、数値が違います。

なのでX軸をシート1のC列、Y軸をシート1のB列で一つ、その上にX軸をシート2のC列、Y軸をシート2のB列で形成し重ねたいのです。

まとめますと、各シート毎の列から数値を拾ってグラフを作成し重ねたいという事になります。

【やりたいイメージ】
イメージ説明

【完成イメージ】
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問のタイトルは「グラフを重ねたい」(⇒つまり系列を追加したい)となっていますが、質問本文からは「X軸・Y軸ともに別の値をとりたい(⇒つまり別のグラフを作成したい)」という風に読み取れます。

ちなみに提示いただいたソースコードは以前の質問の際にアドバイスさせていただいた「1つのグラフに系列を追加していくロジック」だと思います。

今回実現したいのはどちらでしょうか?
※系列の追加はできているので後者(別データで別グラフを作成したい)かな?と思っています。

今回の完成形がイメージできれば回答しやすくなります。

回答を受けて追記

普通の折れ線グラフのようなもので考えていましたが、散布図などの系列X/Yなどを持つグラフですね。失礼しました。

以下のように、追加した系列に系列Yデータ(.Values)も設定してあげればできそうです。

Sub GrapfGS() Dim op As Worksheet, sn As Worksheet, i As Integer, names As String, xname As String Dim cht As ChartObject Dim rng As Range Dim chart1 As Chart Dim shtDat As WorkSheet '★追加 Set op = Workbooks("CAB-Grapf.xls").ActiveSheet Application.ScreenUpdating = False 'グラフ作成 Set cht = ActiveSheet.ChartObjects.Add(100, 100, 350, 260) cht.Chart.ChartType = xlXYScatterSmoothNoMarkers cht.Name = "G-S" cht.Top = Range("H4").Top cht.Left = Range("H4").Left cht.Chart.Axes(xlValue).MinimumScaleIsAuto = True cht.Chart.Axes(xlValue).MaximumScaleIsAuto = True cht.Chart.Axes(xlCategory).MaximumScale = 300 cht.Chart.Axes(xlCategory).MinimumScale = 0 cht.Chart.Legend.IncludeInLayout = False cht.Chart.Legend.Position = xlLegendPositionCorner cht.Chart.Legend.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground1 cht.Chart.Axes(xlValue).TickLabels.NumberFormatLocal = General cht.Chart.Axes(xlCategory).TickLabels.NumberFormatLocal = General cht.Chart.HasTitle = True cht.Chart.ChartTitle.Text = "G-S" 'データ取得ループ For i = 1 To Worksheets(1).Range("H1").Value If i > 10 Then MsgBox "データーがそんなにないよ(V)o¥o(V)" Exit For End If Set shtDat = Worksheets(2 + i) 'データ範囲の取得 If i = 1 Then '初回は見出し列も取得 cht.Chart.SetSourceData Source:=shtDat.Range("T1014:T3014, N1014:N3014") With cht.Chart.SeriesCollection(1) .name = "系列" & i .XValues = shtDat.Range("T1014:T3014") .Values = shtDat.Range("N1014:N3014") End With Else '2回目以降はデータ系列を追加 With cht.Chart.SeriesCollection.NewSeries .name = "系列" & i .XValues = shtDat.Range("T1014:T3014") .Values = shtDat.Range("N1014:N3014") End With End If 'グラフの名前をDATAシートから取得>Grapfシートを選択して貼り付け。 names = shtDat.Range("B" & 9).Value Worksheets(2).Select cht.Chart.SeriesCollection(i).Name = names

改修箇所は、shtDat変数を追加し、データ取得ループ内の処理を変更しました。

いま手元に動作確認できる環境がないので机上ロジックで申し訳ないですが、お試しください。

投稿2017/04/03 04:24

編集2017/04/03 06:16
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macro-beginner

2017/04/03 05:07

毎度ご回答ありがとうございます。 >>「X軸・Y軸ともに別の値をとりたい(⇒つまり別のグラフを作成したい)」という風に読み取れます。 違うグラフといいますか、以前質問した際に回答してくださったマクロはX軸がシート1のA列を基軸にそれぞれのシートのB列をひっぱてきてグラフを重ねるという物だったのですが、 今回はシート毎数値が違うのでX軸もY軸もシート毎にひっぱてきて重ねたいのです。 わかりにくくてすみませんが、質問欄を編集して追記致しました。 よろしくお願い致します。
macro-beginner

2017/04/03 07:01

ありがとうございます! できました!本当に毎回ありがとうございました!
guest

0

Excel

1Set rng = .Range("N1014:N3014")

のRangeオブジェクトに最初のシートのRangeオブジェクトが
入ったままになっているのが原因ですね。

Excel

1'2回目以降はデータ系列を追加 2Set rng = .Range("N1014:N3014") 3cht.Chart.SeriesCollection.Add rng 4Set rng = Nothing 'オブジェクト変数「rng」を空にする。

とする事を含め、使用している全てのオブジェクト変数をマクロ終了時に
明示的に空にする(Set オブジェクト変数=Nothing)事を行なう必要があります。
オブジェクト変数は必ず明示的に空にしないと、データがメモリ上に残って
不具合を発生する原因になりますので…。

また、上記全体コードでは、For~に対応するNext iが無いのも見受けられます。
これも、不具合起因と考えられますが、いかがでしょうか?
一応ご確認願います。

投稿2017/04/02 04:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macro-beginner

2017/04/02 23:50

ご回答ありがとうございます! グラフ自体は作成できるようになったのですが、X列だけが同じシートから参照されているのでこれをシート毎参照するにはどうすればよいのでしょうか? 詳細を上記に載せますのでお時間がありましたらよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/04/03 02:32

すみませんが、修正したコードも掲載していただけないでしょうか? 今の時点では、条件分岐のElseの時点でXValuesにはWorkSheets(3)の 値しかセットされていない様にしか見られないのですが…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問