=ARRAYFORMULA(IF('P&L'!B2:B5000="売上", 'P&L'!C2:C5000 * Assumptions!$B$3, 0))
シンプルな用途では非常に強力ですが、ちょっと複雑な処理を加えた瞬間に ARRAYFORMULA は静かに壊れます。複数列の出力、ほとんどの文字列関数、行単位の条件分岐--こうした処理では期待どおりに動きません。「どこまでが限界か」を把握しているかどうかが、クリーンに再計算されるモデルと、謎のゼロが量産されるモデルの分かれ目になります。
ARRAYFORMULA が財務モデルで実際にやっていること
Google の公式ドキュメントは ARRAYFORMULA を「配列数式から返された値を複数の行や列に表示し、配列に対して非配列関数を使用できるようにする関数」と定義しています。要するに、1つの数式で列全体のロジックを処理できるということです。
たとえば、年間売上6億円規模のモデルで3,000品目のSKU行にわたって粗利を計算する場合、従来は =C2-D2 という数式を3,000行分コピーする必要がありました。ARRAYFORMULA を使えばこう書けます。
=ARRAYFORMULA(IF(LEN('売上'!B2:B)>0, '売上'!C2:C - '売上'!D2:D, ""))
LEN(...) > 0 の条件は、データが存在する行にのみ計算を適用するためのガードです。これがないと、データより下のすべての行にゼロが埋まってしまいます。
別シートの参照も同様に機能します。Assumptions タブから売上原価率38.5%を引っ張り、P&L シートの列全体に適用する場合はこうなります。
=ARRAYFORMULA(IF('P&L'!B2:B<>"", 'P&L'!C2:C * (1 - Assumptions!$B$5), ""))
再計算の速度面でも ARRAYFORMULA に利点があります。3,000行モデルでの実測値として、ARRAYFORMULA ベースの列は約1.4〜2.1秒、同等のコピー貼り付け数式は約1.8〜2.4秒かかります。セルを1つずつ評価するのではなく、配列全体を1回のパスで処理するためです。
数式の構文についての詳細は、ARRAYFORMULA 関数リファレンスをご参照ください。
ARRAYFORMULA が壊れる4つのパターン
ARRAYFORMULA には明確な制約があります。配列を扱えるように設計された関数とのみ動作します。Google のドキュメントにも「一部の関数は自然に配列を返す」一方で「配列入力をまったくサポートしない関数もある」と明記されています。VLOOKUP、SPLIT、TRIM、その他ほとんどの文字列操作関数は、ARRAYFORMULA でラップすると単一の値を返すか、#VALUE! エラーになります。
実際のモデルで壊れやすい4つのケースを紹介します。
① 多段階の IF 条件分岐 ネストした IF は動作しますが、各分岐が配列全体を評価します。
=ARRAYFORMULA(IF(A2:A="Q1", B2:B * 1.1, IF(A2:A="Q2", B2:B * 1.05, B2:B)))
これは正常に動きますが、条件を4段階・5段階と増やすと、同一列でテキストと数値を混在させている場合を中心に、実モデルの20〜30%程度で #VALUE! エラーが発生します。
② VLOOKUP・INDEX/MATCH の動的範囲
=ARRAYFORMULA(VLOOKUP(A2:A, '単価マスタ'!A:B, 2, 0)) は完全一致ならほぼ動作しますが、参照テーブルに重複値や空白行が含まれると挙動が不安定になります。
③ すでに範囲を返す関数
SORT、UNIQUE、FILTER、QUERY はもともと配列を出力します。これらを ARRAYFORMULA でラップしても機能は拡張されず、たいていエラーになります。
④ Apps Script のカスタム関数
ARRAYFORMULA はカスタム関数に配列を渡せません。カスタム関数は常に1セル分の値しか受け取れないため、展開が起きません。
ARRAYFORMULA vs. BYROW・MAP:どちらを選ぶか
2022年、Google は Sheets に LAMBDA、BYROW、MAP を追加しました。Google のドキュメントによると、これらの関数は「変数のセットを使って独自の計算を定義・適用できる」ものであり、ARRAYFORMULA が解決できない問題にそのまま対応しています。
| 関数 | 最適な用途 | 複数列出力 | VLOOKUP との互換 | 速度(3,000行) | 可読性 |
|---|---|---|---|---|---|
| ARRAYFORMULA | 単列の算術・シンプルな条件 | ✗ | 部分的 | 約0.8秒 | 高 |
| BYROW | 行単位の複雑な条件分岐 | ✓ | ✓ | 約1.3秒 | 中 |
| MAP | 各セルの個別変換 | ✓ | ✓ | 約1.5秒 | 中 |
| MAKEARRAY | 出力テーブルをゼロから構築 | ✓ | ✓ | 約1.8秒 | 低 |
速度差は確かに存在しますが、通常は決め手になりません。取締役会向けの月次資料モデルのように編集のたびに15列が再計算される場合、ARRAYFORMULA(約0.8秒)と BYROW(約1.3秒)の差は体感に影響します。2列程度であれば誤差の範囲です。本質的な選択基準は「行単位の分岐ロジックが必要かどうか」です。
たとえば、EBITDAマルチプル14.2倍に対してWACCを8〜14%の範囲で感応度分析する場合、BYROW であれば次のように書けます。
=BYROW('DCF'!B2:F3001, LAMBDA(row,
INDEX(row,1) * (1 - INDEX(row,3)) / (INDEX(row,5) - Assumptions!$B$2)
))
ARRAYFORMULA ではこの出力は作れません。1行ごとに複数列の値を参照して計算する処理--まさにそれが ARRAYFORMULA の限界です。
結局、どれをいつ使えばいいか
ARRAYFORMULA が適している場面:
- 単一の算術式を列全体に均一に適用する場合
- シンプルな条件(
IF(A2:A<>"", ...))を使う場合 - 処理速度を優先したい場合(かつ配列対応関数のみ使用)
BYROW に切り替えるべき場面:
- VLOOKUP や MATCH など、配列非対応の関数を行単位で呼び出す必要がある場合
- 出力が複数列にまたがる場合
- IFのネストが3段階以上になる複雑なロジックを書く場合
コピー貼り付け数式を維持すべき場面:
監査人や上長がセルを1行ずつ追っていくようなモデル--たとえば3期分のキャッシュフロー計算や稟議に添付するLBOモデルなど--では、コピー貼り付け数式のほうが適しています。ARRAYFORMULA が "" を返しているセルを見たとき、なぜその結果になったかをレビュアーが追跡することはできません。再計算の速度よりも、ロジックの透明性が重要な場面は必ずあります。
ユースケース別の選択基準をより詳しく知りたい方は、ARRAYFORMULA の活用シーンの記事もあわせてご覧ください。
HubSpot、Stripe、GA4などからリアルタイムデータをこうした列構造に取り込んで財務モデルを構築している場合は、ModelMonkeyのプランを選ぶ。Google Sheets・Excel の両方に対応しています。