DS.DATA and DS.INFO
The two Axmo functions you can type into a cell — DS.INFO for the model's status, DS.DATA for reading a slice of the model into the sheet.
Axmo adds exactly two functions you can type into a cell. Everything else in Axmo is driven from the ribbon and the task pane — these two exist for the moments when you want the model's state, or a slice of its numbers, to live in a formula.
Both read the model that is currently loaded in the workbook. They read it; they never change it, and there is no way to trigger a recalculation from a cell.
DS.DATA(rowBlock, [colBlock], [exclFilter])
Reads a slice of the model into the sheet and spills it as a labelled grid. You name what goes down the rows and what goes across the columns; Axmo works out the rest.
=DS.DATA("Revenue")
=DS.DATA("Country", "Year; Revenue")
=DS.DATA("Country", "Year; Revenue", "Italy")
=DS.DATA("[Profit Contribution, %]", "Year")
Nothing is configured and nothing is written back into the model. The result belongs to the formula and disappears with it — which is what makes it the quick counterpart to an Output Range rather than a replacement for one.
Writing the two axis blocks
Each block is a list of items separated by semicolons. An item is either a dimension or layer to lay out along that axis, or a series to read.
;separates items.;;starts a new line within the block.- Every series reference goes in one block — rows or columns, never split between the two.
- A complex expression needs a name, given with
:=—"Revenue := Revenue[Actual]". A plain series name needs nothing. AD:Nameuses a saved axis definition. An axis is either wholly anAD:reference or wholly written out; the two cannot be mixed on the same axis.- Names are written bare in the common case.
Revenue,Operating Cost,Fiscal 2025andGross Margin (LTM)all work as they are. Where a name will not read bare — because it carries punctuation, an apostrophe, an accent or a non-Latin script — put it in square brackets:"[Profit Contribution, %]". The brackets are the spelling, not a filter; everything between them is read exactly as typed.
The full formula language works here — operators, functions, offsets, [_] and [*] — not just plain series names. It is the same language the series editor uses, so an expression that works in a formula works in a block string.
How the grid comes out depends on how many series you asked for. With one series, its name sits in the corner and the axes carry the dimensions. With two or more, the corner goes blank and the series names move into the row or column labels. And if you give nothing but a single series, Axmo adds the dimensions for you, preferring a sequential dimension along the columns.
Leaving things out
The third argument is a semicolon-separated list of elements to exclude. Each names elements of a dimension that the call is already laying out, and drops them together with everything beneath them — so excluding a region removes its countries too.
=DS.DATA("Country", "Year; Revenue", "Italy; Asia")
A trailing slash makes no difference: Italy and Italy/ do the same thing. You can only exclude from a dimension the call actually renders — filtering on something that is not on either axis is an error, and Axmo says so rather than ignoring it.
When a formula cannot produce a table
DS.DATA writes a short sentence into the cell instead of a table when it cannot produce one. There are
three of these:
| what you see | what it means |
|---|---|
| Axmo: no model loaded. | No model is open in this workbook. |
| Axmo: recalculate the model first. | The model is open but has never been calculated. |
| Axmo: fix the errors and recalculate the model first. | The model was calculated and something failed, so there are no values to show. |
Excel's own error values can still appear for Excel's own reasons — #SPILL! where the result has no room
to spill, and #NAME? in a workbook opened where the add-in is not installed.
Where a specific fault is known, the cell instead shows the fault itself, in the form
[CODE] a sentence describing it — one row per fault where there is more than one. The codes come from the
add-in's own catalogue, so this is not a fixed list of messages; each one names what went wrong and what to
do about it.
And where the table is produced but individual cells could not be calculated, those cells show [error]
while the rest of the table is filled normally. ISERROR identifies them, and the Status tab says how many
there are and which series they are in.
An Output Range behaves the same way: [error] in a cell that could not be calculated, and a bracketed
fault where the range's own definition will not compile.
A cell that begins with a bracket is Axmo speaking, not a value. [error] marks a coordinate that could
not be calculated. [CODE] a sentence names a fault and says what to do about it. In a data cell, an opening
bracket always means a message rather than a number. The corner of a DS.DATA block is different — it shows
the expression you wrote.
A code and a message, when the formula itself does not compile — one row per problem, spilling downwards, so several problems are readable instead of running together:
[DSDATA_DSE_ACROSS_BOTH_AXES] DS.DATA: series references appear in both arguments; they must all go in one.
These are the codes specific to DS.DATA:
| Code | What happened |
|---|---|
DSDATA_NO_DSE_IN_BLOCKS | Neither block names a series. One of them has to. |
DSDATA_DSE_ACROSS_BOTH_AXES | Series named in both blocks. They must all go in one — but this code also appears when a token in the second block could not be read at all, so check the spelling of every name in it before moving anything. |
DSDATA_AD_NOT_FOUND | An AD: reference names an axis definition that doesn't exist. |
DSDATA_AD_AMBIGUOUS | An AD: reference matches two axis definitions with the same name. |
DSDATA_AD_INLINE_MIXED | One axis mixes an AD: reference with written-out items. |
DSDATA_FILTER_DIM_NOT_ON_AXIS | The third argument filters a dimension the call doesn't lay out. |
This is not the whole list, and it isn't meant to be. DS.DATA compiles through the same machinery as the rest of Axmo, so anything the compiler can object to — a parse error, an unknown name, a shape or dimensional mismatch — arrives in a cell in the same [CODE] message form. The code names the problem; the message tells you what to change.
DS.INFO()
Takes no arguments. Returns a single line of text describing the loaded model.
=DS.INFO()
With no model in the workbook, it says so and tells you where to start:
Axmo: no model loaded. Use the Load Demo button in the Axmo ribbon to get started.
With a model loaded, it returns five fields:
Axmo Data Modelling | Dimensions: 7 | Series: 24 | Status: Up to date | Last recalc: 14:32:09
The status is a short phrase describing the model's current state.
The values are:
| Status | Describes a failure | What it means |
|---|---|---|
No model | No | The workbook contains no Axmo model. |
Compilation error | Yes | The model could not be compiled, so nothing has been calculated. |
Run-time error | Yes | The model compiled, but something failed while it ran — loading data, or calculating. |
Output incomplete | Yes | The model calculated, but not every result reached the sheet. |
Recalculation needed | No | The results cannot be relied on. Something has changed since the last recalculation, or there are no results yet. |
Calculated, with errors | Yes | It computed, and at least one coordinate holds a failure. |
Calculated — a source loaded nothing | Yes | A declared loader honoured nothing. |
Up to date | No | The model has been recalculated and its results are current. |
Last recalc is a clock time, in your own locale's format, with no date — it refers to this session. It reads never if the model has not been recalculated since the workbook was opened.
DS.INFO reports the model's status. A pipeline reading it can tell a model that is merely out of date from one that is broken — and can stop, rather than retry something that will fail again. The same status appears in the task pane, and where the task pane has room it adds detail — a run-time error may be narrowed to data loading, and an up-to-date model may be noted as carrying warnings.
When the numbers stop moving
This is the one behaviour worth knowing before you rely on either function.
Neither function is volatile. Excel re-evaluates a cell when its arguments change — and when you update the model, the arguments haven't changed. So after an Update, DS.DATA cells still hold what they last computed until Excel recalculates them. Press Ctrl+Alt+F9, or edit and re-enter the formula, and they catch up.
There is one case Axmo handles for you. Excel stores custom-function results in the workbook and does not re-run them when the file is opened — so a DS.DATA cell would otherwise show you last week's numbers over a model that currently holds none. When a workbook opens with no values loaded, Axmo forces a recalculation so those cells report honestly rather than showing you something stale. When values did load, it leaves them alone, because they already agree with the model.
Where these live
DS.DATA reads the model in the workbook its own formula sits in, and nothing else. There is no way to point it at a model loaded in a different workbook, and no way for a cell and the panel to be showing you two different models.