elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  No se cierra el proceso excel VB.NET Excel 2007 VS 2010
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No se cierra el proceso excel VB.NET Excel 2007 VS 2010  (Leído 7,620 veces)
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« en: 22 Octubre 2015, 00:46 am »

Hola,

Estoy utilizando un archivo de excel, todo bien simplemente que cuando quiero terminar y/o cerrar el archivo de excel pues no se cierra.

Acá lo asigno
Código
  1.  
  2. objeto_excel = New LibroExcel() 'Crea un nuevo libro
  3.                    objeto_excel.xApplication = New Excel.Application() 'Crea una nueva aplicación
  4.  
  5.                    objeto_excel.xApplication.DisplayAlerts = False
  6.                    objeto_excel.XWorkBook = objeto_excel.xApplication.Workbooks.Open(Arch) 'Realiza una nueva aplicación con un nuevo libro a abrir.
  7.                    objeto_excel.XWorksheet = objeto_excel.XWorkBook.Worksheets.Item(1) 'Asigna la hoja de excel
  8.                    objeto_excel.ficheros = fichero
  9.  
  10.  

Acá lo cierro ( Código forzoso pues no cierra!!!)

Código
  1.  
  2.  
  3. Try
  4.  
  5.            If IsFileOpen(fichero) = False Then
  6.                End
  7.                GC.Collect()
  8.            Else
  9.  
  10.                obj_excel.XWorksheet = Nothing
  11.                GC.Collect()
  12.  
  13.                obj_excel.XWorkBook.Close()
  14.                obj_excel.XWorkBook = Nothing
  15.  
  16.                GC.Collect()
  17.  
  18.                obj_excel.xApplication.Quit()
  19.                obj_excel.xApplication = Nothing
  20.  
  21.                GC.Collect()
  22.  
  23.                obj_excel.ficheros = Nothing
  24.  
  25.                GC.Collect()
  26.  
  27.                releaseObject(obj_excel)
  28.  
  29.                End
  30.            End If
  31.  
  32.        Catch ex As Exception
  33.            MsgBox("Hubo un problema cerrando el programa y/o el archivo.")
  34.            End
  35.        End Try
  36.  
  37.  


Acá la clase libro

Código
  1.  
  2.  Private xlApp As Excel.Application
  3.    Private xlWorksheet As Excel.Worksheet
  4.    Private xlworkbook As Excel.Workbook
  5.    Private fichero As String
  6.  
  7.    'Propiedades accesoras
  8.  
  9.    Public Property xApplication() As Excel.Application
  10.        Get
  11.            Return Me.xlApp
  12.        End Get
  13.        Set(ByVal Value As Excel.Application)
  14.            Me.xlApp = Value
  15.        End Set
  16.    End Property
  17.  
  18.  
  19.    Public Property XWorkBook() As Excel.Workbook
  20.        Get
  21.            Return Me.xlworkbook
  22.        End Get
  23.        Set(ByVal Value As Excel.Workbook)
  24.            Me.xlworkbook = Value
  25.        End Set
  26.    End Property
  27.  
  28.    Public Property XWorksheet() As Excel.Worksheet
  29.        Get
  30.            Return Me.xlWorksheet
  31.        End Get
  32.        Set(ByVal Value As Excel.Worksheet)
  33.            Me.xlWorksheet = Value
  34.        End Set
  35.    End Property
  36.  
  37.    Public Property ficheros() As String
  38.        Get
  39.            Return Me.fichero
  40.        End Get
  41.        Set(ByVal Value As String)
  42.            Me.fichero = Value
  43.        End Set
  44.    End Property
  45.  
  46.  
  47.  








En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #1 en: 22 Octubre 2015, 18:01 pm »

Tengo esta forma pero me vuela todos los exceles y es muy violenta, alguno sabrá de otra manera o que está haciendo mal?

Código
  1.  
  2. Sub KillAllExcels()
  3.  
  4.        Try
  5.  
  6.  
  7.  
  8.            Dim proc As System.Diagnostics.Process
  9.  
  10.  
  11.  
  12.            For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
  13.  
  14.                If proc.MainWindowTitle.Trim.Length = 0 Then
  15.  
  16.                    'proc.GetCurrentProcess.StartInfo
  17.  
  18.                    proc.Kill()
  19.  
  20.                End If
  21.  
  22.            Next
  23.  
  24.        Catch ex As Exception
  25.  
  26.            My.Computer.FileSystem.WriteAllText("C:\errores.log", Format(Now, "01/MM/yyy HH:mm") & " - " & ex.Message & vbCrLf, True)
  27.  
  28.        End Try
  29.  
  30.    End Sub
  31.  


En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #2 en: 22 Octubre 2015, 19:58 pm »

