• ベストアンサー

Excelの範囲可変グラフ

必要に迫られ、数日前から関数やマクロなるモノを勉強しながら奮闘中です。 範囲可変のグラフを作りたく、以下のサイトを参考にしながら試行錯誤してるのですが、応用が効きません。。 http://www2.odn.ne.jp/excel/waza/graph.html#SEC13 http://okwave.jp/qa2138388.html どれも、ある固定位置を起点として、増えた範囲までの全てのエリアをグラフ化してるようなのですが、 やりたいのは、任意のデータ範囲を自由に(Windowをスライドするように)グラフ化したいのです。 データの量が大量で全部表示すると見えなくなるため、 指定したい範囲をパラメータとして与えることで、その範囲だけを切り出したようなグラフにしたい。です。 例えば、 A5:B100 に以下データが入ってたとして、 (A列は上から連番でダブリなし。実際には時間=tになる) A,B ----- 1,a ←(A5,B5) 2,b 3,c ←ここから 4,d 5,e 6,f 7,g 8,h ←ここまでをグラフ化 9,i : ここで、あるパラメータ用のセルに、 開始位置=3、終了位置=8という値を指定すると、 A列から3と8を見つけ出し、その範囲のグラフを作る。 3と8なので、グラフの範囲としては、A7:B12。 (実際には、列はもっと多いですが) できれば"エクセル技道場"のような範囲指定関数+グラフ設定のほうが良いです。 (今回マクロも少しかじったのでマクロでも何とかなるカモ・・(^^;) すみませんが、よろしくお願い致します。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.7

#6補足に対するレスです。 『Excel で名前付け範囲を使用して動的なグラフを作成する』 http://office.microsoft.com/ja-jp/excel/HA011098011041.aspx ▲こちらを参照されると良いです。 『グラフの系列を選択し、Excel の数式バーを確認すると、 その系列が SERIES 関数を使用した数式によって生成されていることがわかります。 SERIES は、このような場合にのみ使用される特殊な関数で、グラフの系列を定義します。』 とあります。 Sub test3()   Dim s As String      With Sheets.Add     s = .Name & "!"     .Range("A1:B4").Value = [{"","name";"a",1;"b",2;"c",3}]     With .ChartObjects.Add(.Range("F1").Left, 0, 500, 300)       .Activate       With .Chart         .HasLegend = True         .ChartType = xlColumnClustered         With .SeriesCollection.NewSeries           .Formula = "=SERIES(" & s & "B1," & s & "A2:A4," & s & "B2:B4,1)"           .Select         End With       End With     End With   End With End Sub これで系列選択状態になりますから、数式バーを見てください。 =SERIES(SheetX!$B$1,SheetX!$A$2:$A$4,SheetX!$B$2:$B$4,1) と表示されているはずです。 手作業で適当なグラフを作成し、系列を選択した場合も同じように表示されます。 つまりグラフの系列の参照元を表しています。 前述ページに SERIES 関数の引数についても説明がありますので確認しておいてください。 =SERIES(凡例の名前,項目軸ラベル,プロット値,プロット順) ...となります。

campus
質問者

お礼

ありがとうございます。 やっとスッキリしました。 SERIESがなにやらグラフ作成に重要な呪文なんだろうとは思ってましたが、 こういう構成だったんですね。。 あと、項目軸ラベルの設定もどうやってやるのか悩んでたことろだったので、 非常に助かりました。 (どこかのサイトで書かれてた構文を作り変えて無理やり突っ込んでましたが..) ちなみに、「#3補足に対するレス」で書かれてた .Formula = "=SERIES(,," & ws.Name & "!data" & i & ",)"  は、 .HasLegend = False だったので、凡例の名前,項目軸ラベルのところが、,, だったんですね。。

その他の回答 (6)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

