Convierta un rango completo a mayúsculas sin recorrer todas las celdas
En este momento estoy usando el siguiente código para convertir una lista de símbolos de teletipo de letras minúsculas a mayúsculas:
Dim Tickers As String
Dim n As Integer
For n = 2 To Last
Tickers = UCase(W.Cells(n, 1).Value)
W.Cells(n, 1).Value = Tickers
Next n
¿Existe algún método que pueda utilizar para convertir todo el rango en una línea? algo como:
Range("A1:A20").convertouppercasesomehow
¿Existe algún método que pueda utilizar para convertir todo el rango en una línea?
Sí, puedes convertir sin bucle. Prueba esto
Sub Sample()
[A1:A20] = [INDEX(UPPER(A1:A20),)]
End Sub
Alternativamente, usando un rango variable, intente esto:
Sub Sample()
Dim rng As Range
Set rng = Range("A1:A20")
rng = Evaluate("index(upper(" & rng.Address & "),)")
End Sub
Según tu ejemplo
W.Range("A1:A20") = [index(upper(A1:A20),)]
Explicación
Hay dos partes para[A1:A20] = [INDEX(UPPER(A1:A20),)]
PARTE 1
Como se muestra arriba, [A1:A20]
no es más que una breve forma de escribir.Range("A1:A20")
PARTE 2
[INDEX(UPPER(A1:A20),)]
Index
y Upper
son funciones de hoja de trabajo. Entonces puedes usarlo Application.Worksheetfunction.Index()
, pero como no tenemos un equivalente de UPPER
like Application.Worksheetfunction.UPPER()
, solo podemos escribirlo como[cell] = [UPPER(cell)]
Ahora con esa línea le estamos indicando VBA
que devuelva una matriz y aquí es donde INDEX
entra en juego. ( Como sabemos, hay dos formas de la INDEX
función: la forma de matriz y la forma de referencia ). Al no especificar una fila o columna de la matriz, simplemente le hacemos saber a Excel que queremos la matriz completa. ( También se menciona en la ayuda de VBA ). Básicamente, lo que estamos haciendo es convertir cada celda [A1:A20]
en mayúsculas.
No puedes hacerlo en una línea como esa, pero puedes hacerlo para un rango determinado como:
Sub Test()
Dim Rng As Range
Dim c As Range
Set Rng = ActiveSheet.Range("A1:A20")
For Each c In Rng
c.Value = UCase(c.Value)
Next c
End Sub
Lo cual es bastante simple e intuitivo.