1. #1
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 371
    Points : 173
    Points
    173

    Par défaut Ecrire dans un fichier Excel à une adresse précise

    Bonjour,

    Je souhaiterais écrire à une adresse précise dans un fichier EXCEL (Onglet, ligne, colonne).
    J'ai fait le programme suivant (en m'inspirant de différents posts) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    filename Sortie dde "excel|D:\[Essai.xlsx]Feuil2!" notab;
    data _null_;
       set sashelp.class;
       file Sortie;
       if name eq 'Joyce' then do;
          put '["L3C5"=Height]';
          put '["L7C3"=Weight]';
       end;
    run;
    Ce programme génère l'erreur ERROR: Erreur de syntaxe DDE dans le nom physique.
    Est-ce que quelqu'un saurait comment faire ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 106
    Points : 90
    Points
    90

    Par défaut

    Bonjour,
    Voici ma proposition (si j'ai bien compris l'objectif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    filename Sortie dde "excel|D:\[Essai.xlsx]Feuil1!L3C5" notab;
    data _null_;
       set sashelp.class;
       file Sortie;
       if name eq 'Joyce' then put 'Height';   
    run;
     
    filename Sortie dde "excel|D:\[Essai.xlsx]Feuil1!!L7C3" notab;
    data _null_;
       set sashelp.class;
       file Sortie;
       if name eq 'Joyce' then put 'Weight';
    run;

  3. #3
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 371
    Points : 173
    Points
    173

    Par défaut

    Merci jlp65,

    Sauf la petite erreur dans ton 2nd filename (tu as mis deux fois le point d'exclamation), ça fonctionne parfaitement, sous réserve d'avoir ouvert le ficher avant.

    Cependant, en continuant mes recherches, je suis tombé sur des programmes qui permettent carrément d'ouvrir le fichier, d'écrire dedans et de le refermer (merci datametric).
    Voici les exemples :

    Lancement de Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    filename openxcel dde 'Excel|system';
    data _null_;
       length Fid RC Start Stop Time 8;
       Fid=fopen('openxcel','s');
       if (Fid le 0) then do;
          RC=system('start excel');
          Start=datetime();
          Stop=Start+30;
          do while (Fid le 0);
             Fid=fopen('openxcel','s');
             Time=datetime();
             if (Time ge Stop) then Fid=1;
          end;
       end;
       FC=fclose(Fid);
       call sleep(1000,0.001);
    run;
    Ouvrir un classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data _null_;
       file openxcel;
       put '[error(false)]';
       put '[open("D:\essai.xlsx")]';
    run;
    Écrire dans un classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    filename Titre dde "excel|D:\[Essai.xlsx]Feuil1!L1C1:L1C10" notab;
    filename Label dde "excel|D:\[Essai.xlsx]Feuil1!L2C1:L2C10" notab;
    filename Datas dde "excel|D:\[Essai.xlsx]Feuil1!L3C1:L10C10" notab;
    data _null_;
       file Titre;
       put "Voitures";
       file Label;
       put "Make" '09'x "Model" '09'x "Origin" '09'x "Type" '09'x "Cylinders" '09'x "Horsepower" '09'x "Length" '09'x "Weight";
    run;
    data _null_;
       set sashelp.cars;
       file Datas;
       put Make '09'x Model '09'x Origin '09'x Type '09'x Cylinders '09'x Horsepower '09'x Length '09'x Weight;
    run;
    Lire un classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data Tmp;
       infile Datas dlm='09'x;
       input Make $ Model $ Origin $ Type $ Cylinders Horsepower Length Weight;
    run;
    Fermer un classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data _null_;
       file openxcel;
       put '[close("Essai.xlsx")]';
    run;
    Attention : le code précédent ferme le classeur sans le sauvegarder. Je ne sais pas encore sauvegarder ; je suis obligé de le faire directement sous Excel.

    A suivre donc !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 106
    Points : 90
    Points
    90

    Par défaut

    En fait, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data _null_;
       file openxcel;
       put '[close("Essai.xlsx")]';
    run;
    ferme le fichier ACTIF (qui n'est donc pas nécessairrement "Essai.xlsx") : le paramètre est donc inutile.
    Pour fermer le fichier actif après sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data _null_;
       file openxcel;
       put '[close(true)]';
    run;
    (c'est le paramètre true qui indique à SAS de faire une sauvegarde préalablement à la fermeture)

  5. #5
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 371
    Points : 173
    Points
    173

    Par défaut

    Citation Envoyé par jlp65 Voir le message
    (c'est le paramètre true qui indique à SAS de faire une sauvegarde préalablement à la fermeture)
    Super. On avance, on avance.

    Encore une question jlp65 :
    Pour continuer l'automatisation de ma procédure, je voudrais ouvrir un classeur selon une variable, comme dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data _null_;
       file openxcel;
       OpenFileVar=cat("'[open(","D:\Essai.xlsx",")]'");
       put '[error(false)]';
       put OpenFileVar;
    run;
    Excel refuse obstinément d'ouvrir mon fichier.
    Il veut que les choses soient écrites en dur put '[open("D:\Essai.xlsx")]';
    Saurais-tu comment faire pour pouvoir utiliser ma variable ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 106
    Points : 90
    Points
    90

    Par défaut

    Il manquait des quotes dans le nom du fichier !
    Voici un code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    options noxwait noxsync ;
    data _null_;
       file openxcel;
       OpenFileVar=cat("'[open(",'"D:\Essai.xlsx"',")]'");
       put '[error(false)]';
       put OpenFileVar;
    run;

  7. #7
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 371
    Points : 173
    Points
    173

    Par défaut

    Encore une question JLP65,

    Pour écrire dans le fichier EXCEL, dans les exemples cités plus haut, on procède comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    filename Datas dde "excel|D:\[Essai.xlsx]Feuil1!L3C1:L10C10" notab;
    data _null_;
       set sashelp.cars;
       file Datas;
       put Make '09'x Model '09'x Origin '09'x Type '09'x Cylinders '09'x Horsepower '09'x Length '09'x Weight;
    run;
    Ici, on écrit nos données dans la plage L3C1:L10C10.

    Ça ne me convient pas tout-à-fait, parce que je souhaite écrire dans des cellules précises.
    Est-il possible d'utiliser une fonction put '[ ... ]';, par exemple dans le style put '[write(L3C7, "blablabla")]'; (pour écrire "blablabla" en cellule L3C7) ?

    Tu vois mon objectif, ça permet de construire l'adresse où écrire les données, directement au sein de l'étape data.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 106
    Points : 90
    Points
    90

    Par défaut

    bonjour Enicnath,
    Je ne vois pas trop l'intérêt de la chose.
    Qu'est-ce qui te gène dans le fait de définir la zone d'inscription des données hors de l'étape Data ?
    Et je ne vois pas comment faire le tout dans l'étape Data. Je ne sais pas si c'est possible.

Discussions similaires

  1. Ecrire dans un fichier excel avec une boucle
    Par fafa isfan dans le forum Général Python
    Réponses: 4
    Dernier message: 14/03/2016, 17h47
  2. [C#] Comment écrire dans un fichier Excel ?
    Par chorokari dans le forum C#
    Réponses: 8
    Dernier message: 09/02/2007, 09h17
  3. Écrire dans un fichier à une place précise
    Par alliance dans le forum Fichiers
    Réponses: 15
    Dernier message: 26/08/2006, 23h08
  4. [C#] Comment écrire dans un fichier Excel ?
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/05/2006, 15h29
  5. [VB]Ecrire dans un fichier excell
    Par Empty_body dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 07/02/2006, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo