Text functions
UPPER
Matches all 10 recorded answers
Recorded: 5 in the answer bank and 5 workbook cells. How we measure this · See the Rust code
Local names in 40 languages
| Language | Name in Excel |
|---|---|
| Arabic | UPPER |
| Bulgarian | UPPER |
| Czech | UPPER |
| Danish | UPPER |
| German | UPPER |
| Greek | UPPER |
| English (Australia) | UPPER |
| English (United Kingdom) | UPPER |
| English (United States) | UPPER |
| Spanish | UPPER |
| Estonian | UPPER |
| Finnish | ISOT |
| French | UPPER |
| Hebrew | UPPER |
| Croatian | UPPER |
| Hungarian | UPPER |
| Indonesian | UPPER |
| Italian | UPPER |
| Japanese | UPPER |
| Korean | UPPER |
| Lithuanian | UPPER |
| Latvian | UPPER |
| Norwegian | UPPER |
| Dutch | UPPER |
| Polish | UPPER |
| Portuguese (Brazil) | UPPER |
| Portuguese (Portugal) | UPPER |
| Romanian | UPPER |
| Russian | UPPER |
| Slovak | UPPER |
| Slovenian | UPPER |
| Serbian (Latin) | UPPER |
| Swedish | UPPER |
| Thai | UPPER |
| Turkish | BÜYÜKHARF |
| Ukrainian | UPPER |
| Vietnamese | UPPER |
| Chinese (Simplified) | UPPER |
| Chinese (Hong Kong) | UPPER |
| Chinese (Traditional) | UPPER |
Names from Microsoft's support site.
What it does
UPPER(text)
UPPER returns the argument text with every character replaced by its uppercase form.
That sentence is short, and every hard question about the function hides inside "its uppercase form". Case mapping is not a property of a character in isolation; it is a function of a character, a mapping table, and — in the general case — a locale and the surrounding context. The four mappings a text function might implement are genuinely different:
- ASCII only.
a–zmap toA–Z; everything else is left alone. Simple, locale-free, and wrong for most of the world. - Simple Unicode uppercase. One code point maps to one code point, using Unicode's simple
uppercase mapping.
ébecomesÉ. - Full Unicode uppercase. One code point may map to several. The canonical example is
ß, whose full uppercase mapping isSS— a mapping that changes the length of the string. - Locale-tailored uppercase. Turkish and Azerbaijani map dotless
ıtoIand dotteditoİ, which differs from every other locale's mapping ofi.
These four disagree on real, ordinary text, and the difference is observable in a spreadsheet.
UPPER is therefore one of the functions where "it just uppercases" is not a specification.
Which of the four Excel implements, this Handbook has not established. That is the honest state
and it is why the "What has not been checked" section below is unusually specific.
Arguments
UPPER(text)
| Argument | Required | Meaning |
|---|---|---|
text | yes | The text to convert. |
One argument, no options — in particular no locale argument, which is the reason locale-tailored mapping is such a live question: if Excel does tailor, it must be doing so from ambient state, and ambient state is exactly what makes a formula's result depend on the machine it runs on.
Non-text arguments convert to text first. Upstream records the specific rule that LOWER and
UPPER textify logicals on the ordinary values-only seam, so UPPER(TRUE) is the string TRUE
rather than an error or a number. Numbers arrive as their general-format rendering; since digits
and the exponent marker have no distinct cases, UPPER of a number is generally that rendering
unchanged, though the marker's case in scientific notation is worth checking rather than assuming.
Try it
Quirks
Result and edge cases
The return kind is Text. UPPER("") is "".
Boundaries worth naming:
- Length can change. If Excel implements full Unicode uppercase,
UPPERcan return a longer string than it was given — theß→SScase. A caller that assumesLEN(UPPER(x)) = LEN(x)is making an assumption about which of the four mappings Excel uses. - The 32,767-code-unit cap therefore becomes reachable from below; see the value universe for how the cap behaves on the formula path.
UPPERis not a normaliser. It does not compose or decompose combining marks.UPPERof a decomposede+ combining acute is not guaranteed to equalUPPERof the precomposedé, andEXACTwill tell you they differ.UPPERis not injective, so it is not safely reversible:LOWER(UPPER(x))is notxin general.- An empty referenced cell delivers
Empty, distinct from an omitted argument. - Errors propagate.
Errors
Microsoft's page is the authority and is linked below; it was not retrievable while this entry was
written, so nothing here paraphrases it. UPPER is a total function over text and there is no
documented domain restriction to state. The reachable errors are the ordinary ones:
| Error | Condition |
|---|---|
| any error value | Propagated from the argument; coercion does not discard worksheet errors. |
#VALUE! | An argument kind with no text conversion in this context, or a result that exceeds the text cap on the formula path. |
The second row's cap behaviour is described in the value universe
as an observed distinction between the formula and interop paths; whether UPPER in particular
reaches it has not been probed.
How to implement
Notes for implementers
- Name your mapping. Write down which of the four mappings you implement and treat it as part
of the signature. A port that silently uses the host language's default (
to_uppercasein Rust is full Unicode;ToUpperin .NET is culture-sensitive;str.upperin Python is full Unicode) will inherit that language's choice as Excel semantics. - Culture-sensitive APIs are a trap in both directions.
ToUpper()on a Turkish thread gives a different answer than on an invariant one. If you want reproducibility, use the invariant form explicitly — and record that you did, because it may be a divergence from Excel rather than a fix. - Allow the length to change in your buffers and in your result-cap check. In-place uppercase over a fixed-size UTF-16 buffer is only correct for simple mapping.
- Operate on scalars, not code units. Case mapping of a surrogate pair requires decoding it first; a code-unit loop leaves supplementary-plane letters (Deseret, Adlam, Warang Citi) unmapped.
- Lift a single array-valued argument.
Rust code
Show the CalcFunc source of this function
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
UPPER · 1 lines · calc-func/src/catalogue/text_functions.rs on GitHub13 upper_fn "UPPER" (1, 1) [V "text"] |s, a, sv| { cased(s, a, k::upper) }
Kernels shared with other functions
casedcatalogue/text_functionstextported/text_kernelstext_from_strported/text_kernelspush_singleton_or_originalported/text_kernelspush_upperported/text_kernelsis_well_formedported/text_kernelsupperported/text_kernels
Argument and result plumbing
text_argcatalogue/kit
No implementation has been published with a Handbook test suite for this function.
Version differences
No comparison between specific Excel builds is recorded here yet. This does not establish that all builds behave alike.
Alternatives
Relationships
LOWER— the mirror function, same implementation module upstream, and subject to every question on this page in the opposite direction. Note that lowercase has its own asymmetries: Greek final sigma is context-dependent in a way no uppercase mapping is.PROPER— the third member of the case family. Upstream records its word-boundary behaviour as restarting capitalisation at non-letter separators including apostrophes and digits, which is whyPROPER("o'brien")is not what a reader expects.PROPERis notUPPERof the first letter.EXACT— the case-sensitive comparison.EXACT(UPPER(a), UPPER(b))is the usual hand-rolled case-insensitive comparison, and it inherits every mapping question above.=(the comparison operator) is already case-insensitive for text, which makesUPPERunnecessary in many comparisons where people reach for it out of habit from other languages.SEARCHversusFIND, and thematch_modearguments ofTEXTAFTER,TEXTBEFOREandTEXTSPLIT, express case-insensitivity directly and are usually better than uppercasing both sides.ASCandDBCSare the width conversions, sometimes mistaken for case conversions because they also "change letters". They do not touch case.
Named variants
No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents