• ベストアンサー

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

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

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

※1の行を間違えていたようです。 後記高度でいかがでしょうか? Option Explicit Sub GraphSauceChange8_2()  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つ目範囲  Dim MaxRows As Long 'データ範囲に指定する最大行数  Set GSh = ThisWorkbook.Sheets(ShNameGr)  Set DSh = ThisWorkbook.Sheets(ShNameGD)  MaxRows = DSh.Range("B1").Value  GSh.Select  ActiveSheet.Unprotect    ERow = DSh.Cells(DSh.Rows.Count, ColNum1).End(xlUp).Row '※1  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
質問者

お礼

おはようございます。 他のご回答者様のご指摘の通り、おんぶに抱っこで本当にすみません。 このコードを使い慣れており、マニュアルも作成済みなのでこれの改定でお願いしたかったので。 朝一で確認し期待通りの結果が得られました。 ただ、前後に他のマクロを付け足しているのでこれとの相性?をこれから試行錯誤してみます。 一応コード中でデーター数を決めるケースが出来上がっているので何とかなる(ハズ)と思っているのですが。。。 どうしようも無くなったらまた宜しくお願いします。

akira0723
質問者

補足

いつもお世話になります。 約1時間かかりましたが、何とかなりました。 ご回答のグラフ化の前に区切り位置で指定の列にグラフ対象データを持ってこないとグラフ化できないのですが、この自作のVBAと相性が悪く???? 後はクローズ時や次の測定のために元の状態に戻すイベントVBAの修正・・・等々 諦めて「降参」しようかと思いましたがあまりに恥ずかしいのと、また抜けが出そうでお手数をかけてしまうと頑張って試行錯誤で何とかなりました!!!!

その他の回答 (2)

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

求めているものは、 ・入力表シート上にグラフを反映する ・データの行数を入力表シートのB1セルの値とする ということと思います。 入力表シート上に既に、グラフが作成されている前提で、 以下のコードになると思います。 Sub GraphSauceChange8_2()  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つ目範囲  Dim MaxRows As Long 'データ範囲に指定する最大行数  Set GSh = ThisWorkbook.Sheets(ShNameGr)  Set DSh = ThisWorkbook.Sheets(ShNameGD)  MaxRows = DSh.Range("B1").Value  GSh.Select  ActiveSheet.Unprotect    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
質問者

お礼

原因と言うか不具合の詳細が分かりました。 下記のコードで項目名格納行番号は正しく反映されるのですが、データの数がB1セルで決定されるのではなく、 データ開始番号の行数までのデータで作図されます。 下記の場合は項目名を17行目にして、18行目から30行目までのグラフになるようです。 >Const SRowNum = 30 'データ開始行番号 >Const KoumokuRow = 17 '項目名格納行番号 ========================= 当方の表の書式が原因かもしれませんが、分析機器からエクセルシートに出力される形式なのでこれに合わせ込むしかない状況です。 出力結果はD列の上部に測定条件等が出力されて、17行目に項目、続けて18行目から空白なくデータが10秒置き(設定条件)で測定完了まで出力されます。 正式なソフトでないので、計測時間と測定数値がスペースを挟んで同じセルに入っているので、まずマクロでスペースを区切り位置にしてD列に時:分:秒、E列に測定数値が配置されるように細工しています。 D列(X軸)は0:00:00で10秒刻みに出力されます。 区切り位置マクロでDとE列に分けられた表を元にグラフを作図するのが目的です。 測定が3分で終わる場合と15分以上のケースがあるのでB1セルにデータ数をカウントして、そのデータ数で作図したいのです。 お礼枠を使ってしまったので今後何か勘違いに気付いても追加情報は上げられませんのでご了承ください。 何とか宜しくお願いします。

akira0723
質問者

補足

おはようございます。 朝一で取り組んでいますが久々にうまくいかず。 最初に作ってあるグラフ(特性曲線)が消えてしまいます。(よってY軸の値が自動で0-1に更新されます) エラーが出なくなったのでマクロは正常に動いているようですが、F8で1つずつ動かしてみると最後の4行のコードの、 上の2行でグラフがクリアされ、最後の2行でグラフタイトルと下部に凡例が表れてVBAは正常に終了するようです。 ちなみに表のD列(横軸)の17行目に項目名(TIME)とデータ列のE列の17行目にタイトルが入っており、1-16行目は空白セルを含む文字列(測定条件)が入っています。 指定行より上部のセルは関係ないと思ったのですが、最初にエラーになった際にX軸に上部のセル値が入ったので1-16行目までのセルは空白にして試しています。(当方の設定間違いの可能性あり) 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

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

