Convierta un rango completo a mayúsculas sin recorrer todas las celdas

Resuelto DBWeinstein asked hace 11 años • 5 respuestas

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
DBWeinstein avatar Nov 15 '13 01:11 DBWeinstein
Aceptado

¿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),)]

Indexy Upperson funciones de hoja de trabajo. Entonces puedes usarlo Application.Worksheetfunction.Index(), pero como no tenemos un equivalente de UPPERlike Application.Worksheetfunction.UPPER(), solo podemos escribirlo como[cell] = [UPPER(cell)]

Ahora con esa línea le estamos indicando VBAque devuelva una matriz y aquí es donde INDEXentra en juego. ( Como sabemos, hay dos formas de la INDEXfunció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.

Siddharth Rout avatar Nov 14 '2013 19:11 Siddharth Rout

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.

Netloh avatar Nov 14 '2013 18:11 Netloh