🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

GROUPBY・PIVOTBY 応用編 — 構成比、複数指標、カスタム集計

|

GROUPBY・PIVOTBY 応用編 — 構成比、複数指標、カスタム集計

要点GROUPBYPIVOTBY は、ピボットテーブルが一手ではできないことを こなす、共通の省略可能な引数群を持ちます:PERCENTOF関数 スロットで構成比を 出し(=GROUPBY(C2:C1000, D2:D1000, PERCENTOF))、関数の HSTACK は複数の指標を一度に返し、同じスロットの LAMBDA は加重平均を組み立て、フィルター配列 は選んだ行だけを集計します—— すべて生きたまま。関数 の文法を使いこなせば、作業列に手を伸ばすのをやめられます。

=GROUPBY(C2:C1000, D2:D1000, PERCENTOF)                      ' 各地域の総計に対する構成比
=GROUPBY(C2:C1000, D2:D1000, HSTACK(SUM, AVERAGE, COUNT))    ' 3つの指標を横並びで
=GROUPBY(C2:C1000, D2:D1000, LAMBDA(v, SUM(v)/COUNT(v)))     ' カスタム集計
=GROUPBY(C2:C1000, D2:D1000, SUM, , , , (E2:E1000="West"))   ' 地域 = West の行だけ

基本の GROUPBY/PIVOTBY の呼び出し——グループ化し、集計し、スピルする——だけで、すでに 日常のピボットテーブルを置き換えます。省略可能な引数こそ、それらがピボットテーブルの先へ 出る場所です。構成比、1つのグリッドに複数の集計、加重平均、行への事前フィルター:どれもここ では組み込みの引数ですが、ピボットテーブルでは右クリックして設定する雑務(あるいは不可能) です。そのすべてを解き放つ鍵は、関数 引数が本当は何を受け取るのかを理解することです。

この記事でわかること

  • PERCENTOF で構成比を一語で——そしてNo.1の罠
  • 関数を重ねて複数の指標を一度に
  • 関数スロットに LAMBDA を落としてカスタム集計
  • フィルター配列集計の前に行をフィルター
  • エラーを読む:#CALC!#FIELD!#SPILL! はそれぞれ1つの引数を指す

関数スロットは SUM 以外も受け取る

この記事のどの技も、たった1つの考えに支えられています:関数 引数は組み込みの名前に限られ ません。**名前だけで渡すあらゆる関数(イータ簡約された関数)*を受け取ります——SUM の ような裸の名前、名前のスタック*、PERCENTOF のような専用ヘルパー、あるいは自分で書く完全な LAMBDA。このスロットを「列を要約に変える任意の関数」と見た瞬間、応用機能は別々の機能では なくなり、1つの柔軟な引数になります。

=GROUPBY(rows, values, SUM)                       ' 組み込みの名前
=GROUPBY(rows, values, PERCENTOF)                 ' 専用ヘルパー
=GROUPBY(rows, values, HSTACK(SUM, AVERAGE))      ' 複数の名前を一度に
=GROUPBY(rows, values, LAMBDA(v, MAX(v)-MIN(v)))  ' 自分の関数

PERCENTOF で構成比を出す

最も要望の多いレポート——「各グループは全体の何割か?」——は一語です。PERCENTOF は各 グループを合計し、全体の合計で割ります。

=GROUPBY(C2:C1000, D2:D1000, PERCENTOF)   ' 地域 | 総計に対する構成比(各行、例:0.32)

罠:結果は小数であって、書式設定された百分率ではありません。0.32 は32パーセントですが、 スピルにパーセントの表示形式(Ctrl+Shift+%)を適用するまで、セルは 0.32 と表示します。 これは誰もが一度はまります——数字は正しく、表示が正しくないだけなのに、人は数式が壊れて いると思い込みます。スピル範囲をパーセント書式にすれば 32% と読めます。割合と合計を一緒に 出したいなら、重ねます:HSTACK(SUM, PERCENTOF) が金額とその割合を隣り合う列で出します。

関数を重ねて複数の指標を一度に

