要点 —
ROW([参照])はセルの 行番号 を、COLUMN([参照])はその 列番号 を返します — そこに格納された値ではなく、位置です。ROW(A10)は10、COLUMN(C1)は3です。引数を省略すると、それぞれ数式が入っているセルの座標を 返します — セル A5 の=ROW()は5です。この一点 — これらの関数は値ではなく 番地を読む — が、役に立つ働きのすべてを支えています。行を挿入すると自分で振り 直される連番、MOD(ROW(),2)によるゼブラ縞、そしてINDEXや配列数式の内部へ 送り込む位置情報です。
=ROW() ' -> 5 この数式がある行(ここでは 5 行目)
=ROW(A10) ' -> 10 A10 の行番号(中身ではない)
=COLUMN() ' -> 3 この数式がある列(C 列)
=COLUMN(D1) ' -> 4 D は 4 番目の列
=ROW()-ROW($A$2)+1 ' -> 1,2,3 A2 を起点にした自己修復型の連番
=MOD(ROW(),2)=0 ' -> TRUE/FALSE 1 行おき、縞模様用
ROW と COLUMN は、学ぼうと決めたわけでもないのに使っている二つの関数です —
ネットで見つけた連番の数式をコピーし、動いたから先へ進む。しかしこの二つは、他の
どの関数も答えない問いに答えます。このセルはどこにあるか、この範囲はどれだけ
大きいか。「セルの位置」と「セルの値」を頭の中で切り分ければ、動的で自動調整される
数式の一群がまるごと開けてきます。
この記事でわかること
- 考え方の軸: ROW と COLUMN は中身ではなく座標を返す
- 引数なしの
ROW()が数式自身の行を返す理由 — そしてそれこそが便利な点 - 最大の誤解:
ROW(C10)は10であって、C10 の中身ではない ROW()-ROW(アンカー)+1による自己修復型の連番MOD(ROW(), n)による縞模様と n 行ごとのロジック- COLUMN の「数値か列文字か」の落とし穴、そして
INDEXの内部に隠れたエンジンとしての ROW
考え方の軸: 中身ではなく座標
ほとんどすべての Excel 関数は、セルの 中身 を読みます — SUM は値を合計し、
VLOOKUP は値を探し、TEXT は値を書式変換します。ROW と COLUMN は、中身を
完全に無視して番地を報告する変わり者のペアです。何行目か、何列目か。「自分は
グリッドのどこにいるか」を尋ねるセルだと考えてください — 「自分は何を保持している
か」ではなく。
どちらも省略可能な参照を取ります。ROW(A10) は A10 が 10 行目にあるので 10 を
返し、COLUMN(C1) は C が 3 列目なので 3 を返します。引数を省略すると、関数は
自分自身の位置を報告します — A5 に入力した =ROW() は 5 を返し、下のセルへ
ドラッグした瞬間に 6 を返します。この自己参照は回避すべき癖ではありません。
それこそが要点であり、ROW をカウンターとして使えるようにしているものです。
先に一つ安心材料を。OFFSET や INDIRECT と違い、ROW と COLUMN は揮発性では ありません。 キー入力のたびに再計算しないので、あの二つの参照関数がもたらす速度 低下なしに、モデル全体に何千個ちりばめても問題ありません。
引数なしの ROW() は数式自身の行を返す
任意のセルに =ROW() と入力すると、それが存在する行の番号が得られます。下へ
ドラッグすると結果は増えていきます — 2, 3, 4, … — 各コピーが 自分自身の 新しい
行を報告するからです。これが「行に自動で番号を振る」ほぼすべてのレシピの背後にある
仕組みです。
=ROW() ' A2 で -> 2、A3 で -> 3、A4 で -> 4(各コピーが自分の行を報告)
=COLUMN() ' B1 で -> 2、C1 で -> 3、D1 で -> 4(COLUMN は横方向に数える)
すぐにぶつかる落とし穴。データが 2 行目から始まる場合(1 行目が見出しのため)、
=ROW() は 2, 3, 4 を返します — 1 つずれます。これは ROW のバグではありません。
ROW が自分のいる場所についてありのままの真実を告げているのです。直し方は
アンカーで固定する ことで、それが次の節です。
最大の誤解: ROW(参照) は値ではなく位置
人を検索エンジンへ走らせる間違いがこれです。=ROW(C10) と書いて C10 の中身を
期待し、代わりに 10 を得るのです。
=ROW(C10) ' -> 10 C10 の行番号であって、C10 に格納された値ではない
ROW は「C10 は何行目か」と尋ねられ、正直に答えました。10 行目です。セルの中は
決して覗きません。計算した位置にある 値 が欲しいなら、それは
INDEX の仕事です — INDEX は行番号(多くは ROW や
MATCH が生み出したもの)を取り、中身を返します。この
境界を鋭く保ってください。ROW/COLUMN は座標を見つけ、INDEX は座標を値に変える。
「ROW が期待どおりの値を返さない」という問いのほぼすべては、この線を守った瞬間に
解けます。
自己修復型の連番: ROW() からアンカーを引く
ROW の最も価値ある使い方は、行の挿入や削除に耐える 連番です。手打ちの
1, 2, 3 は、誰かが途中に行を挿入した瞬間に壊れます。ROW ベースの番号は、ただ
自分で振り直します。
=ROW()-ROW($A$2)+1 ' データが始まる行(A2)で 1、A3 で 2、A4 で 3
=ROW()-1 ' 見出しがちょうど 1 行目のときの簡略形
考え方の軸に沿って読み解きます。ROW() は この 行、ROW($A$2) はリストが始まる
固定の行、そして引き算が先頭からのオフセットを与え、+1 で 1 始まりにします。
アンカーが絶対参照($A$2)なので下へコピーしても動かず、ROW が生きた位置を読み
直すので、リストのどこかに行を挿入すると、その下すべてが自動で振り直されます。
これこそがこの数式が消し去るために存在する失敗パターンです。挿入後にひそかに
1, 2, 3, 3, 4 となり、監査まで誰も気づかない手動連番です。
縞模様とグループ分け: MOD(ROW(), n)
ROW を MOD に送り込むと、リズム生成器になります — n 行ごと に何かをする方法です。定番は条件付き書式でのゼブラ縞です。
=MOD(ROW(),2)=0 ' 偶数行で TRUE -> 1 行おきに色を塗る
=MOD(ROW()-2,3)=0 ' データ開始(2 行目)から数えて 3 行ごとに TRUE
=INT((ROW()-2)/3)+1 ' -> 1,1,1,2,2,2,3,3,3 グループ番号、3 行で 1 グループ
MOD(ROW(),2) は 1,0,1,0… と循環し、=0 で判定すると縞のための 1 行おきが
得られます。ここでの失敗パターンは連番と同じ 1 つずれです。テーブルが想定した行から
始まらない場合、アンカーを引いて(ROW()-2)、パターンをワークシートの先頭では
なくデータの先頭から始めます。アンカーさえ正しければ、一つの数式で任意の長さの
テーブルに縞を付けたりグループ分けしたりできます。
COLUMN: 横向きの双子と「数値か列文字か」の落とし穴
上記のすべてが COLUMN にも当てはまります。90 度回転させただけです。COLUMN() は
数式自身の列を報告し、COLUMN(D1) は 4 です。目玉の用途は、右へドラッグするに
つれて 横方向 に数える連番です — 水平な連番を作ったり、増加するインデックスに
送り込んだりします。
=COLUMN()-COLUMN($B$1)+1 ' B から右へドラッグ: 1, 2, 3, 4 ...
誰もが引っかかる落とし穴。COLUMN は列文字ではなく 数値 を返します。 C 列は
3 であって、"C" ではありません。実際に文字が必要なら(たとえば文字列の番地を
組み立てるため)、COLUMN 単独では無理です — ADDRESS
を使えば $C$1 を返してくれるので、必要な部分を抜き出します。列 番号 と列 文字
を混同することが COLUMN の悩みの大半の源です。両者は異なる仕事のための異なるデータ
型です。
INDEX と SMALL(IF()) のための配列エンジンとしての ROW
ROW に単一セルではなく 範囲 を与えると、行番号の 配列 を返します。1 行につき
1 つ — ROW(A1:A5) は {1;2;3;4;5} です。このスピルした配列が、多くの高度な数式の
内部にある静かなエンジンです。
=INDEX($D$2:$D$100, ROW()-1) ' N 番目のリスト項目を 1 行ずつ取り出す
=SMALL(IF(status="Open", ROW(status)), k) ' k 番目の「Open」レコードの行番号
=SEQUENCE(ROWS(data)) ' 現代的でスピルに適した同等物
SMALL(IF(条件, ROW(範囲)), k) の慣用句 — 条件が真である行番号を集め、k 番目に
小さいものを選ぶ — は、動的配列が登場する前、長年にわたって「最初の一致だけでなく
すべての一致を返す」ための 方法でした。Excel 365 では通常
FILTER や
SEQUENCE に手を伸ばしますが、受け継いだブックでは
今も ROW 配列パターンに出会います。そして ROW(範囲) が 位置のリストを生成して
いる と知ることが、それらの数式を魔法ではなく読めるものにしてくれます。
使いどころの判断
構文は些細です — 行番号なら ROW、列番号なら COLUMN、引数を省けば「ここ」を
意味します。判断とは、自分が 値 の問題ではなく 位置 の問題の中にいると
気づくことです。目印はこうです。連番(1, 2, 3…)や「1 行おきに色を塗る」ルール、
あるいは同僚が行を挿入して必ず壊す増加インデックスを手打ちしようとしているとき —
それは ROW/COLUMN の仕事であり、絶対参照に固定すれば自己修復します。そして
ROW(C10) が C10 の 中身 を返すと期待している自分に気づいた瞬間、止まって
ください。その位置を値に変えるのは INDEX の役目です。位置か値かの線を守れば、この
二つの小さな関数が静かにあなたのシートを堅牢にします。
ExcelMasterの活用
アンカー付けこそ、ROW の数式が間違えがちな細かな部分です。ExcelMaster に
「行を挿入しても正しいままの行番号列」を頼むと、コピペした 1 つずれのものではなく、
あなたの 実際の見出し行に固定した =ROW()-ROW($A$2)+1 を書きます。「3 行ごとに
色を塗って」と頼めば、データが始まる場所から始まる条件付き書式の範囲に、正しい
MOD(ROW()-アンカー, 3) ルールを返します。そして「5 行下の値を取って」のように
値 の問題を位置の言葉で説明すると、それが INDEX の仕事だと認識し、欲しくもない
数値を返す ROW を渡したりしません。
よくある質問
Excel の ROW 関数は何をしますか?
ROW([参照]) はセルの行番号を返します。=ROW(A10) は 10 を返します。参照を省略
すると、数式を含むセルの行番号を返すので、セル B7 の =ROW() は 7 を返します。
グリッド上の 位置 を報告するもので、セルに格納された値を返すことは決してありません。
現在のセルの行番号を取得するには?
引数なしの =ROW() をそのセルに入力すると、そのセル自身の行番号を返します。同様に
=COLUMN() は自身の列番号を返します。どこから始まっても 1 から番号を振るには、
アンカーを引きます。=ROW()-ROW($A$2)+1 は A2 を含む行で 1、次の行で 2、という
ように返します。
なぜ ROW はセルの値ではなく数値を返すのですか?
それが仕事だからです — ROW はセルの 中身 ではなく どこにあるか を報告します。
=ROW(C10) は 10 を返します(C10 は 10 行目)。計算した位置の値を取り出すには、
行番号を INDEX に渡します。たとえば =INDEX(D:D, ROW(C10)) は D10 の中身を
返します。
ROW と ROWS の違いは?
ROW(単数)は位置を返します — セルの行 番号 です。ROWS(複数)はカウントを
返します — 範囲に何 行 あるか。ROWS(A1:A10) は 10 です。単数は座標、複数は
サイズです。Excel ROWS と COLUMNS を参照してください。
COLUMN が数値ではなく列文字を返すようにするには?
できません — COLUMN は常に数値を返します(C 列は "C" ではなく 3)。列 文字
を得るには ADDRESS を使います。たとえば
=SUBSTITUTE(ADDRESS(1, COLUMN(), 4), "1", "") が文字部分を抽出します。
Excel ADDRESS を参照してください。
動作確認環境
動作確認環境: Excel 365 (Windows 11) — 最終確認 2026-07-13。
関連ガイド: Excel ROWS と COLUMNS · Excel HYPERLINK · INDEX と MATCH · Excel ADDRESS · Excel OFFSET
