いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)重複値(グループ)ごとに連番を振る方法

 Excelで、セルの値でグループを区別し、各グループごとに1から連番を振る方法についてです。
 各グループは連続する範囲に固まっていても、飛び飛びになっていてもOKです。

  • COUNTIF関数を使って(値により区別される)グループごとの連番を振ることができます。

COUNTIF関数と絶対参照を使う方法

 ここではB列に入力されている3種類の値のそれぞれについて、1から連番を振りC列に表示するものとします。
 まずC3セルに「=COUNTIF(B$3:B3,B3)」と入力します。

 C3セル

=COUNTIF(B$3:B3,B3)


 B3セルにあるB3セルの値の数を数えているので結果は1となります。
 しかし最初の「B$3」という絶対参照がポイントになっています。



 式をC12セルまでフィルコピー(セル右下の四角形をダブルクリックまたは下にドラッグ)すると、グループごとの連番が一気に完成します。



 C12セルの式を確認すると「=COUNTIF(B$3:B12,B12)」となっています。
 B$3という絶対参照の効果により、どの行においても「3行目(B3セル)からその行までにある、その行と同じ値をカウントする」という式になっているため、これが結果的にそれぞれのグループの連番となります。


MAP/LAMBDA/COUNTIF関数を使う方法

 こちらも上記の例と同じ内容ですが、C3セルの1つの式だけですべての行に連番を表示しています。

 C3セル

=MAP(B3:B12,LAMBDA(x,COUNTIF(B3:x,x)))

 MAP/LAMBDA関数を使いB3:B12の範囲にxと名付けています。あとはMAP関数のはたらきによりxの1つ1つについてCOUNTIF関数の結果を出力し続けます。具体的には次の10個の結果を出力します。

COUNTIF(B3:B3,B3)
COUNTIF(B3:B4,B4)
・・・
COUNTIF(B3:B12,B12)

COUNTIF/OFFSET関数を使う方法

 こちらも1つの関数式で済む方法です。

 C3セル

=COUNTIF(OFFSET(B3,0,0,SEQUENCE(ROWS(B3:B12))),B3:B12)


 ちょっと複雑ですが、簡単にいえば次の10個の式を同時に実行しています。

=COUNTIF(OFFSET(B3,0,0,1),B3)
=COUNTIF(OFFSET(B3,0,0,2),B4)
 ・・・
=COUNTIF(OFFSET(B3,0,0,10),B12)

 それぞれの式は次のような計算をします。
「B3セルを起点とする1行(つまりB3セル)に含まれるB3セルと同じ値の数」を取得
「B3セルを起点とする2行(つまりB3:B4)に含まれるB4セルと同じ値の数」を取得
 ・・・
「B3セルを起点とする10行(つまりB3:B12)に含まれるB12セルと同じ値の数」を取得


 これらの結果を縦に並べることで、結果的にグループごとの連番が得られます。
 検索範囲となる行数を1つずつ増やすために「SEQUENCE(ROWS(B3:B12))」により1から10までの連番を生成しているので、ちょっと難しい式になっています。


 ちなみにCOUNTIF関数の第2引数(範囲)ではほとんどの関数が使えませんが、セルを参照する機能を持つ関数は使用可能です。例としてOFFSETのほかINDIRECT、INDEXなどがあり、次の例で使っているTAKE関数もその1つです。

COUNTIF/TAKE関数を使う方法

 この例でも、C3セルの1つの式だけですべての行に連番を表示しています。

 C3セル

=COUNTIF(TAKE(B3:B12,SEQUENCE(ROWS(B3:B12))),B3:B12)

 カウントする範囲の指定にTAKE関数を使っているだけで、やっていることはOFFSET関数の例と同様です。引数が少なく済み式もわずかに短くなっています。