• ベストアンサー

VBAで期間を指定し該当する期間のデータを合計する方法を教えてください。

お世話になっております。とても困っています。 皆さんよろしくお願いします。 1月、2月、3月・・・12月というシート名で以下のようなデータが入っているとします。 ”1月”のシートの場合 月 日 人 (1)データ (2)データ 1 1  A  10  100 1 2  A  20  150 1 9  A  15  100 1 1  B  10  200 1 5  B  10  100 ・ ・  ・   ・   ・ ・ ・  ・   ・   ・ このようなデータが1月~12月まで存在します。 このデータから、別のシート(”入力”というシート)で入力した期間に該当する日付のシートから、(1)のデータの合計値と(2)のデータの合計値を”結果”というシートに計算されるという方法を知りたいです。 是非、よろしくお願いします。 ”入力”というシート    月  日     月  日 期間 1  1  ~  2  5 ”結果”というシート   (1)計  (2)計 A 50  550 B 35  600

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

一発で算出出来る案を提示される強者が現れるかもしれませんが、とりあえず前座という事で、配列数式のお勉強をした結果を報告いたします。基本通りで何のひねりもありませんが… 1.まず、日付での抽出がやりにくいので、作業列を各月のシートに設けてください。入れる式の例: =DATEVALUE("2008/" & A2 & "/" & B2) ........A........B........C..................D........E......................F.................. ..1....月......日......月日............人......(1)データ......(2)データ.. ..2....1........1........2008/1/1....A......10....................100.............. ..3....1........2........2008/1/2....A......20....................150.............. 簡便のため、1月のデータはSheet1,2月のデータはSheet2,以下同様とします。集計は、SheetAを設けてそこで行います。 ............A.......................B.......................C........ ..1....開始月日.........終了月日................... ..2....2008/1/2.........2008/2/3................... ..3................................................................ ..4.............................(1)データ................. ..5.............................1月...................2月.... ..6....A.....................35.....................30...... ..7....B.....................10.....................10...... ..8................................................................ ..9.............................(2)データ................. 10....A.....................250...................250.... 11....B.....................100...................200.... B6セルに入れる式 {=SUM(IF((Sheet1!$D$2:$D$100=SheetA!$A6)*(Sheet1!$C$2:$C$100>=SheetA!$A$2)*(Sheet1!$C$2:$C$100<=SheetA!$B$2),Sheet1!$E$2:$E$100,""))} 配列数式ですので、Ctrl+Shift+Enterで入力確定してください。 ・行方向は算出対象範囲が変わる行は修正の必要があります。 ・列方向は抽出先シート名を変更する必要があります。置換を使うと楽です。 ・データは100行目までと余裕を持たせてありますが、目的に合わせて変更してください。大きくても(再計算に時間はかかるでしょうが)支障は無い様です。 ・言わずもがなですが、12月ヶ月のデータを集計列を設けて集計してください。

AUGGG
質問者

補足

ありがとうございます。 さっそく教えていただいた式で試してみましたが、”#VALUE”のエラーとなってしまします。 SUM関数の最後(Sheet1!$E$2:$E$100の後ろ)の「,""」はどういう意味でしょうか。 これを除くと、セルB6の結果は0となります。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • NaoDorry
  • ベストアンサー率50% (5/10)
回答No.5

