Non importa quanto tu sia esperto con la codifica VBA, gli errori ne faranno sempre parte.
La differenza tra un programmatore VBA principiante e un programmatore esperto è che i programmatori esperti sanno come gestire e utilizzare efficacemente gli errori.
In questo tutorial, ti mostrerò vari modi in cui puoi utilizzare per gestire efficacemente gli errori in Excel VBA.
Prima di entrare nella gestione degli errori VBA, capiamo prima i diversi tipi di errori che potresti incontrare durante la programmazione in Excel VBA.
Tipi di errori VBA in Excel
Esistono quattro tipi di errori in Excel VBA:
- Errori di sintassi
- Errori di compilazione
- Errori di runtime
- Errori logici
Capiamo rapidamente quali sono questi errori e quando è probabile che li incontri.
Errore di sintassi
Un errore di sintassi, come suggerisce il nome, si verifica quando VBA trova qualcosa di sbagliato nella sintassi nel codice.
Ad esempio, se si dimentica una parte dell'istruzione/sintassi necessaria, verrà visualizzato l'errore di compilazione.
Nel codice seguente, non appena premo invio dopo la seconda riga, vedo un errore di compilazione. Questo perché il IF dichiarazione deve avere il 'Quindi' comando, che manca nel codice sottostante.
Per assicurarti di visualizzare l'errore di sintassi ogni volta che manca qualcosa, devi assicurarti che il controllo automatico della sintassi sia abilitato. Per fare ciò, fare clic su "Strumenti" e quindi su "Opzioni". Nella finestra di dialogo delle opzioni, assicurati che l'opzione "Controllo automatico della sintassi" sia abilitata.
Se l'opzione "Controllo automatico della sintassi" è disabilitata, VBA evidenzierà comunque la riga con l'errore di sintassi in rosso, ma non mostrerà la finestra di dialogo dell'errore.
Errore di compilazione
Gli errori di compilazione si verificano quando manca qualcosa che è necessario per l'esecuzione del codice.
Ad esempio, nel codice seguente, non appena provo a eseguire il codice, mostrerà il seguente errore. Ciò accade poiché ho utilizzato l'istruzione IF Then senza chiuderla con l'obbligatorio "End If".
VBA controlla ogni riga mentre digiti il codice ed evidenzia l'errore di sintassi non appena la riga non è corretta e premi invio. Gli errori di compilazione, d'altra parte, vengono identificati solo quando l'intero codice viene analizzato da VBA.
Di seguito sono riportati alcuni scenari in cui riscontrerai l'errore di compilazione:
- Utilizzo di un'istruzione IF senza End IF
- Utilizzo dell'istruzione For con Next
- Utilizzo dell'istruzione Select senza utilizzare End Select
- Non dichiarare la variabile (funziona solo quando l'opzione esplicita è abilitata)
- Richiamo di una Sotto/Funzione che non esiste (o con parametri errati)
Errori di tempo di esecuzione
Gli errori di runtime sono quelli che si verificano durante l'esecuzione del codice.
Gli errori di runtime si verificheranno solo quando tutti gli errori di sintassi e di compilazione verranno risolti.
Ad esempio, se esegui il codice che dovrebbe aprire una cartella di lavoro di Excel, ma quella cartella di lavoro non è disponibile (eliminata o modificata con il nome), il codice ti darebbe un errore di runtime.
Quando si verifica un errore di runtime, interromperà il codice e mostrerà la finestra di dialogo di errore.
Il messaggio nella finestra di dialogo Errore di runtime è un po' più utile. Cerca di spiegare il problema che può aiutarti a correggerlo.
Se fai clic sul pulsante Debug, evidenzierà la parte del codice che porta all'errore.
Se hai corretto l'errore, puoi fare clic sul pulsante Esegui nella barra degli strumenti (o premere F5) per continuare a eseguire il codice da dove è stato lasciato.
Oppure puoi anche fare clic sul pulsante Fine per uscire dal codice.
ImportanteNota: nel caso in cui si faccia clic sul pulsante Fine nella finestra di dialogo, il codice verrà interrotto alla riga in cui si trova. Tuttavia, tutte le righe di codice precedenti sarebbero state eseguite.Errori logici
Errori logici non fermerebbero il codice ma possono portare a risultati errati. Questi potrebbero anche essere i tipi di errori più difficili da risolvere.
Questi errori non vengono evidenziati dal compilatore e devono essere affrontati manualmente.
Un esempio di errore logico (con cui mi ritrovo spesso bloccato) è l'esecuzione in un ciclo infinito.
Un altro esempio potrebbe essere quando dà un risultato sbagliato. Ad esempio, potresti finire per utilizzare una variabile sbagliata nel codice o aggiungere due variabili in cui una non è corretta.
Ci sono alcuni modi che uso per affrontare gli errori logici:
- Inserisci Message Box in un punto del codice ed evidenzia valori/dati che possono aiutare a capire se tutto sta andando come previsto.
- Invece di eseguire il codice in una volta sola, passa attraverso ogni riga una per una. Per fare ciò, fai clic in un punto qualsiasi del codice e premi F8. noteresti che ogni volta che premi F8, viene eseguita una riga. Ciò consente di esaminare il codice una riga alla volta e identificare gli errori logici.
Utilizzo di debug per trovare errori di compilazione/sintassi
Una volta terminato il codice, è buona norma compilarlo prima di eseguirlo.
Per compilare un codice, fare clic sull'opzione Debug nella barra degli strumenti e fare clic su Compile VBAProject.
Quando compili un progetto VBA, passa attraverso il codice e identifica gli errori (se presenti).
Nel caso in cui trovi un errore, ti mostrerà una finestra di dialogo con l'errore. Trova gli errori uno per uno. Quindi, se trova un errore e lo hai corretto, devi eseguire nuovamente compile per trovare altri errori (se ci sono).
Quando il tuo codice è privo di errori, l'opzione Compila VBAProject sarà disattivata.
Nota che la compilazione troverà solo errori di "Sintassi" ed errori di "Compilazione". NON troverà gli errori di runtime.
Quando scrivi il codice VBA, non vuoi che gli errori si presentino. Per evitare ciò, è possibile utilizzare molti metodi di gestione degli errori.
Nelle prossime sezioni di questo articolo, tratterò i metodi che è possibile utilizzare per la gestione degli errori VBA in Excel.
Configura le impostazioni degli errori (errori gestiti e non gestiti)
Prima di iniziare a lavorare con il codice, è necessario verificare un'impostazione in Excel VBA.
Vai alla barra degli strumenti VBA e fai clic su Strumenti, quindi fai clic su Opzioni.
Nella finestra di dialogo Opzioni, fare clic sulla scheda Generale e assicurarsi che all'interno del gruppo "Error Trapping" sia selezionato "Break on Unhandled Errors".
Ti spiego le tre opzioni:
- Interrompi su tutti gli errori: Questo fermerà il tuo codice su tutti i tipi di errori, anche quando hai usato le tecniche per gestire questi errori.
- Modulo Break in Class: Questo fermerà il tuo codice su tutti gli errori non gestiti e, allo stesso tempo, se stai usando oggetti come Userforms, si interromperà anche all'interno di quegli oggetti ed evidenzierà la riga esatta che causa l'errore.
- Interruzione su errori non gestiti: Questo fermerà il tuo codice solo per quegli errori che non vengono gestiti. Questa è l'impostazione predefinita in quanto garantisce che eventuali errori non gestiti vengano segnalati all'utente. Se stai usando oggetti come Userforms, questo non evidenzierà la linea che causa l'errore nell'oggetto, ma evidenzierà solo la linea che fa riferimento a quell'oggetto.
Quindi, in poche parole, se stai appena iniziando con Excel VBA, assicurati che "Break on Unhandled Errors" sia selezionato.
Gestione degli errori VBA con dichiarazioni "On Error"
Quando il tuo codice incontra un errore, ci sono alcune cose che puoi fare:
- Ignora l'errore e lascia che il codice continui
- Avere un codice di gestione degli errori ed eseguirlo quando si verifica un errore
Entrambi questi metodi di gestione degli errori assicurano che l'utente finale non vedrà un errore.
Ci sono alcune istruzioni "On Error" che puoi usare per farlo.
In caso di errore Riprendi Avanti
Quando utilizzi "On Error Resume Next" nel codice, qualsiasi errore riscontrato verrà ignorato e il codice continuerà a essere eseguito.
Questo metodo di gestione degli errori viene utilizzato abbastanza spesso, ma è necessario essere cauti quando lo si utilizza. Poiché ignora completamente qualsiasi errore che potrebbe verificarsi, potresti non essere in grado di identificare gli errori che devono essere corretti.
Ad esempio, se viene eseguito il codice seguente, verrà restituito un errore.
Sub AssignValues() x = 20 / 4 y = 30 / 0 End Sub
Questo accade perché non puoi dividere un numero per zero.
Ma se utilizzo l'istruzione "On Error Resume Next" in questo codice (come mostrato di seguito), ignorerà l'errore e non saprò che c'è un problema che deve essere corretto.
Sub AssignValues() On Error Resume Next x = 20 / 4 y = 30 / 0 End Sub
On Error Resume Next dovrebbe essere usato solo quando conosci chiaramente il tipo di errori che il tuo codice VBA dovrebbe generare e va bene ignorarlo.
Ad esempio, di seguito è riportato il codice dell'evento VBA che aggiungerebbe immediatamente il valore di data e ora nella cella A1 di un foglio appena inserito (questo codice viene aggiunto nel foglio di lavoro e non in un modulo).
Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Sebbene funzioni alla grande nella maggior parte dei casi, mostrerebbe un errore se aggiungo un foglio grafico invece di un foglio di lavoro. Poiché un foglio grafico non ha celle, il codice genererebbe un errore.
Quindi, se utilizzo l'istruzione "On Error Resume Next" in questo codice, funzionerà come previsto con i fogli di lavoro e non farà nulla con i fogli dei grafici.
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Riprendi successivo Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Nota: On Error Resume Next Statement viene utilizzato al meglio quando si conosce il tipo di errori che è probabile che si verifichi. E poi se pensi che sia sicuro ignorare questi errori, puoi usarlo.
Puoi portare questo codice al livello successivo analizzando se si è verificato un errore e visualizzando un messaggio pertinente.
Il codice seguente mostrerebbe una finestra di messaggio che informerebbe l'utente che un foglio di lavoro non è stato inserito.
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") If Err.Number 0 Then MsgBox "Sembra te inserito un foglio grafico" & vbCrLf & "Error - " & Err.Description End If End Sub
'Err.Number' viene utilizzato per ottenere il numero di errore e 'Err.Description' viene utilizzato per ottenere la descrizione dell'errore. Questi saranno trattati più avanti in questo tutorial.
In caso di errore Vai a 0
'On Error GoTo 0' interromperà il codice sulla riga che causa l'errore e mostrerà una finestra di messaggio che descrive l'errore.
In termini semplici, abilita il comportamento di controllo degli errori predefinito e mostra il messaggio di errore predefinito.
Allora perché usarlo?
Normalmente, non è necessario utilizzare "On Error Goto 0", ma può essere utile quando lo si utilizza insieme a "On Error Resume Next"
Lasciatemi spiegare!
Il codice seguente selezionerebbe tutte le celle vuote nella selezione.
Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Select End Sub
Ma mostrerebbe un errore quando non ci sono celle vuote nelle celle selezionate.
Quindi, per evitare di mostrare l'errore, puoi usare On Error Resume next'
Ora mostrerà anche qualsiasi errore quando esegui il codice seguente:
Sub SelectFormulaCells() In caso di errore Riprendi la selezione successiva.SpecialCells(xlCellTypeBlanks).Select End Sub
Fin qui tutto bene!
Il problema sorge quando c'è una parte del codice in cui può verificarsi un errore e poiché stai utilizzando "On Error Resume Next", il codice semplicemente lo ignorerebbe e passerebbe alla riga successiva.
Ad esempio, nel codice seguente, non ci sarebbe alcun messaggio di errore:
Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select '… altro codice che può contenere errori End Sub
Nel codice sopra, ci sono due punti in cui può verificarsi un errore. Il primo posto è dove stiamo selezionando tutte le celle vuote (usando Selection.SpecialCells) e il secondo è nel codice rimanente.
Mentre il primo errore è previsto, qualsiasi errore successivo non lo è.
È qui che On Error Goto 0 viene in soccorso.
Quando lo usi, reimposta l'impostazione di errore sui valori predefiniti, dove inizierà a mostrare errori quando lo incontra.
Ad esempio, nel codice seguente, non ci sarebbero errori nel caso in cui non ci siano celle vuote, ma ci sarebbe un messaggio di errore a causa di "10/0"
Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 '… altro codice che può contenere errori End Sub
In caso di errore Vai a [Etichetta]
I due metodi precedenti - "On Error Resume Next" e "On Error Goto 0" - non ci consentono di gestire veramente l'errore. Uno fa sì che il codice ignori l'errore e il secondo riprenda il controllo degli errori.
On Error Go [Label] è un modo con cui puoi specificare cosa vuoi fare nel caso in cui il tuo codice contenga un errore.
Di seguito è riportata la struttura del codice che utilizza questo gestore di errori:
Sub Test() On Error GoTo Label: X = 10 / 0 'questa riga causa un errore'… .il tuo codice rimanente va qui Exit Sub Label: 'codice per gestire l'errore End Sub
Si noti che prima dell'"Etichetta" di gestione dell'errore, c'è un Sottotitolo di uscita. Ciò garantisce che nel caso in cui non ci siano errori, il sub viene chiuso e il codice "Label" non viene eseguito. Nel caso in cui non utilizzi Exit Sub, eseguirà sempre il codice "Label".
Nel codice di esempio seguente, quando si verifica un errore, il codice salta ed esegue il codice nella sezione del gestore (e mostra una finestra di messaggio).
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Sembra esserci un errore" & vbCrLf & Err.Description End Sub
Si noti che quando si verifica un errore, il codice è già stato eseguito ed ha eseguito le righe prima della riga che causa l'errore. Nell'esempio sopra, il codice imposta il valore di X su 12, ma poiché l'errore si verifica nella riga successiva, non imposta i valori per Y e Z.
Una volta che il codice passa al codice del gestore degli errori (ErrMsg in questo esempio), continuerà a eseguire tutte le righe dentro e sotto il codice del gestore degli errori e l'uscita dal sub.
In caso di errore Vai a -1
Questo è un po 'complicato e, nella maggior parte dei casi, è improbabile che tu lo usi.
Ma tratterò ancora questo dato che ho affrontato una situazione in cui era necessario (sentiti libero di ignorare e passare alla sezione successiva se stai solo cercando le basi).
Prima di entrare nei meccanismi, vorrei provare a spiegare dove può essere utile.
Supponiamo di avere un codice in cui si verifica un errore. Ma tutto va bene in quanto hai un gestore di errori in atto. Ma cosa succede quando c'è un altro errore nel codice del gestore degli errori (sì… un po' come il film di inizio).
In tal caso, non è possibile utilizzare il secondo gestore poiché il primo errore non è stato eliminato. Quindi, mentre hai gestito il primo errore, nella memoria di VBA esiste ancora. E la memoria VBA ha solo un posto per un errore, non due o più.
In questo scenario, puoi utilizzare On Error Goto -1.
Cancella l'errore e libera la memoria VBA per gestire l'errore successivo.
Basta chiacchiere!
Mi spiego ora usando esempi.
Supponiamo di avere il codice seguente. Questo genererà un errore in quanto esiste una divisione per zero.
Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 End Sub
Quindi, per gestirlo, utilizzo un codice di gestione degli errori (con il nome ErrMsg) come mostrato di seguito:
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Sembra esserci un errore" & vbCrLf & Err.Description End Sub
Adesso è di nuovo tutto a posto. Non appena si verifica l'errore, viene utilizzato il gestore degli errori e viene visualizzata una finestra di messaggio come mostrato di seguito.
Ora, espando il codice in modo da avere più codice all'interno o dopo il gestore degli errori.
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Sembra esserci un errore" & vbCrLf & Err.Description A = 10 / 2 B = 35 / 0 End Sub
Poiché il primo errore è stato gestito ma il secondo non lo è stato, vedo di nuovo un errore come mostrato di seguito.
Ancora tutto bene. Il codice si sta comportando nel modo in cui ci aspettavamo.
Quindi, per gestire il secondo errore, utilizzo un altro gestore di errori (ErrMsg2).
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Sembra esserci un errore" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Sembra esserci di nuovo un errore" & vbCrLf & Err.Description End Sub
Ed è qui che si trova non funziona come previsto.
Se esegui il codice sopra, ti darà comunque un errore di runtime, anche dopo aver installato il secondo gestore di errori.
Questo accade perché non abbiamo cancellato il primo errore dalla memoria di VBA.
Sì, ce l'abbiamo fatta! Ma rimane ancora nella memoria.
E quando VBA incontra un altro errore, è ancora bloccato con il primo errore e quindi il secondo gestore di errori non viene utilizzato. Il codice si ferma alla riga che ha causato l'errore e mostra il prompt di errore.
Per cancellare la memoria di VBA e cancellare l'errore precedente, è necessario utilizzare "On Error Goto -1".
Quindi, se aggiungi questa riga nel codice seguente e la esegui, funzionerà come previsto.
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Sembra esserci un errore" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Sembra esserci di nuovo un errore" & vbCrLf & Err.Description End SubNota: L'errore viene cancellato automaticamente al termine di una subroutine.Quindi, "On Error Goto -1" può essere utile quando ricevi due o più di due errori nella stessa subroutine.
L'oggetto Err
Ogni volta che si verifica un errore con un codice, è l'oggetto Err che viene utilizzato per ottenere i dettagli sull'errore (come il numero di errore o la descrizione).
Err le proprietà dell'oggetto
L'oggetto Err ha le seguenti proprietà:
Proprietà | Descrizione |
Numero | Un numero che rappresenta il tipo di errore. Quando non ci sono errori, questo valore è 0 |
Descrizione | Una breve descrizione dell'errore |
Fonte | Nome del progetto in cui si è verificato l'errore |
AiutoContesto | L'ID del contesto della guida per l'errore nel file della guida |
AiutoFile | Una stringa che rappresenta la posizione della cartella e il nome del file della guida |
Sebbene nella maggior parte dei casi non sia necessario utilizzare l'oggetto Err, a volte può essere utile durante la gestione degli errori in Excel.
Ad esempio, supponi di avere un set di dati come mostrato di seguito e per ogni numero, nella selezione, vuoi calcolare la radice quadrata nella cella adiacente.
Il codice seguente può farlo, ma poiché è presente una stringa di testo nella cella A5, mostra un errore non appena ciò si verifica.
Sub FindSqrRoot() Dim rng As Range Set rng = Selezione per ogni cella In rng cell.Offset(0, 1).Value = Sqr(cell.Value) Cella successiva End Sub
Il problema con questo tipo di messaggio di errore è che non ti dà nulla su cosa è andato storto e dove si è verificato il problema.
È possibile utilizzare l'oggetto Err per rendere più significativi questi messaggi di errore.
Ad esempio, se ora utilizzo il codice VBA seguente, interromperà il codice non appena si verifica l'errore e mostrerà una finestra di messaggio con l'indirizzo della cella in cui si verifica un problema.
Sub FindSqrRoot() Dim rng As Range Set rng = Selezione per ogni cella In rng On Error GoTo ErrHandler cell.Offset(0, 1).Value = Sqr(cell.Value) Cella successiva ErrHandler: MsgBox "Error Number:" & Err .Number & vbCrLf & _ "Descrizione errore: " & Err.Description & vbCrLf & _ "Errore in: " & cell.Address End Sub
Il codice sopra ti darebbe molte più informazioni rispetto al semplice "Tipo non corrispondente", in particolare l'indirizzo della cella in modo da sapere dove si è verificato l'errore.
Puoi perfezionare ulteriormente questo codice per assicurarti che il tuo codice venga eseguito fino alla fine (invece di interrompersi a ogni errore) e quindi ti dia un elenco di indirizzi di cella in cui si verifica l'errore.
Il codice seguente farebbe questo:
Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selezione per ogni cella In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Errore nelle seguenti celle" & ErrorCells Exit Sub End Sub
Il codice sopra viene eseguito fino alla fine e fornisce la radice quadrata di tutte le celle che contengono numeri (nella colonna adiacente). Quindi mostra un messaggio che elenca tutte le celle in cui si è verificato un errore (come mostrato di seguito):
Err metodi oggetto
Sebbene le proprietà Err siano utili per mostrare informazioni utili sugli errori, esistono anche due metodi Err che possono aiutarti nella gestione degli errori.
Metodo | Descrizione |
Chiaro | Cancella tutte le impostazioni delle proprietà dell'oggetto Err |
Raccogliere | Genera un errore di runtime |
Impariamo rapidamente cosa sono e come/perché usarli con VBA in Excel.
Err metodo chiaro
Supponiamo di avere un set di dati come mostrato di seguito e di voler ottenere la radice quadrata di tutti questi numeri nella colonna adiacente.
Il codice seguente otterrà le radici quadrate di tutti i numeri nella colonna adiacente e mostrerà un messaggio che si è verificato un errore per le celle A5 e A9 (in quanto contengono del testo).
Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selezione per ogni cella In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Errore nelle seguenti celle" & ErrorCells End Sub
Nota che ho usato il metodo Err.Clear all'interno dell'istruzione If Then.
Una volta che si è verificato un errore ed è stato intercettato dalla condizione If, il metodo Err.Clear reimposta il numero di errore su 0. Ciò garantisce che la condizione IF intrappoli solo gli errori per le celle in cui viene generato.
Se non avessi usato il metodo Err.Clear, una volta che si verifica l'errore, sarebbe sempre vero nella condizione IF e il numero di errore non è stato reimpostato.
Un altro modo per farlo funzionare è utilizzare On Error Goto -1, che ripristina completamente l'errore.
Nota: Err.Clear è diverso da On Error Goto -1. Err.Clear cancella solo la descrizione dell'errore e il numero dell'errore. non lo resetta completamente. Ciò significa che se è presente un'altra istanza di errore nello stesso codice, non sarai in grado di gestirlo prima di ripristinarlo (cosa che può essere eseguita con "On Error Goto -1" e non con "Err.Clear").Metodo di aumento di errore
Il metodo Err.Raise consente di generare un errore di runtime.
Di seguito è riportata la sintassi dell'utilizzo del metodo Err.Raise:
Err.Raise [numero], [sorgente], [descrizione], [file di aiuto], [contesto di aiuto]
Tutti questi argomenti sono facoltativi e puoi usarli per rendere il tuo messaggio di errore più significativo.
Ma perché mai dovresti sollevare un errore da solo?
Buona domanda!
Puoi usare questo metodo quando c'è un'istanza di un errore (il che significa che ci sarà comunque un errore) e poi usi questo metodo per dire all'utente di più sull'errore (invece del messaggio di errore meno utile mostrato da VBA per impostazione predefinita).
Ad esempio, supponiamo di avere un set di dati come mostrato di seguito e di volere che tutte le celle abbiano solo valori numerici.
Sub RaiseError() Dim rng As Range Set rng = Selection On Error GoTo ErrHandler per ogni cella in rng If Not (IsNumeric(Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Non un numero", " Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
Il codice sopra mostrerebbe un messaggio di errore con la descrizione specificata e il file di contesto.
Personalmente, non ho mai usato Err.Raise poiché lavoro principalmente solo con Excel. Ma per chi usa VBA per lavorare con Excel insieme ad altre applicazioni come Outlook, Word o PowerPoint, questo può essere utile.
Ecco un articolo dettagliato sul metodo Err.Raise nel caso tu voglia saperne di più.
Best practice per la gestione degli errori VBA
Non importa quanto abili ottieni un codice VBA di scrittura, gli errori ne faranno sempre parte. I migliori programmatori sono quelli che hanno le capacità per gestire correttamente questi errori.
Ecco alcune best practice che puoi utilizzare quando si tratta di gestione degli errori in Excel VBA.
- Usa "On Error Go [Label]" all'inizio del codice. Ciò assicurerà che qualsiasi errore che può verificarsi da lì venga gestito.
- Usa 'On Error Resume Next' SOLO quando sei sicuro degli errori che possono verificarsi. Usalo solo con l'errore previsto. Nel caso in cui lo usi con errori imprevisti, semplicemente lo ignorerà e andrà avanti. Puoi usare "On Error Resume Next" con "Err.Raise" se vuoi ignorare un certo tipo di errore e catturare il resto.
- Quando si utilizzano gestori di errori, assicurarsi di utilizzare Exit Sub prima dei gestori. Ciò garantirà che il codice del gestore degli errori venga eseguito solo quando si verifica un errore (altrimenti verrà sempre eseguito).
- Utilizzare più gestori di errori per intercettare diversi tipi di errori. Avere più gestori di errori garantisce che un errore venga affrontato correttamente. Ad esempio, potresti voler gestire un errore di "mancata corrispondenza del tipo" rispetto a un errore di runtime "Divisione per 0".
Spero che tu abbia trovato utile questo articolo di Excel!
Ecco alcuni altri tutorial VBA di Excel che potrebbero piacerti:
- Tipi di dati VBA di Excel: una guida completa
- Cicli VBA di Excel: per il prossimo, fai mentre, fai fino a, per ciascuno
- Eventi VBA di Excel: una guida semplice (e completa)
- Editor Visual Basic di Excel: come aprirlo e utilizzarlo in Excel