2009-07-03 11 views
8

Tengo una rutina que examina miles de registros en busca de discrepancias. Esto puede tardar más de 5 minutos en completarse y, aunque proporciono una barra de progreso y un recuento de tiempo transcurrido, no estoy seguro de querer alentar a la gente a presionar ctrl-break para que salga del informe si tarda más de lo esperado.¿Cómo se permite a los usuarios salir de las tareas de VBA de larga ejecución?

Un botón en la barra de progreso no funcionará ya que el formulario no es modal, entonces ¿hay alguna forma ordenada de permitir que los usuarios abandonen en esta situación?

Respuesta

11

Necesita DoEvents y una variable cuyo alcance es mayor que el alcance de lo que está ejecutando. Es decir, si solo se trata de un procedimiento, necesita una variable de nivel de módulo. Si es más de un módulo, necesita una variable global. Vea aquí

Stopwatch at DDoE

Normalmente, el motor VB atará el procesador hasta que se hace. Con DoEvents, sin embargo, VB permite que el procesador trabaje en lo que está al lado de la cola, luego regresa a VB.

+0

¡Excelente respuesta! ¡No sabía que podrías hacer esto! – mandroid

+0

Brillante. Gracias Dick. – Lunatik

+0

+1 buena respuesta. Disfruta la insignia :) – brettdj

0

No creo que haya una manera de hacerlo como si quisiera que funcionara. VBA es un lenguaje de scripting así que cuando comiences tu procedimiento, se ejecutará hasta que esté listo. Si tuviera otro botón en alguna parte que incluso le permitiera hacer clic mientras se ejecutaba el procedimiento original, no estoy seguro de cómo haría referencia a ese procedimiento y lo detendría.

Puede hacer algo como preguntar al usuario si quiere continuar, pero eso lo haría funcionar aún más.

También podría hacer que su procedimiento verifique una condición fuera de Excel y siga funcionando mientras sea cierto. Algo fácil podría ser comprobar si un determinado archivo de texto está en una carpeta. Si desea que el procedimiento se detenga, abra la carpeta y mueva el archivo. En la próxima iteración de su ciclo, no vería el archivo y dejaría de ejecutarse. Cludgy, ineficiente y no elegante, pero funcionaría. También podría hacer que marque una celda, una casilla de verificación, un botón de radio, básicamente cualquier control en otra hoja de Excel que se ejecute en otra instancia de Excel. De nuevo, acribillado.

CTRL + Break funciona. Acéptalo y sigue adelante. Un buen truco acerca de eso, sin embargo, es que si protege con contraseña su código y presionan CTRL + Break, la opción de depuración no estará disponible y solo recibirán Continuar o Terminar.

Si se trata de un código que se ejecuta con frecuencia, ¿ha considerado escribir algo que lo ejecute en momentos en que un humano no está usando la computadora? Solía ​​ejecutar macros de raspado de pantalla telnet que llevaban horas revisar nuestros widgets, pero siempre los hacía funcionar en una computadora separada o cuando no estaba allí (noches/fines de semana).

Cuestiones relacionadas