jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 2009
-
3 févr. 2008 à 20:52
jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 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;
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 20091 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.
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 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 ....
jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 20091 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 20091 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