TEXTBEFORE
Unsupported (not recognized)Category: Text · Last tested 2026-09-01
Real compatibility results for the TEXTBEFORE 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.
TEXTBEFORE 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 25.8.7.3.
If you need TEXTBEFORE in LibreOffice Calc, use 25.8.7.3 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 | No | Yes (Drive import, 2026-08-29) | Unsupported (not recognized) |
| 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 TEXTBEFORE’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 | Unsupported (not recognized) | 2026-08-29 |
| 25.2.0.3 | Unsupported (not recognized) | 2026-08-29 |
| 25.8.7.3 | Supported, behaves as documented | 2026-07-29 |
Why isn't TEXTBEFORE working in LibreOffice?
If TEXTBEFORE returns a #NAME? error in LibreOffice Calc, you are
almost certainly running a release older than 25.8.7.3 — that is exactly
what our executed tests show: #NAME? in 24.2.0.3, working from
25.8.7.3 onward. Check your version under Help → About LibreOffice and upgrade to
25.8.7.3 or newer; no setting or extension enables it in older releases. (Other causes of this
error: see the error values guide.)
Why isn’t TEXTBEFORE working in Google Sheets?
Google Sheets does not implement TEXTBEFORE: we imported the formula into
Sheets on 2026-08-29 and every case came back #NAME?
(unrecognized function). Sheets is a rolling service with no version to pin, so this is a
statement about the service on that date, and Google’s own
function list does not document it either. Rewrite the formula with a documented
Sheets equivalent — see the
Excel ↔ Sheets equivalents table.
Discovered quirks
-
=TEXTBEFORE("a-b-c","-") on
Google Sheets returned
#NAME?, but the documented/expected
result is a.
Provenance
MISMATCH vs expected: expected 'a', got '#NAME?'
-
=TEXTBEFORE("a-b-c","-",2) on
Google Sheets returned
#NAME?, but the documented/expected
result is a-b.
Provenance
MISMATCH vs expected: expected 'a-b', got '#NAME?'
-
=TEXTBEFORE("abc","-") on
Google Sheets returned
#NAME?, but the documented/expected
result is #N/A.
Provenance
MISMATCH vs expected: expected '#N/A', got '#NAME?'
-
=TEXTBEFORE("abc","-","none") on
Google Sheets returned
#NAME?, but the documented/expected
result is #VALUE!.
Provenance
Signature: TEXTBEFORE(text, delimiter, [instance_num], [match_mode], [match_end], [if_not_found]). "none" here is passed as instance_num, where a number is required, so the documented result is #VALUE! -- confirmed by Excel for the web and LibreOffice 25.8. if_not_found must be the sixth argument.; MISMATCH vs expected: expected '#VALUE!', got '#NAME?'
-
=TEXTBEFORE("a-b-c","-",-1) on
Google Sheets returned
#NAME?, but the documented/expected
result is a-b.
Provenance
-1 means the last delimiter; text before it is 'a-b'; MISMATCH vs expected: expected 'a-b', got '#NAME?'
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 |
|---|---|---|---|---|
| =TEXTBEFORE("a-b-c","-") | Text before the first delimiter occurrence | a | a | Matched |
| =TEXTBEFORE("a-b-c","-",2) | instance_num=2 counts to the 2nd delimiter | a-b | a-b | Matched |
| =TEXTBEFORE("abc","-") | Delimiter not present and no if_not_found -> #N/A | #N/A | #N/A | Matched |
| =TEXTBEFORE("abc","-","none") | Text in the instance_num position (3rd argument) is not if_not_found (6th) -> #VALUE! | #VALUE! | #VALUE!ProvenanceSignature: TEXTBEFORE(text, delimiter, [instance_num], [match_mode], [match_end], [if_not_found]). "none" here is passed as instance_num, where a number is required, so the documented result is #VALUE! -- confirmed by Excel for the web and LibreOffice 25.8. if_not_found must be the sixth argument. |
Matched |
| =TEXTBEFORE("a-b-c","-",-1) | Negative instance_num counts delimiters from the end | a-b | a-bProvenance-1 means the last delimiter; text before it is 'a-b' |
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 |
|---|---|---|---|---|
| =TEXTBEFORE("a-b-c","-") | Text before the first delimiter occurrence | #NAME? | a | Mismatch |
| =TEXTBEFORE("a-b-c","-",2) | instance_num=2 counts to the 2nd delimiter | #NAME? | a-b | Mismatch |
| =TEXTBEFORE("abc","-") | Delimiter not present and no if_not_found -> #N/A | #NAME? | #N/A | Mismatch |
| =TEXTBEFORE("abc","-","none") | Text in the instance_num position (3rd argument) is not if_not_found (6th) -> #VALUE! | #NAME? | #VALUE!ProvenanceSignature: TEXTBEFORE(text, delimiter, [instance_num], [match_mode], [match_end], [if_not_found]). "none" here is passed as instance_num, where a number is required, so the documented result is #VALUE! -- confirmed by Excel for the web and LibreOffice 25.8. if_not_found must be the sixth argument. |
Mismatch |
| =TEXTBEFORE("a-b-c","-",-1) | Negative instance_num counts delimiters from the end | #NAME? | a-bProvenance-1 means the last delimiter; text before it is 'a-b' |
Mismatch |
LibreOffice Calc 25.8.7.3 (tested 2026-07-29)
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =TEXTBEFORE("a-b-c","-") | Text before the first delimiter occurrence | a | a | Matched |
| =TEXTBEFORE("a-b-c","-",2) | instance_num=2 counts to the 2nd delimiter | a-b | a-b | Matched |
| =TEXTBEFORE("abc","-") | Delimiter not present and no if_not_found -> #N/A | #N/A | #N/A | Matched |
| =TEXTBEFORE("abc","-","none") | Text in the instance_num position (3rd argument) is not if_not_found (6th) -> #VALUE! | #VALUE! | #VALUE!ProvenanceSignature: TEXTBEFORE(text, delimiter, [instance_num], [match_mode], [match_end], [if_not_found]). "none" here is passed as instance_num, where a number is required, so the documented result is #VALUE! -- confirmed by Excel for the web and LibreOffice 25.8. if_not_found must be the sixth argument. |
Matched |
| =TEXTBEFORE("a-b-c","-",-1) | Negative instance_num counts delimiters from the end | a-b | a-bProvenance-1 means the last delimiter; text before it is 'a-b' |
Matched |
Docs & syntax
- Excel (desktop): official documentation
- LibreOffice Calc: official documentation
Where TEXTBEFORE 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. - FILTER no match: Excel #CALC! vs LibreOffice #N/A
An empty FILTER is #CALC! in Excel but #N/A in LibreOffice, and TEXTAFTER's fallback still errors. Executed Google Sheets has no TEXTBEFORE/TEXTAFTER at all - it returns #NAME?. - 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.