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

このQ&Aのポイント
  • 約半年前の質問の再質問です。17行目以降にデータの入った表の2行目に数値(a)を入れるとその列の最下行からa個のデータ数でグラフ化される。同時に同じ列の11行目、12行目の値で2本の横棒をグラフに描きたい。
  • 下記のVBAの不具合内容は、グラフ確認シート(補助シート)には「行見出し」と指定した列の指定数のデータが正しくコピーされますが、C列、D列(プラス3σとマイナス3σ)は空白のままになってしまいます。(当方の実シートの再現)また、「F8」を押すと1つずつコードが実行されると知り実行してみると、プラス3σ(11行目)のコピーでエラーになります。
  • 質問者は半年前に下図のVBAを使用してグラフを作成しようとしたが、うまく行かず一旦保留した。しかし、質問者はまだ解決のために努力し続けており、前回の回答で提案された方法を試してみたが、同じ不具合が発生したため、再度質問をすることになった。
回答を見る
  • ベストアンサー

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

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

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

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

Sub test3()  Const SRowNum = 17 'データ開始行番号  Const KoumokuRow = 5 '項目名格納行番号 以下省略 End Sub ↑のコードをsheet1モジュールに配置しているのであれば Module1に配置してください。 sheetモジュール(厳密にはMicrosoftExcelObject)に配置することは 想定していません。

akira0723
質問者

お礼

うまくいきました!!!! 当方のHohoPapaさんの予測以上の無知が原因でした。 本業が忙しい中、本当に申し訳なく、ありがたく。 明日から多くのBookにコツコツ展開していきます。 感謝! 感謝!! 感謝!!!

その他の回答 (5)

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

当方では再現できないので、ぶっちゃけ、わかりません。 そこで https://drive.google.com/file/d/1rULLnMydcjeG8L6Ef4T6c7dOf9Scb6y2/view?usp=sharing に、 当方で指摘のエラーの発生しないブックをポストしましたので 確認してみてください。

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

>何度かやって見ましたが黄色の行はでません。 私に誤解があるかもしれません。 当スレッド冒頭で提示されたシートたちのブックは 新規ブックを新たに開き、提示されたコードを配置して実行していると 思っていました。 そうではなく、 課題ブックには提示されたコードのほかにも マクロが書き込まれているものと思います。 その1つが、 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) で始まるコードですね? これは、ブックを閉じるときに動作するマクロですので 今回の挙動には関係ないと思います。 そこで、課題ブックに書き込まれたコード全数を 配置先(標準モジュール、シートモジュール、workbookモジュール)を明示して ポストしてください。 その中のコードと課題コードの兼ね合いの可能性を疑っています。

akira0723
質問者

補足

お手数をおかけしております。 今回の再質問に際し当方も他のVBAとのバッティングを疑い、 新規ブックを新たに開き、提示されたコードを配置して実行しています。 (ですから保護VBAの話は矛盾していました) 今自宅でも再度新規ブックに質問のコードをコピペし試行して見ました。 念のために各シート、This Book、標準モジュールすべてが空白であることも確認しました。 やっぱり同じようにC列、D列には数値がコピーされずに 「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」 と出ます。 いま気付いたのですが、このエラーが表示されているときにカーソルをエクセルシート上に動かすと◎がクルクル回っているような形になっています。(ハングアップした時のマークです) この状態で エラーMsgで「OK」をクリックすると黄色の行が出ずに元の状態に戻ります。 (A列、B列には正しく値がコピーされています) F8で1行づつ実行すると > 'プラス3σ複写' > Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ > DSh.Cells(LineDataRow1, ColNum1).Value から次の行に移動したときに上記のエラーMsgが出ます。

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

繰り返します。 さらに、エラーメッセージでデバックボタンを押せば どこかの行が黄色くなるはずです。 その行がどれなのかを教えてください。 また、当方本業に追われていることから このスレッドに参戦できるのは、平日はこの時間だけです。 コメントを気長に待つか、 他の識者のスピーディーなコメントに期待してください。

akira0723
質問者

補足

お手数をお掛けします。 何度かやって見ましたが黄色の行はでません。

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

