Excel中的VBAsearch多个选项卡上的string并返回位置

我已经形成了代码来执行search的问题是试图让它find多个结果。 目前它将返回每个选项卡上的string的第一个位置,但随后继续。 当我实现While循环当前注释掉它似乎find第一个结果,然后转义循环。

我不知道是否有一个VBA循环,我错过了一个怪癖或我虽然检查是不是很正确,但我已经尝试debugging分解并使用消息框,但无济于事,除了缩小我相信这个问题在while循环代码中。

Public Function GetSearchArray(strSearch As String) As String Dim strResults As String Dim SHT As Worksheet Dim rFND As Range Dim sFirstAddress As Range For Each SHT In ThisWorkbook.Worksheets 'MsgBox "Looping over worksheets" Set rFND = Nothing With SHT.UsedRange 'MsgBox "Searching for" & strSearch Set rFND = .Cells.Find(What:="*" & strSearch & "*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlRows, SearchDirection:=xlNext, MatchCase:=False) If Not rFND Is Nothing Then 'Save first result so we can exit the loop If sFirstAddress Is Nothing Then MsgBox "We have a result and sFirstAddress is nothing" Set sFirstAddress = rFND End If 'Need to loop within the sheet to keep finding results 'While (Not rFND Is Nothing) And rFND <> sFirstAddress 'Deal with the results and build a string If strResults = "" Then 'MsgBox "No prev results" strResults = "Worksheet(" & SHT.Index & ").Range(" & Chr(34) & rFND.Address & Chr(34) & ")" MsgBox "First result " & strResults Else strResults = strResults & "|" & "Worksheet(" & SHT.Index & ").Range(" & Chr(34) & rFND.Address & Chr(34) & ")" MsgBox strResults End If Set rFND = .FindNext(rFND) 'Wend End If End With MsgBox "End sheet loop.." Next MsgBox "Finished going over sheets" MsgBox strResults End Function 

像这样的东西应该为你工作:

 Public Function GetSearchArray(strSearch As String) As String Dim ws As Worksheet Dim rngFound As Range Dim strFirst As String Dim strWSname As String For Each ws In ActiveWorkbook.Sheets Set rngFound = ws.UsedRange.Find(strSearch, ws.UsedRange.Cells(ws.UsedRange.Cells.Count), xlValues, xlPart) If Not rngFound Is Nothing Then strWSname = ws.Name If InStr(1, ws.Name, " ", vbTextCompare) > 0 Then strWSname = "'" & strWSname & "'" strFirst = rngFound.Address Do GetSearchArray = GetSearchArray & "|" & strWSname & "!" & rngFound.Address Set rngFound = ws.UsedRange.Find(strSearch, rngFound, xlValues, xlPart) Loop While rngFound.Address <> strFirst End If Next ws If Len(GetSearchArray) > 0 Then GetSearchArray = Mid(GetSearchArray, 2) End Function 

然后调用函数,使用这样的东西:

 Sub tgr() MsgBox Replace(GetSearchArray("test"), "|", Chr(10)) End Sub 

您需要循环回到Set rFND = .Cells.Find(What:="*" & strSearch & "*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlRows, SearchDirection:=xlNext, MatchCase:=False)在你的代码到达While循环之前,当前不会发生,rFND 总是等于sFirstAddress。

我不确定最有效的方式来存储您的地址结果,然后在循环中检查它们,但我相信有人可以帮助您完成最后一部分。 我怀疑这将是将每个结果存储在一个数组中,并检查每个新的结果对arrays,直到没有find新的结果,然后移动到下一张表。

你可能还必须改变你的查找命令,从最后find的结果开始,如果它在同一个地方开始,那么每次我想它会一遍又一遍地find相同的结果。 我不确定,我没有用过多less。