鉴于
搜索键
---------------------------
| | 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或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表格:
答案 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解决方案更快。