Pilotage de Excel

Signaler
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
-
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
-
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;

6 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
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.
 
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
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
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
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
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
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
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
Oui , par contre je ne me souviens plus si l'application est bloqué par le lancement par shellexecute ...

Dom
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
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