【问题标题】:Excel function to search a string for a multiple keywordsExcel函数在字符串中搜索多个关键字
【发布时间】:2013-09-18 16:54:40
【问题描述】:

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

例子

我想完成蓝色表中的System 列。例如C2 应该显示GreenSysC8 - RedSys

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

【问题讨论】:

  • 服务器的名称是ServG#ServR#,其中# 代表一个数字?因为那样的话,搜索会更容易。另外,您的实际数据中的服务器是否越多?
  • 有许多不同的服务器名称,它们有不同的格式。还有两个以上的类别(例如 GreenSys 和 RedSys)。
  • 它还有什么其他格式?因为我可以为您的样本提出一个公式,但它可能不适用于您的实际数据。例如,您可以在 C2 中使用 =IF(ISERROR(FIND("Serv",B2)),"",IF(ISERROR(FIND("ServG",B2)),"RedSys","GreenSys")),但这仅适用于示例。
  • 我认为这不会起作用,因为大约有 200 台服务器。这就是为什么我想使用第二个表作为参考,而不是将每个关键字都写入公式。
  • 这只是一个建议,但是当我得到这样的 excel 工作表比较任务时,我发现使用 SQL Server 比尝试获得 excel 搜索\查询功能要容易 x1,000 来做什么我想。使用本地数据库,为每张工作表设置一个包含所需列的新表。至于数据本身,如果不是很多记录,我通常只是复制\粘贴,但如果超过几百条,SQL 导入向导就派上用场了。

标签: excel excel-2010 worksheet-function


【解决方案1】:

如果您更改数据设置方式,使其对 Excel 更友好,则可以轻松完成。

查找表应如下所示(下面的公式将其设为“Sheet2”):

然后在您的主数据表中,在单元格 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))),"")

结果如下所示:

【讨论】:

  • +1 开箱即用 :) 但不确定重新排列步骤是否容易..
【解决方案2】:

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

=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 会更容易,但是没有宏也有好处。

【讨论】:

    【解决方案3】:

    你可以试试这个公式到 cellC2 吗?

    =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 中的原始数据表
    • Sheet2 中的目标表
    • 第一行 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
    

    【讨论】:

    • 我更改了工作表名称,但公式什么也没写。不是错误,单元格只是空的。
    • 这很奇怪,我刚刚测试过。如果你用修改后的数据测试它(ServG2已经启动),它会失败..(检查我的编辑)
    • 我现在看到了。如果我也只在其中留下服务器名称,它也可以正常工作!但我所拥有的数据并非如此。 B2 里面有很多文字,我只想按一个词搜索。是否可以调整您的公式以适应这种情况?
    • 我不确定这是否可能.. 我今晚晚些时候会检查它,并将此帖子留在这里一段时间(也许有人会更早弄清楚)。顺便说一句,如果你愿意走这条路,这可以很容易地用 VBA 完成。
    • 如果它得到我需要的结果,当然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多