エクセル入門
GROUPBY関数(縦軸でグループ化して集計)

Excelの初心者向け入門解説
公開日:2023-11-18 最終更新日:2024-04-09

GROUPBY関数(縦軸でグループ化して集計)


GROUPBY関数は、行(縦)でグループ化し指定された関数によって値を集計します。


行(縦)の軸に沿ったグループ化と、関連する値の集計がサポートされます。
複数の行グループレベルに対応しています。
総計・小計、並べ替え、フィルター処理もサポートされています。
集計にはイータ縮小ラムダ(eta reduced lambda)または明示的なLAMBDAが使用できます。
・LAMBDAヘルパー関数 ・イータ縮小ラムダ関数 ・イータ縮小ラムダ 使用例と解説

GROUPBY関数は、縦軸(行)集計のピボットテーブルを関数で作成するものと考えれば良いでしょう。

GROUPBY関数は縦軸の1軸だけのグループ化です。
縦横の2軸でのグループ化はPIVOTBY関数を使用します。
PIVOTBY関数は、行(縦)と列(横)でグループ化し指定された関数によって値を集計します。行(縦)と列(横)の2軸に沿ったグループ化と、関連する値の集計がサポートされます。複数の行グループレベル、複数の列グループレベルに対応しています。

この関数は、365 Insider の新関数です。
その為、機能も未確定であり今後変更の可能性もあります。
手探りでの検証を行いながらの執筆となっているため不正確な情報も部分的には含まれている可能性がある事をご承知おきください。

GROUPBY関数の構文

GROUPBY(行フィールド,値,関数,[フィールドヘッダー],[合計深さ],[並べ替え順序],[フィルター配列])

引数 説明
行フィールド 必須
行をグループ化し、行ヘッダーを生成するために使用される値を含む列方向(縦方向)の配列または範囲。
配列または範囲には複数の列を含むことが出来ます。
その場合、出力には複数の行グループ レベルが含まれます。
必須
集計するデータの列指向の配列または範囲。
配列または範囲には複数の列が含まれる場合があります。その場合、出力には複数の集計が含まれます。
関数 必須
「値」を集計するために使用される明示的(LAMBDA関数)またはイータ縮小ラムダ関数を指定。
ラムダのベクトル(配列)を指定できます。
その場合、出力には複数の集計が含まれます。ベクトル(配列)の向きによって行方向/列方向のレイアウトが決まります。
イータ縮小LAMBDAとして以下の関数が入力候補に表示されます。
SUM,AVERAGE,MEDIAN,COUNT,COUNTA,MAX,MIN,PRODUCT,ARRAYTOTEXT,CONCAT,SRDEV.S,STDEV.P,VAR.S,VAR.P,MODE.SNGL
詳しくは以下を参照してください。
イータ縮小ラムダ(eta reduced lambda)
フィールドヘッダー 省略可能
「行フィールド」と「値」にヘッダーがあるかどうか、および結果でフィールド ヘッダーを表示するかどうかを指定する数値。
省略 ::自動。※自動判別なので意図しない結果になる場合があります。
0 : いいえ(ヘッダーなし、ヘッダー生成しない)
1 : はい、表示しません(ヘッダーあり、ヘッダー表示しない)
2 : いいえ、生成します(ヘッダーなし、ヘッダー生成する)
3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
自動では、「値」引数に基づいてデータにヘッダーが含まれていると想定されます。
1番目の値がテキストで 2 番目の値が数値の場合、データにはヘッダーがあるとみなされます。
複数の行または列グループ レベルがある場合、フィールド ヘッダーが自動で表示されます。
合計深さ 省略可能
行ヘッダーに合計を含めるかどうかを決定します。
省略 : 自動: 総計と、可能な場合は小計。
0 : 合計なし
1 : 総計
2 : 総計と小計
-1 : 上部に総計
-2 : 上部に総計と小計
小計の場合、フィールドには少なくとも 2つの列が必要です。
フィールドに十分な列がある場合、2より大きい数値がサポートされます 。
並べ替え順序 省略可能
省略時は行フィールドの昇順で並べ替えられます。
行をソートする方法を示す数値。
数値(1から始まる)は「行フィールド」の列に対応し、その後に「値」の列が続きます。
数値が負の場合、行は降順/逆順に並べ替えられます。
「行フィールド」のみに基づいて並べ替える場合は、数値のベクトル(配列)を指定できます。
フィルター配列 省略可能
対応するデータ行を対象とするかどうかを示すブール値の列指向(縦方向)1時限配列。
配列の長さは、「行フィールド」に提供される配列の長さと一致する必要があります。


