2014-11-06

Desactivar actualización de pantalla en VBA

Title En Excel mientras ejecutamos una macro la pantalla se actualiza generando a veces un parpadeo. Para evitarlo y acelerar la ejecución del código, desactivamos la propiedad Application.ScreenUpdating antes del mismo y la volvemos a activar al finalizar.

Solución

Sub Macro()
Application.ScreenUpdating = False
 ' Nuestro código
Application.ScreenUpdating = True
End Sub

Comparativa

He modificado el código propuesto por Microsoft aquí pues antes del segundo bucle es necesario mostrar todas las columnas ocultadas tras el primero, o el código no tendría nada que hacer.

Sub Comparativa()
Dim stopTime As Single, startTime As Single
Dim elapsedtime(2) As Single
Application.ScreenUpdating = True
For i = 1 To 2
     ActiveSheet.Cells.EntireColumn.Hidden = False
     If i = 2 Then Application.ScreenUpdating = False
     startTime = Time
     Worksheets(1).Activate
     For Each c In ActiveSheet.Columns
     If c.Column Mod 2 = 0 Then
     c.Hidden = True
     End If
     Next c
     stopTime = Time
     elapsedtime(i) = (stopTime - startTime) * 24 * 60 * 60
Next i
Application.ScreenUpdating = True
MsgBox "Segundos, ScreenUpdating activado: " & elapsedtime(1) & _
 Chr(13) & _
 "Segundos, ScreenUpdating desactivado: " & elapsedtime(2)
End Sub

Ejemplos por separado

Sub Activado()
Dim t As Single
t = Timer
ActiveSheet.Cells.EntireColumn.Hidden = False
Application.ScreenUpdating = True
Worksheets(1).Activate
 For Each c In ActiveSheet.Columns
 If c.Column Mod 2 = 0 Then
 c.Hidden = True
 End If
 Next c
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub
Sub Desactivado()
Dim t As Single
t = Timer
ActiveSheet.Cells.EntireColumn.Hidden = False
Application.ScreenUpdating = False
 Worksheets(1).Activate
 For Each c In ActiveSheet.Columns
 If c.Column Mod 2 = 0 Then
 c.Hidden = True
 End If
 Next c
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub

1 comentario:

Nube de datos