martes, 2 de junio de 2020

VBA: Evitar flash del cursor

En ocasiones, al crear nuestros procedimientos recurrentes (ver ejemplo) se genera un efecto muy feo en nuestra hoja de cálculo, mostrando el cursor con el efecto de flash o actualización:

VBA: Evitar flash del cursor



Por ejemplo, el siguiente procedimiento:

Sub reloj()
Application.ScreenUpdating = False
Range("A40").Formula = "=NOW()"
Application.ScreenUpdating = True
Application.OnTime Now + TimeValue("00:00:01"), "reloj"
Application.ScreenUpdating = True
End Sub
''''''''''''''''''''''''''''''''''
Sub Auto_Open()
Call reloj
End Sub



Comprobamos como, a pesar de haber aplicado la típica interrupción del refresco de pantalla:
Application.ScreenUpdating = False

el indeseado efecto sigue apareciendo...

Una práctica solución pasa por forzar el cambio a un tipo de cursor en particular, por ejemplo, el clásico de la flecha.
Para ello emplearemos la propiedad
Application.Cursor
que establece el aspecto del puntero del ratón... Que nos ofrece las siguientes opciones:
xlDefault: Puntero predeterminado.
xlIBeam: Puntero en forma de I.
xlNorthwestArrow: Puntero de flecha orientada al noroeste.
xlWait: Puntero de reloj de arena.

Por ejemplo, para nuestro caso cambiaremos el puntero con:
Application.Cursor = xlNorthwestArrow


Tras aplicar un cambio de puntero, es recomendable invertir el cambio y volver al puntero predeterminado:
Application.Cursor = xlDefault


Por otra parte, aplicaremos la función DoEvents que permite la ejecución de nuestros procedimientos, de modo que el sistema operativo pueda procesar otros eventos.

Aplicando lo descrito anteriormente, nuestro procedimiento quedaría (ver filas 4 y 5):

Sub reloj()
Application.ScreenUpdating = False

Application.Cursor = xlNorthwestArrow
DoEvents

Range("A40").Formula = "=NOW()"
Application.ScreenUpdating = True
Application.OnTime Now + TimeValue("00:00:01"), "reloj"
Application.ScreenUpdating = True
End Sub
''''''''''''''''''''''''''''''''''
Sub Auto_Open()
Call reloj
End Sub



Al ejecutar la macro conseguimos que no se visualice el efecto de refresco... tal como pretendíamos.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.