3

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

例子

蓝色桌子 红桌

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

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

4

3 回答 3

2

如果您更改数据设置的方式,使其对 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 查找结果

于 2013-09-18T18:10:34.707 回答
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 会更容易,但是没有宏也有好处。

于 2013-09-18T18:02:16.830 回答
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)))
,"")

我假设第二个表是 atSheet2并且数据是 upto column D,从标题 at 开始A1,采用您描述的格式。

编辑:

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

编辑2:

添加了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
于 2013-09-18T17:23:39.487 回答