この質問は丸投げの無料仕事委託ではないですか? 中途まではWEBでしらべて質問すべきでしょう。 今どきでは、Chat-GPTでも質問してみたらどうか。 ーー Sheet1 コマンドボタンを1つ貼り付ける。 Sheet2 データを作製しておく。 A列、B列、C列 最低で2列、列データを増やしても可。 氏名 国語 数学 山田 77 56 植田 71 72 千田 82 93 下田 59 51 植田 43 79 黒田 49 ここでCTRLキーを押しながら、マウスで、例えば、氏名列と数学列を範囲指定する。 氏名列と国語列と数学列を指定して実行することも可能。 ーー Sheet1のボタンをclick Sheet3にグラフが現れる。この例では棒グラフ。 ーー VBA関係 Sheet1のコマンドボタンをclickする。すると Sheet1のシートモジュール(イベントモジュール)に Private Sub CommandButton1_Click() End Sub が出る。 Private Sub CommandButton1_Click() test01 End Sub にする。 test01 (名前は何でもよい)というモジュールを作ることが本件の最大の目的。 ーー 標準モジュールに '//------------------------'データ列1列 Sub test01() 'Sheets("成績表").Select 'heets(Sheet1).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 GSh = Sheets("Sheet2") ' 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)) 'ーーーー MsgBox "AAA" '既製グラフ抹消 'グラフ化するシートデータ設定 With Worksheets("Sheet2") .Activate Set tgRange1 = Selection MsgBox tgRange1.Address '確認用 End With Set ChartObj = Sheets("Sheet3").ChartObjects.Add(120, 10, 400, 200) 'ChartObjects とs付き Set Chart1 = ChartObj.Chart Chart1.SetSourceData Source:=tgRange1 'データ部分を指定 'GSh.ChartObjects(1).Chart.SeriesCollection(1) = Selection 'KoumokuRow, ColNum1).Value ' ' GSh.ChartObjects(1).Chart.FullSeriesCollection(1).XValues = _ ' Range(DSh.Cells(SRow, XCol), DSh.Cells(ERow, XCol)) '(削除可) End Sub ワザと質問文のコードを残してコメント化している。勉強のためのつもり。 人によって違う見本。質問例の方が正統的ですが。

関連する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

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

    いつもお世話になっております。 過去にここで指定した列の下から指定の個数のデータを自動で作成するマクロを教えていただき本当に便利に多くのファイルで使用しているのですが、これが定着してきたら次の欲が出てきました。 各列の決まったセルに数字を入れて(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

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

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

    いつもお世話になっております。 約半年前の質問の再質問です。 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

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

    いつもお世話になっております。 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 '項目名格納行番号

  • エクセル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列 よろしくお願いいたします。

  • VBAで、配列のデータをセルに書き戻す方法について

    1000行200列の配列があり、配列の5列目と6列目のデータを、セルの10列目と11列目にすばやく書き戻す方法を教えてください。 (方法1) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) FOR 行番号= 1 TO 1000 CELLS(行番号,10).VALUE = DATA(行番号,5) CELLS(行番号,11).VALUE = DATA(行番号,6) NEXT (方法2) Dim DATA() As Long ReDim DATA(1 To 1000, 1 To 200) Dim WORK1() As Long ReDim WORK1(1 To 1000, 1 To 1) Dim WORK2() As Long ReDim WORK2(1 To 1000, 1 To 1) FOR 行番号= 1 TO 1000 WORK1(行番号,1) = DATA(行番号,5) WORK2(行番号,1) = DATA(行番号,6) NEXT RANGE("J1:J1000").VALUE = WORK1() RANGE("K1:K1000").VALUE = WORK2() (方法1)より(方法2)の方が早いのですが、WORKに貯めるのもめんどうなので、 RANGE("J1:K1000").VALUE = DATA(1,5), DATA(2,5), DATA(3,5),~,DATA(999,6),DATA(1000,6)のようなことができればと思います。 よろしくお願いします。

  • エクセル2013 VBA グラフのデータ系列変更

    エクセル2013を使っています。マクロ初心者です。グラフも普段あまり扱いませんので不慣れです。よろしくお願いします。 マクロの記録を使ってグラフのデータ範囲を変更したら、下記コードが記録されました(○○○はシート名です)。 ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.Axes(xlValue).MajorGridlines.Select ActiveChart.FullSeriesCollection(1).Values = "='○○○'!R189C37:R199C37" ActiveChart.FullSeriesCollection(2).Values = "='バ○○○'!R189C38:R199C38" この189と199に変数を下記のように入れました。 Dim r As Integer r = Range("A1").End(xlDown).Row Dim i As Integer Dim s As Integer s = r - 10 i = ActiveCell.Value ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.Axes(xlValue).MajorGridlines.Select ActiveChart.FullSeriesCollection(1).Values = "='○○○'!R" & s & "C37:R" & r & "C37" ActiveChart.FullSeriesCollection(2).Values = "='○○○'!R" & s & "C38:R" & r & "C38" これを実行すると、エラーコード400になっていまいます。 どうすればいいのでしょうか?

専門家に質問してみよう