#3補足に対するレスですが。 提示したコードは、あくまでサンプルグラフを作成するだけのもので、 基本的には、OFFSET関数を利用した名前の定義を使えば可変範囲のグラフが作成できるという例です。 >任意のデータ範囲を自由に(Windowをスライドするように)グラフ化したい という事だったので、スクロールバーを使った例を示しました。 >開始位置に4、終了位置に10と指定すると、 という事であれば、MATCH関数を使って範囲を指定できるようにすると良いでしょう。 >複数ある系列を縦に累計する棒グラフにするには、 の箇所がちょっとひっかかります。 累計グラフにするには、累計データが必要です。 その辺りを加味したサンプルグラフを以下のコードで作ってみました。 コードを理解するのではなく、できあがったグラフの[元データ]などの設定を見て理解してください。 Sub test2()   Const x As Long = 100  'サンプルデータ行数   Dim ws As Worksheet   Dim i  As Long   '■シートを追加、サンプルデータ作成   Set ws = Sheets.Add   With ws     'セルB1に開始値、B2に終了値     .Range("A1:B2").Formula = [{"開始", 4;"終了",10}]     .Range("C1").Formula = "=MATCH(B1,A:A,0)-5"     .Range("C2").Formula = "=MATCH(B2,A:A,0)-4-C1"     .Range("A4:E4").Value = [{"time","日計1","累計1","日計2","累計2"}]     With .Range("A5:E5").Resize(x)       .Columns(1).Formula = "=ROW()-4"       'C列、E列は累計値       .Offset(, 1).Resize(, 4).Formula _          = Array("=RAND()*" & x, "= Sum(B5,C4)", "=RAND()*" & x, "= Sum(D5,E4)")       .Value = .Value     End With     '■グラフ作成、名前定義し系列にセット。累計値は第2軸の線グラフ     With .ChartObjects.Add(.Range("F1").Left, 0, 500, 300).Chart       .HasLegend = False       .ChartType = xlColumnClustered       For i = 1 To 4         ws.Names.Add "data" & i, "=OFFSET($A$5,$C$1," & i & ",$C$2,)"         With .SeriesCollection.NewSeries           .Formula = "=SERIES(,," & ws.Name & "!data" & i & ",)"           If i Mod 2 = 0 Then             .ChartType = xlLine             .AxisGroup = 2           End If         End With       Next     End With   End With      Set ws = Nothing End Sub

campus
質問者

補足

ネットで色々調べ、ようやく内容が理解できました。。 ただ、以下の2行だけがどうしても分からないので、 内容を解説して頂けると嬉しいのですが・・ (検索しても、SeriesやSERIESがなかなか見つからなくて) With .SeriesCollection.NewSeries .Formula = "=SERIES(,," & ws.Name & "!data" & i & ",)" 誠に申し訳ございませんが、よろしくお願い致します。

回答No.5
campus
質問者

お礼

情報ありがとうございます。 せっかく情報頂きましたが、マクロの中身以前に、質問/回答の内容が良く理解できませんでした。。 すみません。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.4

過去ログですが参考になるかも知れません。 指定した期間の数値をグラフにしたいのですが http://oshiete1.goo.ne.jp/qa4323804.html

campus
質問者

お礼

情報ありがとうございます。 せっかく情報頂きましたが、マクロの中身以前に、質問/回答の内容が良く理解できませんでした。。 すみません。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

>範囲指定関数+グラフ設定 の例として、サンプルグラフを作るマクロです。 手作業で可能なので、できたグラフを参考に、応用してみてください。 Sub test()   Const x As Long = 100 'サンプルデータ行数   Const n As Long = 20 'グラフに表示するデータ数の初期値   Dim r  As Range   Dim s  As String   '【1】シートを追加し、サンプルデータを作成   With Sheets.Add     .Range("A1:D1").Value = Array("回", "数", "開始位置", "表示データ数")     With .Range("A2:B2").Resize(x)       .Formula = Array("=ROW()-1", "=RAND()*" & x)       .Value = .Value     End With          '【2】[フォーム]ScrollBarをシート上に置いて[コントロールの書式設定]     For Each r In .Range("C3:D3")       With .ScrollBars.Add(r.Left, r.Top, r.Width, r.Height)         .Value = 1             '現在値         .Min = 1              '最小値         .Max = x              '最大値         .SmallChange = 1          '変化の増分         .LargeChange = 10         'スクロールバーシャフトの増分         .LinkedCell = r.Offset(-1).Address 'リンクするセル       End With     Next     'グラフ表示データ数の初期値をセット     .Range("D2").Value = n          '【3】シートレベルの[名前定義]で可変範囲を設定     'C2にA1からの移動数(グラフ開始位置) D2にグラフ表示データ数     .Names.Add "回", "=OFFSET($A$1,$C$2,0,$D$2,)"     .Names.Add "数", "=OFFSET($B$1,$C$2,0,$D$2,)"     s = .Name          '【4】グラフ作成し、系列追加し定義した名前をセット     With .ChartObjects.Add(.Range("E1").Left, 0, 500, 300).Chart       .HasLegend = False       .ChartType = xlLine       .SeriesCollection.NewSeries.Formula = "=SERIES(," & s & "!回," & s & "!数,1)"       .Axes(xlValue).MaximumScale = x     End With   End With End Sub

campus
質問者

補足

すごいっす。。 現時点、マクロの内容は全然理解できませんが、 期待以上の結果に感動しました。 ただ、なにぶんマクロ初心者なため、今回作りたいグラフに応用させるのに間に合うか・・ 他にも色々応用できそうなので、なんとか解読してモノにしたいと思います。 ちなみに、折れ線グラフでなく、複数ある系列を縦に累計する棒グラフにするには、 どこの記述を変更すれば良いでしょうか? B列の"数"が、更にC列、D列・・と並んでる場合に。

回答No.2

コメントアウト文が汚かったので際回答させていただきます。 すでにグラフが存在しており、グラフに出力する範囲のみを変更する 場合について説明します。 例として、セルA1に開始位置、セルA2に終了位置を入力するとします。 (開始位置に4、終了位置に10を入力するとします。) 以下にマクロを示します。 あとはこのマクロを起動するボタンなどを御自分で設定すれば使用しやすくなります。 -------------以下マクロ------------------- Sub Macro1() 開始位置 = Range("A1") 'A1に入力されている値を取得 終了位置 = Range("A2") 'A2に入力されている値を取得 '範囲の設定 '「A4:A10」の形に変換。trim(Str())はStr()で数字を文字列に変換し、trim()で空白部分を削除しています 範囲 = "A" + Trim(Str(開始位置)) + ":" + "A" + Trim(Str(終了位置)) 'グラフ 1というグラフの範囲を変更するとします。 'グラフの名前がわからない場合は、グラフを選択して、右クリック、グラフウインドウをクリックすればグラフ名が表示されます。 '例Sheet1 グラフ 1  ←この「グラフ 1」がグラフ名 ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select '現在作業中のシート名と範囲を指定 'シート名Sheet1の場合 ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range(範囲), PlotBy _ :=xlColumns End Sub

campus
質問者

お礼

MATCH関数をマクロの中に入れるやりかたが分からなかったので、 一端、他のセルに普通のMATCH関数で該当する行番号を表示させ、 そのセルをマクロで読み込んで、範囲指定するよう書き換えることで、 期待通りのグラフを作ることが出来ました。 どうもありがとうございました。感謝です。

campus
質問者

補足

早速の回答ありがとうございます。 初心者にも分かり易い細かい説明、非常に助かります。 難しい構文だけが羅列された回答が来たらどうしようと思ってました。 一応、思った感じで動作しました。 が・・ 説明不足だったせいか、意図した内容とちょっと違います。。 頂いた内容を元に補足させて頂きます。 >「A4:A10」の形に変換 開始位置、終了位置で指定するパラメータ(4や10)は、 A列に入ってる時間情報(文字列 1,2,3,..)のことで、 その情報から、Excelのセル座標(行座標)を求めグラフ化したかったです。 なので、 開始位置に4、終了位置に10と指定すると、 範囲として指定したいのは、A4,A10ではなく、 4という文字列(時間値)の入ってる行座標と、 10という文字列(時間値)の入ってる行座標で構成されるグラフです。 A列の時間情報(1,2,3,4,..)がA5セルから始まってるとすると、 1=A5、2=A6、3=A7、4=A8なので、 開始位置パラメータ=4から求められるのは、A8を期待します。 同様に、終了位置パラメータ=10から求められるのは、A14を期待します。 また、グラフ化したいのは、その求めたA8とA14の間で構成されるグラフなので、 グラフの範囲は、A8:A14ではなく、例えば列がCまであった場合は、 グラフの範囲は、A8:C14を期待しています。 >3と8なので、グラフの範囲としては、A7:B12。 >(実際には、列はもっと多いですが) すみません、よろしくお願い致します。 具体的には、 横軸に時間軸、縦軸に複数の系列の累計の棒グラフとした場合、 ある時刻の間だけを抜き出して表示したい。というモノです。

回答No.1

