Excel函数用于在字符串中搜索多个关键字

时间:2013-09-18 16:54:41

标签: excel excel-2010 worksheet-function

我有两张桌子。其中一个有服务器名称。另一个有时间戳(下面的第一个表,列A)和文本字符串(下面的第一个表,列B)。我想在这些字符串中搜索服务器表中指定的关键字(下面的第二个表)。如果找到匹配,则函数将从关键字所在列的标题中写入单元名称。

实施例

Blue table Red table

我想在Blue表中填写列System。例如,C2应显示GreenSysC8 - RedSys

我尝试过使用SEARCH函数,但如果我将它作为参数传递,它看起来会尝试将整个表与字符串匹配。 VLOOKUP也不起作用,因为我使用两个表。让这个工作的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

如果您更改了数据设置的方式,以便它更易于使用Excel,那么这很容易实现。

查找表应该如下所示(下面的公式将其作为'Sheet2'):

tigeravatar lookup sheet friendly format

然后在主数据表上,在单元格C2中并向下复制:

=IF(SUMPRODUCT(COUNTIF(B2,"*"&Sheet2!$A$2:$A$7&"*")),INDEX(Sheet2!B:B,SUMPRODUCT(COUNTIF(B2,"*"&Sheet2!$A$2:$A$7&"*")*ROW(Sheet2!$A$2:$A$7))),"")

结果如下:

tigeravatar results of lookup

答案 1 :(得分:0)

你可以试试这个公式到细胞C2吗?

=IF(SUMPRODUCT((B2=Sheet2!$A$2:$D$4)*COLUMN(Sheet2!$A$1:$D$1))>0,
INDEX(Sheet2!$A$1:$D$1,SUMPRODUCT((B2=Sheet2!$A$2:$D$4)*COLUMN(Sheet2!$A$1:$D$1)))
,"")

我假设第二个表位于Sheet2且该数据最高为D列,从A1的标题开始,采用您描述的格式。

修改

我可以看到你修改了原帖,我的答案不再符合规范。因此我认为最好删除它。

<强> EDIT2:

添加了VBA解决方案。假设:

  • Sheet1中的Orignal数据表
  • Sheet2中的目标表
  • 第1行中Sheet1的标题

以下代码经过测试,应该没问题,但需要处理错误:

Sub moveData()
    Dim rngDestination As Range
    Dim lRowCounter As Long, lColCounter As Long, lValueCounter As Long, lLastRow As Long
    Dim vOriginArray As Variant, vValuesArray As Variant, vDestinationArray As Variant

    ' Database table in Sheet2
    vOriginArray = Sheet2.UsedRange.Value

    ' Destination table in Sheet1
    With Sheet1
        lLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
        ' Put the values we need to compare into an array
        vValuesArray = .Range(.Cells(2, 2), .Cells(lLastRow, 2)).Value
        Set rngDestination = .Range(.Cells(2, 3), .Cells(lLastRow, 3))
    End With

    ' We will store the values to an array first and then
    ' back to the sheet, it is faster this way
    ReDim vDestinationArray(1 To rngDestination.Rows.Count, 1 To 1)

    ' Loop through all rows and columns, exclude header row
    For lRowCounter = 2 To UBound(vOriginArray, 1)
        For lColCounter = LBound(vOriginArray, 2) To UBound(vOriginArray, 2)
    ' For each entry, find which values match and store them
            For lValueCounter = 1 To UBound(vValuesArray, 1)
                If InStr(1, vValuesArray(lValueCounter, 1), vOriginArray(lRowCounter, lColCounter), vbTextCompare) Then
                    vDestinationArray(lValueCounter, 1) = vOriginArray(1, lColCounter)
                End If
            Next lValueCounter
        Next lColCounter
    Next lRowCounter

    ' Put the data back to excel
    With rngDestination
        .ClearContents
        .Value = vDestinationArray
    End With
End Sub

答案 2 :(得分:0)

假设所有服务器都以“Serv”开头..这应该可以在不使用vb​​a的情况下工作。

=MID(B1,SEARCH("Serv",B1,1),IF(ISERROR(SEARCH(" ",B1,SEARCH("Serv",B1,1))),LEN(B1)-SEARCH("Serv",B1,1),SEARCH(" ",B1,SEARCH("Serv",B1,1))-SEARCH("Serv",B1,1)))

本质上,公式搜索关键字serv,然后尝试解析直到单词的结尾返回全名。

正如其他人提到的那样,使用vba会更容易,但是再次有了没有宏的好处。