2

Предыстория: я копирую и вставляю результаты поиска с веб-сайта в слово. вставленный текст выглядит примерно так:

Цель: я хочу только две строки из каждого набора результатов поиска (показаны зеленым цветом). Все остальное нужно удалить. (очень утомительно, когда у вас есть сотни результатов поиска). Я хочу определить строку, которая начинается с первого слова в красном и заканчивается следующим эскизом изображения. Затем я хочу удалить это.

Хорошая новость: первое слово в красном всегда одно и то же. Мы назовем это "Первый".

Моя проблема: поскольку количество результатов поиска всегда будет варьироваться, я могу думать только об определении диапазона, заканчивающегося изображением, - начать с конца документа и продолжить работу. Я хочу начать с последней картинки

ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)

затем ищите в обратном направлении от этой картинки текст "Первый". Как только я нахожу первое вхождение этого слова, я хочу создать диапазон, используя последнее изображение и это слово, чтобы я мог удалить его. Я не могу понять, как это сделать.

Прогресс на данный момент: вот что у меня есть: на данный момент он ищет текст "первым". Как я могу изменить это?

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. Если я смогу заставить это работать с последним результатом поиска, я затем зациклю этот макрос, чтобы позаботиться обо всем наборе результатов.

Большое спасибо за любую помощь!

2 ответа2

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

0

Просто чтобы показать вам мой готовый продукт:

Сначала макрос удаляет первое изображение (вверху документа). Это гарантирует, что ошибка произойдет, когда мой цикл достигнет вершины документа.

затем он продолжает делать то, с чем вы мне помогли, и зацикливается до тех пор, пока не произойдет ошибка (т. е. он не может найти другое изображение). На этом макрос заканчивается.

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», но я подумал, что это сработает.

еще раз спасибо!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .