7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excelにて自動連番のための式

Last updated at Posted at 2020-04-18

Excelで連番を自動で付与するための式を作成しました。
以下を参考にさせていただきました。
http://qiita.com/ikedat16/items/7753a8253e73e1d66b91

2024/11/15
以前の式では、1行目の場合に参照エラーとなることが判明したため、式を修正しました。
IFERROR関数で判定し、エラーの場合は1とすることで、保険で入れていたN関数が不要となりました。
また、ADDRESS関数で基準位置をずらせるため、OFFSET関数も不要となりました。

式をコピペするだけで利用できます。
IMEの辞書登録等をしておくことをおすすめします。

セルが連続している場合(通常時)

  • セルが連続している場合に連番となる
  • 同じ行/列に複数の連番が作成可能

縦並び

=IFERROR(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,1)

横並び

=IFERROR(INDIRECT(ADDRESS(ROW(),COLUMN()-1))+1,1)

セルが離れている場合(結合セルの場合)

  • セルが離れていても連番となる
  • 逆に、同じ行/列に複数の連番は作成不可(回避策あり)

縦並び

=IFERROR(MAX(OFFSET(INDIRECT(ADDRESS(1,COLUMN())),0,0,ROW()-1,1))+1,1)

横並び

=IFERROR(MAX(OFFSET(INDIRECT(ADDRESS(ROW(),1)),0,0,1,COLUMN()-1))+1,1)

複数の連番を作成する場合

多少無理やりですが、OFFSET関数の基準位置をずらすことで、前の連番を拾わなくなるため複数の連番を作成可能です。

以下は A10 セルから新しい連番を作成する例

縦並び
=IFERROR(MAX(OFFSET(INDIRECT(ADDRESS(ROW($A$10),COLUMN())),0,0,ROW()-ROW($A$10),1))+1,1)
横並び
=IFERROR(MAX(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN($A$10))),0,0,1,COLUMN()-COLUMN($A$10)))+1,1)

仕組みの解説

縦並びを例に解説しますが、横並びも同様です。

セルが連続している場合に利用する式

概要としては、現在位置の1行上のセルの値に1を加算しています。

ADDRESS関数(参照文字列の作成)

ADDRESS( ROW() - 1, COLUMN() )

行番号と列番号からセルの参照文字列(例:A1)を作成します。
ROW()COLUMN()を利用して、現在位置のセルを取得しています。
現在位置から1行上を取得するため、行番号は ROW()(現在位置の行番号)から1を引いています。

INDIRECT関数(参照状態の作成)

INDIRECT( ADDRESS(ROW()-1,COLUMN()) )

上記のADDRESS関数で作成した参照文字列から参照状態を作成します。
ADDRESS関数で作成した値はあくまで文字列であり、INDIRECT関数に渡すことで初めて「参照」となります。

1を加算

INDIRECT(ADDRESS(ROW()-1,COLUMN())) + 1

上記のINDIRECT関数で1行上のセルの値が取得できるため、その値に1を加算します。

IFERROR関数(エラー判定)

IFERROR( INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1, 1 )

1行上のセルが存在しない場合や、文字列の場合はエラーとなってしまいます。
エラーの場合は、1を返すようにすることで、連番が壊れないようにします。

ただし、1行上が日付型の場合は、シリアル値からの連番となるためご注意ください。
(レアケースと思われるため考慮しておりません)

セルが離れている場合に利用する式

概要としては、先頭行から現在位置までセルの値の最大値に1を加算しています。

ADDRESS関数(参照文字列の作成)

ADDRESS( 1, COLUMN() )

行番号と列番号からセルの参照文字列(例:A1)を作成します。
こちらは最終的に、OFFSET関数の基準位置となります。
基準を先頭行の位置としたいため、行番号は 1、列番号は ROW()(現在位置の列番号) としています。

INDIRECT関数(参照状態の作成)

INDIRECT( ADDRESS(1,COLUMN()) )

上記のADDRESS関数で作成した参照文字列から参照状態を作成します。
ADDRESS関数で作成した値はあくまで文字列であり、INDIRECT関数に渡すことで初めて「参照」となります。

OFFSET関数(基準位置から指定した距離にあるセル範囲の値の取得)

OFFSET( INDIRECT(ADDRESS(1,COLUMN())), 0, 0, ROW()-1, 1 )

第一引数:基準となるセル
第二引数:基準セルからの行の距離(垂直方向)
第三引数:基準セルからの列の距離(水平方向)
第四引数:取得する行の範囲
第五引数:取得する列の範囲

第一引数の基準位置には、INDIRECT関数で作成した「参照」を渡します。
今回、基準位置は1行目となり、距離はそのままのため 0 です。
第四引数と第五引数で、参照範囲を指定できます。
行の範囲は、現在位置の行-1までの範囲とするため ROW()-1
列の範囲は、1列のみのため 1 としています。

すなわち、「先頭行から現在位置の1行上まで」の参照範囲となります。

MAX関数

MAX( OFFSET(INDIRECT(ADDRESS(1,COLUMN())),0,0,ROW()-1,1) )

上記のOFFSET関数で取得した参照範囲をMAX関数に渡します。
「先頭行から現在位置の1行上まで」で最大値が取得できます。

1を加算

MAX(OFFSET(INDIRECT(ADDRESS(1,COLUMN())),0,0,ROW()-1,1)) + 1

上記のMAX関数で取得した値に、1を加算することで連番となります。
セルが離れていても最大値を取得するため、連番となります。
結合されているセルで連番とする場合などに役立ちます。

IFERROR関数(エラー判定)

IFERROR( MAX(OFFSET(INDIRECT(ADDRESS(1,COLUMN())),0,0,ROW()-1,1))+1,1 )

1行上のセルが存在しない場合や、文字列の場合はエラーとなってしまいます。
エラーの場合は、1を返すようにすることで、連番が壊れないようにします。

ただし、1行上が日付型の場合は、シリアル値からの連番となるためご注意ください。
(レアケースと思われるため考慮しておりません)

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?