DATA Step, Macro, Functions and more

macro looping

Reply
Occasional Contributor
Posts: 11

macro looping

In th below code as you can see im trying to create a macro variable for each iteration of 'i' but when i try to print them onto saslog im getting the error

as Apparent symbolic reference ST1not resolved .

Any help would be appreciated!

%macro do(m,n);

%let i=;

data _null_;

%do i=&m %to &n;

  st=%eval(&i+1);

  call symput("st&i",st);

   %put &&st&i;

%end;

run;

%mend;

%do(1,2)

PROC Star
Posts: 7,363

macro looping

I can't test your code at the moment, but I doubt if it will work for a couple of reasons: (1) I think %do is a reserved word and (2) the macro variable won't resolve within the same datastep it is created.  Try something like the following:

%macro doit(m,n);

  %do i=&m %to &n;

    data _null_;

      st=%eval(&i+1);

      call symput("st&i",st);

    run;

    %put &&st&i;

  %end;

%mend;

%doit(1,2)

Super User
Super User
Posts: 6,499

Re: macro looping

You are mixing up macro logic and data step logic. The reason that the %PUT is getting an error is that it is compiled BEFORE the data step runs.  So the CALL SYMPUT function has not been called yet.

In a macro use the %LET statement to assign a value to a macro variable.

%macro doit(m,n);

  %do i=&m %to &n;

    %let st&i=%eval(&i+1);

  %end;

%mend doit;

%doit(1,2);

In a data step use the DO statement to loop.

%let m=1;

%let n=2;

data _null_;

  do i=&m to &n;

    call symputx(cats('ST',i),i+1);

  end;

run;

PS: Do not use DO as the name of a macro as %DO is already a macro statement.

Ask a Question
Discussion stats
  • 2 replies
  • 133 views
  • 6 likes
  • 3 in conversation