Como encontrar uma palavra em um documento a partir da seleção atual em diante

votos
0

Eu tenho um extrato de código que procura por uma palavra em um documento a partir da seleção atual até o fim. A intenção deste é para que na próxima vez que ele é executado ele vai encontrar a próxima instância e assim por diante.

Ele funciona muito bem até encontrar uma palavra dentro de uma tabela, em que ponto ele não vai encontrar nada após essa entrada. Eu preciso ser capaz de encontrar palavras mesas, bem como texto. Ele também funciona como uma função em um (modal execução) userForm, aguarda a entrada do utilizador, em seguida, proporcionando palavras diferentes, looping e realizando acções dependendo da entrada de utilizador. Então eu não acredito que eu posso executar o meu outro código dentro da seção find (embora eu estou feliz em ser corrigido).

Sub test1()

Dim list() As String
Dim wrd As String
Dim mrk As Integer

wrd = ABC 'Get next word from list

'set range to search as from current selection (previously found) to end of document
Dim DocRng
Set DocRng = ActiveDocument.Range(Start:=Selection.End, End:=ActiveDocument.Content.End)

mrk = Selection.End 'Mark end of previously found instance (current selection)

With DocRng.Find 'Find next instance of word and select it
     .Text = wrd
     .MatchCase = True
     .Forward = True
     .Execute
     DocRng.Select
End With

If Selection.End = mrk Then 'If selection hasn't changed inform user and go to start of document
    MsgBox (Reached end of document.)
    Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=0
End If

tmp = Selection.Text 'Save currently selected text

End Sub

Como faço para obtê-lo a encontrar as entradas últimos a mesa?

Publicado 19/12/2018 em 14:12
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Você pode executar outro código dentro de um Find / Replace loop, usando um código como:

Sub Demo()
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = InputBox("What is the Text to Find")
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = True
    .MatchWholeWord = True
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
  End With
  Do While .Find.Found
    .Select
    Select Case MsgBox("Replace this one?", vbYesNoCancel)
      Case vbCancel: Exit Sub
      Case vbYes: .Text = InputBox("Replacement text")
      Case Else
    End Select
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
End Sub

Esse código não é afetado por tabelas.

Respondeu 20/12/2018 em 13:21
fonte usuário

votos
0

Ao pesquisar todo o documento (ou intervalo especificado) e armazenar as localizações de cada instância em uma matriz, você pode então comparar esses locais para a seleção atual e selecione a instância após a seleção atual.

Function search()

Dim list() As String
Dim Wrd As String
Dim k As Integer
Dim Nfound As Boolean

Dim Def As String
Dim location() As String

'Search document and get locations of each instance of a word

Wrd = "ABC" 'Get next word from list
Def = "Alphabet"
k = 1

Dim DocRng
Set DocRng = ActiveDocument.Content 'search whole document

With DocRng.find
     .Text = Wrd
     .MatchCase = True

    Do While .Execute 'For each entry found, store start and end to array
        ReDim Preserve location(2, k)
        location(1, k) = DocRng.Start
        location(2, k) = DocRng.End
        k = k + 1
    Loop

End With

'Compare the found locations against the current selection and select the first instance after current selection

Nfound = True 'Set as not found until it is found

    j = Selection.End 'mark current cursor location

    For k = 1 To UBound(location, 2)
        If location(1, k) > j + Len(Def) Then '+ Len(Def) accounts for changes to text
            ActiveDocument.Range(Start:=location(1, k), End:=location(2, k)).Select
            Nfound = False
            Exit For
        End If
    Next

    If Nfound Then 'if not found got to first instance found
        k = 1
        ActiveDocument.Range(Start:=location(1, k), End:=location(2, k)).Select
    End If

End Function
Respondeu 20/12/2018 em 10:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more