Fermer excel correctement et simplement

Contenu du snippet

Voici un petit morceau de code qui vous permettra de fermer correctement et simplement un processus Excel, sans pour autant écrire une classe dédiée. 3 fonctions suffisent.

Source / Exemple :


Public Class Form1

'Ajouter la référence au projet : Microsoft Excel Object Library 
'Déclaration de notre objet Excel. 

Dim xlApp As Excel.Application

Private 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 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

Private 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

Private Sub closeExcelFile(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

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    dim myIDExcel As int16

    '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
    xlApp = CType(CreateObject("Excel.Application"), Excel.Application)

    'Seconde liste
    Dim intLastExcelIDs() As Int16 = ListID()

    'Différence des 2 listes et récupération de notre ID
    myIDExcel = ExtractID(intFirstExcelIDs, intLastExcelIDs)

    'Ici vous faites ce que vous voulez avec votre application Excel
    '
    '
    '
    'Une fois terminée, vous pouvez fermer votre processus

    closeExcelFile(myIDExcel)      

End Sub

End Class

Conclusion :


Vous pouvez modifier la fonction closeExcelFiles() pour pouvoir lui passer en paramètre l'id du process de manière à pouvoir fermer autant de processus Excel que vous voulez. personnellement je l'ai adapté et j'utilise un tableau d'ID Excel.

Si vous avez des questions, ou si j'ai oublié des morceaux de code qui rend la source ci-dessus illogique, faites m'en part.

Je tiens à remercier gregory_forel de sa contribution. En effet mon code est adapté de son propre code que l'on peut trouver à l'adresse suivante : http://www.vbfrance.com/codes/FERMER-CORRECTEMENT-EXCEL-KILL-EXCEL_43802.aspx

J'ai retravaillé sa source car j'utilise pas mal de propriétés des book/sheets d'excel.

Pour tous commentaire n'hésitez pas

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.