Pausar macro hasta terminar ejecución de comando

[Windows] [Excel] [Macros]

Al momento de automatizar tareas con Excel suele pasar que se requiere ejecutar alguna tarea en medio del proceso de ejecución de la macro, por poner un ejemplo yo hice una que valida que exista un archivo en una carpeta específica, pero para que Excel “vea” el archivo debe haber un txt generado con un listado del directorio, luego abrir el archivo y posteriormente hacer la validación que revisa que el archivo exista.

En el ejemplo anterior, si no se tiene la forma de “pausar” la ejecución de la macro mientras se corre el comando dir, Excel se va a seguir ejecutando mientras o incluso antes de que se genere el archivo que va a contener la lista. Así que al final Excel no va a poder “ver” el archivo, ya que siguió corriendo la macro mientras se estaba generando el archivo con la información que se requería.

Excel

Una opción sería poner una pausa literal enseguida de la ejecución de la macro con el comando de abajo, pero la desventaja que se tiene es que si el comando se tarda más, se tendría el mismo problema y si se le pone más tiempo y tarda menos, es tiempo perdido de forma “gratuita” y no hay que olvidar que el tiempo es dinero.

Sleep 10000 'Esto pausa la ejecución 10 segundos

Otra opción válida sería ejecutar una alerta, ya que esta provocaría que todo Excel se congelara automáticamente y continuaría funcionando al darle en aceptar, pero aquí el problema es que sería un “click” extra, lo que no ayuda mucho a catalogar como automática a una “tarea automática”.

MsgBox "¿Ya terminó?, da click en aceptar para continuar"

Afortunadamente existe una manera muy sencilla de solucionar esto, simplemente se requiere crear un objeto y a ese objeto pasarle un par de parámetros (con uno bastaría, pero no está de más el segundo) que son específicamente waitOnReturn y windowStyle. El primero especifica si la macro tiene que esperar a que la ejecución dé una respuesta (en el caso de un comando de CMD sería al cerrar la misma ventana de CMD), y el segundo lo traduciriamos a “¿Dejo la ventana en primer plano o la minimizo?”

Dim corre As Object
    Set corre = VBA.CreateObject("WScript.Shell")
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1

Con ese código (que puede estar técnicamente en la cabecera de la macro) sólo faltaría generar el comando (yo acostumbro meterlo en una variable) y ejecutar el objeto corre de la siguiente forma:

comandoDir = "dir %windir%\fonts > %tmp%\fonts.txt"
corre.Run "cmd /c" & comandoDir, windowStyle, waitOnReturn

Con estos sencillos pasos habría una pausa al momento de ejecutar el comando y continuaría sin problemas en el momento que se cierra la ventana de comandos.

Quise documentar esto ya que, aunque no es muy complejo, sí resulta muy útil al momento de hablar de tareas automáticas. Espero que les sea de utilidad. Nos leemos pronto.

 
comments powered by Disqus