简体   繁体   中英

Match The Nth Instance In Excel

I am using the match function on spreadsheets and the spreadsheets have the same keywords but in different rows, I am attempting to get the row number and to do this I want to use the second instance of a keyword. How would this be done in VBA my current code is

Application.WorksheetFunction.Match("Hello", Range("A1:A100"), 0)

I was thinking about using the Index function, but I am not exactly sure how to use it.

Start the second match just below the first:

Sub dural()
    Dim rw As Long

    With Application.WorksheetFunction
        rw = .Match("Hello", Range("A1:A1000"), 0)
        rw = .Match("Hello", Range("A" & (rw + 1) & ":A1000"), 0) + rw
        MsgBox rw
    End With
End Sub

在此处输入图片说明

If you want the N th match, I would use Find() and a FindNext() loop.

EDIT#1:

Another way to find the N th instance is to Evaluate() the typical array formula within VBA. For N=3 , in the worksheet, the array formula would be:

=SMALL(IF(A1:A1000="Hello",ROW(A1:A1000)),3)

So with VBA:

Sub dural()
    Dim rw As Long, N As Long

    N = 3
    rw = Evaluate("SMALL(IF(A1:A1000=""Hello"",ROW(A1:A1000))," & N & ")")
    MsgBox rw
End Sub

Here is a method using Range.Find .

Option Explicit
Sub FindSecond()
    Dim rSearch As Range, C As Range
    Const sSearchFor As String = "Hello"
    Dim sFirstAddress As String

Set rSearch = Range("A1:A100")

With rSearch  'Note that search starts at the bottom
    Set C = .Find(what:=sSearchFor, after:=rSearch(.Rows.Count, 1), _
        LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows, _
        searchdirection:=xlNext, MatchCase:=False)
    If Not C Is Nothing Then
        sFirstAddress = C.Address
        Set C = .FindNext(C)
        If C.Address <> sFirstAddress Then
            MsgBox "2nd instance of " & sSearchFor & " on row " & C.Row
        Else
            MsgBox "Only one instance of " & sSearchFor & " and it is on row " & C.Row
        End If
    Else
        MsgBox "No instance of " & sSearchFor
    End If
End With
End Sub

在此处输入图片说明

There might be a better way, but this works:

=MATCH("Hello",INDIRECT("A"&(1+MATCH("Hello",A1:A100,0))&":A100"),0)

This would return the index of the second occurrence, by searching for the first occurrence and using that to define the range to search for the next one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM