GROUPBY関数(縦軸でグループ化して集計)
GROUPBY関数は、行(縦)でグループ化し指定された関数によって値を集計します。
複数の行グループレベルに対応しています。
総計・小計、並べ替え、フィルター処理もサポートされています。
集計にはイータ縮小ラムダ(eta reduced lambda)または明示的なLAMBDAが使用できます。
GROUPBY関数は、縦軸(行)集計のピボットテーブルを関数で作成するものと考えれば良いでしょう。
縦横の2軸でのグループ化はPIVOTBY関数を使用します。
2024/8時点でこの関数は、365 Insider の新関数です。
その為、機能も未確定であり今後変更の可能性もあります。
ページ内目次
GROUPBY関数の構文
=GROUPBY(row_fields,values,function,[field_headers],[total_depth],[sort_order],[filter_array],[field_relationship])
| 引数 | 説明 |
| row_fields 行フィールド |
必須 行をグループ化し、行ヘッダーを生成するために使用される値を含む列方向(縦方向)の配列または範囲。 配列または範囲には複数の列を含むことが出来ます。 その場合、出力には複数の行グループ レベルが含まれます。 |
| values 値 |
必須 集計するデータの列指向の配列または範囲。 配列または範囲には複数の列が含まれる場合があります。その場合、出力には複数の集計が含まれます。 |
| function 関数 |
必須 「値」を集計するために使用される明示的(LAMBDA関数)またはイータ縮小ラムダ関数を指定。 ラムダのベクトル(配列)を指定できます。 その場合、出力には複数の集計が含まれます。 ベクトル(配列)の向きによって行方向/列方向のレイアウトが決まります。 イータ縮小LAMBDAとして以下の関数が入力候補に表示されます。 SUM,AVERAGE,MEDIAN,COUNT,COUNTA,MAX,MIN,PRODUCT, ARRAYTOTEXT,CONCAT,SRDEV.S,STDEV.P,VAR.S,VAR.P,MODE.SNGL, LAMBDA 詳しくは以下を参照してください。 イータ縮小ラムダ(eta reduced lambda) |
| field_headers フィールドヘッダー |
省略可能 「行フィールド」と「値」にヘッダーがあるかどうか、および結果でフィールド ヘッダーを表示するかどうかを指定する数値。 省略 ::自動。※自動判別なので意図しない結果になる場合があります。 0 : いいえ(ヘッダーなし、ヘッダー生成しない) 1 : はい、表示しません(ヘッダーあり、ヘッダー表示しない) 2 : いいえ、生成します(ヘッダーなし、ヘッダー生成する) 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) 自動では、「値」引数に基づいてデータにヘッダーが含まれていると想定されます。 1番目の値がテキストで 2 番目の値が数値の場合、データにはヘッダーがあるとみなされます。 複数の行または列グループ レベルがある場合、フィールド ヘッダーが自動で表示されます。 |
| total_depth 合計深さ |
省略可能 行ヘッダーに合計を含めるかどうかを決定します。 省略 : 自動: 総計と、可能な場合は小計。 0 : 合計なし 1 : 総計 2 : 総計と小計 -1 : 上部に総計 -2 : 上部に総計と小計 小計の場合、フィールドには少なくとも 2つの列が必要です。 フィールドに十分な列がある場合、2より大きい数値がサポートされます 。 |
| sort_order 並べ替え順序 |
省略可能 省略時は行フィールドの昇順で並べ替えられます。 行をソートする方法を示す数値。 数値(1から始まる)は「行フィールド」の列に対応し、その後に「値」の列が続きます。 数値が負の場合、行は降順/逆順に並べ替えられます。 「行フィールド」のみに基づいて並べ替える場合は、数値のベクトル(配列)を指定できます。 |
| filter_array フィルター配列 |
省略可能 対応するデータ行を対象とするかどうかを示すブール値の列指向(縦方向)1時限配列。 配列の長さは、「行フィールド」に提供される配列の長さと一致する必要があります。 |
| field_relationship フィールドの関係性 |
row_fieldsに複数の列を指定する場合のリレーションシップ フィールドを指定します。 使用可能な値は次のとおりです。 0: 階層 (既定値) 1: テーブル 階層フィールドリレーションシップ (0) では、後のフィールド列の並べ替えでは、以前の列の階層が考慮されます。 テーブル フィールドリレーションシップ (1) では、各フィールド列の並べ替えは個別に行われます。 小計は階層を持つデータに依存するためサポートされていません。 ※Insiderプログラムで初めて発表された当初は、[field_relationship] 引数は存在していませんでした。 ユーザーからのフィードバックを受けて機能が追加・改善されました。 |
GROUPBY関数の使用例と解説
使用例のサンプルデータ

