在Excel中查找多个列中的特定文本

我有一个让我感到困惑的公式 – 我觉得我很接近,但是解决办法是躲开我,所以我正在向你求助。 这个问题类似于Excel的VLOOKUP和SEARCH组合 。

问题:

我想查找一个由短划线分隔的一对代码的值,例如, 01-05 A1-B2 AB-90 ,在列A和B内,并从C返回结果。

问题是我在两列中search,其中可能包含以逗号分隔的多个代码:

 Col A Col B Col C 01 05, B2 Result1 A1 B2 Result2 AB, AC 90, 91, 92 Result3 

我在想,a =if(isnumber(search(函数是关键,但我不知道如何检查整个列,一旦find,检查旁边的=if(isnumber(search(代码的第二部分。

理想情况下,公式将按照这样的方式执行,在上面的示例中,如果我要在条件01-05上运行此公式,它将返回Result1

不胜感激!

据我所知,“公式”方法相当冗长和繁琐,如下所示:

 =IF( ISNA( IFERROR(MATCH(LEFT(D1,SEARCH("-",D1)-1),Codes!$A$1:$A$100,0), IFERROR(MATCH("*"&LEFT(D1,SEARCH("-",D1)-1)&",*",Codes!$A$1:$A$100,0), MATCH("*,"&LEFT(D1,SEARCH("-",D1)-1)&"*",Codes!$A$1:$A$100,0))) * IFERROR(MATCH(RIGHT(D1,LEN(D1)-SEARCH("-",D1)),Codes!$B$1:$B$100,0), IFERROR(MATCH("*"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&",*",Codes!$B$1:$B$100,0), MATCH("*,"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&"*",Codes!$B$1:$B$100,0))) ), "Not Found", IF(IFERROR(MATCH(LEFT(D1,SEARCH("-",D1)-1),Codes!$A$1:$A$100,0), IFERROR(MATCH("*"&LEFT(D1,SEARCH("-",D1)-1)&",*",Codes!$A$1:$A$100,0), MATCH("*,"&LEFT(D1,SEARCH("-",D1)-1)&"*",Codes!$A$1:$A$100,0))) <> IFERROR(MATCH(RIGHT(D1,LEN(D1)-SEARCH("-",D1)),Codes!$B$1:$B$100,0), IFERROR(MATCH("*"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&",*",Codes!$B$1:$B$100,0), MATCH("*,"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&"*",Codes!$B$1:$B$100,0))), "Different rows", INDEX(Codes!C:C,IFERROR(MATCH(RIGHT(D1,LEN(D1)-SEARCH("-",D1)),Codes!$B$1:$B$100,0), IFERROR(MATCH("*"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&",*",Codes!$B$1:$B$100,0), MATCH("*,"&RIGHT(D1,LEN(D1)-SEARCH("-",D1))&"*",Codes!$B$1:$B$100,0)))) ) ) 

在那里我使用了(希望)更可读的格式,并假设:

  • 将“代码”作为其列“A”(“第一”代码),“B”(“第二”代码)和“C”(“结果”)的表格名称

  • 代码对将被放置在任何表单的“D”列中

  • 公式将被放置在与上述列“D”单元相邻的列“E”中

您可能需要考虑如下的“VBA”方法

 Sub main() Dim codesSht As Worksheet Dim cell As Range, found As Range, codesRng As Range Dim index1 As Long Set codesSht = ThisWorkbook.Worksheets("Codes") '<== change "codes" sheet reference as per your needs Set codesRng = codesSht.Range("A:B").SpecialCells(xlCellTypeConstants, xlTextValues) With ThisWorkbook.Worksheets("Results") '<== change "Results" sheet reference as per your needs For Each cell In .Range("D1:D" & .Cells(.Rows.count, "D").End(xlUp).Row).SpecialCells(xlCellTypeConstants, xlTextValues) Set found = codesRng.Resize(, 1).Find(What:=Split(cell.Value, "-")(0), LookIn:=xlValues, LookAt:=xlPart) If Not found Is Nothing Then index1 = found.Row Set found = codesRng.Offset(, 1).Resize(, 1).Find(What:=Split(cell.Value, "-")(1), LookIn:=xlValues, LookAt:=xlPart) If Not found Is Nothing Then If found.Row = index1 Then cell.Offset(, 1).Value = codesRng(index1, 3) End If Next cell End With End Sub 

如果你把你正在寻找的代码在D列,那么你的公式在列E,下面的公式将完成你正在寻找…

=IF(OR(ISERROR(FIND(LEFT(D2,2),A2)),ISERROR(FIND(RIGHT(D2,2),B2)),LEN(D2)=0),"",C2)

然后填写它。

该公式将从列A中的代码中search左侧的两个字符。如果未find,则会引发错误。 它还从列B中的代码中查找正确的两个字符。如果未find,则会引发错误。 如果你正在寻找的代码是空白的,没有错误,所以我们需要检查这种情况。

因此,如果search左侧部分时出错,或search右侧部分时出错,或者没有代码查找,请返回空白。 否则,返回结果。

下面是一些例子…

在这里输入图像说明


根据评论更新

在Sheet1上,数据看起来像这样…

在这里输入图像说明

在Sheet2上,我们有这样的结果…

在这里输入图像说明

单元格B2包含此公式(填充)

 {=CONCAT(IF(ISERROR(FIND(LEFT(A2,2),Sheet1!$A$1:$A$3)),"",IF(ISERROR(FIND(RIGHT(A2,2),Sheet1!$B$1:$B$3)),"",IF(LEN(A2)<1,"",Sheet1!$C$1:$C$3))))} 

由于版本而更新

当所有其他都失败时,转到VBA。 附加的是一个示例函数。 它得到了和上面一样的结果。 在列B中用公式调用,填充为…

 =FindResult(A2,Sheet1!$A$1:$A$3,Sheet1!$B$1:$B$3,Sheet1!$C$1:$C$3) 

代码…

 Function FindResult(inString As String, LeftRange As Range, RightRange As Range, ReturnRange As Range) As String Dim strArr() As String Dim myCellLeft As Range, myCellRight 'initial FindResult = "" If LeftRange Is Nothing Then GoTo Done: If RightRange Is Nothing Then GoTo Done: If ReturnRange Is Nothing Then GoTo Done: ' get the two halfs strArr = Split(inString, "-") If UBound(strArr) < 1 Then GoTo Done: ' Search the left range for the left half, the right range for the right half For Each myCellLeft In LeftRange If InStr(1, myCellLeft.Value, strArr(0)) > 0 Then For Each myCellRight In RightRange.Rows(myCellLeft.Row) If InStr(1, myCellRight.Value, strArr(1)) > 0 Then FindResult = ReturnRange.Rows(myCellLeft.Row) Exit For End If Next myCellRight If FindResult <> "" Then Exit For End If Next myCellLeft ' clean up Done: Erase strArr Set myCellLeft = Nothing Set myCellRight = Nothing End Function