「スプレッドシートで連番を振ったのに、行を追加したらズレてしまった…」そんな経験はありませんか?
手入力の連番は、行の追加や削除で簡単に崩れてしまいます。そのたびに振り直すのは面倒ですよね。
スプレッドシートのROW関数を使えば、行番号をもとに連番を自動作成できます。行の追加・削除にも自動で対応するので、メンテナンスの手間がなくなりますよ。
この記事では、ROW関数の基本から連番の作り方、INDEX・INDIRECTとの組み合わせ技まで紹介します。
スプレッドシートのROW関数とは?基本の仕組みを理解しよう
ROW関数(読み方: ロウ関数)は、セルの行番号を返す関数です。「ROW」は英語の「Row(行)」がそのまま名前になっています。
たとえばセルA3にROW関数を入力すると、結果は「3」です。そのセルが何行目にあるかを教えてくれるシンプルな関数です。
ROW関数にできることをまとめると、次のとおりです。
- セルの行番号を数値で返す
- 引数を省略すると、数式が入っているセル自身の行番号を返す
- 連番の自動作成に使える
- 他の関数と組み合わせて動的な参照を作れる
ROW関数の基本構文
=ROW([セル参照])
カッコの中に、行番号を知りたいセルを指定します。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| セル参照 | 任意 | 行番号を調べたいセル。省略すると数式のあるセル自身の行番号を返す |
引数は1つだけで、しかも省略可能です。スプレッドシートの関数の中でもトップクラスにシンプルな構文ですね。
ROW()引数なしとROW(A1)の違い
ROW関数の使い方は大きく2つあります。
=ROW()
引数なしで使うと、数式が入っているセルの行番号を返します。セルB5に入力すれば結果は「5」です。
=ROW(A1)
セル参照を指定すると、そのセルの行番号を返します。どのセルに入力しても結果は「1」です。
範囲を指定した場合は、先頭行の番号だけが返ります。
=ROW(B3:B10)
この結果は「3」です。B3からB10の範囲のうち、先頭のB3の行番号が返る仕組みです。
NOTE
ROW関数はGoogleスプレッドシートの全バージョンで使えます。Excelでもまったく同じ構文で動作しますよ。
ROW()-offsetで崩れない連番を作る
ROW関数の最も実用的な使い方が、行の追加・削除に強い連番の作成です。
行を追加・削除しても連番が維持される仕組み
手入力で「1, 2, 3…」と連番を振ると、途中に行を挿入したときに番号がズレます。ROW関数なら行番号をもとに計算するので、自動的に振り直されます。
たとえば、A2セルからデータが始まる表で連番を振る場合です。
=ROW()-1
A2セルに入力すると 2-1=1、A3セルなら 3-1=2 になります。数式を下にコピーするだけで連番が完成します。
途中に行を挿入しても、各セルのROW()の値が自動で変わるため、連番が崩れません。これが手入力との大きな違いです。
表の開始行が1行目でない場合の対処法
実務では、表の上にタイトルやヘッダーが複数行あるケースが多いですよね。たとえばデータが5行目から始まる場合を考えてみましょう。
=ROW()-1 だと5行目のセルは「4」になってしまいます。こんなときは次の数式を使います。
=ROW()-ROW($A$5)+1
$A$5 はデータ開始行のセルです。絶対参照にするのがポイントです。
| セル位置 | 計算内容 | 結果 |
|---|---|---|
| 5行目 | 5 – 5 + 1 | 1 |
| 6行目 | 6 – 5 + 1 | 2 |
| 7行目 | 7 – 5 + 1 | 3 |
この方法なら、表がどの行から始まっても正しい連番になります。行を挿入・削除しても自動で振り直されるので、メンテナンスフリーですよ。
TIP
もうひとつの連番作成方法としてSEQUENCE関数があります。
=SEQUENCE(10)で1から10までの連番を一括生成できます。ただし、ROW関数のほうが数式コピーで直感的に使えるので、まずはROW関数から覚えるのがおすすめです。
INDEX+ROWの組み合わせ技
INDEX関数と組み合わせて動的参照を作る
INDEX関数は、指定した範囲から行番号・列番号で値を取り出す関数です。ROW関数と組み合わせると、行の位置に連動して参照先が自動的に変わる数式を作れます。
たとえば、A1からA10に商品名が入っているとします。別の場所にこのリストを動的に参照したいケースを考えましょう。
=INDEX($A$1:$A$10, ROW())
この数式を1行目に入力すると、ROW()は「1」を返すのでA1の値が表示されます。2行目なら「2」でA2の値です。
データの開始行がずれている場合は、オフセットを加えます。
=INDEX($A$1:$A$10, ROW()-ROW($D$1)+1)
D1セルから数式を入力し始める場合の例です。ROW()-ROW($D$1)+1 で常に1から始まる連番を作り、INDEXの行番号に渡しています。
この組み合わせが活きる場面は次のとおりです。
- 元データの並び順を変えずに、別の場所で独自の一覧を作りたいとき
- フィルタ条件に応じて表示するデータを切り替えたいとき
- 複数のシートから特定の行を動的に引っ張りたいとき
INDEX関数の詳しい使い方は「スプレッドシートのINDEX関数の使い方」で解説しています。
INDIRECT+ROWの組み合わせ技
文字列参照でシートをまたいだ動的参照
INDIRECT関数は、文字列をセル参照として解釈する関数です。ROW関数と組み合わせると、セルアドレスを文字列で動的に組み立てることができます。
もっとも基本的なパターンはこちらです。
=INDIRECT("A" & ROW())
この数式をB3セルに入力すると、ROW()が「3」を返します。そのため INDIRECT("A3") となり、A3セルの値が表示されます。
これだけだとあまりメリットを感じないかもしれませんが、シートをまたぐ参照で真価を発揮します。
=INDIRECT("'売上データ'!B" & ROW())
「売上データ」シートのB列から、現在の行番号に対応するセルの値を取得できます。
さらに応用すると、シート名自体をセルから動的に取得することもできます。
=INDIRECT("'" & C1 & "'!B" & ROW())
C1セルに「4月売上」と入力されていれば、「4月売上」シートのB列を参照します。C1の値を変えるだけで参照先のシートが切り替わるので、月次レポートの作成に便利です。
NOTE
INDIRECT関数は文字列を参照に変換するため、参照先のシートが存在しないと
#REF!エラーになります。シート名のスペルに注意してください。
INDIRECT関数の詳しい使い方は「スプレッドシートのINDIRECT関数の使い方」を参考にしてみてください。
ROWとCOLUMNの違いと使い分け
ROW関数と似た関数にCOLUMN関数があります。どちらもセルの位置を数値で返しますが、方向が異なります。
比較表
| 項目 | ROW関数 | COLUMN関数 |
|---|---|---|
| 返す値 | 行番号(縦方向の位置) | 列番号(横方向の位置) |
| 構文 | =ROW([セル参照]) | =COLUMN([セル参照]) |
| 使用例 | =ROW(A3) → 3 | =COLUMN(C1) → 3 |
| 連番の方向 | 縦方向(下にコピー) | 横方向(右にコピー) |
| よくある用途 | 縦の連番、行ベースの動的参照 | 横の連番、列ベースの動的参照 |
使い分けのポイントはシンプルです。
- 縦方向の連番 → ROW関数
- 横方向の連番 → COLUMN関数
たとえば、月ごとの列ヘッダー(1月、2月…)を自動で作るならCOLUMN関数が向いています。
=COLUMN()-1
B1セルに入力して右にコピーすれば「1, 2, 3…」の連番になります。
また、ROWS関数(範囲の行数を数える関数)との混同に注意してください。ROW関数は「何行目か」、ROWS関数は「何行あるか」を返す、まったく別の関数です。
=ROW(A3:A10) → 3(先頭行の行番号)
=ROWS(A3:A10) → 8(範囲の行数)
よくあるエラーと対処法
ROW関数自体は非常にシンプルなので、単独でエラーになることはほとんどありません。ただし、他の関数と組み合わせたときにエラーが出るケースがあります。
| エラー | 原因 | 対処法 |
|---|---|---|
#REF! | 参照先のセルや行が削除された | 数式内のセル参照を確認し、有効な範囲に修正する |
#VALUE! | ROW関数に不正な文字列を渡した | 引数にはセル参照のみ指定する。文字列("A1"など)は不可 |
#REF!(INDIRECT併用時) | INDIRECT関数の参照先が存在しない | シート名やセルアドレスの文字列を確認する |
| 連番が飛ぶ | 非表示の行がある | フィルタで非表示にした行もROW関数は元の行番号を返す。SUBTOTAL関数と組み合わせて対処 |
特に注意したいのが「連番が飛ぶ」ケースです。フィルタで行を非表示にしても、ROW関数は元の行番号をそのまま返します。フィルタ後の見た目と連番が一致しないのは仕様です。
フィルタ後に1から始まる連番が必要な場合は、SUBTOTAL関数との組み合わせを検討してみてください。ARRAYFORMULA関数を使う方法もありますよ。
TIP
ROW関数の引数にセルアドレスの文字列を渡すのはよくある間違いです。
=ROW("A1")はエラーになります。文字列をセル参照に変換したい場合は、INDIRECT関数を使いましょう。=ROW(INDIRECT("A1"))のように書けばOKです。
まとめ
ROW関数は、セルの行番号を返すシンプルな関数です。単体で使うだけでなく、連番や動的参照の土台として幅広く活用できます。
この記事のポイントをおさらいしておきましょう。
- ROW関数は引数なしで自分のセルの行番号、セル参照指定でそのセルの行番号を返す
=ROW()-ROW($開始セル)+1で、表がどの行から始まっても正しい連番を作れる- 行の追加・削除にも自動対応するので、手入力の連番より圧倒的にラク
- INDEX関数と組み合わせれば、行位置に連動する動的な値の取得ができる
- INDIRECT関数と組み合わせれば、シートをまたいだ動的参照も可能
- ROW関数は「何行目か」、COLUMN関数は「何列目か」、ROWS関数は「何行あるか」
まずは =ROW()-ROW($A$1) の連番パターンから試してみてください。行の追加・削除のたびに番号を振り直す手間がなくなりますよ。
