Sticky IFは、Excelの関数名ではありません。英語圏の投資銀行やPEファンドのモデラーが使う「自分自身を参照するIF式」の呼び名です。当サイトでは日本語で自己参照IF式と呼んでおり、M&Aモデルのチュートリアルでも使っています。用途はひとつ。ケースを切り替えるたびに出力表へ値貼付する手間を、Excelに肩代わりさせることです。
本記事は2部構成です。第1部でSticky IF(自己参照IF式)を、仕組み・数値例・反復計算の設定・副作用・ケースを一巡させる方法まで解説します。第2部では、同じく「一度決まった値を保持する」発想を使う「一度立ったら戻らないフラグ」を扱います。Sticky IFのように名前の付いた定番技ではありませんが、プロジェクトファイナンスやデットのモデルで、キャッシュスイープの開始や投資回収の判定などに使われる型です。前期の値を参照するだけで循環参照を使わないため、初学者でも安全に使えます。
第1部:Sticky IF(自己参照IF式)でケース切替を自動化する
困りごと:値貼付の手間とミス
LBOモデルで、ベース・アップサイド・ダウンサイドの3ケースを作ったとします。ケースはプルダウンや番号で切り替える設計が普通なので、モデルが表示できるのは選択中の1ケースだけです。3ケースのIRR(内部収益率)・MOIC(投資倍率)・EV(企業価値)を並べた比較表やフットボールチャートを作るには、ケース1を選んで値をコピーし、出力表に値貼付、ケース2を選んで同じ作業、ケース3も同様、という手順になります。
問題は、前提を1つ直すたびにこの作業をやり直すことです。3ケースなら我慢できても、10ケースになれば必ずどこかで貼り忘れが起き、フットボールチャートの棒が古い数字で描かれたまま投資委員会に提出される。実務で本当に起きる事故です。
仕組み:条件がTRUEのときだけ計算し、それ以外は前の値を保持する
Sticky IFは、次の1本の式で値貼付を自動化します。ケース選択セルをC2、モデルが計算した現在ケースのIRRをF10、出力表のベースケース行をD20とすると、D20に入れる式はこうなります。
=IF($C$2=1, $F$10, D20)
ケース選択が1(ベース)のときはF10のIRRを取り込み、それ以外のときは自分自身(D20)を参照します。自分自身を参照するので値は変わりません。つまりケース1を選んだ瞬間の値が「貼り付いた(sticky)」まま残ります。アップサイド行のD21には $C$2=2、ダウンサイド行のD22には $C$2=3 と書きます。あとはケースを1、2、3と順に切り替えるだけで、出力表が3行とも埋まります。
自分自身を参照する式は、Excelでは循環参照として扱われます。マイクロソフトの解説でも、セルが自分自身を直接参照する式は循環参照の典型例として挙げられています。反復計算がオフのままだと警告が表示され、Sticky IFのセルは0(または最後に計算できた値)のまま動かず、値を取り込みません。使うには反復計算を有効にします(Windowsはファイル → オプション → 数式 → 反復計算を行う。MacはExcel → 環境設定 → 計算方法 → 反復計算を使用する)。最大反復回数と変化の最大値は既定値のままで構いません。
「反復計算をオンにした覚えはないのに動いていた」という場合は、利息の循環などのために、そのファイルですでに反復計算がオンになっていたケースが多いはずです。注意したいのは、反復計算の設定はブックごとに独立して効くわけではなく、Excelを起動して最初に開いたブックの設定がそのセッション全体に適用される点です。反復計算がオフのブックを先に開いてからモデルを開くと、Sticky IFが突然動かなくなることがあります。
数値例:3ケースの出力表が埋まっていく
EBITDA成長率と出口マルチプルだけが違う3ケースを持つLBOモデルで、出力表にSticky IFを組んだ場合の挙動です。数値は説明用の架空の例です。
| ケース切替の操作 | ベース行 | アップサイド行 | ダウンサイド行 |
|---|---|---|---|
| 初期状態(リセット直後) | 0 | 0 | 0 |
| C2に1を入力 | IRR 22.0% / MOIC 2.7倍 / EV 1,200 | 0 | 0 |
| C2に2を入力 | IRR 22.0% / MOIC 2.7倍 / EV 1,200 | IRR 28.5% / MOIC 3.4倍 / EV 1,450 | 0 |
| C2に3を入力 | IRR 22.0% / MOIC 2.7倍 / EV 1,200 | IRR 28.5% / MOIC 3.4倍 / EV 1,450 | IRR 14.0% / MOIC 1.9倍 / EV 980 |
ケース2を選んでもベース行の値は動かず、ケース3を選んでも上の2行は保持されています。3回切り替えた時点で、出力表は「全ケースの値貼付が終わった状態」と同じになります。この表のEV列(980〜1,450、中央がベースの1,200)が、そのままフットボールチャートのLBO法の棒になります。DCFやコンプスの棒も同じ仕掛けで並べれば、前提を変えたあとにケースを一巡させるだけでチャート全体が更新されます。
実装の作法:リセットスイッチと取り込み確認行
Sticky IFをそのまま使うと2つの不便が起きます。1つは、古い値を消す手段がないこと。もう1つは、どのケースが最新の前提で取り込み済みか分からないことです。次の2つを必ず添えます。
- リセットスイッチ:入力セル(例:C3)に1を入れると出力表を0に戻す。式は =IF($C$3=1, 0, IF($C$2=1, $F$10, D20))。前提を変えたらリセット→ケースを一巡、が標準の手順になる
- 取り込み確認行:出力表の各行の横に =IF($C$3=1, 0, IF($C$2=1, 1, E20)) のような「取り込み済みフラグ」を置き、3行とも1になっていることを目視できるようにする。リセット後に0のまま残った行があれば、そのケースの値は古い
リセットスイッチは、循環参照スイッチと同じ入力エリアに置いておくと、モデルを開いた人が仕組みを把握しやすくなります。
知っておくべき副作用
Sticky IFは便利な反面、上級者ほど慎重に使います。理由は3つあります。
- 反復計算をONにすると、意図しない循環参照が検知されなくなる。本来「循環参照」の警告で気づくはずの数式ミスが、反復計算の中で収束した見かけの値として通ってしまう。循環参照の記事で述べた反復計算の危険性は、Sticky IFを使う場合もそのまま当てはまる
- 出力表が古くなっても、Excelは何も教えてくれない。前提を変えたあとにケースを一巡させ忘れれば、出力表は「前の前提での値」を表示し続ける。取り込み確認行を置くのはこのため
- 受け取った人の環境では動かないことがある。前述のとおり反復計算の設定は最初に開いたブックに引きずられるため、モデルを渡す相手の環境で値が取り込まれない場合がある。入力シートの目立つ場所に「反復計算をオンにすること」と書いておく
ケースを一巡させる方法と代替案
ケースが数個なら、手でケース番号を順に切り替えれば十分です。ケースが多い場合やモデルが重い場合は、VBAマクロで1ケースずつ切り替えて値を貼り付ける方法がよく使われます。このほか、ケース番号を入力にしたデータテーブルでケースを自動的に回して取り込む方法を使う人もいます。ただしデータテーブルは再計算が重く、モデルが大きいと動作が遅くなりやすい点には注意が必要です。
| 方法 | 循環参照 | 更新のされ方 | 向いている場面 |
|---|---|---|---|
| Sticky IF(手でケースを一巡) | 必要(反復計算ON) | ケースを一巡させたとき | ケースが数個、マクロを使いたくない |
| VBAマクロで一巡して値を貼り付け | 不要 | マクロを実行したとき | ケースが多い、モデルが重い、反復計算を使いたくない |
使い分けの目安は、ケースが数個ならSticky IFを手で一巡、ケースが多い・モデルが重いならマクロ、です。英国勅許会計士協会(ICAEW)のExcelコミュニティでも、値のコピー&貼り付けは財務モデルでマクロを使う代表的な用途に挙げられており、モデルを更新したら必ずマクロを実行し直すよう注意が促されています。どちらの方法でも、前提を変えたら全ケースを取り込み直す、という運用ルールは変わりません。
第2部:一度立ったら戻らないフラグ
通常のフラグとの違い
名前は似ていますが、こちらは循環参照を使いません。IF関数を使わない財務モデリングで解説したフラグ(1/0)は、「運転開始年から終了年まで」のように、毎期その期の条件を評価して立てるものでした。条件が外れれば0に戻ります。
しかしモデルには「初めて起きた期以降、状態がずっと続く」事象があります。財務コベナンツへの抵触(契約によっては、ウェイバーを得るまで抵触の状態が続く扱いになる)、キャッシュスイープの開始、投資回収の完了、繰越欠損金の使い切り、リボルバーの初回引出、建設完了から運転開始への移行などです。これらは前期のフラグを参照して「一度1になったら1を維持する」式で表現します。
3つの書き方
前期のフラグをC10、当期の条件(例:レバレッジが基準を超えた)をD8 > D9 とすると、当期のフラグD10には次のどれかを書きます。
| 書き方 | 式 | 特徴 |
|---|---|---|
| IF入れ子 | =IF(C10=1, 1, IF(D8>D9, 1, 0)) | 読みやすいが、IFが増えるとネストが深くなる |
| MAX | =MAX(C10, (D8>D9)*1) | 最短。前期が1なら1、そうでなければ当期条件。推奨 |
| OR | =OR(C10=1, D8>D9)*1 | 論理式として意味が明快。数値化のため末尾に*1が必要 |
第0期(前期が存在しない列)には0を直接入力するか、空白セルを参照させます。MAXは空白を0として扱うので、MAX型なら第0期の列を空けておくだけで動きます。当サイトではIF関数のネストを避ける方針なので、MAX型を標準にしています。
数値例:コベナンツ抵触フラグ
レバレッジ比率(ネットデット ÷ EBITDA)が5期にわたって推移し、コベナンツの基準が5.0倍以下の会社です。通常のフラグと、一度立ったら戻らないフラグを並べます。
| 期 | レバレッジ | 基準 | 通常のフラグ | 戻らないフラグ | リセット付き(4期にウェイバー) |
|---|---|---|---|---|---|
| 1 | 4.5倍 | 5.0倍 | 0 | 0 | 0 |
| 2 | 4.8倍 | 5.0倍 | 0 | 0 | 0 |
| 3 | 5.2倍 | 5.0倍 | 1 | 1 | 1 |
| 4 | 4.9倍 | 5.0倍 | 0 | 1 | 0 |
| 5 | 4.7倍 | 5.0倍 | 0 | 1 | 0 |
通常のフラグは3期だけ1で、4期に基準内へ戻ると0になります。しかし多くの融資契約では、抵触した時点でデフォルト事由が発生し、貸し手からのウェイバー(違反の免除)や、エクイティキュアなど契約が定める治癒がなされるまで「継続中」として扱われます。戻らないフラグは、この「いったん立ったら解除されるまで続く状態」を表現し、3期以降ずっと1のままです。
現実にはウェイバーで状態が解除されるので、リセット入力行を設けて =MAX(C10, (D8>D9)*1) * (1 – D11) のように書くと(D11がリセット行、ウェイバー取得期に1を入力)、4期で0に戻り、5期は改めて当期条件だけで判定されます。「セットとリセットを別の行で持つ」のがこの型の基本形です。
応用①:「初回だけ」を取り出す差分フラグ
戻らないフラグは「状態」を表します。ところが実務で欲しいのは「その状態に入った瞬間」であることも多い。初回引出時の手数料、初めて抵触した期のウェイバーフィー、建設完了時の一時費用などです。これは戻らないフラグの差分で取り出せます。
=D10 – C10
当期フラグから前期フラグを引くと、1になった期だけ1、それ以外は0になります(上の例なら3期だけ1)。戻らないフラグを1行作れば、その差分でイベントフラグが手に入る。「状態の行」と「イベントの行」を2行で持つこの型は、覚えておくと数式が驚くほど短くなります。
応用②:投資回収(ペイバック)期の特定
初期投資1,000、その後のキャッシュフローが300・350・400・450の案件で、累積キャッシュフローが0以上になった期を求めます。
| 期 | キャッシュフロー | 累積 | 回収完了フラグ(戻らない) | 差分 |
|---|---|---|---|---|
| 0 | −1,000 | −1,000 | 0 | 0 |
| 1 | 300 | −700 | 0 | 0 |
| 2 | 350 | −350 | 0 | 0 |
| 3 | 400 | 50 | 1 | 1 |
| 4 | 450 | 500 | 1 | 0 |
回収完了フラグは =MAX(前期, (累積>=0)*1) です。回収年は差分行に対して =MATCH(1, 差分行, 0) で3期と求まり、年内の按分まで出すなら 2 + 350 ÷ 400 = 2.875年と計算できます(回収直前の未回収額を回収年のキャッシュフローで割る)。累積キャッシュフローは一度プラスになったあと投資の追加でマイナスに戻ることがあるため、通常のフラグでは「初めて回収した期」を取り出せません。戻らないフラグが必要な典型例です。
落とし穴
- 第1期の列で前期を参照する式が、見出し列や別の行を指していないか確認する。列をずらしてコピーしたときに起きやすい
- フラグの条件が利息や返済額(つまり自分より下流の計算)に依存すると循環参照になる。条件はできるだけ上流の値(EBITDA、残高の期首値など)で立てる
- フラグ行はタイムラインのセクションにまとめ、計算行の中に散らさない
- フラグ行の合計(1の期数)と差分行の合計(イベント回数)をチェック行に置き、モデルのQCに組み込む
まとめ
Sticky IF(自己参照IF式)は、ケース切替のたびに繰り返す値貼付をExcelに肩代わりさせる技で、リセットスイッチと取り込み確認行をセットにすれば実務で十分に使えます。ただし反復計算のオンが前提で、その設定は最初に開いたブックに引きずられます。循環参照の副作用を理解したうえで、ケースの数とモデルの重さに応じて、手で一巡させるかマクロで回すかを使い分けてください。一方、一度立ったら戻らないフラグは循環参照を使わず、MAX型の1本の式で書けます。状態の行と差分の行を2行で持てば、コベナンツ抵触や投資回収のような「初めて起きた期」を伴う事象を、きれいに表現できます。
当サイトのM&Aモデル構築チュートリアルではファイナンスケースの比較表に自己参照IF式を実装しており、LBOモデルのチュートリアルではケース切替を含むモデルを一から組んでいます。練習版のExcelファイルは無料でダウンロードできます。自分のモデルの出力表にSticky IFを1行足して、ケースを一巡させるだけで表が埋まる感覚を確かめてみてください。

