Accueil > > > FERMER CORRECTEMENT EXCEL - KILL EXCEL
FERMER CORRECTEMENT EXCEL - KILL EXCEL
Information sur la source
Description
Bonjour à tous, Je sais que certains ont des problèmes pour fermer complètement Excel, c'est à dire s'assurer qu'aucun processus Excel ne persiste dans le Task Manager. Je ne sais pas exactement à quoi c'est du, une histoire de framework compliquée, de destruction d'objet dans la mémoire bref... Je vous donne une solution plutôt radicale qui consiste à tuer le procesus Excel. Le code est issu de quelques recherches sur des sites anglais principalement (je ne me souviens plus des sites) je l'ai simplement ordonné et épuré. Il y avait beaucoup d'autres sources avec de bonnes idées de solutions, mais celle-ci est la seule qui marche à chaque fois. PRINCIPE: Chaque procesus a un ID, un numéro unique qui l'identifie. Lors de la création d'un procesus Excel (donc lors du lancement de l'application), Windows lui affecte un ID. Il nous faut donc récupérer cet ID pour pouvoir par la suite le tuer (kill, lorsque l'on a terminé avec lapplication Excel) ETAPES: 1. Pour récuperer l'ID, on liste tous les procesus EXCEL et on récupère (dans un tableau) leur ID respectif 2. On lance l'application Excel (oExcelApp = New Excel.Application etc.) et on liste de nouveau les IDs Excel. Nous avons donc récupéré dans cette nouvelle liste le nouvel ID correspondant à l'application Excel que nous venons de lancer. 3. Il nous reste à comparer les 2 listes pour récupérer l'ID du procesus Excel que l'on vient de lancer. 4. Nous pourrons "killer" le procesus par son ID lorsque nécessaire, sans toucher aux autres sessions Excel exitantes, c'est donc transparent pour l'utilisateur de votre programme. Voilà, je vous avais prévenu, c'est radical mais c'est définitif, je l'ai testé sur plusieurs machines, avec frameworks 1.1, 2.0, 3.0, cela marche à chaque fois. J'espère en avoir aidé certains. A plus, Greg C'est ma première source, soyez indulgents :P
Source
- Imports Microsoft.Office.Interop
-
-
- ' Lancer Excel, ouvrir un fichier, fermer Excel :
- Public Class Test
- Dim oExcelApp As New MSExcelApp
-
-
- ' Start Excel application (invisible session) and open Excel file
- ' Ouvre Excel en session invisible, et ouvre un fichier Excel
- With oExcelApp
- .Start(False)
- .OpenFile("c:\fichier_excel.xls")
-
- ' Faites ce que vous voulez ici
-
- ' Quitte Excel
- .Quit()
- End With
- End Class
-
-
- Public Class MSExcelApp
-
- Public Shared oExcelApp As Excel.Application
- Private intID As Int16
-
-
- Public Sub Start(ByVal blnVisible As Boolean)
- ' Start Excel, the application can be visible or not (blnVisible)
- ' Lance Excel, l'application peut être visible ou non (blnVisible)
-
- ' List all the running Excel processes
- ' Liste tous les procesus Excel en cours
- Dim intFirstIDs() As Int16 = MSExcelApp.ListID()
-
- ' Open Excel
- ' Ouvre Excel
- oExcelApp = New Excel.Application
- oExcelApp.Visible = blnVisible
-
- ' List one more time all the running Excel processes, so we can compare with the first list
- ' Liste de nouveau tous les procesus Excel en cours, pour pouvoir comparer avec la première liste
- Dim intLastIDs() As Int16 = MSExcelApp.ListID()
-
- ' Get the ID
- ' Extraction de l'ID grâce à la comparaison des 2 listes
- intID = MSExcelApp.ExtractID(intFirstIDs, intLastIDs)
- End Sub
-
-
- ' Ouvre un fichier Excel
- Public Sub OpenFile(ByVal strAbsolutePath As String)
- oExcelApp.Workbooks.Open(strAbsolutePath)
- End Sub
-
-
-
- ' Ferme Excel en tuant le procesus, nous devons lui fournir en paramètre l'ID récupéré
- ' lors de la création de la session Excel
- Public Sub Quit()
- Try
- Process.GetProcessById(intID).Kill()
- Catch ex As Exception
- MessageBox.Show(ex.Message & ex.StackTrace, "Error while closing Excel.", _
- MessageBoxButtons.OK, MessageBoxIcon.Error)
- End Try
-
- End Sub
-
-
-
- ' Fonction qui liste les procesus
- Private Shared Function ListID() As Int16()
- ' Get the ID's processes list in a array and sort it
- ' It is the only way to close Excel:
- ' To close Excel, we need to list the Excel ID's processes before user starts excel
- ' then we list them one more time just after opening Excel.
- ' We compare both of the lists we have to extract the new Excel ID of the brand new fucking Excel
- ' session. So we can kill this process with the ID we got, without killing other Excel user
- ' session.
- ' L'explication ci-dessus résume l'explication générale de la méthode, cf présentation du code
-
-
- ' Get ID's processes list
- 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
-
-
- ' Fonction qui compare les 2 listes de IDs, et nous renvoie l'ID voulu.
- Private Shared 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
- End Class
Imports Microsoft.Office.Interop
' Lancer Excel, ouvrir un fichier, fermer Excel :
Public Class Test
Dim oExcelApp As New MSExcelApp
' Start Excel application (invisible session) and open Excel file
' Ouvre Excel en session invisible, et ouvre un fichier Excel
With oExcelApp
.Start(False)
.OpenFile("c:\fichier_excel.xls")
' Faites ce que vous voulez ici
' Quitte Excel
.Quit()
End With
End Class
Public Class MSExcelApp
Public Shared oExcelApp As Excel.Application
Private intID As Int16
Public Sub Start(ByVal blnVisible As Boolean)
' Start Excel, the application can be visible or not (blnVisible)
' Lance Excel, l'application peut être visible ou non (blnVisible)
' List all the running Excel processes
' Liste tous les procesus Excel en cours
Dim intFirstIDs() As Int16 = MSExcelApp.ListID()
' Open Excel
' Ouvre Excel
oExcelApp = New Excel.Application
oExcelApp.Visible = blnVisible
' List one more time all the running Excel processes, so we can compare with the first list
' Liste de nouveau tous les procesus Excel en cours, pour pouvoir comparer avec la première liste
Dim intLastIDs() As Int16 = MSExcelApp.ListID()
' Get the ID
' Extraction de l'ID grâce à la comparaison des 2 listes
intID = MSExcelApp.ExtractID(intFirstIDs, intLastIDs)
End Sub
' Ouvre un fichier Excel
Public Sub OpenFile(ByVal strAbsolutePath As String)
oExcelApp.Workbooks.Open(strAbsolutePath)
End Sub
' Ferme Excel en tuant le procesus, nous devons lui fournir en paramètre l'ID récupéré
' lors de la création de la session Excel
Public Sub Quit()
Try
Process.GetProcessById(intID).Kill()
Catch ex As Exception
MessageBox.Show(ex.Message & ex.StackTrace, "Error while closing Excel.", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
' Fonction qui liste les procesus
Private Shared Function ListID() As Int16()
' Get the ID's processes list in a array and sort it
' It is the only way to close Excel:
' To close Excel, we need to list the Excel ID's processes before user starts excel
' then we list them one more time just after opening Excel.
' We compare both of the lists we have to extract the new Excel ID of the brand new fucking Excel
' session. So we can kill this process with the ID we got, without killing other Excel user
' session.
' L'explication ci-dessus résume l'explication générale de la méthode, cf présentation du code
' Get ID's processes list
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
' Fonction qui compare les 2 listes de IDs, et nous renvoie l'ID voulu.
Private Shared 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
End Class
Conclusion
J'espère aussi que les "boss" de la programmation épureront/amélioreront cette source pour qu'elle soit parfaite !
Historique
- 17 août 2007 21:31:41 :
- Rien de spé... ;)
- 11 septembre 2007 18:43:34 :
- Mise à jour, selon le commentaire de NeverKnow. Merci à lui.
Merci aussi à Patrice99: vous avez donc 2 sources pour ne plus avoir de problèmes avec Excel.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Excel-process ne se kill pas après fermeture de mon fichier [ par mastere30 ]
Hello,voici un truc encore tout nouveau pour moi.J'ai crée un formulaire Excel avec une grosse macro VBA. Quand je l'utilise via Excel normale, pas de
Fermer Excel proprement? [ par PsyCaDi ]
Bonjour,J'ai fais une base Access sous 97 et je fais un export dans une feuille excel mais lorsque je ferme excel via vba, il ne tue pas le process. D
Kill process d'une application spécifuqe [ par spitzberube ]
Est-il possible de récupérer l'ID d'une application créée en vb.net, par exemple Excel, pour pouvoir la tuer par la suite?Je sais
kill process [ par bmhbmh ]
voila je suis sur un projet où je me sers d'excel pour afficher les graphes des statistiques , le problème c'est qu'en utilisant PSKILL j'arrive plus
Kill process EXCEL.EXE ??? [ par jex0519 ]
Bonjour,voilà j'ai le problème suivant, mon programme fait appel à excel pour créer une facture puis il ferme excel, le bug survient à la création de
Fermer Word et pas excel [ par raphael_george ]
salut ,voila je n'arrive pas a fermer l'appliation word depuis excel... j'ai essayé :Application.Quit Word.Application.QuitWord.ActiveWindow.CloseWo
Fermer le processus Excel avec VB6 [ par Klojo2006 ]
Bonjour, J'ai un problème :voici le code :(General) (Déclarations)Dim ExcelTemp As Excel.Application...Private Sub Form_Load()Set ExcelTemp = New Exce
fermer tous les fichiers excel [ par antoine_ferard ]
Bonjour, pour des raisons diverses, dans le "processus" j'ai des fichiers Excel ouverts. J'aimerais via VB6, fermer tous les processus utilisant Excel
fermer excel via vb6 [ par antoine_ferard ]
Bonjour,j'ouvre excel via vb6 pour faire un traitement : Set xlApp = excel.Application ''**************Ouvre le fichier excel à exporter xlAp
[Excel / VBA] Fermeture Excel [ par sql84 ]
Bonjour,est-ce possible de fermer Excel depuis une macro (Excel / VBA) ?je veux dire fermer completement le logiciel et pas seulement les feuillesPar
|
Derniers Blogs
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
VB6 + GRAPHVIZVB6 + GRAPHVIZ par nouirayosra
Cliquez pour lire la suite par nouirayosra
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|