CHOOSECOLS ― 離れた列を自在に抽出・並び替え・絞り込み

📌 基本構文

=CHOOSECOLS(配列, 列番号1, [列番号2], ...)

指定した配列(テーブルや範囲)から、必要な列番号だけを選んでスピル展開する関数です。
列の順序を自由に組み替えることもでき、マイナス値を使えば「右から○番目」の指定も可能です。

どんな場面で使う?
多列テーブルから「特定列だけ表示したい」「FILTER/XLOOKUP結果の列を絞りたい」「列順を組み替えたい」「右端から取りたい」すべてに対応できます。 FILTER・XLOOKUP・SORT・UNIQUE・VSTACKと組み合わせるとさらに強力になります。

【1】基本:離れた列を指定して抽出

10列あるテーブルから「ID(1列目)」「商品名(3列目)」「価格(5列目)」だけを別の場所に展開する例です。

=CHOOSECOLS(A2:E100, 1, 3, 5)
動作イメージ
① 元テーブル(A〜E列)
データテーブル
A (1) B (2) C (3) D (4) E (5)
1 ID 担当者 商品名 カテゴリ 価格
2 1001 田中 PC 家電 150,000
3 1002 鈴木 マウス 周辺機器 3,000
4 1003 佐藤 デスク 家具 25,000
橙色の列(1・3・5列目)だけ抽出
② G2 に 1本だけ入力 → スピル
データテーブル
G H I
2 1001 PC 150,000
3 1002 マウス 3,000
4 1003 デスク 25,000
✅ 数式G2の1本で3列が自動展開

マイナス指定:右から○番目の列を取得

=CHOOSECOLS(A2:Z100, 1, -1) ← 1列目と最右列(最新月)
=CHOOSECOLS(A2:Z100, 1, -3, -2, -1) ← 1列目+右端3列(直近3ヶ月)
💡 月次売上が右方向に追加されていく表で、列数が増えても数式の修正不要。常に最新月を自動取得できます。

列の順番を入れ替える

=CHOOSECOLS(A2:D100, 3, 1, 4, 2) ← C→A→D→Bの順に組み替え
💡 外部システムへの貼り付けや CSV 出力時に、先方のフォーマットに合った列順に変換できます。 元データを変更する必要がありません。

【2】旧バージョンでの代替法(〜2019)

CHOOSECOLSが使えない環境では、INDEX関数で各列を個別に取り出します。

G2: =INDEX($A$2:$E$100, ROW(A1), 1) ← 1列目
H2: =INDEX($A$2:$E$100, ROW(A1), 3) ← 3列目
⚠️ CHOOKECOLSと違い、列ごとに数式を1本ずつ書く必要があり、行方向にもコピーが必要です。 メンテナンス性・速度ともに劣ります。

【3】実務で使う応用パターン集

🔥 パターン1:FILTER × CHOOSECOLS ― 条件抽出+列絞り

FILTERで条件に合う行を抽出した後、CHOOSECOLSで必要な列だけを表示します。 「26列ある表から営業部だけ抽出して4列だけ見たい」といった実務でよくある状況を1本の数式で解決できます。

=CHOOSECOLS(FILTER(A2:Z1000, J2:J1000="営業部"), 1, 3, 5, 26)

① FILTERで営業部だけ抽出(全26列)→ ② CHOOSECOLSで1・3・5・26列目だけ表示

動作イメージ
① FILTER後(26列まだある)
データテーブル
1 2 3 4 5 26
ID 氏名 部署 役職 商品 売上
1001 田中 営業部 課長 PC 500万
1003 佐藤 営業部 主任 サーバ 300万
② CHOOSECOLSで列絞り
データテーブル
ID 部署 商品 売上
1001 営業部 PC 500万
1003 営業部 サーバ 300万
✅ すっきりした帳票が数式1本で完成

🔥 パターン2:XLOOKUP × CHOOSECOLS ― 検索結果から必要列だけ

XLOOKUPの戻り範囲を広く取り、CHOOSECOLSで必要な列だけ絞ります。 VLOOKUPを何本も書いていた処理が1本に集約されます。

=CHOOSECOLS(XLOOKUP(H2, A2:A1000, B2:F1000), 1, 2, 4)

XLOOKUPでB〜F列(5列)を返す → CHOOSECOLSで1列目(氏名)・2列目(部署)・4列目(メール)だけ表示

動作イメージ
① 社員マスタ(A〜F列)
データテーブル
A B(1) C(2) D(3) E(4) F(5)
社員ID 氏名 部署 役職 メール 電話
1001 田中太郎 営業部 課長 tanaka@… 03-x
② 結果(1本)
データテーブル
氏名 部署 メール
田中太郎 営業部 tanaka@…
✅ VLOOKUP×3本 → 数式1本
⚠️ CHOOSECOLSの列番号はXLOOKUPが返した結果の中での列番号(B〜Fの1番目・2番目…)です。 元シートのA〜Z列番号ではありません。

パターン3:SORT × CHOOSECOLS ― ソート結果から列を絞る

=CHOOSECOLS(SORT(A2:E100, 5, -1), 1, 3, 5)

5列目(価格)降順でソート → 1・3・5列目だけ表示

パターン4:UNIQUE × CHOOSECOLS ― 重複除去後に必要列だけ

=CHOOSECOLS(UNIQUE(A2:E100), 2, 4)

重複除去済みデータの2・4列目だけ残す。マスタ一覧の作成に便利。

🔥 パターン5:VSTACK × CHOOSECOLS ― 複数シート縦結合+列絞り

月別・拠点別シートを縦結合して、必要な列だけを統合レポートとして出力します。

