2009-07-03 18 views
8

Ho una routine che esamina migliaia di record alla ricerca di discrepanze. Questo può richiedere fino a 5 minuti per completare e anche se fornisco una barra di avanzamento e il conteggio del tempo trascorso, non sono sicuro di voler incoraggiare la gente che preme ctrl-break per uscire dal rapporto se impiega più tempo del previsto.Come consentire agli utenti di uscire dalle attività VBA con esecuzione prolungata?

Un pulsante nella barra di avanzamento non funzionerà in quanto il modulo è non modale, quindi esiste un modo pulito per consentire agli utenti di uscire in questa situazione?

risposta

11

È necessario DoEvents e una variabile il cui ambito è maggiore dell'ambito di ciò che si sta eseguendo. Cioè, se è solo una procedura, hai bisogno di una variabile a livello di modulo. Se è più di un modulo, hai bisogno di una variabile globale. Vedi qui

Stopwatch at DDoE

Normalmente, il motore VB legherà il processore finché non è finito. Con DoEvents, tuttavia, VB consente al processore di funzionare su qualsiasi cosa sia successiva nella coda, quindi tornare a VB.

+0

Ottima risposta! Non sapevo che potevi fare questo! – mandroid

+0

Brillante. Grazie, Dick. – Lunatik

+0

+1 bella risposta. Goditi il ​​distintivo :) – brettdj

0

Non credo che ci sia un modo per farlo come si vorrebbe che funzionasse. VBA è un linguaggio di scripting, quindi quando avvii la tua procedura, funzionerà finché non sarà terminato. Se avessi un altro pulsante da qualche parte che anche FATTO ti lascerebbe cliccarlo mentre la procedura originale era in esecuzione, non sono sicuro di come faresti riferimento a quella procedura e di fermarla.

Si potrebbe fare qualcosa come chiedere all'utente se vuole contine, ma che lo farebbe funzionare ancora più a lungo.

Inoltre, è possibile che la procedura controlli una condizione esterna a Excel e continui a essere eseguita finché è vera. Qualcosa di semplice potrebbe essere controllare se un determinato file di testo si trova in una cartella. Se si desidera interrompere la procedura, aprire la cartella e spostare il file. Nella prossima iterazione del ciclo, non vedrebbe il file e smetterà di funzionare. Cludgy, inefficiente e non elegante, ma funzionerebbe. Puoi anche fare in modo che controlli una cella, una casella di controllo, un pulsante radio, praticamente qualsiasi controllo in un altro foglio Excel in esecuzione in un'altra istanza di Excel. Di nuovo cludgy.

CTRL + Break opere. Accettalo e vai avanti. Un semplice trucco a tale proposito è che se proteggi il tuo codice con una password e premi CTRL + Break, l'opzione di debug non è disponibile e otterranno solo Continue o End.

Se questo è un codice che viene eseguito frequentemente, hai considerato lo script qualcosa che lo esegue durante i periodi in cui un essere umano non sta utilizzando il computer? Ho usato per eseguire lo screen telnet di macro telnet che richiederebbero ore per passare attraverso i nostri widget, ma li ho sempre eseguiti su un computer separato o quando non ero lì (notti/fine settimana).

Problemi correlati