エクセルのグラフを自動化する方法

このQ&Aのポイント
  • エクセルのグラフを自動化して横軸をデータ数で設定する方法について教えてください。
  • グラフの横軸をデータ数で自動化するための手順を教えてください。
  • エクセルでグラフの横軸をデータ数で自動化する方法を教えてください。
回答を見る
  • ベストアンサー

エクセルのグラフの横軸をデータ数で自動化

いつもいつも大変お世話になっております。 先日の質問時に具体的な表を添付しなかったために非常にお手間をおかけすることになってしまったので改めて具体的な表を添付して再度質問させていただきます。 左のボタンをクリックするとグラフが更新されて成績表の印刷ダイアログが表示されるようにしたいのです。(実際にはSheet2に作成されたグラフを確認してからマクロボタンでLOT Noをファイル名とした成績表がpdfで保存された後印刷することになります) グラフは品種によってはデータ数20個、30個、最大50個程度の最新のデータの動きを確認したいのです。 グラフ化の要素は品種により特性列を任意に2個選択したい。 実際にはこのブックにはHohoPapaさんに教わった保存時の入力済みセルの自動保護マクロ、pdf保存と印刷マクロ等が複数組み込まれていますのでこれとのバッティングも懸念されます。 (今回最初にグラフ作成マクロが動かなかった原因はこれでしたが、マクロの1行目に保護解除コードを1行入れたら解決) 前の質問の#1のご回答でデータ数が指定の個数より足りないケースでグラフ対象セルが上に突き抜けなければほぼ完ぺきなのですが。 何とかなりそうなら何卒よろしくお願いいたします。 (うまくグラフが添付されますように・・・)

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