合計・平均・件数のために GROUPBY を3回走らせることはしません—— HSTACK で関数を重ね、1つの数式から3つの結果列を得ます。

=GROUPBY(C2:C1000, D2:D1000, HSTACK(SUM, AVERAGE, COUNT))
'  地域 | 売上合計 | 平均売上 | 注文件数

スタックの各関数が、順に1つの列になります。これはピボットテーブルなら、同じフィールドを に3回ドラッグして、それぞれの「集計方法」を変える作業ですが、ここでは1つの式で、欲しい ヘッダー行のように読めます:SUM, AVERAGE, COUNT を広げるのとの違いに注意:値の列を 増やす違うデータを同じ方法で集計し、関数を増やす同じデータを違う方法で集計 します。両方を組み合わせれば、完全な指標グリッドになります。

カスタム集計:関数スロットの LAMBDA

組み込みが1つも合わないとき——加重平均、範囲、トリム値——LAMBDA を書きます。各グループの値を配列 v として受け取り、返したものがそのまま集計値になります。

=GROUPBY(C2:C1000, D2:D1000, LAMBDA(v, MAX(v) - MIN(v)))          ' 各グループ内のばらつき
=GROUPBY(C2:C1000, D2:D1000, LAMBDA(v, TEXTJOIN(", ", 1, v)))     ' 合計せず、メンバーを列挙
=GROUPBY(C2:C1000, D2:D1000, LAMBDA(v, SUMPRODUCT(v, w)/SUM(w)))  ' 加重平均(w = 重み)

これはピボットテーブルが決して届かない天井です:その「値の集計方法」メニューは固定の一覧 ですが、LAMBDA スロットはあなたが表現できる任意のロジックを走らせます。覚えるべきルール ——LAMBDA はグループの値を1つの引数として受け取り、グループごとに単一の値を返さなければ ならない。配列を返すと #CALC! になります。加重平均、フィルターした部分集合の中央値、 「最大値をテキストで」——すべてこのスロットに収まります。

集計の前に行をフィルターする

フィルター配列GROUPBY の7番目の引数)は、データと同じ高さのブール配列を受け取り、 TRUE の行だけを集計します——作業列も、事前フィルターの手順も不要です。

=GROUPBY(C2:C1000, D2:D1000, SUM, , , , (E2:E1000 = "West"))         ' West 地域の行だけ
=GROUPBY(C2:C1000, D2:D1000, SUM, , , , (YEAR(A2:A1000) = 2026))     ' 2026年の行だけ
=GROUPBY(C2:C1000, D2:D1000, SUM, , , , (D2:D1000 >= 1000))          ' 1000以上の注文だけ

条件は FILTER のテストのように書きます——列に沿って TRUE/FALSE を生む比較です。エラーを防ぐ唯一のルール:フィルター配列行フィールドまったく同じ高さでなければなりません。データが E2:E999 なのに E2:E1000 を指せば #VALUE! になります。すべての範囲を同じ高さに保てば、それだけで動きます。これが、元データに 触れずに「今年だけ」「返品を除く」「West と East だけ」の集計を作る方法です。

エラーを読む

これらの関数が投げる3つのエラーは、それぞれ特定の間違いを指します——地図を覚えれば、 デバッグは一瞬です。

#CALC!    ' 関数スロットが誤り:SUM ではなく SUM()、または配列を返す LAMBDA
#FIELD!   ' フィールド/列の参照がずれている — 多くは フィールドヘッダー の設定ミスで見出しが混入
#SPILL!   ' 結果がふさがれている — 数式の下と右のセルを空ける
#VALUE!   ' たいてい フィルター配列 がデータと違う高さ

#CALC! はほぼ常に 関数 引数です——呼び出した SUM()、またはグループごとに複数の値を返す LAMBDA#FIELD! はデータの形を指し、多くは フィールドヘッダー 引数です:範囲に見出し セルが含まれるなら、フィールドヘッダー1 にして、ラベルがデータとしてグループ化され ないようにします。#SPILL! は空間の問題であって、論理の問題ではありません——数式は正しく、 落ち先が正しくないのです。そしてフィルター付き集計での #VALUE! は、上で述べた高さの 不一致です。各エラーは謎ではなく、1つの引数を指す道標です。

