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