スプレッドシートの使い方

【スプレッドシート】arrayformula関数内でのSUM関数の使い方

スプレッドシートの便利な関数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を単純に使った結果

arrayformula関数内でSUM関数でやりたいことをMMULT関数を使って実現する

SUM関数では、やりたいことが実現できないことがわかりました。ただ、もう少し複雑なやりかたで、複数列を行別で合計にする方法があります。それには次のような関数の型を使います。

=MMULT(範囲,TRANSPOSE(ARRAYFORMULA(範囲の1行目^0)))

そして上記を例えば下記の数式にすると、次の画像のような結果が返ってきます。

=MMULT(D2:E13,TRANSPOSE(ARRAYFORMULA(D2:E2^0)))

arrayformula関数内でSUM関数でやりたいことをMMULT関数を使って実現する

解説: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列目範囲),範囲))

実際に結果が得られる例を紹介します。

sumif関数で実現するarrayformula内sum

この関数の組み合わせの意味がわかる方はぜひご連絡ください。

行列が分からなくても、とりあえず型を使おう

数学を勉強していない方にとっては、上記の説明が何を言っているか伝わりづらかったと思います。ただ、業務上においてはとりあえず次の型を使えば、計算はできるので、参考にして下さい。

=MMULT(範囲,TRANSPOSE(ARRAYFORMULA(範囲の1行目^0)))