まず、落ち着いてください。 感想や推測、予想などの返答は無用です。 単に、事実だけを書いてください。 続いて、私の追及しているポイントは、 このスレッドの最初に提示されたコードとシートで起きるエラー これを特定することです。 あれやこれや、本番のコードや過去の機能追加部分を登場させるのはやめ、 このスレッドの最初に提示されたコードとシート これに対して 'プラス3σ複写' Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ DSh.Cells(LineDataRow1, ColNum1).Value この記述を 'プラス3σ複写' Debug.Print "ERow:" & ERow '<==追加 Debug.Print "SRow:" & SRow '<==追加 Debug.Print "複写先行末:" & ERow - SRow + 2 '<==追加 Debug.Print "複写元数値:" & DSh.Cells(LineDataRow1, ColNum1).Value '<==追加 Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ DSh.Cells(LineDataRow1, ColNum1).Value に書き換えて実行し 過日紹介したイミディエイトに表示される内容を 教えてください。 また、エラーメッセージも教えてください。、 さらに、エラーメッセージでデバックボタンを押せば どこかの行が黄色くなるはずです。 その行がどれなのかを教えてください。

akira0723
質問者

補足

お世話になります。 ご指摘の通り、そちらとの相違点として「シート保護」に思い当たって慌てて確認不十分で報告してしまいました。 ご指示の試行結果は下記の通りです。 新しく添付と同じ構成の入力表(17行目から60行目に数値)を作り、データ指定数10個、11行目の値「11」で実行しました。 「グラフ確認用」シートには下記のようにC列、D列には1行目に項目名のみが表示されるだけで値のコピーはされずに不具合を再現しました。 (A列、B列は期待通りのデータが表示されました) エラーMsgは 実行時エラー"1004" アプリケーション定義またはアプリケーション定義のエラーです ERow:60 SRow:51 複写先行末:11 複写元数値:11 行見出し データ プラス3σ マイナス3σ 35 44 36 45 37 46 ・ ・ ・ ・ 44 53

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

提示された画像が見にくく、まったく同じにすることができず、 そのためなのか、エラーを再現できません。 そこで、 'プラス3σ複写' Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ DSh.Cells(LineDataRow1, ColNum1).Value この記述を 'プラス3σ複写' Debug.Print "ERow:" & ERow '<==追加 Debug.Print "SRow:" & SRow '<==追加 Debug.Print "複写先行末:" & ERow - SRow + 2 '<==追加 Debug.Print "複写元数値:" & DSh.Cells(LineDataRow1, ColNum1).Value '<==追加 Range(KSh.Cells(2, 3), KSh.Cells(ERow - SRow + 2, 3)).Value = _ DSh.Cells(LineDataRow1, ColNum1).Value に書き換えて実行し 過日紹介したイミディエイトに表示される内容を 教えてください。 また、エラーメッセージも教えてください。

akira0723
質問者

お礼

すみませ~~ん! 取り急ぎ経過報告! 恐らく原因はグラフ確認シートに保護がかかってしまうことではないかと思い当たりました。 かなり前にここで(恐らくHohoPapaさんに)入力されたセルだけに保存時に保護がかかる下記のコードを教わりこの種の全てのBookに採用しています。 このマクロが原因ではないかと思い当たり、This Bookからコードを削除したのですが、何故かマクロ実行後は保護がかかってしまいます。 これを外して試してみようとしたのですが何故かThis Bookのコードを削除してもうまく行かず。 そうこうしているうちにエディターウィンドウの表示がおかしくなってしまってこれを元に戻せなく・・・ 取り敢えず上記思い付きを「連絡せねば」とお礼枠に描きました。 これで連絡枠が無くなりましたので、この後何か分かっても報告不可ですのでご了承ください。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("成績表(提出)").Select Range("A1").Select Selection.ClearContents Sheets("入力表").Select Range("D2:K2").Select Selection.ClearContents Const MyPassword = "" 'パスワード(省略可) Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets sh.Unprotect Password:=MyPassword With sh.Cells '全セルのロックを外す .Locked = False '定数が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeConstants).Locked = True '数式が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeFormulas).Locked = True End With sh.Protect DrawingObjects:=True, Contents:=True, _ Scenarios:=True, Password:=MyPassword Next On Error GoTo 0

akira0723
質問者

補足

