VBA DoEvents

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on marzo 4, 2022

Este tutorial discutirá cómo usar el comando DoEvents en VBA.

La función VBA DoEvents pausa temporalmente una macro en ejecución, dando a Excel la oportunidad de procesar las pulsaciones de teclas, los clics del ratón y otros mensajes del sistema operativo.

En las macros que se ejecutan durante mucho tiempo, puede parecer que Excel se cuelga y no responde, y la macro puede ser imposible de interrumpir. Si se incluye DoEvents en el código, los usuarios pueden estar seguros de que la macro sigue en marcha y pueden interrumpir la ejecución si es necesario.

Ejemplo de DoEvents en VBA

Considere el siguiente código:

Public Sub Test()
    Dim i As Long
 
    For i = 1 To 20000
        Range("A1").Value = i
    Next i
 
End Sub

Cuando pruebes este código, notarás que no se puede interactuar con la ventana de Excel. Sin embargo, como no es muy exigente con el procesador, la macro puede ser interrumpida pulsando ESC o CTRL+BREAK.

Si se realizaran muchas funciones complejas y exigentes dentro de este bucle, Excel tardaría más tiempo en registrar un evento de pulsación de tecla, hasta varios minutos o posiblemente nada, especialmente si el ordenador está ejecutando otros programas al mismo tiempo.

Ahora añada una sola línea con DoEvents debajo de la asignación de Range:

Range("A1").Value = i
DoEvents

Si ejecuta este código de nuevo, verá que Excel ahora responde – puede ser enfocado y traído al primer plano. DoEvents es llamado cada vez a través del bucle, lo que asegura que la macro siempre está cediendo la ejecución para que Excel pueda procesar cualquier mensaje que se le envíe. Debido a que esta macro se ejecuta rápidamente, casi parece que se está ejecutando en segundo plano (aunque no es así) – más operaciones dentro del bucle expondrían rápidamente esa ilusión.

Peligros de DoEvents

Sin embargo, echa un segundo vistazo. Más que simplemente permitir que Excel se enfoque, puedes hacer clic dentro de las celdas e incluso cambiar de pestaña mientras la macro se está ejecutando (pruébalo – verás un comportamiento divertido). Esto muestra uno de los peligros de los DoEvents – puede ser la causa de consecuencias no deseadas si su macro no está codificada cuidadosamente.

Otro peligro es que los DoEvents pueden servir como una ventana para que otras macros se ejecuten dentro de ellos. Pruebe esto: coloque un CommandButton de ActiveX en la hoja de trabajo, haga doble clic en él, y añada el siguiente código dentro del evento CommandButton1_Click():

 Dim c As Range
 
    For Each c In Range("B3:E8")
 
        c.Value = c.Value + 1
 
    Next c

Desactive el modo de diseño en Excel y ejecute la macro Test() que añadió anteriormente. Mientras se ejecuta la macro Test, puede hacer clic en el botón CommandButton de la hoja de cálculo, y su macro asociada se ejecutará tan pronto como DoEvents dé una pausa a la macro Test().

El peligro aquí es que la macro CommandButton altere los datos en los que estaba trabajando la macro Test(), o que active la macro Test() de nuevo. Usted puede terminar con algunos resultados extremadamente desordenados si no tiene cuidado.

Finalmente, debe tener en cuenta que DoEvents hará que su macro sufra un impacto en el rendimiento cuando sea llamada. Dentro de un bucle, este impacto se acumulará rápidamente a menos que limite la frecuencia con la que se llama a DoEvents. Refiriéndose a nuestro ejemplo de Test(), pruebe esto:

If i Mod 1000 = 0 Then DoEvents

Esto reduce visiblemente la capacidad de respuesta de Excel, pero el impacto en el rendimiento será menor.

Cuándo usar DoEvents

A pesar de estos peligros, DoEvents es una función útil que ayuda a probar y depurar. Considere añadir DoEvents a los bucles de larga duración.

Otra razón para incluir DoEvents es permitir la retroalimentación del usuario. Por ejemplo, una macro podría actualizar las etiquetas de un Formulario con indicadores de progreso. Sin DoEvents, Excel puede no recibir los mensajes para repintar el UserForm, dando al usuario la impresión de que la macro ha dejado de funcionar – especialmente si cambia a otro programa y luego intenta volver a Excel. Sin embargo, con DoEvents, el UserForm seguirá siendo repintado, y las actualizaciones del progreso de la macro seguirán apareciendo.

En su mayor parte, DoEvents no es algo que quiera incluir mucho en su código, y a menudo puede ser omitido. Sin embargo, si la capacidad de respuesta es algo que su macro necesita, ¡no la descarte!

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro - A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users! vba save as


Learn More!
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples