Tipi di errori vba: debug e soluzione

Come qualsiasi altro linguaggio di programmazione, VBA è sfortunato quando si tratta di errori e devi affrontarli qualunque cosa accada. Possono provenire da fonti diverse, come codifica errata, operazioni impossibili (come la divisione per zero) o errori imprevisti.

Il modo migliore per gestire questa situazione è avere una buona comprensione di tutti i possibili risultati che potresti ottenere con il codice. Guarda l’esempio qui sotto in cui abbiamo un codice VBA che calcola la radice quadrata del numero utilizzando il valore che hai nella cella selezionata.

 Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub

Ma se la cella attiva ha un valore diverso da un numero, riceverai un errore di runtime, come di seguito.

errore di esecuzione

Parametri di errore in VBA (cattura degli errori)

Nell’opzione VBA, puoi configurare l’impostazione per gestire gli errori prima di iniziare a scrivere i codici. Per aprire le impostazioni VBA, vai su Strumenti ➤ Opzioni ➤ Generale ➤ Rilevamento errori. Qui hai tre opzioni che puoi utilizzare.

  • Interrompi su tutti gli errori : se hai abilitato questa opzione, VBA interromperà il codice per tutti i tipi di errori anche se hai utilizzato tutti i tipi di tecniche di gestione degli errori.
  • Modulo classe manomissione : con questa opzione, VBA fermerà tutti i tuoi codici che non vengono gestiti da alcuna tecnica. E se usi oggetti come Userforms, si inserirà anche in quegli oggetti ed evidenzierà la riga esatta in cui si trova l’errore.
  • Interruzione per errori non gestiti : questa è l’impostazione predefinita che ti aiuta a conoscere tutti gli errori per i quali non stai utilizzando tecniche di gestione degli errori e interrompe il codice per tutti gli errori non gestiti. (Ma, se usi 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).

Tipi di errori VBA

Per comprendere gli errori VBA, puoi dividerli in quattro categorie e di seguito è riportata la spiegazione di questi tipi di errori.

1. Errori di sintassi

Durante la scrittura del codice VBA, devi seguire una particolare sintassi e quando la ignori o non la scrivi come dovrebbe, potresti riscontrare un errore di SINTASSI (noto anche come errore di lingua). È come gli errori di battitura che fai mentre scrivi i tuoi codici.

Bene, VBA ti aiuta segnalando questi errori visualizzando un messaggio di errore. Devi solo assicurarti che “Controllo automatico della sintassi” sia abilitato nel tuo editor VB.

Vai su Strumento ➤ Opzioni e assicurati di selezionare la casella “Controllo automatico della sintassi”. Con questo, ogni volta che si commette un errore di SINTASSI, VBA visualizza un messaggio di errore.

Ma se “Controllo automatico della sintassi” è disabilitato, VBA evidenzia comunque la riga di codice con l’errore ma non visualizza il messaggio di errore.

2. Errori di compilazione

Ciò accade quando si scrive codice per eseguire un’attività, ma tale attività non è valida o non può essere eseguita da VBA. L’esempio migliore è quando hai del codice che utilizza l’istruzione IF ma non hai aggiunto END IF alla fine dell’istruzione e ora quando esegui questo VBA mostri un messaggio di errore di compilazione.

Oltre a questo, ci sono altri esempi di errori di compilazione:

  • Utilizzo di For senza Next ( For Next ).
  • Selezionare senza selezionare la fine ( Seleziona caso ).
  • Non dichiarare una variabile quando hai abilitato “ Opzione esplicita ”.
  • Chiamare una sottofunzione/funzione che non esiste.

3. Errori di runtime

Si verifica un errore di runtime quando il codice viene eseguito. Ricorda l’esempio che ho condiviso con te sopra quando il codice calcolava la radice quadrata di un numero.

