vba - valor - macro para seleccionar un rango de celdas variable
¿Cómo puedo reemplazar un estilo de personaje de Microsoft Word dentro de un rango/selección en VBA? (2)
Estoy trabajando en una plantilla de Word 2007 con una macro que aplicará estilos de caracteres al texto seleccionado. Parecía que la función Buscar / Reemplazar sería un buen lugar para comenzar, pero creo que he encontrado un error / limitación que impide que la macro funcione como se desea.
Aquí está mi código vba:
Sub restyleSelection()
Dim r As Range
Set r = Selection.Range
With r.Find
.Style = ActiveDocument.Styles("Default Paragraph Font")
.Text = ""
.Replacement.Text = ""
.Replacement.Style = ActiveDocument.Styles("Emphasis")
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
Si creo un documento de prueba que contiene unos pocos párrafos y selecciono algunas palabras en uno de los párrafos, luego ejecuto la macro, el estilo "Énfasis" se aplica no solo a la selección, sino más allá del final de la selección hasta el final del documento.
Este comportamiento es el mismo con la herramienta Buscar / Reemplazar GUI real.
Mi pregunta es: ¿cómo puedo superar este error / limitación y aplicar el estilo de personaje SÓLO dentro de la selección / rango?
Un poco más de información:
Lo que realmente necesito que haga la macro es aplicar cierto formato a toda la selección mientras se mantienen los estilos de caracteres existentes en la selección. Por ejemplo, si el texto seleccionado contiene el estilo de carácter Negrita, el estilo de carácter cursiva y el resto es Fuente de párrafo predeterminado, la macro debe reemplazar Negrita con "Negrita revisada", reemplazar "Cursiva" con "Cursiva revisada" y reemplace "Fuente de párrafo predeterminada" por "Revisada". De esta forma, cuando utilizo la macro complementaria para "deshacer" la acción de esta macro, los estilos de caracteres originales (negrita, cursiva, fuente de párrafo por defecto) pueden ser reemplazados.
SOLUCIONADO
Aquí está la solución a la que finalmente llegué:
Sub applyNewRevisedText
Dim r As Range '' Create a new Range object
Set r = Selection.Range '' Assign the current selection to the Range
Dim rng As Range
For Each rng In r.Words
Set rngStyle = rng.Style
Select Case rngStyle
Case "Bold"
rng.Style = ActiveDocument.Styles("New/Revised Text Bold")
Case "Italic"
rng.Style = ActiveDocument.Styles("New/Revised Text Emphasis")
Case Else
rng.Style = ActiveDocument.Styles("New/Revised Text")
End Select
Next rng
End Sub
Para responder a tu pregunta directa
Mi pregunta es : ¿cómo puedo superar este error / limitación y aplicar el estilo de personaje SÓLO dentro de la selección / rango?
¿Esto no cumple con la necesidad ?:
Sub restyleSelection()
Selection.Style = ActiveDocument.Styles("Emphasis")
End Sub
EDITAR:
De acuerdo, basado en tu comentario, ¿qué tal algo así como:
Dim rng As Range
For Each rng In Selection.Words
If rng.Bold ''do something
Next rng
.Words dividirá cada palabra del rango en una colección de rangos. Luego puede realizar un estilo en cada palabra individual en función de su estilo actual.
Tuve un problema ligeramente diferente y lo resolví sin recurrir a un bucle. El código funciona NO para el texto que está formateado directamente, pero sí para el texto formateado con estilos de caracteres.
Considere una parte del texto que se está seleccionando, ya sea que incluya o no cadenas a las que ya se le haya asignado algún estilo de carácter.
Si dentro del rango seleccionado aún no se ha asignado un estilo de carácter, después de la búsqueda, el inicio de la selección no será el mismo. Sin embargo, si se ha asignado al menos un estilo de carácter, el inicio de la selección será el mismo que antes de la búsqueda. Ahora puedes tratar esos dos casos por separado. En ambos casos, todos los caracteres de la selección a los que no se les asignó ningún estilo previamente se vincularán a "myStyle".
Vst_Style = "myStyle"
ActiveDocument.Bookmarks.Add Name:="Range"
V_BMstart = Selection.Range.Start
Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Default Paragraph Font")
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles(Vst_Style)
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
End With
Selection.Find.Execute
If Selection.Range.Start <> V_BMstart Then
Selection.GoTo what:=wdGoToBookmark, Name:="Range"
Selection.Style = Vst_Style
Else
Selection.GoTo what:=wdGoToBookmark, Name:="Range"
Selection.Find.Execute Replace:=wdReplaceAll
End If