要点 —
ROWS(配列)は範囲や配列が 何行あるか を、COLUMNS(配列)は 何列あるか を返します。ROWS(A1:A10)は10、COLUMNS(A1:C1)は3です。 複数形は サイズ を測り、単数形の ROW と COLUMN は 位置 を報告します — 一文字の 違いが答えをまるごと変えます。見返りは、自分でサイズを調整する数式です。列を 挿入しても正しいままのVLOOKUPの列インデックス、FILTERが返した行数、そして 数値を直書きしない「最終行」です。
=ROWS(A1:A10) ' -> 10 範囲の行数
=COLUMNS(A1:C1) ' -> 3 範囲の列数
=ROWS(A1:C10) ' -> 10 やはり 10 — 行を数え、幅は無視する
=COLUMNS($A$1:C$1) ' -> 3 終点をドラッグで広げると増える: 1, 2, 3, ...
=ROWS(FILTER(data, keep)) ' -> 42 フィルターが返した行数
=ROWS(A:A) ' -> 1048576 列全体 — 物理的な行数
ROWS と COLUMNS は、置き換える「列は 3 つある/データは 200 行目で終わる」という
壊れやすい直書きロジックの多さに気づくまでは、雑学のように見えます。この二つは、
同僚が壊す固定の数値を、Excel が範囲そのものから計算し直す値に変えます。コツは、
単数形のいとこたちと取り違えないことです。
この記事でわかること
- 考え方の軸:
ROWS/COLUMNSは位置ではなくサイズを測る - 一文字の落とし穴: なぜ
ROW(A1:A10)とROWS(A1:A10)が別のものを返すのか - 決定的な使い方: 列を挿入しても壊れない
VLOOKUPの列インデックス - 動的配列 や
FILTERが生み出した行数を数える - 数値を直書きせずに範囲の 最終行/中点 を見つける
ROWS(A:A)が 100 万超になる「列全体」の落とし穴
考え方の軸: 位置ではなくサイズ
複数形がすべてを物語ります。ROW と COLUMN は このセルはどこにあるか に答え、
座標を返します。ROWS と COLUMNS は別の問いに答えます。このブロックはどれだけ
大きいか — カウントを返します。ROWS(A1:A10) は範囲に何が入っているかもどこに
あるかも気にせず、範囲が 10 行 にまたがると報告します。COLUMNS(A1:C1) は
3 列 と報告します。
だから ROWS(A1:C10) は 30 ではなく 10 です。行 を数えるのであり、3 列幅で
あろうと範囲は 10 行の高さだからです。この二つの関数は長方形の巻尺です — 一方が
高さ、もう一方が幅を返します。単数形のいとこと同じく 揮発性ではなく、範囲参照
でも 配列リテラル(ROWS({1;2;3}) は 3)でも問題なく測ります。そのため、別の
関数にサイズを渡す安価で安定した手段になります。
一文字の落とし穴: ROW と ROWS
これは記憶に焼き付ける価値のある混同です。配列数式の内部で 静かに 失敗するから です。
=ROW(A1:A10) ' -> {1;2;3;4;5;6;7;8;9;10} 位置の配列(単数)
=ROWS(A1:A10) ' -> 10 単一のカウント(複数)
単数の ROW に範囲を与えると 1 行につき 1 つ の数値を返します — スピルした座標の
リストです。複数の ROWS は単一の合計を返します。素のセルでは違いは明らかですが、
間違ったほうを INDEX、SEQUENCE、SUMPRODUCT に落とし込むと、警告してくれる
エラーも出ないまま間違った答えになります — SEQUENCE(ROW(data)) は間違った長さの
連番を作ろうとし、SEQUENCE(ROWS(data)) は意図どおりデータ 1 行につき 1 行を
作ります。「いくつ」を意味するなら複数形。「どれ」を意味するなら単数形です。
決定的な使い方: 決して壊れない VLOOKUP の列インデックス
COLUMNS が行う最も価値あることは、VLOOKUP を
編集に耐えさせることです。VLOOKUP の第 3 引数は固定の数値です — 2 列目、3 列目、
4 列目を返す — そしてその数値こそ、誰かがテーブルに列を挿入したときに壊れるもの
です。COLUMNS に置き換えれば、計算し直されます。
=VLOOKUP($A2, Prices, COLUMNS($B$1:B$1), FALSE) ' 最初の結果列 -> インデックス 2
' 右へドラッグ: COLUMNS($B$1:C$1) -> 3, COLUMNS($B$1:D$1) -> 4, ...
左端を固定し($B$1)、右端はドラッグに合わせて動かします。範囲は 1 ステップごとに
1 列ずつ広がるので、COLUMNS は 2, 3, 4… と数え、VLOOKUP に自分で登っていく
インデックスを渡します。インデックスが手打ちではなく シートから導かれる ように
なったので、列を挿入するとすべてが一貫してずれ、ルックアップは正しいフィールドを
指し続けます。これこそ複数形の関数が存在するまさに理由です。調整されるサイズは、
直すのを覚えておかねばならない数値に勝る。 (Excel 365 では
INDEX/MATCH や XLOOKUP がインデックスを丸ごと回避します
— が、すでに世に出ている何百万もの VLOOKUP には、COLUMNS が加えられる最も安価な
補強です。)
動的配列やフィルター結果を数える
ROWS をスピルする数式で包むと、「それはいくつ返したか」が得られます — しばしば
COUNT 系よりも直接的に。
=ROWS(FILTER(Orders, Region="West")) ' 西地域の注文がいくつ一致したか
=ROWS(UNIQUE(Customers)) ' 異なる顧客がいくつか
=COLUMNS(A1#) ' スピル範囲の幅(# 演算子)
ROWS(FILTER(...)) は、結果そのものを測ることで「条件を満たすレコードがいくつある
か」に答えます — フィルターの条件と同期させ続けねばならない別の COUNTIFS は不要
です。ROWS/COLUMNS をスピル参照(A1#)に向ければ、動的配列が伸び縮みするなか
での生きた寸法がわかります。考え方の軸は保たれます。内側の数式が生み出したものの
サイズを測っているのです。
最終行、中点、直書きしない範囲サイズ
ROWS は範囲の高さを与えるので、サイズが変わり続ける範囲の 最後の 項目や
真ん中 に到達するきれいな方法です。
=INDEX(data, ROWS(data)) ' 1 列範囲の最後の値
=INDEX(data, ROWS(data)/2) ' おおよその中点
=INDEX(data, ROWS(data)-1) ' 最後から 2 番目の値
INDEX(data, ROWS(data)) は「件数 の位置にある項目」— つまり最後の一つ — と
読め、範囲が伸びても正しいままです。一方、直書きの INDEX(data, 200) は新しい行を
静かに取りこぼしたり、末尾を越えて指したりします。ROWS が防ぐ失敗パターンは、
データが拡張した後に誰もが更新し忘れる手打ちの行数です。
列全体の落とし穴: ROWS(A:A) は 1,048,576
内面化すべき落とし穴が一つ。ROWS と COLUMNS は、与えられたものが どれだけ
埋まっているか ではなく、物理的な サイズを数えます。
=ROWS(A:A) ' -> 1048576 列内のすべての行が存在する、埋まっていようといまいと
=COLUMNS(A:A) ' -> 1 A 列はちょうど 1 列幅
=COLUMNS(A:C) ' -> 3
ROWS(A:A) はワークシートの全高です — 100 万超 — 参照が列全体 そのもの だから
です。それが「手元にあるデータの行数」であることはまずありません。それには
COUNTA(空白でないセル)か、スピル/FILTER の
カウントが必要です。列全体参照の物理的な寸法を、使用されている行のカウントと混同する
ことが、この関数が人を驚かせる唯一の道です。「この参照はどれだけ大きいか」と
「どれだけ埋まっているか」を切り分けてください。
使いどころの判断
寸法を直書きしようとしている ときはいつでも複数形に手を伸ばしてください。4 と
手打ちした VLOOKUP のインデックス、同僚が来週には無効にする「データは 500 行目で
終わる」、「横に 12 か月ある」 — どれも ROWS/COLUMNS になるのを待っており、手
打ちする代わりに範囲から導いた瞬間、それぞれが自動調整になります。唯一の本当の
危険は単数形/複数形の取り違えです。一つの数値を期待していた場所で、数式が疑わしい
ほど長いスピル配列を返し始めたら、ほぼ間違いなく ROWS と書くべきところに ROW と
書いています。サイズは複数形で測り、位置は単数形で読めば、直書きの数値がモデルから
消えていきます。
ExcelMasterの活用
COLUMNS ベースの VLOOKUP インデックスは、やるべき と分かっていながらめったに
手をつけない類の補強です。ExcelMaster に「この VLOOKUP を列の挿入に耐えさせて」
と頼むと、ドラッグに合わせて登る固定済みの COLUMNS($B$1:B$1) として第 3 引数を
書き直します — あるいは現代的なビルドなら INDEX/MATCH 版を提案します。「フィルターが
何行返したか」を尋ねれば、同期させ続けねばならない 2 つ目の COUNTIFS を継ぎ足すの
ではなく、結果を ROWS(...) で包みます。そして ROW と ROWS を取り違えた数式を
貼り付ければ、静かな千桁ずれになる前に、単数形か複数形かの取り違えを捉えます。
よくある質問
Excel の ROWS 関数は何をしますか?
ROWS(配列) は範囲や配列の行数を返します。=ROWS(A1:A10) は 10 を返し、
=ROWS(A1:C10) も、幅に関わらず範囲が 10 行の高さなので 10 を返します。ROW が
セルの行 番号 を返すのと違い、これは サイズ を測ります。
ROW と ROWS(および COLUMN と COLUMNS)の違いは?
複数形は数え、単数形は位置を特定します。ROWS(A1:A10) は 10(何行あるか)を返し、
ROW(A1:A10) は配列 {1;2;…;10}(各行の番号)を返します。サイズが必要なら
ROWS/COLUMNS、位置が必要なら ROW/COLUMN を使います。
範囲の列数を数えるには?
=COLUMNS(範囲) を使います。=COLUMNS(A1:F1) は 6 を返します。行上で実際に
埋まっている列数を数えるには COUNTA と組み合わせますが、定義された範囲の幅なら
COLUMNS が正確です。
COLUMNS はどうやって VLOOKUP 数式を堅牢にしますか?
VLOOKUP の直書きした第 3 引数を、固定済みの COLUMNS($B$1:B$1) に置き換えます。
数式を右へドラッグすると範囲が広がり、COLUMNS は 2, 3, 4… を返すので、列
インデックスが自動で登り、列が挿入されても機能し続けます — 手動の振り直しは不要です。
なぜ ROWS(A:A) は 1,048,576 を返すのですか?
列全体の参照はシート内のすべての行 そのもの であり、Excel のワークシートは
1,048,576 行あるからです。ROWS/COLUMNS は、埋まっているセルの数ではなく、参照の
物理的なサイズを報告します。使用されている行数には COUNTA(A:A) か FILTER の結果を
使います。
動作確認環境
動作確認環境: Excel 365 (Windows 11) — 最終確認 2026-07-13。
関連ガイド: Excel ROW と COLUMN · Excel HYPERLINK · Excel VLOOKUP · INDEX と MATCH · Excel FILTER
