Gestione degli errori in Excel PDF Stampa E-mail
Scritto da Paolo Ardizzoni   
Mercoledì 09 Dicembre 2009 21:55

In molti casi, le funzioni di Excel restituiscono un risultato di errore del tipo #DIV/0!, #N/D!, #RIF!, #NUM! e così via. Questo succede perché la funzione non riesce ad effettuare il calcolo che le è proprio.

Le ragioni possono essere molteplici: dalla divisione di un numero per 0 (zero), alla ricerca di un valore oltre il range di un intervallo, all'inesistenza di un dato cercato, alla dissociazione di celle e altro.
L'intercettazione dell'errore può essere fatta mediante alcune funzioni specifiche del tipo VAL.NON.DISP(valore), dove più spesso valore è un'espressione, che controlla se un valore è disponibile, oppure VAL.NUMERO(valore) che restituisce VERO se il valore è un numero e altre (vedi al proposito l'help di Excel alla voce Funzioni Informative/Funzioni  VAL).
Per evitare la ricerca di un errore specifico, non sempre di facile soluzione, nella maggior parte dei casi risulta molto più agevole utilizzare la funzione VAL.ERRORE(valore) in quanto intercetta ogni tipo di errore.
Nelle versioni di Excel precedenti la 2007, la gestione dell'errore avviene testando la funzione di verifica dell'errore all'interno di una funzione SE():
=SE(VAL.ERRORE(Espressione); Risultato_se_errore; Espressione)
Se Espressione genera un errore di qualsiasi tipo la formula restituisce Risultato_se_errore, che potrebbe essere una stringa nulla oppure un messaggio testuale, altrimenti il risultato di Espressione.
Per esempio, avendo in [A1] ed in [A2] dei dati numerici, per evitare che la formula =A1/A2 restituisca il risultato #DIV/0! quando A2 fosse uguale a zero, si potrebbe scrivere la seguente:
=SE(VAL.ERRORE(A1/A2);"Il divisore non può essere 0"; A1/A2)
ovvero se il valore in A2 è zero scrivi il messaggio "Il divisore non può essere 0" altrimenti esegui il calcolo A1/A2.
 E' chiaro che una soluzione del genere, in presenza di Espressioni complesse, appesantisce notevolmente il calcolo in quanto obbliga il sistema a calcolare due volte la stessa Espressione, senza contare il fatto che l'intera formula potrebbe risultare di difficile lettura e comprensione.
Nella versione 2007 di Excel è stata introdotta una nuova funzione che facilita notevolmente le cose:
=SE.ERRORE(Espressione; Risultato_se_errore)
che restituisce Risultato_se_errore in caso di errore, altrimenti il valore di Espressione. Come si può notare l'Espressione viene calcolata una sola volta.
Riprendendo l'esempio precedente, la funzione sarebbe:
=SE.ERRORE(A1/A2; "Il divisore non può essere 0")
ovvero la formula calcola il quoziente che restituisce come risultato ma, se trova un errore restituisce "Il divisore non può essere 0". Come si può notare, l'eliminazione del terzo argomento comporta una notevole semplificazione.
Oltre alle soluzioni già prospettate, vi sono casi in cui l'evidenza di un errore potrebbe essere evitata modificando la formula.
Per esempio, nel caso in cui volessimo riscontrare la presenza di un certo elemento in un elenco potremmo usare la funzione CONFRONTA() che restituisce il numero di posizione dell'elemento cercato nell'intervallo dell'elenco. Con l'inconveniente che se l'elemento non fosse presente nell'intervallo, la funzione restituirebbe un errore #ND!. Ovviamente ciò non avverrebbe nel caso in cui l'elemento venisse trovato, come si può rilevare dalle due tabelle seguenti:

Lo stesso ragionamento si può applicare a formule più complesse. Per esempio, nel caso di estrazione di valori univoci da un elenco di valori ripetuti, la funzione CONTA.SE(...) può evitare che CONFRONTA(…) restituisca un errore.

Vedi la tabella seguente:

Come si può notare, nel caso della formula in colonna B, la funzione CONTA.SE(...) verifica prima quanti elementi singoli vi sono nell'elenco poi, quando li ha estratti tutti, restituisce "" (stringa nulla) anziché l'errore che viene invece restituito dalla formula in colonna C contenente la funzione CONFRONTA(...).


Applicazioni: Office 2003, Office 2007

Ultimo aggiornamento Venerdì 03 Dicembre 2010 12:22