Fermer un fichier excel et arreter le processus correspondant

forzacodm - 23 avril 2013 à 21:14
 Utilisateur anonyme - 27 avril 2013 à 02:52
bonjour, j'ai ouvert un fichier excel, mais quand je le ferme (avec le code ci-dessous), mais le processus reste toujours ouvert. je pense que si j'utilise "kill process" tous les autres fichiers excel ouverts seront fermés.
voici le code utilisé:

Dim xlsApp As Excel.Application
Dim xlsWorkBook As Excel.Workbook
Dim xlsWorkSheet As Excel.Worksheet
Dim xxx As String
xxx = Calcul_des_paramètres_supplémentaires.TextBox1.Text
xlsApp = New Excel.Application
xlsApp.Visible = False
xlsWorkBook = xlsApp.Workbooks.Open(xxx)
xlsWorkSheet = xlsWorkBook.ActiveSheet
Do
ComboBox1.Items.Add(xlsWorkSheet.Name)
xlsWorkSheet = xlsWorkSheet.Next
Loop While xlsWorkSheet.Name <> ""
xlsWorkBook.Close()

xlsWorkBook = Nothing
xlsApp.Quit()

j'attend votre feedback



slt tout le monde

10 réponses

Utilisateur anonyme
24 avril 2013 à 01:36
Bonsoir,

Je ne suis pas partisan du KillProcess sauvage, mais si tu y tiens:
        'Pour ne pas "tuer" des processus EXCEL autres que le tien:
        'Avant l'ouverture on vérifie quels process excel sont déjà ouverts
        Dim processId As Integer = 0
        For Each item As Process In Process.GetProcessesByName("EXCEL")
            processId -= item.Id
        Next

        Dim xlsApp As Excel.Application
        Dim xlsWorkBook As Excel.Workbook
        Dim xlsWorkSheet As Excel.Worksheet
        Dim xxx As String
        xxx = Calcul_des_paramètres_supplémentaires.TextBox1.Text
        xlsApp = New Excel.Application
        xlsApp.Visible = False
        xlsWorkBook = xlsApp.Workbooks.Open(xxx)
        xlsWorkSheet = xlsWorkBook.ActiveSheet
        Do
            ComboBox1.Items.Add(xlsWorkSheet.Name)
            xlsWorkSheet = xlsWorkSheet.Next
        Loop While xlsWorkSheet.Name <> ""
        
        xlsWorkBook.Close()
        xlsWorkBook = Nothing
        xlsApp.Quit()

        For Each item As Process In Process.GetProcessesByName("EXCEL")
            processId += item.Id
        Next
        ' Tue le process *sauvagement* ^^
        Process.GetProcessById(processId).Kill()



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
24 avril 2013 à 02:39
Bonjour acive

Je ne suis pas partisan du KillProcess sauvage, mais si tu y tiens:


Oui mais, fermer Excel à la fin d'un pilotage externe par automation, c'est un vrai parcours du combattant, et ce depuis des lustres. Pour un processus Excel "automationisé", objetexcel.application.quit ferme bien l'interface, mais ne réussit pas fermer complètement le processus.
0
merci Acive, mais j'ai essayé le "kill" sauvage ^^ mais le processus persiste.


slt tout le monde
0
Utilisateur anonyme
24 avril 2013 à 03:53
Bonjour,

Tu peux toujours jeter un œil là-dessus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 avril 2013 à 08:07
Bonjour,
Le problème est donc de pouvoir terminer le processus Excel ouvert sans pour autant terminer tous les autres processus Excel éventuellement ouverts.
Je veux bien essayer aujourd'hui de faire ceci, mais ce sera sous VB6 :
1) ouvrir le classeur par Shell (ce qui me permettra d'en extraire le processid), en en réduisant la fenêtre

2) me servir de la fonction GetObject, pour récupérer ce classeur-là
3) travailler avec l'objet retourné par getobject (lui envoyer des instructions en automation)
4) in fine : utiliser la fonction TerminateProcess de l'Api de Windows, car je pense qu'elle mettrait également fin à tous les fils ouverts par le Processus en cause


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Utilisateur anonyme
24 avril 2013 à 14:38
Bonjour,
Hier j'ai parcouru un forum en C, ils avaient un tuto justement (soit-disant) pour palier au problème, ils procédent comme ça:
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp)
GC.Collect()
GC.WaitForPendingFinalizers()
 

Mais à la fin ils font quand-même un KillProcess... donc je suis revenu sur VB c'est pareil...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
24 avril 2013 à 14:48
merci Acive, mais j'ai essayé le "kill" sauvage ^^ mais le processus persiste


Ça fonctionne bien chez moi...
Attention il "tue" uniquement le processus excel que ce code a généré uniquement, si tu as des classeurs ouverts ou autres process excel il n'y fait rien (c'est le but)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
24 avril 2013 à 15:28
Salut,

pour faire court :

-éviter les référencements à excel.
-Préféré la fonction CreateObject

Pour en savoir plus un petit retour d’expérience partagé ici

Sinon j'ai aussi déjà travaillé le sujet en VBA/VB6. Contrairement à ce que propose acive je tue tout les processus non graphique d'excel. si cela t’intéresses c'est ici


A+
0
Utilisateur anonyme
27 avril 2013 à 02:46
Bonjour,

Un autre moyen, pour l'interopérabilité avec le framework .net
0
Utilisateur anonyme
27 avril 2013 à 02:52
Bien vu cmarcotte...
Pourtant j'ai regardé le même forum... mais peut-être pas assez loin.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous