Visual Basic para Aplicaciones - Buscar palabras consecutivas en word

Life is soft - evento anual de software empresarial
<<>>
 
Vista:
sin imagen de perfil

Buscar palabras consecutivas en word

Publicado por Alfonso (1 intervención) el 24/11/2021 20:15:14
En un documento Word quiero remarcar todos los verbos compuestos, por ejemplo, los presentes perfectos de tercera persona (tipo "ha bebido")
He creado una macro que me funciona a la perfección. Con el único problema que al aumentar el número de palabras del documento, el tiempo se alarga exponencialmente, siendo inmanejable.

En mi rudimentario conocimiento de VB aplicado a Word, no logro encontrar la solución.

¿Quién se atreve a ayudarme? Le quedaría enormemente agradecido.
Adjunto el código actual:

Sub Verbos_Compuestos()
Application.ScreenUpdating = False

'Ejemplo: Ha comido, ha visto, ha dicho, ha impreso
'-> Lista primera palabra: Ha, ha (para tercera persona de singular)
'-> Lista de terminaciones de participios: to, do, so (idem)

Dim texto1, texto2 As String
Dim TargetList
Dim Encontrado As Integer
Encontrado = 0
TargetList = Array("do", "to", "ho", "so")
palabras = ActiveDocument.Words.Count

For i = 1 To palabras
texto1 = RTrim(ActiveDocument.Words(i).Text)
If texto1 = "ha" Or texto1 = "Ha" Then
texto2 = Right(RTrim(ActiveDocument.Words(i + 1).Text), 2)

For j = 0 To UBound(TargetList)
If texto2 = TargetList(j) Then
ActiveDocument.Words(i).HighlightColorIndex = wdPink
ActiveDocument.Words(i + 1).HighlightColorIndex = wdRed
Encontrado = Encontrado + 1
Exit For
End If
Next
End If

If Int(i / 5000) = i / 5000 Then
If MsgBox(i & " analizadas. ¿Continuar?" & " Total " & palabras, vbYesNo) = vbNo Then Exit For
End If

Next

System.Cursor = wdCursorNormal
MsgBox ("He encontrado" & Encontrado & "casos")
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Buscar palabras consecutivas en word

Publicado por Norberto (8 intervenciones) el 25/11/2021 13:27:18
Hola:

Como veo que tienes suficientes conocimientos de VBA aplicado a Word, te sugiero que uses el método Find para localizar el verbo auxiliar y una vez localizado, mirar si la siguiente corresponde a un participio. ¡Animo que seguro que lo sacas!

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Buscar palabras consecutivas en word

Publicado por Norberto (8 intervenciones) el 25/11/2021 14:33:16
Hola de nuevo:

¡Ahí va! (No me he podido resistir)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Sub Verbos_Compuestos()
    Application.ScreenUpdating = False
 
    'Ejemplo: Ha comido, ha visto, ha dicho, ha impreso
    '-> Lista primera palabra: Ha, ha (para tercera persona de singular)
    '-> Lista de terminaciones de participios: to, do, so (idem)
 
    Dim Texto1, Texto2 As String
    Dim TargetList
    Dim Encontrado As Integer
    Dim Palabras As Long
    Dim i As Long, j As Integer
    Dim Seguir As Boolean
    Dim Tiempo As Date, hInicio As Date
    hInicio = Now() 'Comenzamos!!
 
    Encontrado = 0
    TargetList = Array("do", "to", "ho", "so")
    Palabras = ActiveDocument.Words.Count
    Selection.HomeKey wdStory
    Selection.Find.ClearFormatting
 
    Do
        With Selection.Find
            .Text = "ha"
            .Replacement.Text = ""
            .Forward = True             'Hacia adelante
            .Wrap = wdFindStop          'Parar al llegar al final del documento
            .Format = False             'Sin formato
            .MatchCase = False          'Sin coincidencia de may/min
            .MatchWholeWord = True      'Palabras completas
            .MatchWildcards = False     'Sin comodines
            .MatchSoundsLike = False    'Sin aproximaciones sonoras
            .MatchAllWordForms = False  'No encontrar todas las formas de la palabra
            Seguir = .Execute
        End With
        If Seguir Then 'Se ha encontrado
            Selection.Expand wdWord 'Seleccionamos toda la palabra
            Selection.MoveRight wdWord, 1, True 'Seleccionamos la siguiente palabra
            Texto1 = Trim(Selection)  'Las dos palabras
            Texto2 = Right(Texto1, 2)
            For j = 0 To UBound(TargetList)
                If Texto2 = TargetList(j) Then
                    Selection.Words(1).HighlightColorIndex = wdPink
                    Selection.Words(2).HighlightColorIndex = wdRed
                    Encontrado = Encontrado + 1
                    Exit For
                End If
            Next
            Selection.Collapse wdCollapseEnd 'Deseleccionamos el texto situando el cursor al final
        End If
    Loop While Seguir
    Tiempo = Now() - hInicio
    System.Cursor = wdCursorNormal
    MsgBox ("He encontrado " & Encontrado & " casos en un documento de " & _
            Palabras & " palabras en " & Format(Tiempo, "h ""horas"" m ""minutos"" s ""segundos""") & ".")
 
End Sub

Captura

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Buscar palabras consecutivas en word

Publicado por Alfonso (2 intervenciones) el 25/11/2021 23:33:13
Hola, Norberto:

Eres un monstruo, una rutina que tardaba más de 10 h para 100.000 palabras ahora tarda 10 segundos.

Pero no llevas razón en eso de que tengo suficientes conocimientos en VB para Word. Soy un mero aficionado y hace unos días que he empezado a rascar. Sabía que el tema iba con el "Find", pero no sé usarlo bien. Ha quedado patente.

Quedo en deuda.
Enormemente agradecido.
Un abrazo, Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Buscar palabras consecutivas en word

Publicado por Norberto (8 intervenciones) el 26/11/2021 09:20:42
Hola, Alfonso:

Me alegra haberte sido de ayuda y a seguir dándole al VBA para Word que tiene su miga.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Buscar palabras consecutivas en word

Publicado por Alfonso (2 intervenciones) el 26/11/2021 14:26:46
Gracias, Norberto.

Después de repasar el código, y abusando de tu amabilidad, no acabo de entender cómo haces para que el bucle "Do" no acabe cuando el siguiente par de palabras no empiezan por "ha". ¿Al ser falsa la condición, no debería salir del Do y terminar el escrutinio? No lo veo.

Imagino que has declarado el rango completo del documento en algún lado, pero ya digo que no domino del todo VB.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar