jueves, 11 de octubre de 2018

VBA: Convertir textos a mayúsculas

Estudiaremos en esta ocasión la forma de convertir en mayúsculas los textos de un rango...
Se trata de dar respuesta a la cuestión planteada por un usuario del blog:
[...] Tengo una duda, cómo se podría hacer para que cuando se copie un rango, por ejemplo 5 celdas con letras en minúsculas, y se pegue en la hoja1, todas las celdas pegadas se transformen en mayúsculas. La alternativa que nos presentas aplica solo si se pega una celda o se escribe en una sola celda. [...]


Partiremos del siguiente rango B2:D6 con textos y números.

VBA: Convertir textos a mayúsculas



Veremos algunas alternativas...
Insertamos el siguiente procedimiento 'Sub' en un módulo estándar:

Sub ConvertirMayusculas()
'a elegir una manera...

'1-forma clásica
'recorremos celda a celda la selección
For Each celda In Selection
    ' y convertimos con la función UCASE todo en mayúscula
    celda.Value = UCase(celda.Value)
Next celda

'2-forma óptima (recomendada)
Dim strSel As String
strSel = Selection.Address
Selection = Evaluate("INDEX(UPPER(" & strSel & "),,)")

'3-forma alternativa sobre rango estático
[B2:D6] = [INDEX(UPPER(B2:D6),,)]
End Sub



OJO!!!, estos métodos convierten todo a valores... por lo que las fórmulas 'desaparecen, convertidas a valores!!!

Para evitar este contratiempo nos obligaremos a emplear el modo bucle (forma clásica), donde con la propiedad .HasFormula discriminaremos las celdas con fórmulas.
Puedes ver un ejemplo similar aquí.


La primera forma emplea la función VBA llamada UCASE que procesa los textos y los convierte en mayúsculas...
Su contraria es LCASE que transforma en minúscula los textos.
El procedimiento se realiza celda a celda...

La segunda y tercera forma (en el fondo es la misma) emplea funciones de la hoja de cálculo:
función INDICE y función MAYUSC para transformar cada celda del rango indicado en la función.
En primer lugar UPPER - MAYUSC convierte en mayúscula los textos, y luego INDEX - INDICE devuelve cada valor a su celda...


Como punto interesante la manera de referirnos a los rangos en el método 3 expuesto
[B2:D6] = [INDEX(UPPER(B2:D6),,)]

que emplea una notación de VBA algo olvidada... con el uso de los corchetes (square brackets).
Estos corchetes en general representan o replican el uso de la función EVALUATE.

No hay comentarios:

Publicar un comentario