在excel vba中搜索多个列

时间:2014-01-13 12:59:36

标签: excel vba excel-vba

我可以使用此

搜索电子表格A列中的文字
With WB.Sheets("MySheet")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp1", LookIn:=xlValues)
End With

之后我可以通过FindRow.Row

获取行号

如何取回Column A == "ProjTemp1" && Column B == "ProjTemp2" && Column C == "ProjTemp3"

所在的行号

4 个答案:

答案 0 :(得分:7)

尝试使用Autofilter

Dim rng As Range
'disable autofilter in case it's already enabled'
WB.Sheets("MySheet").AutoFilterMode = False 

With WB.Sheets("MySheet").Range("A1:C1")
    'set autofilter'
    .AutoFilter Field:=1, Criteria1:="=ProjTemp1"
    .AutoFilter Field:=2, Criteria1:="=ProjTemp2"
    .AutoFilter Field:=3, Criteria1:="=ProjTemp3"
End With

With WB.Sheets("MySheet")
    On Error Resume Next
    Set rng = .Range("A2:A" & .Rows.Count).Rows.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
End With
If Not rng Is Nothing Then
   MsgBox rng.Row ' returns first visible row number
End If

WB.Sheets("MySheet").AutoFilterMode = False 'disable autofilter'

答案 1 :(得分:2)

另一个建议是循环遍历表并使用嵌套的if语句,如下所示:

Sub ReturnRowNumber()
    Dim i As Long, GetRow As Long
    For i = 2 To Sheets("MySheet").Cells(Rows.Count, 1).End(xlUp).Row
        'Criteria search
        If Sheets("MySheet").Cells(i, 1).Value = "ProjTemp1" Then
            If Sheets("MySheet").Cells(i, 2).Value = "ProjTemp2" Then
                If Sheets("MySheet").Cells(i, 3).Value = "ProjTemp3" Then
                    'Returns row
                    GetRow = i
                End If
            End If
        End If
    Next i
End Sub

答案 2 :(得分:0)

刚刚在MSDN发布了类似的回复,如果有人还在使用VBA,我想在这里分享。多次匹配的功能非常快。

如果您对有效代码感兴趣,可能会有很大帮助,因为使用Application.Match()比Find()或INDEX()方法或简单循环要快得多。

语法与COUNTIFS()相同,但它返回匹配索引而不是计数。

Public Function MultiMatch(ParamArray X0() As Variant) As Variant
MultiMatch = CVErr(xlErrNA)
If UBound(X0) = -1 Then Exit Function
On Error GoTo ErrorHandler
Set Xws = X0(1).Parent
X_rFrow = X0(1)(1, 1).Row
X_rLrow = X_rFrow + X0(1).Rows.Count - 1
jLAST = UBound(X0)
l = X_rFrow

j = 0
Do While IsError(MultiMatch) And j + 1 <= jLAST And Not IsError(X1)
    jCOL = X0(j + 1).Column
    Set TRNG = Xws.Range(Xws.Cells(l, jCOL), Xws.Cells(X_rLrow, jCOL))
    X1 = Application.Match(X0(j), TRNG, 0)
    If Not IsError(X1) Then
        l = TRNG(X1).Row
        If X1 = 1 Then
            If j + 1 = jLAST Then
                MultiMatch = l - X_rFrow + 1
            Else
                j = j + 2
            End If
        Else
            j = 0
        End If
    End If
Loop
Exit Function
ErrorHandler:
MultiMatch = CVErr(xlErrName)
End Function

答案 3 :(得分:0)

这可以通过以下方式工作:要搜索的X个值的数量是要在一行中搜索X个值的Y列,由于没有结果而有0个并且Row> = 1的行具有同一行中每列的X值数量。

Public Function find(sheetName As String, initCol As Integer, initRow As Integer, ParamArray values()) As Variant
Dim i As Long, GetRow As Long
On Error GoTo nextRow
    For i = initRow To Sheets(sheetName).cells(Rows.Count, 1).End(xlUp).row
        For ii = 0 To UBound(values)
            If Sheets(sheetName).cells(i, initCol + ii).Value2 = values(ii) Then
                    GetRow = ii
                    If ii = UBound(values) Then
                        find = i
                        Exit Function
                    End If
                    GoTo nextCol
            End If
            If ii = 0 Then GoTo nextRow
nextCol:
        Next ii
nextRow:
    Next i
endFind:
  find = GetRow
End Function

使用:

vRow = find(“ sheet”,1,1,“ test”,“ test1”,“ test2”)

“ sheet” = sheetName,1 =列索引开始,1 =行号开始,[“ test”,“ test1”,“ test2”]是ParamArray

“查找”功能将在列A中搜索“ test”,在列B中搜索“ test1” C中的“ test2”,它将返回具有这些值的行号 跟在同一行