すでにグラフが存在しており、グラフに出力する範囲のみを変更する 場合について説明します。 例として、セルA1に開始位置、セルA2に終了位置を入力するとします。 (開始位置に4、終了位置に10を入力するとします。) 以下にマクロを示します。 あとはこのマクロを起動するボタンなどを御自分で設定すれば使用しやすくなります。 ---------------------------------------------------------- Sub Macro1() 開始位置 = Range("A1")'A1に入力されている値を取得 終了位置 = Range("A2")'A2に入力されている値を取得 '範囲の設定 '「A4:A10」の形に変換。trim(Str())はStr()で数字を文字列に変  '換し、trim()で空白部分を削除しています 範囲 = "A" + Trim(Str(開始位置)) + ":" + "A" + Trim(Str(終了位置)) 'グラフ 1というグラフの範囲を変更するとします。 'グラフの名前がわからない場合は、グラフを選択して、右クリッ  'ク、グラフウインドウをクリックすればグラフ名が表示されま   'す。例Sheet1 グラフ 1  ←この「グラフ 1」がグラフ名 ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select   '現在作業中のシート名と範囲を指定   'シート名Sheet1の場合 ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range(範囲), PlotBy _ :=xlColumns End Sub

関連するQ&A

  • グラフの範囲指定をVBAで可変にしたい

    1シートに複数のグラフがあり、値を入れて完成させているファイルがあります。 データ範囲が毎回違うため、いちいちグラフを選択し、範囲を変更しています。 系列:行 データ範囲:A列から~H列までだったり、A列からJ列までだったりします データがH列までの場合はI列は値が入っていませんが、L列からまた他のグラフのデータ範囲になっているという形です。 データが始まる位置はすべて固定です。 シートにある複数のグラフを一度に変更したいのですが、どのようにしたら良いのでしょうか? (選択しているグラフのグラフ変更ではなく、選択していないものも変更したい) 以下のようなマクロを仮で組んでみたのですが、うまく動きません。 よろしくお願いします。 Sub グラフ範囲変更() Dim lastcolumn As Integer lastcolumn = Range("A2").End(xlToRight).Column ActiveChart.SetSourceData Source:=Range(Cells(1, 1), Cells(1, lastcolumn)) End Sub

  • エクセルのグラフ範囲を毎日かえてグラフをかく

    Sheet1に 列に日にち(A~AEまで31日分) 行には計算したデータがあります。 例) ?月1日ならば A1をグラフ範囲としてグラフを書き、 ?月2日ならば A1からB1をグラフ範囲としてグラフをかく といった感じで毎日 その日までをグラフ範囲として描きたいのですが 毎日毎日自分でグラフ範囲を指定するのは面倒なので 自動的にグラフ範囲を指定したいのです。 わかりにくい文章ですみません どなたか教えて下さいお願いします。

  • Excel関数で列方向データの可変範囲グラフ作成

    こんにちは Excel2010を使用しています 関数にて行方向の可変範囲グラフの作り方サイトを参考にして列方向のデータを可変範囲グラフに しようとしているんですが、うまく作成出来ません。 下記のような列のデータを可変範囲グラフにするにはどうしたらよろしいでしょうか。 A B C D E 1 item a b c d 2 date 1 2 3 4 すみませんが、よろしくお願いいたします。

  • [excel2007]可変範囲のグラフを含むシートのコピーについて

    [excel2007]可変範囲のグラフを含むシートのコピーについて ・やりたいこと 可変範囲を参照するグラフをシート内に作成し、 そのシートを複数コピーして、可変範囲を参照するグラフのまま利用したい。 ・現状 以下のサイトを参考に、可変範囲のグラフをシート内に作成しました。 http://www2.odn.ne.jp/excel/waza/graph.html#SEC13 しかしこのシートをコピーすると、 名前"label","value"は新しいシートに複製されますが、 グラフの参照範囲はその名前でなく、固定値(新しいシートのA2:A5など)になってしまいます。 可変範囲のままシートをコピーしたいです。 (excel2003だと、そもそもコピー前のシートを参照するようですが) ・環境 excel2007 可変範囲のグラフの作成方法は、上記サイトの方法に限定はしていません。 何か良い方法をご存知でしたら、ご教授ください。 よろしくお願いいたします。

  • 自動可変グラフ作成

    おはようございます。  生産実績を下G7に日付け G87に合計を入力し、合計欄には 85行と86行をプラスしております。      G H I J・・・・・・・・ 7月日  3/1 3/2 3/4 3/5 ・・・・・・・・・3/18  ・  ・ 87 実績 100 90 102 103       103 このように実績表を作成し、別のシートに日付け(3/18)をあるセルに入力した場合、グラフ範囲を関数で3/1~3/18日まで期間を抽出させようと関数を調べておりましたら、 http://www2.odn.ne.jp/excel/waza/graph.html#SEC13のサイトに可変グラフ作成が掲載されており、横方向のデータで可変グラフを作成をしようとしましたが、式が複雑すぎてグラフ範囲が設定できませんと表示され3/13日以降の可変グラフが作成されません。  どのようにしたら宜しいのでしょうか?

  • Excelマクロ:折れ線グラフの行範囲を可変

    Excel2010を使用しています。 マクロを記録して折れ線グラフを作ろうとしていますが、マクロを記録出来ないところがあるらしくマクロを実行できません。 マクロを使用するのが初めてで、VBAは勉強中の為、自力での組み立てが出来そうにありません。 どうかお力を貸して頂けないでしょうか。 sheetによって行の数に違いが有る為、行のみを可変範囲設定出来ればと思っています。 1行目に系列が表示しており、2行目からはすべて数字となっています。 A列を横軸の目盛りで表示し、C・D・E列を折れ線グラフで表示し、B・F列はグラフには使用しません。 よろしくお願いします。

  • エクセル 範囲 最後

    エクセルの範囲選択について。 A2からB列の最後までを範囲指定したいです。 グラフのデータ選択のため。 =$A$2:B・・・(中途半端です よろしくお願いいたします。 A B ------------- 1| 54 75 2| -4 6 ・・・・ A2からB列の最後まで

  • EXCELでグラフのデータ範囲を自動化したい

    EXCELについて質問があります。 いまあるデータをグラフ化しようと思っているのですが、グラフのデータ範囲を自動で指定したいのです。 詳しく話しますと、A列に日付データ、B~Fに数値データが入っています。 なお、B~F列には他のシート(同一ファイル)のデータからVLOOKUPによって日付を検索値にて抜き出した数字が入っております。 そして、グラフ化するデータ範囲は一番古い日付から前日までのB~Fのデータになります。また、A列を項目軸ラベルとして使用します。自動化するのはこの、「前日まで」という部分です。 ちなみにA列には、2003年から2008年までの日付が予め入っています。 ですので、B~F列にはVLOOKUPで検索している関係で現在の日付以降の欄には最後に入力された日付のデータが下にずらずらと表示されています。 現在は手動でグラフの範囲の更新をしている為、未来の日付にデータが入っていることには支障はありません。もし、自動化するにあたって他の方法を用いてデータを抜き出した方がよいのであればその点も明記していただけますと助かります。 よろしくお願い致します。 ※データ詳細 ・4行目からデータが入っています。 ・A列には2003年3月31日から1日ずつ日付が入っています。 ・B~F列には数値データが入っており、B列はsheet2に元データがありA列に日付、E列に抜き出すデータが入っています。C列以降もsheet3,4…と元データが入っており、A列に日付がありますが、抜き出すデータはシートごとに列が違います。 ・元データの日付の開始日はシートによって異なります。(全て03/03/31からあるわけではないという意味です。) ・グラフ形式は積み上げ面です。B~Fの合計値の推移を見る為です。

  • エクセルのグラフ範囲を自動にしたい

    エクセルのグラフのデータ範囲が頻繁に変化する計算をしており、 そのたびにデータ範囲を指定し直して大変です。 グラフのデータ範囲を自動で設定できる方法はないでしょうか? マクロでも構いません。 ちなみに、グラフは ・単純な2本の折れ線グラフ ・データはXY値ともに縦に並んでいる。 ・このデータ量が、多くなったり、少なくなったり頻繁に変化する 以上、よろしくお願いいたします。

  • excelのグラフ 範囲可変の複数系列の指定

    Excelである表を元に、グラフを作成します。 元データは、月々データが増え、最新の36件についてグラフを作成します。 そこで、名前の定義で元データの範囲(offsetとCountaを使います)を指定するのですが、系列が8個あります。 各系列を8個の名前で定義すればいいのでしょうが、 元の表のグラフにする「範囲」に名前を定義して、グラフの各系列の参照データを、範囲の名前をつかって、指定することはできませんか? 系列1・・・”名前”の1行目 系列2・・・”名前”の2行目  ・  ・ という指定の方法はできますか? 同じようなグラフを数種類作成するため、1グラフの名前の定義数を減らして、すっきりさせたいのです。 ちなみに、今回は、マクロを利用できません。 よろしくお願いします。

専門家に質問してみよう