2014年2月4日火曜日

Google スプレッドシートで「数式の繰り返し」を ARRAYFORMULA で置きかえる (1)

1. たくさんのセルで数式を呼び出すと、数式数制限が表示される

Google スプレッドシートで、カスタム関数を多くのセルで呼び出すとエラーが表示される。

これは Google スプレッドシートに制限が設けられているため。できるだけ回避するには、カスタム関数を「配列数式」に変更する必要がある。ただし、新しい Google スプレッドシートでは、この制約が緩和されている。

同じように、演算子・組み込み関数をたくさんのセルで呼び出すと、「数式数制限」の通知がされる。

このスプレッドシートは数式制限に達しました。

SnapCrab_No-0777

Google スプレッドシートのサイズと複雑さの制限 - ドライブ ヘルプ によると、

Google スプレッドシートには複雑さの制限もあります。セルが更新されるたびに、それを参照するセルも再計算されます。数式が複雑になりすぎたり、計算に時間がかかりすぎたりすると、計算中にタイムアウトになります。

スプレッドシートを複雑にする数式には次のものがあります。

  • VLOOKUP、QUERY、SUMIF、入力範囲セルが広範なその他の同様の数式。
  • NOW、RAND、OFFSET、INDIRECT など、スプレッドシートが変更されるたびに再計算される揮発性関数。揮発性関数を含むセルに依存する数式が多いと、編集するたびに再計算されるため、スプレッドシートの表示速度が低下することがあります。
  • IMPORTRANGE などのインポートを使った数式。定期的に計算されるので複雑さが増します。

 

2. 「数式の繰り返し」を「配列数式」に変更する

* 乗算を繰り返したときの限界

例えば、A 列に入力した値を B 列で 2 倍する計算について考える。

SnapCrab_No-0769

A1 のセルの値を 2 倍するには、B1 セルに

=A1 * 2

と入力する。A2 以降、繰り返し計算を行うには、「下方向へと式をコピー」する。

この場合、19,000 行までは、数式制限の通知はされなかった。

SnapCrab_No-0770

20,000 行では数式制限が通知された。

 

ARRAYFORMULA で「数式の繰り返し」を「配列数式」へ

上記のような、演算子や組込みの関数を用いた「数式の繰り返し」を、一つのセルに入力しただけで済ませるには、組み込み関数である

  • ARRAYFORMULA

を利用する。これにより、「値を返す演算子や組み込み関数」を「配列数式」の形にできる。

ARRAYFORMULA - Drive Help によると、

Enables the display of values returned from an array formula into multiple rows and/or columns and the use of non-array functions with arrays.

上例の「数式の繰り返し」と同じ結果を得るには、B1 セルに、以下のように入力する。

=ARRAYFORMULA(A:A * 2)

SnapCrab_No-0771

一見、ARRAYFORMULA の引数が分かりにくい。 (@_@;

A:A * 2

元の式は、以下の通り。

=A1 * 2

数式の繰り返しを ARRAYFORMULA で記述するには、

[セル] 演算子 値

という形を

[範囲] 演算子 値

にする。つまり、計算対象である単一のセルを「範囲」に変更する。

この式により、「A 列の各値に対して、2 倍する」計算が行われる。

「配列数式」を用いる場合、37,000 行まで、数式制限は表示されなかった。

SnapCrab_No-0778

38,000 行では数式制限が通知された。演算子を繰り返したときと比較すると、約 2 倍の数を計算できた。

カスタム関数を用いたときと同じように、「配列数式」で表現した方が計算の負担が少ないようだ。

 

3. 「新しい Google スプレッドシート」(2013/12 以降)では「数式の繰り返し」と「配列数式」が計算できる数に差がなさそう?

ただし、カスタム関数のときと同様に、2013/12 以降の「新しい Google スプレッドシート」では、この制約が緩和されている。

数式を繰り返しコピーしても、上記よりはるかにたくさんの計算を行うことができる。また、数式のコピーと ARRAYFORMULA を比較すると、計算できる量に違いがないように見える。

Google スプレッドシートのサイズと複雑さの制限 - ドライブ ヘルプ によると、

新バージョンでは、データが含まれているセルが 2 百万個までサポートされますが、サイズが非常に大きい、または複雑なスプレッドシートは動作が遅くなる可能性があります。

どちらの方法でも 1,000,000 セルまで計算できた。ただし、それ以上は動作が遅くなり、どこまで計算できるのか確認できなかった。