- 締切済み
エクセルで2つの項目を下から規定数のデータでグラフ
お世話になります。 かなり以前にここで表の2つの項目(データ列)の下から任意の数のデータでグラフを作るマクロを手取り足取り教えてもらい非常に有効に展開しております。 今回は1つのBookの複数のシートに同じ書式の表を作って、各シート上でデータが入力されると列の下から任意の個数(30-50個)で自動でグラフが更新(マクロボタンクリックでもOK)されるようにしたいのです。 マクロはアクティブシートを対象に動くように出来れば1つのコードで各シートのボタンクリックでグラフが更新されるようにできるのではと期待しています。 このような複数のシートで別のシートの表を対象に動くマクロで想定される不具合に関しては全く知見無し。 ・シートは15枚程度で今後増える可能性あり。 ・グラフ対象の列はコードに合わせ込み可能なのでE列とG列等に割り当てて作表可能。(指定できれば尚ありがたい) ・列のデータは式が入っているケースもありますが、数字データの下 から規定数のデータでグラフ化。 ・空白セルは無い ちなみに現在使用しているコードは下記の物です。 '//------------------------'データ列2列 Sub GraphSauceChange8_2() Sheets("成績表").Select ⇒ ここをアクティブシートにしたい ActiveSheet.Unprotect Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 5 '1つ目データ格納列 Const ColNum2 = 7 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 ⇒ 入力表と同じシート=アクティブシートです Dim GSh As Worksheet Dim DSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群1つ目範囲 Dim tgRange2 As Range 'データ群2つ目範囲 Dim tgRangeA As Range '上記合計範囲 Set GSh = ThisWorkbook.Sheets(ShNameGr) Set DSh = ThisWorkbook.Sheets(ShNameGD) ERow = DSh.Cells(DSh.Rows.Count, 1).End(xlUp).Row If ERow < MaxRows + SRowNum Then SRow = SRowNum Else SRow = ERow - MaxRows + 1 End If Set tgRange1 = _ Range(DSh.Cells(SRow, ColNum1), DSh.Cells(ERow, ColNum1)) Set tgRange2 = _ Range(DSh.Cells(SRow, ColNum2), DSh.Cells(ERow, ColNum2)) Set tgRangeA = Union(tgRange1, tgRange2) '結合 GSh.ChartObjects(1).Chart.SetSourceData Source:=tgRangeA 'セット GSh.ChartObjects(1).Chart.SeriesCollection(1).Name = _ DSh.Cells(KoumokuRow, ColNum1).Value GSh.ChartObjects(1).Chart.SeriesCollection(2).Name = _ DSh.Cells(KoumokuRow, ColNum2).Value
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
Sheets("成績表").Select ⇒ ここをアクティブシートにしたい この役割のシートが複数あり、 15シート前後で今後増えることが想定される。 他のシート、つまり Const ShNameGD = "入力表" 'データ格納シート名 Set DSh = ThisWorkbook.Sheets(ShNameGD) このシートは1枚だけ。 ということでいいですね? 提示されたコードは尻切れです。 切れている部分は無視してコメントします。 また、 >グラフ対象の列はコードに合わせ込み可能なのでE列とG列等に割り当てて作表可能。 >(指定できれば尚ありがたい) この部分は、どのようなインターフェースで利用者に指定させるかを決める必要がありますので、 後回しの課題にさせてもらいます。 おそらく、以下のコードで行けるんじゃないかと思います。 ぶっちゃけ、何のテストも行っていませんので ダメな場合はどのようにダメかを説明してください。 OKになってから >グラフ対象の列はコードに合わせ込み可能なのでE列とG列等に割り当てて作表可能。 >(指定できれば尚ありがたい) これに取り掛かることにします。 '//------------------------'データ列2列 Sub GraphSauceChange8_3() ActiveSheet.Unprotect Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 5 '1つ目データ格納列 Const ColNum2 = 7 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Dim GSh As Worksheet Dim DSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群1つ目範囲 Dim tgRange2 As Range 'データ群2つ目範囲 Dim tgRangeA As Range '上記合計範囲 Set GSh = ThisWorkbook.ActiveSheet Set DSh = ThisWorkbook.Sheets(ShNameGD) ERow = DSh.Cells(DSh.Rows.Count, 1).End(xlUp).Row If ERow < MaxRows + SRowNum Then SRow = SRowNum Else SRow = ERow - MaxRows + 1 End If Set tgRange1 = _ Range(DSh.Cells(SRow, ColNum1), DSh.Cells(ERow, ColNum1)) Set tgRange2 = _ Range(DSh.Cells(SRow, ColNum2), DSh.Cells(ERow, ColNum2)) Set tgRangeA = Union(tgRange1, tgRange2) '結合 GSh.ChartObjects(1).Chart.SetSourceData Source:=tgRangeA 'セット GSh.ChartObjects(1).Chart.SeriesCollection(1).Name = _ DSh.Cells(KoumokuRow, ColNum1).Value GSh.ChartObjects(1).Chart.SeriesCollection(2).Name = _ DSh.Cells(KoumokuRow, ColNum2).Value
- imogasi
- ベストアンサー率27% (4737/17069)
質問が長くやりたいことをつかみにくいが、1つのシート対象にプログラム(エクセルVBA)があって、他のシートでも(大筋同じ処理として)動くように、したいなら set Sh=workSheets(”シート名A") としておき、明示的にCellやRangeの前にSh.を付ける。 他のシートの処理に入る前に set Sh=workSheets(”シート名B")の行を入れると まずほとんど修正すべき箇所はないことが多い。 一時的に両シートを対象にする場合はSh1,Sh2を別に定義しておく。 両者はSh1,Sh2で間違わないように、記して、区別する。
お礼
HohoPapaさん 毎度お世話になります。 質問の主旨が違っております。 シートの図を貼り付けますので今からすぐ日別の質問をアップしますのでそちらをご覧ください。
補足
補足やお礼枠に図の添付ができないようですので、いま図を添付して再質問させてもらいました。 いつもお手数をおかけします。