データ分析

ExcelでQUERY関数を再現する:財務モデル実践ガイド(2026年版)

ModelMonkey2026年7月11日読了約 3 分

経営企画・財務分析担当者が最もよく使うQUERYのパターンは4つ--WHERE・ORDER BY・SELECT DISTINCT・GROUP BYです。Excelはこのうち3つをきれいに処理でき、残る1つはワークアラウンドが必要です。そしてPIVOT句だけは数式での代替がなく、Power Queryが前提になります。データが実業務レベルになったとき、それぞれの代替式がどのような形になるかを順に見ていきます。

QUERY構文とExcel代替関数:クイックリファレンス

QUERYの句Excelの代替関数備考
SELECT A, B, CCHOOSE({1,2,3}, A:A, B:B, C:C)FILTERと組み合わせて列選択に使用
WHERE x = 'val'FILTER(range, condition)AND条件は*、OR条件は+
ORDER BY D DESCSORTBY(range, sort_col, -1)ソートキーは出力範囲外でも指定可
SELECT DISTINCT AUNIQUE(A:A)FILTERやSORTとの組み合わせも容易
GROUP BY A, SUM(B)UNIQUE() + SUMIFS(…, A2#)スピル参照が鍵
LIMIT nTAKE(result, n)Excel 365(2022年以降)で使用可
PIVOTPower Query(ピボット列)標準数式での代替なし

GoogleのVisualization API Query Language仕様によると、QUERYはSQL類似のクエリ言語で12の句をサポートしています。2026年7月時点で、ExcelのDynamic Array関数群はそのうち8つに確実に対応しています。

WHERE → FILTER(列選択を含む場合)

FILTERは行全体を返します。QUERYはSELECT B, D, F WHERE...のように出力列をインラインで指定できますが、FILTERにその機能はありません。

解決策は、FILTERの前後でCHOOSEと配列定数を組み合わせて列を選択することです。年間5,000万円以上のARR契約を売上明細から抽出する例を示します。

=FILTER(
  CHOOSE({1,2,3},
    '売上明細'!B2:B5000,
    '売上明細'!D2:D5000,
    '売上明細'!F2:F5000),
  ('売上明細'!C2:C5000 = "ARR") *
  ('売上明細'!F2:F5000 >= 50000000)
)

*演算子はAND条件、+はOR条件です。前提条件シートをまたいで複数条件を適用する場合の例:

=FILTER(
  CHOOSE({1,2,3,4},
    '総勘定元帳'!A2:A10000,
    '総勘定元帳'!C2:C10000,
    '総勘定元帳'!D2:D10000,
    '総勘定元帳'!F2:F10000),
  ('総勘定元帳'!B2:B10000 = 前提条件!$B$4) *
  ('総勘定元帳'!E2:E10000 >= 前提条件!$C$3) *
  ('総勘定元帳'!E2:E10000 <= 前提条件!$D$3)
)

事業体フィルターは前提条件!$B$4に固定し、集計期間は$C$3:$D$3から取得します。会議の20分前にCFOから「別の事業体でもう一度出してほしい」と言われたとき、このように設計されていれば即座に対応できます。

計算コストについての注意。 CHOOSE+FILTERの組み合わせは、5万行規模のデータに対して実行すると再計算のたびに全列を走査します。参照列が増えるほど負荷は線形に上がります。行数が1万を超える場合は、参照先シートのデータをテーブル(Ctrl+T)に変換し、構造化参照を使うことで再計算範囲を絞り込めます。それでも重い場合は、前提条件の変更時のみ手動再計算(Ctrl+Alt+F9)に切り替えるか、Power QueryでETL処理を分離してロード済みのテーブルに対して数式を当てる構成に変えることを検討してください。

ORDER BY → SORTBY(#VALUE!エラーの回避)

SORTは単一列の昇順・降順に対応しています。ソートキーが出力範囲に含まれない場合はSORTBYが必要です。限界利益テーブル、案件ランキング、SKU別パフォーマンス集計など、実務ではこのケースが頻繁に発生します。

アクティブなSKUを粗利益額の降順で並べ、商品名と売上のみを表示する例:

=SORTBY(
  FILTER(
    CHOOSE({1,2}, 'SKU明細'!A2:A500, 'SKU明細'!C2:C500),
    'SKU明細'!E2:E500 = "Active"
  ),
  FILTER('SKU明細'!D2:D500, 'SKU明細'!E2:E500 = "Active"),
  -1
)

ここで注意が必要なのは、第2引数(ソートキー)のFILTERに外側と完全に同一の条件を指定しなければならない点です。条件が1文字でもずれると、出力配列とソート配列の行数が一致せず#VALUE!エラーが発生します。

5万行規模になると、この「条件の二重記述」は可読性と計算速度の両面で問題になります。対策は2つあります。

方法1:ヘルパー列で条件を先に評価する。 ソース側シートの空き列に=E2="Active"と入力し、その列をFILTERとSORTBYの両方から参照します。条件の変更が1か所で済み、デバッグも容易になります。

-- ヘルパー列('SKU明細'!G2:G500)
='SKU明細'!E2:E500 = "Active"

-- メイン数式
=SORTBY(
  FILTER(CHOOSE({1,2}, 'SKU明細'!A2:A500, 'SKU明細'!C2:C500), 'SKU明細'!G2:G500),
  FILTER('SKU明細'!D2:D500, 'SKU明細'!G2:G500),
  -1
)

方法2:FILTER結果を中間セルに置く。 出力シートの非表示行でFILTERを一度評価し、SORTBYはその結果参照のみを行う構成です。取締役会パック向けの出力シートでは、ユーザーに見せたくない中間計算を別シートや折りたたみ行に分離するとレビューしやすくなります。

SELECT DISTINCT → UNIQUE

QUERYのSELECT DISTINCTはExcelではUNIQUEに相当します。組み合わせの自由度はむしろUNIQUEのほうが高いくらいです。

コストセンター差異分析レポートの軸リストを動的に生成し、昇順に並べる例:

=SORT(UNIQUE('総勘定元帳'!D2:D10000))

関数2つで完結します。QUERYではSELECT DISTINCT D ORDER BY Dと記述し、さらにヘッダー行を個別に処理する必要があります。

実際のモデルでUNIQUEが真価を発揮するのは、総勘定元帳に新しいコストセンターが追加されると自動的に展開するサマリーテーブルの行ラベル生成です。年度途中に経理部門がコストセンターを追加しても参照エラーが発生せず、ピボットテーブルの手動更新もハードコードのリスト管理も不要になります。

GROUP BY--ExcelでQUERY関数のGROUP BYを再現する方法

ここでQUERYとの類似性が崩れます。QUERYのGROUP BYと集計は1つの数式で書けますが、Excelには直接の代替がなく、2つの数式を組み合わせる必要があります。

パターンは、UNIQUEで軸リストを生成し、スピル参照を使ったSUMIFSで集計を行うというものです。

A列(軸ラベル、自動的に下方向にスピル):

=SORT(UNIQUE('総勘定元帳'!B2:B3000))

B列(EBITDA集計、列全体をカバーする1つの数式):

=SUMIFS('総勘定元帳'!F2:F3000, '総勘定元帳'!B2:B3000, A2#)

A2#のスピル参照が鍵です。SUMIFSはスピル範囲のすべての値に対して評価を行い、事業部ごとに1つの結果を返す配列を生成します。これによりSELECT B, SUM(F) GROUP BY B ORDER BY Bを、1つの数式ではなく2つの数式で再現できます。

複数条件のGROUP BY--P&Lシートの5,000行以上から、事業体と費用カテゴリ別にEBITDA実績を集計する場合:

=SUMIFS(
  'P&L'!D2:D5000,
  'P&L'!B2:B5000, 軸!A2#,
  'P&L'!C2:C5000, ">=" & 前提条件!$C$3,
  'P&L'!C2:C5000, "<=" & 前提条件!$D$3,
  'P&L'!E2:E5000, "販管費"
)

QUERYより記述量は増えますが、監査性は高くなります。すべての条件が数式内に可視化されており、レビュアーはテスト環境を用意しなくても各引数を追うことができます。稟議書類の添付資料として使う予実管理シートでは、この透明性が重要です。

PIVOT句--数式では代替できない唯一のパターン

ここが最も困る場所です。QUERYのPIVOT句--行の値を列ヘッダーとして動的に転置する機能--については、「Excelに標準数式の代替はない」という事実をまず受け入れた上で、Power Queryによる代替手順を押さえておく必要があります。

QUERYでのPIVOT例:

=QUERY(売上明細, "SELECT 製品, SUM(売上) GROUP BY 製品 PIVOT 四半期")

これは製品を行、四半期(Q1〜Q4など)を列に転置したクロス集計表を1つのクエリで返します。

Power Queryでの代替手順は以下の通りです。

  1. データを取り込む。 リボンの「データ」→「テーブルまたは範囲から」で売上明細をPower Queryエディターに読み込みます。
  2. 集計する。 「変換」→「グループ化」で「製品」と「四半期」をキーに、売上を「合計」で集計します。
  3. ピボット列を設定する。 「変換」→「列のピボット」で「四半期」列を選択し、値列に「売上合計」を指定します。集計関数は「合計」を選択します。
  4. シートに出力する。 「閉じて読み込む」で対象シートに出力先を指定します。

クエリを保存しておけば、元データが更新されても「データ」→「すべて更新」(Ctrl+Alt+F5)で再実行できます。数式より操作が1ステップ増えますが、列ヘッダーが動的に生まれ変わる挙動はPIVOT句と同等です。

注意点。 Power QueryはExcel 2016以降で標準搭載されていますが、出力はシートに「接続のみ」または「テーブル」として読み込む形になります。出力テーブルのセルを他の数式から参照すること自体は問題ありませんが、Sheetsのように数式の中にPIVOTをインラインで書く構成は再現できません。モデルのアーキテクチャとしては「ETL層(Power Query)+数式層(FILTER/SUMIFS)」に分離する設計になります。

ExcelでQUERY関数の代替を使う際のバージョン制約

FILTER・SORT・SORTBY・UNIQUEはExcel 365またはExcel 2021が必要です。Excel 2019以前では使用できません。Microsoftのサポートドキュメント「Dynamic array formulas and spilled array behavior」によると、これらのDynamic Array関数はExcel 365に2019年から導入され、Excel 2021の永続ライセンスでは同年10月から利用可能になりました。

レガシーなExcelでも開く必要があるモデルを作る場合--IT部門のアップデートサイクルが現行リリースより数年遅れているケースは、大企業・金融機関を問わず珍しくありません--Dynamic Array関数はすべて動作しなくなります。FILTERは#NAME?になります。集計はSUMIFS、フィルタリングはINDEX/MATCH、GROUP BY相当の処理はピボットテーブルに頼らざるを得ません。

シンジケートローンのDCF分析など、取引金融機関の管理環境(Excel 2016や2019が標準という場合もあります)でファイルを開くケースでは、これは現実的な制約です。Sheetsも同様の移植性の問題(プラットフォーム外のファイルへのQUERY参照ができない)を抱えていますが、少なくともプラットフォーム内では一貫して動作します。

モデルを配布する前に、共有先の環境で使用しているExcelのバージョンを確認する習慣をつけておくことを強くお勧めします。

まとめ:パターン別の対応方針

QUERYのパターンExcelでの対応実務上の留意点
WHERE(列選択あり)CHOOSE + FILTER行数が多い場合はテーブル化で再計算コスト削減
ORDER BY(外部キー)SORTBY + FILTER条件の二重記述問題はヘルパー列で解消
SELECT DISTINCTSORT + UNIQUEQUERYより組み合わせ自由度は高い
GROUP BY + 集計UNIQUE + SUMIFS(スピル参照)2数式構成だが監査性は高い
PIVOTPower Query(ピボット列)ETL層として分離する設計が前提

SheetsモデルにQUERY数式が15〜20個あってExcelに移行する場合、PIVOT句の処理方針を先に確認してから着手するのが効率的です。PIVOT以外のパターンは手順こそ機械的ですが、各数式を構成要素に分解し、列選択をCHOOSE配列で書き直し、GROUP BYのロジックをUNIQUE+SUMIFSのペアに分割していく作業が続きます。ModelMonkeyはこの変換作業をスプレッドシート内で実行できます(ModelMonkeyのプランを選ぶ)。

よくある質問

Q. ExcelにはQUERY関数がないのですか? A. はい、ありません。QUERY関数はGoogle Sheetsの固有機能で、ExcelにはネイティブのQUERY関数が存在しません。ただし、Excel 365・Excel 2021のDynamic Array関数(FILTER・SORTBY・UNIQUE)を組み合わせることで、QUERYの主要パターンの大部分を再現できます。

Q. FILTER関数はどのバージョンのExcelから使えますか? A. FILTER・SORT・SORTBY・UNIQUEはExcel 365(サブスクリプション版)およびExcel 2021(永続ライセンス版)でのみ使用できます。Excel 2019以前のバージョンではこれらの関数はサポートされておらず、数式を開くと#NAME?エラーが表示されます。

Q. QUERYのGROUP BY句に相当するExcelの数式はありますか? A. 1つの数式では代替できませんが、2ステップで同等の処理が可能です。まずUNIQUEで集計キーの一覧を生成し、次にスピル参照(A2#)を使ったSUMIFSで各キーに対応する集計値を算出します。

Q. SORTBYで#VALUE!エラーが出るのはなぜですか? A. 出力配列とソートキー配列の行数が一致していないことが原因です。SORTBYの第2引数に渡すFILTERに、第1引数と完全に同一の条件を指定する必要があります。ヘルパー列でFILTER条件を先に評価し、その列を両方から参照する方法が最も保守しやすい解決策です。

Q. QUERYのPIVOT句はExcelで代替できますか? A. 標準数式での代替はありません。Power Queryの「列のピボット」機能を使って対応します。Power Queryエディターでグループ化と列のピボットを設定し、結果をシートにテーブルとして出力する構成になります。PIVOT句をインラインで記述するSheetsとは設計思想が異なりますが、列ヘッダーの動的転置という機能は同等に実現できます。

Q. QUERY関数のWHERE句に複数条件を指定するにはどうすればよいですか? A. Excelでは、FILTERの第2引数でAND条件を*(掛け算)、OR条件を+(足し算)で表現します。例えば「ARR かつ 5,000万円以上」であれば(C2:C5000="ARR") * (F2:F5000>=50000000)と記述します。条件の数に制限はなく、参照先シートをまたいだ条件の組み合わせも可能です。