サイトアイコン 壁の道の向こう側

IF関数を使わない財務モデリング:MIN・MAX・フラグでモデルを壊れにくくする

他人が作った財務モデルを開いたら、IF関数の中にIF関数が入り、さらにその中にIFが……と5段重ねのネスト(関数の中に関数を入れ込む「入れ子」の構造)が現れて頭を抱えた。財務モデリングを学ぶ人なら、遅かれ早かれ出会う光景です。動いてはいるけれど、どの条件で何が起きるのか誰にも説明できない数式は、モデルの信頼性をじわじわと蝕みます。

実は、財務モデルで登場する条件分岐の大半は、IF関数を使わずに書けます。本記事では、海外の実務標準でも推奨されているMIN・MAX関数とフラグ(1/0)への置き換えパターンを、リボルバー(当座借越枠)の計算例つきで解説します。読み終える頃には、ネストIFの大部分が「不要だった」と分かるはずです。

なぜIF関数を減らすのか

IF関数そのものが悪いわけではありません。問題は、IFが条件分岐を「文章」としてセルに埋め込んでしまうことにあります。具体的には3つの弊害があります。

モデル設計の国際的な業界規約であるFAST Standard(読みやすく監査しやすいモデルの設計原則を定めた規格)も、ネストしたIFを避けてフラグやMIN・MAXで論理を表現することを推奨しています。世界の実務が同じ結論に達しているのは、ネストIFによる事故をみな経験してきたからです。当ブログの財務モデリングのベストプラクティス10選でも触れた「シンプルさは正義」という原則の、最も具体的な実践がIF削減だと言えます。

置き換えパターン①:MIN・MAXで「上限・下限」を表現する

財務モデルの条件分岐の多くは、よく見ると「ある値に上限または下限を付けたい」だけです。この場合、IFではなくMIN・MAXが最適です。

債務の任意返済はMINで書く

「余剰キャッシュで債務を繰上返済する。ただし債務残高より多くは返せない」というロジックを考えます。IFで書くと次のようになりがちです。

IF版 :=IF(余剰キャッシュ > 期首債務残高, 期首債務残高, IF(余剰キャッシュ > 0, 余剰キャッシュ, 0))
MIN版:=MIN(余剰キャッシュ, 期首債務残高)

たとえば余剰キャッシュ40・債務残高25なら、MIN(40, 25) = 25で残高全額を返済。余剰が10なら、MIN(10, 25) = 10だけ返済。返済額は「余剰キャッシュ」と「残高」の小さいほう、という意図が一目で伝わります。これがキャッシュスイープの基本形でもあります。

リボルバーの借入はMAXで書く

リボルバー(revolver、必要なときに借りて余裕があるとき返す当座借越枠)の借入額は、「資金が足りないときだけ、足りない分を借りる」というロジックです。

リボルバー借入 = MAX(0, 最低必要現金 −(期首現金 + 当期キャッシュフロー))

カッコ内がプラス(=資金不足)のときはその金額を借り、マイナス(=資金は足りている)のときはMAXの働きで0になります。「不足額か、0か」をIFで分岐させる必要はありません。MAX(0, …)は「マイナスを許さない下限(フロア)」、MIN(0, …)は「プラスを許さない上限(キャップ)」と覚えると、応用が一気に効くようになります。

置き換えパターン②:フラグ(1/0)で期間を制御する

「2027年から2030年の間だけ売上が発生する」「建設期間中だけ金利を資産計上する」のような期間条件も、IFの定番の使われ方です。これはフラグで置き換えます。フラグとは、条件を満たす期に1、満たさない期に0を立てる行のことです。

運転フラグ =(当期の年 >= 運転開始年)*(当期の年 <= 運転終了年)

売上高 = 単価 × 数量 × 運転フラグ

Excelでは「年 >= 開始年」のような比較式はTRUE/FALSEを返し、掛け算するとTRUEは1、FALSEは0として扱われます。2つの条件の掛け算は「両方を満たすときだけ1」、すなわち論理積(AND)です。期間内なら売上がそのまま、期間外なら0が掛かって消える、という動きになります。

