Domanda

Qual è il modo migliore per eseguire un programma esterno da Excel. Potrebbe durare diversi minuti. Qual è la migliore pratica su come farlo. Idealmente,

  1. Una finestra di dialogo modello che consente all'utente di sapere che il processo è in esecuzione.
  2. Se l'eseguibile non riesce, l'utente dovrebbe ricevere una notifica.
  3. È necessario applicare un timeout.
  4. Nella finestra di dialogo dovrebbe essere presente un pulsante Annulla.

Ma le best practice sono benvenute. Sono interessato a soluzioni con la chiamata a .dll o .exe. Preferibilmente qualcosa che funziona con Excel '03 o precedente, ma mi piacerebbe sentire un motivo per passare anche a una versione successiva.

È stato utile?

Soluzione

Dovresti dare un'occhiata a questi due articoli di Microsoft KB

Come avviare un'applicazione Win32 da Visual Basic e

Come utilizzare un'applicazione a 32 bit per determinare quando termina un processo con shell

Entrambi forniscono rapidamente il framework per avviare un processo e quindi controllarne il completamento. Ciascuno degli articoli della KB ha alcuni riferimenti aggiuntivi che potrebbero essere pertinenti.

Quest'ultimo articolo della knowledge base presuppone che si desideri attendere un tempo infinito per il completamento del processo della shell.

Puoi modificare ret & amp; = Chiamata della funzione WaitForSingleObject (proc.hProcess, INFINITE) per tornare dopo un certo lasso di tempo in millisecondi: sostituire INFINITE con un valore positivo che rappresenta i millisecondi e avvolgere il tutto in un ciclo Do While. Il valore restituito indica se il processo è stato completato o il timer è scaduto. Il valore restituito sarà zero se il processo è terminato.

Se il valore restituito è diverso da zero, il processo è ancora in esecuzione, ma il controllo viene restituito all'applicazione. Durante questo periodo, mentre hai il controllo positivo della tua applicazione, puoi determinare se aggiornare una sorta di stato dell'interfaccia utente, verificare la cancellazione, ecc. Oppure puoi ripetere il ciclo e attendere ancora.

Ci sono anche opzioni aggiuntive se il programma a cui stai bombardando è qualcosa che hai scritto. È possibile agganciarsi a una delle sue finestre e fare in modo che il programma pubblichi messaggi a cui è possibile allegare e utilizzare come feedback sullo stato. Questo è probabilmente meglio lasciarlo per un oggetto separato se devi considerarlo.

È possibile utilizzare la struttura del processo per ottenere un valore di ritorno dal processo chiamato. È necessario che il processo restituisca un valore affinché ciò sia utile.

Il mio approccio generale a questo tipo di necessità è:

  1. fornisce all'utente una finestra di dialogo di stato non modale all'inizio del processo con un pulsante Annulla, che quando si fa clic imposterà un flag da controllare in seguito. Fornire all'utente qualsiasi stato è molto probabilmente impossibile, quindi dare loro un tempo trascorso o una di quelle GIF animate potrebbe essere utile nella gestione delle aspettative.
  2. Avvia il processo
  3. Attendi il completamento del processo, consentendo il controllo della cancellazione ogni 500 ms
  4. Se il processo è completo, chiudere la finestra di dialogo e continuare.
  5. Se il processo non è completo, verifica se l'utente ha premuto Annulla e in tal caso invia un messaggio di chiusura alla finestra del processo. Questo potrebbe non funzionare e potrebbe essere necessario interrompere il processo - attenzione a farlo. La soluzione migliore potrebbe essere quella di abbandonare il processo se non si chiude correttamente. Puoi anche verificare un timeout a questo punto e provare a seguire lo stesso percorso come se l'utente premesse annulla.

Spero che questo aiuti, Bill.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top