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 :

Créer une macro variable dans une boucle %do %to


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Créer une macro variable dans une boucle %do %to
    Bonjour,

    j'ai besoin de créer une macro variable &NBTOTAL contenant la valeur d'une variable TOTAL, mais... pas moyen.
    J'ai essayé de créer la macro var dans la même étape data que la création de la variable TOTAL : ça ne marche pas ; dans une étape data _null_ après : ça ne marche pas non plus. Dans le 1er ou le 2nd cas, la log m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WARNING: Apparent symbolic reference NBTOTAL not resolved.
    Je pense que le problème vient du fait que je me trouve dans une boucle %do %to, mais je ne vois pas comment y remédier.
    Je ne vois pas comment faire autrement qu'un call symput. Peut-être un %let automatisé ? Mais je ne sais pas faire. Et je dois absolument créer ce &NBTOTAL dans la boucle, car j'en ai besoin pour un export (qui interviendrait juste avant le %MEND mais que je ne vous ai pas mis ici), et il va varier d'une table à une autre (principe de la boucle).

    Voilà mon code actuel:
    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
    %MACRO export_methodo;
     
    	data _null_;
    		/* création de &nbr contenant le nombre total de tables */
    	run;
     
    	%do i=1 %to &nbr;
    		data tab2;
    			set tab;
    			by Var;
    			format TOTAL BEST8. Eff_obs $10.;
    			if first.Var then do;
    				TOTAL = PA + NSPS + NSPR + NSP + N ;
    				Eff_obs = trim(left(TOTAL))!!"/8770" ;
    				call symput ('NBTOTAL',TOTAL);
    				%put &NBTOTAL ;
    			end;
    		run;
     
    		data _null_;
    			set tab2;
    			by Var;
    			if first.Var then call symput ('NBTOTAL',TOTAL);
    			%put &NBTOTAL;
    			/*drop TOTAL;*/
    		run;
     
    %MEND export_methodo;
    Si vous avez des pistes pour m'aider, je suis preneuse

    Alexandra

  2. #2
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bon, je viens de voir qu'en dehors de la macro (et en dehors de la boucle aussi) ça ne marche toujours pas. Le problème ne viendrait donc pas du %do finalement.
    Mais SAS me fait un truc bizarre... Quand j'exécute ce programme (soit le même que précédemment, sans boucle ni %macro) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    data tab2;
    	set tab;
    	by Var;
    	format TOTAL BEST8. Eff_obs $10.;
    	if first.Var then do;
    		TOTAL = PA + NSPS + NSPR + NSP + N ;
    		Eff_obs = trim(left(TOTAL))!!"/8770" ;
    		call symput ('NBTOTAL',TOTAL);
    		%put &NBTOTAL;
    	end;
    run;
    SAS m'affiche toujours un Warning (le même que dans mon message précédent), mais quand je ré-exécute le même programme une 2nde fois, là il me sort bien la valeur que je veux dans &NBTOTAL.
    Je ne comprends pas du tout ce qui se passe !
    J'utilise beaucoup de call symput dans d'autres étapes data et je n'ai aucun souci, mes macros-variables sont créées et fonctionnent du premier coup. Là, je suis paumée.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bon et bien j'ai résolu mon problème !

    Mon %put était simplement mal placé. Il doit être après le run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    data tab2;
    	set tab;
    	by Var;
    	format TOTAL BEST8. Eff_obs $10.;
    	if first.Var then do;
    		TOTAL = PA + NSPS + NSPR + NSP + N ;
    		Eff_obs = trim(left(TOTAL))!!"/8770" ;
    		call symput ('NBTOTAL',TOTAL);
    	end;
    run;
    %put &NBTOTAL;
    A la 1ère exécution, ça ne marchait pas, mais à la 2ème ça fonctionnait car ça se situait après le run. Avec plusieurs tables (puisque je remets tout ça dans une boucle), j'aurai eu un décalage dans la valeur stockée dans &NBTOTAL.
    Mais maintenant c'est réglé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2012, 09h24
  2. Macro Variable dans une Macro
    Par Julia333 dans le forum Macro
    Réponses: 5
    Dernier message: 04/04/2012, 20h58
  3. Réponses: 2
    Dernier message: 26/01/2012, 16h24
  4. Valeurs d'une macro-variable dans une table SAS
    Par patril dans le forum Macro
    Réponses: 2
    Dernier message: 03/08/2011, 13h23
  5. Réponses: 2
    Dernier message: 22/03/2010, 15h26

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