Hi - there's a few things going on here that I'll mention:
1) you can't just place a macro call in a data step as you did because as SAS is scanning the data step, it's sending each line to the compiler - except for the macro trigger (%lab) in your program, which will be sent to the macro processor immediately and executed there.
2) Never place a semi-colon on a macro call - we only use semi-colons on SAS statements and a macro call is technically NOT a SAS statement.
So I've tried to build a simple replica of your code as follows, which will work for you. While you can place the whole thing into a macro definition and a %do statement, this will work here:
%macro lab7; %put hello lab7, nice to meet you!; %mend;
%lab7 %let maxvisnum = 10;
data mydata; do until (vinum=&maxvisnum); vinum+1; call execute(%nrstr("%lab7")); end; run;
Which yields a nice log:
ata mydata; 33 do until (vinum=&maxvisnum); 34 vinum+1; 35 call execute(%nrstr("%lab7")); 36 end; 37 run;
hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! hello lab7, nice to meet you! NOTE: The data set WORK.MYDATA has 1 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.01 seconds
A bit of explanation as well: CALL EXECUTE permits you to send any code to the Input Stack when as needed. The %nrstr function delays the execution of the %lab7 macro call, instead just stacking up the call 10 times in the Input Stack. It's a bit advanced, but this gets the job done for you.
... View more