PIVOTBY関数(縦軸と横軸でグループ化して集計)
PIVOTBY関数は、行(縦)と列(横)でグループ化し指定された関数によって値を集計します。
複数の行グループレベル、複数の列グループレベルに対応しています。
総計・小計、並べ替え、フィルター処理もサポートされています。
集計にはイータ縮小ラムダ(eta reduced lambda)または明示的なLAMBDAが使用できます。
PIVOTBY関数は、ピボットテーブルを関数で作製するものと考えれば良いでしょう。
縦の1軸だけのグループ化はGROUPBY関数を使用します。
2024/8時点でこの関数は、365 Insider の新関数です。
その為、機能も未確定であり今後変更の可能性もあります。
ページ内目次
PIVOTBY関数の構文
引数 | 説明 |
行フィールド | 必須 行をグループ化し、行ヘッダーを生成するために使用される値を含む列方向(縦方向)の配列または範囲。 配列または範囲には複数の列を含むことが出来ます。 その場合、出力には複数の行グループ レベルが含まれます。 |
列フィールド | 必須 列をグループ化し、列ヘッダーを生成するために使用される値を含む列指向(横方向)の配列または範囲。 配列または範囲には複数の行が含まれる場合があります。 その場合、出力には複数の列グループ レベルが含まれます。 |
値 | 必須 集計するデータの列指向の配列または範囲。 配列または範囲には複数の列が含まれる場合があります。その場合、出力には複数の集計が含まれます。 |
関数 | 必須 「値」を集計するために使用される明示的(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から始まる)は「行フィールド」の列に対応し、その後に「値」の列が続きます。 数値が負の場合、行は降順/逆順に並べ替えられます。 「行フィールド」のみに基づいて並べ替える場合は、数値のベクトル(配列)を指定できます。 |
列合計深さ | 省略可能 列ヘッダーに合計を含めるかどうかを決定します。 省略 : 自動: 総計と、可能な場合は小計。 0 : 合計なし 1 : 総計 2 : 総計と小計 -1 : 上部に総計 -2 : 上部に総計と小計 小計の場合、フィールドには少なくとも 2つの列が必要です。 フィールドに十分な列がある場合、2より大きい数値がサポートされます 。 |
列並べ替え順序 | 省略可能 省略時は列フィールドの昇順で並べ替えられます。 列をソートする方法を示す数値。 数値(1から始まる)は「列フィールド」の行に対応し、その後に「値」の行が続きます。 数値が負の場合、列は降順/逆順に並べ替えられます。 「列フィールド」のみに基づいて並べ替える場合は、数値のベクトル(配列)を指定できます。 |
フィルター配列 | 省略可能 対応するデータ行を対象とするかどうかを示すブール値の列指向(縦方向)1時限配列。 配列の長さは、「行フィールド」と「列フィールド」に提供される配列の長さと一致する必要があります。 |
PIVOTBY関数の使用例と解説
使用例のサンプルデータ
日付 | 分類 | 品名 | 売上 | 利益 |
2023/11/1 | 分類A | 商品AC | 25708 | 9769 |
2023/11/1 | 分類B | 商品BB | 129196 | 14212 |
2023/11/2 | 分類A | 商品AC | 93004 | 27901 |
2023/11/1 | 分類B | 商品BA | 102117 | 14296 |
2023/11/1 | 分類A | 商品AB | 117078 | 43319 |
2023/11/1 | 分類A | 商品AA | 10817 | 2272 |
2023/11/2 | 分類A | 商品AC | 19539 | 7425 |
2023/11/1 | 分類A | 商品AC | 188970 | 37794 |
2023/11/2 | 分類B | 商品BA | 52547 | 6306 |
2023/11/2 | 分類B | 商品BB | 140354 | 46317 |
2023/11/1 | 分類A | 商品AA | 53516 | 18731 |
2023/11/2 | 分類A | 商品AB | 93257 | 14921 |
2023/11/2 | 分類A | 商品AA | 91518 | 14643 |
2023/11/1 | 分類A | 商品AB | 164701 | 24705 |
2023/11/2 | 分類A | 商品AA | 123468 | 38275 |
2023/11/1 | 分類A | 商品AA | 155404 | 21757 |
2023/11/2 | 分類A | 商品AB | 15125 | 5445 |
2023/11/1 | 分類B | 商品BA | 187919 | 56376 |
2023/11/2 | 分類B | 商品BB | 177205 | 38985 |
2023/11/2 | 分類B | 商品BA | 69459 | 25005 |
C1:C21
このようにセル参照しています。
データ範囲をテーブル化して使う場合は、
テーブル1[[#すべて],[品名]]
このように読み替えてください。
ここでは、テーブル構造化参照の数式では数式文字列が長くなってしまうのでセル参照にしています。
最も単純かつ有用な使い方(UNIQUE+SUMIFS)
行フィールド | C1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 ※行フィールドで並べ替えられます。 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 ※列フィールドで並べ替えられます。 |
フィルター配列 | 省略 |
商品・日別の売上集計です。
商品の一覧と日付でSUMIFS関数を使うか、ピボッテーブルを使う場面ですが、
PIVOT関数でかなり簡単に作製することができるようになりました。
列全体を指定した場合の問題点
入力範囲がテーブルの場合は構造化参照するので問題になりませんが、
セル範囲の場合はメンテナンス性を考慮しての列指定は使いづらくなります。
FILTER関数と組み合わせたり等の対応も考えられますが、数式が複雑化してしまう懸念があります。
このような場合は範囲をテーブルにしたほうが良いと思います。
複数の列でグループ化
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 : 自動 |
行合計深さ | 2 : 総計と小計 |
行並べ替え順序 | 省略 : ※行フィールドで並べ替えられます。 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 : ※列フィールドで並べ替えられます。 |
フィルター配列 | 省略 |
行フィールドをB:C列で指定しています。
つまり、分類・商品の2段階のグループになります。
(サンプルデータは、商品が分類通してユニークなので商品集計と同じ結果になります。)
複数の値を集計
行フィールド | C1:C21 |
列フィールド | A1:A21 |
値 | D1:E21 |
関数 | SUM |
フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 : ※行フィールドで並べ替えられます。 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 : ※列フィールドで並べ替えられます。 |
フィルター配列 | 省略 |
売上と利益の2つの値で集計してています。
しかし、列の合計が出力されていません・・・
「列合計深さ」を指定しても出力させることはできませんでした。
これが仕様なのかバグなのか、現時点では不明です。
上部に総計と小計
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 3 : はい、表示します(ヘッダーあり、ヘッダー出力する) |
行合計深さ | -2 : 上部に総計と小計 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | 省略 |
ヘッダーの表示+上部に合計行
個人的な感想になってしまいますが、この組み合わせはあまり見やすいとは思えません。
使う場合は、レイアウトを工夫したほうが良いかもしれません。
降順/逆順で並べ替え
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | -2 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 : ※列フィールドで並べ替えられます。 |
フィルター配列 | 省略 |
行並べ替え順序に -2 を指定しています。
数値(1から始まる)は「行フィールド」の列に対応しています。
※シートの列位置とは関係なく、あくまで「行フィールド」の中での順番になります。
数値が負の場合、行は降順/逆順に並べ替えられます。
上記では、
B列 → 1
C列 → 2
B列は省略で昇順、C列を降順に指定していることになります。
複数列で行を並べ替え
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | {-1,-2} |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 : ※列フィールドで並べ替えられます。 |
フィルター配列 | 省略 |
行並べ替え順序に {-1,-2} を指定しています。
並べ替えを行フィールドのみで行う場合は、複数の列を指定することが出来ます。
この場合は、並べ替え順序の数値をベクトル(配列)で指定します。
並べ替え順序の数値は、行フィールドと値で通し番号です。
B列 → 1
C列 → 2
D列 → 3
降順/逆順の場合は数値をマイナスで指定します。
※シートの列位置とは関係なく、あくまで「行フィールド」の中での順番です。
※行フィールドと値の両方を指定して並べ替えることはできません。
列を並べ替え
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 : ※行フィールドで並べ替えられます。 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | -1 |
フィルター配列 | 省略 |
列並べ替え順序に -1 を指定しています。
並べ替え順序の数値は、行フィールドと値で通し番号です。
A列 → 1
D列 → 2
降順/逆順の場合は数値をマイナスで指定します。
※列(横)で並べ替えることはあまりないと思います。
値で並べ替え
行フィールド | B1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 3 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 2 |
フィルター配列 | 省略 |
列並べ替え順序に 3 を指定しています。
並べ替え順序の数値は、行フィールドと値で通し番号です。
B列 → 1
C列 → 2
D列 → 3
並べ替え順序の数値は、列フィールドと値で通し番号です。
A列 → 1
D列 → 2
総計→小計→明細
この順で並べ替えられています。
フィルターで対象データを絞る
行フィールド | C1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | B1:B21="分類A" |
フィルター配列はFILTER関数の指定と同じ要領になります。
B1:B21="分類A"
これは、21個のTRUE/FALSEの縦配列です。
この配列が FALSE の行は対象外として除外されます。
関数にラムダのベクトル(配列)を指定
行フィールド | C1:C21 |
列フィールド | A1:A21 |
値 | D1:D21 |
関数 | HSTACK(SUM,AVERAGE) |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | 省略 |
HSTACKで横方向にしているので、出力も横に展開されています。
ではVSTACKを使うと、
行フィールドや値列が連続していない場合
行フィールド | HSTACK(E1:E21,A1:A21) |
列フィールド | B1:B21 |
値 | C1:C21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | 省略 |
行フィールドも値列もHSTACK関数で横に結合して引数に指定しています。
IF関数に配列定数を指定して列の配列を作成する方法もあります。
行フィールドに数式を指定した場合
行フィールド | B1:B21&C1:C21 |
列フィールド | B1:B21 |
値 | C1:C21 |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | 省略 |
B1:B21&C1:C21
分類と品名を文字列結合しています。
元のデータを編集してPIVOTBY関数に入れる事が出来ます。
この時に使用できる関数に特に制限ありません。
当然ですが、VLOOKUPやMATCH+INDEX等の関数も使えます。
ただし、上記の例ではCONCAT関数を使う事は出来ません。
ヘッダーを表示する場合は、先頭をヘッダーとして使えるように作成する必要があります。
値に数式を指定した場合
行フィールド | C1:C21 |
列フィールド | B1:B21 |
値 | ROUND(D1:D21/1000,0) |
関数 | SUM |
フィールドヘッダー | 省略 ::自動 |
行合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
行並べ替え順序 | 省略 |
列合計深さ | 省略 : 自動: 総計と、可能な場合は小計。 |
列並べ替え順序 | 省略 |
フィルター配列 | 省略 |
値の列も自由に数式を指定することが出来ます。
ただし、ヘッダーを表示する場合は、先頭をヘッダーとして使えるように作成する必要があります。
関数にLAMBDA関数を指定
これらは、LAMBDA関数の記述を縮小簡略化した書き方です。
従って、もともとのLAMBDA関数で書き直すことが出来ます。
=GROUPBY(...,イータ縮小関数)
↓
=GROUPBY(...,LAMBDA(x,イータ縮小関数(x)))
=PIVOTBY(C1:C21,A1:A21,D1:D21,SUM)
どちらでも同じになります。
PIVOTBY(C1:C21,A1:A21,D1:D21,合計))
独自に作製する関数名をイータ縮小ラムダ関数と同じにすると、その名前で上書きされます。
誤解の元になるので、このような使い方は避けた方が良いでしょう。
LAMBDA関数の第2引数について
以下では、この「関数」に渡す第2引数についての解説になります。
ただし、イータ縮小ラムダには第2引数は渡さません。
上記は第1引数だけを指定した場合と同じです。
各行の結果が「合計」と同じになっています。
第1引数は各グループごとの計算になります。
第2引数は全体にたいする計算になります。
つまり、
第1引数は各グループごとの配列。
第2引数はデータ全体の配列。
上記のように件数を確認してみると良く分かると思います。
第1引数と第2引数を直接演算するような式はエラーとなります。
※この記事執筆時点では何故かPERCENTOF関数がまだ降りてきていません…
以下はPERCENTOF関数が降りて来たので追記。
PERCENTOF関数
従って全合計の値が0の場合は「#DIV/0!」のエラーになります。
先に掲載したLAMBDAと同じ結果となっています。
Microsoft Support GROUPBY関数
Microsoft Support PIVOTBY関数
同じテーマ「エクセル入門」の記事
直積(クロス結合、交差結合)とピボット解除
複数の文字列を検索して置換するSUBSTITUTE
LAMBDA以降の新関数の問題集
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)
LAMBDA以降の新関数の問題と解説(配列操作関数編)
PY関数(Pythonコードをセル内で実行)
GROUPBY関数(縦軸でグループ化して集計)
PIVOTBY関数(縦軸と横軸でグループ化して集計)
イータ縮小ラムダ(eta reduced lambda)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(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)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。