TL;DR —
FINDandSEARCHdon't cut a string — they tell you where a piece of it starts, as a number.FIND("@", A2)returns the position of the@; you feed that number toMID/LEFTto slice by content instead of by a fragile hardcoded position. Two differences decide which to use:FINDis case-sensitive and takes no wildcards;SEARCHis case-insensitive and accepts*and?. And the trap that reddens whole columns: when there's no match, both return#VALUE!— never 0, never blank — so wrap them inIFERRORor test withISNUMBER. Every Excel version.
=FIND("@", A2) ' position of @ (case-sensitive, exact)
=SEARCH("st", A2) ' position of "st"/"ST"/"St" (case-insensitive)
=ISNUMBER(SEARCH("paid", A2)) ' TRUE if A2 contains "paid", any case
FIND and SEARCH are the functions people use least on their own and most
inside other formulas — and that's exactly the point. They are the GPS that makes
text extraction reliable. Understand them and the brittle RIGHT(A2, 4) habit
disappears.
What you'll learn
- Why
FIND/SEARCHreturn a position, not the text — and what to do with it - The two real differences: case-sensitivity and wildcards
- Why a missing match returns
#VALUE!, and the two ways to handle it - The
ISNUMBER(SEARCH(...))idiom for a clean "does it contain?" test - Using the 3rd argument to find the second occurrence
The mental model: a landmark finder, not a cutter
LEFT, MID and RIGHT cut. FIND and SEARCH locate. They answer one
question — "at which character position does this substring begin?" — and hand
back a number. On their own that number looks useless; its job is to become the
start_num of a MID or the length argument of a LEFT:
' Get the domain of an email: everything after the @
=MID(A2, FIND("@", A2) + 1, 99)
' Get the first name: everything before the first space
=LEFT(A2, FIND(" ", A2) - 1)
This is the pairing that turns position-based slicing into content-based slicing. You stop saying "take characters 1 through 5" and start saying "take everything up to the space, wherever it is." The slice now follows the data instead of assuming its shape.
The rule that unlocks everything: FIND vs SEARCH is two differences, not one
People remember "FIND is case-sensitive" and forget the second, equally important difference. Here is the full picture:
| Case | Wildcards (* ?) |
|
|---|---|---|
FIND |
Sensitive — "a" ≠ "A" |
Not supported (treated literally) |
SEARCH |
Insensitive — "a" = "A" |
Supported |
So:
=FIND("s", "Sales") ' 5 — the lowercase s; the capital S is skipped
=SEARCH("s", "Sales") ' 1 — matches the capital S, case ignored
=SEARCH("a?c", A2) ' finds "a", any char, "c" — only SEARCH does this
=FIND("a?c", A2) ' looks for the literal text "a?c"
The judgment is simple: reach for FIND when case matters or your needle
contains characters that would otherwise act as wildcards; reach for SEARCH
when you want a forgiving, human match. For "does this cell mention 'paid' in
any capitalization?", SEARCH is the right tool.
The #VALUE! trap: no match is an error, not a zero
This is the behavior that surprises everyone. When the substring isn't there,
FIND and SEARCH don't return 0 or an empty string — they return #VALUE!.
Drop one into a column where some rows lack the substring and the whole column
lights up red, taking any formula that references it down with it.
Two clean fixes, depending on what you're doing:
' Extracting, but some rows may not have the delimiter:
=IFERROR(MID(A2, FIND("-", A2) + 1, 99), A2) ' fall back to the whole string
' Just testing for presence — don't extract at all:
=ISNUMBER(SEARCH("urgent", A2)) ' TRUE / FALSE, never errors
That second idiom is the one to memorize. ISNUMBER(SEARCH(needle, haystack)) is
how Excel does a case-insensitive "contains" test — pair it with IF,
FILTER, or conditional formatting to flag every row that mentions a word. It's
cleaner and faster than any COUNTIF wildcard gymnastics, and it never throws.
The 3rd argument: finding the second occurrence
Both functions take an optional start_num — the position to begin searching
from. Its main use is skipping past the first match to find the next one:
=FIND("-", A2) ' position of the 1st hyphen
=FIND("-", A2, FIND("-", A2) + 1) ' position of the 2nd hyphen
Nesting like that to reach the nth occurrence is where these formulas stop
being readable. If you find yourself counting occurrences, that's the signal to
switch to TEXTSPLIT (split on the delimiter
and take the piece you want) or Power Query.
The judgment call
FIND and SEARCH almost never appear alone — if you're using one by itself,
you probably want the ISNUMBER(SEARCH()) contains-test instead of a raw
position. Their real home is inside a MID/LEFT/REPLACE, supplying the
position so the slice follows the content. Choose FIND for exact, case-aware,
literal matching; choose SEARCH for forgiving, wildcard, human matching. And
never write either one without deciding what happens on no match — #VALUE! is
not an "oops," it's the documented behavior. When the nesting gets three deep,
stop and split the string instead.
How ExcelMaster helps
Email domains, the text between the second and third hyphen, the part of an
address after the last comma — these are FIND/SEARCH puzzles, and the fiddly
part is the +1/-1 offsets and the no-match handling. ExcelMaster writes
the whole expression from a plain-English description — correct anchors, the
IFERROR or ISNUMBER guard already in place, and FIND vs SEARCH chosen for
your case-sensitivity needs. You name the landmark; it does the position math.
Frequently asked questions
What's the difference between FIND and SEARCH in Excel?
Two differences. FIND is case-sensitive and treats */? as literal
characters; SEARCH is case-insensitive and supports those wildcards. Use FIND
for exact, case-aware matches and SEARCH for forgiving ones.
Why does FIND return #VALUE!?
Because the substring you're looking for isn't in the text. FIND and SEARCH
return #VALUE! on no match rather than 0 or blank. Wrap the formula in
IFERROR(...) or test first with ISNUMBER(SEARCH(...)).
How do I check if a cell contains specific text?
Use =ISNUMBER(SEARCH("word", A2)), which returns TRUE or FALSE and ignores
case. For a case-sensitive check, swap SEARCH for FIND. This never throws an
error, unlike using the position directly.
How do I find the second occurrence of a character?
Pass the optional 3rd argument (start_num) to begin searching after the first
match: =FIND("-", A2, FIND("-", A2) + 1) returns the position of the second
hyphen. Beyond the second occurrence, consider TEXTSPLIT for readability.
Does FIND or SEARCH support wildcards?
Only SEARCH. SEARCH("a?c", A2) matches an "a", any single character, then a
"c". FIND treats ? and * as literal characters to find.
Tested in
Tested in: Excel 365 (Windows 11) — last verified 2026-06-29.
Related guides: Excel LEFT, RIGHT & MID · Excel SUBSTITUTE & REPLACE · Excel TEXTSPLIT · Excel IFERROR
