SimuXL 4.16.3 - Excel-DNA add-in (.xll) - Monte Carlo simulation inside your own workbook.
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.
10 becomes =SXL.Triangular(8, 10, 14). Type it, or use the Input dialog - which can also take it as the percentiles you know, or fit it to your data.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.
=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. The analyses rank the two separately unless you make the cell one input - see Making one input from several.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.
=SXL.Triangular(10, 20, 50). The cell shows 26.667. That is the distribution's average - see "What a SimuXL cell shows" below.=SXL.Normal(100, 15). It shows 100.=D1 * D2. This is your model. It can be as complicated as you like; SimuXL never looks inside it.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. With two outputs - a cost and a finish date, say - press Joint Outcome to count how often both meet the thresholds you set.
Every one is an ordinary worksheet function. Start typing =SXL. and Excel offers the list, or use the Input dialog.
| 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.
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.
=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.
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.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.
In the Input dialog, type the formula into the parameter's box - =B4*0.9 for a Minimum that is 90% of B4 - or press the … button beside the box and click a cell or type the formula there. The box is shaded and shows what the formula works out to now; click in it to see the formula.
If what you know about an input is a judgment rather than its parameters - a value you would be surprised to come in under, a likely one and one you would be surprised to exceed - choose how you enter it in the Input dialog's Parameters list, under Type. A Triangular or a Beta-PERT offers Minimum, Most Likely, Maximum; 10%, 50%, 90%; 5%, 50%, 95%; 10%, Most Likely, 90%; 5%, Most Likely, 95% and Custom…; Uniform, Normal and Lognormal offer their own two parameters, 10%, 90%; 5%, 95% and Custom…. The label above each box says what it holds, and the value you type there means exactly that: with 10%, 50%, 90%, the first box is the value at P10. The distribution does not change - a Triangular entered by its P10, P50 and P90 is still a Triangular. The preview draws it, and the line between the chart and the boxes says the distribution's own parameters your values give - for a Triangular, its Minimum, Most Likely and Maximum.
Choosing another set keeps the same distribution: when the boxes already describe one, each box whose label changes is filled with that distribution's value at its new label, and a box whose label does not change keeps what it holds. Custom… lets you choose, box by box, between the distribution's own parameter and a percentile you type. Beta-PERT's Lambda is always its own box. Set Default makes the set shown the one a new input of that distribution opens on in this workbook.
The set is kept in the formula, after the name, so it travels with the cell and the dialog shows it again when you reopen it:
=SXL.Triangular(80, 100, 130,, "P10,P50,P90")
The three numbers are the values at P10, P50 and P90, not a Minimum, a Most Likely and a Maximum. SimuXL works the Triangular's own parameters out from them every time the cell calculates, so a box can hold a cell such as =D6 and the run follows it. An input entered by its own parameters has no Parameters argument. Each item of the set, in order, is that place's own parameter as the formula spells it (Minimum, MostLikely, Maximum, Mean, StdDev) or P and a percentage.
What you typed is shown beside what SimuXL solved. Find Inputs gives it in its last column, Entered as - P10 80; P50 100; P90 130 for the formula above - and leaves it empty for an input entered by its own parameters; the Input Summary says it on a line of its own in the block it writes for that input, and the HTML and Word reports after the parameters in their Input Summary section. A set held in a cell rather than typed into the formula is not shown.
Not every set of values has a distribution of that kind: for P10, P50 and P90, a Triangular's gap from P50 to P90 can only be between 0.62 and 1.62 times its gap from P10 to P50, and a Lognormal takes only values above zero. The line above the boxes then says why no distribution gives them, and OK says so too. Where more than one does - a Triangular whose Most Likely lies below every percentile you gave, for one - SimuXL takes the Triangular or Beta-PERT whose Most Likely is nearest its Minimum or its Maximum, or the Lognormal with the smaller spread, and the line says so. A set held in a cell rather than typed into the formula (,,B1) is read when the cell calculates, but the dialog cannot show it.
When you have observations, or judgments, and want to see which distribution they point to, press Fit… beside Type in the Input dialog. It opens SimuXL - Fit a distribution, which fits to one of two sources: A range of data or Percentiles you know. What you choose there comes back into the Input dialog; nothing is written until you press OK.
A range of data: type a range, or press … and point to it - one block of cells, on any sheet of the workbook. SimuXL reads the cells in use, fits to the numbers among them and leaves every other cell out - blanks, text (a number stored as text included), TRUE or FALSE, and errors - counting each kind and naming the cells. It never changes your data: a value beyond Tukey's fences (1.5 times the interquartile range beyond the quartiles) is flagged and kept. Fewer than 3 numbers, or a constant, are refused; fewer than 20 are warned of, and so are values that look discrete - fewer than 10 distinct values among 20 or more, or whole numbers with fewer distinct values than a third of their count. When none of these applies, the space under the range says what was checked, so an empty space never stands for an answer.
A-D (Anderson-Darling) and K-S (Kolmogorov-Smirnov) measure how far your values sit from each fitted distribution - smaller is closer. They are descriptions, not tests: the parameters were estimated from these same values, so the usual tables of significance do not apply. Look at the plots as well. Nothing is ranked or called best, and on this side nothing is chosen for you unless the Input dialog's own type was fitted. The histogram draws your values with every fitted curve, the chosen one strongest; the Q-Q plot draws the chosen family - each value against the family's value at the same share - and a close fit lies along its line.
Press Use this distribution, then OK in the Input dialog: the formula holds the fitted numbers, and nothing else, and the fit's record is added to the SXL Fit sheet - the input, the formula, when, the data range, how many cells and numbers, the cells left out, the method, every family's parameters, A-D and K-S, the notes, and both charts. In your workbook, each fit adds its record below the earlier ones and removes nothing; when your sheets go to a new workbook (Preferences > Analyses), each record opens one of its own. Change the distribution or a box after the fit and OK writes the cell without a record, because the record would describe a different input.
Percentiles you know: type two or three percentiles and the values you judge for them, and every family is fitted to them side by side - exactly where it can, otherwise as closely as it can, and each says which. The Input dialog's own type is chosen whenever it fits, otherwise the first family that does. A family that gives every percentile you typed, and is the only one of its kind that does, comes back as a Parameters set holding your values, kept in the formula as described above - when you typed as many percentiles as its set has boxes: three for a Triangular or a Beta-PERT, two for the others. Anything else comes back as the family's own numbers. Press Use this distribution, then OK, and this fit's record is added to the SXL Fit sheet too - the input, the formula, when, the percentiles you typed and the workbook's percentile convention, the method, every family's parameters and whether it gives your percentiles, the chosen family's value at each of them, and one chart: its cumulative curve with your percentiles marked.
Which inputs were fitted. Whenever SimuXL scans your workbook - Find Inputs, a run, Impact, a comparison - it reads the workbook's SXL Fit sheet and finds, for each input, the newest record for its cell. Find Inputs names it in its Fitted column - for example To data: Data!$A$2:$A$63, 60 values, 2026-10-05 16:30 - SXL Fit row 1; the Input Summary names it in the block it writes for that input, in shorter words - what it was fitted to, when, and the record's row; and the HTML and Word reports list the fitted inputs in a table of their own when The listing of every Uncertain Input is ticked under Preferences > Report. When the cell no longer holds the formula that fit wrote, the words begin Not as fitted. A record names its cell by address and by a hidden name, SXL_Fit_0001 and on, which Excel moves with the cell: an input moved since its fit - rows inserted above it, cut and pasted, or on a sheet you have renamed - is still named, and the next of those scans to find it moved rewrites the record's heading and its Input line to the cell's address now (the worksheet function SXL.HarvestInputsArray writes nothing). Without its name - deleted by a macro, say, or one Excel would not add - a record has only its address, so an input moved since is not named and the input now in its old cell is said to be not as fitted. A record written to a new workbook is not read.
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.
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.
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.
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.
The dialogs, what they write into your cells, and why the formula is the definition.
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.
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 |
=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.Select a cell - empty, or holding a number or text - and press Input (the Define group, first on the tab). A cell holding one of your model's formulas is refused: the formula is part of your model, and a distribution written over it would break the calculation. A cell holding one SimuXL distribution on its own opens the dialog to edit it. 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.
=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.=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.=D1*D2 with a distribution would destroy the model you built. It also refuses a cell holding MORE than one distribution, or one inside a larger formula, which you can still edit by typing.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.
1700 becomes =SXL.Output(1700, "Base"), still worth 1700.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.=SXL.Output(D1*1.1, "OP "&ROW()) filled down names each output for its own row - OP 5 in row 5, OP 6 in row 6 - because SimuXL works the expression out as Excel would in that cell, ROW() and COLUMN() included.SXL.Result and SXL.Live read a run's results. A defined name whose own formula calls one is refused too, and both are named - a dynamic range built on OFFSET or INDIRECT among them: build it on INDEX, which stays put. A cell the expression or a name reads is read as it stands, like a label cell, even when it holds =NOW().ROW(), a name defined relative to its row or a table's this-row reference in it; and two outputs that work out to the same name.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.
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. |
=IF(A1>0, 1, IF(AND(B1="Y", SXL.Uniform(0, 1)<0.1), 1, 0)) | Only while the branch is taken | 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. |
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 |
CHOOSE 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.IFS and SWITCH are the other way round - they read like conditionals and evaluate everything, so a distribution inside one is perfectly safe.LET 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.IFERROR 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.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".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 |
MAKEARRAY | Once per cell of the grid you ask for | =SUM(MAKEARRAY(2, 3, LAMBDA(r, c, SXL.Normal(0,1)))) - Expected 1, Reported 6 |
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.MAKEARRAY 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.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.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.
#NAME? in that one cell, and this rule does not see it. SXL. is matched against the names this build has, so =SXL.Nomal(0, 1) is not a call SimuXL counts - check the spelling of a cell that shows #NAME? yourself.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.
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.=SXL.Triangular(,20,50) - one stray comma - is refused.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.=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.=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.=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.#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.| 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 would be a wrong answer that looks like a right one, and this setting is what prevents 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. |
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 is in the Other drop-down of the Define group.
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.
The same scan that finds your Uncertain Inputs also finds your defined outputs and your control variables, out of the same formulas, and Find Inputs reads your made inputs - SXL.MakeInput cells - the way a run reads them before it starts. The listing carries a block for each: INPUTS, ISSUES, OUTPUTS, CONTROLS, MADE INPUTS. 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 or a made input SimuXL cannot use stops a run and Impact; a control variable it cannot use stops a comparison and leaves an ordinary run alone.
SXL.MakeInput cell a run would refuse, with the reason. To do this, Find Inputs reads your workbook's formulas as a run already does before its dialog appears. A listing that Run Simulation or Impact writes when it refuses says the made inputs were not looked for.SXL.Output formula travels with its cell when you copy it or insert a row above it.=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.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 - and every control variable holds the value it held, which the run record lists under Control variables. 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. |
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.
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.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.
Recalculations retried.#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.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.
Spreading the draws evenly - what it buys, what it costs, and why a seed alone does not identify a run.
SimuXL normally draws every Uncertain Input independently every trial, which is plain Monte Carlo and is what a run does unless you choose otherwise. 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.
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.
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.
=SXL.Triangular(10, 20, 50, "Escalation") - and before its Parameters set, when it was entered by one: =SXL.Triangular(80, 100, 130,"Escalation", "P10,P50,P90"). 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.=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.=SXL.Triangular(10, 20, 50) stays valid and is reported by its cell address.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.
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.
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.Problem column.(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.Input Settings is in the Other drop-down of the Define group.
Lists everything this workbook has saved against its Uncertain Inputs - freezes and correlations - and whether any of it no longer matches the formulas. A model with nothing frozen or correlated stores nothing against its inputs, and this report says so. It shares its drop-down with Find Inputs: the two of them report on your inputs rather than on a run.
=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.Rank a risk's Yes-No and its impact as one input in the Tornado, Tail Drivers and Impact, by marking the cell that combines them.
A risk on a register is usually two Uncertain Inputs - a Yes-No that says whether it happens and a distribution for how much it costs - combined in one cell: =D6*E6, or both in one formula. Every analysis ranks Uncertain Inputs, so on its own the risk arrives as two half-answers. A made input is that combining cell, ranked as one input in their place.
=D6*E6, say.=SXL.MakeInput(D6*E6, "Ground risk") and tints it light blue. The cell shows the same number it did.For a whole register, select every combining cell at once and type the letter of the column that holds the risks' names - A, say. Each cell takes the name on its own row, as =SXL.MakeInput(D6*E6, A6), the same relative reference a fill-down would give it.
Find Inputs lists your made inputs before any run, in its MADE INPUTS block: each one's name and the inputs it is made of, and every SXL.MakeInput cell a run would refuse, with the reason.
From the next run the Tornado and Tail Drivers - and Impact, the next time you measure it - rank the made input as one row in place of the Uncertain Inputs it is built from, followed through other cells, other sheets, defined names and tables. Each sheet counts the inputs it carried under Excluded, and the made input's Distribution column names them - the first three, then how many more. The Input Summary folds nothing: it adds the made input's own distribution after the inputs, which keep their rows.
Impact is where the number changes. It swings a made input's inputs together - all at their low ends (the risk does not happen), all at their high ends (it happens at its worst), and a middle point where it happens at its most likely size, with every Yes-No among them at 1 and every other input at its most likely value. Its bar is the output's move from the risk not happening to the risk at its worst, so on a total that adds a 5% risk of 200 to 600, one bar spans the whole 600 where its two inputs drew two shorter ones. Its Swung From and Swung To read the made input's own cell.
SimuXL decides which inputs a made input is built from before the run, by reading the formulas - it does not watch Excel calculate. Anything whose cells are only known while Excel calculates is therefore out of its reach, and so is anything Excel will not show it. What happens then depends on where it sits: inside a made input - in its formula or anywhere in what that formula reads - SimuXL refuses rather than guess; on the path from an output back to its inputs, it runs but folds nothing. The table lists the common cases; every message and note names the cell and the reason.
| Where it is | What SimuXL does | What to change |
|---|---|---|
INDIRECT, OFFSET, ANCHORARRAY or EVALUATE, a spill reference such as A1#, or a range whose end is worked out as Excel calculates or that runs across sheets - inside a made input | Refuses the run and the Impact swing. The message names the cell and what stopped it. | Point at the cells directly - the cell itself in place of INDIRECT("D7"), for example. |
LET or a LAMBDA, a 3-D reference such as Sheet1:Sheet3!A1, a reference into another workbook, or a defined name SimuXL cannot pin to fixed cells - inside a made input | Refuses, as above. | Write the risk's arithmetic out in the cell, or in helper cells in this workbook that it reads. |
| Any of the above on an output's path - in the formula of any output you have defined, whether or not this run measures it, or anywhere in what it reads (the arguments of its Uncertain Inputs included), outside the made inputs | Runs, but folds nothing into any made input. Each made input and each of its inputs gets a row of its own, unless the sheet counts it under Excluded, and the Made inputs row of the Tornado, Tail Drivers and Impact sheets names the cell that stopped it - Summary!B4 uses INDIRECT, say. | Change the cell it names to a direct reference and run again. If another such cell remains, that run names it; when none does, folding comes back. A plain INDEX(range, n) works, but SimuXL counts every cell in that range as read, so keep it clear of a risk's own inputs; a range that ENDS in INDEX, such as D6:INDEX(D:D, 5), does not. |
| One made input built from another; a made input with no Uncertain Input behind it; a made input in the same cell as an output or a control variable | Refuses, naming the cell. | Make each risk from its own Uncertain Inputs, and keep outputs and controls in cells of their own. |
| An Uncertain Input that feeds more than one made input, or that also reaches an output without passing through its made input | Does not fold that input. It keeps its own row, unless the sheet counts it under Excluded, and the notes name it and say why. The Tornado also says its Contribution to Rank Variance column then counts that input's effect more than once. | Nothing, if it is meant - an escalation factor behind every risk is exactly this. If not, look for an output that adds the input a second time. |
A range - SUM(D6:D15), or a VLOOKUP over a table | Counts every Uncertain Input in the range as one of the made input's inputs, and folds it - it leaves the rankings - unless it also feeds another made input or reaches an output another way. | Keep a lookup's range to the risk's own row: a VLOOKUP over D6:F15 folds the inputs of all ten rows into this one. |
| A sheet whose formulas Excel will not give SimuXL, or defined names or tables it will not describe | Reads such a sheet's formula cells alone when its whole grid will not come. When a sheet still cannot be read, or names or tables cannot: refuses a made input whose value reads that sheet or uses such a name or table - a defined name whose formula will not come is refused by its name, called as a function or not, and only when names or tables themselves cannot be listed is every unknown word - Q1.Sales included - refused as possibly one; folds nothing if an output does, or sits on that sheet; and does not find an SXL.MakeInput cell on it. A sheet that nothing reads stops nothing. | Usually nothing - the notes say when SimuXL could not read something. |
| A name argument that points at a cell holding nothing, TRUE or FALSE, an Excel error, or several cells | Names the made input by its own cell, and the Made inputs row says why. | Put the risk's name in that cell, or type the name itself in quotes. |
A name argument that uses a defined name made relative to its row - Label defined as =Risks!$M6 with row 6 selected - a table's this-row reference such as Table1[@Risk], or ROW(), COLUMN() or SHEET(), when SimuXL cannot write it out for the made input's row: the argument would run past 255 characters written out, its names nest more than eight deep or one sits inside its own formula, the table is in another workbook, or the argument uses LET or LAMBDA | Names the made input by its own cell, and the Made inputs row says why - also in an argument that uses LET or LAMBDA or calls a LAMBDA you have named, where SimuXL does not write the cell in, and a LET variable spelled like a relative name is taken for that name. An output whose name cannot be written out for its cell is refused instead. Every other relative name - alone, inside a longer expression such as "Risk " & Label, or reached through another name - and a this-row reference to a table in this workbook are read for the made input's own row. A relative name or this-row reference that alone names an output is read for the output's cell. | Point at the cell directly - M6. |
SimuXL, Define, Erase takes SXL.MakeInput off the cell again and leaves the formula it wrapped.
The cells that hold a DECISION rather than a chance, so a later comparison can set them by name.
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.
=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.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.
The Alternatives button sets up your alternatives in a dialog and lays them out as a table, one row per control, 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: three charts per output, drawn on the sheet below 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.
Set up in a dialog and kept on a sheet you can still type into: one row per control variable, one column per alternative, and a Base case column SimuXL keeps up to date.
Press Comparison ▸ Alternatives and SimuXL opens a dialog to set up the alternatives you want to compare - see Setting up the alternatives, below. OK writes them to a sheet called SXL Alternatives, holding one row for each of this workbook's control variables and one column for each alternative, with its name in the header row and its 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.
Alternatives opens one dialog for the whole table. The list on the left holds your alternatives - a new table starts with Alternative 1 and Alternative 2 - and Add and Remove change how many there are. Choose one, and on the right give it a Name and a Description, then change the control variables it changes: pick a row in the list of control variables and type the value in the Value box under it.
OK writes only what the dialog changes. A cell whose value is already what the dialog holds is not written. A cell holding a formula is never written over: OK names it instead, so you can change it on the sheet. Removing an alternative the table had removes its column from the table - the alternatives after it move one column left, each with its name, description and values, and nothing outside the table's rows moves - and OK asks before it does.
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.
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. Adding, removing and renaming alternatives is done in Alternatives, above, or on the sheet - where you can undo your own typing with Ctrl+Z, which you cannot do to anything SimuXL writes.
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.'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.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.
Status answers, for every row at a glance, whether that control is taking part in a comparison. SimuXL rewrites it every time you press OK in 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.
Not 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.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.
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.
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 message after OK in 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.
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.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; give an alternative its description in that dialog, or type into the cell under its own column. Nothing else has to be filled in, and SimuXL writes into it only from the dialog.
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.
An alternative that reduces a risk usually costs something, and that cost belongs in your model, like every other cost. Give it a control variable - in an empty cell, type =SXL.Control("Mitigation cost", 0) - and add that cell to the formula of the output it costs, such as your total. Its base value, 0, is your model as it stands, with no mitigation; each alternative sets its own cost in Alternatives, the way it sets any other control variable, and an alternative that costs nothing leaves it at 0.
On every control row, the Base case column is redrawn from your control cells every time you press OK in its dialog. SimuXL writes an alternative column or the Description row only where the dialog holds something different from the sheet, and never a Base case cell. So the base case cannot drift away from your model - if you change a markup in your model next month, press the button, press OK, and the table catches up.
Define a new control variable and press Alternatives again: the dialog lists it at its base value under every alternative, and OK adds a row for it, under the last control, holding what the dialog shows. Change it in the dialog 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.
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.
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.
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.
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.
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 three charts, on the comparison sheet itself. The first is a cumulative distribution - one S-curve per alternative, on one pair of axes; when your workbook reads percentiles as Above, it is an exceedance curve and is named so, each curve falling from left to right because a point is the share of trials at or above its value. 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 histogram of each alternative, turned on its side so its values run up the chart: each bar is the share of that alternative's trials in its band of values, and every alternative is counted in the same bands and drawn to the same scale, so a longer bar is a band more of its trials fell in. The third is a distribution shape panel - one violin per alternative, side by side, with a rule across each at its median. Each violin is its histogram set on its own centre line - as wide at each band as that band's bar - and drawn as one outline, so reading the second chart beside the third is the way into the violins if you have not met them before. 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 all three charts.
Tick Count two targets for every alternative in the Run Comparison dialog and, when you press Run Comparison, the Joint Outcome dialog opens: choose two outputs, a threshold for each and how each is met, as you would for a single run. Nothing runs until you press Use these targets, and Cancel there writes nothing. The tick is offered when SimuXL can read at least two output cells before the run.
The comparison sheet then carries a TARGETS block above the outputs: the two targets, then one row per alternative with the share of trials in which Both met, each of the two outcomes in which one target was met and the other missed, Both missed, each target met whatever the other did, and the change from the Base case for both met and for each target. A change is the alternative's share minus the Base case's, in percentage points, printed with pts - a fall from 62.0% to 50.1% is -11.9 pts - and the cell holds the points, so a formula that reads it gets -11.9.
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 all three 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.
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.
Convergence is in the Other drop-down of the Results group.
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.
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.
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.
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 writes the output on screen, with its chart, where the Histogram button writes, from the same code and the same preferences. So you can try six parameter sets without collecting six workbooks to close. To write several outputs at once, press Histogram and tick them. When SimuXL writes its sheets into this workbook, either one replaces the SXL Histogram sheet each time.
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: each of these three tabs 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.
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.
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.
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 so does SimuXL's. 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.
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.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 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. Each share is never negative - the sign of the input's ρ is the direction - and where inputs share an effect, because they are correlated with each other or one keeps its own row while also sitting inside a made input, the shares overlap and a Shares overlap row under that output says so. It names each correlated pair at least one of whose shares is 0.05% or more, and counts the other correlated pairs among the rows shown, both of whose shares are under 0.05% and round to zero; an input inside a made input is held to the same test, and an output where nothing passes it has no Shares overlap row. 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.
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.
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.
A driver is one Uncertain Input or one made input, not a risk, and it is ranked by how far its average in the tail trials sits from its average over every trial, counted in its own standard deviations. That rewards being OVER-REPRESENTED in the tail, not occurring there: a 50% risk that fires in 60% of the upper-tail trials barely registers, while a 5% risk that fires in 40% of them leads. To see a risk's gate and impact as one driver, make them one input - see Making one input from several.
~ 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.Pick two outputs of the last simulation - any two: a cost and a finish date, a peak flow and a duration, a margin and a yield - and for each, choose under Met when whether it is met at or below or at or above its threshold, and type the threshold. SimuXL takes each trial's two values together, from the same trial, and counts the trials in each of four outcomes, named after your outputs: Both met; First missed, second met; First met, second missed; and Both missed - for outputs named Total cost and Finish, met at or below and on or before their thresholds, "Total cost met, Finish missed" is a trial that came in at or under its cost threshold and finished after its date. The share in which both are met is counted from those pairs - never multiplied from the two separate shares, which is right only when the two outputs are independent - and two outputs driven by the same risks rarely are.
SXL Joint Outcome: each output with its threshold and what met means for it, the four outcomes with their trials and shares, each output's separate share beside the joint one, the joint-confidence frontier's table when it is drawn, the READING block, and under them a scatter chart - the first output along the x-axis and the second up the y-axis, as the dialog's First output (x-axis) and Second output (y-axis) say - one point for each trial it draws, a line at each threshold, and each corner's outcome, share and count; which corner is which follows the directions you chose. A date is drawn at its day, the day it is counted by. Each axis's ticks fall on round values - for a date, whole days, and Mondays when they are a week or more apart - no more than the labels leave room for, at most 8 - of those, the spacing that frames the trials closest, with four labels or more where it can - in the output's own format, a number's label the exact value of its tick. When the output's format cannot label its axis that way - its labels too long for the axis, or too coarse to show any round tick without stretching the axis to over twice what the trials need - the axis is labelled in plain numbers instead (a date as m/d/yyyy). When a run keeps more than 3,000 trials the chart draws 3,000 of them, spread evenly through the run, each the pair of values one trial gave, so the cloud stays readable; its legend says how many and what share - Trials - 3,000 of 10,000 shown (30.0%) - and the sheet and the report say the same. The counts, the four outcomes' labels and the frontier always use every trial. A workbook whose structure is protected cannot take the sheet, so SimuXL writes it to a new workbook and its message says so.The joint-confidence frontier. Under the second output the dialog has a tick, Draw the joint-confidence frontier at, and a level in percent. It starts ticked, and the level starts at the workbook's Shade either side of under Preferences > Charts when that is above 0 and below 100, otherwise at 70; in one Excel session the dialog opens with the tick as you last left it, and keeps a level you typed. For each threshold of the first output, SimuXL takes the trials that meet it and finds the lowest threshold of the second output at which both are still met in at least the level's share of the trials - at 70% of 10,000 trials, the 7,000th lowest second value among them. Pressing Joint Outcome with a row's two thresholds counts both met in at least that many trials, and with the row's second threshold made stricter by one in its last digit shown - by a day, for a date - in fewer. For a date the threshold is the earliest; for an output met at or above its threshold it is the highest (the latest for a date). The line is the same whichever output is swept; the table reads it by the first.
The reading. Above the chart the sheet has a READING block: findings written by rules from every counted trial - never from the trials the chart draws - and then a bottom line. The words say what the trials show and never why, and they give no advice about your project.
One row per Uncertain Input with its realised average, standard deviation and percentiles against the theoretical values - then one per made input - 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. |
| Made from its inputs | The row is a made input (SXL.MakeInput), not a distribution: its figures are what its formula made of its inputs in each trial. It has no theoretical figures, so none are printed beside its realised ones, and the inputs it is made from keep their own rows above it. |
| 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. |
Sampled - analytic is a snapshot; everything else reads Sampled and its two figures may be compared.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.
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.
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.
Release Data is in the Other drop-down of the Results group.
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.
Which number to quote, which analysis to believe, and what a reader needs in order to check you.
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. |
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. |
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.
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.
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.
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.
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.
Tick the analyses you want built automatically, immediately after each simulation finishes: Histogram - the distribution of each output, 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 the buttons after every run. In a workbook whose settings have never been saved, all five are ticked to begin with, so every run also builds all five until you untick the ones you do not want; a workbook whose settings were saved keeps the ticks it was saved with. The one thing this tab is needed for is Impact in the HTML Report, which cannot get there any other way except by pressing Impact on the ribbon afterwards.
The same tab chooses where SimuXL writes its sheets: a sheet in this workbook - the default - replaced on each run (the SXL Fit sheet is the exception: each fit adds its record below the last), 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 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. A workbook whose structure is protected cannot take a sheet, so SimuXL writes that sheet to a new workbook instead, and says so - in the message after a command, and in the summary after a run when the summary is shown.
SimuXL's own sheets are named SXL - the Histogram is SXL Histogram - so SimuXL can recognise them and skip them when it harvests your model. A sheet you own is never one of the ones replaced.
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.
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.
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. |
The Help menu, the log, the reports, and what SimuXL keeps inside your workbook.
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.
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. |
It lives 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.
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.The Trial Run report and the analysis sheets go where Preferences > Analyses says: each to a sheet of its own in your model, replaced on the next run - the choice for a workbook SimuXL has never saved settings in - or each to a new, unsaved workbook. 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.
One very hidden worksheet, __SimuXL_Handles, holding the freezes and correlations you have created and the settings you have saved in it - your Preferences for this workbook, a Set Default Parameters set, a chart's own settings from Configure this chart - and, while your model sits on an alternative, or a comparison stopped before putting it back, each control variable's base value, which is how it is put back. Names are not there - they are in the cells' own formulas. It is made the first time there is something to keep - a freeze, a correlation, a saved setting, or a comparison or an alternative setting your control variables - and it stays once made. A model where none of those has happened has no such sheet.
SimuXL also keeps hidden workbook names, each pointing at one cell: one for each input you freeze or correlate, and one for each fit you use - SXL_Fit_0001, SXL_Fit_0002 and on, written on its record's Cell name line. Excel moves a name with its cell, which is how a fit's record on SXL Fit still finds its input after you insert rows above it, cut and paste it, or rename its sheet. A model with none of those has no hidden names.
Two sheets you can see hold what SimuXL reads back, rather than a result. SXL Fit holds a record of each fit you used, and every scan reads it to name the inputs fitted - when your sheets go to a new workbook instead (see Reports, above), each record opens one of its own, and those are not read. SXL Alternatives holds the Alternative Table: SimuXL creates it and keeps its Base case column, you set up the alternatives in Alternatives or type them, a comparison reads them, and SimuXL never deletes or replaces the sheet. Every other sheet SimuXL names with SXL is a result - an analysis, a listing or an export - and goes where Reports, above, says, except Input Settings' listing and Export Trials' two sheets, which always open in a new workbook.
The license agreement, 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.
SimuXL is licensed by Simuraytics Software LLC under the SimuXL Software License Agreement, Version 1.2. The first SimuXL button you press on a machine shows it once, and Help > License shows it at any time, with the box I agree to the SimuXL Software License Agreement, Version 1.2. Tick it to agree: Activate works only once it is ticked. The trial runs either way.
SimuXL keeps the version you agreed to and the day, in SimuXL.agreement beside its log, and Help > About carries an Agreement line saying whether its box was ticked on this machine. The agreement is also License.txt beside the add-in and at simuxl.com/License.txt. Third-party notices... on the same dialog shows the licenses of the components SimuXL includes, which are also THIRD-PARTY-NOTICES.txt beside the add-in.
SXL- and is a few lines long: paste it into the box on the same dialog and press Activate, with the agreement ticked. SimuXL checks it and keeps it beside its log; you do not need to enter it again.SXLA- - three groups of four characters. Paste it into the same box and press Activate, with the agreement ticked: SimuXL sends the code, this machine's id and SimuXL's version number 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. A code that has been cancelled (after a refund, say) activates no machine, this one included, and the dialog says so.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.
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.
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. The request carries SimuXL's version number and no machine id, licensee, key or workbook name - though, like any web request, it reaches the web host with your IP address. 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.
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. Like any web request, it reaches the web host with your IP address. 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 SimuXL-Setup.exe from there and run it with Excel closed, as you did this one.
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, and nothing more. 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.
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.
Every SimuXL file is signed by Simuraytics Software LLC; one step trusts that signature on your machine - the installer offers to run it for you - and the add-in then loads without being blocked.
Both SimuXL64.xll and SimuXL32.xll carry a digital signature by Simuraytics Software LLC, SimuXL's licensor. 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 installer runs this step for you. It is a ticked option on the installer's tasks page, before anything is installed, and can be unticked there. To run it yourself - you unticked it, or this machine's certificate store was reset - open the folder SimuXL is installed in (%LOCALAPPDATA%\Programs\SimuXL unless you chose another), where SimuXL-Publisher.cer and SimuXL-Trust.bat sit beside the add-in.
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. 4.14.0 issued SimuXL's certificate again, in the name of Simuraytics Software LLC and with the same key; the step - the installer offers it - takes the earlier certificate out, so only the current one stays trusted, and it does the same whenever the certificate is issued again. A machine whose administrator locks the certificate stores may need the administrator to run the step instead.
Help > About carries a Signature line reading what the running file's signature says on this machine: Signature: signed by Simuraytics Software LLC, 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 Simuraytics Software LLC says so on the same line; it is not a file SimuXL released.
One file, SimuXL-Setup.exe from simuxl.com, installs the right add-in for your Excel, registers it, and runs the trust step - no administrator needed.
The Download button on simuxl.com gives you SimuXL-Setup.exe. Close Excel, run it, and it does these five things:
%LOCALAPPDATA%\Programs\SimuXL), with SimuXL-Publisher.cer, SimuXL-Trust.bat, this guide, the license agreement (License.txt) and the third-party notices (THIRD-PARTY-NOTICES.txt) beside the add-in. No administrator is asked for and nothing outside your own profile changes.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: the publisher reads Simuraytics Software LLC on a machine that already trusts SimuXL's certificate, and may read Unknown publisher on one that does not yet - a new machine, or one that trusted only the certificate before 4.14.0 - because the certificate is SimuXL's own and not one bought from a certificate authority. Either way, press Run anyway.
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.
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. Ctrl+Shift keyboard chords are disabled in this build.
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, Make 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.
This build registers no Ctrl+Shift keyboard chords. (The keys do whatever Excel itself assigns them.) They are 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 a chord. Every command is on the SimuXL tab or the right-click menu, apart from the two below. The chords will return once the cause is fixed.
Convert and Revert have no button. Convert turns inputs defined by the older VBA SimuXL's dialog into formulas, keeping what each cell held in a very hidden sheet, __SimuXL_Conversion, and Revert puts them back from it: press Alt+F11, then Ctrl+G, type Application.Run "SimuXL_Convert" or Application.Run "SimuXL_RevertConversion" and press Enter.
SXL.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:
answer = Application.Run("SXL.RunSimulationArray", 10000, 12345)
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.=SXL.Version() in any cell answers with the build you are running - version, artefact and bitness. It is the first line of Help > About, which asks you to quote every line it prints in a bug report; which Excel you are running is another of them, described below.
#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.=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.
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.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.=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.
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.Most of what follows is SimuXL working correctly and being surprising. The first two are not.
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.
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.
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.
.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.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.
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.
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.
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.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.
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.
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.
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.
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.
Every term this guide uses in a particular way, in one place.
=SXL.YesNo(0.05) * SXL.Triangular(10, 20, 50) is one cell and two Uncertain Inputs.=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.#, 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 needs to be told. 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 and deliberate, and both headings say so. Call (from 1), Output # (from 1), Control # (from 1) and Made input # (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.SXL.Output, so the definition travels with the cell.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.~ are inside it.=SXL.Triangular(80, 100, 130,, "P10,P50,P90") - and SimuXL works the distribution's own parameters out from it every time the cell calculates.