Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel:使用数组公式搜索特定字符串中的字符串列表?_Excel_Search_Excel Formula_Find - Fatal编程技术网

Excel:使用数组公式搜索特定字符串中的字符串列表?

Excel:使用数组公式搜索特定字符串中的字符串列表?,excel,search,excel-formula,find,Excel,Search,Excel Formula,Find,我想在单元格中搜索单词列表。 我认为这可以作为一个数组公式: {=FIND(<list of words I want to search for>,<cell I want to search>)} {=FIND(,)} 但只有当我搜索的单元格中的单词位于我搜索的单词列表的第一行时,它才会找到匹配项。有没有办法写出一个通读整个列表的公式?我更希望它不只是返回真/假。我知道如何在单元格中搜索单词列表,并根据列表中的单词是否存在于单元格中返回TRUE/FALSE。我想知

我想在单元格中搜索单词列表。 我认为这可以作为一个数组公式:

{=FIND(<list of words I want to search for>,<cell I want to search>)}
{=FIND(,)}

但只有当我搜索的单元格中的单词位于我搜索的单词列表的第一行时,它才会找到匹配项。有没有办法写出一个通读整个列表的公式?我更希望它不只是返回真/假。我知道如何在单元格中搜索单词列表,并根据列表中的单词是否存在于单元格中返回TRUE/FALSE。我想知道找到了哪个单词,或者它的位置。

如果没有找到匹配的单词,这将返回匹配的单词或错误。对于这个示例,我使用了以下内容

要搜索的单词列表:
G1:G7

要搜索的单元格:
A1

=INDEX(G1:G7,MAX(IF(ISERROR(FIND(G1:G7,A1)),-1,1)*(ROW(G1:G7)-ROW(G1)+1)))
按Ctrl+Shift+Enter键作为数组公式输入

这个公式的工作原理是首先查看单词列表以查找匹配项,然后记录单词在列表中的位置,如果找到,则记录为正值;如果未找到,则记录为负值。此数组中的最大值是找到的单词在列表中的位置。如果未找到单词,则将负值传递到
INDEX()
函数,引发错误

要返回匹配单词的行号,可以使用以下命令:

=MAX(IF(ISERROR(FIND(G1:G7,A1)),-1,1)*ROW(G1:G7))
还必须按Ctrl+Shift+Enter键将其作为数组公式输入。如果没有找到匹配项,它将返回
-1

  • 用单词中从未出现过的分隔符,f.e|
  • 在find调用中交换参数-如果单元格值与模式字符串中的一个单词匹配,则需要进行搜索
    {=FIND(“我要搜索的单元格”,“我要搜索的单词列表”)}
  • 如果模式相似,则可能会得到比所需更多的结果,我们可以通过在测试的单元格值中添加&“|”来限制正确的结果(与数组公式配合得很好) 单元格G3可以包含:
    {=SUM(FIND($A$1:$A$100&“|”;A3))}
    这确保了电子表格将比较字符串,如“cellvlaue |”与“pattern1 |”和“pattern2 |”等。这些字符串将排序冲突,如pattern1=“New added”,pattern2=“added”(匹配“added”的所有单元格的总和将过高,包括匹配“New added”的单元格的目标值,这将是一个逻辑错误)

  • 为像我这样的人添加此答案,对他们来说,正确/错误的答案是完全可以接受的

    OR(IF(ISNUMBER(SEARCH($G$1:$G$7,A1)),TRUE,FALSE))
    
    还是区分大小写

    OR(IF(ISNUMBER(FIND($G$1:$G$7,A1)),TRUE,FALSE))
    
    其中,搜索词的范围为
    G1:G7


    记住按CTRL+SHIFT+ENTER键,以防其他人发现这一点很有用:我发现,通过在搜索词列表中添加一个初始空单元格,将返回一个零值而不是错误

    ={INDEX(SearchTerms!$A$1:$A$38,MAX(IF(ISERROR(SEARCH(SearchTerms!$A$1:$A$38,SearchCell)),0,1)*((SearchTerms!$B$1:$B$38)+1)))}
    

    注意:A列有搜索词,B是行号索引。

    如果可以使用多个
    FIND
    调用,这可能会简单得多:例如,每个搜索的单词使用一个单元格。这是一种选择吗?或者,您可以编写一个VBA函数来处理此问题。是一个数组,每个单元格有一个字。这就是你的意思吗?我不知道VBA,但你知道有没有类似的VBA代码示例?谁否决了我,请提供一些反馈?如果你不知道VBA,请首先尝试在与要搜索的单元格数组相邻的每个单元格中执行
    FIND
    。每个搜索的单词都会得到一个结果,然后可以随意使用该信息。哦,我明白了,对于我要搜索的每个单元格,执行一行查找,每个搜索的单词一个。只有一个问题:为什么要乘以
    (row(G1:G7)-row(G1)+1)
    ,而不是只乘以
    row(G1:G7)
    ?出于我的目的,我希望找到单词的行,所以我只使用了
    行(G1:G7)
    。这是我使公式更一般的方法。
    INDEX
    函数的第二个参数是数组中的相对位置,而不是固定的行号。因此,如果您的搜索词列表从
    G3
    开始,那么单独使用
    行(G3:G9)
    将返回不正确的结果。我添加了一个公式,该公式将返回匹配的行号,因为听起来您对此也很感兴趣。这在Excel 2010中不起作用,因为iError有两个必需参数。@dnLL您确定吗?听起来不对。搜索是不区分大小写的,或者只是
    =或(不是(ISERROR(搜索({“Word 1”、“Word 2”、“Word 3”},MyRange)))