Excel-VBAでグラフを一行下の範囲を参照して変更する方法

このQ&Aのポイント
  • Excel-VBAを使用して、コピーしたグラフについて、元データの範囲を一行下を参照するように変更したい場合、ループを使用して行の参照範囲を変更することができます。
  • 具体的には、ActiveChart.SeriesCollection(1).Formulaを使用して、元データの系列名とYの値の範囲を指定します。ループを使用して、行の参照範囲を一行ずつ増やしていきます。
  • 最初の参照範囲は19行、次は20行、そして最終的には59行を参照するように変更することができます。この方法を使用することで、手動で19を20に変更する必要がなくなります。
回答を見る
  • ベストアンサー

エクセルVBAでコピーしたグラフについて

別シートからグラフをコピーして新シートにはりつけました 元データの範囲を1行下を参照するようにマクロで作成したいのですが。。。 =SERIES(系列名,Xの値,Yの値,系列番号) の系列名とYの値を一行下の範囲を参照したいのです。 グラフから下のようにデーター範囲を取得し、一行下の行のデータ範囲に変えてグラフを変更したいです。  ActiveChart.SeriesCollection(1).Formula = _ "=SERIES(元データ!$B$19,元データ!$C$3:$DI$3,元データ!$C19:$DI19,1)"                     ↓ このようにしたいのですが1回ごとに19を20に打ち直さずにマクロ                       でしたいのです ActiveChart.SeriesCollection(1).Formula = _ "=SERIES(元データ!$B$20,元データ!$C$3:$DI$3,元データ!$C20:$DI20,1)" ループさせて 19を20につぎは20を21に・・・・・最終的には59を60行を参照するように 取得して変換していきたいのです 書き方が悪くて申し訳ありません。 どなたかわかるかた大至急教えてください。宜しくお願いいたします。

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

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

"=SERIES(元データ!$B$19,元データ!$C$3:$DI$3,元データ!$C19:$DI19,1)" この部分が文字列です。 文字列を変数に入れて変数指定にしたら良いだけです。 DataStr = "=SERIES(元データ!$B$19,元データ!$C$3:$DI$3,元データ!$C19:$DI19,1)" ActiveChart.SeriesCollection(1).Formula = DataStr その際に変化する部分を別変数で変化させます。 数値を文字列に置き換えるにはCstr関数を使います。 よって、次のようになります。 Count = 19 CountStr = Cstr(Count) DataStr = "=SERIES(元データ!$B$" & CountStr & ",元データ!$C$3:$DI$3,元データ!$C" & CountStr & ":$DI" & CountStr & ",1)" ActiveChart.SeriesCollection(1).Formula = DataStr あとはループ処理でCountをカウントアップさせてください。

ririco12
質問者

お礼

早々に回答ありがとうございます。 質問がわかりづらいなか、とってもわかりやすくご回答いただきたすかりました。 おかげでちゃんと動かすことができました。ありがとうございました。

