VBA On Error - Best practice per la gestione degli errori

Foglio informativo sugli errori VBA

Errori

DescrizioneCodice VBAIn caso di errore: codice di arresto e errore di visualizzazioneIn caso di errore Vai a 0On Error - Salta l'errore e continua a correreIn caso di errore Riprendi AvantiIn caso di errore - Vai a una riga di codice [Etichetta]In caso di errore Vai a [Etichetta]Cancella (ripristina) l'erroreIn caso di errore Vai a -1Mostra numero di erroreMsgBox Err.NumeroMostra descrizione dell'erroreMsgBox Err.DescrizioneFunzione per generare il proprio erroreErr.Alza

Vedi più "Cheat Sheets" VBA e download PDF gratuiti

Gestione degli errori VBA

Gestione degli errori VBA si riferisce al processo di anticipazione, rilevamento e risoluzione degli errori di runtime VBA. Il processo di gestione degli errori VBA si verifica durante la scrittura del codice, prima che si verifichino effettivamente errori.

Errori di runtime VBA sono errori che si verificano durante l'esecuzione del codice. Esempi di errori di runtime includono:

  • Fare riferimento a una cartella di lavoro, un foglio di lavoro o un altro oggetto inesistente
  • Dati non validi es. riferimento a una cella di Excel contenente un errore
  • Tentativo di dividere per zero

VBA On Error Statement

La maggior parte della gestione degli errori VBA viene eseguita con il Sulla dichiarazione di errore. L'istruzione On Error dice a VBA cosa fare se incontra un errore. Ce ne sono tre Sulle dichiarazioni di errore:

  • In caso di errore Vai a 0
  • In caso di errore Riprendi Avanti
  • In caso di errore Vai a Linea

In caso di errore Vai a 0

In caso di errore Vai a 0 è l'impostazione predefinita di VBA. Puoi ripristinare questa impostazione predefinita aggiungendo la seguente riga di codice:

1 In caso di errore Vai a 0

Quando si verifica un errore con In caso di errore Vai a 0, VBA interromperà l'esecuzione del codice e visualizzerà la finestra del messaggio di errore standard.

Spesso aggiungerai un In caso di errore Vai a 0 dopo aver aggiunto In caso di errore Riprendi Avanti gestione degli errori (sezione successiva):

123456789 Sub ErrorGoTo0()In caso di errore Riprendi AvantiActiveSheet.Shapes ("Start_Button"). EliminaIn caso di errore Vai a 0"Esegui più codice"Fine sottotitolo

In caso di errore Riprendi Avanti

In caso di errore Riprendi Avanti dice a VBA di saltare qualsiasi riga di codice contenente errori e di passare alla riga successiva.

1 In caso di errore Riprendi Avanti

Nota: In caso di errore Riprendi Avanti non corregge un errore o lo risolve in altro modo. Dice semplicemente a VBA di procedere come se la riga di codice contenente l'errore non esistesse. Uso improprio di In caso di errore Riprendi Avanti può portare a conseguenze indesiderate.

Un ottimo momento da usare In caso di errore Riprendi Avanti è quando si lavora con oggetti che possono o non possono esistere. Ad esempio, vuoi scrivere del codice che cancellerà una forma, ma se esegui il codice quando la forma è già stata eliminata, VBA genererà un errore. Invece puoi usare In caso di errore Riprendi Avanti per dire a VBA di eliminare la forma se esiste.

123 In caso di errore Riprendi AvantiActiveSheet.Shapes ("Start_Button"). EliminaIn caso di errore Vai a 0

Avviso che abbiamo aggiunto In caso di errore Vai a 0 dopo la riga di codice contenente il potenziale errore. Ciò ripristina la gestione degli errori.

Nella prossima sezione ti mostreremo come verificare se si è verificato un errore utilizzando Numero errore, offrendo opzioni di gestione degli errori più avanzate…

Err.Number, Err.Clear e Cattura errori

Invece di saltare semplicemente su una riga contenente un errore, possiamo catturare l'errore usando In caso di errore Riprendi Avanti e Numero errore.

Numero errore restituisce un numero di errore corrispondente al tipo di errore rilevato. Se non ci sono errori, Numero errore = 0.

Ad esempio, questa procedura restituirà "11" perché l'errore che si verifica è Errore di runtime '11'.

1234567 Sub ErrorNumber_ex()In caso di errore Riprendi AvantiActiveCell.Value = 2 / 0MsgBox Err.NumeroFine sottotitolo

Gestione degli errori con Err.Number

Il vero potere di Numero errore risiede nella capacità di rilevare se si è verificato un errore (Numero errore 0). Nell'esempio seguente, abbiamo creato una funzione che verificherà l'esistenza di un foglio utilizzando Err.Number.

12345678910111213141516171819 SottotestWS()MsgBox DoesWSExist("test")Fine sottotitoloFunzione DoesWSExist(wsName As String) As BooleanDim ws come foglio di lavoroIn caso di errore Riprendi AvantiImposta ws = Fogli (wsName)'Se l'errore WS non esisteSe Err.Number 0 AlloraDoesWSExist = FalseAltroDoesWSExist = TrueFinisci seIn caso di errore Vai a -1Fine funzione

