Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel vba-查找列数据所在的行号(多个子句)_Excel_Vba_Find_Row_Where - Fatal编程技术网

Excel vba-查找列数据所在的行号(多个子句)

Excel vba-查找列数据所在的行号(多个子句),excel,vba,find,row,where,Excel,Vba,Find,Row,Where,我需要VBA中的一个函数,它根据2个where子句查找行号 以下是Excel示例: ** 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 da

我需要VBA中的一个函数,它根据2个where子句查找行号

以下是Excel示例:

**     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
我需要找到行号(在本例中,行号为2),其中B=“day1”和A=“id2”

根据行号,我需要进一步获得其他列的值,即C2、D2

希望问题清楚


谢谢大家!

通过这样的数据设置,您可以使用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函数从列返回值。假设匹配公式在单元格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))
如果您不想查看错误,可以在Excel2007上使用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解决方案。这使用了一个非常高效和灵活的find循环,并显示了在找到匹配项后如何从其他列中提取值:

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
Sub-tgr()
暗淡的rngFound As范围
Dim strFirst作为字符串
像细绳一样模糊的条纹
作为字符串的Dim strDay
strID=“id2”
strDay=“第1天”
设置rngFound=Columns(“A”).Find(strID,Cells(Rows.Count,“A”)、xlValues、xlWhole)
如果不是,那么rngFound什么都不是
strFirst=rngFound.Address
做
如果LCase(单元格(rngFound.Row,“B”).Text)=LCase(strDay),则
“找到了一根火柴
MsgBox“在以下位置找到匹配项:&rngFound.Row&Chr(10)&_
“C列中的值:”&单元格(rngFound.Row,“C”)。文本和Chr(10)以及_
D列中的值:“&单元格(rngFound.Row,“D”)。文本
如果结束
设置rngFound=Columns(“A”).Find(strID、rngFound、xlValues、xlother)
在rngFound.Address strFirst时循环
如果结束
设置rngFound=Nothing
端接头

在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

我在Excel中尝试了这个方法,效果很好。我需要使用VBA中的宏来完成此操作。如何将其转换为VBA代码(宏)?非常感谢。