いきなり答える備忘録

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

(Gスプレッドシート)ARRAYFORMULA関数の効果とメリット

 Googleスプレッドシートで重用されるARRAYFORMULA関数の効果とそのメリットについて、実例を見ながら紹介します。

  • ARRAYFORMULA関数を使う主なメリットとして、式のメンテナンスが容易になること、絶対参照を使わずに済ませられること、演算速度が向上することが挙げられます。

手順

ARRAYFORMULA関数の基本的な効果

f:id:accs2014:20200930122553p:plain:right:w500

 まずはARRAYFORMULA関数の効果の確認です。
 画像ではC列に商品の単価が、D列に数量が記録されています。
 そこでE3セルに「=C3*D3」と入力することで、1つの商品(牛乳)の金額(単価×数量)を計算しています。
 この式を1行下のセルにコピーすれば「=C4*D4」という式になり、マスクの金額を求めることができます。同様に下方にコピーすれば参照するセルが自動的に変更され、それぞれの商品の金額を求めることができます。

 

f:id:accs2014:20200930122556p:plain:right:w500

 しかしARRAYFORMULA関数を使ってE3セルに次のように入力すれば、1つの式だけですべての行の金額を一挙に計算して表示することができます。

 E3セル

=ARRAYFORMULA(C3:C8*D3:D8)

 ARRAYFORMULA関数を使うことで、式中の個々の値の代わりに配列を用いることができます。
 よってこの式により「=C3*D3」「=C4*D4」…「=C8*D8」の式を一度に実行した結果が得られ、その結果はそれぞれ別のセルに返されます。
 これがARRAYFORMULA関数の効果です。
 

f:id:accs2014:20200930122601p:plain:right:w500

 ARRAYFORMULA関数は四則演算だけでなく、他の関数と組み合わせることでも効果を発揮します。
 画像ではD3セルにIF関数を使った式を入力し、C3セルの数値が160以上なら「合格」、160未満なら「不合格」という文字列を表示させています。
 これも式を下方にコピーすることで各行の数値を判定することができるのですが……

 

f:id:accs2014:20200930122605p:plain:right:w500

 ARRAYFORMULA関数を使えば一発です。
 D3セルに次のような式を入力することで、すべての行の判定結果を一挙に得ることができました。

 D3セル

=ARRAYFORMULA(IF(C3:C8>=160,"合格","不合格"))

 IF関数の第1引数(条件)が「C3:C8>=160」という、配列を使った式になっています。ARRAYFORMULA関数の内部にIF関数を置くことでこのように配列を使った引数を用いることができ、C3~C8の各セルの判定を一挙に行うことができます。

ARRAYFORMULA関数のメリット

式のメンテナンスが容易になる

 上記のようにARRAYFORMULA関数を用いることで、多数の結果を容易に得ることができます。ただし式そのものは長くなるので、式をコピーするのに比べて入力そのものは早くはならないかもしれません。
 しかし重要なのは式が1つだけで済むという点です。式のコピーでも数百行とか数千行にわたって多数の結果を得ることができますが、式の内容を変更するときに一部のセルが変更されないまま残ってしまう可能性があります。また、一部のセルが誤って(または意図的に)上書きされてしまっても発見するのは容易ではありません。一方でARRAYFORMULA関数を使って一つの式にまとめてしまえば、1つのセルを見るだけですべての結果に誤りがないことを確認できますし、更新も1つのセルを書き換えるだけで済みます。

絶対参照を使わずに済む

f:id:accs2014:20200930122611p:plain:right:w500

 ここでは初心者泣かせの、かつ慣れてもなかなか面倒な機能である絶対参照について確認します。

 画像ではC列に各企業の売上が記録されており、C9セルにはそれらの合計が記録されています。
 これに対しD3セルに「=C3/C9」と入力し、C3セルの売上が合計に占める割合(シェア)を求めています(セルの表示形式は「パーセント」にしてあります)。

f:id:accs2014:20200930122614p:plain:right:w500

 さて、この式を下方にコピーするとD4セル以降すべてエラーになってしまいます。

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

 理由は簡単で、式をコピーしたときに分母として参照するセルがずれていってしまうためです。
 分母は常にC9セルを参照する必要がありますが、式をコピーした際に参照先を適宜変更してくれるという便利機能がここではアダになるというわけです。

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

 そこで式をコピーする前に、D3セルの式を「=C3/C$9」としておきます。

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

 これにより式をコピーしても分母の参照先がずれることはなくなり、意図した結果が得られます。これが絶対参照の効果です。

 

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

 前置きが長くなりましたが、そもそもARRAYFORMULA関数を使ってD3セルに次のような式を入力すれば絶対参照に頼る必要はありません。
 式が1つで済む以上、コピーに伴う参照ズレは起こらないからです。

 D3セル

=ARRAYFORMULA(C3:C9/C9)

 この式により「=C3/C9」「=C4/C9」…「=C9/C9」の結果が一挙に得られています。
 

f:id:accs2014:20200930122639p:plain:right:w500

 もちろん関数と組み合わせたときでも同様です。
 画像ではARRAYFORMULA関数とRANK関数を組み合わせて、C3~C8セルに記録された点数に対して一括して順位を付けています。
 RANK関数だけでやろうとするとC3セルに「=RANK(C3,C$3:C$8)」と入力して下方にコピーするところですが、ここでも絶対参照の設定が不要になっています。

 D3セル

=ARRAYFORMULA(RANK(C3:C8,C3:C8))

 ARRAYFORMULA関数を併用することで第1引数(順位をつける値)に配列を与えられます。
 第2引数(全体データ)はもともと配列を与えることができる部分なので、ここにはARRAYFORMULA関数の効果は直接及んでいません。
 結果的に第1引数と第2引数が全く同じ「C3:C8」という、一見奇妙な感じの式になります。

 式の目新しさに慣れないと絶対参照とどちらがわかりやすいか…と考えてしまうかもしれませんが、メンテナンス性のメリットと併せて考えるとやはりARRAYFORMULAの活用を第一に考えるべきかと思います。Excelでも引数として配列を利用できるようになっており、表計算ソフトの学習の上で絶対参照の必要性はかなり薄れていると考えられます(ただし全く不要になったわけではありません)。

演算速度が向上する

 ARRAYFORMULA関数を使えば、多数の式を並べるよりも演算が早くなります。
 上記例のような小さなサンプルでは体感できませんが、計算が複雑・大規模になるほどこの点に留意する必要があります。

注意点

 FILTER関数やSEQUENCE関数のように、ARRAYFORMULA関数を併用しなくても複数のセルに結果を返すことができる関数があります。
 一方で、併用することで効果が出るように思えても実際には何も起きない関数もあります。特にINDEX関数が有名ですが、これについては一応の対応策もあります。参考まで。

www.officeisyours.com