(Excel)GROUPBY関数で行フィールドを指定した順に並べる方法

 ExcelのGROUPBY関数で、行フィールド(左端の列に表示される見出し)の並び順を指定して並べ替えさせる方法について紹介します。

ソート順をリストで指定する方法

 まずは問題となるケースの確認です。
 次の画像は、GROUPBY関数を使った単純な集計の例です。
 E3セルに「=GROUPBY(B3:B10,C3:C10,SUM)」と入力し、店舗ごとの売上合計を算出しています。

 GROUPBY関数では第6引数でソート指定が可能ですが、並べ方は(当然ながら)昇順と降順しかありません。また、画像のように第6引数を指定しないと行フィールドの昇順となります(UNIQUE関数のような初出順にはならない)。
 これらにより「行フィールドの並び順を思ったように変えられない」、「元のデータの行フィールド順の順番で並べて欲しいのにGROUPBY関数で並べ替えられてしまう」といった問題が生じます。



 そこで次の画像では、数式内で行フィールド(店舗)の並び順を指定しています。

 E3セル

=LET(a,GROUPBY(B3:B10,C3:C10,SUM),
SORTBY(a,XMATCH(TAKE(a,,1),{"東京店","名古屋店","大阪店"}))
)

 式がかなり長くなっています。
 具体的には最初の画像と同じ結果をLET関数でaと名付けています。そしてaの1列目のそれぞれの値(店舗名)が「{"東京店","名古屋店","大阪店"}」という配列中の何番目にあるか(1~3)を取得しています。そしてSORTBY関数を使いその順番を基準としてaを並べ替えています。
 さらに式が長くなりますが「XMATCH(TAKE(a,,1),{"東京店","名古屋店","大阪店"})」をbなどと名付けて「SORTBY(a,b)」で締める形にした方が読みやすくなります。
 なお、aの1列目には「合計」という値が含まれますがこれはXMATCH関数で順番を取得できずエラーになり、結果的に一番下に表示されることとなります。



 次の画像ではシート上のリストを参照してソート順に指定しています。

 G3セル

=LET(a,GROUPBY(B3:B10,C3:C10,SUM),
SORTBY(a,XMATCH(TAKE(a,,1),E3:E5))
)

 配列を直接指定していたのを、セル参照に代えただけの違いです。

元のデータの行フィールドの順(初出順)に並べさせる方法

 次の画像では、左側の売上表を行フィールド(店舗)順に並べ替ています。
 そしてGROUPBY関数の結果もこの店舗の順番で並ぶようにしています。

 E3セル

=LET(a,GROUPBY(B3:B10,C3:C10,SUM),
SORTBY(a,XMATCH(TAKE(a,,1),B3:B10))
)

 これも数式の内容的には上記例と同じで、XMATCH関数の参照先が「B3:B10」に変わっただけです。これにより配列a中の「東京店」「名古屋店」「大阪店」がそれぞれ1,4,6(B3:B10内で初めて出現する相対位置)に読み替えられ、これを基準としてaが並べ替えられます。
 画像ではデータが店舗名でソートされていますが、そうでない場合も店舗の初出順に並べられます。