フラグの真価は、モデル上部の「タイムライン」セクションにフラグ行を集約できることにあります。建設フラグ、運転フラグ、税優遇フラグ……と並べておけば、期間ロジックがモデルの1か所に可視化され、個々の数式は「× フラグ」を掛けるだけになります。期間の前提が変わってもフラグ行を直すだけで全体に反映され、IFを1つずつ修正して回る作業から解放されます。

なお、フラグは1か0かの二択に限りません。たとえば買収のクローズ(取引の完了)が年度の途中に来ると、初年度は3か月分だけ、といった部分期間が生まれます。このときはフラグを0.25のような按分係数(0〜1の連続値)にして、売上や利息など期間に比例する項目に掛ければ、部分期間もIFなしで表現できます。「初年度だけIFで特別扱い」という壊れやすい構造を、係数1つで回避できるわけです。

置き換えパターン③:ブール代数とSUMPRODUCT

フラグの考え方を一般化すると、条件の組み合わせも掛け算と足し算で書けます。これをブール代数(真偽値の計算)と呼びます。

表現したい論理IFを使った書き方ブール代数での書き方
AかつB(AND)=IF(AND(A, B), 値, 0)=値 × A × B
AまたはB(OR)=IF(OR(A, B), 値, 0)=値 × MAX(A, B)
条件付き合計IFの列を作ってSUM=SUMPRODUCT(条件範囲 × 値範囲)

SUMPRODUCTは「複数の範囲を掛け合わせて合計する」関数で、フラグ行と金額行を渡せば「条件を満たす期だけの合計」が中間列なしの1本の式で求められます。具体例で確認しましょう。6年分のフリーキャッシュフロー(FCF。事業が生み出す、自由に使える現金)の予測のうち、投資ファンドが2年目から5年目まで保有する期間の累計FCFを計算します。

年度1年目2年目3年目4年目5年目6年目
FCF(億円)303540455055
保有フラグ011110

累計FCF = SUMPRODUCT(保有フラグ行 × FCF行) = 35 + 40 + 45 + 50 = 170億円。保有期間の前提が「3〜6年目」に変わっても、フラグの1を立てる場所を動かすだけで、この式は一切触らずに正しい合計を返し続けます。「前提が変わっても数式は変わらない」——これがフラグ設計のゴールです。

ミニ演習:リボルバーをIFなしで2期分組む

ここまでのパターンを組み合わせて、リボルバーの2期分の動きをIFなしで再現してみましょう。前提は、最低必要現金10、リボルバー期首残高0、期1のキャッシュフロー(利息調整前の純増減)が−20、期2が+30です。使う式は次の2本だけです。

借入 = MAX(0, 最低現金 −(期首現金 + 当期CF))
返済 = MIN(MAX(0, 期首現金 + 当期CF − 最低現金), リボルバー期首残高)
項目期1期2
期首現金1510
当期キャッシュフロー−20+30
借入前の現金−540
リボルバー借入(MAX式)150
リボルバー返済(MIN式)015
リボルバー期末残高150
期末現金1025

期1は資金が−5まで落ち込むため、MAX(0, 10 −(15 − 20))= MAX(0, 15) = 15を借り入れ、期末現金はちょうど最低ラインの10に着地します。期2は資金に余裕があるので借入は0となり、返済はMIN(MAX(0, 10 + 30 − 10), 15) = MIN(30, 15) = 15で残高を完済。期末現金は10 + 30 − 15 = 25です。IFを1つも使わずに、「足りなければ借り、余れば枠の範囲で返す」というリボルバーの本質がそのまま数式になっていることを確認してください。

なお、実際のリボルバー契約には借入枠(コミットメント。貸し手が約束した融資の上限額)があります。実務では上の借入式をさらに MIN(不足額, 枠の残り) で包み、「不足額を借りる。ただし枠の残りまで」という二重の制約を表現します。枠いっぱいまで借りても資金が足りない期が出たら、それは「この事業計画は資金ショートする」という重要な警告です。期末現金 ≧ 最低現金を監視するチェックセルを併設して、見逃さない仕組みにしておきましょう。

ビフォーアフター:ネストIFを3行に分解する

総仕上げに、実務でよく見るネストIFを書き換えてみます。「純利益が黒字なら配当性向30%で配当する。ただし最低現金を割り込んでまでは払わない」という配当ロジックです。

