各グループは連続する範囲に固まっていても、飛び飛びになっていても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関数の第1引数(範囲)ではほとんどの関数が使えませんが、一部のセル参照に類似した関数は使用可能です。例としてOFFSETのほかINDIRECT、INDEXなどがあり、次の例で使っているTAKE関数もその1つです。
COUNTIF/TAKE関数を使う方法
この例でも、C3セルの1つの式だけですべての行に連番を表示しています。
C3セル
=COUNTIF(TAKE(B3:B12,SEQUENCE(ROWS(B3:B12))),B3:B12)
カウントする範囲の指定にTAKE関数を使っているだけで、やっていることはOFFSET関数の例と同様です。引数が少なく済み式もわずかに短くなっています。