GROUPBY関数の使用例と解説

使用例のサンプルデータ

エクセル Excel GROUPBY関数 LAMBDA関数
日付 品名 売上 利益
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[[#すべて],[品名]]
このように読み替えてください。

エクセル Excel GROUPBY関数 LAMBDA関数

もちろん、テーブルで使う方が良い場合が多いと思います。
ここでは、テーブル構造化参照の数式では数式文字列が長くなってしまうのでセル参照にしています。


最も単純かつ有用な使い方(UNIQUE+SUMIFS)

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(B1:B19,C1:D19,SUM,,0)

行フィールド B1:B19
C1:D19
関数 SUM
フィールドヘッダー 省略 ::自動
合計深さ 0 : 合計なし
並べ替え順序 省略 : ※行フィールドで並べ替えられます。
フィルター配列 省略

商品ごとの売上・利益の集計です。
商品の一覧を作成して、SUMIFS関数を使う場面です。

この関数を使わずにこれと同じような処理を行おうとすると、
F列に、UNIQUE関数で商品の一覧を作成し、
G列H列に、SUMIFS関数いれて集計。
このような処理が必要になります。
さらに、これを1セルの数式で実現しようとすると、かなり大変です。

エクセル Excel GROUPBY関数 LAMBDA関数

=LET(キー,B2:B19,値1,C2:C19,値2,D2:D19,
商品,UNIQUE(キー),
売上,SUMIFS(値1,キー,商品),
利益,SUMIFS(値2,キー,商品),
SORT(HSTACK(商品,売上,利益)))

列全体を指定した場合の問題点

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(B:B,C:D,SUM,,0)

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

複数の列でグループ化

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3)

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 省略 : 自動: 総計と、可能な場合は小計。
※この例で小計が出ないのが何故かは不明
並べ替え順序 省略
フィルター配列 省略

行フィールドをA:B列で指定しています。
つまり、日付・商品の2段階のグループになります。

上部に総計と小計

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3,-2)

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ -2 : 上部に総計と小計
並べ替え順序 省略
フィルター配列 省略

これなどは、クリックしていくだけで作成するピボットテーブルとほぼ同じです。

エクセル Excel GROUPBY関数 LAMBDA関数

降順/逆順で並べ替え

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3,0,-1)

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 0 : 合計なし
並べ替え順序 -1
フィルター配列 省略

並べ替え順序に -1 を指定しているので、
行フィールドの先頭列の降順/逆順で並べ替えられます。

複数列で行を並べ替え

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3,0,{-1,-2})

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 0 : 合計なし
並べ替え順序 {-1,-2}
フィルター配列 省略

並べ替えを行フィールドのみで行う場合は、複数の列を指定することが出来ます。
※行フィールドと値の両方を指定して並べ替えることはできません。
この場合は、並べ替え順序の数値をベクトル(配列)で指定します。
並べ替え順序の数値は、行フィールドと値で通し番号です。
A列 → 1
B列 → 2
C列 → 3
D列 → 4
降順/逆順の場合は数値をマイナスで指定します。
※シートの列位置とは関係なく、あくまで「行フィールド」の中での順番です。

値で並べ替え

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3,0,3)

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 0 : 合計なし
並べ替え順序 3
フィルター配列 省略

並べ替え順序に 3 を指定しているので、値のC列で並べ替えられます。
気を付けて見てもらいたいのは、
グループの小計 > グループ内集計値
この順で並べ替えられます。
今回では、
・日付・品名の売上計
・日付・品名内の売上
この順で並べ替えられています。

フィルターで対象データを絞る

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,SUM,3,,,A1:A19<>DATE(2023,11,2))

