Excel processus fonctionne encore après la fermeture de VB.net
Ma question est fondamentalement juste comment à la fin du Excel.exe processus qui s'exécute lors de l'utilisation d'excel. Dans l'application, j'ai ouvert et l'utilisation d'un classeur excel avec un couple de feuilles, puis de les laisser à l'utilisateur de faire comme ils s'il vous plaît, mon problème est que mon application ne se sépare jamais de le processus Excel.
Si l'application est fermée avant de fermer excel, le processus se termine lorsque la fermeture d'excel, sinon si je ferme mon application après la fermeture d'excel, le processus reste en cours d'exécution.
J'ai essayé quelques trucs que j'ai trouvé autour de l'internet pour faire de la cg.recueillir et d'attente pour l'attente des finaliseurs ou quelque chose le long de ces lignes, ni travaillé.
Je peux aussi fermer les processus excel heureusement, le seul problème est de ne pas savoir si je suis la fermeture d'une importante feuille de calcul qu'ils ont négligé d'enregistrer ou de la mine.
Je ne suis pas sûr si l'un de mes code d'aider avec une réponse, mais je suis à l'aide de microsoft.bureau de.interop.excel pour obtenir de excel, et je suis en utilisant un classeur déjà enregistrées dans l'application du dossier de ressources.
-Edit-
Voici tout ce que j'ai essayé, je sais que c'est un peu exagéré, mais malheureusement il n'est toujours pas la fin du processus
Marshal.ReleaseComObject(FirstWorksheet)
Marshal.FinalReleaseComObject(FirstWorksheet)
Marshal.ReleaseComObject(SecondWorksheet)
Marshal.FinalReleaseComObject(SecondWorksheet)
Marshal.ReleaseComObject(ThirdWorksheet)
Marshal.FinalReleaseComObject(ThirdWorksheet)
Marshal.ReleaseComObject(FourthWorkSheet)
Marshal.FinalReleaseComObject(FourthWorkSheet)
Marshal.ReleaseComObject(xlRange)
Marshal.FinalReleaseComObject(xlRange)
Marshal.ReleaseComObject(SecondxlRange)
Marshal.FinalReleaseComObject(SecondxlRange)
Marshal.ReleaseComObject(thirdxlRange)
Marshal.FinalReleaseComObject(thirdxlRange)
Marshal.ReleaseComObject(fourthxlRange)
Marshal.FinalReleaseComObject(fourthxlRange)
Marshal.ReleaseComObject(.activeworkbook)
Marshal.FinalReleaseComObject(.activeworkbook)
Marshal.ReleaseComObject(excelApplication)
Marshal.FinalReleaseComObject(excelApplication)
MSExcelControl.QuitExcel() 'A function made by someone else I work with that was meant to close excel's process
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
-Edit - Voici le quitExcel méthode
Friend Shared Sub QuitExcel()
If Not getExcelProcessID = -1 Then
If Not excelApp Is Nothing Then
'Close and quit
With excelApp
Try
Do Until .Workbooks.Count = 0
'Close all open documents without saving
.Workbooks(1).Close(SaveChanges:=0)
Loop
Catch exExcel As Exception
'Do nothing
End Try
Try
.ActiveWorkbook.Close(SaveChanges:=0)
Catch ex As Exception
'Do nothing
End Try
Try
.Quit()
Catch ex As Exception
'Do nothing
Finally
myExcelProcessID = -1
End Try
End With
excelApp = Nothing
End If
End If
End Sub
Il avait déjà essayé de faire la même chose avec l'ID de processus est, dans sa catégorie, le problème était sa ne fonctionnait pas, c'est pourquoi j'ai essayé d'obtenir l'ID de processus à nouveau moi-même, qui a travaillé
Voir aussi ici:stackoverflow.com/questions/1041266/...
Merci, je vais jeter un oeil à eux deux!
Pouvez-vous ajouter le code de
MSExcelControl.QuitExcel()
? Cela semble être où est le problème.
OriginalL'auteur Alex | 2012-08-01
Vous devez vous connecter pour publier un commentaire.
Bonne solution Alex, nous ne devrions pas avoir à faire cela, mais nous n', EXCEL ne veut tout simplement pas de fin. J'ai pris votre solution et a créé le code ci-dessous, j'appelle ExcelProcessInit avant mon application importations ou des exportations Excel, puis d'appeler ExcelProcessKill après c'est terminé.
OriginalL'auteur user1388706
Ça a pris du temps mais j'ai finalement résolu, la meilleure façon de le faire est d'enregistrer l'ID de processus lorsque vous créez l'application excel, cela signifie que vous connaissez l'IDENTIFIANT unique associé à votre processus.
Pour ce faire, j'ai regardé tous les processus qui y étaient déjà, l'enregistrement de la excel processus' Id dans un tableau d'Id de
Ensuite, répétez le processus tout de suite après l'ouverture de la mine (à essayer et de les prévenir de l'ouverture d'excel eux-mêmes et avoir 2 excel nouveau processus) enregistrement de la nouvelle Id, vérifiez pour un ID qui n'était pas dans la dernière liste et l'enregistrer comme un entier.
Puis tout ce que vous devez faire à la fin est de parcourir la liste des processus et de tuer l'un avec votre ID
Il ne fait jamais bien?
si vous pouviez m'aider plus que juste downvoting et de me dire les choses que j'ai déjà essayé alors que j'avais beaucoup apprécier
J'ai ajouté trop de choses dans mon code, y compris l'analyse des données des outils pour créer de l'histogramme, et une énorme quantité de cellules... Parait que c'est la seule façon pour moi de tuer excel. Merci de fournir cette solution.
OriginalL'auteur Alex
Je sais que c'est un vieux thread, mais si quelqu'un revient à cela, vous avez en fait avoir à appeler tous les Interop.Excel objet que vous touchez dans le classeur. Si vous tirez dans un instancié de la classe à partir d'Excel dans votre code, lorsque vous avez terminé avec lui, le Maréchal.ReleaseComObject. Même chaque cellule. C'est fou, mais c'est la seule façon que j'ai été en mesure d'obtenir le même problème s'est résolu.
Et faire sacrément sûr que vous n'avez pas une exception irrécupérable et de laisser quelque chose d'inédit... Excel restera ouvert.
Excel.Application? Maréchal.ReleaseComObject.
Excel.Classeur? Maréchal.ReleaseComObject.
Excel.Workshet? Maréchal.ReleaseComObject.
Excell.Gamme? Maréchal.ReleaseComObject.
Boucle sur les Lignes? Maréchal.ReleaseComObject chaque ligne et de la cellule boucle.
À prox.De Style? Maréchal.ReleaseComObject... du moins c'est ce que j'avais à faire...
Si vous prévoyez sur l'utilisation du PIA pour accéder à Excel, à partir de la première ligne de code que vous écrivez, planifier comment vous allez publier vos objets. La meilleure approche que j'ai eu est de faire en sorte que je tire un excel de la valeur de l'objet Excel et de le charger dans mon propre variable interne. Puis imediately appel Maréchal.ReleaseComObject vous avez accédé. En parcourant les objets excel via une liste dans une Application, Classeur, Feuille, ListObject, Table, etc, tend à être la plus difficile de la libération. D'où la planification est assez critique.
OriginalL'auteur Rob K.
J'ai eu le même problème il y a un moment, essayez d'utiliser le Maréchal.ReleaseComObject sur vos objets excel. Il est situé ed dans le Système.Moment de l'exécution.InteropServices espace de noms. Aussi n'oubliez pas de fermer vos objets excel à l'avance.
OriginalL'auteur Francis Dean