壊れないExcel(INDIRECT編)第3回:XMATCH+INDEXで“可変列”を安全実装
こんにちは、はんちゃんです。
前回、壊れないExcelシリーズの第2回をお伝えしました。
ご興味にある方は、是非第2回もご覧ください。
そして今回は、第3回 XMATCH+INDEXで“可変列”を安全実装をお届けします。
それでは、スタートです。
💡はじめに:OFFSETでは守れない「可変列」
「行は動かせるのに、列は動かせないんです…」
月ごとの売上表を扱う現場で、こんな声をよく聞きます。
例えば「1月」「2月」「3月」と列が並び、次の月になるたびに列を追加して参照式を修正する――
気づけば毎月“式の修正業務”が定例化してしまう。
もちろん、OFFSETを使えば動的に参照できるのですが、
OFFSETは「非揮発関数」と呼ばれ、データが増えるたびに再計算を起こします。
小規模な表なら問題ないものの、数千行を超えるデータではExcelが重くなる原因になりやすいのです。
では、壊れず軽く動作する「可変列の仕組み」は作れないのか?
実は――あります。
そのカギを握るのが、XMATCH関数とINDEX関数の合わせ技です。

🧭 INDEX+XMATCH=「動く列番地」
OFFSETが「位置からセルを探す」のに対し、
INDEXは「既知の範囲から位置を指定して取り出す」関数です。
そしてXMATCHは「見出し名から位置を返す」関数。
この2つを組み合わせると、“名前”で列を動かすことが可能になります。
▼ 例題:月別売上表
商品名1月2月3月A商品120130150B商品200210250
「見出しセル(B1~D1)に月名が並んでいる」この構造、よく見ますよね。
ここで、ユーザーがセル F1 に「3月」と入力したとします。
「F1で指定した月の売上を取得する」という式を作ってみましょう。
🧮 式例:XMATCHで列番号を取得
まずは列番号を取得します。
=XMATCH(F1, B1:D1)
→ 「3月」は3番目の列にあるので「3」が返ります。
このままでは数字なので、次にINDEX関数と連携します。
🧩 INDEXで可変列参照を完成
商品名がA2:A3、売上データがB2:D3の場合、
「A商品(1行目)の“F1で指定した月”の売上」を取得する式はこうなります👇
=INDEX(B2:D3, 1, XMATCH(F1, B1:D1))
→ F1が「3月」なら結果は 150。
F1を「2月」に変えると、自動的に 130 に切り替わります。
OFFSETのように列の範囲をズラすこともなく、
数式が壊れることもありません。
⚙️ 仕組みの理解:参照を「名前」で追いかける
ここで大事なのは、「列番号をハードコーディングしない」という発想です。
OFFSETは「B列から右に2つ分」という“距離指定”ですが、
INDEX+XMATCHは「“2月”という見出しが何列目か」で探します。
つまり、列が挿入されても壊れない。
月順が変わっても、“名前”を頼りに正しい位置を探すのです。
🪶 軽さの違い
OFFSETは再計算が多く、行列の挿入・削除で式が再評価されやすい。
一方、INDEX+XMATCHは非揮発関数ではないため、
変更時の再計算が最小限に抑えられます。
試しに数千件の売上表を扱うと、OFFSET式のほうが約2〜3倍遅くなることもあります。
つまりこの方法は、「壊れない」だけでなく「速い」のです。
💻 応用:月選択でダッシュボードを切り替える
このINDEX+XMATCHを使えば、
「月ごとのグラフ」や「部門別ランキング」も、ワンクリックで切り替え可能になります。
例:
セルF1に「5月」、グラフ範囲に
=INDEX(tbl売上,,XMATCH(F1,tbl売上[#Headers]))
と指定すると、テーブルのヘッダー名から自動的に該当列を取得。
グラフがF1の月に合わせて動的に更新されます✨
この“グラフと数式がリンクするダッシュボード”は、
VBAを使わずに作れるのでメンテナンスも簡単。
📗 POINTまとめ
✅ OFFSETは便利だが壊れやすく、重くなりやすい
✅ INDEX+XMATCHで「列方向の動的参照」が安全に実現できる
✅ 「位置」ではなく「名前」で列を追いかける発想に切り替える
✅ 構造化参照と組み合わせると、テーブル単位でさらに強固に
🕊 次回予告
次回はついに「構造化参照」が登場します。
A1参照の“座標地獄”を抜け出し、
「売上表[金額]」のように“読める数式”へ進化する方法を徹底解説します。
👉 第4回:「テーブル構造参照で“壊れない数式”へ」
いいなと思ったら応援しよう!
よろしければ応援お願い致します! いただいたチップはクリエイターとしての活動費に使わせていただきます!