SimuXL 3.0.0 - Excel-DNA add-in (.xll) - Monte Carlo simulation inside your own workbook.
1Start here
What SimuXL is for, the three steps every model goes through, and where to go next.
SimuXL turns a spreadsheet that computes one answer into one that computes the range of answers your assumptions actually allow. You keep your model exactly as it is. You replace the numbers you were never really sure about with the ranges they always were, tell SimuXL which cells you want measured, and it recalculates your workbook a few thousand times and reports what came out.
Typical uses
Cost risk - a bottom-up estimate whose quantities and unit rates are ranges, answering "how much do I need to be 80% confident?"
Schedule risk - durations as ranges, answering "what is the chance we finish by the date we promised?"
Risk registers - a probability and an impact per risk, answering "what is the whole register worth, and which entries drive it?"
Engineering and design - tolerances, loads and material properties as distributions, answering "how often does this design fall outside spec?"
Any model with an assumption in it - SimuXL never looks inside your formulas, so anything Excel can compute, it can put a range around.
The three steps
Turn assumptions into distributions. A cell that held 10 becomes =SXL.Triangular(8, 10, 14). Type it, or use the Input dialog.
Define your outputs. Select the cells whose answer you care about - a total, a finish date, a clearance - and press Output once.
Run, and read. Press Run Simulation, then look at the distribution of each output and at which inputs drove it.
NoteEverything else in this guide is detail on those three steps. If you would rather type something now, go to Quick start: your first simulation and come back.
What SimuXL will not do to your workbook
It does not change your model. No SimuXL command writes a value into a cell you did not ask it to.
It does not put its results among your own cells. An analysis is written to a sheet of SimuXL's own - by default a new sheet in your workbook, replaced on the next run - and none of your cells is edited. If you would rather each analysis arrived in a workbook of its own, that is one setting away.
It does not need the internet, and it sends nothing anywhere.
2What SimuXL is
A Monte Carlo add-in that lives inside your own spreadsheet - and the two words this guide uses precisely.
Most of a risk model is already in your workbook. What is missing is that some of the numbers you typed are not really single numbers - a duration is "eight to fourteen weeks, most likely ten", a unit rate is "about $420, give or take", a risk either happens or it does not. SimuXL lets you write those cells as what they actually are, then runs your model thousands of times and shows you the range of answers it produces.
You replace a number with a formula. =SXL.Triangular(8, 10, 14) is a duration that could be as low as 8 or as high as 14 and is most likely 10. Everything downstream of that cell - every SUM, every IF, every lookup you have already built - keeps working exactly as it did.
Two words this guide uses precisely
An Uncertain Input is ONE distribution: the thing that gets sampled, that appears in the tornado, and that you can freeze or correlate.
A SimuXL formula cell is a cell containing one or more Uncertain Inputs. One cell can hold two: =SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50) is a 5% risk with an uncertain impact, and SimuXL treats it as two Uncertain Inputs in one cell.
NoteThis matters more than it sounds. A count of "inputs" that meant cells would tell you a model has fewer risks than it has, and the risk-times-impact cell above is the single most common shape in a risk register.
NoteEvery other term this guide leans on is defined in the Glossary, at the end - trial, seed, sampler, design, harvest, noise floor and the rest.
3Quick start: your first simulation
Five minutes: two uncertain inputs, one output, a fixed seed, and a result you can reproduce.
Build the smallest model that shows what SimuXL does. It takes three short stages, and the recap at the end names what each one was for.
Stage 1 - the uncertain inputs
In a blank sheet, put this in cell D1 and press Enter: =SXL.Triangular(10, 20, 50). The cell shows 26.667. That is the distribution's average - see "What a SimuXL cell shows" below.
Put this in D2: =SXL.Normal(100, 15). It shows 100.
Stage 2 - the model, and the output
Put an ordinary formula in F1 that uses them both: =D1 * D2. This is your model. It can be as complicated as you like; SimuXL never looks inside it.
Select F1, then press Output in the Define group and press Save. This tells SimuXL which cell you want measured - once, for this workbook.
Stage 3 - the run
On the SimuXL tab, press Run Simulation. The dialog states what it will measure - 1 defined output across 1 sheet - rather than asking you for an address.
Leave Trials at 1000. Random seed already holds 12345 - SimuXL fills it so the run is reproducible before it starts rather than only afterwards from its run record - so leave that alone too and press Run Simulation. A small window shows the trial counter while it runs, with a Stop button.
A window tells you the run is finished and lists what it built. It does not take you anywhere - your selection is exactly where you left it - and you press Go to sheet to look at whatever you want to see. The SXL Trial Run sheet holds the mean, the standard deviation and the percentiles of F1, plus a row per Uncertain Input showing what it actually drew against what it should have drawn.
What you just did
You defined two Uncertain Inputs - a Triangular and a Normal - by writing them as formulas, so both are legible in the formula bar to anyone who opens the file.
You defined one output, F1, which SimuXL wrapped in a marker that travels with the cell and leaves its displayed value alone.
You ran 1000 trials at a fixed seed. Each trial drew one value per input, recalculated your model, and recorded F1.
You got a distribution rather than a number, plus a check that each input was sampled the way its formula says.
NoteType the same seed again and you will get exactly the same numbers. That is what the seed is for, and it is what makes a SimuXL result something you can put in a report and defend six months later.
Then try the analyses
With that run still in memory, press Tornado and then Impact. On a two-input model they will agree. Add =SXL.YesNo(0.05) * 100 to the model and they will stop agreeing - which is the single most useful thing SimuXL will ever show you, and is explained under When something looks wrong.
4The eight distributions
Every one is an ordinary worksheet function. Start typing =SXL. and Excel offers the list, or use the Input dialog.
NoteIf your formula bar says SimuXL_ something, that is the same function. Older SimuXL models spell these SimuXL_Triangular rather than SXL.Triangular. Both work, and they always will - nothing needs converting, and a model can hold a mixture. SimuXL writes the short spelling into new cells and leaves the spelling already in a cell exactly as it found it, so editing an old input does not rewrite it.
Function
Arguments
Use it when
SXL.Triangular
Minimum, MostLikely, Maximum, Name (optional)
You can state a low, a high and a most likely. The workhorse of cost and schedule estimating.
SXL.BetaPert
Minimum, MostLikely, Maximum, Lambda (optional), Name (optional)
Same three numbers as Triangular, but weighted towards the most likely value rather than spread evenly. Omit Lambda for the standard 4. Its mean is (Minimum + Lambda x MostLikely + Maximum) / (Lambda + 2) and its variance is (Mean - Minimum) x (Maximum - Mean) / (Lambda + 3) - stated because several Beta-PERT conventions are in use and the mean alone cannot tell them apart.
SXL.Uniform
Minimum, Maximum, Name (optional)
Anything in the range is equally likely and you have no reason to prefer the middle.
SXL.DiscreteUniform
Minimum, Maximum, Name (optional)
A whole number from Minimum to Maximum, each equally likely - a die, a count of units, a month of the year. Non-whole bounds are refused rather than rounded.
SXL.Normal
Mean, StdDev, Name (optional)
A quantity that scatters symmetrically about a centre. Note it has no lower bound, so it can go negative.
SXL.Lognormal
Mean, StdDev, Name (optional)
A quantity that cannot go below zero and has a long upper tail. Both arguments are of the values themselves, not of their logarithms.
SXL.Discrete
Values, Probabilities, Name (optional)
A handful of specific outcomes with specific chances. Both arguments can be ranges, or written inline: =SXL.Discrete({10;20;30}, {0.25;0.5;0.25}).
SXL.YesNo
ProbabilityOfYes, Name (optional)
Something either happens or it does not. Returns 1 or 0, so multiply it by an impact: =SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50).
The dialogs call them by name rather than by function. Input, the Input as gallery and every analysis sheet list them as Triangular, Beta-PERT, Uniform, Discrete Uniform, Normal, Lognormal, Custom Discrete and Yes-No - the same eight, in that order.
What a SimuXL cell shows when nothing is running
Its average. =SXL.Triangular(10, 20, 50) shows 26.667 because that is the mean of that triangle. The cell is not a random number that changes when you press F9, and it is not the last value that happened to be sampled.
NoteOn a distribution with gaps in it, the average is a value the cell can never actually draw.=SXL.YesNo(0.05) shows 0.05 and =SXL.DiscreteUniform(1, 6) shows 3.5 - a gate that is 5% on, and a die that rolls 3.5. That is the correct average and it is deliberate; it is also why Discrete Uniform, Custom Discrete and Yes-No compute nothing meaningful at rest when they are choosing rather than sizing.
This is deliberate, and it has a useful consequence: your workbook, sitting there untouched, is a deterministic point - every uncertain quantity at its average. That is exactly what the Impact analysis measures deviation from.
Watch outIf you read a workbook at rest as the answer's average, you will be wrong on any model that switches, gates or bends. A risk register, a Draw column, a MIN, a MAX or a threshold each put the answer's average somewhere the sheet at rest does not sit - see When the at-rest value is not a base case, in the Contents.
Parameters can be formulas
Anything Excel can evaluate is a legal argument, so a distribution can be driven by the rest of your model:
=SXL.Triangular(B4 * 0.8, B4, B4 * 1.3)
The arguments are re-evaluated on every trial, so if B4 itself depends on a SimuXL cell, the relationship holds trial by trial.
5When the at-rest value is not a base case
The workbook sitting there untouched is a deterministic point. It is not the answer's average, and on three common shapes of model it is nowhere near it.
Take the workbook one cell at a time: every SimuXL formula shows its distribution's mean when no simulation is running, so the number already in the cell is that distribution's average. The sheet as it stands is therefore a deterministic point - reproducible, stable when you press F9, and the point the Impact analysis measures every swing from.
Watch outIf you read a workbook at rest as the answer's average, you will be wrong on any model that switches, gates or bends. A deterministic point built from every input's average is not the average of what the model does with them, and on a risk register it is not close.
A distribution that CHOOSES rather than SIZES
A distribution used to CHOOSE something rather than to SIZE something settles its branch at rest, and settles it the same way every time. A Draw cell reads exactly 0.5 with nothing running, so IF(Draw < P, Impact, 0) reads ZERO for every chance at 50% or below - the comparison is strict, so a risk at exactly 50% is off - and the full impact for every chance above it. The total at rest is neither the register's mean nor any trial it produced.
An average the cell can never draw
On a distribution with gaps in it, the average is a value the cell can never actually draw.=SXL.YesNo(0.05) shows 0.05 and =SXL.DiscreteUniform(1, 6) shows 3.5 - a gate that is 5% on, and a die that rolls 3.5. That is the correct average and it is deliberate; it is also why Discrete Uniform, Custom Discrete and Yes-No compute nothing meaningful at rest when they are choosing rather than sizing.
An output that bends
If your model bends, the base case is not the answer's average and cannot be, whichever way it bends. A formula that is flat on one side of a threshold and sloped on the other, a MIN or a MAX, a product of uncertain factors, any risk gate - each pulls its own average away from its value at the centre. That is a property of the model rather than a defect, and it means Impact measures swings from a point your output may almost never occupy.
NoteP50 and P90 both zero while the mean is positive is the signature, and it means the output is flat over most of its range and large over a little of it. Nothing is wrong; the base case simply is not where the money is.
NoteRead the mean off the run report, never off the sheet at rest. The Impact sheet answers a different and equally real question - how far one input can move the answer - and it states this caveat in its own preamble so a reader who never opens this manual still meets it.
6Defining inputs and outputs
The dialogs, what they write into your cells, and why the formula is the definition.
Input as - straight to one distribution
The Input as menu beside it lists all 8 distributions with a line each on what they are for, and opens the same dialog already on the one you picked. Nothing else about it differs - the parameters, the live curve and the formula SimuXL writes into the cell are identical either way.
Erase - taking SimuXL back off a cell
Select the cell and press Erase. It answers all three kinds of SimuXL cell, and it tells you what each one will become before it writes anything. Select several cells to erase several at once.
An output or a control variable goes back to what its cell held before it was defined. Both WRAP something, so the original is still inside the formula: SXL.Output(A1*3, "Cost") puts =A1*3 back, and a control variable leaves the plain value behind. The tint comes off with it, and the cell goes on showing the same number - the wrapper never changed what it computed.
An Uncertain Input is different, because there is nothing underneath it. The distribution call IS the cell, so there is no earlier formula to restore. SimuXL leaves the distribution's mean, written as an expression: =SXL.Triangular(10, 20, 50) becomes =(10 + 20 + 50) / 3. It stays live, so a parameter that lives in another cell goes on working, and it shows its own arithmetic three months later where a bare 26.666666666666668 would not.
What each distribution's cell is left holding, each row produced by the same rule that does the erasing:
Distribution
A cell that held
Erase leaves
Triangular
=SXL.Triangular(10, 20, 50)
=(10 + 20 + 50) / 3
Beta-PERT
=SXL.BetaPert(10, 20, 50)
=(10 + (4) * 20 + 50) / ((4) + 2)
Uniform
=SXL.Uniform(10, 50)
=(10 + 50) / 2
Discrete Uniform
=SXL.DiscreteUniform(1, 6)
=(1 + 6) / 2
Normal
=SXL.Normal(100, 15)
=100
Lognormal
=SXL.Lognormal(100, 30)
=100
Custom Discrete
=SXL.Discrete({10;20;30}, {0.25;0.5;0.25})
Refused - see the note under this table.
Yes-No
=SXL.YesNo(0.25)
=0.25
NoteWhere the mean IS the first parameter, the erased cell holds that argument alone. A Normal or a Lognormal is centred on the Mean you typed, and a Yes-No's mean is its probability - so =SXL.Normal(100, 15) erases to =100, a bare number rather than arithmetic. A parameter living in another cell still goes on working: =SXL.Normal(D6, 15) erases to =D6.
NoteThree cells are refused rather than guessed at, and the message names the reason each time: a Discrete distribution (its mean is a weighted sum over its own outcome and probability pairs, and a mistake in that expression would look like a number rather than an error), a cell holding TWO distributions in one expression, and a distribution sitting inside a larger formula - put it in a cell of its own and point the formula at it first.
NoteErasing a frozen input changes no number. A frozen input is already held at its mean, and the mean is exactly what the erased cell is left holding. The freeze is lifted in the same act, and any fill it covered up is put back - leaving it behind would strand the grey shading with nothing able to clear it.
NoteA correlated input is refused rather than erased, and SimuXL names the input it is paired with and the coefficient. Erasing it would leave a correlation with one end missing, which stops every run until you remove it. Delete the pair in Correlate first, then erase the cell.
NoteExcel's own Undo does not reach an add-in's writes, so the way back from an erase is to define the cell again.
Watch outIf you erase the last output in a workbook that still holds an older stored output list, that list is cleared too - and SimuXL says so when it does. Leaving it would bring the old outputs silently back on the next run, so the next simulation would measure the cells you had just erased.
Input - the dialog, if you would rather not type
Select a cell holding a plain number and press Input (the Define group, first on the tab). Pick one of the eight distributions, fill in its parameters, and the curve redraws as you type - so you can see the shape you are describing before you commit to it. Press OK and SimuXL writes the formula into the cell.
It writes a formula, not a hidden definition. The dialog is a convenience; the formula is the input. Anything you can do in the dialog you can do by typing, and the other way round.
Each parameter box takes a number, a cell (=D6) or a formula (=D6*0.3) - and the preview follows a reference, so you see what that cell's current value does to the shape. A box holding a reference is shaded amber and shows you the VALUE it resolves to, not the text you typed; click into it and it shows the reference again, so you can always see both.
A name is optional. Leave it blank and the input is reported by its cell address; type one and every chart and table uses it instead. The Tornado, Impact and Tail Driver tables print the cell as well, in a Cell column beside the name, so a named input can still be traced back to where it lives. The name box takes a cell too - =A6 names the input from that cell's text, and a relative reference follows when you copy the cell. The Name button writes into this same argument, so the dialog and Name are two ways to set one thing.
On a cell that already holds a SimuXL input, it opens in EDIT mode - titled Edit SimuXL Input, with the existing parameters and name loaded, so reopening a cell changes it rather than starting again.
It refuses on a cell holding an ordinary formula, because replacing =D1*D2 with a distribution would destroy the model you built. It also refuses a cell holding MORE than one distribution, which you can still edit by typing.
NoteDefining an input does not tint the cell or attach a note to it, which the older add-in did. There that was the only way to see a cell was an assumption, because the cell showed a bare number; here the formula bar says so. (Freezing one does tint it grey - see "Freeze" - and puts your own fill back on release.)
NoteA fill SimuXL applies is a fill SimuXL has to remove cleanly later, and the older build could not: it set "no fill" and lost whatever colour you had chosen yourself. That is the reason for the paragraph above, not tidiness.
Output - naming the cells you want measured
An output is a cell whose distribution you want to see. Select the cells and press Output (the Define group), once, and press Save. Every run after that measures exactly those cells.
Saving writes the definition INTO THE CELL, as SXL.Output wrapped around whatever the cell already held. =D1*3+D2 becomes =SXL.Output(D1*3+D2, "Total cost"), and the cell goes on showing exactly the number it showed before - the function returns its first argument and does nothing else.
That is what makes an output survive editing. Copy the cell, fill it down, move it, or insert a row above it, and the definition goes with it, because Excel maintains the formula the way it maintains every other formula. An output used to be a row on a hidden sheet keyed on Sheet1!$F$1 - so copying an output cell did nothing at all, and inserting a row above one left the stored address pointing at a different cell.
Removing an output here puts the cell's original formula back. The marker contains what it replaced, so nothing is lost either way. ⚠️ Excel's own Undo does not reach an add-in's writes, so Ctrl+Z is not the way back - this is.
A cell holding a plain number can be an output too.1700 becomes =SXL.Output(1700, "Base"), still worth 1700.
Watch outIf you press Run with an idle cell selected, nothing gets measured by accident. The Run dialog has no output box - a deliberate removal, because it used to arrive prefilled from the selection, and a run over the wrong cell produces a complete, plausible report of something you never asked about, which no artefact can disagree with because the request itself was the mistake.
NoteAn output is always defined. A workbook that defines none is told so, with the path to the button, before the dialog opens.
Outputs on DIFFERENT SHEETS work. A typed range cannot express that at all - an Excel range covers one worksheet, however many areas it has - so if your model reports a total on one sheet and a schedule date on another, this is the only way to measure both in one run.
Every chart, table and exported column then says the NAME rather than Sheet1!$F$7. Names have to be unique, because an exported CSV uses them as column headings and two columns under one heading is a join that silently addresses the wrong one.
SimuXL suggests a name from the cell to the LEFT when that cell holds text, which in most cost and schedule models is already the label you would have typed. Type over anything you do not like - pressing Save commits whatever is in the name box, so you do not have to press Rename first.
Or point at the cell that holds the label, with the … button beside the name - the same affordance the input dialog has. The box then shows that cell's TEXT on an amber ground, and the reference again as soon as you click into it. It is a LIVE link: edit that cell and the output's name follows it. The reference is RELATIVE when the label is on the output's own sheet, so filling a wrapped cell down a column names each copy from the label on its own row.
Nothing is written until you press Save, including removals - so Cancel really does leave the workbook alone.
Watch outIf you rename an output that has stored chart settings, those settings are stranded - a stored chart configuration is keyed on the NAME. Pressing Save tells you which ones you have just stranded, rather than letting them go quiet.
Watch outIf you empty a label cell an output's name reads from, the run stops rather than quietly falling back to the address - which would strand that output's chart settings while the report still looked complete.
NoteA workbook you defined outputs in before this build carries them as stored rows instead of formulas. It still runs, and the run says so - those rows are keyed on cell addresses, so a row inserted above one points it at the wrong cell. Open this dialog and press Save to convert it: SimuXL writes the formulas and clears the old list, and nothing is lost, because every name it held ends up in the cell it describes where you can read it in the formula bar.
NoteTwo rules can stop a run over a model that looks perfectly reasonable - a cell whose SimuXL calls do not all happen on every trial, and a cell that draws more than its own formula shows. Both are in Rules SimuXL enforces, next, with the remedy for each.
7Rules SimuXL enforces
The things that stop a run, why each one stops it, and what to do instead.
SimuXL refuses to run a model it cannot sample reliably, and it refuses rather than guessing, because every failure below produces a run that completes with plausible numbers and no sign anywhere that they are wrong. Each rule is stated the same way - the rule, why it exists, what to do - followed by worked examples and, at the end, the instrument that answers all of them on your own workbook.
Rule: the same SimuXL calls on every trial
Rule
A cell must make the same number of SimuXL calls on every trial.
Why
An Uncertain Input is a cell plus a POSITION, and each position owns a fixed place in the seeded random stream before trial 1. If a conditional skips a call, the positions after it shift up - so one place in the stream stops meaning one distribution.
What to do
Put each distribution in its own cell and let the formula choose between those cells.
It is the rule behind the refusal a risk modeller is most likely to meet, and it is narrower than it first looks. You can absolutely make a cell's answer depend on a chance - the product's headline shape does exactly that. What you cannot do is make a formula choose whether a SimuXL call happens at all.
Where only one call is written, SimuXL is instead being asked to sample a position that sometimes does not exist. Either way the run would complete and the numbers would look entirely reasonable.
The cell holds
Verdict
Why
=SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50)
Allowed
Both calls run on every trial. Two Uncertain Inputs in one cell - a 5% risk with an uncertain impact, and the commonest shape in a risk register.
=IF(A1>0, D5, D6), where D5 and D6 hold the distributions
Allowed
The IF chooses between values. Each call is in a cell of its own and runs on every trial.
=IF(AND(B2="Yes", SXL.Uniform(0, 1)<0.1), 1, 0)
Allowed
The call is in the condition, which is always evaluated - and AND evaluates all of its arguments rather than stopping at the first false one.
=IF(A1>0, SXL.Uniform(1, 2), SXL.Normal(3, 4))
Never allowed
The IF chooses between calls, so at most one of the two can ever run. The count is wrong whatever A1 holds.
=IF(A1>0, SXL.Normal(1, 2), 0)
Only while the branch is taken
One call, and it runs only while A1 is above zero. SimuXL refuses the workbook as soon as it is not - and if A1 crosses zero part-way through a run, the run halts at that trial.
The second condition sits inside a branch, so it is skipped whenever the first test is true. This is the shape a nested risk register produces, and which rows it fails on depends on the data.
Watch outIf a conditional that passes today stops taking its branch tomorrow, the run stops. And if the condition flips during a simulation, it stops at that trial rather than carrying on with a cell that has started sampling something else. The rule is about every trial, not about the trial in front of you.
Which Excel functions skip an argument - measured, not assumed
Only a function that can decline to evaluate an argument can break this rule, and the unit that matters is the ARGUMENT rather than the function - a distribution is safe in an argument Excel always evaluates and unsafe in one it may skip. These were measured in Excel - the conditionals on 11 August 2026, LET on 23 August - a cell per construct with a distribution in the arm that is NOT returned, each against a control cell proving it fires when it IS returned:
Function
Always evaluated
May be skipped
IF
the condition
the branch not taken
IFERROR
the first argument
the second, unless the first is an error
CHOOSE
the index
every value you did not select
IFS
all of them
nothing
SWITCH
all of them
nothing
AND
all of them, even after a FALSE
nothing
OR
all of them, even after a TRUE
nothing
LET
every binding, used or not
nothing
NoteCHOOSE is the surprise. It looks like a lookup rather than a conditional and it behaves like IF: =CHOOSE(1, 1, SXL.Normal(1, 2)) never runs that Normal at all.
NoteIFS and SWITCH are the other way round - they read like conditionals and evaluate everything, so a distribution inside one is perfectly safe.
NoteLET was the one expected to break it, and it does not. Every binding is evaluated before the body runs, so =LET(x, SXL.Normal(0, 1), y, SXL.Triangular(2, 4, 9), IF(A1>0, x, y)) draws BOTH on every trial and is perfectly safe - and which binding the body returns cannot change that.
NoteIFERROR cuts both ways.=IFERROR(SXL.Normal(1, 2), 0) is fine, because the first argument is always evaluated; it is =IFERROR(something, SXL.Normal(1, 2)) that will not run on a trial where nothing went wrong.
Watch outIf you write a conditional that is not in that table, do not reason from it - it is a measurement on one version of Excel, not a promise from Microsoft, and it covers the eight constructs anybody has asked about. Find Inputs is the authority on your own workbook: press it and read the Expected column against the Reported column for that cell, in each state its condition can take. The second line of that sheet names the Excel it ran on, so a result you report - or two machines that disagree - can be pinned to a build rather than to "Excel".
Which Excel functions call MORE than once - measured, not assumed
Excel's six LAMBDA helpers run a LAMBDA many times over, and they are neither of the things above. They skip nothing - each one calls once for every thing it iterates, and what it iterates differs between them. So one call site written in your formula draws many times, and the number changes when your data does. Measured in Excel on 17 August 2026, on the same instrument as the table above:
Construct
Verdict
What Find Inputs reports
MAP
Once per element
=SUM(MAP(A8:C9, LAMBDA(x, x + SXL.Normal(0,1)))) over a 2-row by 3-column block - Expected 1, Reported 6, and six Uncertain Inputs listed in that one cell
REDUCE
Once per element
=SUM(REDUCE(0, A8:C9, LAMBDA(a, x, a + x + SXL.Normal(0,1)))) over the same block - Expected 1, Reported 6
SCAN
Once per element
=SUM(SCAN(0, A8:C9, LAMBDA(a, x, a + x + SXL.Normal(0,1)))) over the same block - Expected 1, Reported 6
BYROW
Once per row
=SUM(BYROW(A8:C9, LAMBDA(r, SUM(r) + SXL.Normal(0,1)))) over the same block - Expected 1, Reported 2
BYCOL
Once per column
=SUM(BYCOL(A8:C9, LAMBDA(c, SUM(c) + SXL.Normal(0,1)))) over the same block - Expected 1, Reported 3
NoteOne range gave three different answers, and that is what makes this a measurement rather than a guess. Every construct above was harvested over the same 2-row by 3-column block: MAP, REDUCE and SCAN reported 6, BYROW reported 2, BYCOL reported 3. A count that simply followed the size of the range would have read 6 for all of them. Widening the block to 2 rows by 5 columns then moved BYCOL to 5 and left BYROW at 2.
Watch outIf you draw a distribution inside one of these, SimuXL refuses the model - and it refuses it under the second rule below rather than the first. The cell draws MORE times than its own formula shows, so splitting the formula up is not the remedy here: one call site is written and one is meant.
NoteFor the five that run over a range you supply:Give each item its own draw: put the distribution in a range beside your data, one cell per item the lambda visits, and have the lambda read that range instead of drawing inside itself. If that feels familiar, it is the Draw column from the risk-register example arriving through a different door.
NoteMAKEARRAY is the one that needs different advice. It reads no range at all - you tell it how many rows and columns to build, so its count is the two numbers you typed rather than the size of your data. Give each cell its own draw: put the distribution in a block of cells the size you asked MAKEARRAY for, and read that block instead of drawing inside the lambda.
NoteThose six are every LAMBDA helper Excel has, so there is no seventh waiting to surprise you. Find Inputs remains the authority on your own workbook, though: press it and read Expected against Reported for the cell.
What to do instead
Put each distribution in its own cell and let the formula choose between those cells.=IF(A1>0, SXL.Uniform(1, 2), SXL.Normal(3, 4)) becomes three cells: =SXL.Uniform(1, 2) in one, =SXL.Normal(3, 4) in another, and =IF(A1>0, D5, D6) where the original was. The model means the same thing, both distributions are visible in the formula bar, and both are Uncertain Inputs the tornado can rank and the Correlation Editor can reach.
NoteMoving a distribution out of a branch costs you nothing statistically. It draws on every trial whether or not its value is used that trial, and the unused draw cannot disturb any other input, because each Uncertain Input owns its own position in the stream - the same property that lets you freeze one input without changing another's numbers.
NoteWhat it does change is how that input reads on a tornado. It is ranked over every trial, including the ones where its value was not used, so a branch that is rarely taken will rank as a weak driver.
Watch outIf you MISTYPE a function name in a model that still uses the old SimuXL_ spelling, the whole workbook is refused - by this rule, with this message, about a conditional you never wrote. SimuXL counts anything starting with that prefix and followed by an opening bracket as a call it has to account for, and a name it does not have can never report.
NoteThe short spelling does not behave that way.SXL. is matched against the names this build actually has, so =SXL.Nomal(0, 1) is a #NAME? in that one cell and nothing more. The old prefix is matched openly on purpose - it is what stops a workbook written against a newer SimuXL from being quietly half-simulated - and this is the price of it.
NoteSo if a refusal names a cell you can see no conditional in, check the spelling of the SimuXL function first.
Rule: a cell must not draw more than its formula shows
Rule
A cell must not make MORE SimuXL calls than its own formula text contains.
Why
That is almost always a defined name that expands to a SimuXL call. The assumption is then invisible in the formula bar, so nobody reviewing the model can see it - and SimuXL refuses for the same reason it refuses the case above.
What to do
Write the distribution into a cell of its own, where the formula bar will show it.
NoteSplitting the formula up is not the remedy here, and that is why it is a separate rule. The distribution is not in that cell at all; what is needed is to find it and put it somewhere the formula bar will show it.
The row on the run record this rule has a twin in
The rule above is checked when SimuXL scans your workbook, which is one moment. A model whose call count depends on its own numbers can pass that scan and then draw MORE times on some later trial - so the run record carries a counter for exactly that: Evaluations past a cell's known calls.
Each cell gets as many places in the random stream as SimuXL saw that cell use when it scanned. A call past the last of them gets no draw at all: it comes back as the distribution's own mean. The row counts those calls over the whole run, and zero is the number you want.
Watch outIf that count is not zero, the run does not stop. Every call SimuXL was expecting still fired, so the check that guards the rules above is satisfied and the extra call is simply on top - the run reports Completed, every figure looks reasonable, and one of your distributions was a constant for part of it.
NoteIt is not the LAMBDA helpers, which are caught earlier. A cell that broadcasts draws more than its formula shows on the very first scan, so it is refused by this rule before any trial runs. This counter is for the case the scan cannot see: the same cell drawing a different number of times once the numbers start moving.
Rule: a required argument must not be left empty between two commas
Rule
Every required argument must have something in it. =SXL.Triangular(,20,50) - one stray comma - is refused.
Why
Excel hands an empty argument slot to SimuXL as zero before SimuXL is entered, so that cell samples Triangular(0, 20, 50) and shows a perfectly reasonable number. Nothing downstream can reveal it: the call fires, it is counted, every total agrees, and the model runs on a minimum you never typed.
What to do
Put a number in the slot, or delete the extra comma. Find Inputs names the cell and the parameter, and Run Simulation refuses until it is fixed.
NoteIt is read from your formula TEXT, not from inside the function, and that is why it is free. Seeing it inside the function would mean changing the type of every numeric parameter, which was measured at 80.5 seconds against 43.3 on a 10,000-trial run. The scan already reads every formula once per press, so asking the same question there costs nothing on the trial loop.
Watch outIf you point a required argument at a BLANK CELL instead, SimuXL cannot tell, and nothing reports it.=SXL.Triangular(A1,20,50) with A1 empty still reads as zero. The formula text says only A1, and answering would mean resolving something that may be a name, a table column or another call. It is the same mistake to you and a completely different problem to SimuXL - so read the Parameters column on a Find Inputs listing, where an argument you did not mean to be zero is printed as zero.
NoteAn empty slot at an OPTIONAL position is legal and is deliberately not reported.=SXL.BetaPert(10, 20, 50, , "Steel") is how you take Lambda's default while still naming the input, so a rule that fired on it would be a rule firing on correct formulas.
Watch outIf you leave that comma out, you have named nothing. Beta-PERT is the one distribution with an optional parameter of its own, so =SXL.BetaPert(10, 20, 50, "Steel") puts "Steel" in Lambda's slot, and you get a Beta-PERT at Lambda 4 with no name on it.
NoteNothing errors and nothing is reported when that happens. The cell shows a perfectly reasonable number and the input turns up on every table under its cell address instead of its name. It is the empty-slot rule's twin one position to the right - a wrong value in a slot you did mean to fill, rather than a zero in one you did not.
When a trial errors, and when an input misbehaves
Rule
An output that is not a number is yours to decide about. A cell that makes an unexpected number of SimuXL calls always stops the run.
Why
An output error is your model's business and you may legitimately want the trial dropped. A call-count disagreement is an INPUT that misbehaved: the result would be drawn from the wrong distribution, and nothing on any sheet could tell.
What to do
Choose what a bad output does under Preferences > Errors. A call-count disagreement is not a choice - fix the cell SimuXL names.
An output cell that is not a number - a #DIV/0!, some text, or the empty string an =IF() gives when its condition is not met. None of those can go into an average. What SimuXL does about it is yours to choose: see Stop the run on a calculation error under Preferences > Simulation.
An unexpected number of SimuXL calls in a trial. SimuXL knows how many your model should make. If a trial makes a different number, some Uncertain Input either did not fire - and is then silently stuck at its average - or fired twice and consumed its neighbour's random number. This always stops the run, whatever the setting above says.
Stop the run on a calculation error
What a bad output does
Ticked (the default)
The run stops at the first one and names the trial, the output and the exact error. A blank output folded into a mean as zero is a defect the older build actually shipped, and this is the setting that exists because of it.
Unticked
SimuXL discards that whole trial - every output of it and every input draw of it - and carries on. The run then reports how many trials it dropped and which outputs caused them, and every figure it produces describes the trials that were kept. If every trial is dropped there is no result, and the run is reported as a failure rather than as an empty success.
NoteThe whole trial goes, not just the output that failed. SimuXL pairs each output value with the input draws from the same trial, and the tornado, the tail drivers, the output histogram and Export Trials all rely on that pairing. Dropping trial 41 for one output and not another would leave every one of them quietly matching a draw to the wrong outcome - and no mean, SD or percentile can reveal that.
The message box tells you the outcome and, if something went wrong, one sentence saying what. The detail - which trial, which cell, which error, and what SimuXL did about it - is on the run record in the workbook that opens, because that is the artefact you keep and screenshot. A run that excluded some trials and kept others still reads Completed as its status, because it did complete - so the status word carries the excluded count with it everywhere it appears, and every sheet carries a line saying which trials its figures describe. A run that kept none at all is reported as a failure, because there is nothing to compute a result from and a sheet of dashes headed Completed reads as a SimuXL defect rather than as a model that errors on every draw.
Find Inputs - what SimuXL thinks your model contains
Press Find Inputs at any time. SimuXL recalculates the workbook once, notes every SimuXL function that fires, and writes a listing of each Uncertain Input - its sheet and cell, its distribution and the arguments it was actually called with. The listing goes to a new workbook or onto a SXL Uncertain Inputs sheet of this one, whichever you have chosen under Preferences > Analyses, and it is replaced each time you press it. Nothing else in your workbook is touched - no formula, no value, no formatting.
It reads every sheet of your workbook. The scoped recalculation box on the Run dialog narrows what Excel recomputes during a run - it never narrows what SimuXL scans, and there is no way to leave a sheet out.
Reading the arguments this way rather than parsing the formula text is what lets a parameter be a formula, a name or a cell reference - Excel does the hard part, and SimuXL sees the numbers your model really produced.
NoteFind Inputs is the instrument for anything not in either table above. Its report ends in an ISSUES table carrying an Expected column beside a Reported column: how many SimuXL calls that cell's formula writes, against how many actually ran. Write the formula you are unsure about, press Find Inputs, and read those two numbers.
NoteExpected and Reported are left blank on a finding that counts nothing. A bad argument, or a SimuXL function this build does not have, is a statement about what one call SAYS rather than about how many of them ran - so there is no count to print, and a zero there would be a quantity SimuXL never measured.
Watch outIf you test a conditional in only one state, you have tested one state. Find Inputs can only see the state your workbook is in - so set the condition true, press Find Inputs, set it false, and press it again.
It lists all four things SimuXL finds, not just the inputs
The same scan that finds your Uncertain Inputs also finds your defined outputs and your control variables, out of the same formulas. The listing carries a block for each: INPUTS, ISSUES, OUTPUTS, CONTROLS. A marked cell SimuXL will not use appears in its block with the reason in the Status column, rather than only in the message that refuses. An output SimuXL cannot use stops a run; a control variable it cannot use stops a comparison and leaves an ordinary run alone.
NoteThe OUTPUTS block opens by saying where your outputs came from - which of the two routes, or that you have not defined any yet. There are two routes and they behave differently. An output defined by a SXL.Output formula travels with its cell when you copy it or insert a row above it; one still held in a workbook's older stored definitions is remembered by address and does not. If the listing says your outputs are the older kind, that sentence also says what to press to convert them.
It reports what it cannot account for, rather than guessing
A call inside a branch that was not taken - =IF(A1>0, SXL.Normal(1,2), 0) with A1 at zero - is reported, and it stops a run. It is narrower than it looks - gating an uncertain input in one cell is supported - and it has a remedy: see Rule: the same SimuXL calls on every trial above.
A SimuXL function name this build does not have is reported, not ignored.
An argument that cannot be a valid parameter is reported.
A call reported from a different open workbook is excluded and said so. A recalculation is application-wide, so SimuXL sees other workbooks' cells and must not merge them into yours.
NoteFind Inputs itself always reports - it is a report, and it never refuses to tell you what it saw. It is Run Simulation that stops, and it stops for anything above except a cell it could not scan. The reasoning: a run over inputs that are not what they appear to be produces numbers that are wrong in a way nothing downstream can detect.
8Running a simulation
Trials, a seed, stopping and pausing, and how to watch a run go past.
You choose
What it means
Trials
How many times to run your model. More trials means a smoother answer and a longer wait; the relationship is close to linear. A few thousand is usually plenty for a mean, and tails need more.
Random seed
It arrives holding a seed under every policy, so a run is reproducible before it starts. A workbook that has never been configured offers a fixed 12345, which means two runs of one unchanged model give you the same numbers; a workbook set to a fixed seed offers that seed, and one set to reuse the last offers the last seed it used. Leave the box blank and SimuXL takes a fresh seed from the clock, and records which it used so you can come back to that run. Choose what the box starts on under Preferences > Simulation - a new seed each run is the setting for a fresh sample every time. The same seed gives the same numbers on any machine, as long as the sampler is the same one - which is why the run record names it. The run record says whether the seed was yours or SimuXL's, and accepting the one it offered counts as SimuXL's.
Outputs
Not a choice - a statement of what this run will measure, read from the outputs you defined. Every cell of every defined output becomes an output, so define the individual result cells rather than a whole column: a blank one will stop the run. The run record lists them by name, so what was measured is on the artefact rather than only in your memory.
NoteLeaving the box empty does not make the run unrepeatable. SimuXL takes a seed from the clock and prints it in the run report, so any past run can be reproduced exactly by typing its seed back in with the sampler the report names.
NoteA simulation can also be started from your own macro, with no dialog and the run record handed back to your code. It is documented under "Running a simulation from your own macro", in "The right-click menu, the keyboard, and SimuXL from your own macros and formulas".
A run can be paused or stopped. A small window shows the trial counter and the elapsed time for as long as the run lasts, with Step, Pause and Stop buttons; Excel's status bar carries the same count.
Pause holds the run at the end of the trial in flight so you can look at the sheet, and Resume carries on from exactly where it stopped. Nothing is lost and nothing is re-drawn: the seeded stream picks up at the next trial, so a paused run that finishes is an ordinary complete run. The elapsed time on the report does not count it: SimuXL stops its clock while a run is held, deliberately, so Elapsed and Per trial go on measuring your model rather than how long you spent looking at the sheet - and the run record's Held for you row says how much was not counted.
Stop ends the run for good. Everything completed so far is kept, so the report and the analyses still work - over however many trials there are, and every artefact says so.
Neither is instant. Both land at the end of the trial in flight, which on an ordinary model is milliseconds and on one whose single recalculation takes seconds is seconds.
NotePause is what you want if you only meant to look. Stopping a 200,000-trial run to check something costs you the run; pausing it costs you nothing.
Watching a run - pacing, and Step
A normal run turns Excel's screen updating off, because redrawing the sheet on every trial would cost more than the trial does. That is right for getting an answer and useless for checking that your model does what you think it does - so there are two ways to slow a run down and watch it.
Tick "Watch the run" in the Run dialog and set a hold in milliseconds. SimuXL leaves the screen painting and pauses that long after each trial, so you can see the drawn inputs land and the model recalculate. The dialog tells you what it will cost before you commit: at 250 ms a trial, 10,000 trials is over forty minutes.
Press Step on the ribbon (the Simulation group) to start a run that holds after every trial. Press it again - on the ribbon or on the progress window - to draw exactly one more. This is the way to check a formula that only misbehaves on some draws.
Step works during a run too. Pressing it while a run is going holds it and advances one trial at a time from wherever it had got to. Resume carries on without holding; the sheet stays visible from then on, and a paced run goes back to its pace.
Watch outIf you press Step during a run that was going at full speed, the press lands two trials later, not one - the trial already in flight finishes first. It is a way into stepping rather than a way to catch one particular trial.
NoteA paced or stepped run is a REAL run. Same seed, same random stream, same order, same report and same analyses - the numbers are identical to an unpaced run at that seed, to the last digit. What changes is the clock in the room, and the run record says Paced or Stepped; if it was actually held, a Held for you row gives the hold in seconds, so a reader is not left wondering why one run took eleven minutes. A run you only PAUSED gets that row and no other, because SimuXL records pacing and stepping and does not record pausing.
NotePause turns the screen back on for as long as it is held, whichever way the run was started, and Resume hands it back - unless you have pressed Step at any point, after which the sheet stays visible for the rest of the run, because somebody who steps has said they want to watch.
The other two ticks on the Run dialog
Show the distribution as it builds draws one output's histogram in the progress window and keeps it up to date while the run goes past, so a distribution that is obviously wrong shows itself in the first few hundred trials instead of at the end. On a run with more than one output the window carries a picker for which one to follow, and you can change it mid-run. The picture refreshes on a clock - every 250 ms - rather than on every trial, so what it costs does not grow with the trial count; leave it unticked and the run allocates nothing for it at all. It changes no number: the run, its record and every analysis are identical either way.
Scoped recalculation - faster on large models recalculates only the sheets between your Uncertain Inputs and your outputs on each trial, instead of the whole workbook. On a large model that is worth a few milliseconds a trial, which is minutes over a long run. ⭐ SimuXL works those sheets out from your formulas, refuses to scope at all if it cannot prove the answer, and checks itself against a full recalculation on a sample of trials while the run goes - if a single check disagrees it stops scoping and finishes the run the ordinary way. The run record says what it did either way, so a run you are unsure about can be settled by reading it rather than by running it twice. A comparison run recalculates the whole workbook whatever this box says.
NoteClicking is safe. Every SimuXL command except Step refuses politely until the run ends, and pressing any of them no longer costs you the run. Excel abandons a recalculation when it finds input waiting, which leaves a trial with nothing calculated in it; SimuXL notices, re-serves that trial's same random numbers and recalculates it, so the result is identical to the one an untouched run would have produced. If it happens at all, the run record says how many trials it affected under Recalculations retried.
Watch outIf you EDIT your workbook while a run is going, the later trials measure a different model from the earlier ones - and the run would complete, report a mean and a set of percentiles, and give no sign anywhere that they describe two models rather than one. Press Stop and run again afterwards. Pausing is not enough: a run that resumes over an edited model has the same problem.
NoteTyping over an Uncertain Input's own formula is the harmless case, because SimuXL notices that and stops.
NoteWhat happens when a trial goes wrong - a #DIV/0! in an output, or a cell that made an unexpected number of SimuXL calls - is under Rules SimuXL enforces, because one of the two is a rule you can change and the other is not.
If a run does not finish
Reset clears a stuck run state - use it if something went wrong and SimuXL still believes a simulation is in progress. It changes nothing in your model.
9Latin Hypercube
Spreading the draws evenly - what it buys, what it costs, and why a seed alone no longer identifies a run.
SimuXL normally draws every Uncertain Input independently every trial, which is plain Monte Carlo and is what every SimuXL run did until this feature shipped. Tick Latin Hypercube on the Run dialog and it does something different: it splits each distribution into as many equal slices as there are trials in a design, and takes exactly one draw from every slice. Nothing about your model or your assumptions changes - only which random numbers come out.
It helps most where SimuXL currently has to print a warning instead of an answer. A Yes-No at 5% fires a lucky or unlucky number of times under plain Monte Carlo, and the whole upper tail of anything it drives is built out of those firings. Under Latin Hypercube it fires in exactly 5% of the trials whenever that 5% works out to a whole number of trials per design, and within one trial per design otherwise. A run is laid out as 20 designs, so a 4,000-trial run gives designs of 200 and a 5% gate fires exactly 10 times in each of them, at every seed. A gate at 0.15% in the same run works out at 0.3 firings per design, so most designs do not fire it at all and a few fire it once - close to nominal over the run, and not on it. The remaining wobble is entirely in the sizes the gate multiplies, not in how often it fires.
Where the gain lands depends on the model, and the honest summary is that it varies enormously. Measured over 300 repeated runs at 4,000 trials: on a 5% risk gate the P90's run-to-run spread is about five times narrower, and on a product of uncertain factors the mean's is about five to six times narrower. A sum of independent triangulars - the textbook case, and the one no real model looks like - improves by more than a hundredfold on its mean and hardly at all on its tail. On any real model it is worth having and on none of them is it magic.
Correlations still work, and SimuXL swaps the method quietly. Plain Monte Carlo correlates by transforming the drawn numbers; that transformation would undo the even spread, so under Latin Hypercube SimuXL correlates by reordering them instead. Both land on the same achieved correlation, so every number in the correlation report means what it always meant. You do not choose between them and the run record says which was used.
Watch outIf you quote a seed without the sampler, you have not identified the run. A Latin Hypercube run at seed 12345 will NOT reproduce a plain run at seed 12345 - both are reproducible, and they are different runs. The run record names the sampler every time, and a before-and-after comparison needs the same sampler on both sides.
NoteA Latin Hypercube run is laid out as 20 independent designs rather than one. That is what keeps a shorter part of the run meaningful and keeps the memory cost small.
NoteIt is also why SimuXL may round your trial count up by a few - to a whole number of designs. The dialog tells you the count it will actually run before you press Run, and the run record prints it.
Watch outIf you ask for a run too short to make real designs, SimuXL refuses it rather than spreading nothing over one slice per design. At 20 designs that means at least 200 trials.
Watch outIf you correlate more inputs than a design has room for, the Run dialog refuses before the run starts and tells you the trial count that would work. A 2,000-trial run gives designs of 100 trials and allows at most 99 correlated inputs.
NoteLaying the designs out is not free when a lot of inputs are correlated. The cost grows with the SQUARE of how many of them are, so ten correlated inputs cost nothing measurable and a thousand can cost half an hour before the model has recalculated once. SimuXL projects it on the dialog and asks before it spends more than 30 seconds of it, and the run record prints what it actually cost.
NoteConvergence measures a Latin Hypercube run differently, and gets MORE out of it. On a plain run it compares successive doublings of the trial count; on this one it compares the designs, and because each design is a complete simulation in its own right, the spread of their answers is a genuine 95% band for every figure - including a percentile, which has no formula for one. See The analyses for what that band is measured to get wrong.
10Naming, freezing and correlating
The three things you can attach to an Uncertain Input - a name goes into the cell's own formula, and the other two are what SimuXL stores in your workbook.
Name
Gives the selected cell a name that appears in every report in place of Sheet1!$D$6. The three analysis tables print both - the name, and a Cell column beside it - because a name tells you what an input is and only the address tells you where to go and change it. It works on an Uncertain Input or on a defined output - press it on either and the box opens on the name already in that cell's formula. Leave the box empty to remove it. On a cell that is both - an output whose own formula is a distribution - it names the input; use Define Output to name that output.
NoteThe name goes into the cell's own formula, on both sides. An input gains a last argument - =SXL.Triangular(10, 20, 50, "Escalation") - and an output gains the second argument of its SXL.Output wrapper. So you can see the name in the formula bar, it travels when you copy the cell, and there is nothing stored anywhere else that could disagree with it.
NoteType =A6 instead of a name and the cell is called whatever that cell says. The reference is relative, so filling a column down names each row from the label beside it. This works on an input and on an output.
NoteA name is an optional argument and always has been, so =SXL.Triangular(10, 20, 50) stays valid and is reported by its cell address.
Watch outIf you name a Beta-PERT that was using the default Lambda, SimuXL writes Lambda in explicitly - at the 4 it was already using, and it says so. It is the one distribution with an optional parameter of its own, and the name has to come last.
NoteIf the cell has an ordinary Excel name of its own, reports use that and the box still opens empty - because you did not choose it for SimuXL, and putting it in the box would turn it into a SimuXL name on one click. Type the name you want.
NoteEarlier versions of SimuXL stored an input's name outside the cell, and those names still read correctly. Press Name on such an input and the box opens on the stored name; press OK and it moves into the formula, and the old copy is removed - a formula name and a stored name are exactly the second definition this avoids.
Freeze / Release
Holds the selected input at its average for the whole run, so you can ask "what does my answer look like if this one is not uncertain?". Press again to release.
Your formula is never touched. Freezing does not write a value into the cell; SimuXL simply stops pushing a sample into it, and the function falls back to the average it shows when nothing is running. The cell is tinted grey so you can see at a glance that it is frozen, and your own fill colour is put back when you release it.
NoteEvery other input's draws are bit-for-bit unchanged. A frozen input still consumes its own random number and throws it away, so freezing input A cannot shift input B's position in the sequence. Without that, a before-and-after comparison at the same seed would be comparing two different runs while looking perfectly reasonable.
Watch outIf you freeze an input, every report marks it FROZEN and the run record says the run is not a full simulation - because a frozen input's realised average equals its theoretical average and its standard deviation is zero, which in a table is indistinguishable from an input that was sampled and simply does not vary.
Correlate
Correlated inputs move together: a high draw on one makes a high draw on the other more likely. Correlate opens the Correlation Editor, which lists every Uncertain Input in the workbook - no selection needed.
Pick Variable A, the input every pair in this batch will be correlated with.
Tick as many Variable B as you like. The search box narrows the list, and ticks survive a change of filter - tick three under one search, three under another, and you have six.
Type one coefficient, strictly between -1 and 1. The word beside it and the ceiling note below it both follow what you type.
Press Add Pair. One pair is written per ticked B, all sharing that coefficient.
Press OK. Nothing reaches the workbook before that, including removals, so Cancel really does leave it alone.
NoteThe last column, Problem (blank = none), is empty on a healthy pair and that is what you should normally see. It fills in only when SimuXL could not apply that row: a stored coefficient that is not strictly between -1 and +1, an input correlated with itself, or the same pair declared twice. A run refuses rather than silently dropping such a pair, so this editor is where you are sent to fix it, and the Defined pairs caption counts them for you.
NoteThat column is about one row at a time, and a run can also stop for a reason no single row owns. An end of a pair that no longer matches an Uncertain Input, or a set of coefficients SimuXL cannot turn into a usable matrix even after substituting, are both reported above the list and in the run record rather than in the Problem column.
NoteTo change a pair's coefficient, double-click its row and type a new one. Enter commits it, Escape leaves it alone, and like everything else here it reaches the workbook only when you press OK. Remove pair deletes the one row you have highlighted; the list takes one selection at a time. Add still refuses an outright duplicate, so two rows can never describe the same pair.
Only the inputs you correlate are affected. Declaring a correlation between A and B does not change C's draws at all, so a before-and-after at the same seed is a fair comparison.
Every sheet that names the sampler also says what you correlated. On a run with nothing correlated the Sampler row says every draw was independent; on a run with something correlated it says how many pairs there were and what induced them, and a Correlated pairs row states the same fact beside it. That row is on the Convergence and comparison sheets too, so a reader holding one of them never has to open another to find out what the Sampler row's claim leaves out.
You declare a Gaussian r, and inducing it costs a little. The rank correlation that actually arrives is (6/pi)*arcsin(r/2), so 0.8 becomes 0.786 - and that is the Expected Spearman column. The table carries Requested r, r used, Expected Spearman, Achieved Spearman and Ceiling (measured) side by side on every row. That much is how the method works, not an error.
A rare Yes-No cannot reach a high correlation with anything, however you declare it. At a 5% chance the ceiling is about 0.38 - an input taking only a few distinct values caps the rank correlation it can reach with anything at all. The editor says so beside the coefficient box before you commit, and the run report fills in its Ceiling (measured) column afterwards when that limit is what you are seeing.
Watch outIf the correlations you declare separately cannot all hold at once, SimuXL neither refuses the run nor chooses one of them to drop. It substitutes the nearest set that CAN hold, runs with that, and says so on the run record.
Watch outIf that happens, the coefficient that ran is not the one you typed, and the difference is not small. A substituted pair is not merely a little weaker than the one you asked for. Declare A and B at 0.9, B and C at 0.9 and A and C at -0.9 - a set no three quantities can satisfy at once - and the run uses 0.5, 0.5 and -0.5. A pair can also come back STRONGER than you declared, or with the OPPOSITE SIGN to the one you declared. Compare Requested r against r used on every row of the run report's correlation table before relying on the result; where they differ, the pair you declared is not the pair that ran.
Input Settings
Lists everything this workbook has saved against its Uncertain Inputs - freezes, correlations, and any name stored by an earlier version of SimuXL - and whether any of it no longer matches the formulas. A model with nothing frozen or correlated stores nothing at all and this report says so. You will find it at SimuXL, Define, Inspect, Input Settings, beside Find Inputs: the two of them report on your inputs rather than on a run.
Watch outIf you edit a formula so that it holds a DIFFERENT distribution than the one a stored setting was attached to, SimuXL refuses the run rather than quietly re-attaching it. Turning =SXL.Triangular(1,2,3) into =SXL.YesNo(0.3) * SXL.Triangular(1,2,3) would otherwise move a freeze from the triangle onto the gate, and a run with a permanently-off risk looks entirely plausible.
11Control variables
The cells that hold a DECISION rather than a chance, so a later comparison can set them by name.
What a control variable is
An Uncertain Input is a chance SimuXL takes for you and an output is a number SimuXL measures. A control variable is neither: it is a lever you set - a markup, a contract type, an escalation rate - held in a cell so that a comparison can set it by NAME, one value per alternative, without touching anything else in the model.
=SXL.Control("Bid Markup", 0.08)
The marker returns the value unchanged, so the cell goes on showing 0.08 and every formula that reads it reads the same number it always did. There is no stored list anywhere - the cells themselves are the definition, so a control survives a row insert, a copy and a sheet rename for the same reason an output does.
Type the value your base case uses into a cell of its own.
Select that cell and press Define ▸ Control Variable.
Press Add, type the name the comparison will use, and press Save.
NoteThe name is typed, not read from a cell. An output may take its name from another cell - =SXL.Output(D1*1.1, H6) - and a control may not. An alternative sets a control BY NAME, so a name that moved when the model moved would put two different things in one column of the comparison without saying so.
What a control variable may never do
A control variable sets a VALUE. It can never change which SimuXL calls fire: a cell whose distributions appeared and disappeared with the alternative would be sampled differently in each one, and the comparison could not say what had changed. To take an uncertainty out of an alternative, freeze that input instead.
This is the one rule worth reading twice, because the most natural-looking lever in a risk register breaks it. A cell like =IF(ActiveVariability="Yes", SXL.Triangular(10, 20, 50), 30) looks like exactly the switch a scenario wants - and it changes whether a SimuXL call happens at all, which is the shape the call-count rule refuses. Put each distribution in its own cell and let the formula choose between those cells.
NoteTo leave a distribution OUT of one scenario, freeze that input instead: it is held at its mean and the call count never changes. A frozen input is held at its analytic mean for the whole run, and the run report and every analysis say which inputs were frozen. It answers "take this uncertainty out of the picture"; it is not a way to make an input take some other value, and the number you get is the distribution's mean rather than whatever your other branch would have returned.
Watch outDo not put a formula in a control variable's cell. An alternative sets a control by REPLACING the value, so a formula there would be overwritten the first time the comparison ran, and SimuXL could not put it back. Put the control in a cell of its own and point the formula at that cell.
What uses them
The Alternatives button lays your controls out as a table, one row each, with a column per alternative - see the Alternative Table section. Set Alternative then puts your model on one of those columns, and Restore Base Case puts it back. Run Comparison runs the whole table in one press - every column, against the same random numbers, and writes the results onto one sheet. What that sheet holds is numbers AND pictures: two charts per output, drawn on the sheet beside the table - see the Alternative Table section. Comparison Report then writes the whole thing as an HTML and a Word document you can send to somebody who does not have your workbook.
A control stays out of every count and every analysis that is about uncertainty - a control cell is not an Uncertain Input, so there is nothing about it for a tornado to rank, and a run behaves exactly as it did before it was defined.
NoteDefining controls today costs a run nothing and changes no result. The marker is not volatile, makes no call of its own, and hands its second argument straight back. A workbook full of control variables simulates exactly as it did before they were defined.
12The Alternative Table
A sheet you type into: one row per control variable, one column per alternative, and a Base case column SimuXL keeps up to date.
What it is
Press Comparison ▸ Alternatives and SimuXL creates a sheet called SXL Alternatives holding one row for each of this workbook's control variables. You add a column for each alternative you want to compare, put its name in the header row, and type that alternative's value for each control underneath.
It is an ordinary worksheet and it is meant to be. You can widen the columns, colour it, print it, put notes beside it and refer to it from your own formulas. It is saved in your workbook like anything else, so it is still there when you reopen the file, and a colleague who opens the file can read the comparison without SimuXL installed.
NoteA table made by an earlier release is still yours. In earlier releases the sheet was called SimuXL Alternatives; SimuXL still finds a table under that name and uses it where it is, and never renames it. Every sheet SimuXL writes for you is now named with the shorter SXL prefix, and a report sheet under its old SimuXL name is replaced the next time its analysis is written.
Typing values without leaving a dialog
Press Comparison ▸ Edit Values and SimuXL shows one alternative at a time: every control row, what the Base case column holds, what this alternative holds, and what each row does in a comparison. Pick a row, type its value in the box underneath, and pick the next one. Change which alternative you are looking at with the list at the top.
NoteEvery value is checked as you type it, the way a comparison checks it. A formula, a cell reference or an empty cell is refused there and then, with the same sentence the comparison would have given you - so you find out while you are typing rather than when you press Run Comparison. Nothing is written to the sheet until you press OK, and OK is refused while any value would stop a comparison.
It types into cells that already exist and does nothing else. It never adds a row or a column, never removes one, and never renames an alternative. Those are done on the sheet - where you can see what you changed and undo it with Ctrl+Z, which you cannot do to anything SimuXL writes.
NoteRenaming an alternative is deliberately not offered here. A name is what SimuXL files a comparison's results under, and changing it would leave results you have already run filed under a name that is gone. Type over the header cell on the sheet if you mean to do it.
NoteThe Base case column is shown and cannot be typed into, because it is SimuXL's: it is redrawn from your control cells every time you press Alternatives. It is there so you can see what each alternative is changing FROM while you type what it changes to. The Status column is not offered either - Hold at Base writes that one.
Watch outIf Excel reads a value differently from the way you typed it, the CELL wins. Type 1-2 into any cell in Excel and it stores a date; type 007 and it stores 7. This dialog writes ordinary cells, so that happens here too - and a comparison uses the cell rather than what the box said. That is why SimuXL reads the sheet back afterwards and names every value Excel stored differently.
NoteA leading apostrophe fixes some of those and not others, and SimuXL says which. It makes the cell hold TEXT - so '1-2 stays the text 1-2 instead of becoming a date. It does nothing for '007, because SimuXL reads 007 as the number 7 either way: there the cell simply SHOWS something else and your comparison is unaffected.
NoteA row SimuXL cannot read is not shown in the dialog, and it says which one. The Status cell is how a row is understood, so a word SimuXL does not recognise leaves it with nothing to act on - it will not guess what you meant and it will not overwrite it. Fix that cell on the sheet and the row comes back.
The three columns SimuXL reads
The table is found by its header row - Status, Control Variable, Base case, in three cells side by side - so you can move the whole thing down or across and SimuXL will still find it. One row says Description, and that row is worth its own heading below.
The Status column
Status answers, for every row at a glance, whether that control is taking part in a comparison. SimuXL rewrites it every time you press Alternatives, and it says one of two things: Defined when the workbook has a control variable of that name, and Not defined when it does not.
NoteNot defined means the row is ignored, not that anything is wrong. It happens most often mid-edit: you remove one control variable and define its replacement, and in between the old row names something the workbook no longer has. A comparison still runs - the row has no cell to write into, so no alternative can set it and none can fail to. Define the control again and the row goes straight back to work with everything you typed in it.
Holding a control at its base value
Sometimes you want a control variable to sit still while you compare the others. Press Comparison ▸ Hold at Base and SimuXL lists every control variable in this workbook with what it does in a comparison beside it. Tick one to hold it at its base value; untick it to let your alternatives change it again.
NoteThe values you have typed for a held control are KEPT, not deleted. That is the whole point of holding rather than deleting the row: untick it and every value on that row is live again, exactly as you left it. Nothing else in SimuXL lets you take a control out of a comparison without losing what you typed for it.
The same thing can be typed straight onto the sheet: put Held at base in that row's Status cell and clear it to release. The button and the cell are the same setting - the button writes that cell, and nothing about a hold is stored anywhere else. So a colleague can read your sheet and see what was held without having SimuXL installed.
NoteIt is a property of the CONTROL, not of one alternative. There is one Status cell per row, so a held control is held in every column. Holding it in one alternative and not another would make the comparison's differences unattributable - you could not tell whether a number moved because of the alternative or because a second control moved with it.
NoteA held row is not checked, so it can be blank or half-typed. Nothing reads its cells. That makes it a good place to park a row you are still thinking about. The one thing SimuXL does keep current on a held row is the Base case column, because the base value is what the run actually uses.
A control variable with no row at all in the table is held too - nothing can change what has no cell - and the list says so. Untick one of those and SimuXL adds its row, holding its base value in every alternative column, and asks first: it is the only thing this dialog does that writes into your alternatives.
SimuXL says which controls are held in three places: the box when you press Alternatives, the dialog before a comparison runs, and the SXL Comparison sheet itself. The last one matters most - it is what tells a reader six weeks later that a control showing the same value everywhere was held deliberately rather than simply not mattering.
Watch outDo not type anything else into the Status column. SimuXL reads Defined, Not defined, Held at base and Description there, and it refuses a comparison over a word it does not recognise rather than guessing what you meant. A blank cell is fine and means the same as Defined.
Note"Held" is not "Freeze / Release", and the difference is the kind of thing being held. Freeze / Release holds an Uncertain Input at its analytic mean - it takes the uncertainty out of a distribution. A control variable has no distribution; holding one keeps it at the value your own cell already carries.
Naming and describing an alternative
An alternative's name is whatever you type in the header row above its column. That is what SimuXL calls it everywhere - in the picker, on the comparison sheet, and in any message about it - so a name you would recognise in a list six weeks from now is worth the ten seconds.
An alternative's description goes in the row whose first cell reads Description, directly under the header row. Alternatives creates that row for you and leaves it empty; type into the cell under an alternative's own column and that is its description. Nothing else has to be filled in, and SimuXL never writes into it.
NoteThe description is what you see beside each alternative when you press Run Comparison. That is the moment it earns its keep: two columns called Option A and Option B are indistinguishable in a list, and "5% inflation, fixed price" and "3% inflation, T&M" are not. It is optional - blank is a perfectly ordinary state and nothing refuses because of it.
A description is text and only text. It is never read as a value, never set into your model, and never compared against anything - so write whatever helps you choose.
NoteA blank row ends the table. Everything above the gap is read and everything below it is ignored. That is deliberate: a gap can mean "and here is a second table", and joining the two silently would put values into a comparison you did not intend.
The Base case column is SimuXL's
Column C is redrawn from your control cells every time you press the button, and it is the only column SimuXL ever writes to. Your alternative columns are never touched. So the base case cannot drift away from your model - if you change a markup in your model next month, press the button and the table catches up.
Adding a control variable later
Define a new control variable and press Alternatives again: it adds a row for it, under the last control, with the control's base value already filled in for every alternative. Type over those cells wherever an alternative should use something different. You never have to delete the sheet to pick up a new control, and your alternative columns survive.
NoteThe new row arrives at the base value everywhere, which is a real setting and not a placeholder. Left alone, it means every alternative uses the base value for that control - the same comparison you would have got before the control existed. Nothing about your existing alternatives changes until you type.
Watch outIf the row directly under your last control is not empty, SimuXL will not add the row and will tell you which control it could not fit. It will not write over what you have put there and it will not insert a row, because inserting moves every cell reference you may have pointed at this sheet. Put a blank row under the last control and press the button again.
Watch outDo not type your own values into the Base case column. They will be replaced the next time you press Alternatives. The base case is whatever your control cells actually hold - that is the point of it, and it is why SimuXL will not let it become a second copy that can disagree with your model.
Putting your model on one alternative
Press Comparison ▸ Set Alternative and choose a column from the list. Every control variable in the workbook is set to that column's value, and any control the column has no row for is put back to its base value - so what your model holds afterwards is that alternative and nothing left over from the last one. Then run a simulation as you normally would.
NoteThis is for looking at ONE case in your own model. Setting an alternative and simulating it yourself leaves the model on that alternative so you can look at your own sheets under it. To compare alternatives against each other use Run Comparison instead - it runs them all against the SAME random numbers, which is what makes a difference between two of them mean anything.
Restore Base Case puts every control variable back. Press it before you save, before you send the file to anybody, and before you trust a number the model shows you - a model left on an alternative still calculates, and the figures still look ordinary.
NoteSimuXL writes down what each cell held BEFORE it changes anything, and it writes it into the workbook. So the base case survives Excel closing, crashing, or the file being reopened on another machine. It has to: a control variable's base value exists in exactly one place - that cell's own formula - and setting an alternative overwrites it.
Watch outIf you type into a control cell yourself after setting an alternative, Restore Base Case will leave that cell alone and tell you so. It puts back only the cells still holding what SimuXL last wrote into them. Your typing is the most recent thing you said about that cell, so SimuXL names it and lets you decide rather than discarding it to tidy up after itself.
Running the whole table
Press Comparison ▸ Run Comparison and SimuXL runs one simulation for the Base case column and one for each of your alternative columns, then writes a sheet called SXL Comparison holding all of them side by side: one row per alternative, the mean and standard deviation, a percentile ladder from P0 to P100 in tens, and how far each alternative's mean and standard deviation moved from the base case.
NoteThe ladder is even on purpose. An uneven one - 5, 10, 25, 50, 75, 90, 95 - is built for finding ONE distribution's tails, which is what each alternative's own run report gives you. Reading three alternatives ACROSS an uneven ladder means comparing gaps of different widths, and the eye cannot do it. With even steps the row itself is the shape of the distribution, and three rows are three shapes you can compare without arithmetic.
NoteEvery alternative runs from ONE random seed, and that is the whole reason to press this rather than run them yourself. Two runs of one model at different seeds differ by sampling noise alone, and on a realistic model that noise is easily larger than the difference you are trying to measure. One seed means every alternative meets the same trials in the same order, so a difference between two of them is a difference between the ALTERNATIVES.
A dialog opens first, listing every column with its description beside it - see Naming and describing an alternative below. Every column is ticked, so pressing the button straight through runs them all; untick the ones you do not want this time - they stay on the sheet, so you never have to delete an alternative to avoid running it. The base case always runs, because every difference on the comparison sheet is measured from it. The trial count is yours to change and starts at whatever Report Preferences says; the seed comes from there too, and the dialog shows you which one it will use. There is no seed box here - a comparison has one seed for the whole batch, so it follows your seed setting rather than asking: a fixed seed or the last run's seed is recorded as (from Preferences), and under a new seed each run SimuXL takes one fresh seed for the whole comparison and records it as (chosen by SimuXL). Nothing is written to your workbook until you press Run Comparison.
Watch outIf you stop a comparison part way, the alternatives that had already finished are still compared and the ones that never started are NAMED on the sheet rather than quietly missing - so the sheet says what it does not cover. Your control variables are put back to their base values however it ends, including a stop and including a failure.
NoteA comparison recalculates your whole workbook every trial, whatever the scoped recalculation box on the Run dialog is set to. Which cells Excel recalculates is worked out from your formulas, and an alternative CHANGES your formulas - so two alternatives could legitimately end up recalculating different sheets, and a difference caused by that is not a difference between the alternatives. It is slower, and it is what makes the answer mean what it says.
A comparison also clears what SimuXL remembers about your last single run, so the Analysis buttons have nothing to work from until you run one again - and neither do any =SXL.Result(...) cells you have written, which report that no simulation is being held until you run one. The Run Comparison dialog says so before it starts, and the comparison sheet says so afterwards.
Every output gets two charts, on the comparison sheet itself. The first is a cumulative distribution - one S-curve per alternative, on one pair of axes. Where two curves CROSS is the finding a table of percentiles cannot show you: it is the value above which the alternatives swap places. The second is a distribution shape panel - one violin per alternative, side by side, with a rule across each at its median. The widths share one scale, so a wider shape is a more concentrated result and a narrower one is a more uncertain result; a violin scaled to its own peak would make every alternative look equally certain. The base case is drawn heavier than the rest on both charts.
SimuXL, Report, Other Reports, Comparison Report writes the whole comparison as a document you can send to somebody - an HTML file and a Word file, both from one press, beside your model and named after it. It is the "SXL Comparison" sheet laid out for a page: the same record, the same alternatives, the same percentile tables and both charts for every output. SimuXL does not re-run or re-measure anything to write it, so a number in the document and the same number on the sheet cannot disagree. Each output prints as one table with your alternatives across the top and the statistics down the side - so reading down a column is one alternative's distribution and reading across a row is what one percentile does as the alternative changes, which is the comparison. A comparison of more than seven alternatives is wider than a page, so it is printed in parts with the statistic names repeated on each and a line saying which columns you are looking at.
NoteThe document is written from what SimuXL kept when the comparison ran, so you can press it an hour later without re-running - but Release Data forgets it, and so does closing Excel. What it keeps is the sheet's rows and the points the charts are drawn from, never the alternatives' per-trial values, which is why it costs kilobytes rather than the hundreds of megabytes a comparison itself can hold.
NoteNo chart is drawn at all when the alternatives did not keep their per-trial values - the sheet says so where the charts would have been, the document says the same thing where its pictures would have been, and the tables are unaffected either way.
NoteA row naming a control this workbook does not have is IGNORED, and the comparison still runs - see the Status column on that sheet. What IS refused is a value SimuXL could not write into a cell: a formula, a cell reference, or an empty cell on a row that is not held. Press Alternatives to see the list; it also appears on the sheet's own top row.
13The analyses
The ways to see what your model does, two ways to write the whole run up, plus the raw data. None of them edits your model.
Watch outIf you open the Tornado and not Impact, you are looking at half the evidence. They answer different questions and can rank the same model completely differently - that is the point of having both, and it is the most common reason a SimuXL user concludes something is broken. Interpreting results says which to trust when.
NoteEach of these is a ribbon button you can press whenever a run is in memory. You can also have SimuXL build them automatically, the moment a simulation finishes - see Preferences and percentiles - which saves pressing the buttons. You do not need to do that to get them into the HTML Report: the report works out the tornado, the tail drivers and the Input Summary for itself. Impact is the one exception, because it cannot be worked out from a stored run at all.
Convergence - was this run long enough?
Re-measures the last simulation after fewer trials and reports how much each output's answer was still moving. Nothing is re-simulated - it reads the values the run already kept. What a row is depends on how the run was drawn, and the sheet says which it did: on a plain Monte Carlo run each row is half the one below it, and on a Latin Hypercube run each row is one more of that run's own designs.
A chart beside each output's block draws the same six lines the report's convergence figure draws - the mean, its 95% band, and the three tracked percentiles - on the same span, so the sheet and the report are one picture of one run.
On a plain Monte Carlo run the mean gets a 95% band, and that band is arithmetic: it shrinks as the square root of the trial count, so four times the trials halves it and a hundred times narrows it tenfold.
On a plain Monte Carlo run a percentile gets no such band, because there is no formula for one that survives a distribution with a gate in it. What is reported instead is how far each tracked percentile moved when the trials were doubled, measured in standard deviations of the output itself.
The mean settles first and the tail settles last, and the tail is usually the number that gets quoted. A run whose mean is settled to a tenth of a per cent can still have a P90 that moves visibly every time you lengthen it.
NoteOn a Latin Hypercube run the percentiles DO get a band, and that is the one thing this measurement can do that the plain sampler cannot support. Such a run is laid out as several independent designs; each design is a complete simulation on its own, so their answers are that many independent goes at the same question, and the spread of those answers is a real standard error - for the mean, and for P10, P50 and P90 alike.
NoteThe doubling comparison is still made as well where the designs divide in two - between half the run's designs and all of them - and the sheet says when they do not.
Watch outIf you read a percentile band as the whole uncertainty, you will under-state it. Measured against 400 independent runs of three models, those bands came out at 0.89 to 1.00 times the true standard error at P90 and 0.84 to 0.96 at P99 - so the real uncertainty is up to about an eighth wider than a P90 band says. Read one as a lower bound; the sheet says so too, above the numbers.
NoteEach design estimates its own percentile from its own trials, so those estimates are themselves noisy, and the spread of noisy estimates understates the spread of the real thing. That is the whole of the reason.
NoteAnd it measures what the even spreading actually bought YOUR model. The mean is the one figure with two estimates of its own error: the textbook one, which assumes every trial is independent, and the between-design one, which assumes nothing. Independence is exactly what Latin Hypercube gives up, so the gap between them is what the even spreading bought. SimuXL reports it per output, on your own model, and reports it as a VARIANCE ratio - the square of the gap between the two error figures, so an error a hundred times smaller is ten thousand times the precision.
NoteRead that multiple as approximate: at twenty designs it carries about a third of sampling error of its own. A multiple near 1 is a finding, not a fault - it is what happens when an output is driven by many inputs at once.
Watch outIf you apply the square-root rule to a Latin Hypercube run's mean, you will get the wrong answer. SimuXL prints the measured band instead, because the textbook formula assumes independent trials and would overstate the error on a stratified run - on the reference model, by about a hundredfold. More trials still narrow it; how much is a property of your model rather than of arithmetic.
Watch outIf your model has a rare risk gate in it, none of this describes its tail - and the sheet names any gate whose rarest outcome happened in fewer than 30 trials. A gate that reached 30 is not named, and that is not a clean bill of health - it is the check declining to call 30 firings too few to say anything about.
A Yes-No at 1% fires about 10 times in 1,000 trials, and the whole upper tail of anything it drives was built from those 10 while the mean looks beautifully settled - so the sheet names it. Scale the trial count against the number of times the rare outcome actually happened, not against the trial count. If the run did not keep its input draws this check could not run at all, and the sheet says so rather than reporting no gates.
Watch outIf a run EXCLUDED trials, Convergence refuses it. An excluded trial leaves no gap where it was - the trials after it move up - so SimuXL can no longer say which trial belongs to which design, and every figure here is measured at those boundaries. Fix what made those trials fail, or run with Latin Hypercube unticked.
NoteA run you STOPPED is measured on the designs that finished, and the sheet says how many trials it left out. Stop lands wherever you pressed it, so the last design is usually part-built - and a fraction of a design is not a smaller design, it is trials whose slices were laid out for a length the run never reached.
NoteIt needs the run's per-trial values, so Release Data makes it unavailable until you run again - the same as the Tornado, the Tail Drivers and Export Trials.
Histogram - the distribution of each output
The first thing to look at, and usually the only picture a reader wants. One chart per output cell: columns showing the SHARE OF TRIALS that landed in each bin, and the cumulative curve on the right-hand axis. The columns sum to 100% - they are not a density, whose height would change with the bin count.
NotePreferences > Charts decides what is drawn on it, and any single output can override it under View Results, Configure this chart: a line at any percentile you name with its value printed on it, a two-tone fill either side of one of those markers, and which colour pair to use. The shaded area above the marker IS the contingency - that is what makes this one picture answer "how much do I need, and above what?".
NoteThe marker is computed from the trial data by the same code the percentile tables use, never read off the drawn bars, so it cannot disagree with the numbers beside it.
View Results - the same picture, in a window, writing nothing
Every other analysis opens a workbook the moment you press it. This one opens a window instead, and writes NO SHEET until you press Write to sheet - which then produces the same sheet the Histogram button produces, from the same code and the same preferences. So you can try six parameter sets without collecting six workbooks to close.
The window is modeless - leave it open, change a parameter in your model, run again, and open a second one to compare. Each window keeps the run it was opened on and can say which: the run time and the seed are the first two rows of the Statistics panel, which you reveal with the Percentiles and Statistics boxes. That matters because two histograms of one output from two seeds look identical at a glance and mean different things.
It has four tabs - Distribution, Tornado, Impact, Tail Drivers. The three analysis tabs show the same TABLES their ribbon buttons write, as read-only grids, and each carries its own Write to sheet handing off to that button's own writer. One difference from pressing the button: a tab always covers every output of the run, because a window with no picker in front of it can only mean all of them, where the ribbon button asks you which to include first. Impact measures HOW FAR one input can move an output; Tornado measures how CONSISTENTLY the output follows it. They can rank the same model differently, and reading one without the other is the most common reason a model looks broken.
NoteTornado and Tail Drivers are computed from the run this window is showing, the first time you look at the tab. Tail Drivers uses your current tail percentiles and percentile direction; Tornado has no preferences of its own.
NoteImpact is different in kind: it never looks at the trials at all, it drives each Uncertain Input over its range and recalculates your workbook at each swing point - roughly 0.2 seconds at 100 inputs and 15 seconds at 1,000, where the other two cost milliseconds. So that tab shows an Impact that has already been measured, and otherwise tells you which button makes one.
NoteEvery analysis tab has a Refresh, because a tab is built once and kept. Press it after changing a preference the tab reads, or after measuring an Impact while the window was open. A window whose run has since been superseded by a newer simulation says so rather than showing the newer run's Impact under an older run's chart.
Each analysis tab opens on its CHART, with its table behind a Show table box. Tick Show table and the same grid appears underneath it, on the same tab, listing the rows the analysis kept; untick it and the chart has the tab to itself. The chart is re-laid either way, so revealing the table shrinks the picture rather than covering it. Every tab starts with the box clear, including the next window you open, and it changes only what you are looking at: the analysis, the sheet Write to sheet produces, and every number in either, are the same whether the table is showing or not.
NoteEvery grid says how many rows it is showing of how many there are. Each of these analyses lists only its top rows per output - the analysis itself does the capping, so the sheet shows the same rows the tab does - and a reader who cannot see that a 347-input model is showing twenty will read the twenty as the whole answer.
Configure this chart - and where a base value lives
Configure this chart... in the viewer sets one output's OWN chart settings: its base value, and optionally its own markers, shaded split and colour pair overriding Preferences > Charts. Pressing Save there stores them in your workbook - that is the one thing this window writes, and it writes it so the setting survives closing Excel. Cancel writes nothing.
NoteA base value cannot be a workbook-wide preference, and that is why it is here rather than on a tab. It is denominated in one output's own units - a model whose outputs are a cost in millions and a duration in days has two base values with nothing to do with each other, and one shared number would be wrong on at least one of them. Markers and colours are house style and do sit on the tab; a base value is data.
On a DATE output there is a date picker beside the box, and the two are live together. Pick a date and the box fills in; type a date - or the Excel serial number - into the box and the picker moves to it. They are the same value said two ways, and whichever you use is what gets stored. ⚠️ Excel's calendar starts on 1 January 1900, and SimuXL's now starts there too. A date before that has no Excel date number at all, so typing one is refused and the box says so. A NUMBER below 1 is not a date either: it stays a number in the box, which is where a plain figure belongs on any output. Excel also carries a date number 60 for a 29 February 1900 that never happened - a quirk it has kept since the 1980s - and no picker can show a day that does not exist, and typing that date is refused with a sentence of its own - not because Excel lacks the day, but because Windows does, so there is nothing for the box to read it back as or for the picker to show. Its Excel number is 60, and typed that way it is taken and kept as the number. ⭐ Charts and reports then DRAW it the way Excel does, as 29 February 1900, because the cell on your sheet does. ⚠️ The picker cannot be scrolled back past 1 January 1900, or past whatever later date your own regional calendar begins at. A cost output and a clock-time output get no picker, because neither is a date.
A base with a time of day is rounded to midnight. If a stored base carried a fraction of a day - noon on 25 January reads 44951.5 - the box shows 1/25/2023 and pressing Save stores the date. Nothing on a chart shows a time of day, and a base value that is half a day off the date beside it is a difference nobody can see and everybody has to explain.
The line is called "Base" by default, and there is a User defined label box if you want it called something else. A base read from your workbook as it stands is called "Base" too - the chart label carries the VALUE, and the sentence under the chart says where the number came from, because a derived figure should not read like a stated one and a bracket on the label is not where that belongs. It used to read "Base (at rest)"; those ten characters made the label too wide to sit beside its own line on a chart with a shaded split, so it was drawn across the plot from the line it names.
Watch outIf you mean "Base Estimate", type it - SimuXL will not write those words for you. In cost estimating that is a defined deliverable, the cost with no risk or uncertainty applied, and it is frequently NOT what your workbook computes at rest. Whatever you type names the LINE only, because the histogram sheet always states where the number came from in its own row.
The rule is dashed, so it cannot be mistaken for a percentile marker's solid rules.
A base outside the distribution is drawn anyway, and the chart stretches to reach it. The columns fill the span between the outer edges of the grid - which is not always your smallest and largest trial: with no shaded split it is exactly those two, and with a shaded split the whole grid is nudged so a column edge lands on the split value, which puts the first edge a little below your minimum and the last a little above your maximum. A base outside that span is still drawn: SimuXL adds empty bins until the grid reaches it, so the distribution is squeezed into part of the plot and the base line sits out in the empty part, which is what shows their relationship. It will not squeeze the distribution below a quarter of the width. Past that the value is stored and not drawn, and Configure this chart... says so, names how far out you went, and prints the furthest figure that would draw.
The value is a row on the histogram sheet as well as a rule on the chart, because a rule can be clipped and the label carries a claim a reader has to be able to check.
A nominated cell has to name its sheet - Cost!$B$4, not $B$4. An unqualified address means a different cell depending on which sheet happens to be in front when the chart is drawn, and a base value that moves is not a base value. The … button beside the box fills it in correctly for you.
Tornado - how CONSISTENTLY each input drives each output
Ranks the Uncertain Inputs by how reliably the output follows them, using signed rank correlation. It ignores size: an input that always nudges the answer a little in the same direction scores highly.
Each row names the input twice: the Uncertain Input column is its NAME if it has one, and the Cell column beside it is always the address. An input you never named reads the same in both, which is the point - the name column falls back to the address, so without the second column a NAMED input had nowhere to say where it lives. The same pair appears on the Impact and Tail Driver sheets, in the HTML report and in the Word report.
One column is headed Contribution to Rank Variance, and the word Rank is load-bearing. It is not a decomposition of your output's actual variance, and the sheet says so in its own words. The Highest |ρ| possible column beside it is filled in when an input's rank correlation is capped by how rarely it varies rather than by how little it matters - the figure is the largest |ρ| that input could have reached with this output at all.
Impact - how FAR each input can move each output
Swings each input across its whole range, one at a time, and reports what each output did in its own units - dollars, weeks, whatever your model produces. It ignores likelihood.
It needs no simulation. It re-evaluates your live model, so you can press it on a workbook that has never been run. The base case is your workbook exactly as it sits, with every uncertain quantity at its average.
Watch outIf your model bends, the base case is not the answer's average and cannot be, whichever way it bends. Impact then measures every swing from a point your output may almost never occupy, which is a real question and is not the same question as "what will this cost on average" - see When the at-rest value is not a base case, in the Contents.
NoteThe swing is over the input's whole range, never over its percentiles. A Yes-No that fires 5% of the time has the same value at its 10th and 90th percentile, so a percentile swing would draw a zero-length bar for the input that produces the entire upper tail.
Watch outIf the input is a Normal or a Lognormal, the bar is a 3-sigma swing rather than a whole range, and the report says so beside those rows. A Normal has no bounds at either end, so it swings its mean plus and minus 3 standard deviations - the middle 99.7% of it.
Watch outIf the input is a Lognormal, those 3 sigmas are on the LOG scale, so the bar cannot be reproduced by adding 3 times the StdDev you typed. A Lognormal is NOT unbounded: it is bounded below by zero, which it can never reach. It swings the same middle 99.7% measured on the log scale, from exp(m - 3s) to exp(m + 3s) where m and s are the mean and standard deviation of the LOGARITHM of the value rather than the two numbers you typed - so BOTH ends of its bar are positive. That is not the mean minus 3 standard deviations, which for a skewed Lognormal is a negative number the distribution can never take.
Tail Drivers - what actually ran atypically at each END of the range
Takes the trials where an output landed in its lower or upper tail, and reports which inputs ran unusually high or low in those trials. Unlike the other two this looks at what happened rather than at what could. Which end is the good news is a property of your model and SimuXL does not assume it - on a cost or a duration the lower tail is the good news, on a revenue or a schedule float it is the upper one.
Two tables per output, one per tail, and they routinely have different winners. They are different sets of trials, not two views of one ranking.
Rows marked ~ are inside the noise floor. With many inputs and few trials, an input entirely unrelated to the output still shows a shift by chance, and a top-five table shows the largest shifts - which is exactly where noise wins. Each row carries in the Noise floor (SD) column the floor it had to clear. That is the same figure on every row unless an input is extremely lopsided, because only a very skewed input reaches further by chance in the direction it leans - so a column reading the same on every row is the ordinary case and not a fault. It is a rough guide, not a significance test: roughly one unrelated input exceeds it anyway.
A negative bar means the input ran LOW in that tail, not that it pushes the output down. The chart title names the tail.
Input Summary - what each input actually drew
One row per Uncertain Input with its realised average, standard deviation and percentiles against the theoretical values, plus a histogram for the ones you tick. This is where you check that a distribution was sampled the way its formula says - a parameter error is far easier to see than to calculate.
State
What it means for the figures on that row
Sampled
Every parameter was either typed into the formula or points at a cell holding a number somebody typed. The analytic mean and SD printed beside the realised ones are exact, so comparing the two is a real check that the input was sampled where it should have been.
Sampled - analytic is a snapshot
At least one required parameter did not resolve to a cell holding a number somebody typed - it points at a formula, at an empty cell, or at something SimuXL cannot follow to a single cell (an expression, a defined name, or a reference it could not resolve). The analytic figures come from a single recalculation at harvest time, so they are a snapshot and the gap between them and the realised ones is not evidence of anything. Tick that input's histogram and its own block names which parameter and which cell.
FROZEN at the analytic mean
The input was not sampled at all: it was held at one value for the whole run. Its realised mean IS the analytic mean, its SD is 0 and its histogram is a single bar, all by design. This wins: an input that is both frozen and reads a parameter from the model reads frozen, because parameters it was never drawn from decided nothing.
Watch outIf a parameter points at a formula that depends on another distribution, that check does not apply to that input and the gap you see is not evidence of anything. The theoretical figures are worked out from the values SimuXL read when it scanned the workbook, so that input has a theoretical figure from one recalculation and a realised one from a parameter that moved on every trial.
NoteSimuXL works this out for you. While it scans, it follows every required parameter to the cell it points at. A cell holding a formula - or an empty cell, which Excel hands a function as zero without saying so - makes the row read Sampled - analytic is a snapshot; everything else reads Sampled and its two figures may be compared.
NoteA parameter SimuXL cannot follow to a single cell is marked the same way - an expression, a defined name, or a reference it could not resolve - because the analytic figure is a snapshot either way. Tick that input on the histogram picker and its own block names the parameter and the cell.
NoteOn a model with more than 25 inputs the histograms start unticked and the dialog says why. One chart per input on a thousand-input model is a thousand charts on one worksheet. Every other picker in SimuXL opens fully ticked; this is the one place a default that big would be a trap rather than a default.
HTML Report - the whole run in a browser, for checking
Writes the run record, the statistics, a distribution chart for every output (unless you switch the charts off) and whichever analyses you selected into one self-contained HTML file - the charts are inside it, so there is nothing to go missing. It lands beside your model, named after it, and opens in any browser. If the workbook has never been saved there is nowhere beside it to go, so the file joins the log under %LOCALAPPDATA%\SimuXL\ - and SimuXL tells you the exact path either way.
This is the one to LOOK at. You cannot edit it and it will not drop into a document you have to hand on, so it is not the file to write when somebody needs a report they can work with - use it to check the run reads the way you expect, then write the Word Report. It opens in any browser without SimuXL or Excel, and the charts are vector, so it prints and zooms without going fuzzy. Nothing in your model changes, and every figure comes from the run already in memory - SimuXL does not recalculate your model to produce it.
NoteThe Report tab of Preferences decides what is in it. The Tornado, Tail Drivers and Input Summary are arithmetic over the run in memory, so the report computes any of them itself if they are not already built. Impact is different: it can only appear if it was actually run, because producing it means recalculating your model rather than reading the run. Tick it on the Analyses tab too. The report ends by naming whatever it left out, and why.
Word Report - the same run, for pasting into your own document
SimuXL, Report, Other Reports, Word Report writes it - it sits in that menu because the one-click slot went to the look-check, and it is still the report to hand on. The same report as the HTML one, from the same run, written as a .docx. It is not a picture of a report: the headings are real Word headings and the tables are real Word tables, so you can open it, copy the run record or the percentile table straight into a chapter of your own document, and restyle it to your house style in one action. Named after your model and written beside it, exactly as the HTML report is.
Every chart is in it too, drawn into the document as a picture at print resolution - the same chart the HTML report shows, from the same run, because the picture is rendered from that report's own figure rather than built a second time. Click one and Word will let you resize it or drop it into a different document; it is an ordinary inline picture.
NoteWhich one do you want?Word Report is the one to hand on: it is the report you can edit, restyle and drop into a document somebody else owns, and it is what most organisations can take into their own workflow. The HTML file is the look-check - the same report, from the same run, rendered so you can read it in a browser before you write the document. It opens anywhere and its charts zoom and print without limit, so it is a good thing to show somebody who only needs to READ the run; it is not a file they can work with.
Watch outIf SimuXL cannot draw one of the charts it says so where the chart belongs, and gives the reason - it does not leave a gap, and it does not fail the whole document over one picture. SimuXL says how many charts the document ended up with every time, whether that is all of them, some of them or none.
NoteChart labels are drawn from a font SimuXL carries, which covers the Latin alphabet, accented letters and the symbols SimuXL itself uses. If you name an Uncertain Input in another script those characters appear as boxes on the chart, SimuXL counts them and says so, and every table beside the chart still reads correctly.
Export Trials - the raw numbers
Every trial's input draws and output values: one row per trial, one column per input and output. This is the data behind every SimuXL chart and statistic, and it is the only SimuXL output meant to be read by a program rather than a person.
To a new workbook, as two sheets - the record, and a data sheet whose first row is the header and second row is data, so "Save As CSV" works.
Or straight to a CSV, with a plain-text record written beside it. Both land in your model's own folder and are named after your model.
Numbers are written at full precision with no formatting, because thousands separators and four decimal places are correct for a person and a lie to a machine.
A worksheet holds about a million rows and 16,384 columns. If your run has more trials than the one, or more inputs plus outputs than the other, the worksheet option is disabled and says which limit it hit - before you choose it, not after.
Release Data - give the memory back
SimuXL keeps a run's per-trial data in memory afterwards: every input's draws, so the analyses can rank them, and every output's values, which are kept whatever else happens. On a large model that is a lot of memory - above a few hundred megabytes SimuXL asks before the run, and above its ceiling it runs WITHOUT retaining the draws and says so, in which case the per-input analyses are unavailable for that run - though the output values are still held. Release Data frees it and reports how much.
NoteAn open View Results window keeps its own copy of the run it is showing, and a new run does not free that one - the window is still using it. Release Data counts what those windows hold and says so, but it will not close them for you; closing a window is what releases its copy.
NoteIt deletes nothing. Every sheet, chart and report the run produced stays exactly where it is - what goes is the data held in memory, so the per-input analyses have nothing to rank until you run again.
Watch outIf your last run happened in a DIFFERENT workbook, these commands refuse. The Tornado, Tail Drivers, Input Summary, Export Trials and the HTML Report all read the last run, and the last run is one per Excel session rather than one per workbook - so they refuse and say so rather than writing that run's numbers into this model's report. Impact is the exception: it reads no run data, so it never refuses on these grounds.
14Interpreting results
Which number to quote, which analysis to believe, and what a reader needs in order to check you.
The summary table
Every run opens with one row per output and these columns: Output, Trials, Mean, Std Dev, Minimum, P5, P10, P25, P50, P75, P90, P95, Maximum. They are not equally useful, and which one matters depends on the decision you are making.
Figure
What it tells you
When to care
Mean
The long-run average of your output. It settles first and it is the most stable figure on the sheet.
Budgeting across many similar items, where the overs and unders genuinely offset. It is rarely the number to commit to on a single project.
Std Dev
How wide the answer is, in your output's own units.
Comparing two options, or two versions of one model. On its own it says nothing about which direction the risk lies in.
P50
The middle: half the trials came out below it.
"What is the honest expectation?" On a right-skewed cost model the P50 is below the mean, and the gap between them is itself worth reporting.
P75, P90, P95
A confidence level. P90 is the value 90% of trials fell at or below.
Contingency and commitments. This is the number that usually gets quoted, and the one that settles last - check Convergence before you rely on it.
Minimum and Maximum
The lowest and highest single trials that happened to occur.
Sanity-checking that your model does not do something absurd at the edges. Never quote them as a range - they are the extremes of these trials, and they get wider the longer you run.
Watch outIf you quote a percentile without saying which convention you used, half your readers will read it backwards. Under Below - the default - P90 is the value 90% of trials fall at or below. Under Above the same label means the value exceeded 90% of the time. Every SimuXL sheet prints its own convention in full for exactly this reason; a slide does not.
NoteThe gap between the mean and the P50 is a finding, not noise. A cost model whose mean sits well above its median is telling you the upper tail is doing the work, which is usually a handful of risks rather than general uncertainty - and the Tail Drivers will name them.
Which analysis to believe
Four analyses rank or bound the same model, and they will not always agree. Disagreement between them is information; it is not a sign that one of them is broken.
The question you are asking
The analysis
What it ignores
Trust it when
"Which input do I most reliably move the answer with?"
Tornado
Size. It scores consistency, not magnitude.
Inputs vary on most trials. It systematically under-rates a rare risk gate - see When something looks wrong.
"Which input could move the answer FURTHEST?"
Impact
Likelihood. A one-in-a-thousand catastrophe scores its full swing.
You want to know where to spend design or mitigation effort. It needs no run at all.
"What actually went wrong in my bad cases?"
Tail Drivers
Everything outside the tail. It reads only the trials in the tail you named.
You have enough trials in that tail. Rows marked ~ are inside the noise floor and should be read as "not established".
"Have I run this long enough to quote it?"
Convergence
Whether the model is right. It measures sampling noise and nothing else.
Always, before quoting a tail percentile. A settled mean says nothing about a settled P90.
NoteThe Tornado and Impact ranking a model differently is the normal case on a risk register, not the exception. A high-probability nuisance leads the tornado; a low-probability catastrophe leads Impact. Each sheet names the other and says what it answers.
Making a result defensible
A SimuXL run is reproducible exactly - not approximately - by anyone who has your workbook and three facts: the seed, the sampler and the trial count. All three are on the run record of every artefact SimuXL produces, which is why the run record is the part of a report worth keeping rather than the part worth trimming.
Type a seed for anything you will compare against or quote. A clock seed is recorded and reproducible after the fact, but a typed one means the run you meant to make is the run you made.
Say which sampler. Plain Monte Carlo and Latin Hypercube at one seed are two different runs - see Latin Hypercube.
Keep the HTML report, not a screenshot. It is one self-contained file, it carries the run record, the statistics and the charts, and it opens on a machine that has never had SimuXL installed.
Note what was frozen. A run with an input frozen is not a full simulation, and every report marks it - but only the report you kept can tell anyone that.
Watch outIf you add or remove an Uncertain Input and re-run at the same seed, it is not a controlled comparison. Every input after the one you changed shifts position in the random stream and draws different numbers. Freezing one, by contrast, is safe: a frozen input still consumes its own draw and discards it.
15Preferences and percentiles
Which analyses run, where they go, what the report carries, and what P90 means - stored per workbook, apart from five that follow you instead.
Preferences > Report on the ribbon, and Preferences beside Run Simulation, open the SAME dialog on different tabs. Six tabs. It decides which analyses SimuXL builds for you after a simulation, where their sheets go, which of them the HTML Report carries, and how percentiles are worded.
Simulation - what the Run dialog opens with
The Simulation tab sets the trial count the Run dialog suggests, and which seed it offers - a new one each time, the last run's, or a fixed number you choose. Neither decides anything: the Run dialog still asks, and a run uses whatever you leave in its boxes.
NoteFive settings follow YOU between workbooks rather than living in this file - the trial count, the seed, where analysis sheets go, whether a summary window appears when a run finishes, and whether SimuXL checks for updates once a week. Everything else stays in the workbook and travels with it. A workbook that stores its own always wins, so opening a colleague's model still runs it their way.
To set them: tick Also save the trial count, seed, sheet destination, summary window and update check to my MACHINE at the foot of the dialog - below the tabs, beside Save - and press Save. They are written to SimuXL_Defaults.txt, beside the log, so a brand new workbook does not start from scratch. The settings line on every analysis sheet names which of the sources it actually read.
The same tab carries Show a summary window when a run finishes and Check for updates once a week when Excel starts, in a box captioned These settings follow ME, not this file because both live only at machine scope - no workbook stores either. The summary window itself offers to stop appearing after every run; its tick is the way back on. A run that was stopped, that failed, or that excluded any trial still shows the window whatever this says, because those are the runs whose outcome you cannot infer from the sheet. The update tick is described under the section named Checking for updates.
Errors - what a run does with something it cannot use
The Errors tab holds the two settings that decide whether a run happens at all: Stop the run on a calculation error, and Refuse to run when a worksheet could not be read. Both are stored in the workbook, because each is a judgement about the model rather than about you - see Rules SimuXL enforces for what each one does.
Analyses - what happens after a run
Tick the analyses you want built automatically, immediately after each simulation finishes: Tornado, Impact, Tail Drivers, Input Summary. They are the same analyses as the ribbon buttons, over every output, with no picker to answer - so ticking them here saves pressing four buttons after every run. Nothing is ticked to begin with: leave them all clear and a run behaves exactly as it always has. The one thing this is needed for is Impact in the HTML Report, which cannot get there any other way except by pressing Impact on the ribbon afterwards.
Watch outIf you tick Impact, expect a run to take longer - sometimes longer than the simulation did. It recalculates your live model once for the base case and then once for every value each Uncertain Input is driven to. When the estimate is over five seconds SimuXL quotes the recalculation count and the time before spending any of it, and Cancel there skips Impact for that run only. The other three read the run already in memory and are effectively free.
NoteTicked here, the Input Summary draws a histogram for every input only on a model of 25 Uncertain Inputs or fewer. On a larger model it builds the summary table alone and the run's notes say so; press Input Summary on the ribbon to choose which inputs get a chart.
NoteWhere only some of the options in a group have more to say, a small blue circle with an "i" in it follows the ones that do. Rest the pointer on the mark - or on the option itself - or click the mark, and SimuXL shows the explanation. Clicking the mark never changes the setting it sits beside. Elsewhere there is no mark: rest the pointer on an option or a box, and if it has an explanation SimuXL shows it.
The same tab chooses where SimuXL writes its sheets: a sheet in this workbook - the default - replaced on each run, so a hundred runs leave one sheet rather than a hundred workbooks; or a new workbook each time, if you would rather each result arrived somewhere it can be thrown away without touching the model it measured. This covers the Trial Run report you get after every simulation, not just the four analyses - which matters if you run a model dozens of times in a sitting and would rather not collect dozens of workbooks. SimuXL's own sheets are named so it can recognise and skip them, so putting them here does not confuse a later harvest.
NoteA sheet in this workbook is replaced, not appended to. That is what keeps a workbook from growing a new Tornado sheet every run, and it means last run's sheet is gone once the next one finishes. If you need to keep one, copy it or use the new-workbook destination.
SimuXL's own sheets are named SXL; earlier versions named them SimuXL, and the change was made to keep the worksheet tabs narrow - so what was SimuXL Histogram is SXL Histogram. A workbook carrying the old names is still read correctly: every one of them is still recognised, and still skipped when SimuXL harvests your model. What changes is the first run after you upgrade - the old sheet is removed as its replacement is written, so you are never left with two Histogram tabs disagreeing with each other.
Watch outIf a formula, chart or named range of your own points at one of the old sheet names - ='SimuXL Histogram'!B5, say - it stops resolving the first time you run that workbook under the new names, because the old sheet is removed as its SXL replacement is written. Point it at the new name. Nothing you typed is removed: the one SimuXL sheet holding what you entered is SXL Alternatives (SimuXL Alternatives in an older workbook), and a sheet you own is never one of the ones replaced.
Report - what the HTML Report contains
The Report tab is a checklist of the sections the HTML Report writes: a distribution chart for each output, the Tornado, Impact, the Tail Drivers, the Input Summary and the listing of every Uncertain Input. Untick the charts for a numbers-only report. The report ends with a short paragraph naming whatever you left out, and why - so a reader can never mistake an omitted section for an analysis that found nothing.
Watch outIf you tick Impact here but not on the Analyses tab, the report says Impact was requested and not available. The report is built from the run in memory and never re-evaluates your model, so it will not quietly spend a minute of your model's time to produce it. The other sections are computed from the run if they are not already sitting there.
Percentiles - the tails, and Below or Above
The Percentiles tab holds the presentation choices the analysis sheets make: which way round a quoted percentile reads, which percentiles define the lower and upper tails, and how many drivers each tail table shows.
Every option here is stored in the workbook, not in the add-in, so it travels with the file and two models can disagree. Five exceptions can also follow YOU - the trial count, the seed choice, where analysis sheets go, whether a summary window appears after a run, and whether SimuXL checks for updates once a week - used only by workbooks that have not chosen for themselves. Percentile direction deliberately cannot: it decides what P90 MEANS, and one workbook must not read two ways on two machines. That is the test the whole split applies - a setting may follow you only if it changes how you WORK without changing what any number or any sentence means.
An option is written only when it differs from what this workbook would otherwise inherit - from the older VBA add-in's settings if it has them, then from your own machine defaults, then from SimuXL's built-ins. So a model that agrees with all of those stores nothing at all, and the dialog says so; and choosing SimuXL's own default AGAINST a machine default of your own is a real choice, so it is written down.
If you set the percentile direction in the older VBA add-in's Simulation Settings, SimuXL reads that too. The Input Summary and the Tail Drivers print which source they read it from - the workbook, the older add-in, your machine, or the built-in - on the sheet, beside the numbers. They are the two sheets a percentile setting changes.
Nothing here changes a sheet that already exists. Run the simulation again, or rebuild an analysis, to see a change applied.
Watch outIf you press Preferences while a report workbook is in front, SimuXL refuses and tells you to activate your model. With the new-workbook destination an analysis opens its result in a workbook of its own, and pressing a ribbon button that goes there makes it the active one - so the sequence of building a report, reading it, and pressing Preferences would store your choice in a scratch file you are about to close. A report workbook is one whose sheets are ALL SimuXL's own, so keeping analysis sheets in your model does not trip it.
Below or Above: the one setting worth understanding
Below (the default) is the ordinary reading: P90 is the value 90% of trials fall at or below - Excel's PERCENTILE.INC. Above reads the label from the other end: P90 is the value exceeded 90% of the time, which is the ordinary 10th percentile. Same data, opposite wording, and each sheet prints the sentence in full so there is never any doubt.
It never changes your model, and it never changes which trials an analysis looks at. What it changes is which percentile a label like P90 refers to - so a sheet that quotes percentiles will show different numbers under it, because it is quoting different percentiles of the same data. The table below says which sheets those are.
Sheet
What the setting does there
Input Summary
Changes the numbers shown. Its percentile columns are a way of describing the data, so under Above the whole decile table becomes the mirror image of itself and each histogram's cumulative curve descends instead of rising.
Output Histogram
Changes the numbers shown. Its P0 to P100 row is a way of describing the data, so under Above it reverses end for end, and the sheet says above the row which end is which.
Comparison
Changes the numbers shown. Every output block carries the same P0 to P100 ladder, read ACROSS one alternative and DOWN between them, so under Above every one of those rows reverses. Its record row states the convention and which end of the ladder is which.
Convergence
Changes the numbers shown. Its tracked percentile columns follow the setting like any other quoted percentile, and the sheet prints its own convention above the table.
Tail Drivers
Changes only the wording. The tail percentiles decide which trials are in the analysis, and the worst trials are the worst trials however you choose to describe them. Every number on the sheet is identical either way.
Export Trials
Nothing. It quotes no percentile at all, and the record says so out loud so a reader who has seen the sheets above it is not left wondering.
The run report
Nothing - it is a historical record. Its percentiles were computed during the run, so it states which convention it used rather than following the current setting. Two sheets that disagree should be able to tell you whether they really disagree.
NoteIf two SimuXL sheets seem to contradict each other about a percentile, check this table before anything else. Each sheet states its own convention precisely so this is answerable - and every sheet that prints a P0 to P100 ladder also says which end of it is which, because the headings read P0 to P100 in that order under BOTH conventions and only the numbers underneath move.
16Older workbooks
If you defined inputs through the older SimuXL's Define Input dialog, convert them once.
Earlier versions of SimuXL stored an input's distribution in a hidden table and tinted the cell. This build reads distributions from the formula instead, which is why an assumption is now legible in the formula bar rather than being a shaded cell with a number in it.
Convert (no ribbon button - run it from the VBE Immediate window, exactly as the note below says) rewrites each dialog-defined input as the matching SimuXL formula and carries its name, freeze and correlations across.
NoteThese two commands have no ribbon buttons, and their keyboard chords are disabled with all the others (see "The right-click menu, the keyboard, and SimuXL from your own macros and formulas"). The way to run them: press Alt+F11, then Ctrl+G, and typeApplication.Run "SimuXL_Convert"orApplication.Run "SimuXL_RevertConversion"and press Enter. Converting is something you do once per old workbook, and nothing this version of SimuXL creates ever needs it, so the buttons were removed rather than left in front of every new user.
Your old definitions are not deleted. The hidden table is left exactly as it was, so the older add-in still reads the workbook.
Revert (run the same way) puts every converted cell back to what it held before. A cell you have edited since is left alone and reported, rather than being overwritten.
A correlation whose input cannot be converted stops the whole conversion. Converting most of a model and silently dropping the rest would be data loss dressed up as a migration.
NoteYou can have both add-ins installed while you migrate. If you do, be aware that each has its own ribbon tab and its own log file - see "Where things are".
17Where things are
The Help menu, the log, the reports, and the one thing SimuXL stores inside your workbook.
The Help menu
Everything about SimuXL itself - rather than about your model - is under one button. Help, at the right-hand end of the SimuXL tab, opens a menu holding User Guide (this page), View Log, License, Check for Updates and About. Nothing there changes your workbook.
The log
SimuXL keeps a plain text log of what it did and of anything that went wrong - including the full detail of a failure, which a message box does not show. Help > View Log opens it. Help > About prints its exact path, so you can attach it to a bug report.
File
Written by
SimuXL_XLL_Log.txt
This build. One line per event, most recent at the bottom.
SimuXL_Log.txt
The older VBA add-in, if you have it installed. This build never writes to it. If a message from the older add-in tells you to "see SimuXL_Log.txt", that is this file.
Both normally live in the same folder, under your own user profile: %LOCALAPPDATA%\SimuXL\. Paste that into an Explorer address bar to get there. If SimuXL could not write there it uses your temporary folder instead, so About always prints the path it actually used rather than the one it prefers.
NoteThe log cannot grow without limit. Once it passes 1 MB it is rolled over: the current file becomes SimuXL_XLL_Log.previous.txt, replacing any older copy of that, and a fresh log starts with a new banner line. That happens while Excel is open as well as when it starts, so leaving Excel running for weeks cannot produce an enormous file. What you keep is those two files - the current one and the one before it.
Reports
The Trial Run report and the four analysis views open in a new, unsaved workbook unless you change the destination under Preferences > Analyses - in which case each writes a sheet of its own into your model, replaced on the next run. Either way there is never a "a sheet of that name already exists, overwrite it?" question, and none of your own cells is touched.
Two commands write a real file instead, because a file is the whole point of them. Export Trials asks where to put it; HTML Report puts it beside your model without asking, and tells you the path. Both default to your model's own folder and name the file after your model.
What SimuXL stores in your workbook
One very hidden worksheet, __SimuXL_Handles, holding the freezes, correlations and settings you have created. Names are not there - they are in the cells' own formulas. It is created lazily: a model where you have frozen nothing and correlated nothing has no such sheet, no hidden names and no SimuXL bookkeeping of any kind.
If you have converted an older workbook there is a second one, __SimuXL_Conversion, holding what each cell contained before the conversion. That is what Revert reads, so it stays until you use it. Nothing else is stored anywhere.
NoteYour distributions are not stored there. The formula is the only definition of an Uncertain Input, which is what makes it auditable - anyone reading your workbook can see every assumption in the formula bar without owning SimuXL.
18Licensing
A trial on each machine, then a key issued for that machine.
SimuXL runs as a trial for 30 days on each machine it is loaded on, counted from the first time Excel loads it there. After that a simulation needs a license key issued for that machine. Everything else keeps working: you can still open a model, define inputs and outputs, and read the sheets a run already wrote. What a key buys is the trial loop itself - Run Simulation and Run Comparison.
Getting a key
Press Help > License. The dialog shows where the license stands and this machine's id - six groups of four characters. Press Copy machine id and paste it into your order.
The key you are sent back was issued for that id and works only on that machine. It starts SXL- and is a few lines long: paste it into the box on the same dialog and press Activate. SimuXL checks it and keeps it beside its log; you do not need to enter it again.
You may instead be sent a short activation code, starting SXLA- - three groups of four characters. Paste it into the same box and press Activate: SimuXL sends the code and this machine's id to the activation service once, over the internet, and keeps the key that comes back. The code activates one machine - the first one that uses it - and after that the key works offline exactly as a pasted key does.
If you move to a new computer, send the new machine's id and a key is issued for it.
Perpetual or subscription
A perpetual key runs forever, on every SimuXL release dated on or before the date it names - Help > About shows that date beside the licensee. A release after it needs a new key. A subscription key runs every release until its expiry date; in the last 14 days before it, Help > About and the Run Simulation dialog count the days left; for 14 days after that it still runs and says so, and then simulations stop until a renewed key is entered.
NoteHelp > About always carries one line saying which of these applies, how long is left, and - if nothing runs - why. Quote it in any message about a key.
If a key is refused
The dialog says which check refused it: not a key means the paste lost its start or end - paste the whole thing again from the message it came in; does not verify means a character changed in transit; a different machine means the key was issued for another machine's id; expired or newer than the license covers name the date that decides it. A refused key is not kept, and an active trial keeps running while you sort it out.
19Checking for updates
One signed file on the release page, read when you ask and quietly once a week.
Press Help > Check for Updates. SimuXL reads one small signed file from its release page and compares the version it names with this build's. It sends nothing about you, your workbook or this machine, and it downloads nothing. The dialog then says one of five things: this machine runs the newest release; a newer release is published, and whether the license on this machine covers it; this build is newer than the published one; the file it read is not a release manifest SimuXL accepts, with the reason; or the release page could not be read, with the reason.
What it sends, and what it does not
One request for the file simuxl-latest.txt on SimuXL's release page (the dialog prints the exact address it read), carrying SimuXL's version number in the way every browser carries its own. No machine id, no licensee, no key and no workbook name leave this machine. The file it reads is signed with the same key that issues licenses, and a file whose signature does not verify is refused rather than believed - so nothing on the internet can make SimuXL announce a release that was not published.
SimuXL never downloads or installs anything. When a newer release exists, Open release page opens the release page in your browser; you download the add-in from there and install it as you did this one, with Excel closed.
The quiet check once a week
SimuXL also makes the same check on its own, once a week at most, about 30 seconds after Excel starts. It shows nothing at start-up - no window, no message - and sends exactly what the button sends: the one request above, carrying only SimuXL's version number. What it found is on the Updates line of Help > About; pressing the button checks again. A check you make yourself counts, so pressing the button today means no quiet check for 7 days; and if the release page could not be reached, SimuXL waits the same 7 days before trying again on its own.
To turn it off: under Preferences > Simulation, untick Check for updates once a week when Excel starts (it sits in the box captioned These settings follow ME, not this file, because it belongs to your machine and no workbook carries it). The tick is recorded the moment it changes, like the machine tick at the foot of the dialog, so Save is not needed for it. With it off, nothing is read at start-up at all; the button still works whenever you press it.
Updates and your license
A subscription key runs every release until it expires, so a newer release is always yours to install. A perpetual key runs releases dated on or before the date it names (Help > About shows it): if the newer release is dated after that, the dialog says so and names the date, and installing it would stop simulations on this machine until a key covering it is entered. Help > About carries one line saying what the last check concluded and when.
NoteIf a machine has no internet access the check simply says the release page could not be read; nothing else changes, and the add-in keeps working exactly as before.
20A signed add-in, and the one-time trust step
Every SimuXL file is signed by Michael Ray Smith; one step trusts that signature on your machine, and a downloaded copy then loads without being blocked.
Both SimuXL64.xll and SimuXL32.xll carry a digital signature by Michael Ray Smith, the licensor named in the license. The certificate behind it is SimuXL's own rather than one bought from a certificate authority, which is why your machine does not trust it until you tell it to - and until then Windows treats a copy downloaded from the internet as untrusted and Excel refuses to load it.
The one-time step
Download SimuXL-Publisher.cer and SimuXL-Trust.bat from the release page into the same folder as the add-in.
Double-click SimuXL-Trust.bat. It adds SimuXL-Publisher.cer to your own Trusted Root Certification Authorities and Trusted Publishers stores - no administrator is needed, nothing else on the machine changes, and every SimuXL file signed with that certificate is trusted from then on, including a copy Windows marked as downloaded from the internet. Windows asks once whether to install a certificate claiming to represent Michael Ray Smith; answer Yes.
The window then reads the signature on each SimuXL file beside it and prints Valid for each - that is the pass. Close it and load the add-in as usual.
After that, every SimuXL file signed with the same certificate is trusted on that machine - this release and the next - and no Unblock step is needed for a downloaded copy. A machine whose administrator locks the certificate stores may need the administrator to run the step instead.
What About says
Help > About carries a Signature line reading what the running file's signature says on this machine: Signature: signed by Michael Ray Smith, trusted on this machine. once the step has been run, and before it a line ending run SimuXL-Trust.bat once. naming what is still missing. A file signed by anyone but Michael Ray Smith says so on the same line; it is not a file SimuXL released.
NoteTrusting the certificate changes nothing about what SimuXL does: it still needs no internet connection, still sends nothing anywhere, and the update check still reads its one signed file exactly as the section above describes.
21The installer
One file, SimuXL-Setup-3.0.0.exe, installs the right add-in for your Excel, registers it, and runs the trust step - no administrator needed.
Every release page carries SimuXL-Setup-3.0.0.exe beside the two add-in files. Close Excel, run it, and it does these five things:
Reads which Excel you have - 64-bit or 32-bit - from Excel's own program file, and shows the answer on a page you can correct. Only the matching add-in is installed.
Installs into your own Programs folder (%LOCALAPPDATA%\Programs\SimuXL), with SimuXL-Publisher.cer, SimuXL-Trust.bat and this guide beside the add-in. No administrator is asked for and nothing outside your own profile changes.
Registers the add-in with Excel the way Excel's own Add-ins dialog does, so the SimuXL tab is on the ribbon the next time Excel starts - there is no Browse step.
Trusts that one folder in Excel - just the folder it installed into, not its subfolders - so Excel loads the add-in even if your Trust Center is set to block add-in files (File Block). No other Trust Center setting is changed.
Runs the trust step (ticked by default), so Windows asks once whether to trust the certificate; answer Yes. The section above says what that step does and how Help > About shows it.
The installer is signed with the same certificate as the add-in. Windows SmartScreen may still say it protected your PC from an app it does not recognise: SmartScreen judges a file by how many machines have already run it, not by its certificate, so a fresh release can meet that screen even on a machine that trusts the publisher. Press More info, read the publisher's name - Michael Ray Smith - and press Run anyway.
Updating and removing
A newer release's installer installs over the older one: close Excel first (the installer asks if Excel still has the add-in open), run it, and start Excel. Uninstall is under Windows' Installed apps as SimuXL. Close Excel first: if Excel still has the add-in open - even with no window on screen - Uninstall says so and changes nothing, so nothing is half-removed.
Uninstall removes SimuXL completely, and that includes copies this installer did not put there. It removes the files it installed, the one trusted location it added, and every SimuXL add-in entry in Excel - not only its own - so Excel is left with no SimuXL at all. If any of those entries points at a SimuXL .xll somewhere else on your computer - a copy you registered by hand, or an older version - Uninstall lists those files and asks whether to delete them too; answer No to keep the files, and the add-in entries are removed either way. Nothing that is not a SimuXL .xll named by one of those entries is ever touched.
What Uninstall never removes: your settings, your licence file, your evaluation record, your log and the trusted certificate. They stay exactly where they are, so reinstalling later finds your licence still in place - and so that removing and reinstalling SimuXL does not restart a free evaluation period.
NoteThe manual route on the release page still works and installs the same signed file: download the add-in, run the trust step, and tick the file under File > Options > Add-ins. The installer only saves those steps; it changes nothing about what the add-in does.
22The right-click menu, the keyboard, and SimuXL from your own macros and formulas
The ways in: the SimuXL tab, a SimuXL entry on the cell right-click menu, a typed Application.Run call for the commands with no button, and - for a run - a call your own macro can make and read the answer back from. And in the other direction, three worksheet functions answer questions about SimuXL itself: which build is installed, and what the last run measured. The Ctrl+Shift keyboard chords earlier builds registered are disabled in this build.
Right-click a cell
Right-click any cell and there is a SimuXL entry on the menu, carrying the commands that are about the cell you are standing on: Define Input, Define Output, Erase, Name, Freeze / Release and Run Simulation. The Define Input as entry opens the same list of 8 distributions as the ribbon menu, in the same order.
NoteEvery one of them is on the SimuXL tab as well and does exactly the same thing - this is a shorter route to it, not a different command. The analyses and the reports are deliberately not on this menu: they are about the whole workbook or the last run, and neither gets shorter by being reached from a cell.
Keyboard chords are disabled in this build
Earlier builds registered Ctrl+Shift chords for eight commands. This build registers none of them - an old chord no longer reaches SimuXL. (The keys do whatever Excel itself assigns them, which for most of these is nothing.) They were switched off while a crash tied to Excel's keyboard-macro dispatch is investigated: the same command that runs safely from its ribbon button could bring down Excel when reached through its chord. Of the eight, all but Convert and Revert are on the SimuXL tab or the right-click menu, which are unaffected; those two have never had buttons and are run with a typed command - see "Older workbooks". The chords will return once the cause is fixed.
Watch outIf you go looking for SimuXL in Excel's Alt+F8 macro list, it is not there. That dialog lists VBA macros, and these are not. The ribbon tab and the right-click menu are the ways in - plus the typed Application.Run route for Convert and Revert, and the callable run below.
Running a simulation from your own macro
SimuXL_RunSimulationArray runs a simulation and hands the run record back to your code, with no Run dialog and no summary window to dismiss. It takes the trial count, and optionally a seed, whether to use Latin Hypercube, and whether to try scoped recalculation:
What comes back is the same table the SXL Trial Run sheet shows - the outcome, the trial counts, the seed and where it came from, the elapsed time, every output's statistics and the run's own notes. It arrives as a two-dimensional array you can index, or write onto a sheet of your own.
Written onto your own sheet it carries the values and not the number formats. SimuXL applies those to the SXL Trial Run sheet as a separate step, so a mean that is a DATE reads as an Excel serial such as 45964.2115 in a cell you have not formatted. Format the cells, or read the figure off the sheet SimuXL wrote.
If SimuXL would not run, a single piece of text comes back instead, beginning SimuXL:. Test it with If VarType(answer) = vbString Then. The words are the same ones the Run command would have shown you in a box.
Trials must be a whole number, 1 to 1,000,000. Leave the seed out and SimuXL takes one from the clock and records that it did, exactly as a blank seed box does.
Which analyses get built, where their sheets go and what to do about a value that will not read as a number are your workbook's own settings. Set them once in Preferences. The one preference a call from code does NOT use is the seed policy: omitting the Seed argument always takes one from the clock, because nothing was offered for you to accept.
Notes about the ANALYSES are not in what comes back. Which ones were built, which were skipped and why is written to Help > View Log - the run record is written before the analyses run, so it can never carry one.
It is not a worksheet function. Typed into a cell it refuses, because a formula being recalculated cannot run a trial loop that recalculates the same workbook.
NoteThe progress window still appears while a run from code is in flight, and its Stop button still works. It is not a dialog and it does not wait for you - your macro carries on the moment the run ends - but somebody watching can stop the run, and the record that comes back says they did. Nothing else about the run is different.
NoteA run started from code cannot be asked anything, and three things follow from that. It never paces itself or draws a live chart. Where the Run dialog would have asked whether to hold a large amount of memory for the input draws, it does not hold them and says so in the run record - the run is normal, but the tornado and the other per-input analyses are unavailable. And an Impact swing SimuXL estimates at more than a few seconds is skipped rather than started, for the same reason. Press Run Simulation on the tab and answer the questions, or lower the trial count, if you need them.
Watch outIf the settings you pass ask for something SimuXL would have stopped to talk to you about, the call refuses and nothing runs. A stratified run with too few trials per design is simply impossible and the answer says so; one that is merely expensive comes back carrying the question the Run dialog would have asked. A question nobody can answer is not a yes.
Asking which SimuXL is installed
=SXL.Version() in any cell answers with the build you are running - version, artefact and bitness. It is the first of the two lines Help > About asks you to quote in a bug report; the second is which Excel, which is below.
If it resolves at all, SimuXL is loaded - which is the health check a script wants, because the alternative to a build name is #NAME? rather than a wrong answer. ⚠️ A #NAME? does not prove the opposite on its own: a mistyped function name gives one on a perfectly healthy install, so check the spelling before you check the add-in.
It answers about SimuXL and not about Excel. Which Excel you are running is a separate fact with a separate way of going missing, and it is printed on the SXL Uncertain Inputs sheet, on the run record and in Help > About, where an unanswered question can be told apart from an answer.
It is recomputed rather than frozen, so a workbook saved under one build and reopened under another names the build you have now instead of the one it was saved with. ⚠️ You cannot swap the add-in file while Excel is open and expect this to follow: Excel holds the file open - see "A newly installed build seems broken" - so a new build means closing Excel and reopening it.
Reading a run's figures into your own cells
=SXL.Result("Total Cost", "P90") puts one figure from the last simulation into a cell of your own - so a summary block, a dashboard or a printed page can be built out of formulas instead of copied numbers, and it is right again after the next run without anybody remembering to update it.
The first argument is the output's NAME, exactly as the SXL Trial Run sheet lists it. Ask for a name that run did not measure and SimuXL tells you which names it did.
The second is one of:Mean, SD, Min, Max, Trials, Median, P0, P5, P10, P20, P25, P30, P40, P50, P60, P70, P75, P80, P90, P95, P100. Anything else is refused and the message lists them.
P90 here always means the value 90% of trials fall at or below - Excel's PERCENTILE.INC - whatever Preferences > Percentiles is set to. A cell holds a number and no caption, so the reading is fixed rather than following a setting a colleague might change; it is the same reading the SXL Trial Run sheet's own ladder uses, and that sheet says so.
It reports the last COMPLETED run in this Excel session, and only for the workbook the formula is in. The last run is remembered once per Excel, not once per workbook, so a formula in a different workbook is refused rather than answered - it would be correctly formatted and entirely wrong.
It refreshes itself. Nothing about the formula changes when you run again, so SimuXL recalculates these cells on every recalculation rather than letting them go quietly out of date.
The figures live in this Excel session and not in the file. Close Excel and reopen the workbook, press Release Data, or run a comparison, and every one of these cells shows a sentence instead of a number until the next simulation. If a page has to survive being emailed, paste its values or send the SXL Trial Run sheet.
A run that did not finish is refused rather than quoted. A simulation you stopped part-way has real figures over fewer trials than you asked for, and every sheet that shows them shows that caveat beside them - a cell cannot, so it says so instead and sends you to the SXL Trial Run sheet.
When SimuXL cannot answer you get text beginning SimuXL: rather than an error, and the sentence says what to do; =ISTEXT(...) is the test. ⚠️ An Excel error in either argument is a different case and comes straight back unchanged, so an =IFERROR(...) you have wrapped around it still catches it.
The figure arrives as a plain number with no number format. A mean that is a DATE reads as an Excel serial such as 45964.2115 until you format the cell - the same thing the run record's array does, and for the same reason.
NoteIt is a way to REPORT a run, not a way to feed one. A simulation recalculates your workbook thousands of times, and this formula answers from the LAST FINISHED run every one of those times - so a model cell that reads it is a model running on last time's numbers, which is almost never what anybody means. Report with it; do not build on it.
Reading the run in progress into your own cells
=SXL.Live("Total Cost", "P90") answers from the simulation that is running RIGHT NOW, over the trials finished so far. It takes the same two arguments as SXL.Result and answers from the same list of statistics.
⚠️ Whether you SEE it climb depends on one setting. On an ordinary run Excel's screen updating is off, so the cell's figure is up to date the whole time and the screen does not show it - click anywhere on the sheet and the current number appears. To watch it move on its own, tick Watch the run in the Run dialog and give it a hold of at least 1 ms, which leaves the screen painting for the whole run. Measured on Excel 16.0, build 20228: every watched run's cell climbed unaided and every ordinary run's did not.
It is a different function from SXL.Result on purpose, and the difference is the tense. SXL.Result is the last COMPLETED run; this is the one in progress. A single function that quietly switched between them would leave a cell meaning two things at two moments with nothing on the sheet to say which - and a cell has room for a number and no caption at all.
When nothing is running it says so and points you at SXL.Result. That is the state a workbook is in almost all of the time, so the sentence is written to be useful rather than apologetic: the figure you want when no run is going is the last completed run's, and that is the same formula with one word changed.
Ask for Trials beside anything else. Every figure here describes the trials finished so far, and a P90 over the first eleven trials is a real number that is an estimate of nothing. Trials is the denominator that tells you how much to believe the cell next to it.
The figures refresh on a clock - every 250 ms - rather than on every trial. Keeping a running percentile up to date on every single trial can cost more than the simulation itself: measured at 20.7 seconds of extra work on one 200,000-trial run, against 0.6 seconds for the same figures kept up to date every 250 ms. Nothing is missed - each refresh takes in every trial since the last one - and on a run long enough to be worth watching the difference is invisible.
Collecting starts when the first live cell asks, and costs nothing until then. A run with no live cell in front of it allocates nothing and does no extra work, so leaving this feature unused is free. The first evaluation in a run may show a short "started collecting" sentence; the next evaluation has figures.
When the run ends, every live cell goes back to its no-run sentence. It does not freeze on the last figure it showed, because a stale live number and a finished one look identical and only one of them is trustworthy. Read the finished figures with SXL.Result or on the SXL Trial Run sheet.
A cell that both reads a run in progress and draws from a distribution is refused before the run starts, by name. Such a formula takes one branch while SimuXL is counting its calls and another while they report, which stops the run for a reason that is not the real one. Put the readout in a cell of its own and refer to that cell.
Watch outDo not let a live readout feed your model, and SimuXL cannot stop you. A cell that reads this run's part-finished figures and is then used by one of your outputs changes the model while the model is being measured - the run's own results feeding back into it. Nothing on any sheet, in any report, or in the run record can reveal that it happened: every number will look ordinary. It is the same hazard as typing into a model cell while a simulation is running, without anybody typing. Keep live readouts on a sheet nothing else refers to, and treat them as something to look at rather than something to calculate with.
NoteIf the SimuXL entry is missing from the right-click menu, open Help > About: it says whether SimuXL built the menu and, if it could not, why. Nothing else is affected - every command on that menu is still on the tab.
23When something looks wrong
Most of what follows is SimuXL working correctly and being surprising. The first two are not.
Every SimuXL formula shows #NAME?
The add-in is not loaded. Excel does not know the function exists. Check File > Options > Add-ins > Manage: Excel Add-ins and confirm SimuXL is ticked. This is also what a colleague sees when you email them a model and they do not have SimuXL - the numbers you last calculated are still in the file, but the formulas cannot recalculate.
A cell shows "SimuXL: something is wrong with an argument"
That is not an error, it is SimuXL telling you which argument it could not use - for example SimuXL: MostLikely must lie between Minimum and Maximum., or a standard deviation of zero, or a Discrete whose probabilities do not sum to 1. Read the message and fix that argument. A cell full of #VALUE! would tell you none of that, which is why SimuXL does not do it.
Every SimuXL formula shows #VALUE!
The opposite diagnosis to #NAME?, and a much better one: the add-in did load and something inside it threw. Since a bad argument gives you the message above instead, this points at SimuXL rather than at your formula - press Help > View Log, which will have the detail, and quote the version from Help > About.
A newly installed build seems broken
Watch outIf you swapped the .xll while Excel was open, you are probably still running the old one. Excel holds the file open while it is loaded, and swapping it underneath leaves a state indistinguishable from a broken build - the SimuXL tab missing, a run stopping at zero trials, a button doing nothing. Untick every SimuXL add-in, close Excel completely, reopen it, tick only the new one, and try again before looking any further.
A run is refused before it starts
SimuXL refuses for a small number of reasons and it names the cell every time. All of them, with the remedy for each, are under Rules SimuXL enforces - and the commonest by a distance is a conditional that chooses between SimuXL calls rather than between values.
A rare risk ranks last on the tornado
This is the most important thing in this guide, and it is arithmetic behaving exactly as designed.
Take =SXL.YesNo(0.05) * 100 + SXL.Triangular(10, 20, 50). The 5% gate produces the entire upper tail of that output and owns about 87% of its true variance. The tornado scores it around 15% and puts the triangle first - a near-perfect inversion.
The reason is that rank correlation cannot see a rare event clearly. An input that takes the same value in 95% of trials has 95% of its ranks tied, and that caps the correlation it can reach with anything at about 0.38, however much of the outcome it actually drives. The tornado's own Highest |ρ| possible column tells you when you are looking at that limit - and it is measured against the OUTPUT, so it is not the same figure as the run report's Ceiling (measured), which is measured against the partner INPUT.
NoteThe fix is to read Impact as well. Impact measures the swing in your output's own units and ranks the same model gate-first, by a factor of two and a half. Neither view is wrong; they answer different questions, and a risk model needs both. See Interpreting results for which to trust when.
A correlation reports far lower than the one I asked for
The same ceiling, in the same costume. If one end of the pair is a rare Yes-No, no sampling method can reach a high rank correlation with it. The limit has a closed form - SQRT(3p(1-p)) for a Yes-No firing with probability p - which gives 50% -> 0.87, 25% -> 0.75, 10% -> 0.52, 5% -> 0.38, 1% -> 0.17. A k-outcome Discrete Uniform caps at SQRT(1 - 1/k^2): 4 outcomes -> 0.97, 6 outcomes -> 0.99, which is why a die is never the reason. The correlation report fills in its Ceiling (measured) column when that is what has happened, and the figure it prints is measured from your run's own draws - the realised firing frequency rather than the probability you typed - so expect it to differ from the formula in the third decimal.
NoteBut check r used against Requested r first, because a ceiling is not the only thing that lowers a correlation. If the pairs you declared could not all hold at once, SimuXL substituted the nearest set that could - and that substitution moves a coefficient much further than attenuation does, in either direction. The Ceiling (measured) column answers the OTHER question - whether the pair's own coarseness is in play - and the two are separate facts: a substituted pair can carry a ceiling as well, so read both before deciding which one moved your number.
The tornado and Impact rank my model differently
They are supposed to be able to. Tornado asks how consistently an output follows an input and ignores size; Impact asks how far one input can move it and ignores likelihood. A high-probability nuisance leads the tornado; a low-probability catastrophe leads Impact. Each sheet names the other and says what it answers.
Two sheets quote different values for the same percentile
Check the Below / Above setting, and the section on percentiles above. Some sheets follow that convention and some deliberately do not, and each sheet states its own.
A tail driver table lists inputs I know are irrelevant
Look for the ~ marks and the Noise floor (SD) column beside them. With many inputs and few trials, an input with no connection to the output still shows a shift by pure chance - and a top-five table is exactly where that shows up. Each row carries in the Noise floor (SD) column the floor it had to clear. That is the same figure on every row unless an input is extremely lopsided, because only a very skewed input reaches further by chance in the direction it leans - so a column reading the same on every row is the ordinary case and not a fault. At 2,000 trials over 1,000 symmetric inputs the floor lands near 0.22 standard deviations, and it falls as the trial count rises. More trials is the cure.
A run's answer changed when I changed nothing
The two runs used different seeds - or the same seed under different samplers - so they drew different random numbers and differ by sampling noise. Either the seed box was left empty - SimuXL then takes one from the clock, which is different every time - or a different number was typed. The run report prints the seed either way, so open the report for the run you liked, set the sampler it names and type its seed back in to get that run again exactly.
Nothing here explains it
Press Help > View Log. The log records what SimuXL did and the full text of anything that failed, including the detail a message box does not show. Help > About gives the exact version to quote. Both are what a useful bug report is made of.
24Glossary
Every term this guide uses in a particular way, in one place.
Uncertain Input
ONE distribution: the thing that gets sampled, that appears in the tornado, and that you can freeze or correlate. A cell can hold more than one.
SimuXL formula cell
A cell whose formula contains one or more Uncertain Inputs. =SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50) is one cell and two Uncertain Inputs.
Call
One SimuXL function call inside one cell's formula. =SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50) is one cell and two calls, so it appears as two rows on every listing that numbers them. The number is the order the calls FIRE when Excel calculates the cell - which for an ordinary left-to-right formula is the order they appear in it, and is not the same thing when a call is nested inside another's argument. That is why editing a formula can change which call is which, and why SimuXL checks a cell's saved Freeze and Correlate settings against it before applying them. The column is Call (from 1), on the Find Inputs listing, on the SXL Trial Run sheet and in both run reports. On a model where each input sits in a cell of its own, every row of that column reads 1 - which is what it should read, not a sign that the column is broken.
Counting from 0 or from 1
Every column SimuXL numbers with a #, and the two call-ordinal columns, state in their own heading where the counting starts, because they do not all start in the same place and a reader comparing two sheets had nothing to tell them so. Sample # (from 0) is a POSITION IN AN ARRAY rather than an ordinal - it is the slot in the seeded random stream that input draws from, so the number on the sheet is the number the sampler uses. On the Find Inputs listing, an input SimuXL never assigned a slot shows a dash there rather than a number, because there is none to print - and a zero could not say so, since sample 0 is a real slot. Ordinal (from 0), on the handle listing, is the ordinal SimuXL hands out internally, written unchanged - so the same call is numbered one LOWER there than in the Call (from 1) column on the Find Inputs listing, which writes that ordinal plus one. That disagreement is real, it is deliberate, and until both headings said so there was nothing on either sheet to warn you of it.Call (from 1), Output # (from 1) and Control # (from 1) are ORDINALS - the first, the second - and every other surface that numbers them starts at one, so starting a listing at zero would trade a disagreement inside one sheet for a disagreement across the product. No figure changes because a heading says this; only the claim the heading makes.
Output
A cell whose distribution you want measured. Defined once, by wrapping the cell's own formula in SXL.Output, so the definition travels with the cell.
Trial
One pass: draw a value for every Uncertain Input, recalculate your whole workbook, record every output.
Seed
The number that determines every draw in a run. The same seed under the same sampler reproduces a run exactly, on any machine.
Sampler
How the draws are laid out - plain Monte Carlo or Latin Hypercube. A seed alone does not identify a run; the sampler is the other half.
Latin Hypercube
A sampler that splits each distribution into equal slices and takes exactly one draw from each, so the draws cover the distribution evenly instead of clustering by luck.
Design
One complete, independent Latin Hypercube layout. A run is made of several, which is what lets Convergence put a real band around a percentile.
Harvest
The single recalculation SimuXL does before a run to find out what your model contains. Find Inputs is that same scan, reported, and run whenever you ask for it.
Freeze
Holding one input at its average for a whole run, to see what the answer looks like without it. The formula is not touched and no other input's draws change.
Ceiling
The highest rank correlation a pair can reach when one of them takes only a few distinct values - it is a property of the pair, not of either input, and two coarse inputs cap each other harder than either caps a continuous partner. A Yes-No at 5% tops out near 0.38 however strongly you correlate it. No column is headed with this word on its own, because three surfaces show it and they are measuring three different things.Ceiling (from p) in the Correlation Editor is computed from the probability you DECLARED, before any run exists. Ceiling (measured) on the run report is measured from the run's own draws, against the PARTNER INPUT. The tornado does not use this word at all, because it is not measuring the same thing: its Highest |ρ| possible column is the largest |rho| an input could reach against the OUTPUT, which is a different pair entirely - which is why that figure differs from the other two by more than rounding.
Percentile direction
Whether P90 means the value 90% of trials fall at or below (Below, the default) or the value exceeded 90% of the time (Above). Stored per workbook.
Base value
A deterministic reference figure drawn as a dashed rule on one output's histogram, in that output's own units. You supply it, or nominate a cell for it.
Noise floor
How large a shift an input entirely unrelated to the output would show anyway, by chance, in a tail table of this size. Rows marked ~ are inside it.
Run record
The block of facts identifying a run - date, trials, seed, sampler, status, elapsed time and the outputs measured. It is on every artefact SimuXL writes.