如何在Excel中找到匹配的行?

时间:2010-09-21 15:19:09

标签: excel vba excel-vba

鉴于

搜索键

---------------------------
|   |  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 |   |
------------------------------

问题

我希望有这样的功能:f(键) - > result_row。

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

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

如何获取匹配行的行号?

一个解决方案

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

我猜这个算法会起作用。但是:有更好的解决方案吗?

版本

  • Excel 2000 9.0.8961 SP3
  • VBA 6.5

但是,如果你碰巧知道任何更高版本的Excel或VBA的解决方案,我很想知道。

编辑:22.09.2010

谢谢大家的回答。 @MikeD:功能非常好,谢谢!

我的解决方案

这是我原型化的解决方案。它全部是硬编码的,过于冗长而且不像MikeD的解决方案那样具有功能。但我会在实际应用程序中重写它以获取参数并返回结果值。

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表格:

alt text

3 个答案:

答案 0 :(得分:4)

这是我经常用于此类目的的小型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必须与Arg宽度相同或宽度相同,但当然可以大于或小于A:D

在样张表中输入一个空单元格“= findinrange(A1:D4,A3:D3)”

如果找不到任何内容,公式将返回“0”,否则行#

祝你好运 - MikeD

答案 1 :(得分:0)

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

=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)))

使用Control + Shift + Enter进入,而不仅仅是回车。请注意,它返回工作表行,而不是表中的位置。如果你想要表中的位置,你可以从结果中减去比表的起始行少一个(在这种情况下为2,因为表从第3行开始)。

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

答案 2 :(得分:0)

另一个选项是在excel表中添加一个新列,其中列A:D连接在一起,然后使用lookup/sverweis函数。这可能比VBA解决方案更快。