シナリオマネージャー(基本 / 強気 / 弱気)
使用するタイミング
モデルが基本・強気・弱気のケースを少数の仮定ドライバーでクリーンに切り替える必要があり、全ケースを1枚のシートで可視化・監査可能にしたい場合に使用します。このスキルは、Claudeアプリ内でダウンロード可能な.xlsxをゼロから作成し(OpenPyXLとデータ検証を使用)、ライブセレクタ、数式ベースの仮定連携、比較表、再計算・検証パスを提供します。Claude for Excelアドインではありません。
構築するもの
5つの領域:Coverタブ(セレクタとサマリ)、Scenario Inputsタブ(各ドライバーの基本・強気・弱気値)、モデルへのライブリンク(仮定がアクティブケースを参照)、Outputs比較タブ(全3ケースの主要結果を横並び表示)、Checksタブ。
構築ワークフロー
- ケース間で異なるドライバー(例:成長率、価格、解約率、設備投資)をリストアップし、各ドライバーの仮定セルをモデル内で特定します。
- 各ドライバーの基本・強気・弱気値を保持する
Scenario Inputsブロックを作成します。 - セレクタセル(1、2、3)をデータ検証ドロップダウン付きで1つ作成します。
- モデル内の各仮定セルを、CHOOSEまたはINDEX関数でセレクタを参照してアクティブケースを取得するよう書き換えます。
Outputsタブを作成し、全3ケースの主要結果を比較表示します(並列計算、仕様参照)。セレクタの状態に関わらず全ケースが同時に表示されます。Checksタブを追加します。- 実際のエンジン(ヘッドレスLibreOffice)でワークブックを再計算します。
- 数式エラー(#REF!、#DIV/0!、#VALUE!、#NAME?)がゼロであることを確認し、チェックが合格したら.xlsxを提供します。
タブ別仕様
Coverタブ
B2:セレクタセル。データ検証リスト1,2,3(または名前付きリスト基本、強気、弱気を1/2/3にマッピング)を適用します。B3:アクティブケース名、=CHOOSE(B2,"基本","強気","弱気")。- アクティブケース下のモデル出力を読み取る小さな結果サマリ。例:
B6 =Model!B40。
Scenario Inputsタブ
ドライバーごとに1行、ケースごとに1列:
Aドライバー名、B基本、C強気、D弱気(すべて青い入力値)、Eアクティブ値(黒い数式)。- アクティブ値はセレクタで取得。CHOOSEの場合:
E5 =CHOOSE(Cover!$B$2,B5,C5,D5)。 - INDEXの場合:
E5 =INDEX(B5:D5,Cover!$B$2)。ケース数が増える可能性がある場合はINDEXの方がすっきりします。固定3ケースならCHOOSEの方が明示的です。 - 選択した数式を全ドライバー行にコピーして列を統一します。
モデルへのリンク
- 各モデル仮定セルはアクティブ値を参照します。例:
Model!B6 =ScenarioInputs!E5。 - シナリオが制御すべきセルに手入力された仮定値を絶対に残さないでください。値は必ず「セレクタ → アクティブ列 → モデル」の流れで供給される必要があります。
- リンクは緑色のクロスタブ色にして、レビューアーがそのセルが手入力ではなく連携値であることを一目でわかるようにします。
Outputsタブ(横並び比較)
全ケースを同時に表示します(アクティブケースのみではありません)。2つの堅牢なパターン:
- 並列計算(監査性に優れる):少数の出力数式を3回複製し、それぞれ基本・強気・弱気列を直接参照させます(アクティブ列は使いません)。例:強気ケースのNPVは
ScenarioInputs!C5:C12を使用して出力チェーンを再計算します。これによりセレクタに触れずに全3ケースが表示されます。 - 逐次読み取り:モデルが大きい場合は、再計算ステップでセレクタを1、2、3に順に設定して各ケースの出力をキャプチャし、比較セルに貼り付けます。キャプチャされたスナップショットかライブ値かを明確に注記します。
- レイアウト:行=主要指標(売上高、EBIT、NPV、IRR)、列=基本、強気、弱気、さらに強気-基本デルタ列と弱気-基本デルタ列。
Checksタブ
- セレクタが範囲内:
=AND(Cover!B2>=1,Cover!B2<=3,Cover!B2=INT(Cover!B2))→ TRUE。 - 各ドライバーに全3ケースの値が入力されている:
=COUNTBLANK(ScenarioInputs!B5:D12)=0→ TRUE。 - アクティブ列がセレクタと一致している(スポットドライバーで):
=(ScenarioInputs!E5=CHOOSE(Cover!B2,ScenarioInputs!B5,ScenarioInputs!C5,ScenarioInputs!D5))→ TRUE。
OpenPyXL構築ノート
- ドロップダウンは
openpyxl.worksheet.datavalidation.DataValidation(type="list", formula1='"1,2,3"')で追加し、ws.add_data_validation(dv)、dv.add(ws["B2"])を実行します。 - アクティブ値とリンクセルはすべて数式文字列として書き込み、解決済みのケース値としては書き込まないでください。値は再計算後にのみ表示されます。
- ドロップダウンで名前付きケースを使用する場合、セレクタが整数に解決されるように隠しマッピングを保持してください。テキストとインデックスを混在させると数式が壊れます。
- セレクタセルには明確な背景色と太い枠線を設定し、レビューアーが唯一の制御セルを一目で識別できるようにします。
方向性の合理性チェック
- 強気ケースは主要指標で基本ケースより悪化してはならず、弱気ケースは基本ケースを上回ってはなりません。もしそうなっている場合、あるドライバーのケース値が列間で入れ替わっている可能性があります。
- Outputsタブにオプションの非公式チェックを追加し、各デルタの符号が期待される方向と一致することを確認することで、列の入れ替わりをレビューではなく再計算時に発見できるようにします。
数式と書式の慣例
- 基本/強気/弱気の入力値とセレクタセル:青色フォント。
- タブ内数式(アクティブ値のCHOOSE/INDEX列、出力計算):黒色フォント。
- クロスタブリンク(例:モデル内の
=ScenarioInputs!E5):緑色フォント。 - 数式があるべき場所にハードコードされた値は禁止。アクティブ列とモデル仮定セルは常に数式であり、ケース値を再入力したものではありません。
- 各行または列で一貫した数式を使用:アクティブ列は同じCHOOSE/INDEXパターン、比較列は同じ出力数式。
- 数値書式:比率
0.0%、通貨#,##0、倍数0.00x。セレクタセルは塗りつぶしで強調し、切り替え場所が一目でわかるようにします。
Excel標準シナリオマネージャーとのトレードオフ
Excelの標準シナリオマネージャーは、ケース値をダイアログ内に格納してシート上に表示せず、表示時に生の入力を上書きし、モデルとの同期が崩れやすいです。一方、可視化された切り替えブロックはすべてのケースをグリッド上に保持し、アクティブな連携をトレース可能な数式にし、レビューアーがメニューを開かずに全3ケースの結果を横並びで確認できます。監査性が高く、コピー、レビュー、バージョン管理にも耐えます。
チェック
上記Checksタブを参照:セレクタが1~3の整数であること、空白のケースセルがないこと、アクティブ値がセレクタのケースと一致すること。すべてTRUEを返す必要があります。
再計算と検証
OpenPyXLで保存後、ヘッドレスで再計算(例:libreoffice --headless --convert-to xlsx)してCHOOSE/INDEX関数とシート間リンクを解決します。再読み込みし、#REF!、#DIV/0!、#VALUE!、#NAME? をスキャンします。セレクタを1、2、3と切り替えて出力が変化することと、各設定でアクティブチェックが成立することを確認します。問題があれば修正してループし、クリーンな状態になったら提供します。
収集する入力情報
- モデルのパスと各ドライバーの仮定セルアドレス。
- 各ドライバーの基本、強気、弱気の値。
- 比較する主要出力指標とそのセル。
- 比較方法:並列計算(ライブ)か、キャプチャスナップショットか。
例
仮定ドライバー:売上成長率(基本4%、強気8%、弱気1%)、粗利益率(基本55%、強気58%、弱気50%)。セレクタCover!B2 = 2で強気ケースを選択すると、ScenarioInputs!E5 =CHOOSE(2,4%,8%,1%) = 8%がModel!B6に流れます。Outputsタブには(例として)NPVが基本760、強気1,140、弱気410と表示され、強気-基本デルタ380がすべて同時に表示されます。