VC++ - Automation Excel - Save tout court et non pas SaveAS ?? [Résolu]

Signaler
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005
-
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005
-
Bonsoir tout le monde,

je ne savais pas dans quelle rubrique poster ce sujet, je l'ai donc mis dans "au secours".

Je travaille avec Visual C++, j'ai créé une appli qui, au terme de diverses manip, vient écrire son compte rendu dans un fichier excel.

Jusque là pas de soucis. J'accès bien à excel, je crée bien le fichier si nécessaire et je sauvegarde via une ligne du style :
worksheet->SaveAs(cheminDeSauvegarde);

Lorsque le fichier n'existe pas, aucun soucis, le fichier est créé et excel est fermé ensuite par un close.
Comme je souhaite que cette manipe soit faite de façon transparente pour l'utilisateur, je n'affiche pas excel.

Mon soucis réside dans le SaveAs. En effet, comme je viens de le dire, lorsque le fichier n'existe pas, c'est ok.
Par contre, lorsque le fichier existe, je complète son contenu avec les nouvelles infos, pas de soucis. Mais étant donné qu'il s'agit d'un SaveAs, comme tout SaveAs qui se respecte, il me demande, par l'intermédiaire d'une boite de dialogue, si je veux remplacer le fichier existant.

La transparence est foutue :-(

Etant donné que si le fichier existe je l'ouvre pour y ajouter des données, je souhaiterais pouvoir le sauver à la méthode du Save, c'est à dire sans poser de question.

Quelqu'un saurait-il comment faire ?

Clo

10 réponses

Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

Bonjour Clothilde,

Désolé de ma réponse tardive. Je me demande si nous sommes bien sur la bonne voie... J'ai en effet découvert une propriété qui définit (sous Excel 97 mais cela doit fonctionner sur les versions suivantes) pour éviter la boîte de dialogue :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/office97/html/output/F1/D3/S5A38A.asp

Il faudrait définir dès lors Application.AlertBeforeOverwriting = FALSE où Application constitue l'objet instancié de Excel.

En espérant enfin t'avoir aidé un peu... A +

(Sans vouloir toujours critiquer, c'est quand même un peu le bord..l, Microsoft et sa MSDN)
Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

Salut,

As-tu correctement défini la propriété "Visible" de l'instance Excel à False, après la création de ton objet ?
Quelle version d'Excel utilises-tu ?

Ici, un lien vers la MSDN pour l'utilisation des objets Excel 2000 :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/off2000/html/xlmthsave.asp (méthode Save). Cette méthode suppose sans doute que le fichier ait été préalablement ouvert.

En espérant t'avoir un peu aidé,
Ciao.
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005

Salut Meech,

tout d'abord merci pour le lien, j'ai eu beau chercher je n'avais pas trouvé (mettons ça sur le dos de la fatigue ;-) )

Pour répondre à ta question, oui j'ai bien mis visible à False. L'environnement Excel n'apparaît pas à l'utilisateur. Seule la boîte de dialogue de confirmation d'enregistrement du fichier apparaît.


Alors effectivement, grâce au lien que tu viens de m'indiquer, je constate que la méthode Save est une méthode du workbook et non pas du sheet. Ce qui est déjà très intéressant.


En utilisant la méthode Save correctement appliquée, il y a une évolution : la dialogue box n'affiche plus "il existe déjà un fichier machin.xls, voulez-vous le remplacer ?" mais "Voulez-vous sauvegarder les modifications apportées au fichier machin.xls", ce qui en soit est déjà un net progrès car le deuxième message est moins inquiétant d'un point de vue utilisateur.


Mais cela ne résoud pas entièrement le problème. L'idéal serait de ne pas avoir du tout cette dialogue box.


Toujours avec le lien que tu m'as indiqué, je vois que la méthode SaveAs peut s'appliquer au wookbook au lieu du sheet, avec un paramètre suplémentaire qui est le paramètre ConflictResolution . Ce paramètre semble être ce que je recherche.
Je suppose qu'en lui passant la valeur xlLocalSessionChanges je devrais pouvoir forcer l'enregistrement des modifications sans afficher de dialog box.

Et là je sèche de nouveau, comment faire pour passer ce paramètre ?
A la compilation la constante n'est pas reconnue (avec un x ou un X d'ailleurs)
D'autre part, quelle valeur faut-il passer aux autres paramètres pour que leur valeur par défaut soit conservée ? est-ce que NULL fait l'affaire ou surtout pas ?

J'ai essayé de chercher, mais j'avoue bloquer sur ce point.

Si tu as la solution, je t'en serais reconnaissante ;-)

Merci,
Clo
Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

Re-bonjour,

A priori, d'après ce que j'ai pu trouver, en C ou C++ (ou quel que soit le langage, en fait...),
xlLocalSessionChanges est une macro définie du genre :
#define xlLocalSessionChanges 2

... ce qui me porte à dire qu'en spécifiant 2 dans l'argument concerné, tu obtiendras peut-être une solution à ton problème. En effet, MSDN lui-même n'explique-t-il pas que "xlLocalSessionChanges (automatically accept the local users changes)" ?

Bref, en gros, xlLocalSessionChanges est sans doute une macro non spécifiée dans un des nombreux fichiers d'en-têtes fourni avec Visual C++...

En espérant que tu vois le bout du tunnel,
Ciao.

PS. Dans l(hypothèse où cela fonctionne enfin, n'oublies pas de valider ma réponse !
Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

Re-bonjour,

A priori, d'après ce que j'ai pu trouver, en C ou C++ (ou quel que soit le langage, en fait...),
xlLocalSessionChanges est une macro définie du genre :
#define xlLocalSessionChanges 2

... ce qui me porte à dire qu'en spécifiant 2 dans l'argument concerné, tu obtiendras peut-être une solution à ton problème. En effet, MSDN lui-même n'explique-t-il pas que "xlLocalSessionChanges (automatically accept the local users changes)" ?

Bref, en gros, xlLocalSessionChanges est sans doute une macro non spécifiée dans un des nombreux fichiers d'en-têtes fourni avec Visual C++...

En espérant que tu vois le bout du tunnel,
Ciao.

PS. Dans l'hypothèse où cela fonctionne enfin, n'oublies pas de valider ma réponse !
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005

Re,

merci pour ces infos et pour ton aide.

Par contre, comment faire pour passer cet argument à la méthode ???

Clo
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005

:-(

je reste bloquée, je n'arrive pas à passer l'argument à la méthode parmis les 11 arguments requis, j'ai cherché un peu partout mais aucune solution :-(

Clo
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005

Salut Meech,

en fait l'AlertBeforeOverwriting concerne l'écrasement des cellules et non pas l'écrasement des fichiers semblerait-il.

Toujours est-il qu'en travaillant sur cette dernière option j'ai repris un peu mon code et je l'ai modifié de la sorte :


excel->PutVisible (
false);


Excel::_WorkbookPtr workbook;


if (!existant) { workbook = excel->Workbooks->Add(
static_cast<
long>(Excel::xlWorksheet));}


if (existant) { workbook = excel->Workbooks->Open (cheminDeSauvegarde); }

où existant est un booléen permettant de savoir si le fichier existe déjà ou non

puis je fais mes manipe et je fais un

worksheet->SaveAs(cheminDeSauvegarde);

si le fichier n'existait pas au départ
ou un


workbook->Save();

si le fichier existait.

Et là ça marche. Il me semble que j'avais fait ça dès ton premier indice, mais apparemment j'avais dû écrire workbook->Save; qui fonctionne mais qui fait apparaître la dialogue d'après les essais que j'ai pû faire.

En tout cas merci pour ton aide, merci à BruNews également.

Clo
Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

Désolé pour la dernière confusion. A +.
Messages postés
15
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
4 avril 2005

Pas de souis étant donné que ça m'a permis de trouver mon erreur ;-)

Clo