行フィールド A1:B19
C1:D19
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 省略 : 自動: 総計と、可能な場合は小計。
並べ替え順序 省略
フィルター配列 A1:A19<>DATE(2023,11,2)

フィルター配列はFILTER関数の指定と同じ要領になります。
・FILTER関数の書式 ・FILTER関数使用例のサンプルデータ ・FILTER関数の基本 ・空白セルを0ではなく空白にする場合 ・複数条件のフィルター ・関数を使ってフィルター ・横(列)でフィルター ・表示する列を選択する ・FILTER関数の結果を他の関数で使う ・スピルによって新しく追加された関数
行フィールド・値と同じ行数のブール値(TRUE/FALSE)の配列を指定します。
A1:A19<>DATE(2023,11,2)
これは、19個のTRUE/FALSEの縦配列です。
この配列が FALSE の行は対象外として除外されます。

関数にラムダのベクトル(配列)を指定

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:C19,HSTACK(SUM,AVERAGE),3)

行フィールド A1:B19
C1:C19
関数 HSTACK(SUM,AVERAGE)
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 省略 : 自動: 総計と、可能な場合は小計。
並べ替え順序 省略
フィルター配列 省略

HSTACKで横方向にしているので、出力も横に展開されています。
この場合「値」を複数列指定することはできません、複数列指定しても無視されます。
ではVSTACKを使うと、

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:C19,VSTACK(SUM,AVERAGE),3)

行フィールド A1:B19
C1:C19
関数 VSTACK(SUM,AVERAGE)
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 省略 : 自動: 総計と、可能な場合は小計。
並べ替え順序 省略
フィルター配列 省略

VSTACKで縦方向にしているので、出力も縦に展開されています。
この場合「値」を複数列指定することはできません、複数列指定しても無視されます。

行フィールドや値列が連続していない場合

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(HSTACK(C1:C19,A1:A19),HSTACK(B1:B19,D1:D19),SUM,3)

行フィールド HSTACK(C1:C19,A1:A19)
HSTACK(B1:B19,D1:D19)
関数 SUM
フィールドヘッダー 3 : はい、表示します(ヘッダーあり、ヘッダー出力する)
合計深さ 省略 : 自動: 総計と、可能な場合は小計。
並べ替え順序 省略
フィルター配列 省略

行フィールドも値列もHSTACK関数で横に結合して引数に指定しています。
IF関数に配列定数を指定して列の配列を作成する方法もあります。

=GROUPBY(IF({0,1},A1:A19,C1:C19),IF({0,1},D1:D19,B1:B19),SUM,3)

エクセル Excel GROUPBY関数 LAMBDA関数

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

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(TEXT(A1:A19,"yyyy/mm!_")&B1:B19,C1:D19,SUM,3)

年月と品名で集計しています。
元のデータを編集してGROUPBY関数に入れる事が出来ます。
この時に使用できる関数に特に制限ありません。
当然ですが、VLOOKUPやMATCH+INDEX等の関数も使えます。
ただし、上記の例ではCONCAT関数を使う事は出来ません。
CONCAT関数は、複数の範囲や文字列からのテキストを結合します。ただし、区切り記号は指定できません。CONCAT関数の書式 CONCAT(テキスト1,[テキスト2],…) テキスト1 必須です。結合するテキスト項目。
(CONCAT関数は19行分全てを1つの文字列にしてしまいます。)

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(IFERROR(VLOOKUP(B1:B19,J1:K3,2,FALSE),"品名VLOOKUP"),C1:D19,SUM,3)

ヘッダーを表示する場合は、上記のようにデータの先頭をヘッダーとして使えるように作成する必要があります。

値に数式を指定した場合

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,IFERROR(ROUND(C1:D19/1000,0),""),SUM)

値の列も自由に数式を指定することが出来ます。
ただしヘッダーを表示する場合はヘッダー文字列の作成が面倒な場合が多くなると思います。

関数にLAMBDA関数を指定

