エクセルでグラフを自動作成するマクロの改良

このQ&Aのポイント
  • 過去に指定の列の下から指定の個数のデータを自動で作成するマクロを使用しているが、次の欲求が出てきた。
  • マクロボタンを押すと指定のシートに飛んで、指定の列のデータ数でグラフ化される。
  • 項目名の表示は指定する必要があるが、その表示がなくても問題ない。
回答を見る
  • ベストアンサー

エクセルでグラフを自動作成マクロの改良

いつもお世話になっております。 過去にここで指定した列の下から指定の個数のデータを自動で作成するマクロを教えていただき本当に便利に多くのファイルで使用しているのですが、これが定着してきたら次の欲が出てきました。 各列の決まったセルに数字を入れて(D列をグラフにしたいときにはD2に50と入れて)マクロボタンを押すと指定のシート(成績表)に飛んでその列のグラフが指定のデータ数(50個)でグラフになればありがたいのですが。。。。 項目名は5行目になっているのですが、この場合はグラフ化する項目は必要時に指定するので項目名の表示は無くてもOKです。(あれば更にOK) '//------------------------'データ列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 '横(項目)軸ラベル列番号(下2行と一緒に削除可) 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

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

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

>だとすれば、変数は2つありますので、 >これらの変数を指定するセルは、2つ用意したほうがわかりやすく >扱い易いハズです。 そうではなく、 >>D列をグラフにしたいときにはD2に50と入れて データ格納シートの2行目は、対象としたい列以外は空欄 つまり、 2行目で値の埋まっているセルはD列(D2セルだけ)ですか? F列をグラフにしたいときにはF2に40と入れ 2行目の他のセルは全数空欄 という仕様にしたいですか? であれば  MaxRows = DSh.Cells(2, 4).Value 'D2セル  ColNum1 = DSh.Cells(3, 4).Value 'D3セル を  MaxRows = DSh.Cells(2, Columns.Count).End(xlToLeft).Value  ColNum1 = DSh.Cells(2, Columns.Count).End(xlToLeft).Column としてください。

akira0723
質問者

お礼

毎度、毎度お世話になりっぱなしです。 さて、朝一で動作確認してみました。 いつものようになんだかや、少してこずりましたが、期待通りに動くこと確認しました。 過去のコードで動作確認できているので間違いないとは思っていましたが。 やはり完全に空いている行は無いので2行目を挿入して試したのですが、マクロの行数がズレるのでこの修正が必要でした。 一番困ったのは、「成績表」シートにグラフが2つになるので、今回のグラフを追加(同じシートに2枚のグラフ)にしても両立しないことが分かりました。 マクロを変えると既存のグラフと今回のグラフが切り替わりますが、元の(重要項目)のグラフが消えること、元のグラフに設定した軸の設定が無くなってしまうのでこれは許容不可。 これについては最初の質問時に確認され「グラフ描画シートにグラフは1つ」が前提だったのでこれの改良よりは「グラフ」シートを追加することで解決しました。 HohoPapaさんなら最初から要求していれば、グラフ1とグラフ2を区別して実行はできると思いますが、更にお手数をかけること、既存のマクロの変更を伴うので当方にとっても非常に効率が悪いのでこれはシートの追加で対処が正解です。 また、2行目に複数のデータが入っていた場合、エラーにならずに右の列から優先で採用されること、データ数が実際のデータ数よりも大きな値を入れても問題無いことを確認しました。(長期間の推移を見たいときには適当に200とか入れますので) コードが汎用的で ’注釈があるので本当に助かります。 本コードはこれから順次多数のファイルに展開していく予定ですが、今は気づいていない問題が発生した節にはまたよろしくお願いいたします。 うまくいって気分が良いので、細々と報告が長くなってしまいました。

akira0723
質問者

補足

当方の応答が悪く何度も忖度の回答をいただいてしまい本当に申し訳ありませんでした。 >D列をグラフにしたいときにはD2に50と入れて >データ格納シートの2行目は、対象としたい列以外は空欄 >つまり、 >2行目で値の埋まっているセルはD列(D2セルだけ)ですか? これが意図です。 ただし空いている行はいくつかのBookを確認して決めるつもりでした。 無ければ上の方に1行挿入して専用の行を作るつもりでした。 変数の場所も確認して6行に入力した場合でも動くことを確認しました。 月曜日に本チャンのシートで動作確認して報告させていただきます。 本チャンのシートはご指摘のコードも入っているので念のため両立することを確認しておきます。 とはいっても、当該コードもHohopapaさんのコードなので大丈夫だと信じますが、当方がHohopapaさんの想定外のことをやっている可能性もありますので。 応答が遅くなり申し訳ありません。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

全回答に、反応もないので、「多分こうじゃった、のじゃないか?」と推測して、下記作ってみた。  外れている点を補足すれば、他の回答者にも参考になるのではないか? 他の回答者も、「だと思います」と言っているようだが、趣旨がよくわからないのでは。 質問をして、回答に、補足もお礼もすぐ、してないようだが、そういうのは、どうだろう。 回答は、例を作ったり、文章を書く時間もあるが、回答者のこの分野の、一生の経験が、反映している点を考えてほしい。 ーー 質問する際には、こういう、模擬データ例を挙げて質問すべきではないか? データ例 Sheet1 A1:F8 氏名 一月 二月 三月 四月 五月 一、二、五月デーら例は省略。 山田 55 56.6 佐藤 49.8 62 鈴木 58.6 58.9 田中 51.4 66.2 今井 65.8 73.5 近藤 63.4 80.8 伊藤 51.4 88.1 ーー もし三月を選べばA列とD列データで、四月を選べばA列とE列データでグラフ を描く。仮にグラフは、折れ線グラフとする。 何月の選択はリストボックスで指定する。シートのセル選択イベントなどを使う方法もあるが、本件では使わない。 ーー ユーザーフォームが表示されるときに、Listboxのアイテムに、何月の一覧を作る。 Private Sub UserForm_Initialize() For i = 2 To 6 UserForm1.ListBox1.AddItem Worksheets("Sheet1").Cells(1, i) Next i End Sub リストボックスで、月を選択したら、下記が実行される。 Private Sub ListBox1_Click() Set awf = Application.WorksheetFunction Set sh1 = Worksheets("Sheet1") ttl = UserForm1.ListBox1.Text MsgBox ttl c = awf.Match(ttl, sh1.Range("A1:J1"), 0) MsgBox c '====- With sh1.Shapes.AddChart.Chart .ChartType = xlLine ' xlColumnClustered .SetSourceData Union(sh1.Range("A1:A8"), sh1.Range(Cells(1, c), Cells(8, c))) End With End Sub A列と選択した月の列のデータで、折れ線グラフが描かれる。 ーー 質問者にすれば、自分の質問に載せたコードを添削してほしいのだろうが、 こういう機会に、他の路線のやり方も勉強しないと進歩しないと思う。

akira0723
質問者

お礼

ご回答ありがとうございました。 動作確認する時間がとれなかったのでお礼が遅れ申し訳ありませんでした。 なかなか進歩しないです。

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

No2のついでに。。。 シート名を固定値で持っていますので、 以下のほうがスマートと思います。 '//------------------------'データ列1列 Sub GraphSauceChange9_1()  Const SRowNum = 17    'データ開始行番号  Const KoumokuRow = 5    '項目名格納行番号  Const ShNameGD = "入力表" 'データ格納シート名  Const ShNameGr = "成績表" 'グラフ描写シート名  Const XCol = 3 '横(項目)軸ラベル列番号(下2行と一緒に削除可)  Dim GSh As Worksheet  Dim DSh As Worksheet  Dim SRow As Long 'グラフ用データ開始行  Dim ERow As Long 'グラフ用データ終了行  Dim tgRange1 As Range 'データ群1つ目範囲  Dim MaxRows As Long    'データ範囲に指定する最大行数  Dim ColNum1 As Long    '1つ目データ格納列  Set GSh = ThisWorkbook.Sheets(ShNameGr)  Set DSh = ThisWorkbook.Sheets(ShNameGD)  GSh.Select  GSh.Unprotect    MaxRows = DSh.Cells(2, 4).Value 'D2セル  ColNum1 = DSh.Cells(3, 4).Value 'D3セル  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