=CHOOSECOLS(VSTACK(Sheet1!A2:F100, Sheet2!A2:F100, Sheet3!A2:F100), 1, 3, 6)

3シートを縦結合(全6列)→ 1列目(ID)・3列目(商品名)・6列目(売上)だけ表示

⚠️ VSTACKで結合する各シートは列の構成・順番が同じである必要があります。

🔥 パターン6:LET + VSTACK + FILTER + CHOOSECOLS ― 全工程を1数式に

「複数シート統合 → 条件絞り → 列選択」を LET で段階的に処理し、可読性を上げます。

=LET( 統合, VSTACK(Q1!A2:H500, Q2!A2:H500, Q3!A2:H500, Q4!A2:H500), 抽出, FILTER(統合, CHOOSECOLS(統合, 4)="家電"), CHOOSECOLS(抽出, 1, 3, 4, 8) )

① 4シートを縦結合 → ② カテゴリ列(4列目)が「家電」の行だけ抽出 → ③ 必要な4列だけ出力

✅ FILTERの条件に CHOOSECOLS(統合, 4) を使えば、VSTACKした配列の特定列をそのまま条件列として参照できます。

🔥 パターン7:FILTER × SORT × CHOOSECOLS ― 三段ネストで帳票を1本生成

=CHOOSECOLS(SORT(FILTER(A2:H1000, C2:C1000="営業部"), 8, -1), 1, 2, 5, 8)

① 営業部だけ絞る → ② 売上降順でソート → ③ 4列だけ表示

パターン8:列順の組み替え ― 外部システム向けフォーマット変換

=CHOOSECOLS(A2:D100, 3, 2, 4, 1)

C→B→D→A の順に並び替えて出力。外部システムの取込フォーマットに合わせる。

パターン9:バイナリ検索 × CHOOSECOLS ― XLOOKUPの高速化と連携(作業シート活用)

作業シートに SORTBY でソート済みデータを出力しておき、XLOOKUP がバイナリ検索でそれを参照。 さらに CHOOSECOLS で必要な列だけ絞ります。

/* 作業シートA1(1回だけ)*/ =SORTBY(マスタ!A2:C500000, マスタ!A2:A500000, 1)
/* 検索シートで使う */ =XLOOKUP(A2, 作業!A1#, CHOOSECOLS(作業!A1#, 2, 3), "未登録", 0, 2)
✅ SORTBYの計算は作業シートの更新1回だけ。XLOOKUPはバイナリ検索で高速に参照。 CHOOSECOLSでスピル範囲の2・3列目だけを返します。 → XLOOKUPバイナリ検索の詳細はこちら

【4】注意点:HSTACK と混同しない

「2つのテーブルを横に並べる HSTACK と CHOOSECOLSを組み合わせる」パターンは実務では推奨しません
HSTACKはキー照合なしで機械的に横結合するため、行の並び順が違うとデータがズレます

⚠️ HSTACK でデータがズレる例
左テーブル(ID順)
データテーブル
ID 氏名
1001 田中
1002 鈴木
右テーブル(別の順)
データテーブル
ID 評価
1002 B
1001 A
HSTACK結果(ズレている)
データテーブル
ID 氏名 評価
1001 田中 B ✗
1002 鈴木 A ✗
✅ テーブル結合は XLOOKUP でキー照合してから CHOOSECOLS で列を絞るのが安全です(パターン2参照)。

【5】組み合わせパターン早見表

データテーブル
組み合わせ できること 実務シーン
FILTER × CHOOSECOLS 条件抽出+列絞り 部署別データの帳票
XLOOKUP × CHOOSECOLS 検索結果から必要列だけ 入力フォーム・検索画面
SORT × CHOOSECOLS ソート結果+列絞り ランキング表
UNIQUE × CHOOSECOLS 重複除去+列絞り マスタ一覧の作成
VSTACK × CHOOSECOLS 縦結合+列絞り 月別・拠点別シートの統合
VSTACK × FILTER × CHOOSECOLS 縦結合+条件絞り+列選択 年間サマリレポート
FILTER × SORT × CHOOSECOLS 絞り+並替+列選択 ダッシュボード帳票
CHOOSECOLS(マイナス指定) 右端から逆引き 最新月の自動取得
CHOOSECOLS で列順変更 列の並び替え 外部システム向けデータ整形
作業シートSORT + バイナリXLOOKUP + CHOOSECOLS 大量データ高速検索+列絞り 50万行規模のマスタ検索
💡 ネストの設計のコツ:内側から外側に向かって
「① 統合(VSTACK)→ ② 絞る(FILTER)→ ③ 並べる(SORT)→ ④ 列を選ぶ(CHOOSECOLS)」
の順を意識すると可読性が上がります。複雑な場合は LET 関数で中間変数を使うとさらに見通しが良くなります。
⚠️ パフォーマンスと高速化のコツ:
VSTACK で大量データを結合した上に FILTER・SORT・CHOOSECOLS を幾重にもネストすると、再計算が重くなることがあります。
体感で遅い場合は以下のアクセス回数・計算回数を減らすアプローチが有効です:
  • LET関数で計算をまとめる: 同じ範囲の集計や結合をLET内で1度だけ計算させ、メモリ上で使い回す。
  • 作業シートに展開する: 重い処理(VSTACKでの全シート結合など)は別シートに一度スピルで出力しておき、最終的な帳票からそのスピル範囲を参照する。
  • スピルで1本の数式にまとめる: XLOOKUPなどでVSTACKした範囲を検索する際、オートフィルで下に何千行もコピーするとVSTACKの重い結合処理が「行数分」毎回走ってしまいます。検索値を配列で指定してスピルさせれば、VSTACKの処理は1回だけで終わるため劇的に軽くなります。