添付されたサンプルシートを確認しました。 17行目から34行目まで非表示のようですが、 本チャンでは表示されており グラフデータが17行目から始まっているんですよね? 過日のコメントでは、 >5行目が項目名です。 だったと思いますが、16行目が項目名ですね? 過日ポストしたコードは、 グラフ用データ格納シートと、 グラフ描写シートが同一であることが前提なので、 これが、期待する動作にはならない原因と思います。 そこで、 シートが別なことを考慮したコードにしてみましたので 試してみてください。 それでもNGなら、どのようにNGなのかを含め、 更に、 今回のサンプルシートを元に作成しているグラフをポストしてみてください。 新たな画像が添付できないようなら、 新たなスレッドを起こしてください。 なお、明日から数日、霞を食す時間を過ごすので 当方のコメントを数日待つ、あるいは識者からのコメントをお待ちください。 また、 >印刷ダイアログが表示されるようにしたいのです これは、今回の課題を済ませてうえで、 新たなスレッドとしてください。 (話が混乱してしまいますから) Sub GraphSauceChange5()  Const MaxRows = 30  'データ範囲に指定する最大行数  Const ColNum0 = 2  'x軸要素名列  Const ColNum1 = 5  '1つ目データ格納列  Const ColNum2 = 10  '2つ目データ格納列  Const SRowNum = 17  'データ開始行番号  Const KoumokuRow = 16 '項目名格納行番号  Const ShNameGD = "データ" 'データ格納シート名  Const ShNameGr = "グラフ" 'グラフ描写シート名    Dim GSh As Worksheet  Dim DSh As Worksheet  Dim SRow As Long   'グラフ用データ開始行  Dim ERow As Long   'グラフ用データ終了行  Dim tgRange0 As Range 'X軸ラベル  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    MsgBox (SRow & "-" & ERow) 'デバック用確認コード    Set tgRange0 = _   Range(DSh.Cells(SRow, ColNum0), DSh.Cells(ERow, ColNum0))  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(tgRange0, 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 End Sub 追記 https://okwave.jp/qa/q9645895.html こっちは閉じたほうがいいと思います。 (そのまま残しておくと OKWAVEから突っ込みがあるかもしれませんので)

akira0723
質問者

お礼

本当に何度もありがとうございます。

akira0723
質問者

補足

何度もお手数をお掛けしております。 金曜日から色々試行していますが、原因不明の動作不良が解決できず。 1.本チャンのレイアウトを極力正確に反映したデモシート(質問添付の表)では完璧に動くことを確認しました。 尚、5行目に特性項目を入力すると16行目に参照されるようになっていますので特性項目の入力は5行目です。データ入力時に項目名の下に入力できるように16行目に表示されるようにしています。ちなみに6行目と7行目がその特性の規格上下限値でこれ(セルの値)を外れた場合の書式設定(アラーム)が設定してあります。ほかにも直近30ロットの最大、最小値、等々の書式設定や、計算シートの結果が入力表の所定のセルに転記されるマクロ、保存時に全シートの入力セルだけに保護がかかる等々、HohoPapaさんのコード盛沢山のひな形です。ちなみに、この入力表の社名、製品名、規格、等々が所定の書式に転記して出来上がるのが成績表(Sheet3)でこれをpdfで保存して印刷ダイアログが表示されるマクロはすでに完成しています。(これもHohoPapaさんのコードだと思います) 2.金曜日に本チャン(ひな形)シートにうまく動いたコードをそのままコピーしてみたのですが動かず。 エラー表示は、「実行時エラー1004 アプリケーション定義またはオブジェクトの定義あらーです」 3.ひな形ではなくとりあえずグラフ表示が必要な製品別の本物シート(Book)で試してもダメでした。(基本的にひな形と同じシートですが細かい部分が製品ごとに違っているので) 4.デモシートの1-16行目にひな形の1-16行目をコピーしたら動かなくなりました。 エラー表示は同じでした。 5.そこで一旦元に戻して動くことを確認したのち、ひな形の1行目から順にコピーしていったら16行目をコピーしても動きました。 ただし、途中で手を抜いて、一度に2行C&Pしたら動かなくなり、その2行またがる結合セルがあったので「結合セルが原因!」と思いましたが残念ながら違うようでした。(再現性なし) つまりシート(Book)によって不具合が発生するのですが、何が原因かわからない状況です。 予想通り、不具合はコードではなく、当方のシート構成に原因があることが明確になったのですが解決方法がわかりません。 デモシートでは完璧に動くので非常に悔しく何とかしたいのですが、HohoPapaさんに分かる範囲で何か試すことがあればぜひご教示いただきたく。 それでもだめなら一旦閉じさせていただきます。 今後新規にひな形を作成して1つづつマクロの動きを確認してみて、何らかの原因が思い当ったら再度質問させていただくことにしたいと思います。 せっかくデトックス?された後すぐの非常に俗っぽい質問で申し訳ありませんがご容赦!!! 人の迷惑顧みず、諦めが悪くすみません。

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

>エラー表示は、「実行時エラー1004 アプリケーション定義またはオブジェク>トの定義あらーです」 このエラーを起こすソースコードの行を明示することで おおよその原因はわかるかもしれません。 一番ポピュラーなのは シートの0行目とか、0列目にアクセスしようとした場合です。

akira0723
質問者

お礼

<大至急> ひな形のコピー(正常に動作)シートにデータだけコピペした場合は動作することがわかりました。なぜ先程はできなかったのか?ですが。。。 これでとりあえず何とかできるはずなのですが、横軸が数字(LOT No)だと3つ目の要素に指定されてしまうのですがこれを何とかできませんか? あるいは横軸は無し(データの個数で1~30)でもよいのですが。 日付ではまずいことが分かりました。 実際には入力期間は等間隔ではないので生産が1年飛んで数日連続したりしますのでプロットの間隔が非常におかしくなってしまいます。今まではダミーでデータを下に引っ張っていたので日付が等間隔でした。(情けない見落としご容赦) またまた結局追加条件になってしまいました。

akira0723
質問者

補足

毎回の早々のご回答感謝いたします。 >このエラーを起こすソースコードの行を明示する・・ とのことですが、うまくいくシートのコードをそのまま目的の製品シートにコピペしているのでシートの何が悪いのか不明です。 ちなみに逆にうまくいくシートに製品シートのデータの範囲(17行目~23行目のA~F列)だけを「123で貼り付け」ると「パラメータが無効です」となって、要素(グラフの線)が消えて縦軸が日付け(1900/1/0と1900/1/1)に変わり(グラフ軸の数値が日付になった?)、要素の1つだけが正しく凡例に表示されます。 別Book(ひな形のコピー)では全く同じコードなのに全て指定した通りに動作します。 困ったのは動くシート(ひな形のコピー)にこれまでのデータだけをコピペしても問題が解決しないことです。 汗だけではどうしようもない状況。 しばらく静観(コツコツ試行錯誤)するしかないか?(出来ているのに非常に残念!) Sub GraphSauceChange5() Sheets("成績表").Select ActiveSheet.Unprotect Const MaxRows = 20 'データ範囲に指定する最大行数 Const ColNum0 = 1 'x軸要素名列 Const ColNum1 = 4 '1つ目データ格納列 Const ColNum2 = 6 '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 tgRange0 As Range 'X軸ラベル 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 tgRange0 = _ Range(DSh.Cells(SRow, ColNum0), DSh.Cells(ERow, ColNum0)) 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(tgRange0, 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 End Sub

関連するQ&A

  • エクセルのグラフの横軸の範囲の自動設定

    お世話になっております。 前々から不便に思っていたのですが、今回他部署にエクセルの入力表を作成することになったので表題の設定方法につき教えて頂きたく。 エクセルの表に上から順に、例えばC列に値が入っていく場合、入力されたセルまでをグラフに表示したいのですが、年間で200-300個(行)になるので、最初から余裕をみて400行までのセルを指定すると、最初の方(データが数個の時)のグラフは左端に数個のデータのグラフになってしまいます。 これを自動で入力セルの個数に合わせたグラフにしたいのです。 以前より不便に思っていましたが、自分使用の場合はグラフの線をクリックして入力位置まで引っ張れば良かったので改善せずに使用していましたが、今回はファイルを人に渡すので何とかスマートにできないかと思い質問させていただきます。 更にはもし、同じ程度のレベルで可能なら、最新の50個のデータのグラフ化が出来れば理想的ですが、これは難しそうなので上記が解決してからにしたいと思います。

  • エクセルのグラフで横軸を最新の30個で自動更新

    HohoPapaさん 何度もしつこくて、くどくてすみませんがあと1つだけお願いします。 うまく動くBookに品種別Bookのデータをコピペして、必要な細工を再構築して一応目的のBookが完成しましたが、先ほどの質問のお礼欄にコメントしましたようにX軸が数字の場合への対応がどうしても必要です。あるいはX軸の指定を抜く。 試しにX軸に関係しそうなコード(Column0)を1行づつ削除してみましたが駄目でした。 X軸は何も何もなくても良いのでこの部分だけ改良何とかお願いいたします。 グラフ化は何とか完成させたいのであと一息何卒よろしくお願いします。 先程の質問は締め切らせてもらいます。

  • エクセルのグラフで横軸を最新の30個で自動更新

    HohoPapaさん いつもお世話になっております。 さて前日下記のコードを教わって随時他のBookにも展開中です。 非常に使いやすく汎用で助かっているのですが、当初からある程度想定された問題が発生しました。 当然あり得るケースとしてグラフ要素が1つしかない場合です。 本日上記のケース(1列以外は5以下、10以上、合格、・・・)が出てきました。 おそらく同じ列を入れればグラフの見た目は1本にできると思っていたのですが、何ともならず。 今更ですが、お恥ずかしい限りで申し訳ありませんがグラフ要素1つの場合の対応をお願いできませんでしょうか? 文字列を指定するとX軸に表示されるようです。(値0のグラフではなくX軸に文字が表示されます) 両方兼用だと複雑になるようなら、別のコード(このコードから数行省略?)でもOKですので何卒よろしくお願いいたします。(レアケースなので使い分けは全く問題なし) 8回目の改良になってしまい本当にすみません。 HohoPapaさんの想定外の低レベル(すでにお気づきかと思いますが・・)ですみません。 Sub GraphSauceChange7() 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 = "成績表" 'グラフ描写シート名 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 End Sub

  • Excelでのグラフ、元データから自動的に反映させるには?

    Microsoft Excel2003での質問です。 日々データを更新(追加)する表があり、別シートにてその表のグラフ(折れ線)を作成しました。 毎日毎日、そのグラフを見るのですが、 グラフに、その日追加したデータを反映させるのに、 [グラフシート]→グラフ→元のデータ と進み、表の一行目から、そのとき入力した最終行までをドラッグ範囲指定しています。 これはこれでうまくいくのですが、毎回毎回のこの作業を簡略化する方法はありませんでしょうか。 マクロやVBA(あまり詳しくありませんが)を使用する方法でももちろん結構ですので、どなたかご教示いただけませんでしょうか。 よろしくお願いいたします。

  • グラフの横軸目盛について(エクセル2007)

    グラフの横軸目盛がなぜか元データと合いません。 なぜでしょうか?原因と対処の方法をご存知の方 ご教示願います。 ●例) 表(A6セル)→2007年1月10日 グラフ(左端)→2007年1月1日 ●グラフの作成方法 1.(B5:B9)セルを範囲選択 2.「挿入」→グラフ(2-D縦棒)選択 3.グラフエリアを選択状態→「デザイン」→「データ」 4.「データソースの選択」→「編集」 5.(A6:A9)セルを範囲選択→OK 上記の作成方法でできた最初のグラフは、表と横軸目盛は 合致していましたが、グラフエリアの大きさを 任意に縮小していると、なぜか1900年になったり逆に拡大すると 2007年1月1日なったりしました。 エクセル2007でグラフの作成お詳しい方が、いらっしゃいましたら ご教示願います。なお画像を添付いたしますので ご参考にしていただければ幸いです。

  • エクセルで2つの項目を下から規定数のデータでグラフ

    15枚のシートに同じ書式の表がありそのシート上に任意の2列の列データを下から30個指定してグラフ化したいのです。 表に空白セルは無く、データ数が30個以下の場合は全数でグラフ化したい。 製品A、製品B・・・というように製品名のシートが15枚あります。 この表の2列のデータを下から30個でグラフ化したく。列は固定することも可です。 データ数や項目行やデータの開始行は下記の様にコード中で指定でも問題なく使用できると思いますが、もし可能なら添付の図のように決まったセルから指定できれば最高です。 コード中での指定の場合表がずれた場合に不都合になってしまいますが、今のところ表の位置を合わせることもできそうですので必須条件ではありません。 Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 5 '1つ目データ格納列 Const ColNum2 = 7 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号

  • Excelで増えたデータをグラフに自動追加

    というのをしたいんです。通常はグラフ化するデータを選択してからグラフを作成しますが、余分にセルを選択しておくとグラフ内に余白ができてしまいます。 また、あとからデータを選択してグラフ内にドラッグしたり、グラフウィザードから再度範囲を選択をしたりという方法もありますが、それだと手作業になります。 データが増えた分だけを、自動的に棒グラフや折れ線グラフに追加することはできるでしょうか。 マクロはできれば使わないほうがいいですが、無理ならマクロでもかまいません。よろしくお願いいたします。

  • エクセルでグラフの横軸が自動で伸びるようにしたい

    いつもお世話になっております。 エクセル2016です。 表からグラフを自動で表示して、データが増えるにしたがって横軸が伸びていくようにしたいのです。 1~2年前にNETで調べて名前の定義を使って試行錯誤の末何とか出来るようになったあのですが少し不具合(指定のセルと系列が違っている)があって弄っているうちに訳が分からなくなってしまいましたのでHELPです。 今使っている方法は名前の定義で下記の式を入れて OFFSET(入力表!$D$16,1,0,COUNT(入力表!$D:$D)+5,1) グラフの系列を選択して =SERIES(入力表!$D$12,,入力表!系列B1月,2) としているのですが、同じように系列を増やそうとしてもどうしてもうまくいきません。 どこを変えれば良いのか基本的なことが分かりません。 最初に作成したときのメモを見ながら試行錯誤したのですがお手上げ状態。 このやり方の修正、もしくはもっと簡単にできる方法は無いのでしょうか? この方法だと対象列が変わるたびに苦戦しそうです。

  • エクセルのグラフがうまく描けない

    XP,OFFICE2007ユーザーです。 エクセルで、第1列を日付、第2列は朝のデータ、第3列は昼データ、第4列は夜データ、第5列は平均値として1ヶ月間の表を作成してこれを基に棒グラフを描きました。 ところが、うまくできません。 1) 日付が10日目、つまり10×5セルぐらいだと、毎日4個のデータがグラフ表示され、凡例はちゃんと「朝・昼・夜」と例示されます。 2) ところが、日付が増えて表全体が縦長になると、「凡例」に最右列の平均値がすべて表示されます。そしてグラフエリアにはただ1個のデータが表示されます。 3) この現象は、表が20行ぐらいになると現れます。 4) 1ヶ月のデータをグラフ化したいのです。 たいへん困っております。 出来損ないのグラフJPGの添付がうまくゆかないのでお分かりにくいかと存じますが、 よろしくお願いします。

  • Excelマクロ:配列データからグラフを作成するには?

    マクロ初心者です。 Excel VBAのマクロで、2つの配列データから、散布図グラフを作成したいのですが、セルに配列データを書き込まず、直接グラフ化するにはどうしたらよいでしょうか? 配列データの要素数がexcelの行と列の最大数(65536,256)?を超えてしまっているので、配列データから直接グラフ化したいと思っています。 よろしくお願いいたします。

専門家に質問してみよう