- ベストアンサー
エクセルのグラフで横軸を最新の30個で自動更新
- エクセルのグラフで横軸を最新の30個で自動更新する方法について教えてください。
- グラフ要素が1つしかない場合の対応方法について教えてください。
- 値0のグラフではなく、X軸に文字を表示する方法について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
データ列が2つの場合のコードを加工して データ列が1つの場合を書いてみましたので 試してみてください。 今回は、これに加え、前回課題として残っていたハズの '横(項目)軸ラベル を動的にセットする制御を加えてみました。 期待に合わない場合は 以下の行をコメントアウトしてください。 Const XCol = 3 '横(項目)軸ラベル列番号 と GSh.ChartObjects(1).Chart.FullSeriesCollection(1).XValues = _ Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)) Option Explicit '//------------------------'データ列2列 Sub GraphSauceChange8_2() Sheets("成績表").Select ActiveSheet.Unprotect Const MaxRows = 50 'データ範囲に指定する最大行数 Const ColNum1 = 4 '1つ目データ格納列 Const ColNum2 = 6 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 Const XCol = 3 '横(項目)軸ラベル列番号 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 GSh.ChartObjects(1).Chart.FullSeriesCollection(1).XValues = _ Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)) End Sub '//------------------------'データ列1列 Sub GraphSauceChange8_1() Sheets("成績表").Select ActiveSheet.Unprotect Const MaxRows = 50 'データ範囲に指定する最大行数 Const ColNum1 = 6 '1つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 Const XCol = 3 '横(項目)軸ラベル列番号 Dim GSh As Worksheet Dim DSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群1つ目範囲 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)) GSh.ChartObjects(1).Chart.SetSourceData Source:=tgRange1 'セット GSh.ChartObjects(1).Chart.SeriesCollection(1).Name = _ DSh.Cells(KoumokuRow, ColNum1).Value GSh.ChartObjects(1).Chart.FullSeriesCollection(1).XValues = _ Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)) End Sub
お礼
うまくいきました!! データ1つの品種のエクセルに8_1をコピペして、3列目のLOT(数字)を指定したところ動かず。 (データ数が少ないので3列目とデータ列だけダミーデータで下に伸ばした表で試してみました) で、以前うまくいった1列目の日付を下に伸ばして、1列目をX軸に指定したら正常に日付をX軸にしてうまくいきました。が日付ではグラフがおかしくなるので、(表をもとの状態に戻して)想定内のX軸のコードを削除してみましたがうまくいかず。 種々試行して、1列目(日付)が入っている場合、任意の列を指定すると指定列が文字でも数字でも期待するグラフが書けることがわかりました。 1列目は必ず入るのでこれが完成版です。 2系列のほうは今後試してみますが、おそらく同様に1列目にデータが入っていると任意の列がX軸として設定できるでしょう。(私には自信があります???) 万が一でも、すでにVre.7で期待通りに動きますので全く支障なし。 今回もおかげ様で無事目的達成、です。 お礼かたがた今回のグラフの自動化を施したファイル数を数えてみたら今回の1系列の品種でちょうど110品種(ファイル)に展開していました。 いつもながら本当に大感謝!!! 次回のためにご自愛くださいますようお願いします???
補足
いつもいつもありがとうございます。 今回の質問は少し軽率であったと反省し自己解決したことにして質問を閉じようとしたらご回答があり感謝です。 系列が1つのケースはレアケースなのでお手を煩わせてまで自動化する必要はないと気づきました。 データが1つの品種はグラフのところに「グラフは自動更新されないので報告のこと」と目立つように表示しておくことで良しとしようと思っていました。 最初に50個のセルを着色しておいて、色なしセルになったら手動で範囲を再設定する、でも実用上問題なしで対応可能。 ご回答のコードはすぐに試してみたいのですが、現在災害対応中で時間がありません。 結果は必ず報告します。 で、やっぱりうまくいかないと気になる~~~ですが。