経営企画・財務分析担当者が最もよく使うQUERYのパターンは4つ--WHERE・ORDER BY・SELECT DISTINCT・GROUP BYです。Excelはこのうち3つをきれいに処理でき、残る1つはワークアラウンドが必要です。そしてPIVOT句だけは数式での代替がなく、Power Queryが前提になります。データが実業務レベルになったとき、それぞれの代替式がどのような形になるかを順に見ていきます。
QUERY構文とExcel代替関数:クイックリファレンス
| QUERYの句 | Excelの代替関数 | 備考 |
|---|---|---|
SELECT A, B, C | CHOOSE({1,2,3}, A:A, B:B, C:C) | FILTERと組み合わせて列選択に使用 |
WHERE x = 'val' | FILTER(range, condition) | AND条件は*、OR条件は+ |
ORDER BY D DESC | SORTBY(range, sort_col, -1) | ソートキーは出力範囲外でも指定可 |
SELECT DISTINCT A | UNIQUE(A:A) | FILTERやSORTとの組み合わせも容易 |
GROUP BY A, SUM(B) | UNIQUE() + SUMIFS(…, A2#) | スピル参照が鍵 |
LIMIT n | TAKE(result, n) | Excel 365(2022年以降)で使用可 |
PIVOT | Power 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での代替手順は以下の通りです。
- データを取り込む。 リボンの「データ」→「テーブルまたは範囲から」で売上明細をPower Queryエディターに読み込みます。
- 集計する。 「変換」→「グループ化」で「製品」と「四半期」をキーに、売上を「合計」で集計します。
- ピボット列を設定する。 「変換」→「列のピボット」で「四半期」列を選択し、値列に「売上合計」を指定します。集計関数は「合計」を選択します。
- シートに出力する。 「閉じて読み込む」で対象シートに出力先を指定します。
クエリを保存しておけば、元データが更新されても「データ」→「すべて更新」(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 DISTINCT | SORT + UNIQUE | QUERYより組み合わせ自由度は高い |
| GROUP BY + 集計 | UNIQUE + SUMIFS(スピル参照) | 2数式構成だが監査性は高い |
| PIVOT | Power 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)と記述します。条件の数に制限はなく、参照先シートをまたいだ条件の組み合わせも可能です。