Excelで連番を手入力していて、行を挿入したら番号がズレた経験ありませんか? 1つ2つならすぐ直せますが、100行を超えるリストだと修正漏れが出てきますよね。そんな悩みを解決するのが、ExcelのROW関数です。
この記事では、ROW関数の基本から崩れない連番の作り方まで解説します。INDEX・SMALL・INDIRECTとの組み合わせなど、実務で使える5つのパターンを紹介します。
ROW関数とは?基本の使い方をおさらい
ROW関数(読み:ロウ)は、セルの行番号を数値で返す関数です。1行目なら1、2行目なら2、10行目なら10を返します。名前のとおり「行(Row)」の番号を取得する、シンプルな関数です。
構文はこちらです。
=ROW([参照])
引数は1つだけで、しかも省略もできます。
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 参照 | 省略可 | 行番号を知りたいセルまたは範囲 |
それでは、具体的な使い方を見ていきましょう。
引数なし:入力セル自身の行番号を返す
引数を省略すると、数式を入力したセル自身の行番号を返します。
=ROW()
たとえば、A3セルにこの数式を入れると「3」が返ります。A5なら「5」、A10なら「10」です。「いま自分がどの行にいるか」を取得したいときに便利ですよ。
引数あり:任意のセルの行番号を取得する
引数にセル参照を指定すると、そのセルの行番号を返します。
=ROW(A1) → 1
=ROW(D10) → 10
=ROW(G5) → 5
範囲を指定した場合は、先頭の行番号を返します。たとえば =ROW(A1:A5) は「1」です。Microsoft 365環境では、スピルで {1;2;3;4;5} と複数の行番号を返します。
COLUMN関数との対称パターン表(行と列の整理)
ROW関数には、列番号を返すCOLUMN関数という対になる関数があります。この2つは完全に対称です。
| 比較項目 | ROW() | COLUMN() |
|---|---|---|
| 返す値 | 行番号(縦方向) | 列番号(横方向) |
| 省略時 | 数式セルの行番号 | 数式セルの列番号 |
| 連番の方向 | 下にコピーで増える | 右にコピーで増える |
| 典型パターン | =ROW()-ROW($A$1) | =COLUMN()-COLUMN($A$1) |
COLUMN関数で横方向の連番を振った経験があれば、ROW関数はその縦方向バージョンだと考えてください。
崩れない連番|行の増減に強い自動ナンバリング
ROW関数が最も活躍するのは、縦方向の連番を自動生成する場面です。手入力の連番は、行の追加・削除であっさり壊れます。
手入力の連番が壊れる場面(行挿入・削除のあるある)
連番を「1, 2, 3, 4…」と手入力していると、こんな問題が起きます。
- 途中に行を挿入すると、番号が飛ぶ
- 行を削除すると、番号が欠番になる
- 並べ替えをすると、連番がバラバラになる
10行程度ならすぐ振り直せます。でも数百行のリストだと、修正漏れが確実に発生しますよね。
ROW()-Nで1から始める思考ステップ
ROW関数を使えば、連番が自動で更新されます。考え方は次の3ステップです。
- ROW() で数式セルの行番号を取得する
- 見出し行の行数を引いて、1から始まるように調整する
- 下にコピーすれば自動で2, 3, 4…と増える
たとえば、1行目が見出しでA2セルからデータが始まる場合はこうなります。
=ROW()-1
A2セルでは ROW() が2を返します。2 – 1 = 1です。A3なら3 – 1 = 2、A4なら4 – 1 = 3と、自動で連番になりますよ。
ROW()-ROW(見出しセル)で開始行フリーにする
=ROW()-1 には弱点があります。データの開始行が2行目以外だと、引く数を変えなければなりません。見出しが2行あれば =ROW()-2、5行目から始まるなら =ROW()-4 と、毎回計算が必要です。
そこで、汎用的なのがこの書き方です。
=ROW()-ROW($A$1)
$A$1 は見出し行(連番の1つ上の行)を絶対参照で指定しています。データが何行目から始まっても、見出しセルを変えるだけで正しい連番になります。
見出しが2行ある場合は、参照を $A$2 にするだけです。
=ROW()-ROW($A$2)
A3セルに入力すると、3 – 2 = 1。A4なら4 – 2 = 2と、正しく連番が振られます。開始行を気にしなくてよいので、テンプレートの使い回しにも向いていますよ。
M365スピル対応:SEQUENCE関数との比較
Microsoft 365をお使いなら、SEQUENCE関数でも縦方向の連番を生成できます。
| 目的 | ROW()(※M365) | SEQUENCE() |
|---|---|---|
| 1から10の連番 | =ROW(A1:A10) → {1;2;…;10} | =SEQUENCE(10) |
| 100から始まる連番 | 計算が必要 | =SEQUENCE(10,1,100) |
| 偶数だけの連番 | 直接指定できない | =SEQUENCE(5,1,2,2) |
| 全バージョンで動作 | ROW()-N なら全対応 | Excel 2021以降のみ |
※ ROW()のスピル展開はMicrosoft 365(またはExcel 2021以降)のみ対応です。
連番を振ることが目的で、開始値や増分を自由に設定したいならSEQUENCE関数が便利です。一方、すべてのExcelバージョンで動作する連番が必要な場面では、ROW関数が安定した選択肢になります。
INDEX + ROW|行番号を動的に切り替える
INDEX関数の行引数にROW関数を使うと、行番号を動的に変えられます。
基本形:行番号をキーにした縦展開
INDEX関数の基本形はこちらです。
=INDEX(範囲, 行番号, [列番号])
この「行番号」の部分にROW関数を組み込むと、数式をコピーするだけで参照行が自動で変わります。
実際の数式:複数行を一括取得するサンプル
たとえば、B列からE列のデータ表があり、別の場所に縦方向に展開したい場合です。
=INDEX($B$2:$B$20, ROW()-ROW($A$1))
この数式をA2セルに入力すると、ROW()-ROW($A$1) は 2-1 = 1で、範囲の1行目を返します。A3にコピーすれば2行目、A4なら3行目と、順番にデータを取得できます。
MATCH関数と組み合わせれば、検索値に一致した行を柔軟に取得できますよ。
=INDEX($B$2:$E$20, MATCH($A2,$B$2:$B$20,0), COLUMN()-COLUMN($G$1))
この数式をH列以降に横にコピーすると、列番号が自動で変わります。INDEX + MATCH + COLUMNの3関数で、縦横どちらにも展開できる柔軟な数式になります。
SMALL + IF + ROW|条件付きデータ抽出の配列数式
ROW関数は、配列数式の中で行番号の配列を生成する役割も担います。レガシーExcel(Excel 2019以前)で条件に合うデータを順番に抽出する定番テクニックです。
ROWが行番号配列を生成する役割
次の配列数式は、A列が「東京」の行のB列の値を上から順に取り出します。
=IFERROR(INDEX($B$2:$B$20, SMALL(IF($A$2:$A$20="東京", ROW($A$2:$A$20)-ROW($A$2)+1), ROW()-1)), "")
※ Excel 2019以前では Ctrl + Shift + Enter で確定する必要があります。
ちょっとむずかしく見えますが、やっていることはシンプルです。
- ROW($A$2:$A$20)-ROW($A$2)+1 で1から始まる連番配列を生成
- IF関数で条件に合う行だけ番号を残し、それ以外はFALSEにする
- SMALL関数で小さい順に番号を取り出す
- INDEX関数でその番号の行のデータを返す
ROW関数が「行番号の配列を作る」という裏方の仕事を担っているわけです。IFERROR関数で該当データがなくなったときの #NUM! エラーを空文字に変換しています。
M365ではFILTER関数に置き換え
Microsoft 365をお使いなら、上記の配列数式はFILTER関数1つで置き換えられます。
=FILTER($B$2:$B$20, $A$2:$A$20="東京")
SMALL + IF + ROWの配列数式に比べて、圧倒的にシンプルですよね。M365環境であれば、新しく数式を書くときはFILTER関数を使うのがおすすめです。
ただし、既存のブックがExcel 2019以前で運用されている場合は、ROW関数を使った配列数式が現役で活躍します。
INDIRECT + ROWで動的セル参照
INDIRECT関数と組み合わせると、行番号から動的にセル参照を生成できます。
たとえば、ROW関数で行番号を取得し、ADDRESS関数でセル参照文字列に変換します。その参照文字列をINDIRECTで実際のセル参照に変えるパターンです。
=INDIRECT(ADDRESS(ROW()-1, COLUMN(), 4))
3つの関数を重ねていますが、処理の流れはシンプルです。ROW関数で行番号を取得し、ADDRESS関数でセル参照文字列(例: “A2″)に変換します。INDIRECTで、その文字列を実際のセル参照にしています。A3セルに入力した場合、「1行上のセル=A2」の値を返します。
もう1つの定番が、位置に依存しない固定配列を生成するパターンです。
=ROW(INDIRECT("1:10"))
この数式は、どのセルに入力しても {1;2;3;4;5;6;7;8;9;10} の配列を返します。セルの位置に左右されない点が、SMALL + IF の配列数式で重宝されるポイントです。
FILTER・SEQUENCEでROW関数が不要になるケース
Microsoft 365や Excel 2021以降では、ROW関数が担っていた役割の多くを新しい関数で代替できます。
ROW関数が担っていた役割と現代的な代替
| ROW関数の用途 | 代替関数 | メリット |
|---|---|---|
| 連番の自動生成 | SEQUENCE | 開始値・増分を引数で指定できる |
| 条件付きデータ抽出 | FILTER | 配列数式が不要でシンプル |
| 行番号配列の生成 | SEQUENCE | ROW(INDIRECT(…)) より直感的 |
新しく数式を書くときは、SEQUENCE・FILTERを優先した方が読みやすい数式になります。
それでもROW関数が必要な場面
新しい関数を使っていても、ROW関数の出番がなくなるわけではありません。
- Excel 2019以前の環境で連番や配列数式を使いたいとき
- 条件付き書式で「行番号が偶数なら色を付ける」判定をしたいとき
- 数式セル自身の位置を取得して、動的に処理を分岐させたいとき
- VBAやマクロに行番号を渡したいとき
新しい関数で連番や抽出を処理しつつ、行番号の取得が必要な場面ではROW関数を使う。この使い分けがポイントですよ。
ROW関数 よくある質問・エラー対処
#VALUE!・#REF!が出たときの確認ポイント
ROW関数でエラーが出るケースは多くありません。ただし、次の場面では注意が必要です。
| エラー | 原因 | 対処法 |
|---|---|---|
| #VALUE! | 引数にテキスト文字列を指定した | セル参照に修正する |
| #REF! | 参照先の行が削除された | 数式を再入力する |
=ROW(“A1”) のようにダブルクォーテーションで囲むと、文字列として扱われ #VALUE! エラーになります。正しくは =ROW(A1) です。引用符なしのセル参照を使ってください。
また、非連続範囲(例:=ROW((A1,A5)))は指定できません。連続した範囲で指定するようにしましょう。
ROWS関数との違いは?
名前が似ているROWS関数は、まったく別の関数です。
| 関数 | 機能 | 例 |
|---|---|---|
| ROW | 指定セルの行番号を返す | =ROW(A3) → 3 |
| ROWS | 範囲の行数を返す | =ROWS(A1:A3) → 3 |
ROW関数は「位置」を返し、ROWS関数は「個数」を返します。末尾にSが付くかどうかで意味が変わるので、混同しないように気をつけてくださいね。
同じ関係がCOLUMN関数とCOLUMNS関数にもあります。
まとめ
ROW関数は、セルの行番号を返すシンプルな関数です。単体ではあまり目立ちませんが、他の関数と組み合わせることで真価を発揮します。
この記事で紹介した活用パターンをおさらいします。
- ROW()-ROW(見出しセル) で行の増減に強い連番を作る
- INDEX + ROWで行番号を動的に切り替えて縦展開する
- SMALL + IF + ROWで条件付きデータを順番に抽出する(レガシー環境向け)
- INDIRECT + ROWで位置に依存しない固定配列を生成する
- M365ではSEQUENCE・FILTERが代替になるが、行番号の取得にはROWが現役
まずは手入力の連番を =ROW()-ROW($A$1) に置き換えるところから試してみてください。行を挿入しても連番が崩れないので、リストのメンテナンスがぐっと楽になりますよ。
