• ベストアンサー

エクセルの条件抽出と集計

 エクセルで下記のとおり、毎日各社で交換しなければ、ならない部品があり 以下のフォームの例で集計していますが、例えば、11日と12日の集計とか11日から14日の集計とか できるVBA等があればご教示ください。また集計期間〇日とか表示できれば助かります。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です。 マクロが途中で止まる!というコトですが、 前回のコードでエラーが出る場合は (1)セル内が文字列である (2)インプットボックスに入力した数値だけSheet数がない 等の理由が考えられますが、 こちらではマクロが止まる理由がちょっと思い浮かびません。 今一度以下のコトを確認してみてください。 前回、アップした画像通り各シートのレイアウトはすべて一致している (1列・1行でも違う場合は意図しない結果になると思います) 次に「集計用Sheet」がSheet見出しの一番左側に配置してあり、 10-1 SheetはSheet見出しの左から2番目 10-2 SheetはSheet見出しの左から3番目 ・・・ と順序良く並んでいる。 以上を踏まえて、補足にある .Cells(i, j) = .Cells(i, j) + Worksheets(k).Cells(i, j) Next k Next j Next i .Range("B1") = staS & "日" .Range("D1") = endS & "日" .Range("E1") = endS - staS + 1 & "日間" のコードの説明をさせていただくと これらのコードはすべて With~End With の中に入っていますので、 >.Cells(i, j) = .Cells(i, j) + Worksheets(k).Cells(i, j) は細かく書くと >Worksheets(1).Cells(i, j) = Worksheets(1).Cells(i, j) + Worksheets(k).Cells(i, j) となり、Sheet見出しの一番左側Sheetのi行・j列目は インプットボックスで入力した最初のSheet~最後のSheetのi行・j列を順に合計! といった意味になります。 endRow = .Cells(Rows.Count, "A").End(xlUp).Row (Worksheets(1)のA列最終行) endCol = .Cells(2, Columns.Count).End(xlToLeft).Column (Worksheets(1)の2行目最終列) を取得していますので、 For i = 3 To .Cells(Rows.Count, "A").End(xlUp).Row (Worksheets(1)の3行目~A列最終行まで) For j = 2 To .Cells(2, Columns.Count).End(xlToLeft).Column (Worksheets(1)の2列目~2行目(項目行)の最終列まで) For k = staS + 1 To endS + 1 (インプットボックスに入力した最初の日付Sheet~最後の日付Sheetまで) とループさせています。 ※ 今入力中に気づいたのですが、せっかく最終行・最終列を取得しているので >For i = 3 To .Cells(Rows.Count, "A").End(xlUp).Row は >For i = 3 To endRow >For j = 2 To .Cells(2, Columns.Count).End(xlToLeft).Column は >For j = 2 To endCol で十分ですね。 最後の .Range("B1") = staS & "日" .Range("D1") = endS & "日" .Range("E1") = endS - staS + 1 & "日間" 部分はWorksheets(1)の B1・D1・E1各セルに画像のように表示させているだけです。 以上長々と書きましたが 結局、マクロが止まる原因ではないのですが、 今回はこの程度で・・・m(_ _)m

wakaran01
質問者

お礼

ほんとうに、ありがとうございます。 関数初心者の自分でも、理解することができました。 いやーほんとうに助かりました、 ありがとうございます!

wakaran01
質問者

補足

できました! ほんとうに、理解しやすく説明していただき感謝です。 原因は、10-1 SheetはSheet見出しの左から2番目     10-2 SheetはSheet見出しの左から3番目 これでした。正しくソートし、日付も確認したらできました

その他の回答 (1)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一例です。 ↓の画像のようにすべてのSheetが同じ配置になっていて、Sheet見出しの2番目以降は 10-1 10-2 ・・・10-31 のように日付順にSheetが並んでいるという前提です。 画像は「集計用Sheet」(Sheet見出しの一番左側)のSheetで、1行目が表示されていますが、 各日付Sheetは1行目はないものとします。 一番簡単な方法は「串刺し計算」だと思います。 仮に4日~6日までの集計をする場合 「集計用Sheet」のB3を選択 → 画面左上のオートサムアイコン(Σ)をクリック → 集計したい最初の日付Sheetを選択 → そのSheetのB3をクリック → Shiftキーを押しながら集計したい最終日のSheet見出しをクリック! これで「集計用Sheet」のB3セルには =SUM('10-4:10-6'!B3) という数式が入りますので、これを列・行方向にオートフィルでコピー! これで3日間の集計結果が表示されます。 (1行目は表示されません) どうしてもVBAで!というのであれば、一例です。 「集計賞Sheet」(一番左側Sheet)のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub 集計() 'この行から Dim i As Long, j As Long, k As Long, staS As Long, endS As Long, endRow As Long, endCol As Long staS = InputBox("検索開始日を入力") endS = InputBox("検索終了日を入力") With Worksheets(1) endRow = .Cells(Rows.Count, "A").End(xlUp).Row endCol = .Cells(2, Columns.Count).End(xlToLeft).Column .Range("B1,D1,E1").ClearContents Range(.Cells(3, 2), .Cells(endRow, endCol)).ClearContents For i = 3 To .Cells(Rows.Count, "A").End(xlUp).Row For j = 2 To .Cells(2, Columns.Count).End(xlToLeft).Column For k = staS + 1 To endS + 1 .Cells(i, j) = .Cells(i, j) + Worksheets(k).Cells(i, j) Next k Next j Next i .Range("B1") = staS & "日" .Range("D1") = endS & "日" .Range("E1") = endS - staS + 1 & "日間" End With End Sub 'この行まで ※ マクロ実行の場合のみ画像のように1行目が表示されます。 (「~」のC1セルはあらかじめ入力しておいてください) こんな感じではどうでしょうか?m(_ _)m

wakaran01
質問者

補足

親切な回答ありがとうございます。 試してみたのですが、 以下部分で中断します。 お手数おかけしますが以下の部分の意味が わかりません。教えてください。 .Cells(i, j) = .Cells(i, j) + Worksheets(k).Cells(i, j) Next k Next j Next i .Range("B1") = staS & "日" .Range("D1") = endS & "日" .Range("E1") = endS - staS + 1 & "日間" End With End Sub 'この行まで

関連するQ&A