VLOOKUPの列番号でミスしたことありませんか? 列を追加するたびに数式を修正するのは、地味にストレスですよね。そのまま放置すると、参照先がズレて間違った値を返してしまうことも。そんな悩みを解決するのが、ExcelのCOLUMN関数です。
この記事では、COLUMN関数の基本から、VLOOKUPとの組み合わせ、横方向の連番生成まで、実務で使えるテクニックを紹介します。
COLUMN関数とは?基本の使い方をおさらい
COLUMN関数(読み:カラム)は、セルの列番号を数値で返す関数です。A列なら1、B列なら2、C列なら3を返します。名前のとおり「列(Column)」の番号を取得する、シンプルな関数です。
構文はこちらです。
=COLUMN([参照])
引数は1つだけで、しかも省略もできます。
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 参照 | 省略可 | 列番号を知りたいセルまたは範囲 |
それでは、具体的な使い方を見ていきましょう。
引数なし:今いる列の番号をそのまま返す
引数を省略すると、数式を入力したセル自身の列番号を返します。
=COLUMN()
たとえば、C3セルにこの数式を入れると「3」が返ります。D列なら「4」、E列なら「5」です。「いま自分がどの列にいるか」を取得したいときに便利ですよ。
引数あり:任意のセルの列番号を取得する
引数にセル参照を指定すると、そのセルの列番号を返します。
=COLUMN(A1) → 1
=COLUMN(D10) → 4
=COLUMN(G5) → 7
範囲を指定した場合は、左端の列番号を返します。たとえば =COLUMN(B1:E1) は「2」です。Microsoft 365環境では、スピルで {2,3,4,5} と複数の列番号を返します。
ROW関数との対称パターン表(行と列の整理)
COLUMN関数には、行番号を返すROW関数という対になる関数があります。この2つは完全に対称です。
| 比較項目 | ROW() | COLUMN() |
|---|---|---|
| 返す値 | 行番号(縦方向) | 列番号(横方向) |
| 省略時 | 数式セルの行番号 | 数式セルの列番号 |
| 連番の方向 | 下にコピーで増える | 右にコピーで増える |
| 典型パターン | =ROW()-ROW($A$1) | =COLUMN()-COLUMN($A$1) |
ROW関数で縦方向の連番を振った経験があれば、COLUMN関数はその横方向バージョンだと考えてください。
VLOOKUP × COLUMN関数|列番号を自動化する方法
COLUMN関数が最も活躍するのは、VLOOKUP関数との組み合わせです。VLOOKUPの第3引数「列番号」を手入力していませんか?
手入力の列番号が壊れる場面(列追加・削除のあるある)
VLOOKUPの列番号を手入力で「2」「3」「4」と書いていると、こんな問題が起きます。
- 検索範囲の途中に列を追加すると、番号がズレる
- 列を削除したときも、全数式を修正する必要がある
- コピーして横に展開するとき、手動で番号を変える手間がかかる
数式が数個ならまだ対処できます。でも数十個あると、修正漏れが確実に発生しますよね。
COLUMN()-Nでズレを計算する思考ステップ
COLUMN関数を使えば、列番号が自動で変わります。考え方は次の3ステップです。
COLUMN()で数式セルの列番号を取得するCOLUMN(検索範囲の左端)で基準の列番号を取得する- 差分に+1して、VLOOKUPの列番号にする
汎用的な計算式はこうなります。
COLUMN() - COLUMN(検索範囲の左端) + 1
たとえば、数式がC列、検索範囲がB列始まりの場合を考えます。COLUMN() は3、COLUMN($B$1) は2です。3 – 2 + 1 = 2で、検索範囲の2列目を返します。D列にコピーすれば自動で3列目になりますよ。
実際の数式:複数列を一括で取得するサンプル
実際のVLOOKUP数式に組み込むと、こうなります。
=VLOOKUP($A2, $B:$F, COLUMN()-COLUMN($B$1)+1, 0)
この数式をC列からF列まで横にコピーするだけで、各列の値を取得できます。列を追加・削除しても数式の修正は不要です。
もし検索範囲がA列始まりで、数式がB列から始まるシンプルなケースなら、もっと短く書けます。
=VLOOKUP($A2, $A:$F, COLUMN(), 0)
B列の COLUMN() は2なので、検索範囲の2列目を返します。引く数が不要になり、スッキリした数式になります。実務では検索範囲の開始位置に合わせて使い分けてみてください。
横方向に連番を自動生成する
COLUMN関数は、横方向に1, 2, 3…と連番を振りたいときにも使えます。
基本パターン:COLUMN()-Nで1・2・3…と振る
B列から横方向に連番を振る場合、次の数式を使います。
=COLUMN()-COLUMN($B$1)+1
B列に入力すると1、C列なら2、D列なら3を返します。ROW関数で縦方向に連番を振るのと同じ発想ですね。
A列から始める場合は、もっとシンプルです。
=COLUMN()
A列=1、B列=2、C列=3と、そのまま連番になります。
M365スピル対応:SEQUENCE関数との比較
Microsoft 365をお使いなら、SEQUENCE関数でも横方向の連番を生成できます。
| 目的 | COLUMN()(※M365) | SEQUENCE() |
|---|---|---|
| 1から5の連番 | =COLUMN(A:E) → {1,2,3,4,5} | =SEQUENCE(1,5) |
| 3から始まる連番 | 直接指定できない | =SEQUENCE(1,5,3) |
| 実際の列番号を取得 | =COLUMN(C:F) → {3,4,5,6} | 計算が必要 |
※ COLUMN()のスピル展開はMicrosoft 365(またはExcel 2021以降)のみ対応です。
連番を振ることが目的ならSEQUENCE関数の方がシンプルです。一方、実際のセル位置(列番号)が必要な場面ではCOLUMN関数が適しています。目的に応じて使い分けてみてください。
INDEX + MATCH + COLUMNの組み合わせ
VLOOKUPよりも柔軟な検索ができるINDEX関数 + MATCH関数の組み合わせでも、COLUMN関数は活躍します。
VLOOKUPからINDEX+MATCHに移行するときの書き方
INDEX + MATCHの基本形はこちらです。
=INDEX(戻り範囲, MATCH(検索値, 検索範囲, 0))
VLOOKUPとの違いは、検索列と戻り列を別々に指定する点です。検索列より左の値も取得できるのが大きなメリットですね。
詳しい比較は「VLOOKUP・XLOOKUP・INDEX MATCHの比較」もあわせてご覧ください。
COLUMN関数で列参照をまとめて横展開する
INDEX + MATCHを横方向にコピーしたいとき、戻り範囲をCOLUMN関数で動的に指定できます。
=INDEX($B$1:$F$100, MATCH($A2,$B$1:$B$100,0), COLUMN()-COLUMN($B$1)+1)
この数式をC列以降にコピーすると、COLUMN関数の部分が自動で2, 3, 4…と増えます。VLOOKUPのときと同じ考え方なので、一度覚えれば応用はかんたんですよ。
INDIRECT + COLUMNで動的シート参照
INDIRECT関数と組み合わせると、列番号から動的にセル参照を生成できます。
たとえば、COLUMN関数の戻り値をADDRESS関数でセル参照文字列に変換し、INDIRECTで実際の参照に変えるパターンです。
=INDIRECT(ADDRESS(ROW(), COLUMN()-1, 4))
ちょっとむずかしく見えますが、やっていることはシンプルです。COLUMN関数で列番号を取得し、ADDRESS関数でセル参照文字列(例: “B3″)に変換し、INDIRECTで実際の参照にしているだけです。C3セルに入力した場合、「1列左のセル=B3」の値を返します。
複数シートの同じ位置から値を集める場面では、Sheet名を変数にしたINDIRECTと組み合わせる使い方も有効です。列番号からアルファベットを取得する方法は「列番号からアルファベットを取得する方法」も参考にしてみてください。
XLOOKUPではCOLUMN関数が不要になるケース
Microsoft 365で使えるXLOOKUP関数では、COLUMN関数の出番が減ります。
XLOOKUPの戻り範囲指定との違い
VLOOKUPとXLOOKUPでは、戻り値の指定方法が根本的に異なります。
// VLOOKUP:列番号で指定(ズレのリスクあり)
=VLOOKUP($A2, $B:$F, COLUMN()-COLUMN($B$1)+1, 0)
// XLOOKUP:戻り範囲を直接指定(列番号不要)
=XLOOKUP($A2, $B:$B, C:C)
XLOOKUPは戻り値を「列番号」ではなく「戻り範囲」で直接指定します。列を追加・削除しても参照がずれないため、COLUMN関数で列番号を計算する必要がありません。
それでもCOLUMN関数が必要な場面
XLOOKUPを使っていても、COLUMN関数の出番がなくなるわけではありません。
- 横方向の連番を振りたいとき
- INDEX関数の列引数を動的に変えたいとき
- 条件付き書式で列位置に応じた判定をしたいとき
- マクロやVBAに列番号を渡したいとき
検索系の関数ではXLOOKUPに任せつつ、列番号の取得が必要な場面ではCOLUMN関数を使う。この使い分けがポイントですよ。
COLUMN関数 よくある質問・エラー対処
#VALUE!・#REF!が出たときの確認ポイント
COLUMN関数でエラーが出るケースは多くありません。ただし、次の場面では注意が必要です。
| エラー | 原因 | 対処法 |
|---|---|---|
| #VALUE! | 引数にテキスト文字列を指定した | セル参照に修正する |
| #REF! | 参照先の列が削除された | 数式を再入力する |
=COLUMN("A1") のようにダブルクォーテーションで囲むと、文字列として扱われ #VALUE! エラーになります。正しくは =COLUMN(A1) です。引用符なしのセル参照を使ってください。
また、非連続範囲(例:=COLUMN((A1,C1)))は指定できません。連続した範囲で指定するようにしましょう。
COLUMNS関数との違いは?
名前が似ているCOLUMNS関数は、まったく別の関数です。
| 関数 | 機能 | 例 |
|---|---|---|
| COLUMN | 指定セルの列番号を返す | =COLUMN(C1) → 3 |
| COLUMNS | 範囲の列数を返す | =COLUMNS(A1:C1) → 3 |
COLUMN関数は「位置」を返し、COLUMNS関数は「個数」を返します。末尾にSが付くかどうかで意味が変わるので、混同しないように気をつけてくださいね。
まとめ
COLUMN関数は、セルの列番号を返すシンプルな関数です。単体ではあまり目立ちませんが、他の関数と組み合わせることで真価を発揮します。
この記事で紹介した活用パターンをおさらいします。
- VLOOKUPの列番号を自動化して、列の追加・削除に強くする
- 横方向に連番を振る
- INDEX + MATCHの列指定を動的にする
- XLOOKUPでは不要になるが、連番や列番号取得では引き続き活躍
まずはVLOOKUPの列番号をCOLUMN関数に置き換えるところから試してみてください。数式のメンテナンスがぐっと楽になりますよ。
