Fermer complètement Excel

kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 - 11 mars 2009 à 17:31
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 12 mars 2009 à 18:44
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

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

Essaye de dessaouler ta mémoire avant avant

et sinon entre Set Feuille = Classeur.Worksheets("tata")
et
Classeur.Save
Il y a quoi
0

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

Posez votre question
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
11 mars 2009 à 17:54
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.
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
11 mars 2009 à 17:56
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 !
0
Genildf Messages postés 270 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 30 décembre 2015 1
11 mars 2009 à 18:07
  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
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
11 mars 2009 à 18:21
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 !
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
11 mars 2009 à 19:45
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 !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2009 à 08:35
clair... un peu radical le coup du task kill...
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
12 mars 2009 à 08:41
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 !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2009 à 09:07
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2009 à 09:09
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 :
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
12 mars 2009 à 13:11
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 ?...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2009 à 13:12
je ne pense pas...

libre a toi de jouer comme tu le souhaites avec ton instance d'excel...
ce serai un comble ^^
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
12 mars 2009 à 14:50
^_^
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 !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2009 à 15:09
curieux... Excel rend la main uniquement une fois la commande Save executée (mode synchrone)
0
kkhuet Messages postés 92 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 3 juin 2009 1
12 mars 2009 à 15:43
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... 
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
12 mars 2009 à 18:44
Bizarre, bizarre. M'enfin, si ça marche, c'est le principal.
0
Rejoignez-nous