次の DEMO を見にいく
Excel

【Excel】ある日付の範囲で抽出する:FILTER・COUNTIFS・SUMIFSで条件に合う行だけを取り出す完全ガイド

k.w
\お買い物マラソン開催中/
スポンサーリンク

期間を指定して件数・合計を出す基本【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`)

付録:入力例の小さなデータ

SaleDateStaffItemQtyAmount
2025/10/28田中A11200
2025/11/02佐藤B33600
2025/11/05田中A22400
2025/11/12鈴木C1900
2025/11/19田中B56000

この表を `SalesTbl` にして、開始日 `2025/11/01`、終了日 `2025/11/30` とすると、

  • `COUNTIFS` は 4 行を数える
  • `SUMIFS(Amount,…)` は 3600+2400+900+6000 = 12,900
  • `FILTER` は 2025/11/月の行だけを出力
スポンサーリンク
記事URLをコピーしました