Originariamente inviato da zorro77
esatto
se pensi che mi crea solo prob (come sto vedendo anche io) accetto con enorme piacere altri suggerimenti ;-)
Personalmente sconsiglio questo metodo (early-binding), perchè obbliga ad aggiungere un riferimento ad una versione specifica di Excel, e quando si cambia versione oppure il codice viene eseguito su un computer che ha una versione diversa, non funziona più.
E' sempre meglio usare il 'late-binding' ovvero CreateObject() che funzionerà sempre con qualsiasi versione di Excel installata.
Quindi prima togli il riferimento alla libreria di Excel, poi modifica il codice come sotto (ti riporto le parti salienti):
codice:
'apre excel
Dim excellApp As Object
excellApp = CreateObject("Excel.Application")
' apre il workbook
Dim exWb As Object
exWb = excellApp.Workbooks.Open(strPerc)
' apre il worksheet
Dim exWs As Object
exWs = exWb.Worksheets(1)
'
' codice vario di elaborazione
'
' codice di chiusura
con.Close()
con = Nothing
exWs = Nothing
exWb.Close()
exWb = Nothing
excellApp.Quit()
excellApp = Nothing
Ovviamente, in questo caso, le righe seguenti non hanno più ragione d'essere:
codice:
Catch ex As COMException
MessageBox.Show("Error accessing Excel: " + ex.ToString())
Comunque, nonostante il codice sia corretto, vi sono effettivamente problemi nel rilascio dell'istanza di Excel.
- Apri Gestione Attività e spostalo a destra dello schermo.
- Ora avvia la tua applicazione e, una volta caricato il DataGridView si vede che l'istanza resta 'appesa'.
- Nel DataGridView premi 2 o 3 volte i tasti END e HOME.
- Vedrai che l'istanza sparisce da Gestione attività.
Naturalmente non è un metodo applicabile quindi ecco la soluzione finale:
Aggiungi l'Imports
Imports System.Runtime.InteropServices
Poi aggiungi al codice sopra le parti in blue che riporto sotto:
codice:
excellApp.Quit()
Marshal.ReleaseComObject(excellApp)
excellApp = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
Ora vedrai che in Gestione attività l'istanza viene rilasciata immediatamente.