=SEARCH("apple",A2) 返回 apple 在 A2 中开始的位置,从 1 开始计数,不区分大小写。=FIND("apple",A2) 的作用相同,但只匹配大小写完全一致的文本。找不到文本时,两者都返回 #VALUE!。
| A | B | C | |
|---|---|---|---|
| 1 | Text | FIND("apple") | SEARCH("apple") |
| 2 | Apple pie | #VALUE! | 1 |
| 3 | Green apple | 7 | 7 |
| 4 | Banana bread | #VALUE! | #VALUE! |
#VALUE! 某个参数类型不对,比如该填数字的地方填了文本。Apple pie 以大写字母 A 开头,所以 FIND 匹配不到,返回 #VALUE!,而 SEARCH 返回 1。在 Green apple 中两者都返回 7:空格也算一个字符。Banana bread 中根本没有 apple。
语法
=FIND(find_text, within_text, [start_num])
=SEARCH(find_text, within_text, [start_num])
find_text:要查找的内容,可以是一个字符或一个单词。within_text:要在其中查找的单元格。start_num:开始查找的位置,省略时为 1。返回的结果仍然从单元格的第一个字符开始计数。
判断单元格是否包含某段文本
你很少真正需要位置本身。通常要问的是“这个单元格里有没有这个词?”。位置是数字,找不到则是错误,所以用 ISNUMBER 就能把结果变成 TRUE 或 FALSE:
| A | B | C | |
|---|---|---|---|
| 1 | Note | Contains "late" | Status |
| 2 | Arrived late | TRUE | Check |
| 3 | On time | FALSE | OK |
| 4 | LATE by 2 days | TRUE | Check |
| 5 | Delivered | FALSE | OK |
SEARCH 能匹配 A4 中的 LATE,因为它不区分大小写。注意,它也会匹配 latest 或 chocolate:SEARCH 查找的是字符,而不是完整的单词。查找前面带空格的 " late" 能稍微缩小范围。如果要统计有多少个单元格包含某个词,=COUNTIF(A2:A5,"*late*") 更短;见统计包含文本的单元格。
| A | B | |
|---|---|---|
| 1 | Subject | Urgent? |
| 2 | URGENT: server down | |
| 3 | Monthly report | |
| 4 | Refund request, urgent |
轮到你了: 在 B2 中,如果 A2 中的主题包含单词 urgent(大小写不限),返回 TRUE,否则返回 FALSE。公式会向下填充到 B4。
查找第二次出现的位置
start_num 让你可以从第一次匹配之后开始查找。把一个 FIND 放进另一个 FIND 里:里层的找到第一个短横线,外层的从它后面一个字符开始找。
| A | B | C | |
|---|---|---|---|
| 1 | Code | First dash | Second dash |
| 2 | NYC-2041-B | 4 | 9 |
| 3 | BOSTON-15-AA | 7 | 10 |
有了这两个位置,MID 就能取出两个短横线之间的内容:=MID(A2,B2+1,C2-B2-1) 返回 2041。
| A | B | |
|---|---|---|
| 1 | Position | |
| 2 | ana@coddy.tech |
轮到你了: 在 B2 中返回电子邮件地址中 @ 的位置。
FIND 和 SEARCH 返回 #VALUE!
这里的 #VALUE! 只表示“没找到”。把它换成有用的值:
| A | B | |
|---|---|---|
| 1 | Position of @ | |
| 2 | ana@coddy.tech | 4 |
| 3 | not an email | 0 |
不要直接把结果和数字比较,比如 =FIND("@",A2)>0:找不到时结果是错误,比较会返回 #VALUE! 而不是 FALSE。应该像上一节那样用 ISNUMBER 来判断。
通配符:只有 SEARCH 支持
SEARCH 支持通配符 ?(任意一个字符)和 *(任意多个字符)。FIND 会把它们当作普通字符。在 Excel 中:
=SEARCH("b?d","a bad day") returns 3
=SEARCH("2*B","NYC-2041-B") returns 5
=SEARCH("~?","Why?") returns 4, the tilde means a real question mark
=FIND("?","Why?") returns 4, FIND has no wildcards
*、? 和 ~ 在各个 Excel 函数中的更多用法,见通配符一文。
FIND、SEARCH 与 Ctrl+F 对比
| FIND | SEARCH | Ctrl+F | |
|---|---|---|---|
| 大小写 | 必须一致 | 忽略 | 忽略,除非勾选了“区分大小写” |
| 通配符 | 不支持 | ?、*、~ | ?、*、~ |
| 找不到时 | #VALUE! | #VALUE! | 一条提示信息 |
| 结果 | 一个位置,会重新计算 | 一个位置,会重新计算 | 选中该单元格 |
如果只是找一次某个值,用“开始 > 查找和选择 > 查找”(Ctrl+F,Mac 上为 Cmd+F)比写公式更快。如果要在每一行中标记或提取,并让结果随数据更新,就用 FIND 或 SEARCH。大小写有含义时(例如 ab 和 AB 这样的产品代码)用 FIND,处理人工输入的内容时一律用 SEARCH。
常见问题
Excel 中的 FIND 和 SEARCH 有什么区别?
FIND 区分大小写,不支持通配符。SEARCH 不区分大小写,支持 ? 和 *。=FIND("a","Apple") 返回 #VALUE!,而 =SEARCH("a","Apple") 返回 1。
怎样在 Excel 中提取两个短横线之间的文本?
找到两个短横线的位置,再用 MID 取出中间的部分:=MID(A2,FIND("-",A2)+1,FIND("-",A2,FIND("-",A2)+1)-FIND("-",A2)-1) 从 NYC-2041-B 中返回 2041。在 Microsoft 365 中,=TEXTBEFORE(TEXTAFTER(A2,"-"),"-") 更短。
FIND 为什么返回 #VALUE!?
单元格中没有这段文本,或者有但大小写不同(FIND 区分大小写)。在外面包一层让它返回别的值:=IFERROR(FIND("-",A2),0)。
怎样查找某个字符第二次出现的位置?
从第一次匹配之后的下一个字符开始查找:=FIND("-",A2,FIND("-",A2)+1)。第三个参数就是开始查找的位置。