毎度、毎度、・・・・・です。 早速試してみたのですが、どうもご指示の内容通りに出来ていないように思われます。 ご回答の通りに”プラス3σ”の処のコードのみを変更して(Test 12/8)実行するも、イミディエイトWinには何も表示されず。 そこで過去のTest No3に戻して実行するも何も表示されず。 色々やっているうちに気付くとWinに何やら表示が。 それで更に同じことを繰り返してみて、表示が出るのはプロシージャーの実行時ではなく、2行目の数値を入力、削除した時だとわかりました。 そこで一旦全部元の状態に戻して過去のTest No3と今回のTest 12/8で2行目を操作した時にWinに表示されたコメントが下記です。 エラーMsgは、 Test No3は「アプリケーション定義またはオブジェクトの定義エラー」 Test 12/8は「実行時エラー”9”」 「インデックスが有効な範囲にありません」 でした。 HohoPapaさんの方ではやっぱり正常に動くということなので1つ気になったのは、「グラフ」シートに最初に準備するグラフは、入力表の適当な1列のデータで作成したグラフを「グラフ」シートに貼り付けているのですが、この事前に準備しておくグラフの作成方法が違っていないでしょうか? 一応3系列のグラフや事前に「グラフ」シートに元グラフを作成しないケースも試してみたのですがどれも駄目でしたが気になりました。 当方が勝手に推測するのは、 「グラフ確認」シートに11行目と12行目の数値がコピーされればグラフ化される気がするので、あと少し?何か基本的なことが修正出来ればと思っての再質問です。 しつこくて本当にすみません。 ただ、この課題は常に思っていることであり、またもう少しの感じがしてならないので何とかお願いします。 ここまで手間をかけてもらっているので何とか完成したい!!! Test No3 開始行: 17 / 終了行: 17 / 対象列番号: 3 開始行: 39 / 終了行: 68 / 対象列番号: 10 開始行: 39 / 終了行: 68 / 対象列番号: 8 開始行: 39 / 終了行: 68 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 6 開始行: 40 / 終了行: 69 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 7 開始行: 40 / 終了行: 69 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 9 開始行: 40 / 終了行: 69 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 4 開始行: 17 / 終了行: 17 / 対象列番号: 3 開始行: 40 / 終了行: 69 / 対象列番号: 5 開始行: 39 / 終了行: 68 / 対象列番号: 5 開始行: 39 / 終了行: 68 / 対象列番号: 5 開始行: 40 / 終了行: 69 / 対象列番号: 5 Test 12/9 開始行: 17 / 終了行: 17 / 対象列番号: 3 開始行: 39 / 終了行: 68 / 対象列番号: 10 開始行: 39 / 終了行: 68 / 対象列番号: 8 開始行: 39 / 終了行: 68 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 6 開始行: 40 / 終了行: 69 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 10 開始行: 40 / 終了行: 69 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 7 開始行: 40 / 終了行: 69 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 9 開始行: 39 / 終了行: 68 / 対象列番号: 9 開始行: 40 / 終了行: 69 / 対象列番号: 6 開始行: 39 / 終了行: 68 / 対象列番号: 7 開始行: 39 / 終了行: 68 / 対象列番号: 4 開始行: 40 / 終了行: 69 / 対象列番号: 8 開始行: 40 / 終了行: 69 / 対象列番号: 4 開始行: 17 / 終了行: 17 / 対象列番号: 3 開始行: 40 / 終了行: 69 / 対象列番号: 5 開始行: 39 / 終了行: 68 / 対象列番号: 5 開始行: 39 / 終了行: 68 / 対象列番号: 5 開始行: 40 / 終了行: 69 / 対象列番号: 5

