通过这样的数据设置,您可以使用 MATCH 函数来获取行号:
=MATCH(1,INDEX(($A$1:$A$6="id2")*($B$1:$B$6="day1"),),0)
如果这些条件不匹配,则公式将返回 #N/A 错误。您还可以将条件更改为单元格引用,例如:
=MATCH(1,INDEX(($A$1:$A$6=F1)*($B$1:$B$6=G1),),0)
对于问题的第二部分,返回具有找到的行号的值,您可以使用 INDEX 函数从列中返回一个值。所以假设 Match 公式在单元格 H1 中,这两个公式将分别返回 C 列和 D 列的值:
=INDEX($C$1:$C$6,H1)
=INDEX($D$1:$D$6,H1)
或者,您可以将其全部放入一个公式中:
=INDEX($C$1:$C$6,MATCH(1,INDEX(($A$1:$A$6=F1)*($B$1:$B$6=G1),),0))
如果您不想查看错误,可以在 excel 2007+ 上使用 IFERROR
=IFERROR(INDEX($C$1:$C$6,MATCH(1,INDEX(($A$1:$A$6=F1)*($B$1:$B$6=G1),),0)),"No Matches")
Excel 2003 及以下版本的错误检查:
=IF(ISNA(MATCH(1,INDEX(($A$1:$A$6=F1)*($B$1:$B$6=G1),),0)),"No Matches",INDEX($C$1:$C$6,MATCH(1,INDEX(($A$1:$A$6=F1)*($B$1:$B$6=G1),),0)))
[编辑]:我根据用户请求包含一个 VBA 解决方案。这使用了一个非常高效和灵活的查找循环,并展示了如何在找到匹配项后从其他列中提取值:
Sub tgr()
Dim rngFound As Range
Dim strFirst As String
Dim strID As String
Dim strDay As String
strID = "id2"
strDay = "day1"
Set rngFound = Columns("A").Find(strID, Cells(Rows.Count, "A"), xlValues, xlWhole)
If Not rngFound Is Nothing Then
strFirst = rngFound.Address
Do
If LCase(Cells(rngFound.Row, "B").Text) = LCase(strDay) Then
'Found a match
MsgBox "Found a match at: " & rngFound.Row & Chr(10) & _
"Value in column C: " & Cells(rngFound.Row, "C").Text & Chr(10) & _
"Value in column D: " & Cells(rngFound.Row, "D").Text
End If
Set rngFound = Columns("A").Find(strID, rngFound, xlValues, xlWhole)
Loop While rngFound.Address <> strFirst
End If
Set rngFound = Nothing
End Sub