各シートの列タイトル 日付|名前|データ1|データ2|チェック チェック列の数式(入力シートの日付にマッチする場合1が入ります) =IF(AND(A2>入力!$A$1,A2<入力!$B$1),1,0) 下にフィル "入力"シート A1=集計期間開始の日付を入力 B1=集計期間終了の日付を入力 ここまで出来たら各シートをcheck列で降順ソートします "結果"シートA1をクリックして、メニューのデータ→統合 集計の方法 合計 統合元範囲で各シートのcheck列が1の行を選択して追加 この時、日付の列を飛ばして名前列からデータ2までを選択します (5行目まで1が入っていたらBの1列からDの5行までを選択) 各シートを同じ作業で追加 統合の基準 上端行、左端行にチェックでOKを押すと 望みの計算結果が表示されると思います。 自動で処理したい場合は入力シートにボタンを配置して ボタンに以下のコードを登録して下さい Sub calc() Dim i, a, b As Integer Dim hani() As Variant For i = 1 To 12 'ワークシートをループ a = 1 Do While Sheets(i & "月").Cells(a, 1) <> "" '最終行を調べる a = a + 1 Loop '降順でソート Sheets(i & "月").Activate Range(Cells(1, 1), Cells(a - 1, 5)).Select Selection.Sort key1:=Range("E2"), order1:=xlDescending 'checkが1の最終行を調べる b = 2 Do While Sheets(i & "月").Cells(b, 5) <> "1" b = b + 1 Loop '統合する範囲を配列に格納 ReDim Preserve hani(i - 1) hani(i - 1) = Sheets(i & "月").Range(Cells(1, 2), Cells(b, 4)).Address(ReferenceStyle:=xlR1C1, External:=True) Next '統合する Sheets("結果").Range("A1").Consolidate _ Sources:=hani, Function:=xlSum, TopRow:=True, LeftColumn:=True End Sub ・シート名は半角数字+月として、12月まで作成しないとエラーになります。

AUGGG
質問者

お礼

ご回答ありがとうございました。 いままで「統合集計の方法」を使ったことが無かったので、勉強になりました。もう少し使い方を勉強してみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

ANo.2です。 式を入力して確定するときに、Enterでは無くて、Ctrl+Shift+Enterで行いましたか?確定後の式が、中括弧{ }で囲われていますか? これがうまくいっていないと、#VALUEになると思います。配列数式の解説は、参考URLなどでお調べ下さい。

参考URL:
http://home.att.ne.jp/zeta/gen/excel/c01p09.htm,http://pc.nikkeibp.co.jp/pc21/special/hr/hr4.shtml
AUGGG
質問者

お礼

早速のご回答ありがとうございます。 Ctrl+Shift+Enterで確定して、無事にうまくできました。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

わかりやすい方法で 1月シートに2行ほど挿入   A   B   C   D 1     A  2     B と準備 A1には =DATE(2008,入力!A2,入力!B2) A2には =DATE(2008,入力!A3,入力!B3) C1には =SUMPRODUCT((DATE(2008,$A$4:$A$8,$B$4:$B$8)>$A$1)*(DATE(2008,$A$4:$A$8,$B$4:$B$8)<$A$2)*($C1=$C$4:$C$8)*D$4:D$8) 入れて右へフィル、下フィルしてみる。 同様の2行を全てのシートへ挿入、コピィ 結果のシートには1月~12月のシートを合計を串刺しでSUM関数 月ごとにシートを分けた(多分、このままでは年毎にブックが出来る)事が集計を厄介しています。 この際、ひとつのシートに毎月のデータを縦方向にコピィして、今後もひたすら縦方向に入力したほうが良いと思います。 日付も年月日(2008/1/1)で入力しておいたほうが良いでしょう。 試しに、一枚のシートにデータ集めて、結果のシートに入れる関数を考えてみてください。 SUMPRODCUT関数でよいと思いますが、一度で集計できて、年を跨いだ期間も集計できるでしょう。

AUGGG
質問者

お礼

ご回答いただき有難うございました。 入力されたデータシートが莫大な数の行で存在するので、行数が少ないデータの際に使わせていただきます。 参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • NaoDorry
  • ベストアンサー率50% (5/10)
回答No.1

確認なのですがVBAでやらなくてはダメなんですか? このような処理はもともとエクセルの得意とするところで ワークシート関数やピポットテーブルを使うほうがよっぽど簡単です。 VBAでやるとなると、ある程度のコードを書いていただかないと 全てを書くにはあまりに長すぎると思うのですが。