| 日付 | 品名 | 売上 | 利益 |
| 2023/11/2 | 商品B | 91851 | 27555 |
| 2023/11/3 | 商品C | 66932 | 19410 |
| 2023/11/1 | 商品B | 63366 | 19643 |
| 2023/11/2 | 商品A | 21979 | 3956 |
| 2023/11/1 | 商品C | 93052 | 16749 |
| 2023/11/2 | 商品B | 44072 | 20714 |
| 2023/11/1 | 商品B | 179253 | 77079 |
| 2023/11/1 | 商品A | 198719 | 81475 |
| 2023/11/3 | 商品C | 154850 | 68134 |
| 2023/11/2 | 商品C | 157195 | 51874 |
| 2023/11/3 | 商品B | 159783 | 75098 |
| 2023/11/3 | 商品A | 198173 | 93141 |
| 2023/11/1 | 商品A | 114658 | 57329 |
| 2023/11/3 | 商品B | 138921 | 65293 |
| 2023/11/2 | 商品A | 106868 | 32060 |
| 2023/11/1 | 商品C | 35673 | 17123 |
| 2023/11/2 | 商品C | 166609 | 24991 |
| 2023/11/3 | 商品A | 127287 | 31822 |
B1:B19
このようにセル参照しています。
データ範囲をテーブル化して使う場合は、
テーブル1[[#すべて],[品名]]
このように読み替えてください。

ここでは、テーブル構造化参照の数式では数式文字列が長くなってしまうのでセル参照にしています。
最も単純かつ有用な使い方(UNIQUE+SUMIFS)

| 行フィールド | B1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 省略 ::自動 |
| 合計深さ | 0 : 合計なし |
| 並べ替え順序 | 省略 : ※行フィールドで並べ替えられます。 |
| フィルター配列 | 省略 |
商品ごとの売上・利益の集計です。
商品の一覧を作成して、SUMIFS関数を使う場面です。
F列に、UNIQUE関数で商品の一覧を作成し、
G列H列に、SUMIFS関数いれて集計。
このような処理が必要になります。
さらに、これを1セルの数式で実現しようとすると、かなり大変です。

商品,UNIQUE(キー),
売上,SUMIFS(値1,キー,商品),
利益,SUMIFS(値2,キー,商品),
SORT(HSTACK(商品,売上,利益)))
列全体を指定した場合の問題点

入力範囲がテーブルの場合は構造化参照するので問題になりませんが、
セル範囲の場合はメンテナンス性を考慮しての列指定は使いづらくなります。
FILTER関数と組み合わせたり等の対応も考えられますが、数式が複雑化してしまう懸念があります。
このような場合は範囲をテーブルにしたほうが良いと思います。
複数の列でグループ化

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 ※この例で小計が出ないのが何故かは不明 |
| 並べ替え順序 | 省略 |
| フィルター配列 | 省略 |
行フィールドをA:B列で指定しています。
つまり、日付・商品の2段階のグループになります。
上部に総計と小計

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | -2 : 上部に総計と小計 |
| 並べ替え順序 | 省略 |
| フィルター配列 | 省略 |
これなどは、クリックしていくだけで作成するピボットテーブルとほぼ同じです。

降順/逆順で並べ替え

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 0 : 合計なし |
| 並べ替え順序 | -1 |
| フィルター配列 | 省略 |
並べ替え順序に -1 を指定しているので、
行フィールドの先頭列の降順/逆順で並べ替えられます。
複数列で行を並べ替え

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 0 : 合計なし |
| 並べ替え順序 | {-1,-2} |
| フィルター配列 | 省略 |
並べ替えを行フィールドのみで行う場合は、複数の列を指定することが出来ます。
※行フィールドと値の両方を指定して並べ替えることはできません。
この場合は、並べ替え順序の数値をベクトル(配列)で指定します。
並べ替え順序の数値は、行フィールドと値で通し番号です。
A列 → 1
B列 → 2
C列 → 3
D列 → 4
降順/逆順の場合は数値をマイナスで指定します。
※シートの列位置とは関係なく、あくまで「行フィールド」の中での順番です。
値で並べ替え

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 0 : 合計なし |
| 並べ替え順序 | 3 |
| フィルター配列 | 省略 |
並べ替え順序に 3 を指定しているので、値のC列で並べ替えられます。
気を付けて見てもらいたいのは、
グループの小計 > グループ内集計値
この順で並べ替えられます。
今回では、
・日付・品名の売上計
・日付・品名内の売上
この順で並べ替えられています。
フィルターで対象データを絞る

| 行フィールド | A1:B19 |
| 値 | C1:D19 |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
| 並べ替え順序 | 省略 |
| フィルター配列 | A1:A19<>DATE(2023,11,2) |
フィルター配列はFILTER関数の指定と同じ要領になります。
A1:A19<>DATE(2023,11,2)
これは、19個のTRUE/FALSEの縦配列です。
この配列が FALSE の行は対象外として除外されます。
関数にラムダのベクトル(配列)を指定

| 行フィールド | A1:B19 |
| 値 | C1:C19 |
| 関数 | HSTACK(SUM,AVERAGE) |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
| 並べ替え順序 | 省略 |
| フィルター配列 | 省略 |
HSTACKで横方向にしているので、出力も横に展開されています。
この場合「値」を複数列指定することはできません、複数列指定しても無視されます。
ではVSTACKを使うと、

| 行フィールド | A1:B19 |
| 値 | C1:C19 |
| 関数 | VSTACK(SUM,AVERAGE) |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
| 並べ替え順序 | 省略 |
| フィルター配列 | 省略 |
VSTACKで縦方向にしているので、出力も縦に展開されています。
この場合「値」を複数列指定することはできません、複数列指定しても無視されます。
行フィールドや値列が連続していない場合

| 行フィールド | HSTACK(C1:C19,A1:A19) |
| 値 | HSTACK(B1:B19,D1:D19) |
| 関数 | SUM |
| フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
| 合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
| 並べ替え順序 | 省略 |
| フィルター配列 | 省略 |
行フィールドも値列もHSTACK関数で横に結合して引数に指定しています。
IF関数に配列定数を指定して列の配列を作成する方法もあります。

行フィールドに数式を指定した場合

元のデータを編集してGROUPBY関数に入れる事が出来ます。
この時に使用できる関数に特に制限ありません。
当然ですが、VLOOKUPやMATCH+INDEX等の関数も使えます。
ただし、上記の例ではCONCAT関数を使う事は出来ません。

値に数式を指定した場合

ただしヘッダーを表示する場合はヘッダー文字列の作成が面倒な場合が多くなると思います。
関数にLAMBDA関数を指定
これらは、LAMBDA関数の記述を縮小簡略化した書き方です。
従って、もともとのLAMBDA関数で書き直すことが出来ます。
=GROUPBY(...,イータ縮小関数)
↓
=GROUPBY(...,LAMBDA(x,イータ縮小関数(x)))

=GROUPBY(A1:B19,C1:D19,SUM,3)
どちらでも同じになります。

GROUPBY(A1:B19,C1:D19,合計,3))
独自に作製する関数名をイータ縮小ラムダ関数と同じにすると、その名前で上書きされます。
誤解の元になるので、このような使い方は避けた方が良いでしょう。
LAMBDA関数の第2引数について
以下では、この「関数」に渡す第2引数についての解説になります。
ただし、イータ縮小ラムダには第2引数は渡さません。

