cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 2018
-
5 oct. 2007 à 22:51
steph01190
Messages postés1Date d'inscriptionmardi 7 avril 2009StatutMembreDernière intervention29 avril 2009
-
29 avril 2009 à 10:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
steph01190
Messages postés1Date d'inscriptionmardi 7 avril 2009StatutMembreDernière intervention29 avril 20093 29 avril 2009 à 10:07
Bonjour à tous, la solution pour fermer un processus excel activé n'est elle pas de faire un app.save avant de fermer et libérer la mémoire (code moins lourd que de chercher et détruire l'ID du processus lancé) ?
Ouggada
Messages postés38Date d'inscriptiondimanche 24 décembre 2000StatutMembreDernière intervention 4 mars 2009 18 févr. 2009 à 14:49
nikel chrome méga chrome!!
c'est le top!!!
comment je suis content de trouver ce que je cherche!!!
MMeeeerrrkkiiiii!!!
simodel
Messages postés38Date d'inscriptionvendredi 29 février 2008StatutMembreDernière intervention19 juin 2009 11 févr. 2009 à 11:57
salut tt le monde j'ai un vrai souci, je n'arrive pas à faire pareil sous VB6
c'est à dire dénicher l'ID du processus Excel delaissé dans la mémoire après fermeture d'EXCEL et le tuer sans toucher aux autres sessions Excel ouvertes.
Je vous remercie par avance
mitsh666
Messages postés46Date d'inscriptiondimanche 10 octobre 2004StatutMembreDernière intervention13 juin 20081 9 janv. 2008 à 15:45
hello,
j'ai pas tout lu en détail, mais la façon la plus propre de fermer excel me semble la suivante. Elle ne tue AUCUN processus et elle est courte. Il faut mettre à jour le Garbage Collector après avoir quitter l'application et effacer l'objet.
diampa
Messages postés3Date d'inscriptionsamedi 17 février 2007StatutMembreDernière intervention30 octobre 2007 30 oct. 2007 à 15:40
Très bien ton code et Vraiment merci car je lutte vraiment contre ce phenomène.
Dieu merci.
Ton code est vraiment impécable voici comment je l'ai adapter à mon projet
Module Module1
'Public oExcelApp As New MSExcelApp
Public sEnft As Byte
Public appExcel As Excel.Application
' Déclarations pour classeur Excel
Public Classeur As Excel.Workbook
Public Feuil1 As Excel.Worksheet, Feuil2 As Excel.Worksheet, Feuil3 As Excel.Worksheet
Public Feuil4 As Excel.Worksheet, Feuil5 As Excel.Worksheet, Feuil6 As Excel.Worksheet
Public Feuil7 As Excel.Worksheet
'Public NomClasseur As String = "C:\GeStocks\BD.xls"
Public myIDExcel As Int16
Public Sub OuvrirClasseur()
'L'idée ici est de récupérer la liste d'ID des process qui tournent sur le PC. On recupère la
'liste avant de faire un New et on recupère la liste après avoir fait le New. Ainci il ne reste
'plus qu'à faire la différence des 2 listes grâce à la fonction ExtractID(,) pour retrouver le
'bon ID de notre process Excel. Il ne reste plus qu'à la killer une fois notre application
'terminée.
'Première liste
Dim intFirstExcelIDs() As Int16 = ListID()
'Création de notre objet et attribution de l'ID
'Seconde liste
Try
appExcel = CType(CreateObject("Excel.Application"), Excel.Application)
'Ouverture d'un fichier Excel
'xlApp.Workbooks.Open(NomClasseur)
Catch ex As Exception
MsgBox("***** IMPOSSIBLE D'OUVRIR LE FICHIER EXCEL *****")
End Try
Dim intLastExcelIDs() As Int16 = ListID()
'Différence des 2 listes et récupération de notre ID
myIDExcel = ExtractID(intFirstExcelIDs, intLastExcelIDs)
End Sub
'Public Sub FermerClasseur()
' Fermeture du classeur
' Try
' Classeur.Save()
' Classeur.Save()
' Classeur.Close() 'Fermeture du classeur Excel
' appExcel.Quit() 'Fermeture de l'application Excel
'Désallocation(mémoire)
' Feuil1 = Nothing
' Feuil2 = Nothing
' Feuil3 = Nothing
' Feuil4 = Nothing
' Feuil5 = Nothing
' Feuil6 = Nothing
' Feuil7 = Nothing
' Classeur = Nothing
' appExcel = Nothing
'Catch ex As Exception
' End Try
' End Sub
Public Function ListID() As Int16()
Dim Processes As Process() = Nothing
Processes = Process.GetProcessesByName("EXCEL")
' Load ID Processes in Array
Dim intProcesses(Processes.GetUpperBound(0)) As Int16
Dim i As Int16
For i = 0 To Processes.GetUpperBound(0)
intProcesses(i) = CInt(Processes(i).Id.ToString)
Next
Return intProcesses
End Function
Public Function ExtractID(ByVal intFirstIDs As Int16(), ByVal intLastIDs As Int16()) As Int16
Dim intID As Int16 = Nothing
Dim intID_FirsList As Int16 = Nothing
Dim intID_LastList As Int16 = Nothing
Dim i As Int16 = Nothing
For i = 0 To intLastIDs.GetUpperBound(0)
intID_LastList = intLastIDs(i)
If Array.IndexOf(intFirstIDs, intID_LastList) = -1 Then
intID = intID_LastList
Exit For
End If
Next
Return intID
End Function
Public Sub FermerClasseur(ByVal intIDExcel As Int16)
If intIDExcel <> 0 Then
If Process.GetProcessById(intIDExcel).HasExited = False Then
Try
Process.GetProcessById(intIDExcel).Kill()
intIDExcel = 0
Catch ex As Exception
MessageBox.Show(ex.Message & ex.StackTrace, "Error while closing Excel integration.", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End If
End Sub
End Module
Kornebrume
Messages postés35Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention10 avril 2008 29 oct. 2007 à 14:18
Et bien tu utilises la méthode que j'ai utilisé.
Tu établis la liste des des processus actifs grâce à la fonction ListID().
Ensuite tu crées ton appli Excel : xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
Tu établis une seconde liste des processus actifs avec la fonction ListID()
La fonction retourne un tableau d'ID. Tu compares donc les 2 tableaux grâce à la fonction : ExtractID()
Il ne te reste plus qu'à faire ce que tu veux avec ton Excel.
Une fois terminé, tu peux fermer ton application Excel en tuant le processus grâce à la fonction : closeExcelFile()
Copier/coller des fonctions ci-dessus, çà fonctionne tout seul. Même si ce n'est pas hyper-propre, c'est le seul moyen de terminer le processus.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 26 oct. 2007 à 19:47
à mince !
et du coup tu conseils quoi ?
Kornebrume
Messages postés35Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention10 avril 2008 26 oct. 2007 à 17:40
Du moment que l'objet de l'appli est détruit, elle doit théoriquement disparaître des processus actifs dans le gestionnaire.
A l'époque où j'ai testé ce genre de méthode, l'appli disparaissait du gestionnaire des tâches mais le processus était toujours actif (stocké en ram), il me fallait donc tuer le processus même si l'application était toujours fermée d'où la méthode pour récupérer l'ID du processus.
Attention : application != processus. Excel peut très bien être fermé et le processus toujours actif et donc gourmand en ressource.
Cdt.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 24 oct. 2007 à 18:06
donc pour Kornebrume j'ai envie de dire YEP ! ca roule ^^
enfin attendons les réactions des sachants ;)
++
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 24 oct. 2007 à 18:05
salut , question de noob ^^ sur une de mes aplis je fais (suivant un code de ce fofo ;) ) :
où :
Dim oXL As Object ' objet excel
Dim oBook As Object ' classeur
Dim oSheet As Object ' feuille
les deux façons ne laisse visiblement aucune trace dans le gestionnaire de processus (à condition que tout le code se déroule correctement biensur lol). Quelqu'un peux t'il commenter ces deux méthodes ?
Kornebrume
Messages postés35Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention10 avril 2008 8 oct. 2007 à 15:16
Donc d'après vous en faisant :
xlBook.close()
xlApp.Quit()
xlApp=nothing
on libère toute la ressource utilisée par notre appli Excel?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 oct. 2007 à 14:15
pas confondre
xlApp = Nothing
et xlApp.quit()
Kornebrume
Messages postés35Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention10 avril 2008 8 oct. 2007 à 14:13
xlBook.close()?
xlApp=NOTHING?
Je t'assure qu'en faisant les deux çà ne fonctionne pas, ton processus est toujours actif.
Si tu y arrives autrement, propose-nous ton code.
Merci à toi.
Cordialement.
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 8 oct. 2007 à 11:57
Oui, bien fermer et détruire tes objets excel.
Kornebrume
Messages postés35Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention10 avril 2008 8 oct. 2007 à 10:25
C'est la seule solution de fermer excel. Si tu fais un xlApp.Close() cela ferme la fenêtre mais le processus est toujours actif dans ton gestionnaire des tâches.
Si tu as une solution plus adaptée et moins contraignante, n'hésite pas çà m'intéresse.
Cordialement,
Kornebrume
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 5 oct. 2007 à 22:51
Correctement peut-être mais ce n'est pas très propre de tuer le processus...(Comme les 3/4 des sources sur le sujet).
Peux mieux faire.
29 avril 2009 à 10:07
18 févr. 2009 à 14:49
c'est le top!!!
comment je suis content de trouver ce que je cherche!!!
MMeeeerrrkkiiiii!!!
11 févr. 2009 à 11:57
c'est à dire dénicher l'ID du processus Excel delaissé dans la mémoire après fermeture d'EXCEL et le tuer sans toucher aux autres sessions Excel ouvertes.
Je vous remercie par avance
9 janv. 2008 à 15:45
j'ai pas tout lu en détail, mais la façon la plus propre de fermer excel me semble la suivante. Elle ne tue AUCUN processus et elle est courte. Il faut mettre à jour le Garbage Collector après avoir quitter l'application et effacer l'objet.
objExcel.ActiveWorkbook.Close() 'Fermeture d'Excel
objExcel.DisplayAlerts = True 'remet l'alerte oui=True non=False
'objExcel.Application.Visible=True 'remet la visibilité
objExcel.Quit()
objClasseur = Nothing
objExcel = Nothing
GC.Collect()
A+
30 oct. 2007 à 15:40
Dieu merci.
Ton code est vraiment impécable voici comment je l'ai adapter à mon projet
Module Module1
'Public oExcelApp As New MSExcelApp
Public sEnft As Byte
Public appExcel As Excel.Application
' Déclarations pour classeur Excel
Public Classeur As Excel.Workbook
Public Feuil1 As Excel.Worksheet, Feuil2 As Excel.Worksheet, Feuil3 As Excel.Worksheet
Public Feuil4 As Excel.Worksheet, Feuil5 As Excel.Worksheet, Feuil6 As Excel.Worksheet
Public Feuil7 As Excel.Worksheet
'Public NomClasseur As String = "C:\GeStocks\BD.xls"
Public myIDExcel As Int16
Public Sub OuvrirClasseur()
'L'idée ici est de récupérer la liste d'ID des process qui tournent sur le PC. On recupère la
'liste avant de faire un New et on recupère la liste après avoir fait le New. Ainci il ne reste
'plus qu'à faire la différence des 2 listes grâce à la fonction ExtractID(,) pour retrouver le
'bon ID de notre process Excel. Il ne reste plus qu'à la killer une fois notre application
'terminée.
'Première liste
Dim intFirstExcelIDs() As Int16 = ListID()
'Création de notre objet et attribution de l'ID
'Seconde liste
Try
appExcel = CType(CreateObject("Excel.Application"), Excel.Application)
'Ouverture d'un fichier Excel
Classeur = appExcel.Workbooks.Open(Filename:="C:\GeStocks\BD.xls", UpdateLinks:=0, ReadOnly:=False, Format:=5, Password:="diamp789")
Feuil1 = CType(Classeur.Worksheets("EntreStocks"), Excel.Worksheet)
Feuil2 = CType(Classeur.Worksheets("SortiStocks"), Excel.Worksheet)
Feuil3 = CType(Classeur.Worksheets("BonEntre"), Excel.Worksheet)
Feuil4 = CType(Classeur.Worksheets("BonSortie"), Excel.Worksheet)
Feuil5 = CType(Classeur.Worksheets("EntreImmob"), Excel.Worksheet)
Feuil6 = CType(Classeur.Worksheets("SortImmob"), Excel.Worksheet)
Feuil7 = CType(Classeur.Worksheets("QteRestant"), Excel.Worksheet)
'xlApp.Workbooks.Open(NomClasseur)
Catch ex As Exception
MsgBox("***** IMPOSSIBLE D'OUVRIR LE FICHIER EXCEL *****")
End Try
Dim intLastExcelIDs() As Int16 = ListID()
'Différence des 2 listes et récupération de notre ID
myIDExcel = ExtractID(intFirstExcelIDs, intLastExcelIDs)
End Sub
'Public Sub FermerClasseur()
' Fermeture du classeur
' Try
' Classeur.Save()
' Classeur.Save()
' Classeur.Close() 'Fermeture du classeur Excel
' appExcel.Quit() 'Fermeture de l'application Excel
'Désallocation(mémoire)
' Feuil1 = Nothing
' Feuil2 = Nothing
' Feuil3 = Nothing
' Feuil4 = Nothing
' Feuil5 = Nothing
' Feuil6 = Nothing
' Feuil7 = Nothing
' Classeur = Nothing
' appExcel = Nothing
'Catch ex As Exception
' End Try
' End Sub
Public Function ListID() As Int16()
Dim Processes As Process() = Nothing
Processes = Process.GetProcessesByName("EXCEL")
' Load ID Processes in Array
Dim intProcesses(Processes.GetUpperBound(0)) As Int16
Dim i As Int16
For i = 0 To Processes.GetUpperBound(0)
intProcesses(i) = CInt(Processes(i).Id.ToString)
Next
Return intProcesses
End Function
Public Function ExtractID(ByVal intFirstIDs As Int16(), ByVal intLastIDs As Int16()) As Int16
Dim intID As Int16 = Nothing
Dim intID_FirsList As Int16 = Nothing
Dim intID_LastList As Int16 = Nothing
Dim i As Int16 = Nothing
For i = 0 To intLastIDs.GetUpperBound(0)
intID_LastList = intLastIDs(i)
If Array.IndexOf(intFirstIDs, intID_LastList) = -1 Then
intID = intID_LastList
Exit For
End If
Next
Return intID
End Function
Public Sub FermerClasseur(ByVal intIDExcel As Int16)
If intIDExcel <> 0 Then
If Process.GetProcessById(intIDExcel).HasExited = False Then
Try
Process.GetProcessById(intIDExcel).Kill()
intIDExcel = 0
Catch ex As Exception
MessageBox.Show(ex.Message & ex.StackTrace, "Error while closing Excel integration.", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End If
End Sub
End Module
29 oct. 2007 à 14:18
Tu établis la liste des des processus actifs grâce à la fonction ListID().
Ensuite tu crées ton appli Excel : xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
Tu établis une seconde liste des processus actifs avec la fonction ListID()
La fonction retourne un tableau d'ID. Tu compares donc les 2 tableaux grâce à la fonction : ExtractID()
Il ne te reste plus qu'à faire ce que tu veux avec ton Excel.
Une fois terminé, tu peux fermer ton application Excel en tuant le processus grâce à la fonction : closeExcelFile()
Copier/coller des fonctions ci-dessus, çà fonctionne tout seul. Même si ce n'est pas hyper-propre, c'est le seul moyen de terminer le processus.
26 oct. 2007 à 19:47
et du coup tu conseils quoi ?
26 oct. 2007 à 17:40
A l'époque où j'ai testé ce genre de méthode, l'appli disparaissait du gestionnaire des tâches mais le processus était toujours actif (stocké en ram), il me fallait donc tuer le processus même si l'application était toujours fermée d'où la méthode pour récupérer l'ID du processus.
Attention : application != processus. Excel peut très bien être fermé et le processus toujours actif et donc gourmand en ressource.
Cdt.
24 oct. 2007 à 18:06
enfin attendons les réactions des sachants ;)
++
24 oct. 2007 à 18:05
où :
Dim oXL As Object ' objet excel
Dim oBook As Object ' classeur
Dim oSheet As Object ' feuille
Apres mes taches il fait :
oXL.Workbooks.Close()
oXL.Quit()
oXL = Nothing
où aussi :
oXL.Quit()
oSheet = Nothing
oBook = Nothing
oXL = Nothing
les deux façons ne laisse visiblement aucune trace dans le gestionnaire de processus (à condition que tout le code se déroule correctement biensur lol). Quelqu'un peux t'il commenter ces deux méthodes ?
8 oct. 2007 à 15:16
xlBook.close()
xlApp.Quit()
xlApp=nothing
on libère toute la ressource utilisée par notre appli Excel?
8 oct. 2007 à 14:15
xlApp = Nothing
et xlApp.quit()
8 oct. 2007 à 14:13
xlApp=NOTHING?
Je t'assure qu'en faisant les deux çà ne fonctionne pas, ton processus est toujours actif.
Si tu y arrives autrement, propose-nous ton code.
Merci à toi.
Cordialement.
8 oct. 2007 à 11:57
8 oct. 2007 à 10:25
Si tu as une solution plus adaptée et moins contraignante, n'hésite pas çà m'intéresse.
Cordialement,
Kornebrume
5 oct. 2007 à 22:51
Peux mieux faire.