【スプレッドシート】UNIQUE関数,FILTER関数,SORT関数

3つの関数を使って表をまとめる
テスト用スプレッドシートのリンク
UNIQUE関数テスト
UNIQUE,FILTER,SORT ①売上表,②品名まとめ,UNIQUE関数で品名の重複するものをまとめる。 さらにSUMIFで売上個数、売上金額の合計を出す。 それを売上金額(合計)でソートする。 SEQUENCEで並び順を追加。,③合...

UNIQUE関数,FILTER関数,SORT関数で表のまとめを作れます

売上表

この売上表のまとめを作ります

完成図

1. ユニークテーブルを作る

UNIQUE関数で品名の重複するものをまとめる。

さらにSUMIFで売上個数、売上金額の合計を出す。

それを売上金額(合計)でソートする。

SEQUENCEで並び順を追加。

=LET( uniq, UNIQUE(D4:D11),
 sums,ARRAYFORMULA(SUMIF(D4:D11,uniq,E4:E11)),
 sums2, ARRAYFORMULA(SUMIF(D4:D11,uniq,F4:F11)),
 row_cnt, ROWS(uniq),
 labels, MAKEARRAY(row_cnt,1,LAMBDA(row,col,"合計")),
 uniq_tbl,{uniq,sums,sums2, labels},
 {SORT(uniq_tbl,3,FALSE ),SEQUENCE(row_cnt,1,10,10)})
ユニーク化
2. 元のテーブルとユニークテーブルをまとめてソートする

元のテーブルとユニークテーブルを合体する。{}

ユニークテーブルに対しては品名がISBLANKのものは無視する。(FILTER関数)

元のテーブルに対してはVLOOKUPでユニークテーブルから順位を取得する。

順位と名前でソートする。

=LET(arr, {D4:G11,ARRAYFORMULA(VLOOKUP(D4:D11,I4:M11,5,FALSE)+$B$3);I4:M11}, 
sorted,SORT(FILTER(arr,INDEX(arr,0,1)<>""), 5, TRUE, 4,TRUE),sorted)
売上表まとめ

意外と簡単でしょう?

3. もう少し整形してみる

品名は合計のみに表示

ソート用の列を無くしておく

=LET(arr, {MAKEARRAY(ROWS(D4:D11),1,LAMBDA(row,col,"")),E4:G11,ARRAYFORMULA(VLOOKUP(D4:D11,I4:M11,5,FALSE)+$B$3);I4:M11},
 sorted,SORT(FILTER(arr,NOT(ISBLANK(INDEX(arr,0,1)))), 5, TRUE, 4,TRUE),
 cols, {1,2,3,4},
 res_2, CHOOSECOLS(sorted,cols),
res_2
)

おまけ(CHOOSECOLS関数)

ある範囲から、複数の列を抜き出したいときにCHOOSECOLS関数を使うと便利

{INDEX(TBL,0,1),INDEX(TBL,0,2)}みたいなことをしてました <- やめましょう

CHOOSECOLS(TBL,{1,2}) <- これでOK

LETでTBLを変数としていても、何回もINDEXを書くと読みづらい(2列ならまあいいですが、10列とかになるとしんどい)

OFFSET関数もありますが、OFFSET関数だと行数を指定するのが面倒

FILTERとかSORTも{1,2}みたいに渡せると楽だと思いました


参考までに違う書き方との比較

ARRAYFORMULAだとできない

MAPだとできる

どう見てもCHOOSECOLSが簡単です

まとめ

表のまとめを作成するためのコードとその実装結果を載せてみました。

実際の業務だとピボットテーブルとかにする方が多いのでしょうか?

コメント

タイトルとURLをコピーしました