检查单元格是否包含子字符串

262

是否有内置函数来检查单元格是否包含给定字符/子字符串?这意味着您可以有条件地应用文本函数(如Left/ Right/Mid),而不会在缺少分隔符字符时引发错误。

11个回答

416

试试使用这个:

=ISNUMBER(SEARCH("Some Text", A3))

如果单元格A3包含Some Text,则此公式将返回TRUE


9
狡猾!谢谢 gwin003 :) 我仍然有点惊讶,为什么没有更直观的功能来实现这个。 - geotheory
21
同意,如果有一个CONTAINS("文本", 单元格)函数会很不错。 - gwin003
22
值得注意的是,这是不区分大小写的。如果您想匹配大小写,应使用 FIND() 替换 SEARCH() - Code Jockey
7
使用逗号而不是分号出现了错误。将提供的公式更改为=ISNUMBER(SEARCH("Some Text"; A3))后,它可以正常工作。谢谢! - renatov
7
这取决于你的操作系统的“区域设置(locale)” ,特别是“列表分隔符”的字符。 - pepoluan
显示剩余6条评论

27

下面的公式用于确定文本“CHECK”是否出现在单元格C10中。如果没有出现,则结果为空白。如果出现,则结果是“CHECK”。

=IF(ISERROR(FIND("CHECK",C10,1)),"","CHECK")

你可以在行首使用4个空格或制表符来突出显示代码块。 - NiematojakTomasz

18

如果想在IF语句内使用单个函数完成此操作,我会使用

=IF(COUNTIF(A1,"*TEXT*"),TrueValue,FalseValue)

查看单元格A1中是否包含子字符串TEXT

[注:TEXT需要用星号括起来]


它能够工作,但是在处理大量数据时使用COUNTIF公式会导致文件无响应,甚至使文件大小变得巨大。 - Gaurravs

14

这个公式对我来说更加直观:

=SUBSTITUTE(A1,"SomeText","") <> A1

如果A1中包含"SomeText",则此公式返回TRUE。

其他答案中提到的IsNumber/Search和IsError/Find公式确实有效,但我经常发现自己需要查看帮助文件或在Excel中进行实验。


9
请查看Excel中的FIND()函数。
语法如下:
FIND( substring, string, [start_position])

如果未找到子字符串,则返回#VALUE!

1
是的,嵌套在ISNUMBER中也可以工作,仅适用于区分大小写的匹配。 - geotheory

4

这是一个老问题,但我认为它仍然有效。

既然没有CONTAINS函数,为什么不在VBA中声明它呢? 下面的代码使用VBA的Instr函数,在字符串中查找子串。当字符串未被找到时,它返回0。

Public Function CONTAINS(TextString As String, SubString As String) As Integer
    CONTAINS = InStr(1, TextString, SubString)
End Function

1
提高个人效率的好方法,但代价是无法复制 :) - geotheory

3
为什么不简单地
COUNTIF(A1,"*xyz*")

这会在A1单元格中搜索任何出现的“xyz”。

当找到时,它返回“1”,未找到时返回“0”。

请注意,搜索区分大小写,因此任何形式的xyz,XYZ,XyZ等都可以找到。它将其作为单元格中的子字符串查找,因此即使是abcxYz也会被匹配。

如果您不想在公式中编写搜索字符串,则可以使用

COUNTIF(A1,"*" & B1 & "*")

在B1单元格中输入搜索字符串。注意,当B1为空时,公式会返回“found”(“1”),因为此时搜索字符串被读取为“**”。


2

我很喜欢Rink.Attendant.6的回答。我实际上想检查多个字符串,并以以下方式执行:

首先,情况是这样的:可以是房屋建筑商或社区名称的名称,我需要将建筑商分为一组。 为此,我正在寻找单词“builder”或“construction”等。 所以 -

=IF(OR(COUNTIF(A1,"*builder*"),COUNTIF(A1,"*builder*")),"Builder","Community")

欢迎来到SO。您应该阅读一下什么是好答案 - geotheory
我不明白这段代码的意图是什么。它检查了两次 builder,但一次应该就足够了。如果找到 builder,它就返回 builder,否则返回 community。construction 这个词没有出现在任何地方。也许可以尝试使用类似于=OR(COUNTIF(A1,"*builder*"),COUNTIF(A1,"*construction*"))的方式来解决问题? - fantabolous
有一个函数叫做COUNTIFS: COUNTIFS(A1,"*builder*",A1,"*construction*") - vstepaniuk

2

这是一个老问题,但对于使用Excel 2016或更新版本的人来说,可以通过使用新的IFS(条件1, 返回1 [,条件2, 返回2] ...)条件语句来消除嵌套if结构的需要。

我已经格式化了它,以便在本问题的情况下更清晰地说明如何使用它:

=IFS(
ISERROR(SEARCH("String1",A1))=FALSE,"Something1",
ISERROR(SEARCH("String2",A1))=FALSE,"Something2",
ISERROR(SEARCH("String3",A1))=FALSE,"Something3"
)

由于SEARCH在未找到字符串时会返回错误,因此我用ISERROR(...)=FALSE将其包装起来以检查真假,然后返回所需的值。如果SEARCH返回0而不是错误以提高可读性,那就太好了,但不幸的是它就是这样工作的。

另一个重要的注意点是,IFS将返回它首先找到的匹配项,因此顺序很重要。例如,如果我的字符串为Surf,Surfing,Surfs,如上所示的String1,String2,String3,并且我的单元格字符串为Surfing,它将匹配第一个术语而不是第二个,因为子字符串是Surf。因此,共同的分母需要排在列表的最后。我的IFS需要按正确顺序排列Surfing,Surfs,Surf才能正常工作(在这个简单的例子中交换SurfingSurfs也可以),但Surf需要排在最后。


大多数人都希望有if/else的能力,换句话说就是一个默认值。添加以下引用可能会扩大您的答案的吸引力:“如果所有测试都返回FALSE(即假值),则无法设置默认值。相反,请为最后一个测试输入TRUE,然后输入要返回的默认值(如果为FALSE)”。 - whitneyland
IFS 函数在 Excel 2019 中新增,而在 Excel 2016 中并不存在。 - robartsd

0

有趣 *

=COUNT(MATCH("*SomeText*",A1,))
=COUNTA(VLOOKUP("*SomeText*",A1,1,))
=COUNTA(HLOOKUP("*SomeText*",A1,1,))

如果A1中包含"SomeText",则返回1。


你可以在结尾处添加 >0 以返回一个布尔值。 - BigBen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接