複数条件の配列計算に MMULTを使う人は時々いるかと思います(います……よね?)。使った方がすっきりすることも多いんですが、知らない人が見たらチンプンカンプンな式になること請け合いなので、避けたほうがいいかもしれません。
こういう表で、「区分」と「補助区分」を使って数量計を出したい時、普通にやると数量計の数式をオートフィルコピーしないといけなくなります。
E2:=SORT(UNIQUE(テーブル1[[区分]:[補助区分]]),{1,2},{1,1}) G2:=SUMIFS(テーブル1[数量],テーブル1[区分],E2,テーブル1[補助区分],F2) G2を下方向にオートフィルでコピー
これはちょっと不細工なのでやめたいところです。ではどうするかというと、BYROWと MMULTを組み合せます。
=LET(
_rng,テーブル1b,
_col1,SORT(UNIQUE(TAKE(_rng,,2)),{1,2},{1,1}),
_col2,BYROW(_col1,LAMBDA(a,SUM((
MMULT(N(TAKE(_rng,,2)=a),SEQUENCE(2,,,0))=2)*DROP(_rng,,2)))),
VSTACK({"区分","補助区分","数量"},HSTACK(_col1,_col2))
)
昔からある方法なので、これでいいといえばいいんですが、ぱっと見てだけでは何をやっているのかが分かりにくくなります。特に SEQUENCE関数のところですが。
これを避けるには、BYROWの中に BYROWを入れ込んでしまえばいいです。
=LET(
_rng,テーブル1b,
_col1,SORT(UNIQUE(TAKE(_rng,,2)),{1,2},{1,1}),
_col2,BYROW(_col1,LAMBDA(a,SUM(FILTER(DROP(_rng,,2),
BYROW(TAKE(_rng,,2),LAMBDA(b,AND(b=a))))))),
VSTACK({"区分","補助区分","数量"},HSTACK(_col1,_col2))
)
いや、いいたいことは分かりますよ。あんまり変わらないっていうんでしょ? でも計算自体は限りなく単純になっています。「AND(b=a)」ですから。
他にも SCAN関数を使う方法もあります。長くはなりますがおなじみの配列計算にできます。
=LET(
_rng,テーブル1b,
_col1,SORT(UNIQUE(TAKE(_rng,,2)),{1,2},{1,1}),
_col2,MAP(SEQUENCE(ROWS(_col1)),LAMBDA(a,SUM(
(INDEX(_rng,,1)=INDEX(_col1,a,1))*(INDEX(_rng,,2)=INDEX(_col1,a,2))
*INDEX(_rng,,3)))),
VSTACK({"区分","補助区分","数量"},HSTACK(_col1,_col2))
)
「(配列の論理式A)*(配列の論理式B)*数値の配列」で計算していますので、論理演算が分かるなら、こっちのほうが理解しやすいかもしれません。