VBA DoEvents

Tabla de contenido

El VBA DoEvents La función detiene temporalmente una macro en ejecución, lo que le da a Excel la oportunidad de procesar las pulsaciones de teclas, los clics del ratón y otros mensajes del sistema operativo.

En macros de ejecución prolongada, puede parecer que Excel se bloquea y deja de responder, y es posible que sea imposible interrumpir la macro. Si DoEvents está incluido en su código, los usuarios pueden estar seguros de que la macro aún se está ejecutando y aún puede interrumpir la ejecución si es necesario.

Ejemplo de VBA DoEvents

Considere el siguiente código:

1234567891011 Subprueba pública ()Dim i tan largoPara i = 1 a 20000Rango ("A1"). Valor = iSiguiente yoEnd Sub

Cuando pruebe este código, notará que no se puede interactuar con la ventana de Excel. Sin embargo, debido a que no es muy exigente para el procesador, la macro aún se puede interrumpir presionando ESC o CTRL + BREAK.

Sin embargo, si se estuvieran realizando muchas funciones complejas y exigentes dentro de este ciclo, Excel tardaría más en registrar un evento de pulsación de tecla, hasta varios minutos o posiblemente no en absoluto, especialmente si la computadora está ejecutando otros programas al mismo tiempo.

Ahora agregue una sola línea con DoEvents debajo de la asignación de Rango:

123 Rango ("A1"). Valor = iDoEvents

Si vuelve a ejecutar este código, verá que Excel ahora responde: se puede enfocar y poner en primer plano. DoEvents se llama cada vez a través del bucle, lo que garantiza que la macro siempre se ejecute 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 ciclo expondrían rápidamente esa ilusión.

DoEvents Peligros

Sin embargo, échale un segundo vistazo. Más que simplemente permitir que Excel esté enfocado, puede hacer clic dentro de las celdas e incluso cambiar de pestaña mientras se ejecuta la macro (pruébelo, verá un comportamiento divertido). Esto muestra uno de los peligros de DoEvents: puede ser la causa de consecuencias no deseadas si su macro no se codifica con cuidado.

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

1234567 Dim c como rangoPara cada c en rango ("B3: E8")c.Value = c.Value + 1Siguiente c

Desactive el Modo de diseño en Excel, luego ejecute la macro Prueba () que agregó anteriormente. Mientras se ejecuta la macro de prueba, puede hacer clic en el botón de comando en la hoja de trabajo, y su macro asociada se ejecutará tan pronto como DoEvents le dé un descanso a la macro de prueba ().

El peligro aquí es si la macro CommandButton alteró los datos en los que estaba trabajando la macro Test () o activó la macro Test () nuevamente. 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 se llame. 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 (), intente esto:

1 Si i Mod 1000 = 0, entonces DoEvents

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

Cuándo usar DoEvents

A pesar de estos peligros, DoEvents es una función útil que ayuda en las pruebas y la depuración. Considere agregar DoEvents a bucles de larga duración.

Otra razón para incluir DoEvents es permitir la retroalimentación de los usuarios. Por ejemplo, una macro puede actualizar las etiquetas de un UserForm con indicadores de progreso. Sin DoEvents, es posible que Excel no reciba los mensajes para volver a pintar 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á pintándose y las actualizaciones del progreso de la macro seguirán apareciendo.

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

Va a ayudar al desarrollo del sitio, compartir la página con sus amigos

wave wave wave wave wave