maurogsc.eu
mauro gamberini


home ==> Excel: articoli ==> Programmazione ad oggetti - Correggere un errore ricorsivo

Programmazione ad oggetti - Correggere un errore ricorsivo

Situazione.
Utilizzando correttamente la programmazione ad oggetti propria di Excel, potremmo imbatterci in un errore ricorsivo dato dalla mancata presenza dell'oggetto stesso. Vediamo come correggere l'errore.

Nota.
Il codice è fornito *così come è* e l’autore declina ogni responsabilità su eventuali problemi causati dal codice se usato impropriamente. Utilizzate gli esempi forniti o files di test per le vostre prove. Codice è stato testato con(e quindi valido per) Excel 2000/Xp(2002)/2003/2007/2010.

Oggetti non trovati e errore ricorsivo.
ATTENZIONE. Il codice produce un errore ricorsivo dal quale non è possibile uscire se non chiudendo Excel. Inserire un punto di interruzione dove segnalato se si vuole utilizzarlo.

 ALT+F11 e siamo nell’editor del Visual Basic. Cominciamo con inserire un modulo standard nel nostro progetto(Inserisci-->Modulo).
Questo il codice da inserire nel nostro modulo di codice:

Public Sub m_1()

    Dim wk As Workbook

On Error GoTo RigaErrore

    Set wk = Workbooks("C:\xyz.xls")
    'codice

RigaChiusura:
    wk.Close  '<<===punto di interruzione su questa riga
    Set wk = Nothing
    Exit Sub

RigaErrore:
    MsgBox Err.Description
    Resume RigaChiusura

End Sub

Public Sub m_2()

    Dim sh As Worksheet

On Error GoTo RigaErrore

    Set sh = ThisWorkbook.Worksheets("Foglio10")
    'codice

RigaChiusura:
    sh.Range("A1:A10").Clear '<<===punto di interruzione su questa riga
    Set sh = Nothing
    Exit Sub

RigaErrore:
    MsgBox Err.Description
    Resume RigaChiusura

End Sub

La macro m_1 mette un riferimento ad un Workbook che dovrebbe essere presente nel disco C: e la macro m_2 mette un riferimento al Foglio10 del Workbook che la contiene. In entrambi i casi gli oggetti non sono presenti e quindi si scatena un errore ed il codice salta a RigaErrore. Dopo la descrizione dell'errore, l'istruzione Resume RigaChiusura riporta il codice alla RigaChiusura. Nel primo caso si cerca di chiudere un Workbook al quale la variabile wk non punta(abbiamo detto che il Workbook non è presente nel disco C:); nel secondo caso cerca di fare il Clear di un Range di celle di un foglio(il Foglio10) non presente nel Workbook e quindi abbiamo un nuovo errore. L'errore ci riporta a RigaErrore, quindi abbiamo il MessageBox e nuovamente il Resume RigaChiusura scatena gli errori visti in precedenza, e così via all'infinito...

Oggetti non trovati ma errore risolto.
Tralasciando la possibilità di intercettare in altro modo l'errore relativo al Workbook non presente, il codice che consente di non scatenare un errore ricorsivo se l'oggetto non è presente nei due casi visti in precedenza è :

Public Sub m_3()

    Dim wk As Workbook

On Error GoTo RigaErrore

    Set wk = Workbooks("C:\xyz.xls")
    'codice

RigaChiusura:
    If Not wk Is Nothing Then
        wk.Close
    End If
    Set wk = Nothing
    Exit Sub

RigaErrore:
    MsgBox Err.Description
    Resume RigaChiusura

End Sub

Public Sub m_4()

    Dim sh As Worksheet
    
On Error GoTo RigaErrore
    
    Set sh = ThisWorkbook.Worksheets("Foglio10")
    'codice
    
RigaChiusura:
    If Not sh Is Nothing Then
        sh.Range("A1:A10").Clear
    End If
    Set sh = Nothing
    Exit Sub
    
RigaErrore:
    MsgBox Err.Description
    Resume RigaChiusura
    
End Sub

In entrambi i casi controlliamo l'esistenza del riferimento all'oggetto.  Se il riferimento è presente, eseguiamo la chiusura del file in m_3 e la pulizia del Range in m_4, altrimenti saltiamo l'istruzione, puliamo la memoria e chiudiamo la routine. La stessa cosa vale per qualsiasi oggetto:

Public Sub m_5()

    Dim sh As Worksheet
    Dim rng As Range

On Error GoTo RigaErrore

    Set sh = ThisWorkbook.Worksheets("Foglio1")
    With sh
        Set rng = .Range("A1:A10")
    End With

RigaChiusura:
    If Not rng Is Nothing Then
        rng.Clear
    Else
        MsgBox "Nessun Set per rng."
    End If
    Set rng = Nothing
    Set sh = Nothing
    Exit Sub

RigaErrore:
    MsgBox Err.Description
    Resume RigaChiusura

End Sub

Nella macro m_5 valutiamo se rng punta a qualche riferimento. Commentando la riga:

Set rng = .Range("A1:A10")

ed eseguendo il passo passo(F8) vediamo come l'istruzione If in mancanza di riferimento ad un oggetto Range eviti l'errore e gestisca l'eventuale Clear del Range.

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 05/09/2011 - mauro gamberini