2010-10-04 19 views
5

En el pasado, he utilizado una matriz de variantes para llenar un rango de varias celdas de Excel.Establecer formato de rango de Excel con matriz

Me pregunto, ¿hay alguna manera de hacer lo mismo con el formato de celda? Prefiero no ir celda por celda, y sería bueno minimizar el número de llamadas para obtener un rango de Excel ...

+0

Estoy bastante seguro de que puede aplicar formato a un rango de varias celdas y no tener que hacerlo celda por celda, pero no lo hago hacer un montón de formateo. Probablemente alguien que lo haga dará una respuesta real ... – jtolle

+0

Wow, he entendido mal la pregunta. Sin embargo, la respuesta de Lance Roberts parece correcta. – jtolle

Respuesta

3

No, no puede hacer cada celda por separado, aunque puede asignar de forma masiva un formato a un rango completo.

La propiedad de un rango para asignar es .NumberFormat. Si crea una matriz variante de cadenas para asignarlas como formato, entonces asigne el rango, solo se aplica el primer elemento (y se aplica a todas las celdas del rango).

Así que lo mejor que puede hacer es loop:

Dim r As Range 
Dim v(1 To 3) As Variant 
Dim i As Integer 

Set r = Range("A1:A3") 
v(1) = "hh:mm:ss" 
v(2) = "General" 
v(3) = "$#,##0.00_);[Red]($#,##0.00)" 

For i = 1 to 3 
    r(i).NumberFormat = v(i) 
Next i 
+0

Gracias - pensé que lo mejor que podía hacer era bucle. Sería muy bueno si MS configura los formatos como lo hacen los valores de celda en términos de matrices ... –

4

Yo sobre todo hacer lo que sugiere la lanza. Sin embargo, hay algunos casos en los que haré una hoja de trabajo oculta y separada con los formatos que quiero configurar. Luego voy a

wshHidden.Range("A1:D100").Copy 
wshReport.Range("A1:D100").PasteSpecial xlPasteFormats 

Eso lo soluciona de una sola vez. Pero tienes la sobrecarga de la hoja oculta.

0

Espero que pueda presumir que lo está haciendo por motivos de rendimiento. Como se explicó anteriormente, no es posible de la misma manera que con el contenido de la celda.

Sin embargo, si el formateo de las celdas es a menudo el mismo que la última vez que lo formateó, es mucho más rápido verificar primero si el formato necesita cambiar, y solo luego cambiarlo.

Aquí hay una función que puede hacerlo. En las pruebas (Excel 2003), esto se ejecuta 8x-10x más rápido que siempre establecer el formato, y eso es con la actualización de la pantalla desactivada.

Sub SetProperty(ByRef obj As Object, propname, newvalue) 
    If CallByName(obj, propname, VbGet) <> newvalue Then 
     Call CallByName(obj, propname, VbLet, newvalue) 
    End If 
End Sub 

llamada así:

Call SetProperty(Cells(1,1).Font, "ColorIndex", 27) 
Call SetProperty(Cells(1,1).Borders, "Weight", xlMedium) 
etc 
Cuestiones relacionadas