akira0723
質問者

お礼

ご回答ありがとうございます。 最初に本命のコードを試して完璧に完了ですが、これも動作確認してみました。 表のA1,A2は確実に空いているのでこれを使うことも可能です。 コードに’D2セル、’D3セルとの注釈がありますので当方でも任意のセルに変更は可能ですので。 ただし、使う人には求めたい項目の列に数字を入れる方が分かりやすいので3つ目のを採用すると思います。 毎度お手数をおかけします。

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

https://okwave.jp/qa/q9656678.html#a_area https://okwave.jp/qa/q9649813.html#a_area これらの延長にある課題と思います。 求めているのは...、 Const MaxRows = 50     'データ範囲に指定する最大行数 Const ColNum1 = 6     '1つ目データ格納列 といったコードで、 グラフに使うデータ範囲の最大行数と グラフ用のデータが何列目にあるのかを 固定的に持っているわけですが これを、 適当なセルの値で指定する(変数にしたい)ということ思います。 だとすれば、変数は2つありますので、 これらの変数を指定するセルは、2つ用意したほうがわかりやすく 扱い易いハズです。 グラフに使うデータ範囲の最大行数をデータ格納シートのD2から、 グラフ用のデータが何列目にあるのかをデータ格納シートのD3から、 それぞれ取得するのであれば、 以下のようなコードになります。 (動作確認を一切していませんので、期待と違うようなら指摘してください) '//------------------------'データ列1列 Sub GraphSauceChange9_1()  Sheets("成績表").Select  ActiveSheet.Unprotect  Const SRowNum = 17     'データ開始行番号  Const KoumokuRow = 5    '項目名格納行番号  Const ShNameGD = "入力表" 'データ格納シート名  Const ShNameGr = "成績表" 'グラフ描写シート名  Const XCol = 3 '横(項目)軸ラベル列番号(下2行と一緒に削除可)  Dim GSh As Worksheet  Dim DSh As Worksheet  Dim SRow As Long 'グラフ用データ開始行  Dim ERow As Long 'グラフ用データ終了行  Dim tgRange1 As Range 'データ群1つ目範囲  Dim MaxRows as long     'データ範囲に指定する最大行数  Dim ColNum1 as long     '1つ目データ格納列  Set GSh = ThisWorkbook.Sheets(ShNameGr)  Set DSh = ThisWorkbook.Sheets(ShNameGD)  MaxRows = DSh.cells(2,4).value 'D2セル  ColNum1 = DSh.cells(3,4).value 'D3セル  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

akira0723
質問者

お礼

いつもいつもお世話になっております。 上の2つとも動いたのでこれは余裕で最初からA1、A2に変えてみて試しましたが期待通りに動きました。 項目数が多いものは20個(列)近くありますので、列を数字で入力するより、目的の列で直近20個とか50個のグラフがかけた方が使いやすいですので、3つ目のご回答がBESTだと思っています。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>D列をグラフにしたいときにはD2に50と入れて)マクロボタンを押すと コマンドボタンを、データシートに作り、D2を入力し、それをクリックするのか?シートのデータChangeイベントでも使うのかな? 凝った仕様だな。 ーー D列データをグラフにするときはD2に、使うデータ行数を入れるのか? F列データをグラフにするときはF2に使う行数を入れるのか? 変わったつくりだな。列全データではないの? どの行からスタートして50行か? ーー グラフの種類は何か? 項目名に当たるデータはA列にあるのか?名前とかそのデータの発生主体の識別名はあるだろうし、必須だろう。1列データだけで、普通はグラフは描かない。 ーー >マクロボタンを押すと指定のシート(成績表)に飛ん・・ D列のデータのグラフは成績表シートとして、それら列対応のシート名を割り出すのはどうするのか。 ーー 質問に乗せた、VBAコードは、この質問に関係するコードなのか? ーー もっとVBA的に、必要な要素技術は何かを勉強し、それに限定した質問にすべきだろう。 初心者が、思いつくまま、便利そうな機能(素人でも思いつくのは簡単なものも多い)を盛り込んでプログラムしようするのは勉強上よくないと思う。 ・ボタンを押して実行させる ・指定場所を相対化する・都度変える・自動で割り出す などは学習上の一段上のスキルだろう。  それらを多用すると、結局丸投げになり、回答をまる写しになり、出来ましたという判定しかせず、実力がつかないと思う。

akira0723
質問者

お礼

ご回答ありがとうございました。 返事こくれてすみませんでした。 お指摘参考になりました。

関連するQ&A

  • エクセルでセルの値でグラフの横棒を自動作成

    いつもお世話になっております。 つい先日、ここで指定した列の最下行から指定したデータ数で自動でグラフを作成する下記のコードを教えていただきました。 それを色んなBookに展開していて、ず~と前からあきらめていた動作があります。 これまで手作業していたのですが上記ができるようになったので欲は限りなく・・・ これから多くのBookに展開する前にできればこの機能も盛り込みたく。 どんどん贅沢になっていますがよろしくお願します。 やりたいことは、下記でマクロで作成されるグラフに当該列の11行目と12行目の値で横棒を引きたいのです。 11行目と12行目には当該列の±3σの値が表示されており、これをグラフ上に横棒で表示すると、最新のデータの位置が分かります。 因みに、最大、最小、3σ、規格外れは書式設定でアラームが出るように設定してあり、これらのアラームが出たときにグラフにして全体の傾向とその値の異常の程度を確認するのが当方の仕事です。(データ入力は各担当者) 質問内容が非常に分かりにくくなってしまいましたが何卒よろしくお願いします。 Sub グラフ確認() Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "グラフ" 'グラフ描写シート名 Const XCol = 3 '横(項目)軸ラベル列番号(下2行と一緒に削除可) Dim GSh As Worksheet Dim DSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群1つ目範囲 Dim MaxRows As Long 'データ範囲に指定する最大行数 Dim ColNum1 As Long '1つ目データ格納列 Set GSh = ThisWorkbook.Sheets(ShNameGr) Set DSh = ThisWorkbook.Sheets(ShNameGD) GSh.Select GSh.Unprotect MaxRows = DSh.Cells(2, Columns.Count).End(xlToLeft).Value ColNum1 = DSh.Cells(2, Columns.Count).End(xlToLeft).Column 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 End Sub

  • エクセルで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

  • エクセル VBAでセルの値のデータ数でグラフ化

    いつもお世話になっております。 この質問は過去にご回答いただいた下記のコードの追加のお願いですのでご了承願います。 下記のコードは指定の列の最下行から指定数のデータ数でグラフを作成するVBAを教えてもらったのですが、今回指定のセル(関数でデータ数をカウント)の値(添付図のB1の値)でグラフを作成したいのです。 グラフは「同じシートの上」の既存グラフの更新(現行のコードのまま)が良いです。 単に下記を同じ名前(両方を入力表)にしてもダメだった記憶有り? Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 現状はデータを下記のコード中で指定した数でグラフ化しているのですが、データ数が15程度から50個以上のケースで使用したく規定数では無くデータ数に応じたグラグにしたく。 '//------------------------'データ列1列 Sub GraphSauceChange8_1() Sheets("成績表").Select ActiveSheet.Unprotect Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 6 '1つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名 Const XCol = 3 '横(項目)軸ラベル列番号(下2行と一緒に削除可) 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

  • グラフに横棒を引きたい(再質問)

    いつもお世話になっております。 約半年前の質問の再質問です。 17行目以降にデータの入った表の2行目に数値(a)を入れるとその列の最下行からa個のデータ数でグラフ化される。 同時に同じ列の11行目、12行目の値で2本の横棒をグラフに描きたい。 上記の質問に対し、半年前にここで下記のVBAをさんざん教わったのですが、どうしてもうまく行かず一旦Pendingとしたのですが、あと少しの気がしてもったいなく、今回改めて前回の質問で示されたご回答(下図)と全く同じ3枚のシートを作ってみて試してみたのですが当方の不具合を再現したので改めて質問させていただきます。 下記VBAの不具合内容 グラフ確認シート(補助シート)には「行見出し」と指定した列の指定数のデータが正しくコピーされますが、C列、D列(プラス3σとマイナス3σ)は空白のままになってしまいます。(当方の実シートの再現) エディタで「F8」を押すと1つずつコードが実行されると知り実行してみるとやはり下記のプラス3σ(11行目)のコピーでエラーになります。 >'プラス3σ複写' >Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _  > DSh.Cells(LineDataRow1, ColNum1).Value 下記の図で期待通りに動くとのコメントでしたがやはり何か抜けているように思われます。 Sub test3()  Const SRowNum = 17 'データ開始行番号  Const KoumokuRow = 5 '項目名格納行番号  Const ShNameGD = "入力表" 'データ格納シート名  Const ShNameGr = "グラフ" 'グラフ描写シート名  Const ShNameGK = "グラフ確認用"  Const XCol = 3 '横(項目)軸ラベル列番号  Const LineDataRow1 = 11 'プラス3σ行位置  Const LineDataRow2 = 12 'マイナス3σ行位置  Const KeyRow = 2 '採用データ数格納行番号  Dim GSh As Worksheet  Dim DSh As Worksheet  Dim KSh As Worksheet  Dim SRow As Long 'グラフ用データ開始行  Dim ERow As Long 'グラフ用データ終了行  Dim tgRange1 As Range 'データ群範囲  Dim MaxRows As Long 'データ範囲に指定する最大行数  Dim ColNum1 As Long '1つ目データ格納列  Set GSh = ThisWorkbook.Sheets(ShNameGr)  Set DSh = ThisWorkbook.Sheets(ShNameGD)  Set KSh = ThisWorkbook.Sheets(ShNameGK)  GSh.Select  GSh.Unprotect  MaxRows = DSh.Cells(KeyRow, Columns.Count).End(xlToLeft).Value  ColNum1 = DSh.Cells(KeyRow, Columns.Count).End(xlToLeft).Column  ERow = DSh.Cells(DSh.Rows.Count, ColNum1).End(xlUp).Row  '<==ここ  If ERow < MaxRows + SRowNum Then   SRow = SRowNum  Else   SRow = ERow - MaxRows + 1  End If  KSh.Cells.ClearContents  KSh.Cells(1, 1).Value = "行見出し"  KSh.Cells(1, 2).Value = "データ"  KSh.Cells(1, 3).Value = "プラス3σ"  KSh.Cells(1, 4).Value = "マイナス3σ"  '横見出し複写  Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)).Copy _   KSh.Cells(2, 1)  'データ複写'  Range(DSh.Cells(SRow, ColNum1), DSh.Cells(ERow, ColNum1)).Copy _   KSh.Cells(2, 2)  'プラス3σ複写'   Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _    DSh.Cells(LineDataRow1, ColNum1).Value  'マイナスσ複写'   Range(KSh.Cells(2, 4), KSh.Cells(ERow - SRow + 2, 4)).Value = _    DSh.Cells(LineDataRow2, ColNum1).Value   Set tgRange1 = _    Range(KSh.Cells(2, 1), KSh.Cells(ERow - SRow + 2, 4))     With GSh.ChartObjects(1).Chart    '<==ここから末まで修正    .SetSourceData Source:=tgRange1 'セット    .HasTitle = True    .ChartTitle.Text = DSh.Cells(KoumokuRow, ColNum1).Value   End With End Sub

  • エクセルのグラフで横軸を最新の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

  • グラフに横棒を引きたい(追加質問)

    いつもお世話になっております。 12/13に下記のご回答をいただいて複数のBookに展開し始めたのですが、どうしても追加の機能が必要なケースがあることに気付いたので追加のお願いです。 これができないと展開できるBook、対象列が限られてしまい非常に勿体無いので、これだけは何としても解決したく追加の質問させていただきます。 尚、実Bookに展開するにあたり、「グラフ」は半角に、グラフ確認用のシートのA~D列に保護解除のコードを修正、追加しています。 急ぎませんので何とか宜しくお願い致します。 <必須機能> 【対象とする列の最下行(1048576行目)から上方向に1行ずつチェックして数値、あるいは計算結果が数値になっている最初のセルにしたい】です。 Sub グラフ確認() Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "グラフ" 'グラフ描写シート名 Const ShNameGK = "グラフ確認用" Const XCol = 2 '横(項目)軸ラベル列番号 Const LineDataRow1 = 6 'プラス3σ行位置 Const LineDataRow2 = 7 'マイナス3σ行位置 Const KeyRow = 2 '採用データ数格納行番号 Dim GSh As Worksheet Dim DShj As Worksheet Dim KSh As Worksheet Dim SRow As Long 'グラフ用データ開始行 Dim ERow As Long 'グラフ用データ終了行 Dim tgRange1 As Range 'データ群範囲 Dim MaxRows As Long 'データ範囲に指定する最大行数 Dim ColNum1 As Long '1つ目データ格納列 Set GSh = ThisWorkbook.Sheets(ShNameGr) Set DSh = ThisWorkbook.Sheets(ShNameGD) Set KSh = ThisWorkbook.Sheets(ShNameGK) GSh.Select GSh.Unprotect MaxRows = DSh.Cells(KeyRow, Columns.Count).End(xlToLeft).Value ColNum1 = DSh.Cells(KeyRow, Columns.Count).End(xlToLeft).Column ERow = DSh.Cells(DSh.Rows.Count, ColNum1).End(xlUp).Row '<==ここ If ERow < MaxRows + SRowNum Then SRow = SRowNum Else SRow = ERow - MaxRows + 1 End If Sheets("グラフ確認用").Select Columns("A:D").Select ActiveSheet.Unprotect Sheets("グラフ").Select KSh.Cells.ClearContents KSh.Cells(1, 1).Value = "行見出し" KSh.Cells(1, 2).Value = "データ" KSh.Cells(1, 3).Value = "プラス3σ" KSh.Cells(1, 4).Value = "マイナス3σ" '横見出し複写 Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)).Copy _ KSh.Cells(2, 1) 'データ複写' Range(DSh.Cells(SRow, ColNum1), DSh.Cells(ERow, ColNum1)).Copy _ KSh.Cells(2, 2) 'プラス3σ複写' Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ DSh.Cells(LineDataRow1, ColNum1).Value 'マイナスσ複写' Range(KSh.Cells(2, 4), KSh.Cells(ERow - SRow + 2, 4)).Value = _ DSh.Cells(LineDataRow2, ColNum1).Value Set tgRange1 = _ Range(KSh.Cells(2, 1), KSh.Cells(ERow - SRow + 2, 4)) With GSh.ChartObjects(1).Chart '<==ここから末まで修正 .SetSourceData Source:=tgRange1 'セット .HasTitle = True .ChartTitle.Text = DSh.Cells(KoumokuRow, ColNum1).Value End With End Sub

  • エクセルで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 '項目名格納行番号

  • FXの予測トレーニングを作成中。excelのVBでグラフを自動描画。範

    FXの予測トレーニングを作成中。excelのVBでグラフを自動描画。範囲を指定する方法がわからない。 FXの動きを予測するトレーニングのためにExcelのプログラムを作成中です。 データをインポートして、ボタンを押すごとにひとつずつローソクを描画するプログラムを考えています。 MT4でデータエクスポートでexcelファイルを作成します。 I~N列、1~100行(最初はデータなし)を選択してローソク足のグラフを描くようにしておきます。 (この時は、グラフの枠のみが表示) ボタンを押すごとにB~G列の1行のデータをI~Nに転記することでグラフを書かせます。 Cells(3, 16)はグラフ開始行の指定。(通常は1を入力しておく。) <ボタンを押したときのサブルーチン> Dim AM As Single AM = Cells(3, 16) Cells(AM, "i") = Cells(AM, "b") Cells(AM, "j") = Cells(AM, "c") Cells(AM, "k") = Cells(AM, "d") Cells(AM, "l") = Cells(AM, "e") Cells(AM, "m") = Cells(AM, "f") Cells(AM, "n") = Cells(AM, "g") Cells(3, 16) = AM + 1 Calculate End Sub これだと、最初に1~100行を指定しているので、100行を超えるとデータは転記されるが、グラフは変わりません。 100行を超えたら、1~101、2~102と変えていくためには、 Calculateの前にグラフ範囲を指定する命令が必要かと思いますが、誰か教えてください。

  • エクセル マクロ ファイルを開きグラフ作成

    VBAを使用して、エクセルファイルをユーダで選択し読み込み 読み込んだエクセルデータからグラフを作成したいと考えています。 コマンドボタンに下記の通り入力しファイルを読み込みました。 Sub ファイルを開いてセルに表示() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If OpenFileName <> "False" Then Filename = Dir(OpenFileName) ActiveSheet.Cells(1, 7) = Filename Else MsgBox "キャンセルされました" End If End Sub 読み込んだエクセルファイル、Sheet1をデータとして下記の マクロを実行してグラフを作成したいのですが、どのように手直しを 行ったらよいのか分からないので教えて頂けないでしょうか。 Sub グラフを作成し別シートに貼り付け() '可変範囲折れ線グラフを作成 Dim hani As String shname = ActiveSheet.Name 'シート名を記憶 rmax = Range("A2").End(xlDown).Row '最終行 hani = "C1:C" & rmax & ",E1:E" & rmax Range(hani).Select Charts.Add ActiveChart.ChartType = xlLine ActiveChart.Location Where:=xlLocationAsObject, Name:=shname ActiveChart.SeriesCollection(1).XValues = "='" & shname & "'!R2C1:R" & rmax & "C1" '折れ線グラフを切り取り貼り付け ActiveChart.Parent.Cut Worksheets.Add(after:=Worksheets(Worksheets.Count)) _ .Name = Format(Now(), "グラフ1") ActiveSheet.Paste With Range("A1:F16") ActiveSheet.ChartObjects("グラフ 1").Width = .Width ActiveSheet.ChartObjects("グラフ 1").Height = .Height End With ActiveSheet.ChartObjects(1).Name = "全体グラフ" End Sub

  • エクセルVBA(掛け算)

    いつもおせわになります。 現在、下記のようなコードを書いてますがどうもうまくいきません。よろしくお願いいたします。 M列 = K列 × N列を6行目から最終行目で入れたくて下記のようなコードを書きました。 ところが・・・N列にはデータのない場合があるので、If~を入れてみました。ここまではうまくいったのですが、 O列 = K列 × P列のように数式を入れたい列が他にもあり、又同じコードを下記のように書いたら、P列にデータがないところで止まってしまいます。 '///////////////////////////////////////////// Dim wsS As Worksheet Dim r As Long Dim Srow As Long Set wsS = Worksheets("syukei") Srow = wsS.Range("D65536").End(xlUp).Row With Worksheets("syukei") For r = 6 To Srow If Cells(r, 12) = Noting Then r = r End If Cells(r, 13) = Cells(r, 11) * Cells(r, 12) Next End With With Worksheets("syukei") '↓////////ここらへんで止まる////////// For r = 6 To Srow If Cells(r, 14) = Noting Then r = r End If Cells(r, 15) = Cells(r, 11) * Cells(r, 14) Next End With End Sub 掛け算を入れたい行は、下記のようになっています。 M列=K列×L列 O列=K列×N列 Q列=K列×P列 S列=K列×R列 U列=K列×T列 W列=K列×V列 Y列=K列×X列 よろしくお願いいたします。

専門家に質問してみよう