No me manejo con la inter-operabilidad de Office, pero en general lo que estás haciendo es incorrecto, creo que el fallo lo cometes en estas dos órdenes:

Citar
Código
  1. objeto_excel = New LibroExcel() 'Crea un nuevo libro
  2. objeto_excel.xApplication = New Excel.Application() 'Crea una nueva aplicación
  3. objeto_excel.xApplication.DisplayAlerts = False
  4. objeto_excel.XWorkBook = objeto_excel.xApplication.Workbooks.Open(Arch) 'Realiza una nueva aplicación con un nuevo libro a abrir.
  5. objeto_excel.XWorksheet = objeto_excel.XWorkBook.Worksheets.Item(1) 'Asigna la hoja de excel
  6. objeto_excel.ficheros = fichero

Al usar órdenes de ese tipo con llamadas a más de un miembro (referencia.miembro1.miembro2()) estás generando residuos/objetos RCW (Runtime Callable Wrapper) tanto para el primero como para el segundo, y estos deberías liberarlos al terminar con Excel, pero sin una referencia al objeto no puedes liberarlos.



Por ende, la forma en la que se debe trabajar un objeto COM, en tu caso la interop de Office/Excel, sería la siguiente:

Código
  1. Dim excelApp as Excel.Application = objeto_excel.xApplication
  2.  
  3. Dim workbooks As ...? = excelApp.Workbooks
  4. Dim workbook As Excel.Workbook = workbooks.Open(Arch)
  5.  
  6. Dim xWorkBook As Excel.Workbook = excelApp.XWorkBook
  7. Dim worksheets As Excel.Worksheets = xWorkBook.Worksheets
  8. Dim worksheet As Excel.Worksheet = worksheets.Item(1)

Reemplaza "...?" por lo correspondiente, como ya digo yo no uso Office, pero esto es aplicable de forma general.

Una vez hayas corregido eso, guardas los cambios en el archivo y seguidamente cierras de forma normal:
Código
  1. xWorkBook.Save()
  2. xWorkBook.Close(SaveChanges:=False)
  3. excelApp.Quit()

Y por último, liberas los objetos:
Código
  1. Marshal.ReleaseComObject(workbook)
  2. Marshal.ReleaseComObject(workbooks)
  3.  
  4. Marshal.ReleaseComObject(worksheet)
  5. Marshal.ReleaseComObject(worksheets)
  6. Marshal.ReleaseComObject(xWorkBook)
  7.  
  8. Marshal.ReleaseComObject(excelApp)



Citar
Código
  1. Try
  2.    If IsFileOpen(fichero) = False Then
  3.        End
  4.        GC.Collect()
  5.    Else
  6.  
  7.        obj_excel.XWorksheet = Nothing
  8.        GC.Collect()
  9.  
  10.        obj_excel.XWorkBook.Close()
  11.        obj_excel.XWorkBook = Nothing
  12.  
  13.        GC.Collect()
  14.  
  15.        obj_excel.xApplication.Quit()
  16.        obj_excel.xApplication = Nothing
  17.  
  18.        GC.Collect()
  19.  
  20.        obj_excel.ficheros = Nothing
  21.  
  22.        GC.Collect()
  23.  
  24.        releaseObject(obj_excel)
  25.  
  26.        End
  27.    End If
  28.  
  29. Catch ex As Exception
  30.    MsgBox("Hubo un problema cerrando el programa y/o el archivo.")
  31.    End
  32. End Try

Por si no ha quedado claro, ten en cuenta que no debes invocar al GarbageCollector a lo loco como estás haciendo (y hacerlo despues de un "End", ¿en serio para qué? xD), ya que eso no te servirá para nada positivo y menos con código no administrado...

En todo caso prueba así:

Código
  1. Try
  2.    If IsFileOpen(fichero) Then
  3.            xWorkBook.Save()
  4.    xWorkBook.Close(SaveChanges:=False)
  5.    excelApp.Quit()
  6.    End If
  7.  
  8. Catch ex As Exception
  9.    MsgBox("Hubo un problema cerrando el programa y/o el archivo." & Environment.NewLine & ex.toString)
  10.  
  11. Finally
  12. Marshal.ReleaseComObject(workbook)
  13. Marshal.ReleaseComObject(workbooks)
  14. Marshal.ReleaseComObject(worksheet)
  15. Marshal.ReleaseComObject(worksheets)
  16. Marshal.ReleaseComObject(xWorkBook)
  17. Marshal.ReleaseComObject(excelApp)
  18.  
  19.    Me.Close() ' Cierra el Form principal de forma normal... no uses el keyword "End".
  20.  
  21. End Try

Espero que esto te pueda servir para solucionar el problema.

