データ分析

Google Sheets ARRAYFORMULA(IF)完全ガイド【財務モデル】

ModelMonkey2026年7月13日読了約 2 分

構文はそのまま包むだけです:=ARRAYFORMULA(IF(logical_array, value_if_true, value_if_false))。各引数はデータの行数に応じて自動的に展開されます。この「自動展開」という1つの特性こそが、2シート以上のモデルを構築する前にしっかり理解すべき理由です。

ARRAYFORMULA(IF)の基本パターン

まず、空白行ガードから始めましょう。これを入れないと、ARRAYFORMULAはSheetの構成によっては50,000行目まで評価を実行し、列全体にラベルが敷き詰められます。そうなると、その列を参照するすべてのSUMIFS・COUNTIFS・ピボットテーブルが機能しなくなります。

=ARRAYFORMULA(
  IF('P&L'!B2:B="", "",
    IF('P&L'!B2:B="売上", 'P&L'!C2:C * Assumptions!$B$3, 0)
  )
)

外側のIFが空白行をガードし、内側のIFが実際のロジックを処理します。この2層構造が、財務モデルで書くほぼすべてのARRAYFORMULA(IF)の土台になります。

より実践的な例として、SKUレベルの貢献利益モデルを見てみましょう。粗利益率が取締役会承認の下限値38.5%を下回っている商品にフラグを立てる数式です:

=ARRAYFORMULA(
  IF('P&L'!A2:A="", "",
    IF(('P&L'!C2:C - 'P&L'!D2:D) / 'P&L'!C2:C < Assumptions!$B$7,
      "下限割れ", "OK"
    )
  )
)

Assumptions!$B$7 に38.5%の閾値を格納しています。「下限割れ」とフラグされたSKUは、取締役会向け資料のマージンブリッジ分析でCOUNTIFSに取り込まれます。参照はリアルタイムで維持されるため、Assumptionsシートで閾値を変更するとフラグが即座に更新されます。

多段階ネストを破綻させずに書く方法

Google SheetsのIFの最大ネスト数は64ですが(Google Sheets関数リファレンス参照)、可読性はそれよりずっと早い段階で崩壊します。インセンティブ報酬の段階設定、営業テリトリーの分類、ドローダウン区分など、階層構造が必要な場合はIF内にIFを積み重ねます:

=ARRAYFORMULA(
  IF('Sales'!C2:C="","",
    IF('Sales'!C2:C >= Assumptions!$B$3, "Tier 1",
      IF('Sales'!C2:C >= Assumptions!$B$4, "Tier 2",
        IF('Sales'!C2:C >= Assumptions!$B$5, "Tier 3",
          "最低基準未達"
        )
      )
    )
  )
)

ここでは $B$3=2,100万円、$B$4=850万円、$B$5=250万円をクォータ閾値としてAssumptionsシートに格納しています。CFOが数式に触れることなく閾値を調整できる設計です。

ネストIF・IFS・ルックアップテーブルの比較

多段階ロジックを実装する際、どの手法を選ぶべきか迷うことがあります。以下の比較表を参考にしてください。

手法ARRAYFORMULA対応可読性閾値の管理推奨用途
ネストIF✅ 対応△ 4段階以上で低下Assumptionsセル参照で可2〜4段階の分類
IFS❌ 非対応(2026年7月時点)◯ 条件がフラットに並ぶAssumptionsセル参照で可単一行評価のみ
SWITCH❌ 非対応(2026年7月時点)◯ 完全一致に強い数式内に直接記述単一行の完全一致分岐
VLOOKUP(完全一致)✅ 対応◎ テーブルで一覧管理参照テーブルで一元管理5段階以上の分類
INDEX(MATCH())✅ 対応◎ テーブルで一覧管理参照テーブルで一元管理双方向ルックアップ全般

IFSの方が構文はすっきりしますが(条件と結果をペアで並べる1つの関数)、2026年7月時点でARRAYFORMULA内での配列展開に対応していません(Google公式ヘルプコミュニティでも同様の制限が報告されています)。SWITCHも同様です。4段階を超える多層ロジックが必要な場合、現実的な選択肢はネストされたIFか、ARRAYFORMULA(VLOOKUP()) または ARRAYFORMULA(INDEX(MATCH())) を使った参照テーブルとのルックアップです。8段階以上ではルックアップアプローチの方がスケールしやすく、Assumptionsシートを唯一の真実のソースとして維持できます。

ARRAYFORMULA(IF)内のエラー処理

割り算・ルックアップ・テキスト解析は、分母がゼロ、参照対象が存在しない、ソースセルが空白といった状況でエラーを返します。ARRAYFORMULA内では、1行のエラーが列全体に視覚的に伝播します。エラーが発生しうる特定の処理をIFERRORで囲みましょう:

=ARRAYFORMULA(
  IF('P&L'!B2:B="", "",
    IFERROR(
      ('P&L'!C2:C - 'P&L'!D2:D) / 'P&L'!C2:C,
      0
    )
  )
)

位置が重要です。 IFERRORはARRAYFORMULAの内側に置いてください。ARRAYFORMULA全体をIFERRORで囲むと、すべてのエラーが0に変換されてしまいます。モデル構築中に検知したい数式ロジックのバグも例外ではありません。エラーが発生しうる特定の処理だけを囲むのが正しいアプローチです。

