texto - solo mayusculas en textbox vba excel
La palabra VBA reemplaza el texto que aparece en la selección solo con mayúscula (2)
@PatentWookiee, creo que al principio estabas en el camino correcto con,
Selection.Range.Delete
Selection.Range.InsertAfter (UCase(txt))
El problema es que, una vez que eliminas el texto seleccionado, todo lo que coloques en su lugar asumirá el formato del primer carácter antes de tu eliminación. Para resolver este problema, deberás ir con:
Option Explicit
Sub ReplaceWithUppercase()
Selection.Text = UCase(Selection.Text)
End Sub
En lugar de reemplazar el texto real (y el formato junto con él) simplemente reemplazamos la caja de la cadena seleccionada, dejando así el formato completamente intacto. Si he leído bien tu pregunta, esto debería resolver completamente tu problema. Si no, asegúrese de avisarme, lo solucionaremos.
Mi objetivo es simple: quiero un atajo para reemplazar texto en una selección con mayúsculas, sin aplicar el estilo "AllCaps", por razones que no entraré aquí.
Lo he logrado utilizando Selection.Delete
y Selection.Insert
, pero eso no parece conservar los estilos de fuente no inherentes al estilo de párrafo.
Cuando intento usar VBA Selection.Find.Execute:=ReplaceAll
, está reemplazando todas las instancias en todo el documento. Soy consciente de que este debería ser el comportamiento de .wrap=wdFindContinue
, pero he establecido .wrap=wdFindStop
. Mi mejor suposición es que como mi .text
está configurado como una variable que llama al objeto Selection
, de alguna manera pierde la selección al establecer .text
(aunque visualmente esto no es aparente cuando paso por el código - la selección permanece resaltada), lo que resulta en .ReplaceAll
ejecutando para todo el documento. Si ingreso manualmente la cadena "buscar" ( .text
) para un caso particular, se ejecuta solo en la selección (¡incluso con la variable txt
llamada en el campo .Replacement.Text!), Pero obviamente eso no será práctico.
Aquí está mi código:
Option Explicit
Sub ReplaceWithUppercase()
Dim pasteAutoFormatSetting As Boolean
Dim txt As String
''Save current user selection of whether to adjust spacing automatically when pasting:
pasteAutoFormatSetting = Options.PasteAdjustWordSpacing
''Turn off auto spacing adjustment:
Options.PasteAdjustWordSpacing = False
txt = Selection.Range.text
With Selection.Font
.AllCaps = False
End With
''The next two lines work but do not seem to preserve built-in font styles
''already applied to the selected text, so I wanted to instead use find/replace:
''Selection.Range.Delete
''Selection.Range.InsertAfter (UCase(txt))
With Selection.Range.Find
.ClearFormatting
.Replacement.ClearFormatting
.text = txt
.Replacement.text = UCase(txt)
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
''Return to user preference for auto apacing adjustment:
Options.PasteAdjustWordSpacing = pasteAutoFormatSetting
End Sub
Trabajo rápido usando una matriz para el rango de selección - y la función StrConv
Sub ChangeRangeToUCase()
Const vbUpperCase = 1 '' strConv constant
Dim arrCells As Variant
Dim intRow As Integer
Dim intCol As Integer
'' Assign Range to an array
arrCells = Selection
For intRow = LBound(arrCells, 1) To UBound(arrCells, 1)
For intCol = LBound(arrCells, 2) To UBound(arrCells, 2)
arrCells(intRow, intCol) = StrConv(arrCells(intRow, intCol), vbUpperCase)
Next intCol
Next intRow
Selection = arrCells
End Sub