如何从后往前搜索文本

如何从后往前搜索文本

背景故事: 我正在将网站上的搜索结果复制并粘贴到 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”之外,还有更好的方法来让循环永远进行下去。但我认为这会起作用。哈哈。

再次感谢!

相关内容