TL;DR — Both functions delete characters you can't see, but they hunt different prey.
TRIM(text)removes leading, trailing, and extra spaces (collapsing runs to one), but only the normal space, ASCII 32.CLEAN(text)removes non-printing control characters, codes 0–31 (line breaks, tabs from a bad export). The catch that traps everyone: text pasted from a web page or PDF often carries a non-breaking space,CHAR(160)— and neither TRIM nor CLEAN touches it. The fix that catches everything is one formula.
=TRIM(" Apple Inc. ") ' -> "Apple Inc." (edges + inner runs)
=CLEAN("Line1"&CHAR(10)&"Line2") ' -> "Line1Line2" (strips the line break)
=TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160)," "))) ' the catch-all cleaner
Trailing spaces and stray control characters are the hardest bugs in a
spreadsheet precisely because you can't see them. A lookup misses, a SUM
comes up short, "Apple" and "Apple " land in two different pivot rows — and the
cells look identical. TRIM and CLEAN are how you make what's there match
what you see.
What you'll learn
- The split:
TRIMtargets spaces,CLEANtargets control characters - Why
TRIMkeeps single interior spaces (it's a collapser, not a nuker) - The
CHAR(160)non-breaking space that slips past both — and the one-line fix - Why invisible whitespace silently breaks
=,VLOOKUP, and dedup - The judgment call: clean once at the import boundary, not in every formula
The mental model: two different janitors
Think of TRIM and CLEAN as two cleaners with narrow job descriptions.
TRIM is the whitespace janitor. It walks the string and removes every
space at the start and end, and collapses any internal run of spaces down to a
single space. That "collapse internal runs" behaviour is the part people forget:
TRIM is not "remove all spaces," it's "normalise spacing to one between words."
CLEAN is the control-character janitor. It removes the low, non-printing
characters — codes 0 through 31 — that sneak in from copy-pasting out of email,
a database export, or a text file with the wrong line endings. The classic one
is CHAR(10), a line break stuck inside a cell that makes your data look
one-line but behave like two.
They don't overlap and they don't compete. If your junk is spacing, that's
TRIM. If your junk is a weird invisible glyph or a line break, that's CLEAN.
Most real imported data has both, which is why you so often see them nested:
=TRIM(CLEAN(A2)).
The rule that unlocks everything: the space you can't see is usually CHAR(160)
Here is the single most common support question about TRIM, and its answer is
the whole reason to read this article: "I ran TRIM and the space is still
there."
Ninety percent of the time, that "space" is not ASCII 32. It's a non-breaking
space, CHAR(160) (the HTML ), and it arrives whenever you paste from
a web page, a PDF, or a rendered report. TRIM only knows about ASCII 32, so it
walks right past the 160. And CLEAN only removes 0–31, so 160 sails past that
too. The character is invisible, both janitors ignore it, and you're left
staring at a cell that refuses to match.
' Prove it — this returns 160, not 32:
=CODE(RIGHT(A2, 1)) ' -> 160 ("aha, non-breaking space")
' Convert the 160s to normal spaces first, THEN trim:
=TRIM(SUBSTITUTE(A2, CHAR(160), " "))
' The belt-and-braces cleaner for truly messy imports:
=TRIM(CLEAN(SUBSTITUTE(A2, CHAR(160), " ")))
The SUBSTITUTE(A2, CHAR(160), " ") swaps every non-breaking space for a real
one, and then TRIM can do its job. Commit that pattern to memory — it turns
"TRIM is broken" into a solved problem for the rest of your career.
Why this matters: invisible junk breaks matching, not just looks
Extra spaces aren't a cosmetic problem. They break equality, and equality is what lookups, dedup, and grouping are built on.
="Apple"=A2returns FALSE whenA2is"Apple "— the trailing space makes them different strings.VLOOKUPandXLOOKUPreturn#N/Aon a value that's "right there," because the key in one table has a stray space the other doesn't.- A PivotTable or
UNIQUEsplits"North"and"North "into two rows, and your regional totals quietly double-count.
Every one of these is invisible in the grid, which is what makes them expensive.
TRIM on the join key — or better, on the column at import — is the cheapest
insurance in Excel.
CLEAN's blind spot (and TRIM's)
CLEAN was designed for the ASCII control range, 0–31. That's genuinely useful
for stripping embedded CHAR(10) line breaks, but be honest about its limit: it
does not remove CHAR(160), and it won't touch other high-range gremlins
like zero-width spaces (CHAR(8203)) that modern web copy can introduce. For
those, you're back to SUBSTITUTE(A2, CHAR(8203), "").
The reliable way to find what you're dealing with is CODE (first character)
or UNICODE (for anything above 255): wrap the suspect character and read its
number, then SUBSTITUTE it out by that number. Guessing wastes an afternoon;
CODE/UNICODE tells you in one formula.
The judgment call: clean at the boundary, not everywhere
The tempting anti-pattern is to sprinkle TRIM inside every formula that touches
a text column — every VLOOKUP, every comparison, every concat. That works, but
it's a smell: it means the data is dirty and you're paying to re-clean it on
every recalculation, forever.
The professional move is to clean once, at the import boundary. Bring the raw
column in, add one helper column of =TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160)," "))),
paste it back as values, and delete the raw. From then on the data is clean and
every downstream formula stays simple. If you're pulling data regularly, Power
Query's Trim and Clean transforms do the same thing as a repeatable step —
that's the right home for recurring cleanup. Reach for the formulas when it's a
one-off; reach for Power Query when it's a pipeline.
How ExcelMaster helps
"Why won't this VLOOKUP match — the values look the same" is one of the most
common things people ask, and the answer is almost always invisible whitespace.
ExcelMaster checks for exactly that: it spots the trailing space or the
CHAR(160), tells you which character is the culprit, and writes the
TRIM/CLEAN/SUBSTITUTE combination that fixes the whole column — not a
band-aid wrapped around one formula. You describe the symptom ("the match keeps
failing"); it finds the junk you can't see.
Frequently asked questions
What's the difference between TRIM and CLEAN in Excel?
TRIM removes extra spaces — leading, trailing, and repeated interior spaces
(collapsing them to one), but only the normal space character (ASCII 32).
CLEAN removes non-printing control characters (codes 0–31), such as line
breaks embedded in a cell. Use TRIM for spacing, CLEAN for stray invisible
glyphs; nest them as TRIM(CLEAN(A2)) for both.
Why doesn't TRIM remove the space in my cell?
Because it's probably not a normal space. Text pasted from the web or a PDF often
contains a non-breaking space, CHAR(160), which TRIM ignores. Confirm with
=CODE(RIGHT(A2,1)) — if it returns 160, fix it with
=TRIM(SUBSTITUTE(A2, CHAR(160), " ")).
Does TRIM remove all spaces between words?
No. TRIM keeps a single space between words and only removes the extra ones,
plus everything at the start and end. TRIM("a b") returns "a b", not
"ab". To remove every space, use SUBSTITUTE(A2, " ", "") instead.
How do I remove line breaks from a cell?
Use CLEAN, which strips the CHAR(10) line-break character:
=CLEAN(A2). If the line break was inserted as a different character or you also
want to replace it with a space, use =SUBSTITUTE(A2, CHAR(10), " ").
What removes both extra spaces and non-printing characters at once?
Nest all three tools: =TRIM(CLEAN(SUBSTITUTE(A2, CHAR(160), " "))). The
SUBSTITUTE converts non-breaking spaces to normal ones, CLEAN strips control
characters, and TRIM collapses the remaining spacing.
Tested in
Tested in: Excel 365 (Windows 11) — last verified 2026-07-06.
Related guides: Excel SUBSTITUTE & REPLACE · Excel LEN · Excel UPPER, LOWER & PROPER · Excel VALUE & NUMBERVALUE
