Pregunta

¿Cuál es la mejor manera de ejecutar un programa externo desde Excel? Puede durar varios minutos. ¿Cuál es la mejor práctica sobre cómo hacer esto? Idealmente,

  1. Un cuadro de diálogo modelo que le permite al usuario saber que el proceso se está ejecutando.
  2. Si el archivo ejecutable falla, el usuario debe recibir una notificación.
  3. Se debe aplicar un tiempo de espera.
  4. El botón de cancelación debe estar en el cuadro de diálogo.

Pero cualquier buena práctica es bienvenida. Me interesan las soluciones con llamar a un .dll o un .exe. Preferiblemente, algo que funcione con Excel '03 o anterior, pero me encantaría escuchar una razón para pasar a una versión posterior también.

¿Fue útil?

Solución

Deberías revisar estos dos artículos de Microsoft KB

Cómo iniciar una aplicación Win32 desde Visual Basic y

Cómo usar una aplicación de 32 bits para determinar cuándo finaliza un proceso de shell

Ambos le brindan rápidamente el marco para iniciar un proceso y luego verificar su finalización. Cada uno de los artículos de KB tiene algunas referencias adicionales que pueden ser relevantes.

El último artículo de la base de conocimiento supone que desea esperar un tiempo infinito para que finalice su proceso de shell.

Puedes modificar el ret & amp; = La función WaitForSingleObject (proc.hProcess, INFINITE) llama para regresar después de un tiempo finito en milisegundos. Reemplace INFINITE con un valor positivo que represente milisegundos y envuelva todo en un bucle Do While. El valor de retorno le indica si el proceso se completó o si se agotó el temporizador. El valor de retorno será cero si el proceso finalizó.

Si el valor de retorno es distinto de cero, el proceso aún se está ejecutando, pero el control se devuelve a su aplicación. Durante este tiempo, mientras tiene el control positivo de su aplicación, puede determinar si actualizará algún tipo de estado de la interfaz de usuario, verificará la cancelación, etc. O podrá volver a bucear y esperar un poco más.

Incluso hay opciones adicionales si el programa al que estás realizando el bombardeo es algo que escribiste. Puede conectarse a una de sus ventanas y hacer que el programa publique mensajes que puede adjuntar y usar como comentarios de estado. Probablemente es mejor dejar este tema para un elemento separado si necesita considerarlo.

Puede utilizar la estructura del proceso para obtener un valor de retorno del proceso llamado. Su proceso necesita devolver un valor para que esto sea útil.

Mi enfoque general para este tipo de necesidad es:

  1. brinde al usuario un cuadro de diálogo de estado no modal al inicio del proceso con un botón de cancelación, que al hacer clic establecerá una marca para verificarla más adelante. Probablemente sea imposible proporcionarle al usuario cualquier estado, por lo que concederle un tiempo transcurrido o uno de esos GIF animados podría ser útil para gestionar las expectativas.
  2. Comience el proceso
  3. Espere a que se complete el proceso, permitiendo el cheque de cancelación cada 500 ms
  4. Si el proceso se completa, cierre el cuadro de diálogo y continúe.
  5. Si el proceso no está completo, vea si el usuario presionó cancelar y, de ser así, envíe un mensaje de cierre a la ventana del proceso. Es posible que esto no funcione y que sea necesario finalizar el proceso; tenga cuidado si lo hace. Su mejor apuesta puede ser abandonar el proceso si no se cierra correctamente. También puede verificar un tiempo de espera en este punto e intentar tomar el mismo camino como si el usuario presionara cancelar.

Espero que esto ayude, Bill.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top