イータ縮小ラムダ関数は単純にLAMBDA関数に書き換えることが出来ます。
・LAMBDA関数の構文 ・LAMBDA関数をセルで使う場合の基本 ・LAMBDA関数の「数式の検証」について ・LAMBDA関数をセルで使う場合の使用例 ・パラメーターの省略について ・LAMBDA関数を名前定義に登録 ・再帰関数の作成 ・LET関数内でLAMBDA関数を使用する ・LAMBDA関数にLAMBDA関数を渡す ・LAMBDA関数のネストと変数のスコープ(適用範囲) ・遅延評価によりLAMBDA関数オブジェクト(関数値)を返すことができる関数 ・LAMBDAヘルパー関数について
SUM、AVERAGE、MEDIAN、COUNT、COUNTA、、、
これらは、LAMBDA関数の記述を縮小簡略化した書き方です。
従って、もともとのLAMBDA関数で書き直すことが出来ます。
=GROUPBY(...,イータ縮小関数)

=GROUPBY(...,LAMBDA(x,イータ縮小関数(x)))

エクセル Excel GROUPBY関数 LAMBDA関数

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

さらに、LET関数を使ってLAMBDA関数を事前に定義しておき、その関数を使う事も出来ます。

エクセル Excel GROUPBY関数 LAMBDA関数

=LET(合計,LAMBDA(x,y,SUM(x)*2),
GROUPBY(A1:B19,C1:D19,合計,3))


上記では、「合計」という関数を作成してそれを使っています。
独自に作製する関数名をイータ縮小ラムダ関数と同じにすると、その名前で上書きされます。
誤解の元になるので、このような使い方は避けた方が良いでしょう。

LAMBDA関数の第2引数について

GROUPBY関数の第3引数「関数」に渡す引数は2つ存在します。
以下では、この「関数」に渡す第2引数についての解説になります。
ただし、イータ縮小ラムダには第2引数は渡さません。

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,LAMBDA(x,y,SUM(x)),3)

LAMBDA関数に第2引数を指定することが出来ます。
上記は第1引数しか使っていないので、第1引数だけを指定した場合と同じです。

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,LAMBDA(x,y,SUM(y)),3)

SUM(y)として第2引数を合計しています。
各行の結果が「合計」と同じになっています。

LAMBDA(第1引数,第2引数,計算)
第1引数は各グループごとの計算になります。
第2引数は全体にたいする計算になります。
つまり、
第1引数は各グループごとの配列。
第2引数はデータ全体の配列。

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:C19,LAMBDA(x,y,COUNTA(x)&"-"&COUNTA(y)))
上記のように件数を確認してみると良く分かると思います。

第1引数第2引数は配列の大きさ(件数)が違うので、
第1引数第2引数を直接演算するような式はエラーとなります。

エクセル Excel GROUPBY関数 LAMBDA関数

第1引数第2引数をそれぞれ別々に集計した後(つまり1件ずつに集計後)に演算することは問題ありません。

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,LAMBDA(x,y,SUM(x)/SUM(y)),3,2)

これは全体に対する構成比の計算になります。
※この記事を執筆時点では何故かPERCENTOF関数がまだ降りてきていません…
以下はPERCENTOF関数が降りて来たので以下に追記。

PERCENTOF関数

=PERCENTOF(data_subset,data_all)

SUM(第1引数) / SUM(第2引数)
従って全合計の値が0の場合は「#DIV/0!」のエラーになります。

エクセル Excel GROUPBY関数 LAMBDA関数

=GROUPBY(A1:B19,C1:D19,PERCENTOF,3,2)
先に掲載したLAMBDAと同じ結果となっています。

Microsoft Support GROUPBY関数
Microsoft Support PIVOTBY関数





同じテーマ「エクセル入門」の記事

LAMBDA以降の新関数の使用例
縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)
直積(クロス結合、交差結合)とピボット解除
複数の文字列を検索して置換するSUBSTITUTE
LAMBDA以降の新関数の問題集
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)
LAMBDA以降の新関数の問題と解説(配列操作関数編)
PY関数(Pythonコードをセル内で実行)
GROUPBY関数(縦軸でグループ化して集計)
PIVOTBY関数(縦軸と横軸でグループ化して集計)
イータ縮小ラムダ(eta reduced lambda)


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