【问题标题】:Excel vba - find row number where colum data (multiple clauses)Excel vba - 查找列数据所在的行号(多个子句)
【发布时间】:2013-08-18 05:11:03
【问题描述】:

我需要 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

我需要找到 B = "day1" 和 A = "id2" 的行号(在本例中行号为 2)。

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

希望问题很清楚。

谢谢!

【问题讨论】:

    标签: excel vba find row where


    【解决方案1】:

    通过这样的数据设置,您可以使用 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
    

    【讨论】:

    • 我在 Excel 中试过这个,它可以工作。我需要使用 VBA 中的宏来完成此操作。这将如何被翻译成 VBA 代码(宏)?谢谢。
    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 2014-06-08
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多