関連するQ&A

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

    いつもお世話になっております。 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

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

    いつもお世話になっております。 つい先日、ここで指定した列の最下行から指定したデータ数で自動でグラフを作成する下記のコードを教えていただきました。 それを色んな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

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

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

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

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

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • グラフの「項目軸ラベルに使用」をVBAで

    VBAで項目軸ラベルの範囲を設定したいのですが分からないので教えてください。データ系列は以下で入れられるのですが・・・ Dim R1 as Range Dim R2 as Range Dim n as Integer Range("a1").Select n=range("h1").value Set R1 =Range(Cells(1,1),Cells(n,1)) Set R1 =Range(Cells(1,2),Cells(n,2)) Sheets("グラフ").Select With ActiveChart .SetSourceData R1 たぶんここに入れるのでは・・・ End With Set R1 = Nothing Set R2 = Nothing

  • VBA 切り分けがうまくいかない

    A列のデータで切り分けるようプログラム作成しています。 あるデータをA列で切り分けることができましたが、切り分けた後のファイル内容を確認したら、E列以降の内容が元データと異なっていました。 E列にはプルダウンメニューを入れていますので、それが原因かと思い、プルダウンメニューを消した元データで切り分けてみましたが、解決できませんでした。 他のデータ(プルダウンなし・空欄なし)では問題なく正しい内容で切り分けることができています。 フルダウン入りや空欄があるデータだと、正確に切り分けることができないかどうかご教示いただけますと幸いです。 VBAを作った担当者は異動してしまったため、直すことができませんでした。 宜しくお願いします。 Sub Macro5() ' ' Macro5 Macro ' Dim txtFilename As String '元のファイル名 Dim txtS As String '分類名保存用 Dim htxtS As String '定形文保存用 Dim cRow As Integer '行数カウント用 Dim sRow As Integer '行数保存用 Dim eRow As Integer '最終行格納用 Dim h As Integer 'データ入力行保管用 Dim j As Integer 'データ入力開始列 Dim i As Integer '分類項目列保管用 Dim e As Integer '分類項目最終行数保管 i = Cells(18, 9).Value '分類項目列取得 j = Cells(14, 9).Value 'データ入力開始列 h = Cells(14, 11).Value 'データ入力行取得 htxtS = Cells(21, 9).Value '定型文取得 '元ファイル名(=同じフォルダ)を取得する txtFilename = Dir(ThisWorkbook.Path & "¥*.xlsx") 'ファイルを開ける Workbooks.Open ThisWorkbook.Path & "¥" & txtFilename Sheets(1).Activate '分類項目の最終行を取得する e = Cells(h, i).End(xlDown).Row '分類項目でソートを掛ける Cells(h - 1, j).Activate Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.AutoFilter ActiveWorkbook.Worksheets(1).AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).AutoFilter.Sort.SortFields.Add Key:= _ Range(Cells(h - 1, i), Cells(e, i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _ :=xlSortNormal With ActiveWorkbook.Worksheets(1).AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With sRow = 0 cRow = h eRow = h '対象項目の行が無くなるまで繰り返す Do Until cRow > eRow '対象シートを新しいブックに貼り付ける Worksheets.Select Worksheets.Copy Sheets(1).Activate ' 項目名(=ファイル名)の退避 Cells(h, i).Select txtS = ActiveCell.Value '1つ目の分類項目を格納 ' 最終行の取得 eRow = Cells(h - 1, i).End(xlDown).Row cRow = h '分類項目が変わるまで繰り返す Do While txtS = Cells(cRow, i).Value cRow = cRow + 1 '1行加算 Loop '最終行が1行の時は削除されないように対象分類項目以下を削除をスキップする If cRow <> eRow + 1 Then '対象分類項目以下を削除 Rows(cRow & ":" & eRow).Select Selection.Delete End If '対象分類の行数を保存 sRow = cRow - 1 'ファイル名を指定して保存 Cells(1, 1).Activate Selection.AutoFilter With ActiveWorkbook .SaveAs ThisWorkbook.Path & "¥" & htxtS & txtS & ".xlsx" '元ファイルと同フォルダに保存する .Close End With '元のファイルに戻りファイル作成済みの項目を削除 Windows(txtFilename).Activate Sheets(1).Activate ActiveWindow.SelectedSheets(1).Select Rows(h & ":" & sRow).Select Selection.Delete Shift:=xlUp Cells(1.1).Activate Loop MsgBox ("ファイル分割処理が終了しました") '元ファイルを保存せずに閉じる Workbooks(txtFilename).Close SaveChanges:=False End Sub

  • VBA(エクセル)のコンパイルエラー

    お世話になります。 下記のマクロを記述したのですが、ウエから7行目の mid(Cells(i, colNum + 1).Value, 7, 11) のところで、下記のようなコンパイルエラーが出てしまいます。 試しに".Value"をとっても見ましたが、結果は同じでした。 どこをどう直せばよろしいのでしょうか、よろしくご指南くださいませ。 Sub mid_ac() Dim i As Integer Dim colNum As Integer i = 2 colNum = ActiveCell.Column Do Until Cells(i, 1).Value = "" Cells(i, colNum).Value = mid(Cells(i, colNum + 1).Value, 5, 10) i = i + 1 Loop End Sub コンパイルエラー: モジュールではなく、変数またはプロシージャを指定してください (ちなみに、このマクロは選択したセルの右隣にあるセルの左から5文字目~10文字目までを、表示させるものです。答えて下さる方には老婆心かもしれません。。。)

専門家に質問してみよう