Quando si verifica un errore di runtime durante l’esecuzione del codice, interrompe il codice e mostra la finestra di dialogo di errore e questa finestra di errore parla della natura dell’errore riscontrato. Supponiamo che tu abbia scritto codice che apre una cartella di lavoro dalla posizione specificata, ma che la cartella di lavoro viene ora spostata o eliminata da qualcuno.

Pertanto, quando esegui il codice, VBA ti mostrerà un errore di runtime perché non riesce a trovare questo file in questa posizione. Il messaggio che ricevi in un errore di runtime descrive il motivo che ti aiuta a capire il motivo dell’errore.

E quando si verifica un errore di runtime, interrompe l’esecuzione del codice. Se fai clic sul pulsante “Debug”, ti mostra la riga di codice che contiene questo errore evidenziandola in giallo. Oppure puoi fare clic sul pulsante “Fine” per interrompere l’esecuzione del codice e chiudere il messaggio di errore.

4. Errore logico

Questo non è un errore ma un errore durante la scrittura del codice. Questi tipi di errori a volte possono causare problemi durante la loro individuazione e correzione.

Supponiamo che tu stia scrivendo del codice e quando dichiari una variabile usi il tipo di dati sbagliato o hai usato i passaggi di calcolo sbagliati. In questo caso il tuo codice funzionerà bene e non troverai facilmente questo errore. Il modo migliore per affrontare questo tipo di problema è eseguire ciascuna riga di codice una per una.

Utilizzo degli strumenti di debug in VBA

VBA ti fornisce una serie di strumenti per eseguire il debug del tuo codice e rimuovere bug dai tuoi codici.

1. Compilare il progetto VBA

In Visual Basic Editor è disponibile un’opzione che puoi utilizzare immediatamente dopo aver terminato il codice. Queste opzioni di compilazione analizzano ogni riga del codice e visualizzano una finestra di messaggio se è presente un errore nel codice.

Nota: l’opzione Compila VBA tiene traccia solo degli errori di sintassi e di compilazione, non degli errori di runtime, poiché questi errori si verificano solo durante l’esecuzione di un codice. Per utilizzare Compila progetto VBA, vai a ➤ Debug ➤ Compila progetto VBA.

Una volta eseguito “Compile VBA Project” e non sono presenti errori nel codice, le opzioni saranno disattivate.

2. Esegui ciascuna riga di codice una per una

Ecco come lo faccio. Quando completo un codice, lo eseguo semplicemente riga per riga per verificare se c’è un errore. Questo potrebbe richiedere tempo, ma ti aiuta a risolvere tutti gli errori (sintassi, compilazione ed esecuzione).

Sulla “Barra degli strumenti Debug” è presente un pulsante “Passa in avanti” che puoi utilizzare per eseguire il codice riga per riga oppure puoi semplicemente premere F8 per eseguire una singola riga e quindi premerlo di nuovo per eseguire la riga successiva nel codice.

Utilizzo dell’istruzione “On ERROR” per gestire gli errori VBA

È importante controllare i tuoi codici e trovare possibili errori in tutti i metodi di debug che hai a disposizione. Ma il modo migliore e più efficiente è creare istruzioni di gestione degli errori in grado di gestire un errore e rendere il codice impeccabile una volta eseguito. Esploriamo queste affermazioni. Quando si verifica un errore in un codice VBA, il modo migliore per gestire questo errore può essere:

  • Lascia che VBA ignori l’errore ed esegua il codice
  • Lascia che uno speciale set di istruzioni venga eseguito quando si verifica un errore.

In entrambe le soluzioni è possibile utilizzare le istruzioni “On Error”. Di seguito sono riportate quattro dichiarazioni “On Error” che è possibile utilizzare. E ora diamo un’occhiata a ciascuna affermazione una per una.

1. Se commetti un errore, ricomincia

Questa semplice riga di codice consente a VBA di continuare l’esecuzione del codice nonostante si verifichi un errore. L’IDEA è semplice: passare alla riga successiva di codice se viene rilevato un errore in qualsiasi punto durante l’esecuzione.

