Excel函数searchstring中的多个关键字

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

蓝色的桌子红色的桌子

我想在蓝表中完成列System 。 所以例如C2应该显示GreenSysC8RedSys

我曾尝试使用SEARCHfunction,但它看起来像它试图匹配整个表的string,如果我把它作为parameter passing。 我使用两个表时, VLOOKUP不起作用。 什么是我得到这个工作的最好方法?

如果您改变数据设置的方式,使其更适合Excel,那么可以轻松完成。

查找表应该看起来像这样(下面的公式以'Sheet2'表示):

tigeravatar查找表格友好的格式

然后在您的主要数据表单元格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查找的结果

假设所有的服务器都以“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))) 

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

就像别人提到的那样,使用vba会比较容易,但是再也没有macros的好处。

你可以试试这个公式到单元格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的标题开始,用你描述的格式。

编辑:

我可以看到你修改了原来的post,我的回答不再符合规范。 所以我认为最好是删除它。

EDIT2:

增加了VBA解决scheme。 假设:

  • Sheet1中的信号数据表
  • Sheet2中的目标表
  • Sheet1的第一行的标题

下面的代码已经过testing,应该可以,但需要error handling:

 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