Nota: abbiamo aggiunto un In caso di errore Vai a -1 fino alla fine che azzera Err.Number a 0 (vedi due sezioni sotto).

Insieme a In caso di errore Riprendi Avanti e Numero errore, puoi replicare il "Prova a prendere" funzionalità di altri linguaggi di programmazione.

In caso di errore Vai a Linea

In caso di errore Vai a Linea dice a VBA di "andare a" una riga di codice etichettata quando si verifica un errore. Dichiari l'istruzione Go To in questo modo (dove errHandler è l'etichetta della riga a cui andare):

1 In caso di errore GoTo errHandler

e crea un'etichetta di linea come questa:

1 errHandler:

Nota: questa è la stessa etichetta che utilizzeresti con una normale istruzione GoTo VBA.

Di seguito dimostreremo l'utilizzo In caso di errore Vai a Linea per uscire da una procedura.

In caso di errore Esci Sub

È possibile utilizzare On Error GoTo Line per uscire da un sottotitolo quando si verifica un errore.

Puoi farlo inserendo l'etichetta della riga del gestore degli errori alla fine della procedura:

12345678 Sub ErrGoToEnd()In caso di errore GoTo endProc"Un po' di codice"endProc:Fine sottotitolo

oppure usando il comando Exit Sub:

123456789101112131415 Sub ErrGoToEnd()In caso di errore GoTo endProc"Un po' di codice"Vai a saltaEsciendProc:Esci SottosaltaEsci:"Un po' di codice in più"Fine sottotitolo

Err.Clear, On Error GoTo -1 e Reset Err.Number

Dopo che un errore è stato gestito, dovresti generalmente cancellare l'errore per prevenire problemi futuri con la gestione degli errori.

Dopo che si è verificato un errore, entrambi Err.Clear e In caso di errore Vai a -1 può essere usato per resettare Numero errore a 0. Ma c'è una differenza molto importante: Err.Clear non ripristina l'errore vero e proprio, ripristina solo il Numero errore.

Che cosa significa? UsandoErr.Clear, non potrai modificare l'impostazione di gestione degli errori. Per vedere la differenza, prova questo codice e sostituisci In caso di errore Vai a -1 insieme a Err.Clear:

123456789101112131415161718192021 Sub ErrEsempi()In caso di errore GoTo errHandler:'Errore "Definito dall'applicazione"Errore (13)Esci SottoerrHandler:'Cancella erroreIn caso di errore Vai a -1In caso di errore GoTo errHandler2:'Errore "Tipo non corrispondente"Errore (1034)Esci SottoerrHandler2:Debug.Print Err.DescrizioneFine sottotitolo

In genere, consiglio di utilizzare sempre In caso di errore Vai a -1, a meno che tu non abbia una buona ragione per usarlo Err.Clear Invece.

VBA su errore MsgBox

Potresti anche voler visualizzare una finestra di messaggio in caso di errore. Questo esempio visualizzerà diverse finestre di messaggio a seconda di dove si verifica l'errore:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx()Dim errMsg As StringIn caso di errore GoTo errHandler'Fase 1errMsg = "Si è verificato un errore durante la fase di copia e incolla."'Err.Alza (11)'Fase 2errMsg = "Si è verificato un errore durante la fase di convalida dei dati."'Err.Alza (11)"Fase 3"errMsg = "Si è verificato un errore durante la fase P&L-Building e Copy-Over."Err.Alza (11)'Fase 4'errMsg = "Si è verificato un errore durante il tentativo di registrare l'importazione nella pagina di configurazione"'Err.Alza (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Fine sottotitolo

Qui dovresti sostituire Err.Raise (11) con il tuo codice effettivo.

VBA IsError

Un altro modo per gestire gli errori consiste nel verificarli con la funzione IsError di VBA. La funzione IsError verifica la presenza di errori in un'espressione, restituendo VERO o FALSO se si verifica un errore.

123 Sub IsErrorEx()MsgBox IsError(Range("a7").Value)Fine sottotitolo

Se errore VBA

Puoi anche gestire gli errori in VBA con la funzione IfError di Excel. È necessario accedere alla funzione IfError utilizzando il pulsante Classe di funzione del foglio di lavoro:

1234567 Sub IfErrorEx()Dim n As Longn = WorksheetFunction.IfError(Range("a10").Value, 0)MsgBox nFine sottotitolo

Questo genererà il valore dell'intervallo A10, se il valore è un errore, restituirà invece 0.

Tipi di errore VBA

Errori di runtime

Come sopra:

Errori di runtime VBA sono errori che si verificano durante l'esecuzione del codice. Esempi di errori di runtime includono:

  • Fare riferimento a una cartella di lavoro, un foglio di lavoro o un altro oggetto inesistente
  • Dati non validi es. riferimento a una cella di Excel contenente un errore
  • Tentativo di dividere per zero

È possibile "gestire gli errori" degli errori di runtime utilizzando i metodi discussi sopra.

