5

2 つの where 句に基づいて行番号を見つける VBA の関数が必要です。

エクセルのサンプルは次のとおりです。

**     A      B      C      D**
  1    id1    day1   val1   xxx
  2    id2    day1   val2   xxx
  3    id3    day1   val3   xxx
  4    id1    day2   val1   xxx
  5    id2    day2   val2   xxx
  6    id3    day2   val3   xxx

B = "day1" および A = "id2"の行番号 (この場合、行番号は2 ) を見つける必要があります。

行番号に基づいて、他の列、つまり C2、D2 の値をさらに取得する必要があります

質問が明確であることを願っています。

ありがとうございました!

4

2 に答える 2

14

このようなデータ設定では、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
于 2013-08-15T22:00:01.387 に答える
3

VBA では、次のようなブルー​​ト フォース チェックを実行できます。

Public Sub Test()
  Dim message As String
  Dim row As Long
  row = Find("id1", "day2")
  message = "Not Found"
  If (row > 0) Then
    message = ActiveSheet.Cells(row, 3).Value
  End If
  MsgBox message
End Sub

Function Find(aVal As String, bVal As String) As Long
  Dim maxRow As Long
  Dim row As Long
  maxRow = Range("A65536").End(xlUp).row
  For row = 2 To maxRow
    Dim a As String
    a = ActiveSheet.Cells(row, 1).Value
    b = ActiveSheet.Cells(row, 2).Value
    If a = aVal And b = bVal Then
      Find = row
      Exit Function
    End If
  Next row
  Find = -1
End Function
于 2013-08-15T22:06:01.180 に答える