Pilotage de Excel

Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
- - Dernière réponse : jnmchl
Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
- 6 févr. 2008 à 21:44
Bonjour,
J'ai un petit problème avec mon application qui génère des fichier Excel.
En fait tout fonctionne parfaitement, par contre mon appli génèrait en enregistrer des fichiers automatiquement,
charge à l'utilisateur d'aller les réouvrir après. Mon commanditaire à souhaité que les fichiers générés puissent
être ouverts optionnellement immédiatement (mais doivent toujours être enregistrés).
Là encore, ça marche, toutefois une fois Excel ouvert :
 - si on ferme directement Excel : tout se passe bien
 - si on ferme juste le document généré : Excel génère une erreur et se ferme ...
je cherche à corriger cette dernière petite erreur. 
Merci de votre aide.
Jean-Michel

Voici l'extrait du code :
avec les variables : s0 : répertoire de sauvegarde (string) et ouvrirXLS : choix d'ouverture du XLS généré (boolean)
la partie en rouge dans le code étant la modification apportée pour ouvrir immédiatement le fichier généré.

// Créer un xls
procedure CreerXLS;
var vMSExcel, vXLWorkbook, vXLWorkbooks, vWorksheet,vSheet, vCell : variant;
begin
  vMSExcel := CreateOleObject('Excel.Application');
  vMSExcel.visible := false;
  
//  ... formatage et inscription des données ...

  vXLWorkbook.SaveAs(S0);



  vCell:=unassigned;
  vSheet:=unassigned;
  vWorksheet:=unassigned;
  vXLWorkbook:=unassigned;
  vXLWorkbooks:=unassigned;



  vMSExcel.visible := OuvrirXLS;
  if not OuvrirXLS then vMSExcel.Quit;



  vMSExcel:=unassigned;
end;
Afficher la suite 

6 réponses

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24
0
Merci
Bonjour,

Et si tu déclarais ta variable vMSExcel comme variable globale ?
Au vu du morceau de code ci-dessus, tu essaies de détruire l'instance Excel dans tous les cas de figure.

En tous cas, je te recommande la lecture de ce site dans lequel tu trouveras surement une piste : Automating Microsoft Excel
Lire attentivement le dernier paragraphe de la rubrique "how to close Excel".

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
 
Commenter la réponse de cs_Delphiprog
Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
0
Merci
Bonjour,
merci mais justement si je fais : 

  vMSExcel.visible := OuvrirXLS;
  if not OuvrirXLS then begin
    vMSExcel.Quit;
    vCell:=unassigned;
    vSheet:=unassigned;
    vWorksheet:=unassigned;
    vXLWorkbook:=unassigned;
    vXLWorkbooks:=unassigned;
    vMSExcel:=unassigned;
  end;

alors tout fonctionne correctement sauf ... que après la génération et l'ouverture du classeur si l'on ferme Excel par la suite : il reste actif en mémoire, ce qui n'est pas top.
Je souhaite qu'après avoir généré un classeur Excel ouvert, mon appli "donne la main" à Excel, et si je ferme Excel après : il se ferme correctement. 

Jean-Michel
Commenter la réponse de jnmchl
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
0
Merci
Bonjour,
Peut-être regarder du côté des shellapi ou équivalent (ne pas attendre la fin du shellapi) :
Dans tous les cas: tu fermes ton instance d'excel , et si l'utilisateur souhaite voir ce fichier, tu lances un shellexecute ....

Dom
Commenter la réponse de dominique.stock
Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
0
Merci
Merci Dominique,
J'avais déjà pensé à cette méthode ...
Mais est-ce vraiment optimum d'ouvrir une instance d'Excel avec le CreateOleObject, de la refermer pour réouvrir avec
if OuvrirXLS then ShellExecute(Handle,'open',PChar(s0,nil,nil,SW_SHOW);

je pensais qu'il y avait possibilité de faire plus court ? Vous feriez comme ça ?

Jean-Michel
Commenter la réponse de jnmchl
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
0
Merci
Oui , par contre je ne me souviens plus si l'application est bloqué par le lancement par shellexecute ...

Dom
Commenter la réponse de dominique.stock
Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
0
Merci
Malgré qu'il manquait une parenthèse, ça ne marche pas du tout ... je ne suis pas sûr que le fichier S0 est finalisé et disponible :
ShellExecute(Handle,'open',PChar(s0)nil,nil,SW_SHOW);
la fonction renvoie 33. Excel ne s'ouvre pas une deuxième fois ...
Jean-Michel
Commenter la réponse de jnmchl