Excelのデータ範囲を可変的に取得する方法

このQ&Aのポイント
  • Excelのデータ範囲を可変的に取得する方法について質問があります。個人の労働時間を月ごとに比較するグラフを作成したいのですが、人数が多いためマクロを使いたいです。具体的な範囲の指定方法について詳しく教えてください。
  • マクロを使って、Excelのデータ範囲を可変的に取得する方法について質問です。個人の労働時間を月ごとに比較するグラフを作成したいのですが、人数が多いためにマクロを使用したいです。具体的な範囲の指定方法を教えてください。
  • Excelのデータ範囲を可変的に取得する方法について質問です。個人の労働時間を月ごとに比較するグラフを作成したいのですが、人数が多いためにマクロを使いたいです。具体的な範囲の指定方法について詳しく教えてください。
回答を見る
  • ベストアンサー

Excel:指定したデータ範囲を可変的に取得する方法。

Excel:指定したデータ範囲を可変的に取得する方法。 現在、個人の労働時間の昨年度と今年度を月ごとに比較するグラフを作っています。 一人ひとりのグラフを新規シートに追加していくのですが、人数が多いのでこれをマクロに したいのです。 【sheet1の表(元データ)】 (A) (B) (C) (D) (E) (F) (G) (P) (1)      1月  2月  3月  4月・・・12月 (2) 1 社員A 20期 20 15.5 22.75 12 27.2 (3)    21期 12 12 26 10 13 (4) 2 社員B 20期 : : : : : (5)    21期 (6) 3 社員C 20期 (7)    21期 (8) 4 社員D 20期      21期 : : 【作りたいマクロ】 例)A2のセル[1]を選択して実行すると、社員Aのデータ範囲(B2~P3までと一行目の月単位行)を グラフ化し、新規シートに追加する。 ・上記例を他社員のデータ範囲にも使えるようにデータ範囲を可変的にしたい。 ・できればそのマクロをボタン化して、A列にそれぞれボタンを挿入したい。 ※A4[2]セルのボタンを押すと、社員Bのグラフが作成される。 下記にわかるところまでのコードを記します。(vba初心者で拙いコードですがお許しください) Sub Macro1() Range(Cells(1, 2), Cells(1, 18)).Select '1月~月平均の列 Range(Cells(2, 2), Cells(3, 18)).Select 'グラフ化する範囲 Cells(2, 2).Activate ActiveSheet.Shapes.AddChart.Select 'グラフ追加 'グラフデータの範囲設定 ActiveChart.SetSourceData Source:=Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(1, 2), Worksheets("Sheet1").Cells(1, 18)) ActiveChart.SetSourceData Source:=Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(2, 2), Worksheets("Sheet1").Cells(3, 18)) ActiveChart.ChartType = xlColumnClustered ActiveChart.ApplyLayout (5) ActiveChart.Location Where:=xlLocationAsNewSheet, name:="グラフ" ActiveSheet.Move after:=Worksheets("Sheet1") Sheets("Sheet1").Select End Sub 上記のコードだと範囲指定しているため社員Aのグラフしか作成できません。 範囲を可変的にするために変数を使おうと考えているのですが、 どのように書いてよいのか混乱してしまって・・・ 皆様にご教授願いたいと思いましてこちらに質問させていただきました。 長文および読み辛くなってしまい申し訳ありません。 どうかよろしくお願いいたします。

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

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

test2はマクロを使って可変範囲のグラフを作ってますが、 最初に作っておけば良いので手作業でも可能なのです。 例えば 【名前定義】【参照範囲】 syain2    =OFFSET($B$2,($A$1-1)*2+2,0) _20期2    =OFFSET($D$2,($A$1-1)*2+2,0,1,13) _21期2    =OFFSET($D$3,($A$1-1)*2+2,0,1,13) という感じで名前定義を追加します。 参照範囲はtest2で作った名前参照範囲から2行下へOFFSETさせた位置関係です。(+2) あとはtest2グラフをコピーしてタイトルを[テキストの編集]で、 系列を[データの選択]で編集します。 =Sheet1!syain2 系列"20期" の系列値 =Sheet1!_20期2 系列"21期" の系列値 =Sheet1!_21期2 一応、マクロで表現すると。 Sub test3()   Dim s As String   With ActiveSheet     .Range("A1").Value = 1     '[名前定義]     .Names.Add "社員", "=OFFSET($B$2,($A$1-1)*2,0)"     .Names.Add "_20期", "=OFFSET($D$2,($A$1-1)*2,0,1,13)"     .Names.Add "_21期", "=OFFSET($D$3,($A$1-1)*2,0,1,13)"     .Names.Add "社員2", "=OFFSET($B$2,($A$1-1)*2+2,0)"     .Names.Add "_20期2", "=OFFSET($D$2,($A$1-1)*2+2,0,1,13)"     .Names.Add "_21期2", "=OFFSET($D$3,($A$1-1)*2+2,0,1,13)"     s = .Name     'グラフ作成     With .ChartObjects.Add(.Range("Q1").Left, 0, 500, 300).Chart       .ChartType = xlColumnClustered       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""21期"",'" & s & "'!R1C4:R1C15,'" & s & "'!_21期,)"       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""20期"",'" & s & "'!R1C4:R1C15,'" & s & "'!_20期,)"       .ApplyLayout (5)       .ChartTitle.Text = "='" & s & "'!社員"       'y軸タイトル       .Axes(xlValue).HasTitle = False     End With     With .ChartObjects.Add(.Range("Q1").Left, 300, 500, 300).Chart       .ChartType = xlColumnClustered       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""21期"",'" & s & "'!R1C4:R1C16,'" & s & "'!_21期2,)"       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""20期"",'" & s & "'!R1C4:R1C16,'" & s & "'!_20期2,)"       .ApplyLayout (5)       .ChartTitle.Text = "='" & s & "'!社員2"       .Axes(xlValue).HasTitle = False     End With   End With End Sub

sarami55
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 end-u様に教えて頂いたコードを元に希望通りのマクロができました! 複数の比較グラフについてなのですが、名前定義の際に社員1と社員2を、 A1セルとB1セルに分けることで任意の社員のグラフを表示させることができました。 名前定義やOFFSETの使い方を知らなかったのでとても勉強になりました。 急な質問にも関わらず、丁寧にご指南くださり本当にありがとうございます。

その他の回答 (1)

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

Sub test1()   Dim r As Range 'SourceData範囲   Dim x As Range 'x軸ラベル範囲   Dim n As Long 'Data先頭行      With ActiveSheet     'ActiveCellがデータ範囲になければExit     If Intersect(ActiveCell, .UsedRange) Is Nothing Then MsgBox "exit": Exit Sub     'Data先頭行取得     n = WorksheetFunction.Floor(ActiveCell.Row, 2)     '1行目の場合Exit     If n = 0 Then MsgBox "exit": Exit Sub     'SourceData範囲セット     Set r = .Cells(n, 2).Resize(2, 14)     'x軸ラベル範囲セット     Set x = .Range("D1:O1")   End With   With Charts.Add     .ChartType = xlColumnClustered     .SetSourceData Source:=r, PlotBy:=xlRows     .SeriesCollection(1).XValues = x     .ApplyLayout (5)     'グラフタイトル     '.HasTitle = False     'y軸タイトル     '.Axes(xlValue).HasTitle = False   End With   Set r = Nothing   Set x = Nothing End Sub ...こんな感じでいけるハズ。 ActiveCellの位置に応じてData範囲を判断しグラフ作成します。 つまりボタンは1コで良いです。 Worksheet_BeforeDoubleClickイベントなどを使っても良いかもしれません。(VBAに慣れてきたら) ただ、人数が多いなら『一人ひとりのグラフを新規シートに追加していく』 のは大変なような気がします。 データがあるシート上にグラフを作って、 1 , 2 ... などと A列の(社員を識別する?)番号を A1セルに 入力する事で グラフを切り替えたりする事なども考えたほうが良いかもしれません。 下記は名前定義を使う例。 (単純に、作業セルに関数をセットし、該当データのみ引っ張ってくる方式でも良いと思います) 1コ作れば、A1セルの値を変更する事でデータ変更できます。 Sub test2()   Dim s As String   With ActiveSheet     .Range("A1").Value = 1     '[名前定義]     .Names.Add "社員", "=OFFSET($B$2,($A$1-1)*2,0)"     .Names.Add "_20期", "=OFFSET($D$2,($A$1-1)*2,0,1,12)"     .Names.Add "_21期", "=OFFSET($D$3,($A$1-1)*2,0,1,12)"     s = .Name     'グラフ作成     With .ChartObjects.Add(.Range("P1").Left, 0, 500, 300).Chart       .ChartType = xlColumnClustered       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""21期"",'" & s & "'!R1C4:R1C15,'" & s & "'!_21期,)"       .SeriesCollection.NewSeries.Formula = _       "=SERIES(""20期"",'" & s & "'!R1C4:R1C15,'" & s & "'!_20期,)"       .ApplyLayout (5)       .ChartTitle.Text = "='" & s & "'!社員"       'y軸タイトル       .Axes(xlValue).HasTitle = False     End With   End With End Sub

