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 (2 intervenciones) 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 (14 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 (14 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 (14 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
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 (14 intervenciones) el 15/12/2021 09:49:55
Buenos días:

Disculpa que no te haya contestado antes pero llevo tiempo sin entrar en el foro. A ver si entiendo la pregunta. Veo que entiendes cómo funciona el bucle Do ... Loop y sabes que si el resultado es False, se sale del mismo. En cuanto a tu duda, es muy sencillo. Cuando ejecutamos la búsqueda, Word no se fija en la siguiente palabra a ver si es o no, sino que recorre todo el texto. Si la vuelve a encontrar, selecciona la palabra y devuelve True. Solo en el caso de que se llegure al final del documento sin que vuelva a aparecer el texto a buscar devolverá False. Para evitar que se entre en un bucle sin fin volviendo a comenzar por el principio del documento cuando encuentre la última coincidencia, ponemos la propiedad .Wrap = wdFindStop.

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
sin imagen de perfil

Buscar palabras consecutivas en word

Publicado por A (2 intervenciones) el 25/02/2022 23:39:21
Hola de nuevo, Norberto.

Hace un tiempo que ando dándole vueltas a otra opción parecida a esta en la que me ayudaste. Concretamente, se trataría de poder encontrar la frecuencia de todas las parejas de palabras consecutivas en un word, sin atender a sin son mayúscula o minúscula, y listarla en otro word.

Tengo el código para listar la frecuencia de cada palabra, pero sería una vuelta de tuerca más. La matriz será bastante más pequeña, pero claro, hay que crear un código para encontrar todas las parejas y contarlas.

No sé si es posible, desde luego, yo ni me atrevo a intentarlo.
Como ya vi que eras una máquina, ahí lo dejo, por si me puedes echar una mano.

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