メモ。
前提として、
- 連番を振る列は、テーブル(ListObject オブジェクト)に含まれる
- 連番を振りたい列の見出しは文字列である
とします。Excel のテーブル機能を積極的に使わない理由は無いですし、列見出しが文字列以外である場合もあまり無いだろう、という考えです。
※テーブル名は、日本語版 Excel のデフォルトである テーブル1 とする
数式↓
=IF(TYPE(OFFSET(テーブル1[@],-1,0))=1,OFFSET(テーブル1[@],-1,0)+1,1)
見やすいように適当に整形すると(セルにそのまま入れる場合は Alt + Enter で改行して半角スペースでインデント)、
=IF(
TYPE(
OFFSET(テーブル1[@],-1,0)
)=1,
OFFSET(テーブル1[@],-1,0)+1,
1
)
こんな感じ。処理の流れとしては、
自セルの一行上のセルのデータ型が数値であれば、上のセルの値に 1 を足し、そうで無ければ 1 を入れる
というもの。
メリットは、自セルを構造化参照でスッキリ参照出来る所ですね。テーブルを使わないと、ADDRESS・ROW・COLUMN・INDIRECT 等の各関数を組み合わせてやる必要があって、かなりごちゃごちゃします。構造化参照なら、[@]
とだけ入れれば良いです。テーブル名は自動的に補完されるので、テーブル1[@]
というようになります。
@
は、そのセルが属する行の指定子なので、それだけ入れてあげれば、後は自セルが属する列の指定は省略出来るので、自セルの構造化参照になる、という寸法。
そして、OFFSET 関数で一つ上のセルを参照して、TYPE 関数で(ISNUMBER でも可)データ型が数値であるかを判定して、数値であれば一つ上の値は見出しでは無いので、一つ上の値に 1 を足したものを自セルの値に入れ、もし一つ上のセルの値が文字列であれば、それは見出しなので、自セルの値には 1 を入れてあげると。
この数式であれば、明示的なセル参照が一切無く、見出し列の文字列すら入っていないので、それなりにスッキリしていて、そこそこ汎用的であると思います。テーブルの数式に明示的参照を入れると、行を削除した時などにエラーが発生したり、相対参照を入れてあると、行の追加で参照が狂う事があるので、構造化参照のみの数式を作りたい所です。