🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

ExcelのROWSとCOLUMNS関数 — 範囲の「位置」ではなく「サイズ」を数える

|

ExcelのROWSとCOLUMNS関数 — 範囲の「位置」ではなく「サイズ」を数える

要点ROWS(配列) は範囲や配列が 何行あるか を、COLUMNS(配列)何列あるか を返します。ROWS(A1:A10)10COLUMNS(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   列全体 — 物理的な行数

ROWSCOLUMNS は、置き換える「列は 3 つある/データは 200 行目で終わる」という 壊れやすい直書きロジックの多さに気づくまでは、雑学のように見えます。この二つは、 同僚が壊す固定の数値を、Excel が範囲そのものから計算し直す値に変えます。コツは、 単数形のいとこたちと取り違えないことです。

この記事でわかること

  • 考え方の軸: ROWS/COLUMNS は位置ではなくサイズを測る
  • 一文字の落とし穴: なぜ ROW(A1:A10)ROWS(A1:A10) が別のものを返すのか
  • 決定的な使い方: 列を挿入しても壊れない VLOOKUP の列インデックス
  • 動的配列FILTER が生み出した行数を数える
  • 数値を直書きせずに範囲の 最終行/中点 を見つける
  • ROWS(A:A) が 100 万超になる「列全体」の落とし穴

考え方の軸: 位置ではなくサイズ

複数形がすべてを物語ります。ROWCOLUMNこのセルはどこにあるか に答え、 座標を返します。ROWSCOLUMNS は別の問いに答えます。このブロックはどれだけ 大きいか — カウントを返します。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 は単一の合計を返します。素のセルでは違いは明らかですが、 間違ったほうを INDEXSEQUENCESUMPRODUCT に落とし込むと、警告してくれる エラーも出ないまま間違った答えになります — 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 列ずつ広がるので、COLUMNS2, 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

内面化すべき落とし穴が一つ。ROWSCOLUMNS は、与えられたものが どれだけ 埋まっているか ではなく、物理的な サイズを数えます。

=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(...) で包みます。そして ROWROWS を取り違えた数式を 貼り付ければ、静かな千桁ずれになる前に、単数形か複数形かの取り違えを捉えます。

よくある質問

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) に置き換えます。 数式を右へドラッグすると範囲が広がり、COLUMNS2, 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