visual variable valor utilizar una seleccionar reemplazar rango para macro con codigos celdas celda buscar asignar vba ms-word word-vba

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