関連するQ&A

  • VBAでグラフの範囲指定

    VBAでグラフ範囲指定について 先日質問させて頂いたのですが、行き詰ってしまったのでどうかご指南ください。 只今、sheet1データ一覧をダブルクリックした際にsheet2へ移り、表の詳細データが記入されるツールを作っています。 sheet2には表詳細データ以外にも、空白を挟んで他のデータが記入され、詳細データの散布図グラフが挿入されています。 sheet2に移り詳細データが表示されるようには出来ているのですが、表は12行に項目、13行からデータが始まるのは固定で、終わりの行はその都度変わるため、sheet1のダブルクリックした際のシート移動の処理の中に記述し、sheet2に記入された表データを参照して散布図のグラフを挿入したく思いました。 Dim ws2 As Worksheet Dim logGYO As Long Dim j As Long Dim x軸 As Variant Dim 系列1y軸 As Variant Dim 系列2y軸 As Variant Dim GYOMAX As Long Set ws2 = Worksheets("sheet2名前") ws2.ChartObjects("詳細グラフ").Activate ActiveChart.ChartArea.Select logGYO = 13 j = 13 Do Until ws2.Cells(j, 1).Value = "" j = j + 1 Loop GYOMAX = j - 1 With ws2 x軸 = .Range(.Cells(logGYO, 1), .Cells(GYOMAX, 1)) 系列1y軸 = .Range(.Cells(logGYO, 2), .Cells(GYOMAX, 2)) 系列2y軸 = .Range(.Cells(logGYO, 4), .Cells(GYOMAX, 4)) End With With ActiveChart.SeriesCollection(1) .XValues = x軸 .Values = 系列1y軸 .Name = "=""系列1名前""" End With With ActiveChart.SeriesCollection(2) .XValues = x軸 .Values = 系列2y軸 .Name = "=""系列2名前""" End With 実行したところ、「SeriesクラスのXValuesプロパティを設定できません」とエラーが出てしまいます。 SeriesCollection(1).Formula = "=SERIES(" & Range("B12")~ とFormulaと記述を変えて試してもみたのですが、「SeriesクラスのFormulaプロパティを設定できません」とエラーが出ます。 2週間程前までExcel自体を殆ど使ったことが無かった初心者のため、見当外れな質問をしていたら申し訳ありません。 どうか宜しくお願い致します

  • VBAにてExcelでグラフ元データの範囲を取得する関数は?

    VBAでExcelのグラフの「元のデータ」のデータ範囲の 値を取得する関数等がありましたら教えていただけな いでしょうか。 系列の名前や値はこんな形で取れるのですが。。 Set work = Tg_Sheet.ChartObjects(i) AreaStr = work.Chart.SeriesCollection.Item(1).Formula Set work = Nothing 以上よろしくお願いいたします。

  • Excelマクロでグラフ作成

    現在、Excelのマクロでグラフを作成しようとしていますが、データ範囲の指定で悩んでいます。 マクロはド素人で右も左もわからない状態から、なんとなく雰囲気だけわかってきたような感じです。 とあるHPをそのまま貼り付け用シートにコピペして、そこからデータ抽出用シートにデータを抽出して蓄積していく形にしています。 品名が複数あるので、オートフィルタを使用してソートするために始点をどう決めるのかがわからないのと、データがどんどん蓄積していくために終点もどう決めたらいいのかわかりません。 「データ抽出用シート」のデータ形式は、 18行目にA:品目 B:最低値 C:平均値 D:最高値 G:日付 19行以降にデータ という形になっています。 とりあえず、通常のマクロを記録する方法でマクロの骨組みだけ作ってから細部をいじろうとしております。 データの範囲を指定する部分だけコピペしますので、ここをどういじったらいいのかご教授願います。 とある品目を指定してオートフィルタをかけた後に、グラフ作成手順のマクロを記録したら、こんな感じになりました。 Charts.Add ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("データ抽出用シート").Range("L17") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=データ抽出用シート!R19C7:R366C7" ActiveChart.SeriesCollection(1).Values = "=データ抽出用シート!R19C2:R366C2" ActiveChart.SeriesCollection(1).Name = "=データ抽出用シート!R18C2" ActiveChart.SeriesCollection(2).XValues = "=データ抽出用シート!R19C7:R366C7" ActiveChart.SeriesCollection(2).Values = "=データ抽出用シート!R19C3:R366C3" ActiveChart.SeriesCollection(2).Name = "=データ抽出用シート!R18C3" ActiveChart.SeriesCollection(3).XValues = "=データ抽出用シート!R19C7:R366C7" ActiveChart.SeriesCollection(3).Values = "=データ抽出用シート!R19C4:R366C4" ActiveChart.SeriesCollection(3).Name = "=データ抽出用シート!R18C4" ActiveChart.Location Where:=xlLocationAsObject, Name:="データ抽出用シート" 宜しくお願いします。

  • 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つのグラフを混じってしまいます。これってどこがおかしいのでしょうか? どなたか助けて下さい。 お願いいたします。

  • エクセル2003(VBA)で散布図グラフの元データの範囲を可変にしたい

    エクセル2003の散布図グラフで複数の系列を表示しています。ところが データの量(行数)がすぐに変わりますので元データの範囲を可変したいのですが うまくいきません。 また、グラフ作成後、下記コードにてラベルの一括貼付けをしております。 下記に具体的なデータを記載しますので、どうかお知恵をお貸し下さい。 よろしくお願い致します。 ■現在 元データのプロパティ より Xの値:=Sheet1!$E$3:$E$324 Yの値:=Sheet1!$F$3:$F$324  ※本当はここで"Sheet1!$E$3:$E$65536"とSheet1!$F$3:$F$65536にすれば    データは取得できますが、下記マクロを実行すると当然オーバーフローします    要はここで存在するデータ範囲に都度変わっていくような事ができれば    それでも解決するかも? □使用しているマクロ Sub 全系列の一括ラベル表示() Dim Counter As Integer, ChartName As String, xVals As String Application.ScreenUpdating = False For i = 1 To ActiveChart.SeriesCollection.Count 'Store the formula for the first series in "xVals". xVals = ActiveChart.SeriesCollection(i).Formula '''''' 'ここでxvalsにデータ元が入ったままなのでそれを存在するデータ範囲に変わるようにしたいーーーー xVals = Mid(xVals, InStr(InStr(xVals, ","), xVals, Mid(Left(xVals, InStr(xVals, "!") - 1), 9))) xVals = Left(xVals, InStr(InStr(xVals, "!"), xVals, ",") - 1) Do While Left(xVals, 1) = "," xVals = Mid(xVals, 2) Loop For Counter = 1 To Range(xVals).Cells.Count If Range(xVals).Cells(Counter, 1).Offset(0, -1).Value = "" Then With ActiveChart.SeriesCollection(i).Points(Counter) .HasDataLabel = True .DataLabel.Text = "" End With Else With ActiveChart.SeriesCollection(i).Points(Counter) .HasDataLabel = True .DataLabel.Text = Range(xVals).Cells(Counter, 1).Offset(0, -1).Value End With End If Next Counter Next i End Sub

  • 散布図参照先設定時にエラーがでます(>_<)

    こんにちは 最近Excel2000でVBAを始めたばかりです。 複数の系列を持つ散布図で、それぞれの系列の 参照先を設定したいのですが、下記のコードで エラーがでてしまいます、 ActiveSheet.ChartObjects(1).Activate ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(2).XValues = "=データ1!R4C5:R51C5" ActiveChart.SeriesCollection(2).Values= "=データ1!R4C4:R51C4" ←この最後の行でエラー 同一の値をVBAではなく、Excelの 「元のデータ」の「系列」で設定すると、 問題なく設定ができます。 色々試した結果、下記の二つの条件を満たした時に エラーがでるような気がします。 条件1  1以外のデータ系列の設定をしようとしている時  SeriesCollection(1)では問題ありません 条件2  Xの値、Yの値のどちらかに数値ではなく  既にセルの参照先が設定されているデータ系列に  設定しようとしている時。 参照先が「={1}」や「={2}」などと数値のみが  入力されている場合は問題ありません どなたか教えてください。 よろしくお願いしますm(_ _)m

  • excelのマクロによるグラフの指定方法

    マクロがどのように記録されるかを見ながら、VBAのスクリプトの書き方を学んでいる初心者です。 Sub Macro1() ' ' Macro1 Macro , ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveWindow.ScrollColumn = 1 ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = "='平均化'!$B$1" ActiveChart.SeriesCollection(1).Values = "='平均化'!$B$4:$B$18" ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(2).Name = "='平均化'!$C$1" ActiveChart.SeriesCollection(2).Values = "='平均化'!$C$4:$C$18" ActiveChart.ChartType = xlLine ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = "='平均化'!$D$1" ActiveChart.SeriesCollection(1).Values = "='平均化'!$D$4:$D$18" ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(2).Name = "='平均化'!$E$1" ActiveChart.SeriesCollection(2).Values = "='平均化'!$E$4:$E$18" ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(3).Name = "='平均化'!$F$1" ActiveChart.SeriesCollection(3).Values = "='平均化'!$F$4:$F$18" End Sub 以上のマクロを作成し、実行したのですが、”指定した名前のアイテムが見つかりませんでした”と出て、上手く実行されませんでした。 操作対象のオブジェクトを行き来する方法を知りたいのですが、オブジェクトを作成するたびに ActiveSheet.ChartObjects("グラフ 1").Activate のダブルクオーテーション内に当たる値が自動的に割り振られるため、この部分でエラーになることは分かりました。 つまりこの値をこちらから指定出来れば、望んだ動作をさせられるのではと考えているのですが、 どなたかご教示お願いできませんでしょうか。

  • Excelでのグラフ系列に関するマクロ

    下記が上手く動作しないので、皆さまのお知恵を拝借したく思います。 概略を言いますと、散布グラフ選択時にmt02数の系列を増やすVBAです。増やした系列情報として基準系列データを与えており、その後置換処理をしています(基準系列=mt03、今は一時的に1系列目) Sub 系列情報の取得 Dim fn As String Dim mt02, mt03 As Integer Dim i, k As Integer Dim new_k As String fn = ActiveChart.SeriesCollection(mt03).Formula k = 1 Do Until k > mt02 new_k = 系列追加と参照先設定((i), (k), (fn)) k = k + 1 Loop ' グラフが選択されていない状態になるとココへ Chart_Error: msg = MsgBox("NG", vbCritical, "error") End Sub Function 系列追加と参照先設定(i2 As Integer, k2 As Integer, fn2 As String) Dim fn_new As String ActiveChart.SeriesCollection.NewSeries ' 系列情報を置換、一時的に1系列目を基準データとしている i2 = i2 + k2 fn_new = Replace(fn2, "1)", i2 & ")") ActiveChart.SeriesCollection(i2).Formula = fn_new End Function 不具合箇所としては、Sub内でDo文が条件外となるとグラフが選択されていないと認識されてNG処理へ移行する点です。For文にしても不可、グラフを再選択させてもその瞬間にNGとなります。

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

    エクセルのグラフの操作 初歩的でスミマセンが、よろしくお願いします。 エクセルのグラフのデータの内容を1セルずつ下に下げて、それを400回繰り返したいんです。 'wave-h'!R402C3と'wave-h'!R402C4を 'wave-h'!R403C3と'wave-h'!R403C4にして 'wave-h'!R867C3と'wave-h'!R867C4にまでしたいのですが。 do loopを考えてるんですが、引数?が上手くいかなくて・・・。 ついでにその後グラフをコピーしてペイントに貼り付けてJPGで保存する予定です。 これを400回以上繰り返すんですが、ペイントのコピーのところまではエクセルのVBAで可能でしょうか。よろしくお願いします。 ActiveSheet.ChartObjects("グラフ 4").Activate ActiveChart.SeriesCollection(2).Select ActiveChart.SeriesCollection(2).XValues = "='wave-h'!R402C3" ActiveChart.SeriesCollection(2).Values = "='wave-h'!R402C4" ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(2).Select ActiveChart.ChartArea.Select ActiveChart.ChartArea.Copy

  • Excel VBAの散布図について

    Excel VBAで散布図を作ろうと考えています。 元のデータは添付した画像のものです。 左端にXの値があって、それ以降7列ごとに8枚の散布図を作成しようと考えております。 そこで、kを1~8まで動かし8種類の散布図を作成しようと考えているのですが、このマクロではk=1だけプログラムを回しただけで、一枚のグラフにすべての系列が載ってしまいます。 kを動かさずに、Cellの位置を指定して回した際にはうまくいったのですが、kを動かすようにしたところうまくいきません。 散布図を作る際に系列の数(私の場合7種類)を指定するにはどうしたらよいでしょうか。 どなたかご教授ください。 For k = 1 To 8 ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatter ActiveChart.SeriesCollection(1).Name = Sheets("Voltammogram").Cells(10, -5 + 7 * k) ActiveChart.SeriesCollection(1).XValues = "=Voltammogram!$A$12:$A$250" ActiveChart.SeriesCollection(1).Values = Sheets("Voltammogram").Range(Cells(12, -5 + 7 * k), Cells(250, -5 + 7 * k)) ActiveChart.SeriesCollection(2).Name = Sheets("Voltammogram").Cells(10, -4 + 7 * k) ActiveChart.SeriesCollection(2).XValues = "=Voltammogram!$A$12:$A$250" ActiveChart.SeriesCollection(2).Values = Sheets("Voltammogram").Range(Cells(12, -4 + 7 * k), Cells(250, -4 + 7 * k)) 以降7列まで続きます。

専門家に質問してみよう