Por lo tanto, estoy empezando a entender expresiones regulares y he encontrado la curva de aprendizaje bastante empinada. Sin embargo, stackoverflow ha sido inmensamente útil en el proceso de mi experimentación. Hay una macro de palabras particular que me gustaría escribir pero no he encontrado una manera de hacerlo. Me gustaría poder encontrar dos palabras dentro de 10 o más palabras entre sí en un documento y luego ponerlas en cursiva, si las palabras están separadas más de 10 palabras o están en un orden diferente Me gustaría que la macro no se ponga en cursiva esas palabras.¿Macro de palabra Regex que encuentra dos palabras dentro de un rango el uno del otro y luego pone en cursiva esas palabras?
He estado usando la siguiente expresión regular:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
Sin embargo, sólo me permite manipular la cadena entera como un todo incluyendo palabras al azar en el medio. Además, la función .Replace solo me permite reemplazar esa cadena con una cadena diferente y no cambiar los estilos de formateo.
¿Alguna persona más experimentada tiene una idea de cómo hacer que esto funcione? ¿Es posible hacerlo?
EDITAR: Esto es lo que tengo hasta ahora. Hay dos problemas que estoy teniendo. Primero, no sé cómo seleccionar solo las palabras "Panamá" y "Canal" dentro de una expresión regular coincidente y reemplazar solo esas palabras (y no las palabras intermedias). En segundo lugar, simplemente no sé cómo reemplazar una Regexp que se combina con un formato diferente, solo una cadena de texto diferente, probablemente solo como resultado de la falta de familiaridad con las macros de palabras.
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Set re = New regExp
re.Pattern = "\bPanama\W+(?:\w+\W+){0,10}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
Set rng = para.Range
rng.MoveEnd unit:=wdCharacter, Count:=-1
Text$ = rng.Text + "Modified"
rng.Text = re.Replace(rng.Text, Text$)
Next para
End Sub
Ok, gracias a la ayuda de Tim Williams a continuación me dio la siguiente solución juntos, es más que un poco torpe en algunos aspectos y que no es en absoluto expresión regular pura pero hace obtener el trabajo hecho. Si alguien tiene una mejor solución o idea acerca de cómo hacer esto, me encantaría escucharlo. Una vez más, mi fuerza bruta sobre los cambios con la función de búsqueda y reemplazar es un poco embarazoso crudo, pero al menos funciona ...
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Dim txt As String
Dim allmatches As MatchCollection, m As match
Set re = New regExp
re.pattern = "\bPanama\W+(?:\w+\W+){0,13}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
txt = para.Range.Text
'any match?
If re.Test(txt) Then
'get all matches
Set allmatches = re.Execute(txt)
'look at each match and hilight corresponding range
For Each m In allmatches
Debug.Print m.Value, m.FirstIndex, m.Length
Set rng = para.Range
rng.Collapse wdCollapseStart
rng.MoveStart wdCharacter, m.FirstIndex
rng.MoveEnd wdCharacter, m.Length
rng.Font.ColorIndex = wdOrange
Next m
End If
Next para
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "Panama"
.Replacement.Text = "Panama"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "Canal"
.Replacement.Text = "Canal"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.ColorIndex = wdBlack
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
El objeto Match tiene una propiedad Index que le indica en qué parte del texto se produjo la coincidencia. Puede usar eso para abordar rangos particulares para cambiar su formato. Si actualiza su pregunta para mostrar su código actual, alguien puede responder con los cambios sugeridos. –
muéstrame la lista de palabras con las que ejecutas la expresión regular. – jared
¿Son '' las palabras son más de 10 palabras'' o '' las palabras tienen más de 10 letras'' o '' las oraciones son más de 10 palabras''? – Cylian