Excel関数 逆引き集 | 最終出現判定 → COUNTIF(後方)

Excel VBA Excel
スポンサーリンク

概要

「同じIDが何行もあるけど、“最後に出てくる行”だけを拾いたい」
「商品コードごとに、いちばん下の行だけを集計対象にしたい」
「ステータスの履歴のうち、“最終レコード”だけフラグを立てたい」

こういう 「最終出現(最後に出てきた行)」を判定するときに使えるのが、
COUNTIF を“後ろ向きの範囲”で使うテクニックです。

「初回出現」は
COUNTIF($A$2:A2, A2)=1(先頭から自分の行まで)でしたが、
「最終出現」はその逆で、

自分の行から最後の行までの範囲で数えて、
それが 1 なら「ここが最後の出現行」

と考えます。


COUNTIF(後方) の基本アイデア

「ここから下で何回出てくるか」を数える

COUNTIF の基本形はこうです。

=COUNTIF(範囲, 条件)

ここで「範囲」を「自分の行から最終行まで」にすると、

  • A2 のとき → COUNTIF(A2:$A$100, A2)
  • A3 のとき → COUNTIF(A3:$A$100, A3)
  • A10 のとき → COUNTIF(A10:$A$100, A10)

というように、「下方向」に伸びる形になります。

ある値について考えると、

  • 最後の行(最終出現行)では、その行から下に同じ値はもうないので → COUNTIF の結果は 1
  • それより上の行では、その行より下にも同じ値があるので → COUNTIF の結果は 2 以上

となります。

だから、

=COUNTIF(自分の行から下端まで, 自分のセル)=1

と書けば、「自分は“最終出現行”か?」を TRUE/FALSE で判定できます。


最終出現判定の基本形(TRUE / FALSE)

A列の中で「A2 の値が最終出現行か?」を判定する

前提:

A2:A100 に顧客IDが入っているとします。
A2 に「自分のIDが、この一覧の中で最後に出てくる行か?」を判定する式を書きます。

=COUNTIF(A2:$A$100, A2)=1

これを A2 から A100 までコピーすると次のように働きます。

  • あるIDについて、「一番下の行」→ その行から下に同じIDはない → COUNTIF=1 → TRUE
  • それより上の行 → 下にも同じIDがある → COUNTIF>=2 → FALSE

つまり、その値の「最終出現行」だけ TRUE になります。

「先頭から自分まで」なら初回出現、
「自分から最後まで」なら最終出現、
と覚えるとすっきりします。


IF と組み合わせて「最終行だけフラグ」を付ける

最終出現行だけ「★」を付ける

TRUE / FALSE のままでは見づらいので、IF でマークを付ける形にします。

A2:A100 に商品コードが入っているとして、
商品の最終出現行だけ「★」と表示したい場合、B2 に次の式を書きます。

=IF(COUNTIF(A2:$A$100, A2)=1, "★", "")

この式を B2 から最終行までコピーすると、

  • その商品コードが一番最後に出てくる行 → 「★」
  • それより上の同じ商品コードの行 → 空白

となり、「コードごとに一番下の行だけマーク」が付きます。


最終出現行だけを「集計対象」にする

例えば、

A列:商品コード
B列:売上

とします。

「商品コードごとに、いちばん最後の売上だけを集計したい」
(例:最新データだけを集計)
という場合、C列に次のような式を書くことができます。

=IF(COUNTIF(A2:$A$100, A2)=1, B2, 0)
  • 最終出現行 → B2(売上)を返す
  • それより上の同じコードの行 → 0 を返す

全体の C 列を SUM すれば、「各商品コードの最終行だけ」を合計した形になります。


最終出現判定の応用パターン

ステータス履歴から「最新ステータス行」にだけフラグを付ける

A列:顧客ID
B列:更新日
C列:ステータス

1 顧客につき複数行あり、下に行くほど新しい履歴が追加されている、というよくある表を想定します。

「顧客IDごとに、一番下の行(最新ステータス)にだけ『最新』フラグを付けたい」
というとき、D2 に次のように書けます。

=IF(COUNTIF(A2:$A$100, A2)=1, "最新", "")

これを下までコピーすると、

  • その顧客IDが最後に出てくる行 → 「最新」
  • それ以外 → 空白

となります。
あとは「最新」だけフィルターすれば、顧客IDごとの“最終ステータス一覧”が作れます。


最終出現行だけ残して一覧化したいとき

「同じIDが何行もあるけれど、“最後の行だけ”を代表として扱いたい」
というときは、

  1. 隣の列に =IF(COUNTIF(A2:$A$100, A2)=1, "最終", "") を入れる
  2. 「最終」にフィルターをかける
  3. 見えている行だけをコピーして、新しいシートに貼り付け

という手順で、“IDごとの最終レコード一覧”を作成できます。


最終出現判定の注意点

絶対参照「$」の付け方がポイント

範囲部分を

A2:$A$100

と書いているのが重要です。

  • 上限($A$100)は固定
  • 下側(A2)は、コピーすると A3、A4…と変わっていく

もし $ を間違えて $A$2:$A$100 と書くと、
常に「全体の中で何件あるか」を数えるだけになり、
「自分より下も含めて何件あるか」という判定になりません。

最終出現判定では、必ず「自分から下端まで」の形にするのがポイントです。


例題

問題1

A2:A100 に顧客IDが入っています。
A2 の顧客IDについて、「A2 から A100 までの中で、自分のIDが 1 回だけ出現していれば TRUE、それ以外は FALSE」を返す式を書いてください。

=COUNTIF(A2:$A$100, A2)=1

問題2

問題1と同じ前提で、
「最終出現行なら『最終』、それ以外の行は空白」を表示する式を B2 に書いてください。

=IF(COUNTIF(A2:$A$100, A2)=1, "最終", "")

問題3

A2:A100 に商品コード、B2:B100 に売上が入っています。
「商品コードごとに、最後の行の売上だけを C 列に残し、それ以外は 0 にする」式を C2 に書いてください。

=IF(COUNTIF(A2:$A$100, A2)=1, B2, 0)

問題4

A2:A100 にメールアドレス一覧があります。
各行について、「そのメールアドレスが一覧の中で最後に出てきた行であれば TRUE、それ以外は FALSE」と判定する式を A2 に書いてください。

=COUNTIF(A2:$A$100, A2)=1

問題5

A2:A100 に会員ID一覧があります。
条件付き書式で、「最終出現行のセルだけ色を付けたい」とき、
条件として使う数式を書いてください(範囲選択は A2:A100 とします)。

=COUNTIF(A2:$A$100, A2)=1

まとめ

「最終出現判定 → COUNTIF(後方)」の本質は、

  1. COUNTIF の範囲を「自分の行から下端まで」にする
  2. その範囲内で自分と同じ値が 1 回だけなら、そこが“最後の出現行”

というシンプルな考え方です。

型としては、ほぼこの1行を覚えれば足ります。

=COUNTIF(A2:$A$100, A2)=1

これを IF と組み合わせれば、

=IF(COUNTIF(A2::$A$100, A2)=1, "最終", "")

のように、
「最終行だけフラグ」「最終行だけ集計」「最終行だけ抽出」といった処理を自在に作れます。

初回出現(先頭側 COUNTIF)とセットで覚えると、
“最初の行”と“最後の行”を使い分けながら、
履歴データや重複データをきれいに扱えるようになります。

タイトルとURLをコピーしました