Skip to content

What is in the lineage, and what is not

A lineage tool is only useful if you know where it stops. This page lists what linexcel reads out of a workbook, and — more importantly — what it does not, so that a graph which looks complete can be trusted to be complete.

In the graph

Formulas Every formula cell, with its computed value and a step-by-step decomposition. Cells sharing an R1C1 pattern are grouped into one node
Cells and ranges Precedent and dependent edges, including across sheets
Defined names Workbook-scoped and sheet-scoped, resolved to the cells they point at
VBA Procedures as nodes, their internal call graph, and the ranges they read and write when the reference is written literally — Range("A1"), Cells(2, 3), [A1:B4], Worksheets("X").Range(...)
Power Query Each query as a node with its M source, the range it loads into, the sources it names and the queries it chains from
Values Read back from the workbook and recomputed, with both readings shown side by side

Represented, but not resolved

These appear in the graph as grey external reference nodes. The dependency is visible; what sits at the other end of it is not, because it is not in the file:

  • links to another workbook — '[1]Annual'!B4
  • 3-D references spanning sheets — Sheet1:Sheet3!A1
  • structured table references the engine cannot resolve
  • a defined name pointing outside the workbook

Showing them as nodes rather than dropping them is deliberate: a formula whose precedent is missing is a fact about the workbook, not a gap to hide.

Power Query (Get & Transform)

Queries are in the lineage. Each one is a node carrying its M source, and the graph crosses it: Source!A1:B4 → BusyProducts → Loaded!A1:B3, where the landing range used to sit at the top of the graph with nothing above it.

What is read, and from where:

The M source the customXml part whose schema is http://schemas.microsoft.com/DataMashup: base64, then a ZIP whose Formulas/Section1.m holds every query in plain text
The destination xl/connections.xml names the query a connection loads, xl/queryTables/*.xml ties that connection to a table on a sheet
The sources read off the M — Excel.CurrentWorkbook(){[Name="X"]} is a table or defined name of this file and is linked to it, and a query reading another is an edge between the two
Everything else File.Contents, Folder.Files, Web.Contents, Sql.Database and any *.Database, *.Feed or *.DataSource connector: named, never opened

A query that computes without loading anywhere — connection only, or straight into the data model — is shown as loading nowhere rather than dropped.

Where it stops is the data behind an outside source. A CSV on a share, a REST endpoint, a database: the query names them, linexcel does not read them, and the panel says so under the source list. And M is a real language — a source built at run time rather than written out is invisible to a static reader, which is the same limit VBA has below.

Not in the graph

Formulas the engine does not implement

The range intersection operator — =SUM(D2:D10 D5:D20) — is the one met in practice. Such a cell keeps the value stored in the file, says so in its card, and is named in the workbook warnings rather than being shown as a recalculation that never happened.

Volatile functions

TODAY(), NOW(), RAND(), RANDBETWEEN() and RANDARRAY() answer differently every time they are computed, so there is nothing to check them against: a value recomputed today can never agree with a file saved last week. linexcel does not recompute them. The card shows the value the file stores and says Not recalculated (volatile) in the other column, and the cell is not decomposed step by step — every step would carry a figure from today's clock.

OFFSET, INDIRECT, CELL and INFO are volatile to Excel in that they recalculate on every edit, but they return the same value for the same workbook, so those are still computed.

Other workbooks

A formula reading '[Budget FY26.xlsx]Annual'!B4 depends on a file that is not being analyzed, and the calculation engine has nothing to follow. Three answers, in decreasing order of certainty:

named always — xl/externalLinks carries the file name and the path the workbook declares, and the node is labelled with them
cached when Excel saved the values it last read across the link, they are used and labelled as coming from that cache
read with --refs-dir (refs_dir=), the referenced workbook is opened from that folder and the reference evaluates to the value it stands for

The panel lists every linked workbook of a cell with its path and which of the three it got, so a stale or missing dependency is visible rather than silent. The same folder is searched for the .xlam, .xla and .xlsm add-ins whose VBA a workbook calls into; their procedures join the graph, each module tagged with the file it came from.

VBA the parser cannot follow

Range access is detected only where it is written literally. A reference built at run time — Range(addr), Cells(i, j) in a loop, Application.Evaluate — is invisible to a static reader, and no static reader can do better. The procedure still appears as a node, with its source.