XLOOKUP
Supported, behaves as documentedCategory: Lookup and reference · Last tested 2026-09-01
Real compatibility results for the XLOOKUP function: executed in Excel for the web, Google Sheets and LibreOffice Calc, with desktop Excel behavior from Microsoft’s official documentation (we do not run desktop Excel — Excel for the web is a different application and is executed separately). Syntax and links to that documentation are below.
XLOOKUP under every LibreOffice release we test
(24.2.0.3, 24.8.7.2, 25.2.0.3, 25.8.7.3):
it returned #NAME? (unrecognized) in 24.2.0.3 and first works in 24.8.7.2.
If you need XLOOKUP in LibreOffice Calc, use 24.8.7.2 or newer.
Support matrix
| Engine | Documented | Live-tested | Verdict |
|---|---|---|---|
| Excel (desktop) | Yes | No โ documented only | n/a |
| Excel for the web | — | Yes (recalc, 2026-09-01) | Supported, behaves as documented |
| Google Sheets | Yes | Yes (Drive import, 2026-08-29) | Supported, behaves as documented |
| LibreOffice Calc | Yes | Yes (25.8.7.3, 2026-07-29) | Supported, behaves as documented |
LibreOffice version history
We executed the same test cases under each LibreOffice release to show exactly when XLOOKUP’s support changed — not documentation claims, real results.
| LibreOffice version | Verdict | Tested |
|---|---|---|
| 24.2.0.3 | Unsupported (not recognized) | 2026-08-29 |
| 24.8.7.2 | Supported, behaves as documented | 2026-08-29 |
| 25.2.0.3 | Supported, behaves as documented | 2026-08-29 |
| 25.8.7.3 | Supported, behaves as documented | 2026-07-29 |
Why isn't XLOOKUP working in LibreOffice?
If XLOOKUP returns a #NAME? error in LibreOffice Calc, you are
almost certainly running a release older than 24.8.7.2 — that is exactly
what our executed tests show: #NAME? in 24.2.0.3, working from
24.8.7.2 onward. Check your version under Help → About LibreOffice and upgrade to
24.8.7.2 or newer; no setting or extension enables it in older releases. (Other causes of this
error: see the error values guide.)
Executed test cases
Excel for the web (executed 2026-09-01 via OneDrive recalculation)
These values come from Excel for the web, not from desktop Excel. They are two different implementations of the calculation engine, and this run measured only the web one: the corpus was uploaded to OneDrive as .xlsx, recalculated by Excel for the web on open, and downloaded again for readback. Excel for the web is a rolling service with no pinnable version, so the run is identified by its date. Where a value here disagrees with the Expected column — which is Microsoft’s documentation of the desktop product — we cannot tell you whether the web engine diverges from the desktop one or the documentation is wrong about both, because we do not run desktop Excel.
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =XLOOKUP("b",A1:A3,B1:B3) | Basic exact-match lookup returns the corresponding value | 2 | 2 | Matched |
| =XLOOKUP("z",A1:A3,B1:B3) | No if_not_found arg and no match -> #N/A | #N/A | #N/A | Matched |
| =XLOOKUP("z",A1:A3,B1:B3,"missing") | Custom if_not_found value is returned when no match | missing | missing | Matched |
| =XLOOKUP(2.5,A1:A4,B1:B4,"none",-1) | match_mode -1 (exact or next smaller item) with no exact match | 20 | 20Provenance2.5 has no exact match; next-smaller is 2 -> 20 |
Matched |
| =XLOOKUP("x",A1:A4,B1:B4,"none",0,-1) | search_mode -1 finds the LAST occurrence of a duplicated key | 3 | 3ProvenanceTwo rows match 'x' (1 and 3); reverse search returns the later one |
Matched |
| =XLOOKUP("a",A1:A1,B1:B1) | Degenerate 1-cell lookup/return arrays where the cell is blank | #N/A | #N/AProvenanceA1 and B1 are blank; lookup value 'a' is not found |
Matched |
Google Sheets (executed 2026-08-29 via Drive import)
Google Sheets is a rolling service with no pinnable version, so this run is identified by its date. The corpus was imported to Drive as .xlsx, recalculated by Sheets, and exported back for readback.
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =XLOOKUP("b",A1:A3,B1:B3) | Basic exact-match lookup returns the corresponding value | 2 | 2 | Matched |
| =XLOOKUP("z",A1:A3,B1:B3) | No if_not_found arg and no match -> #N/A | #N/A | #N/A | Matched |
| =XLOOKUP("z",A1:A3,B1:B3,"missing") | Custom if_not_found value is returned when no match | missing | missing | Matched |
| =XLOOKUP(2.5,A1:A4,B1:B4,"none",-1) | match_mode -1 (exact or next smaller item) with no exact match | 20 | 20Provenance2.5 has no exact match; next-smaller is 2 -> 20 |
Matched |
| =XLOOKUP("x",A1:A4,B1:B4,"none",0,-1) | search_mode -1 finds the LAST occurrence of a duplicated key | 3 | 3ProvenanceTwo rows match 'x' (1 and 3); reverse search returns the later one |
Matched |
| =XLOOKUP("a",A1:A1,B1:B1) | Degenerate 1-cell lookup/return arrays where the cell is blank | #N/A | #N/AProvenanceA1 and B1 are blank; lookup value 'a' is not found |
Matched |
LibreOffice Calc 25.8.7.3 (tested 2026-07-29)
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =XLOOKUP("b",A1:A3,B1:B3) | Basic exact-match lookup returns the corresponding value | 2 | 2 | Matched |
| =XLOOKUP("z",A1:A3,B1:B3) | No if_not_found arg and no match -> #N/A | #N/A | #N/A | Matched |
| =XLOOKUP("z",A1:A3,B1:B3,"missing") | Custom if_not_found value is returned when no match | missing | missing | Matched |
| =XLOOKUP(2.5,A1:A4,B1:B4,"none",-1) | match_mode -1 (exact or next smaller item) with no exact match | 20 | 20Provenance2.5 has no exact match; next-smaller is 2 -> 20 |
Matched |
| =XLOOKUP("x",A1:A4,B1:B4,"none",0,-1) | search_mode -1 finds the LAST occurrence of a duplicated key | 3 | 3ProvenanceTwo rows match 'x' (1 and 3); reverse search returns the later one |
Matched |
| =XLOOKUP("a",A1:A1,B1:B1) | Degenerate 1-cell lookup/return arrays where the cell is blank | #N/A | #N/AProvenanceA1 and B1 are blank; lookup value 'a' is not found |
Matched |
Docs & syntax
- Excel (desktop): official documentation
- Google Sheets: official documentation
- LibreOffice Calc: official documentation
Related how-to recipes
- How to use XLOOKUP
- How to look up the LAST matching value (not the first)
- How to look up a value with two criteria (multi-condition lookup)
- How to XLOOKUP from another sheet
- How to return a default value when a lookup finds nothing
Where XLOOKUP behaves differently
- Which LibreOffice version for VSTACK, TEXTSPLIT, TAKE & DROP?
VSTACK, HSTACK, TEXTSPLIT, TAKE and DROP return #NAME? in LibreOffice 24.2, 24.8 and 25.2 - our executed runs show all fourteen working only from 25.8.7.3. Full version map by wave. - ARRAYFORMULA in Google Sheets: when you need it, and when it can't help
Google Sheets uses only the first element of an array passed to a scalar function - our executed run returns 140 for =SUM(SUMIFS(C2:C6,A2:A6,{"North","South"})) against 220 in LibreOffice. ARRAYFORMULA fixes six of nine cases; for SUMIFS criteria it does not, and SUMPRODUCT is the portable form. - VLOOKUP bad column index: Excel #REF! vs LibreOffice #VALUE!
Microsoft documents an out-of-range col_index_num as #REF!; LibreOffice Calc returns #VALUE! instead. The lookup still fails โ but every guard written around #REF! stops matching. - Your function exists but your file cannot say so: _xlfn storage tokens
Executed: eight IM* functions LibreOffice implements return #NAME? on all four builds because it cannot read Excel's _xlfn. token for them, while COT and CSC only work under that same prefix. Eleven LibreOffice aliases are erased by its own exporter, and a token change between 24.2 and 24.8 makes a 24.8-written file open as #NAME? in 24.2. - openpyxl and _xlfn.XLOOKUP: why your XLOOKUP opens as #NAME?
openpyxl writes formula text verbatim, so =XLOOKUP(...) is stored in the .xlsx under its plain name. Executed 2026-09-12: that cell is #NAME? in Excel for the web and in all four pinned LibreOffice builds, while =_xlfn.XLOOKUP(...) returns 20 in Excel for the web and in LibreOffice 24.8, 25.2 and 25.8.