kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 2009
-
11 mars 2009 à 17:31
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 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 ???
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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.
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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 !
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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 !
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 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 !
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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 !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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")
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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 :
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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 ?...
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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 !
kkhuet
Messages postés92Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention 3 juin 20091 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...