sarami55
質問者

補足

ご回答ありがとうございます! どちらの方法も望んでいた動作ができて本当に感動しました!! 有難くtest2のコードを使わせて頂きたいのですが、 こちらのコードを応用してグラフを複数表示させることは可能でしょうか? 通常はtest2のコードで全く問題ないのですが、社員Aのグラフと社員Bの グラフを比較したいときなどに、複数表示することができたらと思いまして… よろしければ教えていただけると幸いです。 重ねての質問失礼いたします。

関連するQ&A

  • グラフ可変範囲のデータ設定

    環境Excel2002です グラフ 1が棒グラフ2個、折れ線グラフ1個で作成されています Sheets("支社")に8支社のデータがあります グラフシートは1Sheetにしたいので グラフシートで支社を選択することにより Sheets("支社")の該当支社のグラフデータを取得します そうすると、グラフデータは可変範囲で設定することになります そのVBAが下記です ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Select With ActiveChart.SeriesCollection(1) .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) .Values = Sheets("支社").Range(Cells(497, i + 1), Cells(497, i + 12)) End With .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) のところで実行時エラー1004がでてしまいます エラー回避方法を教えてください

  • エクセルのマクロでCells(j,i)を使用してデータ範囲を指定してグラフを作成する方法

    エクセルのマクロでグラフを描く時に、2つの離れた列(1列目とi列目)のデータを Cells を使用して範囲指定をしたいのですが、エラーがでてしまします。どこが間違っているか教えていただけないでしょうか? よろしくお願いいたします。 下記の式では正常にグラフは作成されます。 ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:A19,C1:C19"), PlotBy _ ' :=xlColumns 下記表現でエラーが発生します。 Dim c1, c2, c3 As Range Set c1 = Worksheets("Sheet1").Range(Cells(1, 1), Cells(jmax, 1)) Set c2 = Worksheets("Sheet1").Range(Cells(1, i), Cells(jmax, i)) Set c3 = Union(c1, c2) ActiveChart.SetSourceData Source:=Sheets("Sheet1").c3, PlotBy _ :=xlColumns エラー内容 実行時エラー'438' オブジェクトは、このプロパティまたはメソッドをサポートしていません。

  • グラフの範囲指定を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

  • Unionでの他のシートの参照について

    excel2007のマクロなのですが、データからグラフを作るときに、setsoursedataでデータ参照するときに、sheet1とsheet2からそれぞれデータを選択したいので、Unionを使ってそれぞれの範囲を結合しようとしたのですが、 worksheets("sheet1").Select Set owarine = Range(Cells(st, 5), Cells(en, 5)) Worksheets("sheet2").Select Set BB = Union(Range(Cells(st, 3), Cells(en, 3)), Range(Cells(st, 5), Cells(en, 6))) Set sphere = Union(owarine, BB) ActiveSheet.ChartObjects.Add(5, 18, 550, 250).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=sphere, PlotBy:=xlColumns としても、'Union'メソッドは失敗しました'_Global'オブジェクトと表示されてできません。どうすればいいのでしょうか?

  • VBA(excel)でグラフのデータ範囲の取得

    excel2010の VBA利用者です。 グラフが書いてあって(種類は3D等高線グラフ)、 その元になるデータ範囲は 例えば ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$D$10") のようにすれば、シート1のRange("A1:D10")の範囲が設定できます。  では、  これの 逆に 設定でなくて、取得が出来ませんでしょうか?  つまり 上記の場合でしたら、範囲"A1:D10"を取得して、変数に代入したいのです。 もし、範囲としての取得が難しいならば、最低限 グラフの現在のデータ範囲の矩形範囲の縦横の、行数、列数の 取得だけでもなんとかしたいのですが、 何か方法はないでしょうか? 縦横数百セルの大き目の範囲を相手にしたいので、 Formulaプロパティで系列ごとに取得していく方法では煩雑になるので 何とかもっと 簡便な方法が無いものかと思っております 御教授のほど、よろしくお願いいたします。

  • Excel VBAでグラフの可変データ範囲の取得方法

    Excel2003を使用しています。 ExcelのVBAでグラフ作成のマクロを作る際に、 取得するデータの行数が可変だった場合にどうすればいいのか知りたいです。 現在は取得するデータの範囲を以下の様に取ってきています。 ActiveChart.SetSourceData Source:=Sheets("シート名").Range("B1:C5000"), PlotBy:=xlColumns ここで、データの範囲("B1:C5000")が可変だった場合のデータ範囲の取得方法を知りたいです。 例えば、("B1:C7000")や("B1:C10000")など。 具体的には"B1"のセルを選択して、 [Ctrl & Shift]を押しながら "→"、"↓" と操作を行なったときに選択される範囲をグラフのデータとして使用したいです。 途中、空白セルはない前提でかまいません。 データの終端を取得する「Endプロパティ」なるものが存在するようですが、 これを使用するのでしょうか? それとも別の方法があるのか・・・? 宜しくお願いします。

  • Excel VBA グラフ作成のときのエラー

    VBA初心者です。Excel2003を使っています。 Sheet1に作りたいグラフがあります。 データは下記のとおりです。 ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。 不思議なのは、昨日は動いていたのです。 なぜ、エラーが出るようになったのかわかりません。 ご教授よろしくお願いします。 A B 1 a 1 2 2 3 3 4 4 5 5 6 b 6 7 7 8 8 9 9 10 10 11 c 11 12 12 13 13 14 14 15 15 Sub test() Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Wrow If Worksheets("sheet1").Cells(i, "A").Value = "a" Then a_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then b_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then c_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then d_data = Worksheets("sheet1").Cells(i, "A").Row End If Next Sheets("sheet1").Select Range(Cells(a_data, "B"), Cells(b_data, "B")).Select ActiveSheet.ChartObjects.Add(30, 10, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(a_data, "B"), Cells(b_data - 1, "B")), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" Sheets("sheet1").Select ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A") ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(c_data, "A") End Sub

  • VBAでグラフ作成

    過去のログから色々探したのですが、原因が分かりません。お願いいたします。 エクセルのグラフの元データの範囲を ActiveChart.SetSourceData Source:=Sheets(\"sheet1\").Range(\"J11:M35\"), PlotBy:=xlColumns から ActiveChart.SetSourceData Source:=Sheets(\"sheet1\").Range(Cells(11, 10), Cells(35, 13)), PlotBy:=xlColumns に書き換えたら動かなくなってしまいました。 ナゼでしょうか? すいません、初歩で、、。お願いいたします。

  • VBAでグラフ作成

    過去のログから色々探したのですが、原因が分かりません。お願いいたします。 エクセルのグラフの元データの範囲を ActiveChart.SetSourceData Source:=Sheets("sheet1").Range("J11:M35"), PlotBy:=xlColumns から ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(11, 10), Cells(35, 13)), PlotBy:=xlColumns に書き換えたら動かなくなってしまいました。 ナゼでしょうか? すいません、初歩で、、。お願いいたします。

  • Excel VBA グラフチャート名で指定するには

    ExcelのVBAでグラフを作成した後 ActiveChartでアクティブなチャートを指定するのではなく ActiveChart.Nameなどで取得したチャート名で指定するには どのように記述すればよいでしょうか。 例えば、以下のtest()のコードの中の ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone) ActiveChart.PlotArea.Select ActiveChart.Parent.Copy の部分をActiveChartを使わずチャート名(chart_nameなど)で指定するには どのように記述すればよいでしょうか。 よろしくお願いします。(Windows7,Excel2016) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A1") = "A"  ThisWorkbook.Worksheets("Sheet1").Range("A2") = "B"  ThisWorkbook.Worksheets("Sheet1").Range("B1") = "75"  ThisWorkbook.Worksheets("Sheet1").Range("B2") = "25"  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ThisWorkbook.Worksheets("Sheet1").Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate  ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)  ActiveChart.PlotArea.Select  ActiveChart.Parent.Copy End Sub

専門家に質問してみよう