¿Cómo encontrar una palabra en un documento de la selección actual en adelante

votos
0

Tengo un extracto de código que busca una palabra en un documento de la selección actual hasta el final. La intención de esto es para que la próxima vez que se ejecute se va a buscar la siguiente instancia y así sucesivamente.

Funciona bien hasta que encuentra una palabra dentro de una tabla, momento en el que no va a encontrar nada después de esa entrada. Tengo que ser capaz de encontrar las palabras en las tablas, así como texto. También funciona como una función en un (modal en ejecución) formulario de usuario, a la espera de la entrada del usuario a continuación, proporcionando diferentes palabras, de enlace y la realización de acciones en función de la entrada del usuario. Así que no creo que pueda correr mi otro código dentro de la sección de descubrimiento (aunque estoy feliz de ser corregido).

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

¿Cómo llego a encontrar las entradas más allá de la mesa?

Publicado el 19/12/2018 a las 14:12
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Puede ejecutar otro código dentro de un Buscar / Reemplazar bucle, utilizando 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

Este código no se ve afectado por las tablas.

Respondida el 20/12/2018 a las 13:21
fuente por usuario

votos
0

Mediante la búsqueda en todo el documento (o rango especificado) y almacenar las ubicaciones de cada instancia en una matriz, entonces puede comparar esos lugares a la selección actual y seleccione la instancia después de la selección actual.

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
Respondida el 20/12/2018 a las 10:14
fuente por usuario

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