上記は第1引数しか使っていないので、第1引数だけを指定した場合と同じです。

各行の結果が「合計」と同じになっています。
第1引数は各グループごとの計算になります。
第2引数は全体にたいする計算になります。
つまり、
第1引数は各グループごとの配列。
第2引数はデータ全体の配列。

上記のように件数を確認してみると良く分かると思います。
第1引数と第2引数を直接演算するような式はエラーとなります。


※この記事を執筆時点では何故かPERCENTOF関数がまだ降りてきていません…
以下はPERCENTOF関数が降りて来たので以下に追記。
PERCENTOF関数
従って全合計の値が0の場合は「#DIV/0!」のエラーになります。

先に掲載したLAMBDAと同じ結果となっています。
field_relationship(フィールドの関係性)の解説
この引数の使い方、0と1の具体的な違い、そしてなぜこの引数が必要なのかを解説します。
field_relationship 引数は、GROUPBY関数で複数の「行フィールド」(データをグループ化する列)を指定した場合に、それらのフィールド間の「関係性」をExcelに伝えるためのものです。
この関係性は、集計結果の表示方法(特に小計の有無)や、内部的なデータ処理に影響を与えます。
- 0 (階層 - Hierarchy) 【既定値】
- 意味:
row_fieldsで指定した複数の列が、階層的な関係にあるとExcelに伝えます。
例えば、「地域」と「店舗」でグループ化する場合、「地域」の下に「店舗」がネストされるような関係です。 - 特徴:
階層的な表示が可能です。
total_depth引数を使って、小計(サブトータル)を表示できます。 これがこの設定の最大のポイントです。
後のフィールド(例:「店舗」)の並べ替えは、前のフィールド(例:「地域」)の階層を考慮して行われます。 - 使用例:
地域別・店舗別の売上小計など、グループの段階ごとに合計を見たい場合に適しています。
- 意味:
- 1 (テーブル - Table)
- 意味:
row_fieldsで指定した複数の列が、独立した関係にあるとExcelに伝えます。各列は並列の要素として扱われ、階層的なネストは想定されません。 - 特徴:
フラットなテーブル形式で結果が表示されます。
小計は一切表示できません。 total_depth引数をどのように設定しても、小計行は生成されません。これが0との決定的な違いです。
各フィールドの並べ替えは独立して行われます。 - 使用例: プロジェクトと担当者の組み合わせごとのタスク完了数など、あくまで個々の組み合わせの結果だけを、小計なしのシンプルなリストで見たい場合に適しています。
- 意味:
なぜ field_relationship が必要なのか? (必要性)
この引数が「わざわざ追加された」のは、主に以下の2つの理由が考えられます。
- 意図しない小計行の完全な排除:
- field_relationshipが0(階層)の場合、たとえtotal_depthを0にして小計を非表示にしていても、Excelは内部的に階層構造を認識し、いつでも小計を表示できる状態にあります。
- これに対し、field_relationshipを1(テーブル)に設定すると、Excelは「このデータには階層がない」と明確に認識します。 そのため、total_depthの設定に関わらず、物理的に小計行が生成されることはありません。
- これは、他のシステムに連携する厳密なデータ形式を求められる場合や、「絶対に小計を出したくない」という明確なレポート要件がある場合に、予期せぬ小計行の混入を防ぐための、非常に強力な保証となります。
- 数式の意図の明確化 (セマンティクス):
- 数式は、単に計算結果を出すだけでなく、「何を意図しているか」を読み手に伝える役割も持ちます。
- field_relationship = 1を指定することで、「このグループ化は階層構造ではない、各フィールドは独立した要素である」という作成者の明確な意図を数式自体に埋め込むことができます。これにより、数式の保守性や理解度が向上します。



