なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

数式/関数:MMULTを使わずに複数条件で集計する

複数条件の配列計算に 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)*数値の配列」で計算しているから、理解はしやすいはず。