Saludos!



Fuente(s):

« Última modificación: 22 Octubre 2015, 20:36 pm por Eleкtro » En línea

Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #3 en: 22 Octubre 2015, 20:22 pm »

Gracias Elektro, lo probaré y te estaré contando como me fue, muchas gracias por dedicar tiempo a la respuesta.
En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #4 en: 22 Octubre 2015, 23:31 pm »

Elektro no soy de los que molesta por cada nada, solo que le he dado vueltas y no entiendo tu código, viste que lo que utiliza es una clase?, lo que lleno son sus atributos, al final ocupo utilizar ese objeto pues todo el proyecto utiliza ese objeto.

Con respecto al end, ese código es de un botón el cuál es para salir del programa, el END es para salir, talvez el orden esté mal, si lo está pues estoy anuente a recibir opiniones o críticas-


Código
  1.  
  2.  
  3.    Dim excelApp as Excel.Application = objeto_excel.xApplication
  4.  
  5.    Dim workbooks As ...? = excelApp.Workbooks
  6.    Dim workbook As Excel.Workbook = workbooks.Open(Arch)
  7.  
  8.    Dim xWorkBook As Excel.Workbook = excelApp.XWorkBook
  9.    Dim worksheets As Excel.Worksheets = xWorkBook.Worksheets
  10.    Dim worksheet As Excel.Worksheet = worksheets.Item(1)
  11.  
  12.  
En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #5 en: 22 Octubre 2015, 23:40 pm »

