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 ???
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.
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 !
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 !
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 !
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 !
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")
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 :
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 ?...
^_^
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 !
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...