関数で複数データを取り出し、さらに開始終了日指定

このQ&Aのポイント
  • 関数を使用して、指定した期間内のデータを取り出す方法について説明します。
  • 特定の期間を指定してデータを抽出する関数を使って、指定期間内のデータを取り出す方法を学びます。
  • Excelの関数を利用して、指定した期間内のデータを抽出する方法について紹介します。
回答を見る
  • ベストアンサー

関数で複数データを取り出し、さらに開始終了日指定

A列日付、B列商品、C列販売数が並んでいるシートが有ります。 同シートにG2に日付を設定、その日付に一致するデータだけを G5以下日付、H5以下商品、I5以下販売数を反映させます。 G5セルに=IF(COUNTIF($A$2:$A$11,$G$2)<ROW(A1),"",INDEX(A$2:A$11,SMALL(IF($A$2:$A11=$G$2,ROW($A$1:$A$10)),ROW(A1)))) の関数を記入します。 上記が参照サイト:http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/fukusu_data.html の関数で複数データを取り出す関数です。 今回、この条件に開始日と終了日を設定したいです。 H2に終了日を指定したいのですが、自分で考えた画像の数式ではエラーになりました・・・ 開始終了日指定を指定する関数を教えて下さい。

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

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>今回、この条件に開始日と終了日を設定したいです。 >H2に終了日を指定したいのですが、自分で考えた画像の数式ではエラーになりました COUNTIF関数が誤りです。 検索条件の and(">="&$G$2,"<="&$H$2) は使えませんので他の方法を使います。 COUNTIF($A$2:$A$11,$G$2) の代替数式は次のような方法が良いでしょう。 1.COUNTIF($A$2:$A$11,">="&$G$2)-COUNTIF($A$2:$A$11,"<"&$H$2) 2.COUNTIFS($A$2:$A$11,">="&$G$2,$A$2:$A$11,"<="&$H$2) 3.SUM(($A$2:$A$11>=$G$2)*($A$2:$A$11<=$H$2)) また、SMALL関数の内がはにあるIF関数は2つの条件を満たす行番号に変更しなければなりません。 IF($A$2:$A11=$G$2,ROW($A$1:$A$10)) この数式ではG2と一致する日付の行のみ行番号を拾えますがG2セルとH2セルの期間の行番号を拾えません。 次のように変更する必要があります。 IF(($A$2:$A11>=$G$2)*($A$2:$A11<=$H$2),ROW($A$1:$A$10)) 全体の数式はあなたの応用力で対処してください。

crossinlove
質問者

お礼

お礼が遅くなり、大変申し訳ありません。 例を3つもあげてもらいありがとうございます。 いつもありがとうございます。

その他の回答 (6)

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.7

ピボットテーブルを使わない理由が分かりません。 なんでこんなものを数式でやろうとしているのやら。それも作業列も使わずに。 =IFERROR(INDEX(A:A,SMALL(IF(($A$2:$A$11>=$G$2)*($A$2:$A$11<=$H$2),ROW($2:$11)),ROW(A1))),"") Ctrl + Shift + Enterで確定。

crossinlove
質問者

お礼

アドバイスを貰った後、ピボットの本を一冊読みました。 確かにピボット便利です。 ありがとうございます。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

 回答No.5です。  もしすべて配列数式で行いたいという場合には、G5セルに次の様な配列数式を入力してから、[Shift]+[Ctrl]+[Enter]で確定し、G5セルをコピーして、G列~I列の5行目以下に数式のみを貼り付けて下さい。 =IF(COUNT($G$2,$H$2),IF(COUNTIFS($A$2:$A$11,">="&$G$2,$A$2:$A$11,"<"&$H$2+1)<ROWS(G$5:G5),"",INDEX(A$2:A$11,SMALL(IF($A$2:$A$11>=$G$2,ROW($A$1:$A$10)),ROWS(G$5:G5)))),"")

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

