連番を振る関数
ROW
関数を使うものはよくあるし解説も豊富なので、それ以外の方法で連番を振る方法を記載してみたいと思います。
※随時更新
シートの前提事項
1,2,3行目は見出し行とし、A列のA4セル以降に連番を振るものとします。
通常の連番
OFFSET関数版
=MAX(OFFSET($A$3,0,0,ROW()-ROW($A$3),1))+1
INDIRECT関数版
=MAX(INDIRECT("$A$3:$A"&ROW()-1))+1
解説
基本的な考え方は、一つ上のセルまでの最大値に1を足すというものです。
現在の行数に依存していないため、間に空白行があっても空き番のない連番を振ってくれます。
$A$3:$A4
のような指定をせずにOFFSET
関数・INDIRECT
関数を使っているのは、現在や一つ前のセル番号を関数内に入れてしまうと行の入れ替えをした時におかしくなるためです。
また、OFFSET
関数版では前行までの高さ指定をROW()-3
とせず、ROW()-ROW($A$3)
としていますが、これにより後から見出し行を追加した場合でも正しく動くようにしています。
基本的に、利用する固定セル番地指定を開始位置の直前セル(絶対参照)のみにすれば、削除・追加だけでなく行入れ替えにも強い式になるはず。
「強い式」ってなんか陰陽師ミタイデスネ。
間に連番の振り直しが入る場合
間に空行や中見出しなど連番以外が入った場合に、次の行を1から振り直します。
OFFSET関数版
=IF(ISNUMBER(OFFSET($A$3,ROW()-ROW($A$3)-1,0,1,1)),OFFSET($A$3,ROW()-ROW($A$3)-1,0,1,1)+1,1)
INDIRECT関数版
=IF(ISNUMBER(INDIRECT("$A"&ROW()-1)),INDIRECT("$A$"&ROW()-1)+1,1)
解説
最大値+1としてしまうと、空行があっても連番を振ってしまうため、IF
関数で前行が数値だったら連番、それ以外なら1を振るように条件分岐します。
連番の場合は前行は必ず数値になるので、セルの値を取得して1を足してやるだけ。