- ベストアンサー
エクセル複数条件検索 日付~日付も検索
いわゆる在庫管理表です。 A列 B列 C列 D列 数量 品 倉庫 日 10 すいか ア 7/18 15 ブドウ イ 8/20 5 すいか イ 9/30 20 ブドウ ア 10/31 という表があります。 これを 品 倉庫 ブドウ イ を選ぶと 先月(7/1~7/31) 数量 0 今月(8/1~8/31) 数量 15 1ヵ月後(9/1~9/30) 数量 0 2ヵ月後(10/1~10/31) 数量 0 というような表にしたいのですが、 ブドウ で イ のものはDSUMでできるのですが、 さらに検索条件に 先月 7/1~7/31 今月 8/1~8/31 という条件を加えるのにはどのようにしたらよいのかわかりません。 現状日付はTODAY関数とDATE関数を組合せて表示させています。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは~ DSUM関数を使って、「先月」「今月」「1ヵ月後」「2ヵ月後」を一度に集計するためには、フィールド名も含めて、抽出条件をそれぞれすべて指定してやる必要があるのが厄介ですよね。 もっとカンタンなやり方があるかもしれませんが、一応参考までに以下の方法を試してみてください。 F列からK列を集計に使います。 F2 に「先月」、F3 に「今月」、F4 に「1ヵ月後」、F5 に「2ヵ月後」と見出しを入力(もちろん「」は不要。以下同じ) G1に「日」、H1 に「日」、I1 に「品」、J1 に「倉庫」、K1 に「数量」とフィールド名を入力 G2に =">="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())+ROW(A1)-2,1),"mm/dd") と入れて、G5 までフィルコピー H2に ="<="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())+ROW(A1)-1,0),"mm/dd") と入れて、H5 までフィルコピー I2 に「ブドウ」、J2 に 「イ」と入力 I3に =I$2 と入れて、右の J3にフィルコピー そのまま( I3 と J3 が選択された状態で )5行目までフィルコピー(I列・J列の数式を同時にコピー) K2に =DSUM($A$1:$D$500,$A$1,$G$1:J2)-SUM($K$1:K1) と入れて、K5までフィルコピー 以上です。 I2 に 「品名」、J2 に 「倉庫」を入力するだけで、「先月」から「2ヵ月後」まですべて集計できる、と思うのですが・・・あまり深く考えていないのでよく検証してみてください。 * * 関数では、他に SUMPRODUCT関数を使ってもできると思います。 これも一応参考まで。 H1 に 「品」、I1 に 「倉庫」と見出しを入力 H2 に 「ブドウ」、I2 に 「イ」と条件を入力 F3 に 「先月」、F4 に 「今月」、F5 に 「1ヵ月後」、F6 に 「2ヵ月後」と見出しを入力 G3 に =TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())+ROW(A1)-2,1),"yyyy/mm") と入れて、G6までフィルコピー 日付の表記は↓のようになります(条件をへらすため)。 先月 2005/07 今月 2005/08 1ヵ月後 2005/09 2ヵ月後 2005/10 H3 に =SUMPRODUCT(($B$2:$B$500=$H$2)*($C$2:$C$500=$I$2)*(TEXT($D$2:$D$500,"yyyy/mm")=G3),$A$2:$A$500) と入れて、H6 までフィルコピー 以上です。 データは、2行目から500行目までの範囲内と仮定しています。それ以上ある場合は範囲を広げてください。 ただし SUMPRODUCT関数の場合、あまり範囲を広げすぎると(データが多いようだと)処理が重くなるかもしれません。
その他の回答 (3)
- tona-tona
- ベストアンサー率34% (8/23)
>日をわけてなかったんです。 なるほど!そういう事だったんですか。 私は、dsumを教えてもらって勉強になったけど、 何が問題なのか不思議でした。 ところで、私は#2の方ではなくて、#1ですが、 row(a1)はフィルコピーする為に使っているんですよ。 もう、#3の方のレスを読んで推察済みかなとは思いますが、 最終的には =">="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())-1,1),"mm/dd") =">="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY()),1),"mm/dd") =">="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())+1,1),"mm/dd") =">="&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY())+2,1),"mm/dd") としたい訳ですが、 この-1、0、+1、+2を作るためにrow()を利用されているのです。 rowは行数を取得するので、pudding-puddingさんがおっしゃるように、 そのセルに入力されている値は関係がありません。 試しにどこかのセルに=row(a1)とすると、1が返ってきますよね。 row(a1)の入ってる数式を下へフィルコピーすると a1の部分がa2、a3、a4となって、 それぞれ、1,2,3,4と返ってきます。 そこから、-2することで、#2の方は、-1、0、+1、+2を作られています。 ちなみにrow()だとそのセル自身の行を返すので、 row(a1)-2をrow()-3に変えて下へフィルコピーでも同じ事になります。 ただこれだと、2行目からの入力に限ってしまいますので、 a1の方が良いですね。 横へのフィルコピーで数を増加させたいときは=COLUMN()を使います。 1ずつ増加させたいときは、COLUMN()に引いたり足したりして、 2ずつだったらCOLUMN()*2に引いたり足したりして、作ります。 あぁ、的外れなレスを付けていないかいつも心配。大丈夫かな。
お礼
なるほどぉ!よく理解できました☆彡 ヘルプにもこういう感じで丁寧に説明してくれればありがたいのですよね。 本当にありがとうございました。
- mshr1962
- ベストアンサー率39% (7417/18945)
#1のかたので答えは出てると思いますが... 品 倉庫 日 日 で 始めの日=DATE(YEAR(TODAY()),MONTH(TODAY())+月,1) 終わりの日=DATE(YEAR(TODAY()),MONTH(TODAY())+月+1,0) ですね。 月の所は前月なら-1,今月なら0,来月なら1としてください。
お礼
回答いただきありがとうございました。
- tona-tona
- ベストアンサー率34% (8/23)
数式初心者・マクロ初級者です。(万年) 識者の方のレスがつくまでの場つなぎと思ってください。 dsumって初めて知りましたが、 Databaseをこう作って、 数量 品 倉庫 日 1 すいか イ 7/5 4 すいか イ 8/4 10 すいか ア 7/18 15 ブドウ イ 8/20 100 すいか イ 6/1 400 すいか イ 6/15 5 スイカ イ 9/30 20 ブドウ ア 10/31 40 すいか ア 7/31 100 すいか イ 8/11 400 すいか イ 8/1 Criteriaをこうして 品 倉庫 日 日 すいか イ >=8/1 <=8/31 fieldを 数量 にしたら =dsum(Database , フィールド, Criteria)で ちゃんと、504って出ましたよ。 TODAY関数とDATE関数を使っててもちゃんと表示されました。 何がわからないのかが分からない。。。 私が何か勘違いしてるのかな。 ちなみに、 私は、きっちり月末区切りの集計を行う時は、 =month(セルアド)で、月を表示する列を作成し、(非表示) マクロでガーーッと書き出してました。 (データ表の最終行をsubtotalで合計にしておき、 オートフィルタをかけて、最終行を集計表へ写し取っていく。 オートフィルタの引数は、集計用の表から取得して回す。) dsumなんて便利なものがあったんですね。
お礼
早速の回答ありがとうございます。 なるほど!日をわければよかったんですね♪ 日をわけてなかったんです。 1つのセルで式を組んで、できないものかと悩んでいたものですから‥ 独学なものでこういったちょっとした見方の変え方ができなかったんです。 面倒くさがり過ぎました。 ありがとうございました。
お礼
詳しく説明いただきありがとうございます。 独学なもので、>=8/1 <=8/31 を today関数とdate関数で組合せての式の仕方もわからなかったんです。””が必要だったんですね。。。。 さらなる質問で恐縮なのですが、 日を表示する式に、ROW関数が入っているのですが、 この関数の役割がよくわかりません。 A1には数量って言葉があり、A2以下には各数値がはいっていくのに、それらは影響していないようですよね?入っているほうが日付が上手くいくなぁっていう感じはするのですが‥ 関数ヘルプを読んでも理解ができなかったので、 お時間がありましたら教えてください。