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

我正在寻找答案如何正确使用“FIND”公式或任何其他公式,可以帮助我find一个单元格到另一个string。

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" 

谢谢你的帮助。

FIND只检查Col1中是否包含Col1的完整string。 如果你想检查所有项目,你将不得不用逗号分割string。

如果您可以接受限制,以保持所涉及的模式和函数单元格之间的“相对距离”,这是上述UDF方法的一个古怪的替代方法。 我的方法涉及到为预定义的公式定义名称(包含相对单元格引用)。

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

现在我可以定义下面的“名称”(按<Ctrl> <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 )中。 如果find所有三种模式,结果为1 ,否则返回0

如果你使用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 

请参阅图片以供参考。

在这里输入图像描述

关于如何创build函数看看这个 。

而不是使用两个Exit For你也可以使用GoTo

这是一个无列辅助方法,并保证零VBA。
我使用如下所示的数组公式

 = LEN(SUBSTITUTE(A2,“,”,“”))
 = SUM(
     --ISNUMBER(
               比赛(
                     中(
                          SUBSTITUTE(A2, “”, “”),
                          ROW(INDIRECT( “1:” &LEN(替代(A2, “”, “”)))),
                          1),
                     中(
                         替代(B2, “”, “”),
                          ROW(INDIRECT( “1:” &LEN(SUBSTITUTE(B2, “”, “”)))),
                          1),
                      0)
                )
       )

它是如何工作的?

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

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

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

  • 我们重复上面为我们search匹配的string(例如,单元格B2包含A,B,C ,我们也需要把它放在一个数组中)

  • 使用MATCHfunction进行search。 在这里,我们使用上面两个步骤生成的数组值。 MATCH(<lookup_value>,<lookup_array>,[match_type])是一般forms。 幸运的是,我们也可以为<lookup_value>参数使用一个值数组而不是一个单一的值。 所以我们使用我们在上面的第1步中得到的数组作为我们的lookup_values

  • 接下来是确认我们使用ISNUMBER有多less场比赛。 MATCH函数返回一个数值(这是数组中匹配值的位置),所以我们简单地使用ISNUMBER来评估。 这将返回布尔值{TRUE,FALSE,TRUE}的数组, 但是由于我们需要以某种方式对其进行计数,因此我们使用双重否定 -- 将其转换为产生{1,0,1}数字。

  • 最后一步是使用SUM函数来计算匹配的数量,并将其与没有逗号的searchstring的长度进行比较。 我们使用Ctrl + Shift + Enter确认公式

  • 或者,您可以在最后一步中使用ANDfunction来检查是否find所有匹配项。

编辑1:使用AND公式直接评估是否find所有匹配。

 = AND(
       ISNUMBER(
               比赛(
                     中(
                          SUBSTITUTE(A2, “”, “”),
                          ROW(INDIRECT( “1:” &LEN(替代(A2, “”, “”)))),
                          1),
                     中(
                         替代(B2, “”, “”),
                          ROW(INDIRECT( “1:” &LEN(SUBSTITUTE(B2, “”, “”)))),
                          1),
                      0)
                )
       )

所以如果在单元格B2中的所有字符集中都find单元格A2所有字符,这将返回TRUE 。 现在这适用于只有统一的逗号分隔的string(例如A,K,E,G A,B,C,D,E,F,G,H,I,J,K要search的A,K,E,G )。 这将失败在非统一的逗号分隔的string(例如A,BC,D,EFG,H,I,J然后试图findBC,I )。 我希望这会让你走。