Builds a Base/Bull/Bear scenario switching layer for a model in a .xlsx with a live selector, CHOOSE or INDEX assumption links, a side-by-side output comparison, and a recalc check, then delivers the…
Library skill — the default version is maintained in GitHub; edits you make live in your own clone.
Use when a model needs to switch cleanly between Base, Bull, and Bear cases driven by a small set of assumptions, and you want every case visible and auditable on one sheet. This skill BUILDS a downloadable .xlsx from scratch in the Claude app (openpyxl plus data validation), with a live selector, formula-driven assumption pulls, a comparison table, and a recalc-and-verify pass. It is not the Claude for Excel add-in.
Five areas: a Cover tab (selector and summary), a Scenario Inputs tab (each driver under Base, Bull, Bear), live links INTO the model so assumptions pull the active case, an Outputs comparison tab (key results across all three cases side by side), and a Checks tab.
Scenario Inputs block holding Base, Bull, Bear values for every driver.Outputs tab comparing key results across all three cases (parallel calc, see spec) so all cases show at once regardless of selector.Checks tab.B2: selector cell. Apply data validation list 1,2,3 (or named list Base, Bull, Bear mapped to 1/2/3).B3: active case name, =CHOOSE(B2,"Base","Bull","Bear").B6 =Model!B40.One row per driver, one column per case:
- A driver name, B Base, C Bull, D Bear (all blue inputs), E active value (black formula).
- Active value pulls with the selector. Using CHOOSE: E5 =CHOOSE(Cover!$B$2,B5,C5,D5).
- Equivalent with INDEX: E5 =INDEX(B5:D5,Cover!$B$2). INDEX is cleaner when the case count may grow; CHOOSE reads more explicitly for three fixed cases.
- Copy the one chosen formula down every driver row so the column is consistent.
Model!B6 =ScenarioInputs!E5.Show every case at once, not just the active one. Two robust patterns:
- Parallel calc (preferred for auditability): replicate the few output formulas three times, each fed by the Base, Bull, or Bear column directly rather than the active column. For example NPV under Bull recomputes the output chain using ScenarioInputs!C5:C12 instead of E. This shows all three without touching the selector.
- Read-each: if the model is large, document that the comparison cells capture the live output for each case by setting the selector to 1, 2, 3 in turn during the recalc step and pasting each captured value; note clearly which cells are captured snapshots versus live.
- Layout: rows = key metrics (Revenue, EBIT, NPV, IRR), columns = Base, Bull, Bear, plus a Bull-minus-Base and Bear-minus-Base delta column.
=AND(Cover!B2>=1,Cover!B2<=3,Cover!B2=INT(Cover!B2)) TRUE.=COUNTBLANK(ScenarioInputs!B5:D12)=0 TRUE.=(ScenarioInputs!E5=CHOOSE(Cover!B2,ScenarioInputs!B5,ScenarioInputs!C5,ScenarioInputs!D5)) TRUE.openpyxl.worksheet.datavalidation.DataValidation(type="list", formula1='"1,2,3"'), then ws.add_data_validation(dv) and dv.add(ws["B2"]).=ScenarioInputs!E5 inside the model.0.0%, currency #,##0, multiples 0.00x. Highlight the selector cell with a fill so it is obvious where to toggle.Excel's built-in Scenario Manager stores case values inside a dialog, invisible on the sheet, overwrites the live inputs when shown, and is easy to desync from the model. A visible toggle block keeps every case on the grid, makes the active pull a traceable formula, and lets reviewers see all three outcomes side by side without opening any menu. It is more auditable and survives copy, review, and version control.
See the Checks tab above: selector in 1..3 and integer, no blank case cells, active value equals the selector's case. All three must return TRUE.
Save with openpyxl, recalc headless (for example libreoffice --headless --convert-to xlsx) so CHOOSE/INDEX and cross-sheet links resolve. Reload, scan for #REF!, #DIV/0!, #VALUE!, #NAME?. Toggle the selector to 1, 2, 3 and confirm outputs change and the active check holds at each setting. Fix and loop until clean, then deliver.
Hypothetical drivers: revenue growth (Base 4%, Bull 8%, Bear 1%), gross margin (Base 55%, Bull 58%, Bear 50%). Selector Cover!B2 = 2 selects Bull, so ScenarioInputs!E5 =CHOOSE(2,4%,8%,1%) = 8% flows into Model!B6. The Outputs tab shows NPV of (for example) 760 Base, 1,140 Bull, 410 Bear in hypothetical units, with a Bull-minus-Base delta of 380, all visible at once.