Nel codice seguente, hai due righe di codice:

  • La prima riga indica che il valore nella cella A1 è 25 diviso 0
  • E la seconda riga dice che il valore della cella A2 è 10 diviso 5

Ora c’è un problema con il codice che hai online. Come sai, se dividi qualcosa per 0, il risultato sarà un errore. Pertanto, quando si esegue questo codice, VBA visualizza un messaggio di errore “Errore di runtime ’11’ Divide per zero” e interrompe l’esecuzione.

Ma quando aggiungi “On Error Resume Next” all’inizio del codice ed esegui il codice, VBA ignora semplicemente la riga di codice in cui si verifica l’errore e continua con la seconda riga e aggiunge quel valore nella cella A2.

 Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub

Pertanto, ogni volta che desideri che il tuo codice venga eseguito nonostante un errore si verifichi ovunque, utilizza semplicemente l’istruzione “On Error Resume Next” nel tuo codice.

Ma c’è un’altra cosa che dovresti notare: ignorerà solo gli errori che si verificano in seguito.

Supponiamo che si verifichi un errore alla riga 5 e tu abbia aggiunto “On Error Resume Next” alla riga 8, questo errore non verrà saltato. Quindi, il modo migliore è aggiungerlo come prima riga di codice nella procedura.

2. In caso di errore GoTo 0

Questo è il comportamento predefinito di VBA che quando si verifica un errore, interrompe l’esecuzione del codice.

Bene, l’utilizzo di “On Error GoTo 0″ non fa alcuna differenza nel codice. VBA interromperà semplicemente il codice e visualizzerà un messaggio con una descrizione dell’errore. Allora perché dovrei preoccuparmi di usarlo? Domanda intelligente. Usiamo l’esempio che hai usato sopra in ” On Error Resume Next “.

In questo codice, ogni volta che si verifica un errore, VBA prende la riga di codice successiva e la esegue e non vedrai alcun messaggio di errore. Ma supponiamo che tu abbia più righe nel codice e non desideri superare tali righe se è presente un errore nel codice.

Pertanto, se inserisci “On Error GoTo 0” dopo la seconda riga di codice, verrà ripristinato il gestore errori predefinito di VBA che visualizza messaggi di errore ogni volta che si verifica un errore.

3. In caso di errore GoTo [Etichetta]

Pensa a un posto all’interno di un edificio in cui puoi recarti in caso di emergenza. Allo stesso modo, utilizzando “On Error GoTo [Label]”, puoi semplicemente creare un blocco di codice separato nel codice principale per gestire un errore.

In effetti, “On Error GoTo [Label]” è un modo molto migliore e più conveniente per gestire gli errori. Nel codice seguente hai “On Error GoTo Oh!” Error” ora in questa riga della dichiarazione, la parola “Oh!” Errore” è l’etichetta.

Se guardi la fine del codice in cui hai un inizio specifico con il nome dell’etichetta e poi un codice per una finestra di messaggio con un messaggio sul codice.

Ora cosa succede se si verifica un errore, VBA salterà all’etichetta “Oh! Error” ed eseguirà il blocco di codice che hai dopo quell’etichetta.

Ma c’è una cosa di cui devi occuparti: se non si verifica un errore, verrà eseguita l’etichetta che hai nel tuo codice. Ci sono due cose che devi fare:

  • Innanzitutto, assicurati di aggiungere il tag di errore alla fine del codice.
  • In secondo luogo, aggiungi un “Exit Sub” prima dell’etichetta di errore.

In questo modo trarrai vantaggio in entrambe le situazioni. Diciamo che se si verifica un errore e VBA passa all’etichetta specificata, ci sarà solo il codice dell’etichetta stessa da codificare. E se non si verifica un errore, l’istruzione “Exit Sub” che hai prima dell’etichetta uscirà dalla procedura senza eseguire l’etichetta di errore.

4. In caso di errore GoTo -1

