Excel函数searchstring中的多个关键字
我有两张桌子。 其中一个有服务器名称。 另一个有时间戳(下面的第一个表,列A
)和文本string(下面的第一个表B
列)。 我想search这些string中的服务器表中指定的关键字(第二个表)。 如果find匹配函数,则从关键字所在列的标题中写入单元名称。
例
我想在蓝表中完成列System
。 所以例如C2
应该显示GreenSys
和C8
– RedSys
。
我曾尝试使用SEARCH
function,但它看起来像它试图匹配整个表的string,如果我把它作为parameter passing。 我使用两个表时, VLOOKUP
不起作用。 什么是我得到这个工作的最好方法?
如果您改变数据设置的方式,使其更适合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))),"")
结果如下所示:
假设所有的服务器都以“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)))
本质上公式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