このようなデータ設定では、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)
質問の 2 番目の部分で、見つかった行番号で値を返す場合、INDEX 関数を使用して列から値を返すことができます。したがって、Match 数式がセル H1 にあると仮定すると、これら 2 つの数式はそれぞれ列 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