Pilotage de Excel

jnmchl
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
- 3 févr. 2008 à 20:52
jnmchl
Messages postés
63
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;

6 réponses

cs_Delphiprog
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
9 janvier 2013
31
4 févr. 2008 à 21:45
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.
 
0
jnmchl
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
4 févr. 2008 à 22:56
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
0
dominique.stock
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
7
5 févr. 2008 à 09:50
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
0
jnmchl
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
5 févr. 2008 à 21:59
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
0

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

Posez votre question
dominique.stock
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
7
6 févr. 2008 à 10:06
Oui , par contre je ne me souviens plus si l'application est bloqué par le lancement par shellexecute ...

Dom
0
jnmchl
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
6 févr. 2008 à 21:44
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
0