🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel FIND & SEARCH — Locate Text by Content (FIND vs SEARCH, and the

|

Excel FIND & SEARCH — Locate Text by Content (FIND vs SEARCH, and the

TL;DRFIND and SEARCH don'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 to MID/LEFT to slice by content instead of by a fragile hardcoded position. Two differences decide which to use: FIND is case-sensitive and takes no wildcards; SEARCH is 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 in IFERROR or test with ISNUMBER. 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/SEARCH return 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