G列の日付に関しては配列数式を使わずに通常の関数で抽出する事が出来るのですから、以下の様な方法は如何でしょうか?(配列変数を使うセルが少ない方が早く処理する事が出来ますし)  まず、G5セルに次の関数を入力して下さい。 =IF(COUNT($G$2,$H$2)=2,IF(COUNTIFS($A$2:$A$11,">="&$G$2,$A$2:$A$11,"<"&$H$2+1)<ROWS(G$5:G5),"",LARGE($A$2:$A$11,COUNTIF($A$2:$A$11,">="&$G$2)-ROWS(G$5:G5)+1)),"")  次に、H5セルに次の様に入力してから[Shift]+[Ctrl]+[Enter]で確定して下さい。(配列数式) =IF($G5="","",INDEX(B$2:B$11,SMALL(IF($A$2:$A$11=$G5,ROW($A$1:$A$10)),COUNTIF($G$4:$G5,$G5))))  次に、H5セルをコピーしてI5セルに貼り付けて下さい。  次に、G5~I5のセル範囲をコピーして、G列~I列の行目以下に貼り付けて下さい。  以上です。

crossinlove
質問者

お礼

お礼が遅くなり申し訳ありません。 徹夜続きで時間がなくて・・・ LARGE関数は把握しておりませんでした。 ありがとうございます。

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.4

関数で苦労されているようだけど、[フィルタオプションの設定]を使えば“毎度の”関数の悩みから開放されますよ。 それでも、あくまでも関数に固執されるなら、その理由を教えてください。

crossinlove
質問者

お礼

フィルタやピボットにマダなれていませんが、一冊、ピボットの本を読破し、今後活用していきたいと思います。 ありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.3

回答No.2の一部訂正です。 不等式の向きに1つの誤りがありました。 1.COUNTIF($A$2:$A$11,">="&$G$2)-COUNTIF($A$2:$A$11,"<"&$H$2)       ↓ 1.COUNTIF($A$2:$A$11,">="&$G$2)-COUNTIF($A$2:$A$11,">"&$H$2)

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.1

配列数式に拘るたいのでしょうか? 1000行まで対応します。 G5式 =IF(SUMPRODUCT(($A$1:$A$1000>=$G$2)*($A$1:$A$1000<=$H$2))<ROW(A1),"",INDEX(A$1:A$1000,SMALL(IF($A$1:$A$1000>=$G$2,IF($A$1:$A$1000<=$H$2,ROW($A$1:$A$1000))),ROW(A1)))) 数式バーにカーソルを合わせて、Ctrl キーと Shift キーを押しながら Enter キーを押す、数式バーに数式が{}で挟まれた表示で確定。確定されないとデータ抽出は出来ませんので注意下さい。 右方向下方へオートフィル 質問の添付画像のように日付が昇順データなら、配列数式で無くても可能です。 =IF(COUNTIFS($A:$A,">="&$G$2,$A:$A,"<="&$H$2)<ROW(A1),"",OFFSET(INDEX($A:$A,MATCH($G$2,$A:$A,0)),ROW(A1)-1,COLUMN(A1)-1)) 数式コピー後右方向下方へオートフィル 開始日のセルを取得後、offset関数でA列の期間のセル数をカウント分だけ表示させる方法。 配列数式が分からない場合は、添付サイトの作業列方式を採用すべきでしょう。 countif又はcountifsで作業列を作成すれば、inndex、matchで簡単に抽出出来ます。 D列に作業列を設ける方法(該当期間の場合に行番号を返す、違えば空白) D2式 =IF(AND(A2>=$G$2,A2<=$H$2),ROW(),"") 下方へオートフィル G5式 =IFERROR(INDEX(A:A,MATCH(SMALL($D:$D,ROW(A1)),$D:$D,0)),"") 右方向下方へオートフィル

crossinlove
質問者

お礼

お礼が遅くなり、大変申し訳ありません。 徹夜続きなど出遅れました。 OFFSET関数は把握しておりませんでした。 ありがとうございます。

