Exel y vb.net

26/06/2006 - 23:51 por SergioT | Informe spam
Hola

tengo un problema bastante raro con el Excel2003 desde vb.net
instancion una aplicacion excel, un libro y una hoja, luego opero con ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos eso
muestra el Adm de Tareas del XP

mato al excel asi:

miLibro.saveCopyAs(spath)
miLibro.close
miExcel.quit

milibro=nothing
miExcel=nothing
GC.Collect()


Que me falta para matar los procesos???? GRACIASSSSSSS
Salu2
Sergio T.
 

Leer las respuestas

#1 SoftJaén
27/06/2006 - 08:01 | Informe spam
"SergioT" escribió:

tengo un problema bastante raro con el Excel2003 desde vb.net
instancio una aplicacion excel, un libro y una hoja, luego opero con ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos eso
muestra el Adm de Tareas del XP

Que me falta para matar los procesos?



Hola, Sergio:

Si haces una llamada expresa al recolector de elementos no utilizados,
entiendo que en el Administrador de tareas no debería de aparecer el proceso
de Excel, porque de lo contrario, desaparecía el proceso cuando cierres el
formulario o finalice la aplicación. Pero el hecho que llames al método
«Quit» y establezcas a «Nothing» el valor de la variable objeto
«Excel.Application», no significa que EN ESE MISMO INSTANTE se elimine el
proceso.

En Visual Basic clásico, así es como se finaliza el proceso, pero en .NET la
cosa es bastante distinta por la finalización no determinada de la que
disponen los objetos. El establecer un valor a «Nothing» significa que dicha
variable objeto será eliminada del todo por el recolector de elementos no
utilizados, ALGÚN MOMENTO DESPUÉS que haya salido de su ámbito de
visibilidad o se haya establecido expresamente su valor a «Nothing».

Pero como no has expuesto TODO el código que utilizas, o al menos, el tipo
de declaración de objetos y el alcance de los mismos que empleas, pues
ignoro el motivo por el cual no se "mata" el proceso.

A continuación te muestro un ejemplo para manejar una instancia de Excel.
Para ejecutarlo, inicia un nuevo proyecto y haces referencia a la biblioteca
de Microsoft Excel 11.0. Inserta cuatro botones de comando en el formulario
de inicio, abres el editor de código y copia/pega lo siguiente:

Imports Microsoft.Office.Interop

Public Class Form1

Private oApp As Excel.Application ' Objeto Application
Private oWorkBook As Excel.Workbook ' Libro de trabajo

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' Creamos una nueva instancia de Excel
oApp = New Excel.Application

' Creo un nuevo objeto WorkBook
oWorkBook = oApp.Workbooks.Add

MessageBox.Show("Se ha creado la instancia de Excel, " & _
"pero todavía no es visible.")
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

' Establezco el objeto Sheet con la primera hoja activa
Dim oSheet As Excel.Worksheet ' Hoja de trabajo
oSheet = CType(oWorkBook.Sheets(1), Excel.Worksheet)

' Hago visible la aplicación, activando la primera hoja
oApp.Visible = True
oWorkBook.Windows(1).Activate()

' Le doy al usuario el control de la aplicación.
oApp.UserControl = True

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click

' Indico que el libro ya ha sido guardado
oWorkBook.Saved = True

' Cierro el libro
oWorkBook.Close()

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click

' Cerramos Excel
oApp.Quit()
oApp = Nothing

' Aunque no se recomienda, obligamos a que se
' lleve a cabo la recolección de elementos
' no utilizados.
GC.Collect()

' Detenemos el proceso actual hasta que finalice
' el método Collect
GC.WaitForPendingFinalizers()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

With Me
.Button1.Text = "Abrir Excel"
.Button2.Text = "Mostrar Excel"
.Button3.Text = "Cerrar Excel"
.Button4.Text = "Salir de Excel"
End With
End Sub

End Class

Ejecuta el código en el mismo orden que aparece el texto mostrado en los
botones de comando.

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Preguntas similares