COLUMN関数の使い方|VLOOKUPの列番号を自動化

スポンサーリンク

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ステップです。

  1. COLUMN() で数式セルの列番号を取得する
  2. COLUMN(検索範囲の左端) で基準の列番号を取得する
  3. 差分に+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関数に置き換えるところから試してみてください。数式のメンテナンスがぐっと楽になりますよ。

タイトルとURLをコピーしました