IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

macro avec call symput


Sujet :

Macro

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Par défaut macro avec call symput
    Bonjour,

    Je voudrais savoir s'il est possible de mettre dans le premier paramètre de call symput une macro variable ?

    Ci dessous un exemple table essaie:
    obs toto tata titi
    1 a rr yy
    2 b ss vv
    3 c tt ww

    Je souhaite créer autant de macro variable qu'il y a de données (soit 9 = a, b, c, rr, ss, tt, yy, vv, ww).

    pour prendre les données de chaque colonne je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data _null_;
    set essaie end=fin;
    call symput('soleil'||left(_n_),(trim(toto)));
    if fin tehn call symput('nb',_n_);
    run;
     
    %macro repet;
    %local i;
    %do i=1 %to &nb;
    %put soleil&i is &&soleil&i;
    %end;
    %mend repet;
    résultats :

    soleil1 is a
    soleil2 is b
    soleil3 is c

    Maintenant je souhaite faire la meme chose pour les colonnes "tata" et "titi" : jaimerais donc savoir ce que je dois faire pour ne pas avoir 3 fois le meme programme ? autrement dit peut on mettre une macro var dans call symput qui permettra de changer automatiquement le nom de la colonne à prendre en compte et le nom des macro variable.

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    tu peux utiliser la proc contents pour créer une table qui contient les noms des variables de ta table, que tu trransforme après en macro variable.
    Pour chaque macro variable créée au dessus tu exécutes ton code.

  3. #3
    Membre émérite
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Par défaut
    Exactement, tu créé la table avec
    proc contents data= out=

    tu fais le call symput pout récupérer les nom de variables
    call symput('var'||left(_n_),(trim(varname)));
    if fin tehn call symput('nb_var',_n_);

    tu met ton précédent programme dans une boucle %do j=1 %to &nb_var

    juste avant %do i=1 %to &nb; tu pourra mettre
    %put TABLE &&var&j ;

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Par défaut
    Bonsoir,

    je souhaite que le nom des macro var soit différent entre les 3 variables : par exemple, les valeurs de la variables "toto" sont récupérées dans les macro var "soleil1, soleil2, soleil3"
    pour les valeurs de la variable "tata", les macro var seront "lune1 lune2 lune3"
    et pour les valeurs de la variable "titi", les macro var seront "terre1 terre2 terre3"

    je souhaite donc avoir : call symput(&zz,&var) pour changer à la fois le nom de la variable à prendre en compte mais également le nom des macro var
    => le programme ne fonctionne pas

    Merci.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Par défaut
    Bonsoir,

    Il me semble que ce que je souhaite mettre en place n'est pas possible.
    Je récupère donc au fur et à mesure les valeurs que je stocke dans des macro var à l'aide de call symput et je relance le pgm sur les autres variables (à l'aide d'une macro).

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    c'est possible
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    data essai;
    format toto $1. tata $2. titi $2.;
    input toto $ tata $ titi $;
    cards;
    a rr yy
    b ss vv
    c tt ww
    ;
    run;
     
    %macro toto (var);
    option nomprint;
    DATA _null_;
    SET essai ;
    call symput("&var"||left(_n_),(&&var));
    call symput('nb',_n_);
    run;
    %LOCAL i;
    %do i=1 %TO &nb;
    	%put Affichage &var IS &&&var&i;
    %end;
    %mend;
    %macro appel;
    proc contents data=essai out=cont noprint; run;
    data _null_; set cont;
    call symput('var'||left(_n_),(trim(name)));
    call symput('nb_var',_n_);
    run;
    %do i=1 %to &nb_var;
    	%put Appel &i &&var&i;
    	%toto(&&var&i);
     
    %end;
    %mend;
    %appel;

Discussions similaires

  1. Problème appel autre macro avec Call
    Par Novice72 dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 30/06/2015, 07h15
  2. Macro programme avec call symput
    Par joan_27 dans le forum Macro
    Réponses: 2
    Dernier message: 22/10/2013, 22h27
  3. Stockage pas dynamique avec call symput
    Par enicnath dans le forum SAS Base
    Réponses: 1
    Dernier message: 18/10/2012, 16h39
  4. [Macro] la macro call symput
    Par r_dani dans le forum Macro
    Réponses: 2
    Dernier message: 17/10/2008, 15h03
  5. Réponses: 4
    Dernier message: 10/07/2008, 15h51

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