PDA

Visualizza la versione completa : Proprietà Range di oggetti Excel


darkblOOd
25-06-2002, 19:42
allora, inserisco nella mia applicazione un riferimento all'oggetto COM di Excel, mi creo Applicazione, WorkBook, WorkSheet e comincio lavorare. Mi spiegate perchè se uso la proprietà Range dell'oggetto WorkSheet per modificare alcune celle quando chiudo tutti gli oggetti mi rimane un riferimento in memoria dell'istanza di excel? :nonlodire

Premetto:

Salvo il foglio (che mi viene visualizzato correttamente, così come l'ho creato da codice)

Chiudo correttamente ogni singolo oggetto in ordine

Li setto a nothing

Ma lui se ne sbatte :cry: .


Ho forzato anche la garbage collection (VB.NET) ma niente, se elimino la riga di codice che mi imposta, per esempio, un range di celle con il font bold e funziona correttamente. Uso il range di celle e mi resta in memoria l'istanza

va bene anche un solo conforto morale

:esaurito:

Drocchia
25-06-2002, 20:15
McAuriel V ma tu mi sembra che rombi un po' troppo...per caso sei un cristiano convintissimoooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo??

ogni volta che uno scrive una parolaccia tu dici:


le parolacce...


non si scrivono!

per questo.. niente risposta


ma smettila siamo nel 2002

darkblOOd
25-06-2002, 20:17
INCREDIBILE! :eek:

ho capito cos'è che non gli garba!

Se faccio riferimento ad un range di celle così:


xlWorkSheet.Range("A1","B10").Font.Bold=True

allora funziona (nel senso che quando chiudo mi scarica il processo dalla memoria, mentre se mi azzardo aparametrizzare tipo


Dim Riga as Integer = 9
xlWorkSheet.Range("A1","B" & Riga+1).Font.Bold=True


mi rimane il processo in memoria! :eek:

Cmq devo capire il perchè, non è possibile, altrimenti scrivo a Bill direttamente! :jam:

@ McAuriel:
Parolacce a parte cosa mi avresti risposto? :dottò:
(ammesso che avevi una risposta valida)

vonkranz
25-06-2002, 20:31
OH My God! come faro' a rispondere in un 3d con sto' titolo!

:tiratadorecchie:


Hai provato a creare due stringhe con le coordinate delle celle e poi passarle al metodo range?
in questo senso intendo:


Dim Riga as Integer = 9
dim X as string
dim Y as string
X="A1"
Y="B" & cstr(Riga+1)
xlWorkSheet.Range(x,y).Font.Bold=True

oppure


Dim Riga as Integer = 9
xlWorkSheet.Range("A1","B" & cstr(Riga+1)).Font.Bold=True

darkblOOd
26-06-2002, 11:55
vonkranz è bestiale, non riesco a capire da cosa possa dipendere.

QUALSIASI forma parametrizzata utilizzo mi resta il processo in memoria!

Ho provato di tutto, anche quello che mi hai suggerito, ma niente da fare!

non capisco cosa possa condizionare così l'applicazione.....

Aspettiamo il lampo và

:cry:

vonkranz
26-06-2002, 12:42
Che versione di Excel usi?

Era capitata anche a me una cosa del genere (XL 97) ma mettendo a nothing tutti gli oggetti era andata a posto.

Cmq se viene generato un errore imprevisto (soprattutto in Debug) o se viene interrotto in modo anomalo, l'istanza di XL resta in memoria anche se riesci a vederla sono con il TaskManager (hai notato che sembra "sospesa nel limbo": non e' attivabile, non ci puoi switchare sopra..... boh? e' li' e basta! ).

E provare a rancarla via con qualche API?
Se l'API ti trova il processo attivo, forse riesci anche a terminarlo.
Se l'API non lo trova, forse la visualizzazione e' soltanto un errore del TaskManager.

darkblOOd
26-06-2002, 12:53
la versione di excel è la 2002 (Office XP) ma non dovrebbe essere rilevante.

Il processo lo vedo nel task manager ma l'applicazione non mi da nessun errore.

Se provo ad aprire excel mi resta in loop senza aprirsi finche non termino il processo.
Sarebbe assurdo chiamare una API per terminare il processo, DEVE chiuderlo da programma!

La cosa che non capisco è perchè se NON parametrizzo la chiamata funziona tutto e se la parametrizzo mi resta il processo in memoria?

Fai conto che chiamo la Garbage Collection appena termino il lavoro ma non cambia nulla.

Se chiudo l'applicazione, il processo viene scaricato (cosa che non faceva VB6, ma evidentemente hanno ottimizzato la gestione della memoria in VB.NET)

darkblOOd
26-06-2002, 13:00
tu come lo interpreti?



Option Strict On
Option Explicit On

...

Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlWS As Excel.Worksheet

...

Sub TestDataSet()
Me.Cursor = Cursors.WaitCursor

'instanzio l'oggetto
xlApp = New Excel.Application()
xlApp.Visible = False
xlApp.DisplayAlerts = False

'creo il WorkBook
xlWB = xlApp.Workbooks.Add

'creo il WorkSheet
xlWS = CType(xlWB.ActiveSheet, Excel.Worksheet)

'riempio il dataset con i valori della tabella
SqlDataAdapter1.Fill(Me.DataSet11)

'scrivo le celle con i valori del dataset
Dim riga As Integer = 0
For riga = 0 To Me.DataSet11.Articoli.Rows.Count - 1
xlWS.Cells(riga + 1, 1) = Me.DataSet11.Articoli(riga).CodArt
xlWS.Cells(riga + 1, 2) = Me.DataSet11.Articoli(riga).DescArt
xlWS.Cells(riga + 1, 3) = Me.DataSet11.Articoli(riga).DataA
xlWS.Cells(riga + 1, 4) = Me.DataSet11.Articoli(riga).Prezzo
Next riga

'non funziona
'Dim x, y As String
'x = "A1" : y = "D" & riga + 1
'xlWS.Range(x, y).Font.Bold = True

'non funziona
'xlWS.Range("A1", "D" & riga + 1).Font.Bold = True

'funziona
xlWS.Range("A1", "D4").Font.Bold = True

xlWB.Close(True, "c:\test1.xls")
xlWS = Nothing
xlWB = Nothing
xlApp.Quit()
xlApp = Nothing

'Chiamo la Garbage Collection
GC.Collect()
Me.Cursor = Cursors.Default
Beep()
End Sub


Considera che ho anche provato il codice che mi hai postato

Mah!?!?

vonkranz
26-06-2002, 15:26
Prova a mettere le dichiarazioni


Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlWS As Excel.Worksheet


all'interno della Sub TestDataSet.

Forse istanziando in modo ritardato fa qualche casino con i riferimenti in memoria, e al momento dell'impostazione a Nothing non riesce a risolvere l'assegnazione.

Secondo me lo stesso discorso vale per il passaggio "secco" dei parametri (attraverso l'assegnazione a variabili rientriamo nel discorso di cui sopra per via dei puntatori alle locazioni delle variabili).

Oppure + semplicemente ti resta attivo qualche oggetto collegato ai vari Application, WorkBook, WorkSheet ecc. ecc. (anche se non mi pare :( )

Visto cosi' il codice che hai postato va + che bene.
Hai provato anche con:



xlWS.Range("A1", "D" & Cstr(riga + 1)).Font.Bold = True

darkblOOd
26-06-2002, 16:47
porca pupazza! niente da fare!

:(

Loading