いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)1つの式だけで複数の行のそれぞれの合計を求める

 Googleスプレッドシートで、複数の行のそれぞれの合計を求める際に、1つのセルへの入力だけで済ませる方法についてです。
 ARRAYFORMULA関数とSUM関数の組み合わせではうまくいかないので別の方法を考える必要があります。

  • SUMIF関数を用いる方法とMMULT関数を用いる方法が有力です。ただしどちらもなかなか複雑です。
  • 単純にARRAYFORMULA関数と足し算による方法もありますが列が増えると不利になります。

手順

SUMIF関数を用いる方法

f:id:accs2014:20200116012508p:plain:right:w600

 画像は結果です。「合計」の列に表示されている6つの数字(各行の合計)はG3セルに入力されている1つの式で算出されています。

 式は次のとおりです。

=ARRAYFORMULA(SUMIF(ROW(C3:F8)+C3:F8*0,ROW(C3:F8),C3:F8))

 SUMIFとARRAYFORMULAを組み合わせればSUMIFの第2引数(条件)に配列(行列)を渡すことができるので、結果も配列(行列)として得られます。これを利用して第2引数を「ROW(C3:F8)」とし、それぞれの行の合計を得るというわけです。
 なぜ第1引数が「ROW(C3:F8)」ではなく「ROW(C3:F8)+C3:F8*0」なのかですが、ARRAYFORMULAとROWを組み合わせたときROWの引数が横に何列あっても縦1列の結果しか返らないため、結果的に横に集計することができないためです。つまりここで第1引数を「ROW(C3:F8)」とすると国語の点数しか求められません。そこで一見無駄な「+C3:F8*0」を加え、第1引数がカバーする範囲をC~F列の4列に広げています。
 なお、4つある参照範囲は「C3:F8」で統一していますが2つ目以外は「C3:C8」にしても同じ結果になるなど、結構融通が利くというか適当です。将来的に仕様変更で結果が変わることは考えにくいものの、どうも危うい感じがぬぐえません。いずれ「C3:F8」が無難だろうという判断でこうしています。

MMULT関数を用いる方法

f:id:accs2014:20200116012512p:plain:right:w600

 こちらもいきなり結果です。「合計」の列に表示されている6つの数字(各行の合計)はG3セルに入力されている1つの式で算出されています。

 式は次のとおりです。

=MMULT(ARRAYFORMULA(N(C3:F8)),SEQUENCE(COLUMNS(C3:F8),1,1,0))

 SEQUENCE関数を使い、成分がすべて1である4行(集計範囲の列数と同じ)の配列を生成しています。あとはMMULT関数で集計範囲との行列積を求めれば各行の合計が求まるというわけです。行列積ですので引数の順を間違えるとうまくいきません。
 非常に合理的で、SUMIFの例のようなルーズさがないのがメリットですけども一般的な表計算ソフト利用者の感覚ではちょっとなじみにくいかもしれません。
 また、NとARRAYFORMULAはなくても機能しますが空白や文字列が混入したときにエラーになります。

ARRAYFORMULA関数と足し算による方法

 結果は明らかなので画像は省略しますが、上記の例ではシンプルに次の式でも同じ結果が得られます。

=ARRAYFORMULA(C3:C8+D3:D8+E3:E8+F3:F8)

 集計範囲が何十列もあると入力が面倒ですが、他の方法の難易度と、列の追加・削除の頻度を考慮すると(残念ながら)これが最も無難という気がします。