スプレッドシートの便利な関数ARRAYFOMULA関数。arrayformula関数とSUM関数を使って、複数列の1行ずつの合計を計算したい場合があると思いますが、それはどうやるのでしょうか?
この記事では、SUM関数と、SUM関数ではできないやりたいことの代替案をご紹介します。
ARRAYFOMULA(配列数式) | |
---|---|
配列数式 | 配列を扱った数式を入れます。 |
使用例 | ARRAYFOMULA( IF( A:A=TRUE, TRUE, FALSE)) |
arrayformula関数内でのSUM関数は上手く機能しない
arrayformula関数内でSUM関数を使う場合、次のような表記になります。
=ARRAYFOMULA(SUM(範囲))
「PV(午前)」「PV(午後)」の行ごとの合計が欲しい時に、つい次のような関数を創ってしまいます。しかし、次の関数では、SUM関数内の行列をすべて合算してしまうので、思ったように出力されません。
=ARRAYFORMULA(SUM(D2:E13))
arrayformula関数内でSUM関数でやりたいことをMMULT関数を使って実現する
SUM関数では、やりたいことが実現できないことがわかりました。ただ、もう少し複雑なやりかたで、複数列を行別で合計にする方法があります。それには次のような関数の型を使います。
=MMULT(範囲,TRANSPOSE(ARRAYFORMULA(範囲の1行目^0)))
そして上記を例えば下記の数式にすると、次の画像のような結果が返ってきます。
=MMULT(D2:E13,TRANSPOSE(ARRAYFORMULA(D2:E2^0)))
解説:ARRAYFORMULA(D2:E2^0)
「^0」はべき乗の中のゼロ乗と言って、「ゼロ乗するとすべての数値が1になる」という数値の性質があります。これを利用することで、「1行2列かつ値が1なだけの行列」を得ることができます。
解説:TRANSPOSE(ARRAYFORMULA(D2:E2^0))
「1行2列かつ値が1なだけの行列」を転置するので、「2行1列かつ値が1なだけの行列」になります。
解説:MMULT(D2:E13,TRANSPOSE(ARRAYFORMULA(D2:E2^0)))
MMULT関数はMMULT(行列1, 行列2)という表記で、2つの行列の行列積を計算します。つまり上記の式は、D2:E13の行列と、「2行1列かつ値が1なだけの行列」の行列積です。
arrayformula関数内でSUM関数でやりたいことをSUMIF関数を使って実現する
「MMULT関数」は少し使うのに難易度が高いように感じます。調べたところ、SUMIF関数を上手に利用すると、MMULT関数を使ったときと同じ結果が得られるようです。ただし、筆者自身もなぜこれで結果が返ってくるのかがわかっていません。
=ARRAYFORMULA(SUMIF(IF(COLUMN(1行目範囲),ROW(1列目範囲)),ROW(1列目範囲),範囲))
実際に結果が得られる例を紹介します。
この関数の組み合わせの意味がわかる方はぜひご連絡ください。
行列が分からなくても、とりあえず型を使おう
数学を勉強していない方にとっては、上記の説明が何を言っているか伝わりづらかったと思います。ただ、業務上においてはとりあえず次の型を使えば、計算はできるので、参考にして下さい。
=MMULT(範囲,TRANSPOSE(ARRAYFORMULA(範囲の1行目^0)))
Google検索の変遷から見えてくる「Googleがキュレーション化する日」
[/su_note]