Mira agregué esto en el código de la clase LibroExcel pero sigue sin cerrarse :(


Código
  1.  
  2. Public Sub New(ByVal fichero As String)
  3.  
  4.        xlApp = New Excel.Application
  5.  
  6.        xlworkbook = xlApp.Workbooks.Open(fichero)
  7.        xlWorksheet = xlApp.Worksheets.Item(1)
  8.  
  9.    End Sub
  10.  
  11.  
  12.    Public Sub liberar_Excel()
  13.  
  14.  
  15.        xlworkbook.Save()
  16.        xlworkbook.Close()
  17.        xlApp.Quit()
  18.  
  19.  
  20.        Marshal.ReleaseComObject(xlworkbook)
  21.        Marshal.ReleaseComObject(xlWorksheet)
  22.        Marshal.ReleaseComObject(xlApp)
  23.  
  24.  
  25.    End Sub
  26.  
  27.  
  28.  
En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #6 en: 23 Octubre 2015, 00:46 am »

Elektro ya lo logré!!

Este fue el constructor de la clase LibroExcel que utilicé

Código
  1.  
  2. 'Constructores
  3.  
  4.    Public Sub New(ByVal fichero As String)
  5.  
  6.        xlApp = New Excel.Application
  7.  
  8.        xlworkbook = xlApp.Workbooks.Open(fichero)
  9.        xlWorksheet = xlApp.Worksheets.Item(1)
  10.  
  11.  
  12.  
  13.    End Sub
  14.  
  15.  

Acá le asigno el atributo ficheros

Código
  1.  
  2.  
  3.  objeto_excel = New LibroExcel(fichero) 'Crea un nuevo libro
  4.  
  5.  
  6.                    objeto_excel.xApplication.DisplayAlerts = False
  7.                    objeto_excel.ficheros = fichero
  8.  
  9.  



Acá termino el maldito proceso pega -.- (cómo me costó.........)


Código
  1.  
  2.  
  3. Try
  4.  
  5.            If IsFileOpen(fichero) = True Then
  6.  
  7.  
  8.                obj_excel.XWorkBook.Save()
  9.                obj_excel.XWorkBook.Close()
  10.  
  11.  
  12.                obj_excel.xApplication.Workbooks.Close()
  13.                obj_excel.xApplication.Quit()
  14.  
  15.  
  16.                obj_excel.xApplication = Nothing
  17.                obj_excel.XWorkBook = Nothing
  18.                obj_excel.XWorksheet = Nothing
  19.                obj_excel.ficheros = Nothing
  20.  
  21.            Else
  22.  
  23.                releaseObject(obj_excel)
  24.  
  25.            End If
  26.  
  27.        Catch ex As Exception
  28.            MsgBox("Hubo un problema cerrando el programa y/o el archivo.")
  29.        Finally
  30.            End
  31.        End Try
  32.    End Sub
  33.  
  34.  


Agrego que el método file open le hice un cambio, donde no me estaba agarrando el path completo del archivo.

Sugerencias, dudas, críticas estamos a la orden,

GRACIAS ELEKTRO.

En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #7 en: 23 Octubre 2015, 09:42 am »

Cita de: Yaldabaot
no soy de los que molesta por cada nada

Personálmente no creo que molestes, tienes dudas y necesitas respuestas nada más (aunque llego un poco tarde a responderlas xD).



Con respecto al end, ese código es de un botón el cuál es para salir del programa, el END es para salir, talvez el orden esté mal, si lo está pues estoy anuente a recibir opiniones o críticas-

El keyword End es para salir, si, pero mejor dicho es para finalizar la ejecución de la aplicación de forma inmediata o anómala.


No se debería utilizar End sin una razón de peso, en WinForms lo apropiado siempre es cerrar el form principal llamando al método Form.Close (o en su defecto utilizar el método Application.Exit el cual cierra todos los Forms abiertos de forma normal). Si por alguna razón no se cierra, se debe tratar de averiguar el por qué y corregirlo en lugar de ignorarlo por las malas con End.

De todas formas yo te hice aquél comentario entre paréntesis por que si finalizas la ejecución de la app entonces no tiene sentido añadir más instrucciones despues de la orden End simplemente por que no se van a procesar.



no entiendo tu código, viste que lo que utiliza es una clase?, lo que lleno son sus atributos, al final ocupo utilizar ese objeto pues todo el proyecto utiliza ese objeto.

Código
  1.    Dim excelApp as Excel.Application = objeto_excel.xApplication
  2.  
  3.    Dim workbooks As ...? = excelApp.Workbooks
  4.    Dim workbook As Excel.Workbook = workbooks.Open(Arch)
  5.  
  6.    Dim xWorkBook As Excel.Workbook = excelApp.XWorkBook
  7.    Dim worksheets As Excel.Worksheets = xWorkBook.Worksheets
  8.    Dim worksheet As Excel.Worksheet = worksheets.Item(1)
  9.  
  10.  

Con ese código solo intentaba indicarte las referencias que debes manejar por separado (6 objetos distintos), no como debes hacerlo. Obviamente lo deberías adaptar a la estructura que tienes montada en tu class.

Me alegro que lo hayas solucionado, aunque no has seguido esa indicación que hice pero no importa. Solo revisa que en el administrador de tareas realmente no se queda el proceso del excel corriendo de forma "invisible", y si pasa entonces aplica eso que dije.

Saludos
« Última modificación: 23 Octubre 2015, 11:05 am por Eleкtro » En línea

Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: No se cierra el proceso excel VB.NET Excel 2007 VS 2010
« Respuesta #8 en: 23 Octubre 2015, 18:01 pm »

Gracias Elektro, acaté tus recomendaciones, lo que pasa en el caso de lo que me dijiste del código donde me corregiste (y pues tienes razón), estrictamente debo usar esa clase, pues en TODO el proyecto se apoya en ese objeto y sobretodo sus atributos en el caso de xlworkbook, xlworksheet y xlapplication, ficheros también, entonces cuando utilizo ese objeto los demás métodos se apoyen en él, puesto que el archivo excel se encuentra en background y la idea es que apenas se salga de la aplicación el user pues el archivo efectivamente se cierre.

Y si ves bien, si agarré parte de tus recomendaciones, ¿ Cómo no voy a agarrar tus recomendaciones? si eres un GRAN conocedor!. ¿ Y en donde? Pues en la parte del save y saveworkbook, me puse a pensar sobre el cierre abrupto y como sabrás el Excel cuando se cierra de esa manera pues tiene como un respaldo, eso podría también generar que se conserve el excel en memoria, por tanto el guardado le quita esa posibilidad.

Otra recomendación que acaté es el cierre que me dices, considero que es importante no forzar el cierre.


Con respecto al proceso de EXCEL que no se cierra, efectivamente tengo el administrador de tareas casi que a la par mía y del visual studio y pues corroboré que si cierra.

Un saludo, que estés bien.

En línea

Nunca me contestan -_-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
programacion en visual basic.ayuda para importar de excel a excel
Programación Visual Basic
Railil 2 4,261 Último mensaje 20 Junio 2006, 16:08 pm
por Railil
Alertas en Excel 2007
Dudas Generales
Paulitta 7 7,511 Último mensaje 26 Mayo 2010, 18:02 pm
por Paulitta
Excel 2007-2010 Proteccion con password?
Software
3m1 4 3,910 Último mensaje 25 Febrero 2011, 05:26 am
por ISCAOM
Visual Basic en Excel 2007
Programación Visual Basic
EsPrinJorgeCipiante 0 1,546 Último mensaje 22 Diciembre 2013, 22:56 pm
por EsPrinJorgeCipiante
No puedo exportar una tabla de access 2007 a Excel con VB.NET 2010
.NET (C#, VB.NET, ASP)
Yaldabaot 1 4,712 Último mensaje 27 Enero 2015, 15:22 pm
por Yaldabaot
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines