Fermer complètement Excel

Signaler
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
-
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
-
Bonjour,

j'ai fait le tour de tous les posts trouvés sur la question mais personne ne répond ou ne valide une solution
voici mon code :
    Set xlApp = CreateObject("Excel.application")
    Set Classeur = xlApp.Workbooks.Open(cheminFichier, False, True)
    Set Feuille = Classeur.Worksheets("tata")
   ......
    Classeur.Save
    Classeur.Close
    xlApp.Quit 'fermeture de l'application Excel
    'Désallocation mémoire
    Set Feuille = Nothing
    Set Classeur = Nothing
    Set xlApp = Nothing
quand mon programme s'arrête, j'ai toujours Excel qui apparaît dans le gestionnaire des tâches.
Mais qu'est-ce donc ???

Merci

19 réponses

Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
Tu as quoi dans ta feuille excel
as tu teste sur une feuille excel vierge?
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
Pour info, je viens de remarquer que lorsque je ferme Access (2000), mon process Excel disparaît du gestionnaire des tâches...?!?
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
test avec feuille Excel vierge : aucun changement.
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
lol

Essaye de dessaouler ta mémoire avant avant

et sinon entre Set Feuille = Classeur.Worksheets("tata")
et
Classeur.Save
Il y a quoi
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
dessaouler ta mémoire ? c'est quoi ?
entre les 2 instructions, j'ai du code qui récupère toutes les lignes de mon fichier Excel pour remplir la BDD, avec un accès à Outlook pour récupérer des infos sur des personnes.
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
j'ai trouvé sur un autre forum cette fonction :
Private Sub stopXL()
    Dim svc As Object
    Dim oproc
    Dim squery As String
    Set svc = GetObject("winmgmts:root\cimv2")
    squery = "select * from win32_process where name='EXCEL.EXE'"
    For Each oproc In svc.execquery(squery)
        oproc.Terminate
    Next
    Set svc = Nothing
End Sub
mais si j'ai déjà un autre fichier Excel ouvert avant de lancer mon programme, cette fonction ferme aussi l'autre fichier Excel, et évidemment ce n'est pas ce que j'ai envie !
Messages postés
272
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
30 décembre 2015
1
  Set Feuille = Nothing
    Set Classeur = Nothing
    Set xlApp = Nothing

met sa avant de quitter
Et vérifie bien si ton programme a bien tout récupéré avant de quitter et si tou c bien passe

ps essaye le mode pas a pas pour voir  si sa marche mieux
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
on désalloue la mémoire avant de quitter ?? bizarre..j'ai quand même fait le test, erreur quand j'arrive sur le Classeur.Close True puisque le classeur ne représente rien !
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour

Bien que pour l'utilisateur une même instance d'Excel permette l'ouverture de plusieurs classeurs, ce qui est une caractéristique des applications MDI (Multiple Document), Excel est une application SDI (Single Document) qui nécessite une instance par classeur.

Par conséquent, la méthode Quit ne ferme que l'instance ouverte par ta macro et ne ferme pas les autres instances.


D'après moi, ton code n'est pas en cause. L'instance qui reste en mémoire après ta macro n'est a priori pas celle que tu as créée dans ta macro. Fais le test suivant :

1) vérifie dans le gestionnaire des tâches que tu n'as aucune instance d'Excel en mémoire (fais le nettoyage si nécessaire)
2) exécute ta macro une fois puis revérifie. Quel est le résultat ?

Amicalement

PS : pour dessaouler la mémoire, deux Alka Selzer, un sac de glace sur le front, et hop, au dodo !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
clair... un peu radical le coup du task kill...
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
Bonjour,

j'ai fait le test de Orohena : j'ai redémarré mon PC et à l'ouverture, sans avoir rien ouvert d'autres, je lance Access et ma fonction dans laquelle j'ouvre et ferme le fichier Excel ; RIEN A FAIRE ! Le processus EXCEL.EXE traîne toujours dans le gestionnaire des tâches, et lorsque je ferme Access, il disparaît aussi. C'est à n'y rien comprendre !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
je lance un tskill excel (tue tous les process excel)
et je fais le test suivant :

Private Sub Form_Load()
Dim xlApp As Object
Dim classeur As Object
Dim feuille As Object
Set xlApp = CreateObject("Excel.application")

Set classeur = xlApp.Workbooks.Open("c:\a.xls", False, True)
Set feuille = classeur.Worksheets("Feuil1")

classeur.Close
xlApp.Quit
End Sub

aucun souci... pas de excel.exe qui traine

je refais le test, en ouvrant au préalable un de mes classeurs...
encore aucun soucis, une fois mon code executé, je n'ai toujours qu'une instance d'excel (deux, si je place un point d'arret avant la fermeture)

pour accelerer notre fonction, il est possible de réutiliser l'instance d'excel existante, si on en detecte une :


Private Sub Form_Load()
Dim xlApp As Object
Dim classeur As Object
Dim feuille As Object
Dim bMusKillExcel As Boolean
On Error Resume Next
Set xlApp = GetObject(, "Excel.application")
If Nothing Is xlApp Then
Set xlApp = CreateObject("Excel.application")
bMusKillExcel = True
End If

Set classeur = xlApp.Workbooks.Open("c:\a.xls", False, True)
Set feuille = classeur.Worksheets("Feuil1")

classeur.Close

If bMusKillExcel Then
xlApp.Quit
End If
End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
plus propre, encore :

Private Sub Form_Load()
Dim xlApp As Object
Dim classeur As Object
Dim feuille As Object
On Error Resume Next
Set xlApp = GetObject(, "Excel.application")
If Nothing Is xlApp Then
Set xlApp = CreateObject("Excel.application")
End If
On Error GoTo 0

Set classeur = xlApp.workbooks.Open("c:\a.xls", False, True)
Set feuille = classeur.Worksheets("Feuil1")

'#..........

classeur.Close

If xlApp.workbooks.Count = 0 Then
xlApp.Quit
End If
End Sub


on ferme excel, si l'on detecte qu'il ne sert plus a personne :
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
J'ai fait un test en créant un nouveau formulaire vierge et en mettant uniquement le code de Renfield dans le form_load, et ça fonctionne, il n'y a plus de processus EXCEL.EXE qui reste.


Dans ma fonction qui ouvre et ferme le fichier Excel, je supprime pas mal de lignes dans le fichier Excel, c'est peut-être à cause de ça ?...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
je ne pense pas...

libre a toi de jouer comme tu le souhaites avec ton instance d'excel...
ce serai un comble ^^
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
^_^
en fait j'ai lu sur le post d'un autre forum qu'Excel n'avait peut-être pas le temps de faire le save du classeur avant de quitter (voilà pourquoi je précise que je supprime plein de lignes) et donc c'est pour ça que le xlApp.Quit plante..je continue à chercher !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
curieux... Excel rend la main uniquement une fois la commande Save executée (mode synchrone)
Messages postés
92
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
3 juin 2009
1
Je pense que je vais vous étonner ! ça fonctionne maintenant, et la seule ligne que j'ai changée c'est :



NbLignes = Range(
"
A1:A
"
&
Range
(
"
A65536
"
)
.
End
(xlUp)
.
Row
)
.
SpecialCells
(xlVisible)
.

Count




par celle-là :
NbLignes = feuille.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count
et, Oh miracle, maintenant ça fonctionne ! L'informatique et ses mystères... 
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bizarre, bizarre. M'enfin, si ça marche, c'est le principal.