maurogsc.eu
|
![]() |
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