【Excel】ある日付の範囲で抽出する:FILTER・COUNTIFS・SUMIFSで条件に合う行だけを取り出す完全ガイド
期間を指定して件数・合計を出す基本【COUNTIFS / SUMIFS:>=開始日 と <=終了日】
はじめに、期間指定の考え方をそろえます。ポイントは次の3つです。
- 日付は「シリアル値(数値)」として認識させる
- 期間は「開始日以上 かつ 終了日以下」で表す
- 元データはテーブル(Ctrl+T)にして、増減に強くする
ここでは、売上表を例に進めます。以下のような表をテーブル化(名前を SalesTbl)している想定です。
- 列:日付(SaleDate)、担当(Staff)、商品(Item)、数量(Qty)、金額(Amount)
- 期間の入力セル:開始日(B2)、終了日(C2)
準備(表示形式とテーブル化)
1. 日付列を選び、表示形式を「日付」にする(文字列日付は後述の対処へ)
2. データ範囲を選び、Ctrl+T でテーブル化。テーブル名を `SalesTbl` に変更
3. 見出しを次のようにする:`SaleDate / Staff / Item / Qty / Amount`
4. 期間セル(B2:C2)に、検索したい開始日・終了日を入力
基本式(COUNTIFS / SUMIFS)
件数を数える:
“`
=COUNTIFS(SalesTbl[SaleDate], “>=” & $B$2, SalesTbl[SaleDate], “<=” & $C$2)
“`
金額合計を出す:
“`
=SUMIFS(SalesTbl[Amount], SalesTbl[SaleDate], “>=” & $B$2, SalesTbl[SaleDate], “<=” & $C$2)
“`
数量合計(個数)を出す:
“`
=SUMIFS(SalesTbl[Qty], SalesTbl[SaleDate], “>=” & $B$2, SalesTbl[SaleDate], “<=” & $C$2)
“`
特定の担当や商品で絞りたい場合は、条件を追加します(AND条件)。例:担当が「田中」だけの金額合計:
“`
=SUMIFS(SalesTbl[Amount], SalesTbl[SaleDate], “>=” & $B$2, SalesTbl[SaleDate], “<=” & $C$2, SalesTbl[Staff], “田中”)
“`
例:よく使うダイナミック期間(開始/終了を式で作る)
- 今月(当月の1日~末日):
“`
開始日: =EOMONTH(TODAY(),-1)+1
終了日: =EOMONTH(TODAY(),0)
“`
- 前月:
“`
開始日: =EOMONTH(TODAY(),-2)+1
終了日: =EOMONTH(TODAY(),-1)
“`
- 直近30日:
“`
開始日: =TODAY()-29
終了日: =TODAY()
“`
- 会計年度など任意期間(例:4/1~翌3/31):
“`
開始日: =DATE(YEAR(TODAY())-(MONTH(TODAY())<4),4,1)
終了日: =DATE(YEAR(TODAY())+(MONTH(TODAY())>=4),3,31)
“`
上の開始・終了を B2・C2 に入れておけば、集計式はそのまま自動で切り替わります。
つまずき対処(表示は日付でも中身は文字…?)
- 文字列日付の検出:該当セルに `=ISNUMBER(セル)` を当て、`FALSE` なら文字列です。
- 文字列を日付に直す:列全体を選び、データ→区切り位置→完了、または `DATEVALUE` を使って別列で変換。
- 1900/1904 日付体系の違い:ブック間コピーで1日ズレる場合は、ファイル→オプション→詳細設定→「1904年から計算」設定を確認。
- 時刻付きデータ:終了日を「当日終わり」にしたい場合、終了セルを `=C2+TIME(23,59,59)` のように拡張するか、条件を `< B2+1` の形に変えて厳密に制御します(例:`SalesTbl[SaleDate], “<” & $C$2+1`)。
ミニQA:COUNTIFSの条件を3つ以上に増やすときの式例は?
担当が「田中」、商品が「A」、期間が B2~C2 の金額合計は次のとおりです。
“`
=SUMIFS(SalesTbl[Amount], SalesTbl[SaleDate], “>=” & $B$2, SalesTbl[SaleDate], “<=” & $C$2, SalesTbl[Staff], “田中”, SalesTbl[Item], “A”)
“`
期間内の行だけを自動抽出【FILTER:動的な日付範囲】
元データから、期間に当てはまる行だけを別表として抜き出します。テーブルと相性がよく、データが増えても自動で反映されます。
準備(列見出し・データ型を整える)
- 抽出先の左上セル(たとえば E5)を決める
- 元データはテーブル `SalesTbl`(見出しは前章と同じ)
- 期間セルは B2:C2(開始・終了)
基本式(期間AND条件)
日付が開始日以上かつ終了日以下の行を全部出す:
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= $B$2) * (SalesTbl[SaleDate] <= $C$2), “該当なし”)
“`
`*` は AND を表します。OR 条件にしたい列は `+` を使います。
ダイナミック期間(TODAY / EDATE / EOMONTH)
開始・終了をセルで持たずに、式の中で直接計算してもOKです(今月の行だけ)。
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= EOMONTH(TODAY(),-1)+1) * (SalesTbl[SaleDate] <= EOMONTH(TODAY(),0)), “該当なし”)
“`
前月だけ:
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= EOMONTH(TODAY(),-2)+1) * (SalesTbl[SaleDate] <= EOMONTH(TODAY(),-1)), “該当なし”)
“`
直近30日:
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= TODAY()-29) * (SalesTbl[SaleDate] <= TODAY()), “該当なし”)
“`
応用(他条件の追加、並べ替え・重複除去)
- 担当が「田中」も条件に加える:
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= $B$2) * (SalesTbl[SaleDate] <= $C$2) * (SalesTbl[Staff] = “田中”), “該当なし”)
“`
- 並べ替えて表示(最新日付順):
“`
=SORT(FILTER(SalesTbl, (SalesTbl[SaleDate] >= $B$2) * (SalesTbl[SaleDate] <= $C$2), “該当なし”), MATCH(“SaleDate”, SalesTbl[#Headers],0), -1)
“`
- 商品名だけの一覧(期間内のユニーク):
“`
=UNIQUE( FILTER(SalesTbl[Item], (SalesTbl[SaleDate] >= $B$2) * (SalesTbl[SaleDate] <= $C$2)) )
“`
エラー対策(空結果・#CALC!)
- 空結果メッセージは第3引数で指定できます(上の式の「該当なし」部分)。
- 参照範囲のサイズが崩れるとエラーになります。テーブルの見出しを変更したときは、式中の列名が一致しているか確認。
- 横に別のスピル範囲があると衝突します。抽出先セルの右や下に余白を用意します。
ミニQA:空結果のときに任意メッセージを出すには?
第3引数に文字列を入れます。例:
“`
=FILTER(SalesTbl, (SalesTbl[SaleDate] >= $B$2) * (SalesTbl[SaleDate] <= $C$2), “データは見つかりませんでした”)
“`
判定列で可視化【AND×IFで「期間内/外」を表示】
まずは「その行が期間内か?」を Yes/No で示すフラグ列を作ります。これにより、条件付き書式や後続の集計がわかりやすくなります。
基本式(IF + AND)
テーブル `SalesTbl` に新しい列 `InRange` を追加し、次の式を入れます。
“`
=IF( AND($B$2 <= [@SaleDate], [@SaleDate] <= $C$2), “期間内”, “期間外”)
“`
この列を使って、オートフィルターで「期間内」だけを表示すれば、対象行の抽出が簡単にできます。
実践例(複数条件の視覚化)
- 期間内 かつ 担当が「田中」:
“`
=IF( AND($B$2 <= [@SaleDate], [@SaleDate] <= $C$2, [@Staff] = “田中”), “対象”, “対象外”)
“`
- 期間外を薄く表示(条件付き書式):
1) 範囲を選ぶ → 条件付き書式 → 新しいルール → 「数式を使用して…」
2) 数式に `=[@InRange]=”期間外”` を指定 → 書式で薄い灰色
複数期間での判定(祝日キャンペーン期間など)
複数の期間リスト(開始・終了のペア)に該当するか一発で判定したいときは、期間マスタ表 `PeriodTbl`(StartDate, EndDate)を作ります。
“`
=IF( SUMPRODUCT( (–([@SaleDate] >= PeriodTbl[StartDate]) * –([@SaleDate] <= PeriodTbl[EndDate]) ) ) > 0, “対象”, “対象外”)
“`
スピル対応の `BYROW` を使う方法(Microsoft 365):
“`
=IF( OR( BYROW(PeriodTbl[[StartDate]:[EndDate]], LAMBDA(r, [@SaleDate] >= INDEX(r,1) * 1 * ([@SaleDate] <= INDEX(r,2)) ) ) ), “対象”, “対象外”)
“`
つまずき対処(時刻付きデータの境界)
取引時刻が含まれる場合、終了日 `C2` の23:59:59まで含めたいことがあります。条件を次のどちらかにします。
- [@SaleDate] < $C$2 + 1(次の日の0:00未満を含む)
- もしくは開始・終了セルを「日付+時刻」で用意(例:`C2 = 日付 + TIME(23,59,59)`)
ミニQA:複数の期間リストに当てはまるか一発判定したい
`SUMPRODUCT` を使った上記の式がシンプルで堅牢です。期間テーブルの行数が増減しても式はそのまま使えます。
まとめ&使い分け早見表(COUNTIFS / SUMIFS / FILTER / 判定列)
最後に、目的別の選び方と、導入時のチェックリストを示します。
使い分け早見表
| 目的 | おすすめ | 長所 | 注意点 | 代表式(例) |
|---|---|---|---|---|
| 件数を数える | COUNTIFS | シンプル、軽い | 列の追加で式が長くなる | =COUNTIFS(日付,”>=”&開始, 日付,”<=”&終了) |
| 合計を出す | SUMIFS | 集計に強い | 条件追加で可読性が下がる | =SUMIFS(金額,日付,”>=”&開始,日付,”<=”&終了) |
| 行の抽出 | FILTER | 自動更新、組み合わせ自在 | スピル領域が必要、関数非対応版では使えない | =FILTER(テーブル,(日付>=開始)*(日付<=終了),”該当なし”) |
| 可視化フラグ | IF+AND | 後続処理しやすい | 別列が増える | =IF(AND(開始<=日付,日付<=終了),”期間内”,”期間外”) |
チェックリスト(最初に確認)
- 日付列は数値(シリアル)になっているか(`ISNUMBER` で確認)
- ブックの日付体系(1900/1904)が揃っているか
- データ範囲はテーブル(Ctrl+T)になっているか
- 期間セル(開始・終了)は確保済みか。時刻を含むなら条件を `< 終了+1` にするか
- よく使う期間(今月・前月・直近30日)は `TODAY/EOMONTH` で自動化しているか
ミニQA:どの関数を選べばよい?
- 「件数や合計の数字だけ欲しい」→ `COUNTIFS / SUMIFS`
- 「行ごとに抜き出して確認したい」→ `FILTER`
- 「期間内をハイライトしたい・後工程で使いたい」→ 判定列(`IF + AND`)
付録:入力例の小さなデータ
| SaleDate | Staff | Item | Qty | Amount |
|---|---|---|---|---|
| 2025/10/28 | 田中 | A | 1 | 1200 |
| 2025/11/02 | 佐藤 | B | 3 | 3600 |
| 2025/11/05 | 田中 | A | 2 | 2400 |
| 2025/11/12 | 鈴木 | C | 1 | 900 |
| 2025/11/19 | 田中 | B | 5 | 6000 |
この表を `SalesTbl` にして、開始日 `2025/11/01`、終了日 `2025/11/30` とすると、
- `COUNTIFS` は 4 行を数える
- `SUMIFS(Amount,…)` は 3600+2400+900+6000 = 12,900
- `FILTER` は 2025/11/月の行だけを出力