VC++ - Automation Excel - Save tout court et non pas SaveAS ??

Résolu
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005 - 31 mars 2005 à 21:50
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005 - 4 avril 2005 à 17:20
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

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
4 avril 2005 à 09:27
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)
3
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
1 avril 2005 à 13:15
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.
0
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005
1 avril 2005 à 14:06
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
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
1 avril 2005 à 15:09
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 !
0

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

Posez votre question
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
1 avril 2005 à 15:10
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 !
0
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005
1 avril 2005 à 15:52
Re,

merci pour ces infos et pour ton aide.

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

Clo
0
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005
2 avril 2005 à 14:29
:-(

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
0
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005
4 avril 2005 à 15:26
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
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
4 avril 2005 à 16:52
Désolé pour la dernière confusion. A +.
0
cs_clothilde Messages postés 15 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 4 avril 2005
4 avril 2005 à 17:20
Pas de souis étant donné que ça m'a permis de trouver mon erreur ;-)

Clo
0
Rejoignez-nous