ネストIF版(1行に凝縮)
=IF(純利益 > 0, IF(現金 > 最低現金, MIN(純利益 × 配当性向, 現金 − 最低現金), 0), 0)

分解版(3行に展開)
配当原資 = MAX(0, 現金 − 最低現金)
目標配当 = MAX(0, 純利益) × 配当性向
支払配当 = MIN(目標配当, 配当原資)

数値を入れて確認します。純利益80億円・配当性向30%なら目標配当は24億円。現金50億円・最低現金30億円なら配当原資は20億円。支払配当はMIN(24, 20) = 20億円となり、「払いたい額」より「払える額」が制約になったことが、行を見るだけで分かります。赤字の期は目標配当のMAXが0を返すため、自動的に無配です。

1行のネストIFと3行の分解版は、返す数値こそ同じですが、レビューにかかる時間と修正時の事故率がまったく違います。1行に詰め込んだ賢さより、3行に開いた読みやすさ。これが本記事で一貫してお伝えしたい設計思想です。なお、行を分ける書き方はベストプラクティス10選で扱った「1行1計算の原則」そのものでもあります。

新しい関数(IFS・SWITCH・LET)との付き合い方

比較的新しいExcelにはIFS・SWITCH・LETといった関数があり、「これを使えばネスト問題は解決では?」という質問をよく受けます。結論はこうです。IFSを使えば括弧の迷路は解消できますが、「分岐が多すぎる」という構造問題そのものは残ります。また、これらの新関数は古いバージョンのExcelで開くとエラーになるため、配布先の環境が読めない財務モデルでは避けるのが無難です。新関数は道具箱に加えつつ、第一選択は本記事のMIN・MAX・フラグ。この優先順位が、誰の環境でも開ける壊れにくいモデルへの近道です。

置き換え早見表:迷ったらここに戻る

ここまでのパターンを、実務で出会う頻度の高い順に対訳表へまとめます。IFを書きたくなったら、まず「やりたいこと」がこの表のどれに当てはまるかを確認してください。

やりたいことIFで書くと置き換え版
上限を付ける=IF(値 > 上限, 上限, 値)=MIN(値, 上限)
下限を付ける=IF(値 < 下限, 下限, 値)=MAX(値, 下限)
マイナスを許さない=IF(値 < 0, 0, 値)=MAX(0, 値)
不足分だけ補填する=IF(必要額 > 手元額, 必要額 − 手元額, 0)=MAX(0, 必要額 − 手元額)
残高の範囲で支払う=IF(支払額 > 残高, 残高, 支払額)=MIN(支払額, 残高)
期間内だけ計上する=IF(AND(年 >= 開始, 年 <= 終了), 値, 0)=値 × フラグ
条件を満たす期だけ合計するIF列を作ってSUM=SUMPRODUCT(フラグ範囲 × 値範囲)

左列と中列を見比べると、IF版はどれも「条件・真の場合・偽の場合」という3つの部品を読み解かないと意図が分からないのに対し、右列は関数名そのものが意図を語っています。数式は書く時間より読まれる時間のほうが圧倒的に長い、というのがモデリングの現実です。読み手の3秒を節約する書き方を選ぶことが、チーム全体の生産性への投資になります。

それでもIFを使ってよい場面

IFゼロが目的ではありません。次のような場面では、むしろIFのほうが意図が明確になります。

既存モデルを移行するコツ

手元のモデルを改善するなら、まずCtrl + Fで「IF(」を検索し、ネストが2段以上の数式を棚卸しします。それぞれについて「これは上限・下限の話か?(→MIN・MAX)」「期間の話か?(→フラグ)」「条件付き合計か?(→SUMPRODUCT)」と問い直すと、大半は機械的に置き換えられます。置き換え後は、色分けルールに従ってフラグ行やスイッチを視覚的に区別しておくと、レビューのしやすさがさらに上がります。新旧の数式で結果が一致することを必ず確認しながら、1パターンずつ進めてください。

まとめ

本記事のMIN・MAX・フラグは、LBOモデル構築チュートリアルのリボルバーやキャッシュスイープの組み立てで、そのまま実戦投入されます。実際に手を動かして確認したい方は、練習版のExcelファイル(無料)をダウンロードして、IFなしの数式が本物のモデルの中でどう働いているかをぜひ確かめてみてください。

モバイルバージョンを終了