Errori di sintassi

Errori di sintassi VBA sono errori con la scrittura del codice. Esempi di errori di sintassi includono:

  • Errori ortografici
  • Punteggiatura mancante o errata

L'editor VBA identifica molti errori di sintassi con l'evidenziazione in rosso:

L'editor VBA ha anche un'opzione per "Controllo automatico della sintassi":

Quando questo è selezionato, l'editor VBA genererà una finestra di messaggio che ti avvisa degli errori di sintassi dopo aver inserito una riga di codice:

Personalmente trovo questo estremamente fastidioso e disabilito la funzione.

Errori di compilazione

Prima di tentare di eseguire una procedura, VBA "compilerà" la procedura. La compilazione trasforma il programma dal codice sorgente (che puoi vedere) in forma eseguibile (non puoi vedere).

Errori di compilazione VBA sono errori che impediscono la compilazione del codice.

Un buon esempio di errore di compilazione è una dichiarazione di variabile mancante:

Altri esempi includono:

  • Per privo di Prossimo
  • Selezionare privo di Fine selezione
  • Se privo di Finisci se
  • chiamando un procedura che non esiste

Gli errori di sintassi (sezione precedente) sono un sottoinsieme degli errori di compilazione.

Debug > Compila

Gli errori di compilazione verranno visualizzati quando si tenta di eseguire una procedura. Ma idealmente, identificheresti gli errori di compilazione prima di tentare di eseguire la procedura.

Puoi farlo compilando il progetto in anticipo. Per farlo, vai su Debug > Compila progetto VBA.

Il compilatore "andrà a" il primo errore. Una volta corretto l'errore, compila nuovamente il progetto. Ripetere finché tutti gli errori non sono stati corretti.

Puoi dire che tutti gli errori sono stati corretti perché Compila progetto VBA sarà disattivato:

Errore di overflow

Il Errore di overflow VBA si verifica quando si tenta di inserire un valore in una variabile troppo grande. Per esempio, Variabili intere può contenere solo valori compresi tra -32.768 e 32.768. Se inserisci un valore più grande, riceverai un errore di overflow:

Invece, dovresti usare il Variabile lunga per memorizzare il numero maggiore.

Altri termini di errore VBA

Errore di cattura VBA

A differenza di altri linguaggi di programmazione, in VBA non c'è Dichiarazione di cattura. Tuttavia, puoi replicare una dichiarazione di cattura usando In caso di errore Riprendi Avanti e Se Err.Number 0 Allora. Questo è trattato sopra in Gestione degli errori con Err.Number.

VBA Ignora errore

Per ignorare gli errori in VBA, usa semplicemente il In caso di errore Riprendi Avanti dichiarazione:

1 In caso di errore Riprendi Avanti

Tuttavia, come accennato in precedenza, dovresti fare attenzione a usare questa istruzione in quanto non corregge un errore, semplicemente ignora la riga di codice contenente l'errore.

Errore di lancio VBA / Err.Raise

Per tramite un errore in VBA, usi il Err.Alza metodo.

Questa riga di codice genererà l'errore di runtime '13': Tipo mancata corrispondenza:

1 Err.Alza (13)

Tracciamento errori VBA

Tracciamento errori VBA è solo un altro termine per la gestione degli errori VBA.

Messaggio di errore VBA

UN Messaggio di errore VBA Somiglia a questo:

Quando fai clic su "Debug", vedrai la riga di codice che sta generando l'errore:

Gestione degli errori VBA in un loop

Il modo migliore per gestire gli errori all'interno di un ciclo è usare In caso di errore Riprendi Avanti insieme a Numero errore per rilevare se si è verificato un errore (ricordarsi di usare Err.Clear per cancellare l'errore dopo ogni occorrenza).

L'esempio seguente dividerà due numeri (colonna A per colonna B) e restituirà il risultato nella colonna C. In caso di errore, il risultato sarà 0.

12345678910111213141516 Sottoprova()Cella debole come intervalloIn caso di errore Riprendi AvantiPer ogni cella nell'intervallo ("a1: a10")"Imposta valore cella"cella.Offset(0, 2).Valore = cella.Valore / cella.Offset(0, 1).Valore'Se Cell.Value è Errore, il valore predefinito è 0Se Err.Number 0 Alloracella.Offset(0, 2).Valore = 0Err.ClearFinisci seProssimoFine sottotitolo

Gestione degli errori VBA in Access

Tutti gli esempi precedenti funzionano esattamente allo stesso modo in Access VBA come in Excel VBA.

123456789101112131415161718 Funzione DelRecord (dalla forma)'questa funzione è usata per cancellare un record in una tabella da un formIn caso di errore GoTo finaleCon frSe .NewRecord Then.DisfareEsci dalla funzioneFinisci seTermina conCon frm.RecordsetClone.Segnalibro = frm.Segnalibro.Eliminafrm.RichiestaTermina conEsci dalla funzionefine:FineFine funzione

Aiuterete lo sviluppo del sito, condividere la pagina con i tuoi amici

wave wave wave wave wave