如何在Excel中find匹配的行?

特定

search键

--------------------------- | | A | B | C | D | --------------------------- | 1 | 01 | 2 | 4 | TextA | --------------------------- 

一个Excel工作表

 ------------------------------ | | A | B | C | D | E | ------------------------------ | 1 | 03 | 5 | C | TextZ | | ------------------------------ | 2 | 01 | 2 | 4 | TextN | | ------------------------------ | 3 | 01 | 2 | 4 | TextA | | ------------------------------ | 4 | 22 | T | N | TextX | | ------------------------------ 

我想有一个这样的function:f(key) – > result_row。

这意味着:给定一个search键(01,2,4,TextA),函数应该告诉我在上面的例子中匹配的行是3。

search键(A,B,C,D)中的值是一个唯一的标识符。

我如何获得匹配行的行号?

一个解决scheme

我首先想到的解决scheme是使用Visual Basic for Application(VBA)扫描列A的“01”。 一旦我find一个包含“01”的单元格,我会检查列B,C和D中的相邻单元格是否符合我的search条件。

我猜这个algorithm会起作用。 但是:有更好的解决scheme吗?

  • Excel 2000 9.0.8961 SP3
  • VBA 6.5

但是,如果您碰巧知道任何更高版本的Excel或VBA中的解决scheme,我也很想知道。

编辑:22.09.2010

谢谢大家的答案。 @MikeD:function很好,谢谢!

我的解决scheme

这是我原型的解决scheme。 它都是硬编码的,太冗长了,而不是MikeD的解决scheme。 但是我会在我的实际应用程序中重写它以获取参数并返回结果值。

 Sub FindMatchingRow() Dim searchKeyD As Variant Dim searchKeyE As Variant Dim searchKeyF As Variant Dim searchKeyG As Variant Const indexStartOfRange As String = "D6" Const indexEndOfRange As String = "D9" ' Initialize search key searchKeyD = Range("D2").Value searchKeyE = Range("E2").Value searchKeyF = Range("F2").Value searchKeyG = Range("G2").Value ' Initialize search range myRange = indexStartOfRange + ":" + indexEndOfRange ' Iterate over given Excel range For Each myCell In Range(myRange) foundValueInD = myCell.Offset(0, 0).Value foundValueInE = myCell.Offset(0, 1).Value foundValueInF = myCell.Offset(0, 2).Value foundValueInG = myCell.Offset(0, 3).Value isUnitMatching = (searchKeyD = foundValueInD) isGroupMatching = (searchKeyE = foundValueInE) isPortionMatching = (searchKeyF = foundValueInF) isDesignationMatching = (searchKeyG = foundValueInG) isRowMatching = isUnitMatching And isGroupMatching And isPortionMatching And isDesignationMatching If (isRowMatching) Then Range("D21").Value = myCell.Row Exit For End If Next myCell End Sub 

这是与上面的代码一起使用的Excel工作表:

替代文字

这里有一个我经常用于这种目的的小VBA函数

 Function FindInRange(InRange As Range, Arg As Range) As Integer Dim Idx As Integer, Jdx As Integer, IsFound As Boolean FindInRange = 0 IsFound = False For Idx = 1 To InRange.Rows.Count IsFound = True For Jdx = 1 To InRange.Columns.Count If InRange(Idx, Jdx) <> Arg(1, Jdx) Then IsFound = False Exit For End If Next Jdx If IsFound Then FindInRange = Idx Exit For End If Next Idx End Function 

InRange宽度必须与宽度相同或宽于宽度,但当然可以大于或小于A:D

在您的样品表中input一个空单元格“= findinrange(A1:D4,A3:D3)”

如果没有find该公式将返回“0”,否则行#

祝你好运 – MikeD

假设您的search键在A1开始,您的数据以A3开始。 此数组公式将返回所有数据与search关键字匹配的行号

 =SUM(($A$3:$A$6=A1)*($B$3:$B$6=B1)*($C$3:$C$6=C1)*($D$3:$D$6=D1)*(ROW($A$3:$A$6))) 

用Ctrl + Shift + Enterinput,而不仅仅是input。 请注意,它将返回工作表行,而不是表中的位置。 如果你想要在表格中的位置,你可以从结果中减去一个小于表格的起始行(在这种情况下是2,因为表格从第3行开始)。

如果有多个匹配的行,这将返回所有行的总和(不是很有帮助)。 但是我认为只有一个匹配的行。

另一个select是添加一个新的列到您的Excel表格中的列A:D连接,然后使用lookup/sverweis函数。 这可能比VBA解决scheme更快。