粗利益率の計算では、製品ローンチ前の月に売上高が0円になるケースがゼロ除算エラーの典型的な発生源です。IFERROR(expr, 0) でクリーンに処理できますが、「粗利益率0%」と「データなし」が意味的に異なるかどうかを考慮してください。SKU数200・36ヶ月のモデルでは、その差が移動平均やコーホート分析に影響します。

ARRAYFORMULA(IF)でできないこと

ARRAYFORMULAの内側では、動くはずと思っていても動かないものがいくつかあります:

IFSとSWITCH は配列展開に対応していません。数式は最初の行だけを評価し、列ではなくスカラー値を返します。

近似一致のVLOOKUP(range_lookup = TRUE)は配列コンテキストで予期しない動作をします。INDEX(MATCH())か完全一致のVLOOKUPを使用してください。

1つのIF分岐から複数列への出力 - ARRAYFORMULAは1数式につき1列を返します。条件ロジックで売上・売上原価・粗利益の各列を個別に埋める必要がある場合は、3つの数式が必要です。

IF分岐内の揮発性関数 - RAND()・NOW()・TODAY()をARRAYFORMULA内で使用すると、シートの変更のたびに再計算が走ります。配列数式に紐づくセルが7,200個あるモデルでは、体感できるほどの遅延が生じます。

大規模モデルでのパフォーマンス対策

36ヶ月の損益モデル×SKU200品番では、数式列ごとに約7,200セルが発生します。単体では問題ありません。再計算が遅くなるのは、複数のARRAYFORMULA出力を連鎖させたとき--数式Aが数式Bを呼び出し、Bが数式Cを呼び出す構造です。連鎖した配列は再計算コストが乗算的に積み上がります。

実践的な対策は2つです:ヘルパー列で一度評価してからそれを下流で参照すること、そして月次締め後に変更不要となった過去期間は「形式を選択して貼り付け → 値のみ」で数式を固定することです。年度(4月始まり)で運用している企業では、第1四半期(4〜6月)終了後に過去月を値固定するだけで再計算範囲を大幅に削減できます。

ARRAYFORMULA(IF)の試行サイクル--書く、空白行への波及を確認する、エラーをデバッグする、ロジックを調整する、繰り返す--は、四半期中盤の貴重な時間を着実に消費します。ModelMonkeyのプランを選ぶ。Google SheetsとExcelの両方に対応しています。

よくある質問

Q. ARRAYFORMULA(IF)とIF単体は何が違いますか?

通常のIF関数は1つのセルにしか結果を返しません。ARRAYFORMULA(IF)は指定した範囲の行すべてに同じロジックを適用し、複数の結果を一度に返します。数式を下にコピーしなくて済むため、行追加時の参照ズレや数式の抜け漏れが発生しません。

Q. IFSをARRAYFORMULAで使えないのはなぜですか?

2026年7月時点でGoogleが公式に対応を表明していないためです。IFSはARRAYFORMULA内で配列として展開されず、最初の行の値のみをスカラーで返します。多段階分類にはネストIFか、ルックアップテーブルを使ったVLOOKUP/INDEX(MATCH())を使用してください。

Q. 数式がエラーになって列全体に#DIV/0!が広がってしまいました。どうすればいいですか?

IFERRORをARRAYFORMULAの内側・エラーが発生する計算の直外側に配置してください。=ARRAYFORMULA(IFERROR(expr, 0)) ではなく =ARRAYFORMULA(IF(A2:A="","",IFERROR(expr, 0))) の形が正しいパターンです。ARRAYFORMULA全体をIFERRORで囲むと、ロジックバグも含めてすべてのエラーが握り潰されます。

Q. ネストIFが4段階を超えると読みにくくなります。代替手段はありますか?

Assumptionsシートに閾値テーブルを作成し、ARRAYFORMULA(VLOOKUP()) または ARRAYFORMULA(INDEX(MATCH())) で参照する方法が最もスケールします。閾値の追加・変更が数式を触らずにテーブル編集だけで完結するため、CFOや事業部長が直接メンテナンスできる設計になります。

Q. ARRAYFORMULA(IF)で複数列に同時に値を返せますか?

できません。ARRAYFORMULAは1数式につき1列(または1行)の結果しか返しません。売上・売上原価・粗利益をそれぞれARRAYFORMULA(IF)で埋めたい場合は、3つの独立した数式が必要です。

Q. 大規模モデルで再計算が重くなってきました。どうすれば改善できますか?

連鎖するARRAYFORMULA依存関係(A→B→Cの順に参照する構造)を最小限に抑えてください。ヘルパー列で中間値を一度評価してから参照する設計が効果的です。また、月次・四半期締め後に変更不要な過去期間は「形式を選択して貼り付け → 値のみ」で数式を固定すると、再計算対象セルを大幅に削減できます。

まとめ

ARRAYFORMULA(IF) はGoogle Sheetsで列スケールの条件ロジックを実装するための中核パターンです。必ず外側のIFで空白行をガードし、IFERRORは配列全体ではなくエラーが発生しうる処理だけに適用し、IFSとSWITCHは配列展開に非対応のため多段階ロジックにはネストIFを使用してください。大規模モデルでは連鎖するARRAYFORMULA依存関係を最小限に抑え、締め済み期間は値で固定して再計算を高速に保ちましょう。

条件ロジック以外のARRAYFORMULAの活用方法については、Google Sheets ARRAYFORMULAガイド:財務モデルでの実践的な使い方をご覧ください。