同じデータは連続する範囲に固まっていても、飛び飛びになっていてもOKです。
VLOOKUP関数等を使う方法
まずは番号を振る列の最初の行(C3セル)に「1」を直接入力します。
そして2番目の行(C4セル)に次の式を入力します。
C4セル
=IFNA(VLOOKUP(B4,B$3:C3,2,FALSE),MAX(C$3:C3)+1)
VLOOKUP関数により同じ行のB列の値を、上方の各行のB列から検索します。値がみつかったらC列にある番号を取得、みつからなかったら(B列の値は新規データだということになるので)これまでの番号の最大値に1を足したものを生成するという内容です。
ちょっと複雑ですが2つ下の画像と併せて確認するとわかりやすいかもしれません。
あとは最後の行(C12セル)までフィルコピーすれば完了となります。
なお、最後のC12セルの数式は次のようになっています。
C4セルの式だと検索範囲が1行しかないので意味がわかりにくいですが、こちらの方が少しは見通しやすいと思います。
C12セル
=IFNA(VLOOKUP(B12,B$3:C11,2,FALSE),MAX(C$3:C11)+1)
なお、C4セルに入力しておく式についてはいくつか例が考えられます。
以下で2つの例を紹介します。データの左側のセルに番号を表示したい場合はVLOOKUPが使えませんのでこれらを試してみてください。
=IFNA(INDEX(C$3:C3,MATCH(B4,B$3:B3,0)),MAX(C$3:C3)+1) =IFERROR(AVERAGEIF(B$3:B3,B4,C$3:C3),MAX(C$3:C3)+1)
上の式はVLOOKUPによる番号の検索をINDEX/MATCHに置き換えたものです。ネストが増えてちょっと複雑になります。
下の式は表引き関数の代わりにAVERAGEIFで番号を取得しようというものです。発想はトリッキーですが式のつくりは簡単になります。
XMATCH/UNIQUE関数を使う方法
次の画像ではC3セルに数式を入力してB3~B12のデータを一括採番しています。
C3セル
=XMATCH(B3:B12,UNIQUE(B3:B12))
UNIQUE関数で重複を除いたリストを生成しておき、各データをリストから検索して位置を取得するという内容です。
新しい関数のおかげで簡潔にまとまりますが、そもそもこのような採番をする理由は「重複を除いたリストを作成する」であるケースが多いと思われるので、UNIQUE関数が使えるなら実用的な意味は薄いかもしれません。