BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
td1345
Fluorite | Level 6

Hello!

 

I'm trying to run my macro (%tti(number)) that performs a large series of operations using an input value of 'number'. I have 2000 such numbers that changes the output of the macro. I have looped though them all using a simple loop macro:

 

 

%macro loop(start,stop);
%do iii=&start %to &stop;
%tti(&iii);
%end;
%mend();

However, now I would like to create the same macro but no do start to stop but rather run the macro based on input numbers, lets says 3,5,7,33,99.

 

I have tried to use code presented on this forum with no success.

 

%do_this(3 5 7 33 99);


%macro do_this(ids);
    %let num_ids=%sysfunc(countw(&ids));
    %do i=1 %to &num_ids;
         %let this_id=%scan(&ids,&i,%str( ));
         %tti(&this_id);
         run;
    %end;
%mend;

This macro runs the %tti() but using wrong input and sometimes gets stuck on the last input variable (in this case 99) and reruns it indefinitely. When inputting only 2 numbers in the list it only performs the 1st.

 

Any suggestions?

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

Nothing serious is wrong with your posted code.

Make sure that the TTI macro is not changing the macro variables I or NUM_IDS.

Remember to ALWAYS declare the macro variables that are local to your macro as %LOCAL to avoid this type of issue when nesting macro calls.  So your TTI macro might have a %DO loop that also using I as the index macro variable name. Like:

%macro tti(arg1);
%local i;
....
%do i=
 ...

%mend tti;

And if it does NOT have the %LOCAL statement then the macro variable I that the %DO loop would modify would be the one defined in DO_THIS instead.

 

So your little DO_THIS macro should do the same thing just in case you decide to call it from some other macro.

%macro do_this(ids);
%local num_ids i this_id;
    %let num_ids=%sysfunc(countw(&ids));
    %do i=1 %to &num_ids;
         %let this_id=%scan(&ids,&i,%str( ));
         %tti(&this_id);
    %end;
%mend;

 

View solution in original post

5 REPLIES 5
Tom
Super User Tom
Super User

Nothing serious is wrong with your posted code.

Make sure that the TTI macro is not changing the macro variables I or NUM_IDS.

Remember to ALWAYS declare the macro variables that are local to your macro as %LOCAL to avoid this type of issue when nesting macro calls.  So your TTI macro might have a %DO loop that also using I as the index macro variable name. Like:

%macro tti(arg1);
%local i;
....
%do i=
 ...

%mend tti;

And if it does NOT have the %LOCAL statement then the macro variable I that the %DO loop would modify would be the one defined in DO_THIS instead.

 

So your little DO_THIS macro should do the same thing just in case you decide to call it from some other macro.

%macro do_this(ids);
%local num_ids i this_id;
    %let num_ids=%sysfunc(countw(&ids));
    %do i=1 %to &num_ids;
         %let this_id=%scan(&ids,&i,%str( ));
         %tti(&this_id);
    %end;
%mend;

 

Kurt_Bremser
Super User

Run your macro off a dataset with call execute():

data control;
input i;
datalines;
3
5
7
33
99
;
run;

data _null_;
set control;
call execute(cats('%nrstr(%tti(',i,'))'));
run;
Tom
Super User Tom
Super User

The data step DO loop allows you to use a list of values like that. Why not just use a data step to generate the macro calls?

data _null_;
  do id=3,5,7,33,99;
    call execute(cats('%nrstr(%tti)(',id,')'));
  end;
run;

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

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
  • 5 replies
  • 6666 views
  • 3 likes
  • 3 in conversation