Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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中匹配第n个实例_Excel_Vba - Fatal编程技术网

在Excel中匹配第n个实例

在Excel中匹配第n个实例,excel,vba,Excel,Vba,我在电子表格上使用匹配功能,电子表格具有相同的关键字,但在不同的行中,我尝试获取行号,为此,我想使用关键字的第二个实例。如何在VBA中执行此操作我当前的代码是 Application.WorksheetFunction.Match("Hello", Range("A1:A100"), 0) 我正在考虑使用索引函数,但我不确定如何使用它 也许有更好的方法,但这是可行的: =匹配(“你好”,间接(“A”和(1+匹配(“你好”,A1:A100,0))&:A100”),0) 这将返回第二个匹配项的索引

我在电子表格上使用匹配功能,电子表格具有相同的关键字,但在不同的行中,我尝试获取行号,为此,我想使用关键字的第二个实例。如何在VBA中执行此操作我当前的代码是

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

我正在考虑使用索引函数,但我不确定如何使用它

也许有更好的方法,但这是可行的:

=匹配(“你好”,间接(“A”和(1+匹配(“你好”,A1:A100,0))&:A100”),0)


这将返回第二个匹配项的索引,方法是搜索第一个匹配项,并使用该索引定义搜索下一个匹配项的范围。

可能有更好的方法,但这是有效的:

=匹配(“你好”,间接(“A”和(1+匹配(“你好”,A1:A100,0))&:A100”),0)


这将返回第二个匹配项的索引,方法是搜索第一个匹配项并使用该索引定义搜索下一个匹配项的范围。

在第一个匹配项下方开始第二个匹配项:

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

如果需要第n个匹配,我将使用Find()和FindNext()循环

编辑#1:

找到第n个实例的另一种方法是计算VBA中的典型数组公式()。对于N=3,在工作表中,数组公式为:

=SMALL(IF(A1:A1000="Hello",ROW(A1:A1000)),3)
因此,对于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

在第一个下方开始第二个匹配:

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

如果需要第n个匹配,我将使用Find()和FindNext()循环

编辑#1:

找到第n个实例的另一种方法是计算VBA中的典型数组公式()。对于N=3,在工作表中,数组公式为:

=SMALL(IF(A1:A1000="Hello",ROW(A1:A1000)),3)
因此,对于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

下面是一个使用
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
选项显式
亚FindSecond()
尺寸R搜索范围,C搜索范围
Const ssearchforas String=“Hello”
Dim sFirstAddress作为字符串
设置rSearch=范围(“A1:A100”)
请注意,搜索从底部开始
设置C=.Find(what:=sSearchFor,after:=rSearch(.Rows.Count,1)_
LookIn:=xlValues,lookat:=xlother,searchorder:=xlByRows_
searchdirection:=xlNext,MatchCase:=False)
如果不是,那么C什么都不是
sFirstAddress=C.地址
集合C=.FindNext(C)
如果C.地址sFirstAddress则
MsgBox“第二个实例”&sSearchFor&“在行”&C.行
其他的
MsgBox“只有一个”&sSearchFor&“的实例,它位于第行”&C.第行
如果结束
其他的
MsgBox“无实例”&sSearchFor
如果结束
以
端接头

这里有一个使用
范围的方法。查找

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
选项显式
亚FindSecond()
尺寸R搜索范围,C搜索范围
Const ssearchforas String=“Hello”
Dim sFirstAddress作为字符串
设置rSearch=范围(“A1:A100”)
请注意,搜索从底部开始
设置C=.Find(what:=sSearchFor,after:=rSearch(.Rows.Count,1)_
LookIn:=xlValues,lookat:=xlother,searchorder:=xlByRows_
searchdirection:=xlNext,MatchCase:=False)
如果不是,那么C什么都不是
sFirstAddress=C.地址
集合C=.FindNext(C)
如果C.地址sFirstAddress则
MsgBox“第二个实例”&sSearchFor&“在行”&C.行
其他的
MsgBox“只有一个”&sSearchFor&“的实例,它位于第行”&C.第行
如果结束
其他的
MsgBox“无实例”&sSearchFor
如果结束
以
端接头

使用
范围。查找
方法我相信诀窍是,如何定义“第二个实例”?我假设您的意思是,如果有两个实例,“第二个”将是行数较高的实例。对吗?如果您的数据在同一行上,第二个实例会是第二个“最高”列号吗?@BruceWayne是的。这是正确的。使用
范围。查找
方法我相信诀窍是,如何定义“第二个实例”?我假设您的意思是,如果有两个实例,“第二个”将是行数较高的实例。对吗?如果数据在同一行上,第二个实例是否是第二个“最高”列号?@BruceWayne是的,这是正确的。