「プロジェクトID」ごとの「費用の合計(集計値)」で昇順ソートされています。
そして、その次に同じ「プロジェクトID」内において費用で並べられます。
目的: 各プロジェクトの月ごとの費用を合計し、小計行を一切含まず、純粋なリストとして表示する。
数式:=GROUPBY(A2:B8, C2:C8, SUM, 1, 0, 3, , 1)

グループ集計された費用を独立したフィールドとして並べ替えています。

Microsoft Support GROUPBY関数
Microsoft Support PIVOTBY関数
同じテーマ「エクセル入門」の記事
複数の文字列を検索して置換するSUBSTITUTE
LAMBDA以降の新関数の問題集
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)
LAMBDA以降の新関数の問題と解説(配列操作関数編)
PY関数(Pythonコードをセル内で実行)
GROUPBY関数(縦軸でグループ化して集計)
PIVOTBY関数(縦軸と横軸でグループ化して集計)
イータ縮小ラムダ(eta reduced lambda)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)
TRANSLATE関数(翻訳) DETECTLANGUAGE関数(言語識別)
新着記事NEW ・・・新着記事一覧を見る
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出|SQL入門(2025-11-02)
SQL基礎問題5:複数のマスタテーブルの結合|SQL入門(2025-11-01)
アクセスランキング ・・・ ランキング一覧を見る
1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
