Si desea ver un ejemplo bastante drástico de por qué ScreenUpdating
es importante, ejecute el siguiente código. ¡Se tarda aproximadamente 45 veces más en Excel 2011 para que pueda ejecutar este intercambio sin ScreenUpdating = false
! Esta es una gran diferencia en el tiempo.
Sub testScreenUpdating()
Dim i As Integer
Dim numbSwitches As Integer
Dim results As String
'swap between sheets this number of times
numbSwitches = 1000
'keep track of time
Dim startTime As Double
startTime = Time
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
'get results
results = "Screen Updating not disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
startTime = Time
'scenario 2 - screenupdating disabled
Application.ScreenUpdating = False
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
Application.ScreenUpdating = True
'get results for part two
results = results & vbCrLf & "Screen Updating IS disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
'show results
MsgBox results
End Sub
También, ya que estamos en el tema de las maneras de aumentar la eficiencia, otro punto clave es que Select
, Selection
y Activate
son rara vez (o nunca) es necesario. Cuando graba macros, siempre las usará, pero hay muy pocas situaciones en las que necesite utilizarlas en el código. Del mismo modo, cualquier cosa con Active
en el título (como ActiveCell
) normalmente es una indicación de que tendrá un código más lento porque presumiblemente está seleccionando celdas.
Casi siempre puede consultar celdas/hojas de trabajo específicamente y evitar seleccionar.Por ejemplo:
msgbox (Worksheets(1).Range("A1").value)
funcionará independientemente de si se encuentra actualmente en la primera hoja de cálculo. Un nuevo error común de VBA es hacer algo más como:
Worksheets(1).Select
msgbox (Range("A1").value)
que es un paso innecesario.
Esto agrega un tiempo significativo a los tiempos de ejecución del código.
Dependiendo de lo que esté haciendo su código, establecer 'Application.Calculation' en" manual "a menudo también le dará un impulso de gran velocidad. Típicamente harías ambas cosas para una macro de larga ejecución. No olvide restablecer el cálculo, es una configuración persistente. –
Aslo, con la ejecución de 'Screenupdating' desactivada, puede informar al usuario del progreso mediante' Application.Statusbar = '. Luego configure 'False' para regresarlo a la normalidad. Algunas personas necesitan ver el progreso; de lo contrario, creen que su computadora se ha congelado y obligan a cerrar todo. – Rory
También he leído que el formato de datos predeterminado en Excel es en realidad Moneda, por lo que es mejor usar Divisa como valor de datos en lugar de Doble cuando sea posible para evitar la conversión de datos. –