如何检查单元格是否包含多个搜索词

时间:2017-07-26 03:50:53

标签: excel

我正在寻找有关如何正确使用" FIND"公式或任何其他公式的答案,这些公式可以帮助我在一个单元格中找到另一个单元格的字符串。

I use the find formula to find these:
=IF(FIND(A1,B1),"yes","no")
Col1 - Col2
A,B - A,B,C = formula works well
A,C - A,B,C = formula not working. Returning "#VALUE"

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

FIND仅检查Col2中是否包含Col1中的完整字符串。 如果要检查所有项目,则必须以逗号分割字符串。

答案 1 :(得分:1)

如果您可以使用VBA实现上述功能,可以使用以下代码作为UDF。

Function FindExistence(firstStr As String, secStr As String) As String
    Dim firstArr() As String, secArr() As String
    Dim i As Long, j As Long
    Dim fElem As Variant, sElem As Variant
    Dim isExist As Boolean

    firstArr = Split(firstStr, ",") 'comma separated values of first cell into array
    secArr = Split(secStr, ",")     'comma separated values of second cell into array
    For Each fElem In firstArr      'loop through each element in array of first array
        isExist = False             'set boolean variable to False
        For Each sElem In secArr    'loop through each element in array of second array
            If fElem = sElem Then   'check if elements in both array are equal
                isExist = True      'if elements are equal exit loop, check next element
                Exit For
            End If
        Next sElem
        If Not isExist Then Exit For 'if isExist is false exit all loop
    Next fElem
    If Not isExist Then             'if isExist is false return No else Yes
        FindExistence = "No"
    Else
        FindExistence = "Yes"
    End If
End Function

参见图片以供参考。

enter image description here

关于如何创建函数,请参阅this

您也可以使用GoTo

,而不是使用两个Exit For

答案 2 :(得分:1)

如果您可以接受限制以保持相对距离"这是对上述UDF方法的一种古怪的替代方法。在涉及的模式和功能细胞之间。我的方法涉及为预定义的公式定义名称(包含相对的单元格引用)。

在下面的示例代码中,我假设我想在单元格C2中使用查找公式,并且我的逗号分隔模式存储在左边的相邻单元格中(相对!)。

现在我可以定义以下"名称" (按< cntrl>< F3>)。

one:    =LEFT(Sheet1!B2;FIND(",";Sheet1!B2)-1)
oneR:   =MID(Sheet1!B2;FIND(",";Sheet1!B2)+1;LEN(Sheet1!B3))
two:    =LEFT(oneR;FIND(",";oneR & ",")-1)
three:  =MID(oneR;FIND(",";oneR & ",")+1;LEN(oneR))

如果您对三个以上的部分感兴趣,可以扩展样本。在公式单元格(C2中,始终是模式单元格右侧的那个)我现在可以写了

=IFERROR(AND(FIND(one;D2);FIND(two;D2);FIND(three;D2));0;1)

检查模式的所有三个单词是否出现在目标单元格字符串(D2)中。如果找到所有三个模式,则结果为1,否则返回0

答案 3 :(得分:0)

这是 no-column-helper 方法,保证零VBA 我使用数组公式,如下所示:

= LEN(SUBSTITUTE(A2,",",""))
= SUM(
    --ISNUMBER(
               MATCH(
                     MID(
                         SUBSTITUTE(A2,",",""),
                         ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A2,",","")))),
                         1),
                     MID(
                         SUBSTITUTE(B2,",",""),
                         ROW(INDIRECT("1:"&LEN(SUBSTITUTE(B2,",","")))),
                         1),
                     0)
               )
      )

它是如何运作的?

  • 首先,我们需要一种方法将字符串中的所有字符都添加到数组中,以便我们可以逐个检查匹配项。我们使用以下公式来做到这一点:

    MID(
        SUBSTITUTE(A2,",",""),
        ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A2,",","")))),
        1)
    

    一般逻辑是MID(<text>,<start_num>,<num_chars>),而不是在<start_num>中分配一个数值,我们使用ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A2,",",""))))分配一个数字数组。以简单的形式,即ROW([reference])(例如ROW(1:10)给出数字1到10的数组,一个包含10个元素的数组)。但是为了使这个公式有效,我们需要确保数组的大小等于我们正在处理的除,逗号之外的字符数。因此,我们首先使用SUBSTITUTE(A2,",","")消除逗号,并在内存中获取结果字符串的长度。例如,如果您在单元格A2中有文字 A,C ,则SUBSTITUTE函数将产生 AC (在内存中)并获取使用LEN的长度返回2.然后我们使用返回的值作为数组的边界。我们只是将其与"1:"连接起来,并使其返回有效的引用,我们使用INDIRECT函数。

  • 我们在上面重复搜索匹配的字符串(例如,单元格B2包含 A,B,C ,我们也需要将其放入数组中)

  • 使用MATCH功能进行搜索。在这里,我们使用上面两个步骤生成的值数组。 MATCH(<lookup_value>,<lookup_array>,[match_type])是一般形式。幸运的是,我们还可以使用<lookup_value>参数的值数组而不是单个值。因此,我们将上面步骤1中生成的数组用作 lookup_values

  • 接下来我们使用ISNUMBER确认我们有多少匹配。 MATCH函数返回一个数值(这是数组中匹配值的位置),因此我们只需使用ISNUMBER来评估它。这将返回一个布尔值{TRUE,FALSE,TRUE} 的数组,但由于我们需要以某种方式计算它,我们使用双否定 -- 将其转换为产生{{1 }}。

  • 最后一步是使用{1,0,1}函数来计算匹配数,并将其与不带逗号的搜索字符串长度进行比较。我们使用 Ctrl + Shift + Enter

  • 确认公式
  • 或者,您可以在最后一步中使用SUM函数来检查是否找到所有匹配项。

Edit1:使用AND直接评估是否找到所有匹配项的公式。

= AND(
      ISNUMBER(
               MATCH(
                     MID(
                         SUBSTITUTE(A2,",",""),
                         ROW(INDIRECT("1:"&LEN(SUBSTITUTE(A2,",","")))),
                         1),
                     MID(
                         SUBSTITUTE(B2,",",""),
                         ROW(INDIRECT("1:"&LEN(SUBSTITUTE(B2,",","")))),
                         1),
                     0)
               )
      )

如果在单元格AND中的所有字符集中找到单元格TRUE中的所有字符,则会返回A2。现在,这仅适用于统一逗号分隔的字符串(例如 B2 ,可在 A,K,E,G 中进行搜索。对于非统一逗号分隔的字符串(例如 A,B,C,D,E,F,G,H,I,J,K 然后尝试查找 A,BC,D,EFG,H,I,J ),这将失败。我希望这能帮到你。