判断

集計に構成比、複数の指標、カスタム計算、行の部分集合が必要になった瞬間、これらの省略 可能な引数はピボットテーブルに完勝します——ここでは1引数、あちらではメニューを潜るか 行き止まりです。3つのルールを手元に置きます:関数 スロットは裸の名前、名前を重ねた スタック、またはグループごとに1つの値を返す LAMBDA を取る。PERCENTOFパーセント書式に すべき小数を返す。そして フィルター配列データと同じ高さでなければならない。エラーを 地図として読む——#CALC! は関数、#FIELD! は見出し、#SPILL! は空間、#VALUE! はフィルターの 高さ——そうすれば、ピボットテーブルを手元に残す最後の言い訳(凝ったことができる、という点)は ほぼ消えます。

ExcelMaster の使いどころ

応用の引数は強力で、容赦がありません——配列を返す LAMBDA が1つあれば、全体が #CALC! です。 ExcelMaster に「各地域の売上、その総計に対する割合、そして注文件数」と伝えれば、 =GROUPBY(C2:C1000, D2:D1000, HSTACK(SUM, PERCENTOF, COUNT)) を書き、パーセントの列を書式設定 します。「数量で重み付けした、カテゴリ別の加重平均単価」と頼めば、LAMBDA を組み立てます。 そして数式が #CALC!#VALUE! を返したときは、このガイドと同じようにエラーを読み—— カンマを数えさせる代わりに、間違っている引数そのものを指します。

よくある質問

GROUPBY や PIVOTBY で構成比を表示するには?

関数 スロットに PERCENTOF を使います:=GROUPBY(C2:C1000, D2:D1000, PERCENTOF)。各 グループの合計を総計で割ります。結果は 0.32 のような小数なので、スピルにパーセント書式 (Ctrl+Shift+%)を適用して 32% と表示します。金額とその割合を並べて出すには、 HSTACK(SUM, PERCENTOF) を使います。

GROUPBY は複数の集計を一度に返せますか?

はい——関数を重ねます:=GROUPBY(C2:C1000, D2:D1000, HSTACK(SUM, AVERAGE, COUNT)) は3つの列を 返します。各関数が順に1つの結果列になります。これは の範囲を広げるのとは違います。広げる 方は違う列を同じ方法で集計しますが、関数を重ねる方は同じ列を複数の方法で集計します。

カスタムの数式を集計に使うには?

関数 スロットに LAMBDA を置きます。各グループの値を配列として受け取り、単一の値を返さ なければなりません:=GROUPBY(C2:C1000, D2:D1000, LAMBDA(v, MAX(v)-MIN(v)))。これで加重平均、 範囲、そして組み込みの「集計方法」一覧にできないことをすべてカバーします。LAMBDA が単一の値 ではなく配列を返すと、#CALC! になります。

GROUPBY が集計する行をフィルターするには?

フィルター配列 引数(7番目)を使います: =GROUPBY(C2:C1000, D2:D1000, SUM, , , , (A2:A1000="West")) は、一致する行だけを集計します。 条件は FILTER のテストのように書き、ブール配列はデータと同じ 高さでなければなりません——不一致は #VALUE! を返します。

GROUPBY が #CALC! や #FIELD! を返すのはなぜ?

#CALC! はほぼ常に 関数 引数が誤りです:SUM ではなく SUM()、またはグループごとに1つの値 ではなく配列を返す LAMBDA#FIELD! はたいてい フィールドヘッダー 引数がずれています—— 範囲に見出しセルが含まれるなら 1 に設定し、ラベルがデータとして扱われないようにします。 #SPILL! は論理とは無関係で、下や右のセルが結果をふさいでいる合図です。

検証環境

検証環境: Excel 365(Windows 11)— 最終確認 2026-07-18。

関連ガイド: ExcelのGROUPBY関数 · ExcelのPIVOTBY関数 · ExcelのLAMBDA関数 · LAMBDA ヘルパー関数 · ExcelのFILTER関数