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。
- Excel:在date范围之间提取完整的月份
- Excel:使用该单元格中的数据填充RGB颜色的单元格
- 使用Javascript从Excel(xlsx)file upload的谷歌地图上的标记
- 获取java.io.IOException无法从Windows Server 2003中的/docProps/app.xml获取inputstream
- 我可以从超链接使用vba剪切并粘贴到不同的表单中?
- 使用LINEST 5000次进行梯度计算,无需手动input代码
- VBA:部分数组string的自动筛选
- Excel Countif函数没有评估
- 在被VBAclosures后,文本stream对象在Excel中保持打开状态