我有两张桌子。其中一个有服务器名称。另一个有时间戳(下面的第一个表,列A
)和文本字符串(下面的第一个表,列B
)。我想在这些字符串中搜索服务器表中指定的关键字(下面的第二个表)。如果找到匹配,则函数将从关键字所在列的标题中写入单元名称。
实施例
我想在Blue表中填写列System
。例如,C2
应显示GreenSys
和C8
- RedSys
。
我尝试过使用SEARCH
函数,但如果我将它作为参数传递,它看起来会尝试将整个表与字符串匹配。 VLOOKUP
也不起作用,因为我使用两个表。让这个工作的最佳方式是什么?
答案 0 :(得分:2)
如果您更改了数据设置的方式,以便它更易于使用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 :(得分: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
解决方案。假设:
以下代码经过测试,应该没问题,但需要处理错误:
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”开头..这应该可以在不使用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会更容易,但是再次有了没有宏的好处。