在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