2010-05-27 13 views
6

lo que es el punto de hacer esto:¿Cuánto cuesta establecer estas propiedades aceleran sus macro de Excel: Application.ScreenUpdating, Application.DisplayAlerts

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

es lo que realmente ahorrar tanto tiempo?

+3

DisplayAlerts no está relacionada con la velocidad de ejecución del programa, se acaba de suprimir las advertencias de Excel por defecto (por ejemplo, el mensaje para confirmar las eliminaciones de hoja de cálculo), que puede o puede no querer suprimir. (Supongo que técnicamente lo hará funcionar más rápido ya que no habrá diálogos, pero ya sabes a qué me refiero). – goggin13

Respuesta

5

De acuerdo.

He encontrado que cuando se apaga ScreenUpdating, Calculation, lo mejor es pensar en cómo hacer tanto trabajo (escribe, lee, eventos, ...) como sea posible para el menor número de llamadas ScreenUpdating a cambio. Esto acelerará las operaciones y al mismo tiempo brindará al usuario una experiencia mejor y más tolerable. Digamos, por ejemplo, que desea escribir algunos datos en una hoja lo más rápido posible.Usted puede hacer esto:

For Each row In rowDic.Keys() 
    ' turn off updating 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
    ' turn on updating 
Next 

o para ir más rápido se puede hacer esto:

' turn off updating 
For Each row In rowDic.Keys() 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
Next 
' turn on updating 

Del mismo modo, al escribir los datos, es más rápida de escribir trozos más grandes, menos veces. por lo que la cantidad ideal de escrituras, si las hay, es una. Puede hacerlo tratando un Range como 2D array[rows,cols]. He encontrado las siguientes condiciones para ser eficaz:

' turn off updates 

' Organise data in ram so that it fits the range for which it is meant 
Dim two_d_arr (rows,cols) 
loadDataFromSource two_d_arr 

Dim destinationRange as Range 
destinationRange = Sheets(someSheet).Range(someRange).Value = two_d_arr 

Redim two_d_arr(0,0) ' !!! RELEASE MEMORY 
' turn on updates 

Aquí, no hay bucles, esto optimiza el tiempo de cada tarea individual en la CPU que se traduce en tiempos de procesamiento más rápido y, a su vez parece hacer el trabajo de Excel normalmente (no accidente)

HTH,

F

4

Absolutamente. Hace varios años tuve una macro de larga ejecución que tardó casi un minuto en ejecutarse. Configuré ScreenUpdating en falso y finalizó en menos de 5 segundos.

Solo asegúrese de restablecer ScreenUpdating a verdadero cuando termine de ejecutar la macro.

+5

Además, no olvide volver a configurar ScreenUpdating como el primer paso en cualquier código de gestión de errores que tenga –

13

Depende de cuánto está actualizando en la pantalla como parte de su código (es decir, el número de celdas actualizado) y cuántas hojas hay, cuántas hojas/celdas se refieren a la hoja que su código está actualizando y cuántas fórmulas están presentes en todo el libro de trabajo.

Cada vez que cambia algo de la hoja, Excel vuelve a calcular todas las fórmulas. Por lo tanto, si su código no está actualizando demasiadas hojas/celdas, pero su libro de trabajo tiene muchas fórmulas, es posible que apagar la actualización de la pantalla no lo ayude en absoluto.

Una cosa más a tener en cuenta para el rendimiento es la propiedad de cálculo, establezca esto en xlCalculationManual para desactivar las recamas automáticas y gírela a xlCalculationAutomatic al final.

Application.Calculation = xlCalculationManual 

Una cosa más que conside es Eventos, si uno o más de esas hojas tienen Worksheet_Chnage o Worksheet_Calculate controladores de eventos cada cambio de que el código está haciendo dará lugar a ellos y su código tienen que esperar hasta que regresen. Así que apágalo durante tu código.

Application.EnableEvents = False 

En la mayor parte de mi código, utilice este susally

On Error GoTo lblError 
Dim bEvents As Boolean, iCalc As Integer, bScrnUpd As Boolean 
bEvents = Application.EnableEvents 
iCalc = Application.Calculation 
bScrnUpd = Application.ScreenUpdating 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 

'-----------------------My code 

Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Exit Sub 

'reset them even if you are exiting due to error 
lblError: 
Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Debug.print Err.Description 
+1

Respuesta perfecta (esta debería ser la respuesta aceptada). Gran ejemplo de "la escuela de la explicación más completa": los ejemplos y las repeticiones muestran cómo minimizar el impacto del código de uno para el usuario. –

5

La mejora de ScreenUpdating depende en gran medida de la macro está escrito. Será especialmente útil con esas horribles macros hechas por la grabadora, llenas de "seleccionar" y "activar" innecesarios.

3

yo no usaría los de 'velocidad' pero por 'función'

Cuando no desea que el usuario vea la actualización de la pantalla:

Application.ScreenUpdating = False 

Cuando no desea al usuario ver todos los mensajes superfluos desde la aplicación:

Application.DisplayAlerts = False 

Especialmente este último porque nadie quiere ser muerto a golpes con los mensajes que le pregunta si 'realmente' quiere actualizar, anexar o eliminar r ecords. Prefiero proteger al usuario de tales cosas.

Cuestiones relacionadas