FERMER EXCEL CORRECTEMENT ET SIMPLEMENT

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 5 oct. 2007 à 22:51
steph01190 Messages postés 1 Date d'inscription mardi 7 avril 2009 Statut Membre Dernière intervention 29 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.

https://codes-sources.commentcamarche.net/source/44287-fermer-excel-correctement-et-simplement

steph01190 Messages postés 1 Date d'inscription mardi 7 avril 2009 Statut Membre Dernière intervention 29 avril 2009 3
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és 38 Date d'inscription dimanche 24 décembre 2000 Statut Membre Derniè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és 38 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 19 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és 46 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 13 juin 2008 1
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.

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+
diampa Messages postés 3 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 30 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

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
Kornebrume Messages postés 35 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 10 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és 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
26 oct. 2007 à 19:47
à mince !
et du coup tu conseils quoi ?
Kornebrume Messages postés 35 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 10 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és 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
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és 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
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

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 ?
Kornebrume Messages postés 35 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 10 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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 oct. 2007 à 14:15
pas confondre

xlApp = Nothing

et xlApp.quit()
Kornebrume Messages postés 35 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 10 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és 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
8 oct. 2007 à 11:57
Oui, bien fermer et détruire tes objets excel.
Kornebrume Messages postés 35 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 10 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és 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
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.
Rejoignez-nous