Gestire gli errori

    
    VBA possiede lo stesso sistema di gestione degli errori proprio di Visual Basic. Il sistema di controllo degli errori permette ad una routine in errore, di gestire le operazioni ed i messaggi da intraprendere in caso di anomalia evitando di dare una segnalazione generica, cosa poco elegante e per nulla professionale.
    Esistono sostanzialmente 2 metodi di gestione dell'errore.

    On Error GoTo errore

    In questo caso, quando viene generato un errore di run-time il controllo viene trasferito a 'ERRORE', attivando la routine di gestione degli errori. L'argomento (nel nostro caso 'ERRORE') può essere una etichetta di riga o un numero di riga. La riga specificata deve trovarsi nella stessa routine in cui si trova l'istruzione On Error; in caso contrario verrà generato un errore di compilazione.
    Sintassi:
    	On Error GoTo ERRORE
    
    	' RIGA CHE GENERA UN ERRORE
    
    	ERRORE:
    	    ' GESTIONE DELL'ERRORE
    	
    La routine seguente genera un errore di divisione di un numero per zero e ne gestisce l'errore.
    	Private Sub Prova()
    	    On Error GoTo ERRORE
    	    VarProva = 1 / 0
    	    MsgBox "Questo messaggio non viene stampato", vbInformation
    	ERRORE:
    	    MsgBox "Impossibile dividere un numero per zero", _
    	    vbCritical, "Errore"
    	End Sub
    	
    Per evitare che il codice di gestione degli errori venga eseguito anche se non è stato generato alcun errore, è utile inserire un'istruzione Exit Sub, Exit Function o Exit Property , a seconda del tipo di routine, immediatamente prima della routine di gestione degli errori, come illustrato nell'esempio seguente:
    	Sub Prova()
    	    On Error GoTo ERRORE
    	    varprova = 1 / 0
    	    Exit Sub
    	ERRORE:
    	    MsgBox "Impossibile dividere un numero per zero", _ 
    	    vbCritical, "Errore"
    	    Resume Next
    	End Sub
    	
    Per determinare la causa di un errore, le routine di gestione degli errori si basano sul valore della proprietà Number dell'oggetto Err. Una routine di gestione degli errori dovrebbe verificare o salvare i valori rilevanti delle proprietà dell'oggetto Err prima che venga generato un altro errore o prima che venga richiamata una routine che potrebbe generare un errore. I valori delle proprietà dell'oggetto Err si riferiscono esclusivamente all'ultimo errore. Il messaggio di errore associato a Err.Number è contenuto in Err.Description. Di seguito sono riportate le proprietà dell'oggetto Err:
    Proprietà
    Valore
    Number Valore specificato come argomento per l'istruzione Error. Indica il codice dell'errore
    Source Nome del progetto corrente di Visual Basic.
    HelpFile Unità, percorso completo e nome del file della Guida in linea di Visual Basic.
    HelpContext ID di contesto del file della Guida di Visual Basic relativo all'errore corrispondente al valore della proprietà Number.
    Ecco un esempio di utilizzo delle proprietà dell'oggetto Err.
    	    Sub prova()
    	        On Error GoTo ERRORE
    	         varprova = 1 / 0
    	        Exit Sub
    	ERRORE:
    	        Msg = "Errore " & Str(Err.Number) & " generato da " _
    	                & Err.Source & Chr(13) & Err.Description
    	        MsgBox Msg, vbCritical, "Errore"
    	        MsgBox Err.HelpFile, vbCritical, "Percorso file guida"
    	        MsgBox Err.HelpContext, vbCritical, "ID errore file guida"
    	    End Sub
    	

    On Error Resume Next

    Determina la continuazione dell'esecuzione con l'istruzione immediatamente successiva a quella che ha generato l'errore di run-time oppure con l'istruzione immediatamente successiva all'ultima chiamata della routine contenente l'istruzione On Error Resume Next. Ciò consente di continuare l'esecuzione nonostante l'errore di run-time. Sarà quindi possibile creare la routine di gestione degli errori all'interno della routine, anziché trasferire il controllo in un altro punto della routine. Un'istruzione On Error Resume Next diventa inattiva quando viene richiamata un'altra routine, pertanto è necessario eseguire un'istruzione On Error Resume Next in ciascuna routine chiamata se si desidera che la gestione degli errori venga eseguita in ogni routine.
    Sintassi:
    	On Error Resume Next
    
    	' RIGA CHE GENERA UN ERRORE
    
    	If Err.Number <> 0 Then
    	    ' GESTIONE DELL'ERRORE
    	End If
    	
    Esempio:
    	Private Sub Prova()
    	    On Error Resume Next
    	    VarProva = 1 / 0
    	    MsgBox "Prima della gestione dell'errore", vbInformation
    	    If Err.Number <> 0 Then
    	        MsgBox "Impossibile dividere un numero per zero", _ 
    	        vbCritical, "Errore"
    	    End If
    	    MsgBox "Dopo la gestione dell'errore", vbInformation
    	End Sub