Interruzione di una macro e mantenimento del controllo (Microsoft Excel)
Quando si sviluppa una macro per l’utilizzo da parte di altri, è possibile aggiungere un metodo per consentire all’utente di uscire dalla macro prima che termini e mantenere il controllo di ciò che fa la macro. Ctrl + Break interromperà una macro, ma non verrà chiusa correttamente, poiché consente all’utente di visualizzare il codice nell’editor VBA.
Esistono diversi modi per affrontare questo problema. Il primo è creare un prompt “vuoi uscire” nella tua macro, quindi fare in modo che la macro visualizzi periodicamente il prompt. Ad esempio, considera il seguente codice:
Do ... ' your code goes here Counter = Counter + 1 If Counter Mod 25 = 0 Then If MsgBox("Stop Macro?", vbYesNo) = vbYes Then End End If Loop
La costruzione della macro si basa sulla premessa che si hanno una serie di passaggi che si desidera ripetere più e più volte, attraverso l’uso di una struttura Do … Loop. Ogni volta che si esegue il ciclo, il valore di Counter viene incrementato. Ogni 25 volte nel ciclo, il messaggio “stop macro?” viene visualizzato il prompt e l’utente ha la possibilità di uscire.
Questo approccio è facile da implementare e può funzionare abbastanza bene per alcuni scopi. Il più grande svantaggio di questo approccio, tuttavia, è che non consente l’immediatezza: l’utente deve attendere per uscire dalla macro finché non si sono verificate almeno 25 iterazioni.
Un altro approccio consiste nel “nascondere” il codice VBA e applicarvi una password.
Puoi farlo seguendo questi passaggi dall’editor VBA:
-
Scegli l’opzione Proprietà VBAProject dal menu Strumenti. L’editor visualizza la finestra di dialogo Proprietà progetto.
-
Assicurati che la scheda Protezione sia visualizzata. (Vedi figura 1.)
-
Scegliere la casella di controllo Blocca progetto per visualizzazione.
-
Nella casella Password immettere una password che si desidera utilizzare per proteggere la macro.
-
Nella casella Conferma password, inserisci la stessa password una seconda volta.
-
Fare clic su OK.
Chiudi l’editor VBA, quindi salva la cartella di lavoro. Con il progetto VBA protetto, l’utente può ancora fare clic su Ctrl + Interruzione per interrompere la macro, ma non sarà in grado di accedere al codice del programma effettivo. Potranno solo scegliere tra i pulsanti Continua o Fine, che proteggono entrambi il tuo codice. Come ulteriore vantaggio, questo approccio limita anche all’utente la visualizzazione del codice utilizzando scelte di menu, barra degli strumenti o barra multifunzione.
Forse l’approccio migliore, tuttavia, è creare un gestore degli errori che essenzialmente si prenderà carico ogni volta che l’utente preme Esc o Ctrl + Break. Il gestore che viene eseguito può quindi chiedere all’utente se desidera davvero uscire e quindi chiudersi normalmente se lo fa. Ecco un po ‘di codice di esempio che mostra come farlo:
Sub Looptest() Application.EnableCancelKey = xlErrorHandler On Error GoTo ErrHandler Dim x As Long Dim y As Long Dim lContinue As Long y = 100000000 For x = 1 To y Step 1 Next Application.EnableCancelKey = xlInterrupt Exit Sub ErrHandler: If Err.Number = 18 Then lContinue = MsgBox(prompt:=Format(x / y, "0.0%") & _ " complete" & vbCrLf & _ "Do you want to Continue (YES)?" & vbCrLf & _ "Do you want to QUIT? [Click NO]", _ Buttons:=vbYesNo) If lContinue = vbYes Then Resume Else Application.EnableCancelKey = xlInterrupt MsgBox ("Program ended at your request") Exit Sub End If End If Application.EnableCancelKey = xlInterrupt End Sub
Si noti che questo esempio utilizza il metodo EnableCancelKey, assegnandogli il nome dell’etichetta a cui si dovrebbe saltare se si preme il tasto Annulla (Esc o Ctrl + Break). In questo caso, si passa a ErrHandler e all’utente viene chiesto cosa fare. Se l’utente sceglie di uscire, la macro viene chiusa normalmente.
Notare che la prima cosa da fare dopo l’etichetta ErrHandler è controllare se la proprietà Number dell’oggetto Err è uguale a 18. In caso affermativo, si sa che è stato premuto un tasto Annulla. In caso contrario, si è verificato un altro tipo di errore e dovrebbe essere gestito in qualsiasi modo sia appropriato per la tua macro.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (3021) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: