Articolo wiki
  • Questo articolo wiki è bloccato
Applicabile a 3799 visualizzazioni

Excel - Le basi per gestire le eccezioni (gli errori) - VBA

Riepilogo

Livello tecnico: Conoscenza di base di Visual Basic for Applications Si applica a: Excel (2000/2002/2003/2007/2010/2013)

Dettagli

NOTA. Gli esempi ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per un loro uso scorretto. Utilizzate gli esempi forniti o file di prova per i vostri test. La correzione delle eccezioni (errori) e il controllo del tipo di dati inserito è solo parziale. I file vogliono essere un semplice esempio che illustra come sia possibile automatizzare Excel e sono forniti solo a scopo dimostrativo.

 

La gestioni delle eccezioni (errori) è una cosa spesso trascurata. Una eccezione non correttamente gestita, implica l'uscita subitanea e brutale dalla routine che l'ha sollevata. Se il file è distribuito a terzi, la cosa può sconcertare l'utente e sicuramente chi ha creato il file non fa una bella figura... ;-)

 

Creiamo un errore

Il codice qui sotto semplicemente dichiara una variabile di tipo Long e le assegna una valore di tipo String:

 

 

Figura 1: Il codice e la finestra che appare se eseguiamo la Sub.

 

In questo caso la routine viene interrotta assieme a tutto il codice VBA eventualmente presente nei nostri moduli e in questo caso specifico la riga MsgBox "Ok" non viene eseguita. In pratica, non abbiamo nessun tipo di controllo su quanto accade se non premere il pulsante Debug e vedere quale riga ha sollevato l'eccezione. Notare come la finestra restituisca il numero dell'errore e una breve descrizione dello stesso.

 

 

 

Figura 2: Premendo il pulsante Debug, ci viene mostrata la riga con il codice che ha sollevato l'eccezione.

 

Vediamo come gestire le eccezioni in modo da avere il controllo sul nostro codice.

 

On Error Resume Next

L'istruzione On Error Resume Next consente di ignorare l'errore e far sì che il codice passi all'istruzione successiva:

 

 

 

Figura 3: On Error Resume Next ci consente di ignorare l'errore e di passare all'istruzione successiva.

 

Fare molta, molta, molta attenzione nell'utilizzo di On Error Resume Next. Esclusi alcuni casi specifici (in questo articolo Wiki: Excel - Estrarre dati univoci da una colonna - VBA ne trovate uno nel paragrafo: Nel secondo esempio), ignorare l'errore porta inevitabilmente a risultati diversi da quelli che ci si aspetta. L'istruzione ignora l'errore, non lo corregge. Nel codice qui sopra, la variabile lng ha valore 0 (il valore di default di una variabile di tipo Long) e chi sta utilizzando la Sub non ha nessuna idea di quale sia effettivamente il suo valore. Possiamo controllare quale sia il numero di errore restituito dall'oggetto Err e in base a quello decidere cosa fare. Abbiamo visto nella Figura 1 il numero di errore restituito dall'eccezione sollevata dalla routine del nostro esempio; vediamo come utilizzare quel numero:

 

 

 

 

Figura 4: Gestione dell'errore intercettandone il numero.

 

Non sempre è possibile conoscere a priori il numero dell'errore e in questo caso possiamo controllare se il numero restituito da Err.Number è diverso da zero. Zero equivale ad assenza di errori:

 

 

 

 

Figura 5: Gestione dell'errore controllando il numero restituito dall'oggetto Err (il numero 0 equivale a nessun errore).

 

E' possibile azzerare il numero restituito dall'oggetto Err; nell'esempio della figura 6, quando verrà eseguita la seconda MsgBox il risultato sarà 0, quindi al momento non ci sarà nessun errore nell'oggetto Err:

 

 

 

 

Figura 6: Portare a zero il numero restituito dall'oggetto Err..

 

Anche in questo caso fate riferimento a questo articolo Wiki: Excel - Estrarre dati univoci da una colonna - VBA , paragrafo: Nel secondo esempio dove trovate un esempio di come utilizzare On Error Resume Next  con il riporto a zero del numero di errore.

 

On Error GoTo

Per gestire le eccezioni è preferibile l'utilizzo di On Error GoTo. Vediamone subito un esempio:

 

 

 

 

Figura 7: Gestione dell'errore tramite On Error GoTo.

 

Come funziona. La riga On Error GoTo RigaErrore (RigaErrore può essere sostituito con qualsiasi nome) istruisce il nostro codice di saltare alla riga RigaErrore in caso di eccezione. Tutto il codice successivo alla riga che ha sollevato l'eccezione, verrà ignorato. Prima della riga che contiene RigaErrore: è OBBLIGATORIA l'istruzione Exit Sub, che consente di uscire dalla Sub se non si verifica nessun errore; in sua assenza, verranno eseguite le istruzioni di RigaErrore anche in mancanza di errori.

La MsgBox restituita in caso di errore può essere modificata  a nostro piacere, anche se normalmente contiene informazioni sul tipo di eccezione sollevata e istruzioni per evitare il suo ripetersi. Per approfondire le MsgBox, vedere questo articolo Wiki: Excel - La funzione MsgBox - VBA

 

Una versione migliorata do On Error GoTo è quella che prevede una parte di codice che viene sempre eseguita, con o senza errore. Questo è utile quando si devono comunque eseguire una serie di operazioni prima di uscire dalla Sub:

 

 

 

Figura 8: Gestione completa dell'errore tramite On Error GoTo con parte di codice sempre eseguito.

 

Quanto segue la riga RigaChiusura (il nome può essere sostituito con uno a vostro piacere), viene sempre eseguito. Fate attenzione con la gestione degli oggetti che eventualmente volete gestire; date un'occhiata a questo articolo: Programmazione ad oggetti - Correggere un errore ricorsivo

 

Gli errori e le funzioni

E' buona norma (direi quasi obbligo) non inserire la correzione degli errori nelle funzioni (Function), ma intercettare e correggere l'errore nella Sub che le richiama. Si presume che la funzione restituisca sempre il valore corretto (altrimenti sarebbe sbagliata la funzione) se i parametri passati sono quelli richiesti:

 

 

 

Figura 9: Mai gestire l'errore di una funzione. L'errore va gestito nella chiamata.

 

Del resto anche le funzioni di Excel non hanno la correzione degli errori incorporata, ma restituiscono un errore generico; le nostre funzioni possono, in genere, essere utilizzate anche nelle celle dei foglio di lavoro. Se proviamo ad inserire la chiamata alla funzione f() così come l'abbiamo scritta qui sopra in una cella, otteniamo quello che ci si aspetta passando un valore errato:

 

 

 

 

Figura 10: L'errore generico di Excel per il passaggio errato di valori ad una funzione.

 

Conclusioni

Gestire le eccezioni è importante. L'interruzione del codice senza la loro gestione porta a risultati imprevedibili, perdita di dati o inserimento di dati inconsistenti o non voluti nei fogli di lavoro. In questo articolo ho illustrato quelle che sono le basi per inserire la gestione degli errori nelle nostre Sub.

 

NOTA. Excel non dispone nativamente di procedure assolutamente sicure per impedire la visualizzazione e la modifica del codice vb e/o per la protezione dei fogli. E’ una cosa da tenere sempre presente quando si distribuiscono file con contenuti ritenuti delicati. Ricordate anche che è possibile lanciare il file di Excel senza che vengano eseguite le macro.


Risorse.

 


 Avvio Pulito di Windows
(courtesy of Microsoft MVP Franco Leuzzi)


Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)




Commenti (3)

avanzamento