Texcelaplication problème de fermeture

blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008 - 6 sept. 2006 à 09:55
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008 - 6 sept. 2006 à 14:51
Bonjour à tous,

Je suis en train de développer une application au boulot qui utilise plusieurs classeurs excel. J'envoie des données dans ces memes classeurs, j'exécute les macros excell et puis je récupère les résultats. Cette partie marche impeccable. C'est lors de la fermeture du classeur que ça coince. En effet, j'utilise le code suivant pour fermer excel :

monclasseur.close(True, emptyparam, emptyparam, 0);

seulement, malgré cette instruction, dans les processus du gestionaire des taches, il reste un EXCEL.EXE de visible. que je suis obligé de fermer à la main. 

Je voudrais savoir si c'est normal que le classeur ne se ferme pas malgré l'instruction "monclasseur.close" et si oui, par quel moyen puis-je tuer le process excel ? par une instruction killprocess par exemple....

merci de votre aide précieuse.

david

10 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
6 sept. 2006 à 13:21
Salut,


Je vais me baser sur mon experience automation office en C# pour tenter de t'aider (en esperant que je sois pas hors sujet, si tu ne fais pas de delphi .net)

Est-ce que tu fermes ton application excel, en plus du classeur ?
Il faut que tu appeles la méthode Quit de ton objet Excel.Application.

Ensuite, essaie de leur assigner (aux objets representant ton classeur excel et l'appli excel), la valeur Nil ( FreeAndNil ? )
En C#, on appelle la méthode System.Runtime.InteropServices.Marshal.ReleaseComObject, peut-etre que ca te dit quelque chose. (Je connais pas l'equivalent en Delphi.Net)

Une fois tout cela effectué, tu peux toujours tester de forcer le Garbage Collector, via la méthode GC.Collect(), ca devrait radicalement supprimer ton probleme.





Mx
MVP C#
 
0
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008
6 sept. 2006 à 13:48
Bon, je vais essayer d'être un peu plus clair.....

voici comment j'ouvre et j'essaie de fermer excel :

 Classeurarcage :=ExcelApplication1.Workbooks.Open(PathArcage+Namearcage+'.xls',
        False,False,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,
        0);
        ExcelApplication1.Visible[0] := true;
        Feuillearcage := Classeurarcage.Worksheets['BASE'] as _worksheet;



.
.
.



 ExcelApplication1 := nil;
 Classeurarcage.close(False, (PathArcage+Namearcage+'.xls'),emptyparam,0);  { normalement fermeture de la feuille Excel }


entre ces deux groupes d'instructions, j'effectue diverses opérations d'entrées sorties vers la feuille. Mais apres les 2 dernières instructions, il reste EXCEL.EXE dans le gestionaire de programe. comment faire pour fermer ce foutu excel ?

merci

david
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
6 sept. 2006 à 13:56
D'abord, ferme le classeur avant l'appli (logique).
Donc essaie :

Classeurarcage.close(....);
ExcelApplication1.Quit();

Ensuite, essaie d'appeler (mais la je ne suis pas sur pour la syntaxe delphi) :
System.Runtime.InteropServices.Marshal.ReleaseComObject(Classeurarcage);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApplication1);

Puis
Classeurarcage := nil;
ExcelApplication1 := nil;

Et si tu constates que Excel.exe est toujours dans la liste des processus, tu ajoutes : GC.Collect();
Bien sur, met tout ce code dans un bloc finally (apres avec fait les habituels try/catch) afin que ces instructions soient appelées quoiqu'il arrive, et donc que la mémoire soit toujours libérée.

Mx
MVP C# 
0
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008
6 sept. 2006 à 14:15
J'ai bien essayé :

Classeurarcage.close(....);
ExcelApplication1.Quit();

mais impossible d'utiliser "System.Runtime.InteropServices.Marshal.ReleaseComObject....."  qui ne semble pas exister (du moins sous cette forme) sous delphi..... si j'utilise

Classeurarcage := nil;
ExcelApplication1 := nil;

ça ne marche pas non plus....

GC.collect(); n'existe pas non plus dans delphi....

une autre idée?
0

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

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
6 sept. 2006 à 14:18
En suivant ce lien je vois qu'ils utilisent GC.Collect
http://laurent-dardenne.developpez.com/articles/Delphi/2005/DotNet/Destructeurs-et-Finaliseurs/#L2-10

Tu fais bien du delphi.Net ?

Sinon je ne sais pas comment tu peux interagir autrement avec le Garbage Collector :/

Mx
MVP C# 
0
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008
6 sept. 2006 à 14:27
euh non, je fais du delphi 6.......

donc si quelqu'un à une autre idée que le garbage collector...elle est la bienvenue....En fouillanrt, j'ai vu qu'il y aurait une solution en passant par les OleApplication et OleWorkbook.. Est-il possible d'utiliser ce Ole avec mon code ici plus haut?

merci

david
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 sept. 2006 à 14:28
Mx se lance dans le dephi ;-)
J'aurais aussi proposé un Marshal.ReleaseComObject mais bon, je me doutais bien que ça n'existerait pas...

<hr size="2" />VC# forever
0
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008
6 sept. 2006 à 14:33
je devrai peut-etre aller poster dans un forum C#, on me répondrait peut-etre sur delphi :o) MDR

Non, sans dec, il faut vraiment que vous m'aidiez là ;o)

merci
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
6 sept. 2006 à 14:42
J'ai du toucher au delphi en cours.... ca va bien faire 5 ans maintenant
Jamais refait depuis ^^

Erf, du delphi 6, t'aurais du me dire quand j'ai supposé un peu plus haut que c'etait du .Net ;)
On trouve peu de ressources sur ton probleme :/ Sur tous les codes en delphi sur le sujet, je n'ai vu que des ExcelApplication.Quit(); et rien d'autre

Au pire, essaye de Killer le processus Excel.exe via ton code, mais c'est loin d'etre une solution propre et satisfaisante.

Désolé, je ne pourrais pas t'aider plus :/

Mx
MVP C# 
0
blood01 Messages postés 14 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 7 décembre 2008
6 sept. 2006 à 14:51
Merci quand même

J'ai bienb penbsé à cette solution brutale de killer le process par le code...meme si c'est aps propre, ça me dépannerait dans un premier temps....faut que je fournisse à mon chef une application qui marche...peut importe comment ;o)

Donc, pour les futurs lecteurs de ce post. je cherche toujours une solution pour fermer ce foutu excel.exe dans ce gestionaire de tâches...au pire, quel serait le code pour tuer ce process...j'ai aucune idée là-dessus

merci

david
0
Rejoignez-nous