AUGGG
質問者

補足

ご解答ありがとうございます。 VBAでなくても関数でできれば教えてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel関数(指定期間内のデータの合計を求めたい)

    IIシートにデータが蓄積されています。 Iシートで期間を指定してやってその合計を求めるにはどうしたらいいでしょうか? 【1ヶ月の使用量】  (1)Iシートに月初の日付を入力。  (2)Iシート内に月末の値EOMONTHで返す。  (3)IIシートで(1)(2)のデータを範囲とする合計の数量を求めたい。 何かいい方法はないでしょうか?

  • 【エクセル】指定期間合計の仕方

    エクセルで表を作成しているのですが 2014年11月    A   B   C    D 1  日付  1日  2日  3日  4日 ・・・・・・期間合計 2  肉   34   28   30  31 3  魚   47   50   38  44 4  野菜  11   12   10  14 ・ ・ ・ 合計期間入力「」 上記のような表で、1日から31日までの「肉」「魚」「野菜」の数字が入っているのですが、こちらで指定した期間の合計が出るようにしたいのですがどのようにしたらよいでしょうか? ご教授よろしくお願いします

  • エクセルVBAで 指定のデーターを指定のシートへ書き込む方法

    入力する表が 下記の通りです 日付  氏名    内容 1   Aさん   12345 2   Bさん   23456 3   Cさん   34567 2   Aさん   56789 3   Bさん   98765 5   Aさん   34986 というような表です シート名は"Aさん"という名のシートと"Bさん"というシートと"Cさん"という名のシートがあります。 そのAさんという名のシートには 日付  内容 1    2    3 4 5 6 というような 表があります。これは"Bさん""Cさん"ともいっしょです この"Aさん""Bさん""Cさん"の名前を判別して、その"内容"をAさんならAさんのシートの同じ日付の"内容"に書き込みたいのです。 結果としては、 Aさんのシート 日付  内容 1   12345 2   56789 3 4 5 6   34986 としたいのです。  どなたかよい方法御座いましたら宜しくお願い致します。

  • エクセル データ抽出と合計の方法がありますか。

    エクセル データ抽出と合計の方法がありますか。 下記のようなデータがあるとします。 A列  B列 10  111 20  222 30  111 40  111 50  333 結果を D列  E列 111  80 222  20 333  50 としたいです。 つまりB列から存在する数字列を抽出し、それに該当するA列の合計を出したい。 D列へB列に存在する数字列を手入力し、 E列へ =SUMIF(B:B,D1,A:A) と入れておいて表示されるところまでしたのですが、 「D列へB列に存在する数字列を手入力」を手入力ではなく関数で抽出してくることは可能でしょうか。 何卒ご教示いただけますようお願いします!!!

  • エクセル関数で指定した期間の合計を求める

    すみません、エクセルの関数で指定した期間の合計を求める 方法をご教授頂けませんでしょうか? ネットでも期間の指定で合計を求める等で調べてみまして、 SUMPRODUCTやSUMIF等でいろいろ試してみたのですが、 うまくできず困っています。 本当にすみませんが、何卒ご教示頂けませんでしょうか。 例えば、以下のような表があった場合で・・・ A列(日付)  B列(値) 2/1      100円 2/2      200円 2/3      100円 2/4      150円 2/5      300円          期間        金額 合計 2月1日 ~ 2月3日    400円     2月4日 ~ 2月5日    450円 このような感じです。 期間を日付で手入力する形になります。 何卒お力添え頂けますよう、宜しくお願い致します。   

  • [Excel2000]指定日付範囲でデータを絞り込みたい

    お世話になります。 指定日付範囲でデータを絞り込みたいのですが、いろいろWeb情報を巡回しても解決しないので教えてください。 例えば、A列が日付形式、B列が数値形式で入力されたシートがあった場合、指定した日付範囲のみ行を絞り込んでシートに表示させたいのですが、どのような方法が考えられるのでしょうか? 次のようなデータがシートに入力されている状態で、2000/01/01から2000/06/30までの日付でデータを絞り込みたい。 A列     B列 2000/01/01  1 2000/02/01  2 2000/03/01  3 2000/04/01  4 2000/05/01  5 2000/06/01  6 2000/07/01  7 2000/08/01  8 2000/09/01  9 2000/10/01  10 2000/11/01  11 2000/12/01  2 希望する結果は A列     B列 2000/01/01  1 2000/02/01  2 2000/03/01  3 2000/04/01  4 2000/05/01  5 2000/06/01  6 よろしくお願いします。

  • EXCELの集計(期間を指定しての合計)

    EXCEL2000で次のような集計をしたいと思っています。 A列に日付、B列に金額が入力されています。 C列に開始日、D列に終了日を入力し、その期間の金額の合計を表示させたい。 職場の環境な為、初心者でも使用できるような仕様である事を望んでいます。 宜しくお願いいたいます。

  • エクセルのデータの合計

    教えてください。 sheet1のセル、A1~A5のデータの合計を、sheet2のセルA1にSUM関数を使って、表示させてます。 次に、sheet1のセルA6~A10に入力されているデータの 合計をsheet2のセルA2に表示させたいのですが、 この際、sheet2のセルA1から、計算式を下にコピーすると、 sheet1のセルA2~A6の合計データが表示されます。 sheet1の5つのセルの各合計を、sheet2のセルに順番にコピーを使って表示させるには、どうしたらいいのでしょうか? うまく質問できていないかもしれませんが、 教えてください。

  • エクセル2003の過去データの取得方法

    職場で、成績表を作成しています。 毎日その日のデータを入力し、週間合計、月間合計、年間合計を算出してますが、このファイルは月ごとにデータを入れ替えているので、過去の月間合計データが残っていません。 現在は、月締めに年間合計シートにその月のデータを貼り付けています。 この貼り付け処理を関数やマクロを使い、自動にするベストな方法をご教授ください。 例 シート1(1週から6週のシートがあります) *毎月入れ替えています 3/1 3/2 3/3 3/4 3/5 3/6 週合計 aさん 1 2 3 4 5 6 21 bさん 1 2 3 4 5 6 21 シート7(月間) 今日の日 月間合計 aさん 1 21 bさん 1 21 シート8(年間)*このシートに毎月データを入れたい 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 aさん bさん *日々データが大量にあるため、日々データを残すとシート数が増えてしまう。 *カレンダーを作成し、月が変わった時の日付も関数で自動入力にした。 *今日の日も検索関数を使用し、自動入力にした。 *慣れない人が使用するため、汎用性をもちできるだけ自動化したい。 年間合計で行き詰ってしまいました。

  • 期間切れに該当するセルだけに色をつけたい

    一月の中で入力期間の限定があります。基本的には期間と期間との間が空くことはないのですが、たまに空き期間が発生します。 空き期間が生じた時に、その日に該当するセルだけに色がつくようにしたいのです。入力期間中は、必ずしも入力値があるとも限らないので、空白セルに色をつける、のような設定はできません。 例えば、A列に名簿が、B列に前回の期間終了日がはいっています。C列には次回の期間が決まり次第、期間の開始日が入力されます。 D1からAI1までに日付が入っていた時、C列に入力と同時にそれぞれの名簿者において期間切れの日に該当するセルだけに色がつくようにしたいのです。当月の日付が1~31に対し、期間は数ヶ月間あるために12/23のような表記です。よろしくお願いします。

このQ&Aのポイント
  • 遠距離が辛くなり別れることを告げられ、後輩と付き合う可能性がある
  • 後輩とは既に数回2人で出かけており、彼は彼女に対して好意を持っている
  • 彼は後輩に対して可愛いと思っているが、好きかどうかはわからないとしている
回答を見る

専門家に質問してみよう