Raw Data!B12
Cell contains the error value #DIV/0! as a static value (no formula behind it — likely pasted over a calculation)
This workbook scores 59.7 out of 100 (grade D), reflecting meaningful structural and data-quality issues across its 11 sheets and 289 formula cells. The most serious concern is five critical error values sitting as static content in the Raw Data sheet — these are not live formula errors but hardcoded error states, almost certainly the result of a paste operation that overwrote underlying calculations. Until they are resolved, any formula downstream that references those cells will either inherit the error or silently ignore it.
Two circular references are present and both carry the intentional_iterative flag, meaning the model relies on Excel's iterative calculation setting being enabled. This is a portability risk: the model will behave incorrectly or refuse to calculate on any machine where iterative calculation is turned off, including many shared or locked-down environments. Beyond that, 76 instances of hardcoded constants embedded in formulas and 46 fragile VLOOKUP constructs (using hardcoded column indices and approximate matching) were flagged as worth reviewing; these are heuristic findings and may include some false positives, but the volume suggests systematic practices that could cause silent errors if the workbook is extended.
Lower-severity items include one inconsistent formula in a range, one merged cell inside a data or formula range, six numbers stored as text in referenced ranges, and two overly complex formulas. These are warnings or informational findings and do not individually threaten model integrity, but they add friction to auditing and maintenance. Collectively, the combination of static error values, iterative-dependency risk, and a high density of fragile lookups warrants a structured remediation pass before this workbook is used for decision-making.
Replace static error values in Raw Data
B12B13C12D13E14
Locate the original source data or calculations for these cells on the Raw Data sheet. The errors appear to have been pasted in as static values rather than retained as live formulas. Restore the underlying formulas or supply correct data values, then verify that all downstream references recalculate cleanly.
Address iterative circular references and document the dependency
Balance Sheet!B10Sensitivity!B10
Because these circular references require iterative calculation to be enabled, add a prominent workbook-level note documenting this requirement. Evaluate whether the circular logic can be restructured to remove the dependency; if not, ensure all users and any automated processes that open this file have iterative calculation switched on to avoid silent miscalculation.
Harden fragile VLOOKUP formulas in Order Book
F10F11F12
These VLOOKUPs use a hardcoded column index and approximate matching, making them worth reviewing for correctness. Replace them with INDEX/MATCH (or XLOOKUP if available) using exact-match mode, which eliminates the column-index brittleness and prevents silently wrong results from unsorted lookup tables. Audit the remaining flagged lookups across the workbook for the same pattern.
Generated from the findings above only — the AI never reads your workbook. Heuristic findings are candidates to review, not verdicts.
| Check | Severity | Findings | Points |
|---|---|---|---|
| Error values in cells | critical | 5 | −15.0 |
| Hardcoded constants inside formulas | warning | 76 | −8.0 |
| Fragile lookups | warning | 46 | −6.0 |
| Inconsistent formulas in a range | warning | 1 | −3.8 |
| Circular references | warning | 2 | −3.0 |
| Merged cells inside data/formula ranges | warning | 1 | −2.6 |
| Numbers stored as text in referenced ranges | info | 6 | −1.1 |
| Overly complex formulas | info | 2 | −0.9 |
139 findings across 8 checks — worst first. Chips filter by severity.
Error values in cells 5 findings −15.0 pts
An error value means a calculation has already failed or bad data was pasted in. Errors propagate: every total, lookup, or ratio that reads this cell turns into an error too, so a single bad cell can silently corrupt entire sections of the model.
Raw Data!B12
Cell contains the error value #DIV/0! as a static value (no formula behind it — likely pasted over a calculation)
Raw Data!B13
Cell contains the error value #N/A as a static value (no formula behind it — likely pasted over a calculation)
Raw Data!C12
Cell contains the error value #DIV/0! as a static value (no formula behind it — likely pasted over a calculation)
Raw Data!D13
Cell contains the error value #N/A as a static value (no formula behind it — likely pasted over a calculation)
Raw Data!E14
Cell contains the error value #DIV/0! as a static value (no formula behind it — likely pasted over a calculation)
=R[-4]C*0.82
5 cells
B10:F10
=MAX(0,R[-1]C*0.21)
5 cells
B10:F10
='Cash Flow'!R[4]C*0.82
5 cells
B6:F6
=RC[-1]*1.21
40 cells
E4:E43
=(RC[-1]/RC[-4])^(1/3)-1
3 cells
F6:F8
=VLOOKUP(RC[-3],'Raw Data'!R24C1:R26C5,4)
40 cells
F4:F43
=VLOOKUP(RC[-1],'Raw Data'!R24C1:R26C5,3)
3 cells
B9:B11
=VLOOKUP(R[-8]C,R15C8:R19C9,2)
3 cells
B14, D14, F14
Functions like SUM and AVERAGE silently skip text, so a number stored as text contributes nothing to the totals that read it. The total still looks plausible — it is simply missing rows — making this a classic source of invisible understatement.
Formulas nobody can read are formulas nobody can verify — deeply nested or very long formulas hide mistakes during review and break silently when edited. They are prime candidates for refactoring into helper cells or named ranges (LAMBDA/LET).
Pro feature — shown in full here so you can see exactly what you'd get. On your own reports the checklist below is part of Pro.
122 paste-ready corrections (46 mechanical, 76 assisted) — prepared from this audit's findings. Your workbook is never modified; each fix is a formula you paste yourself.
The extraction fixes below reference labeled assumption
cells — add a sheet named Assumptions and enter each value
once (label in column A, value in column B):
| Cell | Value | Suggested label |
|---|---|---|
| Assumptions!$B$1 | 0.25 | Assumption 1 (was 0.25) |
| Assumptions!$B$2 | 0.82 | Assumption 2 (was 0.82) |
| Assumptions!$B$3 | 0.019 | Assumption 3 (was 0.019) |
| Assumptions!$B$4 | 9 | Assumption 4 (was 9) |
| Assumptions!$B$5 | 4 | Assumption 5 (was 4) |
| Assumptions!$B$6 | 6 | Assumption 6 (was 6) |
| Assumptions!$B$7 | 14 | Assumption 7 (was 14) |
| Assumptions!$B$8 | 1000 | Assumption 8 (was 1000) |
| Assumptions!$B$9 | 8 | Assumption 9 (was 8) |
| Assumptions!$B$10 | 0.21 | Assumption 10 (was 0.21) |
| Assumptions!$B$11 | 1.02 | Assumption 11 (was 1.02) |
| Assumptions!$B$12 | 1.04 | Assumption 12 (was 1.04) |
| Assumptions!$B$13 | 1.06 | Assumption 13 (was 1.06) |
| Assumptions!$B$14 | 1.08 | Assumption 14 (was 1.08) |
| Assumptions!$B$15 | 1.21 | Assumption 15 (was 1.21) |
| Assumptions!$B$16 | 3 | Assumption 16 (was 3) |
| Assumptions!$B$17 | 1.052 | Assumption 17 (was 1.052) |
| Assumptions!$B$18 | -0.005 | Assumption 18 (was -0.005) |
| Assumptions!$B$19 | -0.0025 | Assumption 19 (was -0.0025) |
| Assumptions!$B$20 | 0.0025 | Assumption 20 (was 0.0025) |
| Assumptions!$B$21 | 0.005 | Assumption 21 (was 0.005) |
| Assumptions!$B$22 | -0.01 | Assumption 22 (was -0.01) |
| Assumptions!$B$23 | 0.01 | Assumption 23 (was 0.01) |
Order Book!F10 mechanical 40 cells share this pattern
before =VLOOKUP(C10,'Raw Data'!$A$24:$E$26,4)
after =VLOOKUP(C10,'Raw Data'!$A$24:$E$26,4,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across F4:F43 — the pattern is identical in all 40 cells (adjust relative references as Excel does).
Revenue Build!B10 mechanical 3 cells share this pattern
before =VLOOKUP(A10,'Raw Data'!$A$24:$E$26,3)
after =VLOOKUP(A10,'Raw Data'!$A$24:$E$26,3,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across B9:B11 — the pattern is identical in all 3 cells (adjust relative references as Excel does).
Sensitivity!B14 mechanical 3 cells share this pattern
before =VLOOKUP(B6,$H$15:$I$19,2)
after =VLOOKUP(B6,$H$15:$I$19,2,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across B14, D14, F14 — the pattern is identical in all 3 cells (adjust relative references as Excel does).
Cash Flow!B10 assisted 5 cells share this pattern
before =B6*0.82
after =B6*Assumptions!$B$2
Replaces the buried constant (0.82 → Assumptions!$B$2) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across B10:F10 — the pattern is identical in all 5 cells (adjust relative references as Excel does).
Income Statement!B10 assisted 5 cells share this pattern
before =MAX(0,B9*0.21)
after =MAX(0,B9*Assumptions!$B$10)
Replaces the buried constant (0.21 → Assumptions!$B$10) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across B10:F10 — the pattern is identical in all 5 cells (adjust relative references as Excel does).
Income Statement!B6 assisted 5 cells share this pattern
before ='Cash Flow'!B10*0.82
after ='Cash Flow'!B10*Assumptions!$B$2
Replaces the buried constant (0.82 → Assumptions!$B$2) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across B6:F6 — the pattern is identical in all 5 cells (adjust relative references as Excel does).
Order Book!E10 assisted 40 cells share this pattern
before =D10*1.21
after =D10*Assumptions!$B$15
Replaces the buried constant (1.21 → Assumptions!$B$15) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across E4:E43 — the pattern is identical in all 40 cells (adjust relative references as Excel does).
Raw Data!F6 assisted 3 cells share this pattern
before =(E6/B6)^(1/3)-1
after =(E6/B6)^(1/Assumptions!$B$16)-1
Replaces the buried constant (3 → Assumptions!$B$16) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across F6:F8 — the pattern is identical in all 3 cells (adjust relative references as Excel does).
Balance Sheet!B10 assisted
before =B5+B6-MAX(0,B9*0.25)
after =B5+B6-MAX(0,B9*Assumptions!$B$1)
Replaces the buried constant (0.25 → Assumptions!$B$1) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Cash Flow!B8 assisted
before ='Revenue Build'!B12*0.019
after ='Revenue Build'!B12*Assumptions!$B$3
Replaces the buried constant (0.019 → Assumptions!$B$3) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
DCF!B12 assisted
before =ROUND(MAX(0,SUM(B6:F6)+IF(ISNUMBER(B9),B9,MIN(ABS(SUM(B6:F6)),MAX(0,AVERAGE(B6:F6))*ROUND(MIN(9,COUNT(B6:F6)+4),0)))),0)
after =ROUND(MAX(0,SUM(B6:F6)+IF(ISNUMBER(B9),B9,MIN(ABS(SUM(B6:F6)),MAX(0,AVERAGE(B6:F6))*ROUND(MIN(Assumptions!$B$4,COUNT(B6:F6)+Assumptions!$B$5),0)))),0)
Replaces the buried constants (9 → Assumptions!$B$4, 4 → Assumptions!$B$5) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
DCF!B8 assisted
before =IF(WACC!$B$10>Assumptions!$B$20,MAX(0,MIN(('Cash Flow'!F12*(1+Assumptions!$B$20))/(WACC!$B$10-Assumptions!$B$20),SUM('Cash Flow'!B12:F12)*ROUND(MAX(6,MIN(14,AVERAGE('Cash Flow'!B12:F12)/1000)),0)*4)),SUM('Cash Flow'!B12:F12)*8)
after =IF(WACC!$B$10>Assumptions!$B$20,MAX(0,MIN(('Cash Flow'!F12*(1+Assumptions!$B$20))/(WACC!$B$10-Assumptions!$B$20),SUM('Cash Flow'!B12:F12)*ROUND(MAX(Assumptions!$B$6,MIN(Assumptions!$B$7,AVERAGE('Cash Flow'!B12:F12)/Assumptions!$B$8)),0)*Assumptions!$B$5)),SUM('Cash Flow'!B12:F12)*Assumptions!$B$9)
Replaces the buried constants (4 → Assumptions!$B$5, 6 → Assumptions!$B$6, 14 → Assumptions!$B$7, 1000 → Assumptions!$B$8, 8 → Assumptions!$B$9) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!C8 assisted
before ='Balance Sheet'!B8*1.02
after ='Balance Sheet'!B8*Assumptions!$B$11
Replaces the buried constant (1.02 → Assumptions!$B$11) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!D8 assisted
before ='Balance Sheet'!B8*1.04
after ='Balance Sheet'!B8*Assumptions!$B$12
Replaces the buried constant (1.04 → Assumptions!$B$12) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!E8 assisted
before ='Balance Sheet'!B8*1.06
after ='Balance Sheet'!B8*Assumptions!$B$13
Replaces the buried constant (1.06 → Assumptions!$B$13) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!F8 assisted
before ='Balance Sheet'!B8*1.08
after ='Balance Sheet'!B8*Assumptions!$B$14
Replaces the buried constant (1.08 → Assumptions!$B$14) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Revenue Build!D5 assisted
before =C5*1.052
after =C5*Assumptions!$B$17
Replaces the buried constant (1.052 → Assumptions!$B$17) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A4 assisted
before =Assumptions!$B$20+-0.005
after =Assumptions!$B$20+Assumptions!$B$18
Replaces the buried constant (-0.005 → Assumptions!$B$18) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A5 assisted
before =Assumptions!$B$20+-0.0025
after =Assumptions!$B$20+Assumptions!$B$19
Replaces the buried constant (-0.0025 → Assumptions!$B$19) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A7 assisted
before =Assumptions!$B$20+0.0025
after =Assumptions!$B$20+Assumptions!$B$20
Replaces the buried constant (0.0025 → Assumptions!$B$20) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A8 assisted
before =Assumptions!$B$20+0.005
after =Assumptions!$B$20+Assumptions!$B$21
Replaces the buried constant (0.005 → Assumptions!$B$21) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!B3 assisted
before =WACC!$B$10+-0.01
after =WACC!$B$10+Assumptions!$B$22
Replaces the buried constant (-0.01 → Assumptions!$B$22) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!C3 assisted
before =WACC!$B$10+-0.005
after =WACC!$B$10+Assumptions!$B$18
Replaces the buried constant (-0.005 → Assumptions!$B$18) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!E3 assisted
before =WACC!$B$10+0.005
after =WACC!$B$10+Assumptions!$B$21
Replaces the buried constant (0.005 → Assumptions!$B$21) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!F3 assisted
before =WACC!$B$10+0.01
after =WACC!$B$10+Assumptions!$B$23
Replaces the buried constant (0.01 → Assumptions!$B$23) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
WACC!B5 assisted
before =B4*(1-0.21)
after =B4*(1-Assumptions!$B$10)
Replaces the buried constant (0.21 → Assumptions!$B$10) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Your workbook is never modified — fixes are prepared for you to paste, because rewriting .xlsx files corrupts charts, pivots, and macros.
Findings by sheet, worst first. Sheets with no findings aren't listed; workbook-level findings get their own card.
14 findings across 3 checks
80 findings across 2 checks
12 findings across 3 checks
5 findings across 3 checks
3 findings across 3 checks
4 findings across 2 checks
Everything above was produced by the real analysis pipeline from the sample workbook — the same checks, scoring, summary, and fix pack your file gets.