Como pesquisar texto de trás para frente

2

Histórico: Estou copiando e colando os resultados da pesquisa de um site em Word. o texto colado é parecido com a imagem abaixo:

Objetivo:queroapenasduaslinhasdecadaconjuntoderesultadosdepesquisa(representadosemverde).Tudoorestoprecisaserexcluído.(muitotediosoquandovocêtemcentenasderesultadosdepesquisa).Euquerodefinirumastringquecomeçacomaprimeirapalavraemvermelhoeterminacomapróximaimagememminiatura.Euentãoquerodeletarisso.

aboanotícia:aprimeirapalavraemvermelhoésempreamesma.Nósvamoschamá-lode"primeiro".

Meu problema: porque o número de resultados da pesquisa sempre varia, a única maneira de definir um intervalo que termina com uma imagem é começar do final do documento e trabalhar . Eu quero começar com a última foto

ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)

em seguida, pesquise para trás a partir desta imagem para o texto "Primeiro". Quando eu encontrar a primeira ocorrência dessa palavra, quero criar um intervalo usando a última imagem e essa palavra para poder excluí-la. Não consigo descobrir como fazer isso.

Progresso até agora: Aqui está o que eu tenho até agora: a partir de agora, ele procura pelo texto "primeiro". Como faço para reverter isso?

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

Eu certamente espero que isso seja claro. Terei todo o gosto em acrescentar qualquer esclarecimento que alguém possa pedir. Eu sou um novato na VBA. Se eu conseguir que isso funcione no último resultado da pesquisa, eu irei fazer o loop dessa macro para cuidar de todo o conjunto de resultados.

muito obrigado por toda e qualquer ajuda!

    
por Jamiho 30.07.2015 / 05:51

2 respostas

1

Código para demonstrar como excluir a última ocorrência de uma determinada string

Sub DeleteLastOccurence() 
    Set myRange = ActiveDocument.Content
    myRange.Find.Execute FindText:="Hello", Forward:=False
    If myRange.Find.Found = True Then myRange.Delete
End Sub

A parte chave é Forward:=False , onde dizemos ao VBA para pesquisar para trás

Antes | Depois

Recursosusados

  • link

Editar

Este código recortado procura a última imagem. Em seguida, retrocede para pesquisar a primeira ocorrência da sua palavra-chave ( Primeiro neste exemplo). Em seguida, seleciona o intervalo entre a palavra-chave e a imagem. Você pode fazer o que quiser com isso, como apagar.

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

    
por 30.07.2015 / 09:38
0

Só para mostrar o meu produto acabado:

Primeiro, a macro exclui a primeira foto (na parte superior do documento). Isso garantirá que um erro ocorra quando meu loop chegar ao topo do documento

então, ele faz o que você me ajudou e faz um loop para sempre até que o erro ocorra (ou seja, não é possível encontrar outra imagem). Nesse momento, a macro termina.

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

Tenho certeza que existe uma maneira melhor de dizer que um loop continua para sempre, além de "loop while 1 + 1 = 2. mas eu imaginei que funcionaria. lol.

obrigado novamente!

    
por 30.07.2015 / 18:07