BookmarkSubscribeRSS Feed
Ronein
Meteorite | Level 14

Hello

I want to create multiple macro variables based on data set that contain 2 colums:

column 1 is Macro var name

Column 2 is the value that the macro var will get

for example:

Macro var M0 will get value 2309

Macro var M1 will get value 2308

and so on

What is the way to do it please?

I think that I did it well but when I write %put &&m&n..;  to see the last macro var then I get  warning and cannot see its value.Why???

WARNING: Apparent symbolic reference M not resolved.
26 %put &&m&n..;
&m..

%let startMon=2012;
%let LastMon=2309;

data _null_;
date_start=mdy(mod(&startMon,100),1,floor(&startMon/100));
date_end=mdy(mod(&LastMon,100),1,floor(&LastMon/100));
n = intck('month',date_start,date_end);
call symputx('n',put(counter,best.));
call symputx('date_start',put(date_start,best.));
call symputx('date_end',put(date_end,best.));
format date_start date_end  date9.;
run;


data want_month;
date=&date_start.;
end_date=&date_end.;
YYMM=input(put(date,yymmn4.),best.);
format date end_date date9.;
do while (date<=end_date);
output;
date=intnx('month', date, 1, 's');
YYMM=input(put(date,yymmn4.),best.);
end;
format date YYMMN4.;
drop date end_date;
run;

proc sort data=want_month;
by descending YYMM ;
Run;

DATA want_month2(DROP=seq);
SET want_month;
seq = _N_-1; 
Macro_Var_Name=CATS("M",seq); 
RUN;


data _null_;
set want_month2;
call symputx(Macro_Var_Name,YYMM);
run;
%put &M0;
%put &M1;
%put &M33;
%put &&m&n..;/******Why WARNING: Apparent symbolic reference M not resolved??????***/
3 REPLIES 3
Patrick
Opal | Level 21

%put &&m&n; doesn't work because your macro variable &n doesn't contain a number but a fullstop (="missing").

Patrick_0-1699515813242.png

 

If you look at your first data step you'll see why that happens

Patrick_1-1699515876582.png

I guess what you intended to do but then missed during development was to use variable N instead of COUNTER to populate macro variable &n

Patrick_2-1699516032230.png

 

yabwon
Onyx | Level 15

If I were you I would use MacroArray package and do it like this:

 

Generate data:

/* input data */

%let startMon=2012;
%let LastMon=2309;

data have;
  n=-1;
  do yymm=&startMon. to &LastMon.;
    if input(put(yymm,z4.)!!"01",?? yymmdd6.) then
        output;
  end;
run;

Create macro array:

/*
%helpPackage(macroArray,'%array()')
*/

/* create macro array M from variable yymm */
%array(ds=have, vars=yymm#M, macarray=Y)

/* loop over array M with do_over... */
%put %do_over(M);


/* ...or loop by yourself */
%macro loop();
  %do i= &mLbound. %to &mHbound.;
    %put %M(&i.); /* <- %M() is a macro array, so you don't have to fight with && */
  %end;
%mend;
%loop()

All the best

Bart

 

P.S. Here are some instructions how to get macroArray package and where the documentation is.

/*
Details about SAS Packages Framework:
- https://github.com/yabwon/SAS_PACKAGES

Tutorial:
- https://github.com/yabwon/HoW-SASPackages

MacroArray documentation:
- https://github.com/SASPAC/macroarray/blob/main/macroarray.md
*/


/* Install SAS Packages Framework and macroaArray package. */
/* Run this only once. */
filename SPFinit url "https://bit.ly/SPFinit";
%include SPFinit; 
filename SPFinit clear;

filename packages "<directory/for/packages/>"; 
%installPackage(SPFinit macroArray)




/* Run this in your SAS Serrion (or add it to autoexec). */
/* Enable framework and load package  */
filename packages "<directory/for/packages/>";
%include packages(SPFinit.sas); 
%loadPackage(macroArray)

 

 

 

 

 

_______________
Polish SAS Users Group: www.polsug.com and communities.sas.com/polsug

"SAS Packages: the way to share" at SGF2020 Proceedings (the latest version), GitHub Repository, and YouTube Video.
Hands-on-Workshop: "Share your code with SAS Packages"
"My First SAS Package: A How-To" at SGF2021 Proceedings

SAS Ballot Ideas: one: SPF in SAS, two, and three
SAS Documentation



SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 744 views
  • 2 likes
  • 4 in conversation