Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FERMER CORRECTEMENT EXCEL - KILL EXCEL


Information sur la source

Catégorie :VB.NET Source .NET ( DotNet ) Classé sous : excel, kill, fermer, process, procesus Niveau : Débutant Date de création : 17/08/2007 Date de mise à jour : 11/09/2007 18:43:34 Vu : 9 866

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

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.

Commentaires et avis

signaler à un administrateur
Commentaire de Patrice99 le 18/08/2007 10:30:19

Déjà fait !

XLDOTNET : QUITTER EXCEL SANS LAISSER D'INSTANCE EN RAM
www.vbfrance.com/code.aspx?ID=27541

La dernière version gère aussi Word :
http://patrice.dargenton.free.fr/CodesSources/VBXL.vbproj.html#7
Voir VBXL : www.vbfrance.com/code.aspx?ID=17783

signaler à un administrateur
Commentaire de NeverKnow le 23/08/2007 17:12:18

Suggestion, dans ton With oExcelApp, il y a une fois où tu utilise la variable elle même sans aucune utilité, ce qui fait que le tier de tes lignes de code pourraient être sorti du With. Il faut rester constant ;)

Ajouter un commentaire

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 Fermeture excel sans devoir repondre oui [ par petiflamand ] Bonjour je voudrais savoir comment fermer excel sans devoir repondre oui au changement d'excelMerci pour fermer excel j'utiliseClasseurXLS.Workbooks.C quelle reference pour declarer une variable process ? [ par chapaleufu ] Bonjour,je cherche la reference que je dois indiquer dans un project VB6 afin de pouvoir declarer une variable comme process (j'ai besoin de savoir qu Kill process ! (euh en fait juste terminer un programme;-) ) [ par MoiDebutantVB ] Je voudrais arrêter un tache que j'ai démarrée à l'aide la méthode shell.Le principe est que mon programme démarre une a Liste Process sur terminal server [ par linasteph ] Bonjour, voicci mon petit soucis. J'ai une appli qui doit tourner sur terminal server et qui est destinée à fermer mon process "Toto". fermer excel sans le message système [ par fehmichebaane ] bonjours à tous j'ai une apllication vb 6.0 qui permet d'ouvrir un fichier excel et de faire plusieurs traitements et lorsque je veux fermer mon fichi Kill un process bien definie [ par ImmortalPC ] Salut,Déjà sachez que je connais très peu le VB.Ma question est comment tuer un processus bien definie?Pour l'exemple le processus sera


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.