VBA DoEvents
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!Learn More!