Prima di entrare in questo argomento, lasciami condividere qualcosa con te. Quando si verifica un errore in un codice, VBA memorizza questo registro degli errori nella sua memoria e lo cancella solo al termine della routine.

Oh VBA! Vivi nel presente

Per gestire il secondo errore nel codice VBA, è necessario cancellare il primo errore dalla memoria VBA. Nel codice seguente sono presenti due istruzioni “On Error GoTo [Label]” che gestiscono gli errori da due diversi blocchi di codice.

Ma se esegui questo codice, quando viene visualizzato il secondo errore, VBA non passerà all’etichetta impostata e mostrerà invece il messaggio di errore “Tipo non corrispondente”.

 Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Per risolvere questo problema, puoi utilizzare “On Error GoTo -1” che consente a VBA di rimuovere l’errore corrente dalla sua memoria.

 Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Ora, quando esegui questo codice, “On Error GoTo -1” rimuove l’errore dalla memoria e VBA gestisce l’errore nella seconda istruzione come desiderato.

Cos’altro devo sapere per gestire gli errori in VBA?

Oltre a utilizzare le tecniche di gestione degli errori, ci sono alcune altre cose che puoi utilizzare per gestire meglio gli errori.

Errore oggetto

Quando si è verificato un errore durante l’esecuzione del codice, è possibile utilizzare l’oggetto Err per ottenere dettagli sull’errore. Sono disponibili alcune proprietà e metodi che è possibile utilizzare con l’oggetto Err. Impariamoli uno per uno.

Proprietà

Ecco le proprietà che puoi utilizzare con l’oggetto Err:

  • Err.Number : quando si verifica un errore, un numero viene memorizzato nell’oggetto Err. Nel codice seguente, quando si verifica, la finestra di messaggio visualizza il numero di errore.
  • Err.Description : questa proprietà visualizza la descrizione dell’errore che può aiutare a comprenderne il motivo.
  • Err.Source: questa proprietà indica in quale progetto si è verificato l’errore.
  • Err.HelpContext: questa proprietà restituisce l’ID del contesto della guida per l’errore nel file della guida.
  • Err.HelpContext: questo è un valore stringa per il percorso del file della Guida.

Normalmente, quando si gestiscono errori utilizzando tecniche di gestione degli errori, non si utilizza molto l’oggetto Err nei codici. Ma di seguito è riportato un semplice esempio per utilizzarlo.

 Sub Square_Root() On Error GoTo myError1    Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1:    MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _                "Error Number: " & Err.Number  & vbCrLf & _                "Error Description: " & Err.Description End Sub

Quando si esegue il codice precedente e se si è verificato un errore, verrà visualizzata una finestra di messaggio con il numero e la descrizione dell’errore.

Metodi

Con Err Object puoi anche utilizzare due metodi.

  • Err.Clear: questo metodo cancella il numero di errore e la descrizione dell’errore dalla memoria VBA (questo è diverso da “On Error GoTo -1” perché non ripristina completamente l’errore).
  • Err.Raise: con questo metodo puoi generare intenzionalmente un errore di runtime nel tuo codice, ed ecco la sintassi da seguire:

Err .Raise [numero], [fonte], [descrizione], [file della guida], [contesto della guida]

Suggerimenti rapidi sulla gestione degli errori

Ecco alcuni suggerimenti rapidi che puoi utilizzare per gestire meglio gli errori VBA.

  • Utilizza “On Error Resume Next” solo quando sei sicuro che si sta verificando un errore ed è accettabile saltare la riga di codice con un errore ed è sicuro passare alla riga successiva.
  • Il modo migliore per gestire gli errori di runtime è utilizzare “Gestore errori” con “On Error GoTo [Label]”. Ciò garantisce che ogni volta che si verifica l’errore, riceverai una notifica, ma non verrà visualizzato quel brutto messaggio di errore.
  • Ogni volta che utilizzi il gestore degli errori, assicurati di utilizzare prima “Exit Sub”.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *