背景故事: 我正在将网站上的搜索结果复制并粘贴到 Word 中。粘贴的文本如下图所示:
目标: 我只想要每组搜索结果中的两行(以绿色表示)。其他所有内容都需要删除。(当您有数百个搜索结果时,这非常繁琐)。我想定义一个字符串,该字符串以红色的第一个单词开头,以下一个缩略图结尾。然后我想删除它。
好消息: 第一个红色的单词始终相同。我们将其称为“First”。
我的问题: 因为搜索结果的数量总是会变化,我能想到的唯一定义以图片结尾的范围的方法是从文档末尾开始向上查找。我想从最后一张图片开始
ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)
然后从这张图片向后搜索文本“First”。一旦我找到该词的第一次出现,我想使用最后一张图片和该词创建一个范围,以便我可以删除它。我不知道该怎么做。
迄今进展: 这是我目前得到的结果:到目前为止,它向前搜索文本“first”。我该如何逆转这一过程?
Sub Clear_Stuff()
Dim blnFound As Boolean
Dim Pic As Range
Dim First As Range
Dim rngFound As Range
Dim LastPic As InlineShape
Set LastPic = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)
Application.ScreenUpdating = True
'=====================================================================================
' Selects the last picture on the document, moves the selection to the right once,
' and sets variable Pic to that selection
'-------------------------------------------------------------------------------------
LastPic.Select
Selection.MoveRight wdWord
Set Pic = Selection.Range
'======================================================================================
' searches for the text "First", moves the selection to the left once
' and sets variable First to that selection
' then it sets the range variable rngFound with Pic and First as its bounds
'--------------------------------------------------------------------------------------
Selection.Find.Execute FindText:="First", Forward:=False
blnFound = Selection.Find.Execute
If blnFound Then
Selection.MoveLeft wdWord
Set First = Selection.Range
Set rngFound = ActiveDocument.Range(First.Start, Pic.Start)
End If
'========================================================================
' Deletes the range
'------------------------------------------------------------------------
rngFound.Select
Selection.Delete
Application.ScreenUpdating = True
End Sub
我当然希望这是清楚的。我很乐意补充任何人可能要求的任何说明。我是 VBA 新手。如果我能让它在最后一个搜索结果上工作,那么我将循环这个宏来处理整个结果集。
非常感谢您所有的帮助!
答案1
代码演示如何删除给定字符串的最后一次出现
Sub DeleteLastOccurence()
Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="Hello", Forward:=False
If myRange.Find.Found = True Then myRange.Delete
End Sub
关键部分是Forward:=False
我们告诉 VBA 向后搜索
之前 | 之后
使用的资源
编辑
此代码片段搜索最后一张图片。然后它会向后搜索第一次出现的关键词(第一的在这个例子中)。然后它会选择您的关键词和图片之间的范围。您可以对其执行任何操作,例如删除。
Sub DeleteLastOccurence()
Dim rngPicture As Range
Dim rngJunk As Range
Set rngPicture = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Range
Set rngJunk = Range(0, rngPicture.Start)
rngJunk.Find.Execute FindText:="First", Forward:=False
If rngJunk.Find.Found = True Then Range(rngJunk.Start, rngPicture.Start).Select
End Sub
答案2
只是为了给你展示我的成品:
首先,宏会删除第一张图片(位于文档顶部)。这将确保当我的循环到达文档顶部时发生错误
然后,它继续执行您帮助我执行的操作,并无限循环,直到发生错误(即,它无法找到另一个图像)。此时,宏结束。
Sub DeleteLastOccurence()
On Error GoTo GetOut
ActiveDocument.InlineShapes(1).Delete
Do
Dim rngPicture As Range
Dim rngJunk As Range
Set rngPicture = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Range
Set rngJunk = ActiveDocument.Range(0, rngPicture.Start)
rngJunk.Find.Execute FindText:="KeyWord", Forward:=False
If rngJunk.Find.Found = True Then ActiveDocument.Range(rngJunk.Start, rngPicture.End).Select
Selection.Delete
Loop While 1 + 1 = 2
GetOut:
End Sub
我确信除了“循环至 1+1=2”之外,还有更好的方法来让循环永远进行下去。但我认为这会起作用。哈哈。
再次感谢!