VLOOKUPの列番号、手入力で変えていませんか? 列が追加されるたびに数式を直すのは面倒ですよね。修正漏れでエラーが出ることもあります。COLUMNS関数を使えば、列番号を自動で管理できますよ。
この記事では、COLUMNS関数の基本的な書き方から他の関数との組み合わせパターンまでまとめて紹介します。
COLUMNS関数とは?
COLUMNS関数(読み方: コラムズ)は、指定したセル範囲の列数を数値で返す関数です。「COLUMNS」は英語の「COLUMN(列)」の複数形で、列がいくつあるかを意味します。
たとえば =COLUMNS(A1:E1) と入力すると、結果は 5 になります。A列からE列まで5列分あるからですね。行の範囲がどれだけ広くても、列数だけを数える点がポイントです。
NOTE
COLUMNS関数はExcel 2003以降のすべてのバージョンで使用できます。Microsoft 365やGoogleスプレッドシートでも同じ構文で利用可能です。
COLUMNS関数の書き方
基本構文
=COLUMNS(配列)
引数の説明
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 配列 | 必須 | 列数を調べたいセル範囲や配列を指定します。セル参照、名前付き範囲、配列定数のいずれも使えます |
引数は1つだけなので、覚えやすい関数です。ただし、COLUMN関数と違って引数の省略はできません。=COLUMNS() と書くとエラーになるので注意してください。
COLUMNS関数の基本的な使い方
セル範囲の列数を調べる
=COLUMNS(A1:E1)
A列からE列までの列数 5 を返します。行方向にどれだけ広がっていても結果は同じです。=COLUMNS(A1:E10) でも 5 になります。
単一セルの列数を調べる
=COLUMNS(B5)
単一セルは1列分なので、結果は 1 です。実務で単体で使う場面は少ないですが、数式の仕組みを理解するための基本として押さえておきましょう。
名前付き範囲の列数を調べる
=COLUMNS(売上データ)
名前の定義で「売上データ」と名付けた範囲の列数を返します。テーブルやデータ範囲に名前を付けている場合は、セル参照を書くよりわかりやすくなりますよ。
配列定数の列数を調べる
=COLUMNS({1,2,3;4,5,6})
配列定数の列数 3 を返します。カンマ(,)で区切られた要素が列に対応します。セミコロン(;)は行の区切りなので、列数には影響しません。
COLUMNS関数の実務活用パターン
パターン1: VLOOKUP関数と組み合わせて列番号を自動化
VLOOKUP関数で列番号を手入力していると、列の追加や削除のたびに修正が必要です。COLUMNS関数を組み合わせると、オートフィルで列番号が自動的にずれてくれます。
たとえば、A1:G10に商品データの表があるとします。E1に検索値を入力し、各列の値を横方向に取り出す数式は次のとおりです。
=VLOOKUP($E$1,$A$1:$G$10,COLUMNS($A$1:A1),FALSE)
この数式を右方向にコピーすると、COLUMNS関数の部分が次のように変化します。
COLUMNS($A$1:B1)→ 2COLUMNS($A$1:C1)→ 3
列番号が自動で増えるので、手入力の手間がなくなります。
TIP
同じテクニックはVLOOKUP関数の行方向でも使えます。HLOOKUPの行番号を自動化したい場合は、対になるROWS関数を使ってください。
パターン2: INDEX関数と組み合わせて最終列のデータを取得
データ範囲の最後の列の値を取り出したいときに便利なパターンです。
=INDEX(A1:G1,COLUMNS(A1:G1))
COLUMNS関数で範囲の列数を取得し、INDEX関数の列番号に渡しています。範囲が7列あるので、7列目(つまり最後の列)のデータを返します。
パターン3: OFFSET関数と組み合わせて可変範囲を作る
OFFSET関数の「幅」引数にCOLUMNS関数を使うと、範囲のサイズを動的に制御できます。
=OFFSET(A1,0,0,1,COLUMNS(データ範囲))
名前付き範囲「データ範囲」の列数に応じて、OFFSET関数が返す範囲の幅が変わります。グラフの参照範囲やドロップダウンリストの元データを可変にしたいときに活躍するパターンです。
パターン4: INDIRECT関数と組み合わせて動的な列数を取得
文字列で組み立てた範囲の列数を調べたいときに使えます。
=COLUMNS(INDIRECT("A1:"&B1&"1"))
セルB1に列文字(たとえば「E」)を入力すると、=COLUMNS(A1:E1) と同じ結果になります。ユーザーが列の範囲を指定して制御する仕組みを作りたいときに便利ですよ。INDIRECT関数の詳しい使い方は関連記事をご覧ください。
パターン5: データ件数の検証に使う
ROWS関数と組み合わせて、データ範囲の総セル数を計算できます。
=ROWS(A1:G10)*COLUMNS(A1:G10)
この数式は 10 * 7 = 70 を返します。想定どおりのデータサイズか確認したいときに使えるパターンです。ROWS関数で行数、COLUMNS関数で列数を取得し、掛け合わせて総セル数を求めています。
よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
| 引数なしでエラー | =COLUMNS() と引数を省略した | COLUMNS関数は引数が必須です。列数を調べたい範囲を必ず指定してください |
#REF! | 参照先の行や列が削除された | 参照先セルが存在するか確認してください |
#NAME? | 名前付き範囲のスペルミス | 名前の定義を確認してください。「数式」タブの「名前の管理」から一覧を見られます |
#VALUE! | 無効な値を引数に指定した | セル範囲、名前付き範囲、配列定数のいずれかを指定してください |
| 期待と違う数値が返る | 列数ではなく列番号を求めていた | 列番号がほしい場合はCOLUMN関数を使ってください |
似た関数との違い・使い分け
| 関数 | 戻り値 | 引数の対象 | 用途 |
|---|---|---|---|
| COLUMNS | 列数(サイズ) | セル範囲 | 範囲が何列あるかを調べる |
| COLUMN | 列番号(位置) | セル | セルが何列目にあるかを調べる |
| ROWS | 行数(サイズ) | セル範囲 | 範囲が何行あるかを調べる |
| ROW | 行番号(位置) | セル | セルが何行目にあるかを調べる |
COLUMNS関数とCOLUMN関数は名前が似ていますが、役割がまったく異なります。
- COLUMN関数: セルの「位置」を返す。
=COLUMN(C1)は3(3列目にある) - COLUMNS関数: 範囲の「サイズ」を返す。
=COLUMNS(C1:G1)は5(5列分ある)
覚え方は「複数形のCOLUMNSは範囲全体の列数を数える」と考えるとわかりやすいです。
COLUMNS関数とROWS関数は列と行の方向が違うだけの対称ペアです。構文も =COLUMNS(範囲) と =ROWS(範囲) で同じ形なので、セットで覚えてしまいましょう。
まとめ
COLUMNS関数はセル範囲の列数を取得するシンプルな関数です。他の関数と組み合わせることで、列番号の自動化やデータ範囲の動的制御に活用できます。
- 構文は
=COLUMNS(配列)で引数は1つだけ(省略不可) - COLUMN関数が「位置」、COLUMNS関数が「サイズ」を返す
- VLOOKUP・INDEX・OFFSETなどとの組み合わせが実務で便利
- 対称ペアのROWS関数もあわせて覚えておくと効果的