関連するQ&A

  • 関数で複数データを取り出す(配列数式を使う)

    参照サイト:http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/fukusu_data.html A列日付、B列商品、C列販売数が並んでいるシートが有ります。 同シートにG2に日付を設定、その日付に一致するデータだけを G5以下日付、H5以下商品、I5以下販売数を反映させます。 G5セルに=IF(COUNTIF($A$2:$A$11,$G$2)<ROW(A1),"",INDEX(A$2:A$11,SMALL(IF($A$2:$A11=$G$2,ROW($A$1:$A$10)),ROW(A1)))) の関数を記入します。 上記の条件は、参照サイトの下側ページそのままの条件です。 しかし、参照サイトでは、11列ぐらいまでしか反映されません。 100列ぐらいまで伸ばして使いたいのです。 関数をどこを改造したら反映列を増やせますか? よろしくお願いします。

  • 関数 各条件により貼り付けるデータを変えたい

    二つのワークシートがあり、各条件により貼り付けるデータを変えたいのですが、IF文等の関数で可能でしょうか。 ワークシートW   A列    B列    C列    D列    E列   G列 1 倉庫   商品1   10円 2       商品2   50円 3 倉庫   商品3   20円 4       商品4   15円 5              17円 ワークシートY   A列     B列    C列 1 if関数(1)  if関数(2)  if関数(3) 2 if関数(4)  if関数(5)  - このデータで、以下のことをしたいのですが、可能でしょうか ワークシートWのA1とB1に文字がある場合、ワークシートYのA1をワークシートWのD1に貼り付ける ※これを同じ条件で、貼り付けるデータを「ワークシートWのE1にワークシートB1を貼り付け」、 「ワークシートWのG1にワークシートWのC1を貼り付け」をしたい また、ワークシートWのA1に文字がないが、B列に文字がある場合、ワークシートY2をワークシートWのD2に貼り付ける ※これを同じ条件で、貼り付けるデータを「ワークシートWのE2=ワークシートYのB2」、 「ワークシートWのG2にワークシートWのC2を貼り付け」をしたい なお、ワークシートYにはIF文が入力されています。 ご存知の方いらっしゃればお願いします。

  • 別シートに勉強時間の集計 これに集計期間を指定

    お世話になっています 質問No.9097443 質問No.9089695  質問No.9104294でご指導いただきました。 ◎希望条件 勉強時間を集計したシートA列:科目 B列:開始日 C列:開始時刻 D列:終了日 E列:終了時刻 の記載があるsheet1には終了時刻から開始時刻を差し引いた作業時間を表示する列がない。 sheet1に差引の作業時間列を追加することなく、別のシートで各科目の勉強時間を集計する方法を教えてもらいました。 ************************************************************************************* ◎レクチャー頂いた内容は Sheet3のA列とB列を作業列として使用して、Sheet2に科目ごとの勉強時間の合計を集計するものとします。 Sheet3のA2セルに次の関数を入力して下さい。 =IF(INDEX(Sheet1!$A:$A,ROW())="","",IF(COUNTIF(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")) Sheet3のB2セルに次の関数を入力して下さい。 =IF(OR(INDEX(Sheet1!$B:$B,ROW())="",INDEX(Sheet1!$C:$C,ROW())="",INDEX(Sheet1!$D:$D,ROW())="",INDEX(Sheet1!$E:$E,ROW())=""),"",IF(ISERROR(1/(YEAR(INDEX(Sheet1!$B:$B,ROW()))>1904)/(INDEX(Sheet1!$C:$C,ROW())+0>=0)/(INDEX(Sheet1!$C:$C,ROW())+0<1)/(YEAR(INDEX(Sheet1!$D:$D,ROW()))>1904)/(INDEX(Sheet1!$E:$E,ROW())+0>=0)/(INDEX(Sheet1!$E:$E,ROW())+0<1)),"",IFERROR(TEXT(INDEX(Sheet1!$D:$D,ROW())+INDEX(Sheet1!$E:$E,ROW())-INDEX(Sheet1!$B:$B,ROW())-INDEX(Sheet1!$C:$C,ROW()),"[h]:m:s")+0,""))) Sheet2のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$1:A2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$A:$A,SMALL(Sheet3!$A:$A,ROWS(A$1:A2)))) Sheet2のB2セルに次の関数を入力して下さい。 =IF($A2="","",TEXT(SUMIF(Sheet1!$A:$A,$A2,Sheet3!$B:$B),"[h]:m:s")+0) ************************************************************************************* ◎☆今回は、このシートに集計期間を設定したいのですが、 可能でしょうか。  上記のやり方だと、Sheet1の全ての日付の項目を集計してしまいます。  そこで、  D3に集計指定期間開始日  E3に集計指定期間終了日 を設定するなどしてできないでしょうか。  sheet!1に指定期間日を設定しないやり方でしたら、Sheet2でもSheet3にでもどちらでもいいのですが。  よろしくお願いします。

  • 指定条件に合うデータを関数で抽出したい

    Excelの表のデータで指定の条件に合ったデータだけを、関数を使って抽出したいです。            条件:C列="〇" A列 B列 C列   (抽出結果) 東京 10  〇    東京 10 〇 大阪 20  〇    大阪 20 〇 大阪 25  × 関数としては、ROW、ROWS、COLUMNS関数は理由があって使えません。ROWなどで設定する値は手打ちでも構いませんので、教えていただけると助かります。 どうぞよろしくお願いいたします。

  • VLOOKUP関数の範囲をセルで指定したいと思っています。

    VLOOKUP関数の範囲をセルで指定したいと思っています。 B1:参照シート名(VLOOKUP関数で使用する範囲があるシート) C2:範囲の開始位置 E2:範囲の終了位置 B3:G3:列番号(B3の値は、B6:B8の範囲で使用する列番号、 D3の値は、D6:D8の範囲で使用する列番号) これらのセルに入力された情報をもとにB6:G8の範囲にVLOOKUP関数を 反映させたいと思っています。 例えば、 B1に参照シート名「2ケタ」 C2にVLOOKUP関数の範囲の開始位置「A5」 E2にVLOOKUP関数の範囲の終了位置「G7」 B3に範囲の列番号「2」がある場合 B6に「=VLOOKUP(A6,'2ケタ'!A5:G7,2,0)の関数を入力。 B2に参照シート名「3ケタ」 C5にVLOOKUP関数の範囲の開始位置「B5」 E2にVLOOKUP関数の範囲の終了位置「H7」 C3に範囲の列番号「3」がある場合 C6に「=VLOOKUP(A6,'3ケタ'!B5:H7,3,0)の関数を入力。 といった感じです。 現在、B6に「=VLOOKUP($A6,INDIRECT($B$1&"!a5:g7"),INDIRECT("$b$3"),0)」と 関数を入力して、VLOOKUP関数の「範囲の参照シート名」と「列番号」の情報は セルから持ってくることができました。 しかし、「a5:g7」という範囲だけは、INDIRECT関数をうまく入れることができません。 どのように関数を入力したら、上手くいくのか、教えていただけないでしょうか。

  • 開始、終了日時を検出して並列計算する方法

    Excelで以下の計算をしたいのですが、算出方法が分かりません。。。 マクロじゃないと実現しませんか? A列に開始日時、B列に終了日時、C列に任意の数値が存在する以下のようなExcelがあり、 D列に各日の総計を出したいです。 A列の日付けが365日分、同日で複数のデータがあることもあるので 2000行くらいのデータです。 一括で処理したいのですが、D列に開始日時、終了日時の検出し、 重複する場合に足し算をする方法が分からず、どのような関数、数式を入れて解決できますでしょうか。 宜しくお願い致します。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (4+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

  • 別シートに勉強時間の集計結果を表示 仕組みが・・・

    お世話になっています 質問No.9097443 及び 質問No.9089695 でご指導いただきました。 勉強時間を集計したシートA列:科目 B列:開始日 C列:開始時刻 D列:終了日 E列:終了時刻 の記載があるsheet1には終了時刻から開始時刻を差し引いた作業時間を表示する列がない。 sheet1に差引の作業時間列を追加することなく、別のシートで各科目の勉強時間を集計する方法を教えてもらいました。 レクチャー頂いた内容は ************************************************************************************* Sheet3のA列とB列を作業列として使用して、Sheet2に科目ごとの勉強時間の合計を集計するものとします。 Sheet3のA2セルに次の関数を入力して下さい。 =IF(INDEX(Sheet1!$A:$A,ROW())="","",IF(COUNTIF(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")) Sheet3のB2セルに次の関数を入力して下さい。 =IF(OR(INDEX(Sheet1!$B:$B,ROW())="",INDEX(Sheet1!$C:$C,ROW())="",INDEX(Sheet1!$D:$D,ROW())="",INDEX(Sheet1!$E:$E,ROW())=""),"",IF(ISERROR(1/(YEAR(INDEX(Sheet1!$B:$B,ROW()))>1904)/(INDEX(Sheet1!$C:$C,ROW())+0>=0)/(INDEX(Sheet1!$C:$C,ROW())+0<1)/(YEAR(INDEX(Sheet1!$D:$D,ROW()))>1904)/(INDEX(Sheet1!$E:$E,ROW())+0>=0)/(INDEX(Sheet1!$E:$E,ROW())+0<1)),"",IFERROR(TEXT(INDEX(Sheet1!$D:$D,ROW())+INDEX(Sheet1!$E:$E,ROW())-INDEX(Sheet1!$B:$B,ROW())-INDEX(Sheet1!$C:$C,ROW()),"[h]:m:s")+0,""))) Sheet2のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$1:A2)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!$A:$A,SMALL(Sheet3!$A:$A,ROWS(A$1:A2)))) Sheet2のB2セルに次の関数を入力して下さい。 =IF($A2="","",TEXT(SUMIF(Sheet1!$A:$A,$A2,Sheet3!$B:$B),"[h]:m:s")+0) ************************************************************************************* 実践できたものの、仕組みが複雑でわかりません。 Sheet3のA2では、IF関数の中で、COUNTIF関数が使われていますが、なんのためなのかわかりません。 Sheet3のB2セルには関数の中に">1904"と数値の1904より大きい値を指定する関数が組み込まれたいますが、なんのためか理解できていません。 Sheet2のA2では、「Sheet2のA1:A2がSheet3のA列より大きい」という条件に適合しなかった場合、最小値を求める計算をしていますが、何のために行っているのかわかりません。 Sheet2のB2では、A2に適合しなかった場合、Sheet1のA列から何かを何かの条件に一致したものを合計して時間表示していますが、よくわかりません。 簡単でいいので、解説をお願いできませんでしょうか? すみません、理解力が乏しいもので申し訳ありませんが、よろしくお願い致します。

  • 開始日と終了日の月を計算したい。

    開始日と終了日の間に何月あるかを計算したいと思っています。 例えば、 開始日:2007/01/01   終了日:2008/03/01 →15月 日付関数を使って上手く計算したいと思っているのですが、 色々と試しても上手くいきません。 こう変更すれば上手くいくなど、どのようなアドバイスでも かまいませんので、回答を頂けると大変に助かります。 どうぞ宜しくお願いいたします。

  • 開始と終了を指定して、その間の日付を取得したい。

    開始と終了を指定して、その間の日付を取得したい。 C#(VS2008)環境です。 開始日と終了日を指定して、日付のリスト(できれば曜日を含む)が 戻ってくるようなメソッドを作りたいと思っています。 単純に、今月の1日から20日まで、とかならループして作れそうに 思うんですが。 たとえば、2010/02/20を開始、2010/03/20を終了とするような、 月をまたぐような場合にどうしよう…と悩んでいます。 (2010/02/20、2010/02/21、2010/02/22…というようなリストがほしい) アドバイスいただけないでしょうか。

  • 関数とワールドカード+複数シートに跨る指定

    任意の行中にある文字列形式で記載された日付風データを ワイルドカードでフックして SUBSTITUTE関数で置換しようと思ったのですが ワイルドカードの指定法が解らなくなってしまいました 例      A列 1  1987/10/05日 2    ・ 3    ・ 4    ・ 5  1972/07/27日 6    ・ 7    ・      …      …      … =SUBSTITUTE(A:A,"*/??/*","0") あともう一つ 関数で参照する対象シートを切り替えたいのですが どうも良いアイディアが浮かびません。 Offset構文での第1引数にIndex構文を置き 例えばシート1のA3にAN、シート2のA3にBen、シート3のA3にCanと名付けて、シート4の適当なところに =Offset(Index((AN,Ben,Can),1,1,A1),0,0,247,1) としてみたのですが、2007では駄目でした でもそもそも =index((Sheet1!A3:A250,Sheet2!A3:A250,Sheet3!A3:A250),247,0,Sheet4!A1) とかできたら良いだけなのですが 此も駄目っぽくて… 代案として =Choose(Sheet4!A1,Sheet1!A3:A250,Sheet2!A3:A250,Sheet3!A3:A250) とかも考えたのですが 今一美的にどうかと… 2007だから駄目なのでしょうか? 何か他に良いアイディアがありましたら どうぞ宜しくお願い致します。

専門家に質問してみよう