http://crackman.net/?p=1333
第一种方法:通过DO循环语句调用宏程序
%macro printclass(gender);
data subset&gender;
if _n_=1 then call symput(“TimeNow”,put(time(),timeampm13.2));
set sashelp.class(where=(sex=”&gender”));
run;
proc print data=&syslast;/*&SYSLAST是系统自动宏变量,表示最近生成的数据集的名称*/
title1 “Report from %trim(&SYSLAST) at &TimeNow”;
run;
%mend printclass;
%macro callmacro;
proc sort data=sashelp.class(keep=sex) out=levels nodupkey;
by sex;
run;
%local i levels;
data _null_;
set levels end=no_more;
call symput(“parm”||left(_n_),sex);/*将SEX这一个变量的所有值复制给以PARM为开头的系列变量*/
if no_more then call symput(“levels”,_N_);/*用宏变量&LEVELS记录数据集LEVELS的观测数*/
run;
%do i=1 %to &levels;
%printclass(&&parm&i);/*通过DO循环调用宏程序*/
%end;
%mend callmacro;
options nomprint nomlogic;
%callmacro;
第二种方法:
SQL语句调用宏程序
%macro printclass(gender);
data subset&gender;
if _n_=1 then call symput(“TimeNow”,put(time(),timeampm13.2));
set sashelp.class(where=(sex=”&gender”));
run;
proc print data=&syslast;
title1 “Report from %trim(&SYSLAST) at &TimeNow”;
run;
%mend printclass;
proc sql noprint;
select distinct ‘%printclass(‘||sex||”)”
into :mcalls separated by ” ” /*记录这里宏变量MCALLS记录不是一个变量而是表达式%printclass(M) %printclass(F),记住这里的宏程序调用时,不需要在后面加分号*/
from sashelp.class;
quit;
options nomprint nomlogic;
&mcalls/*这里可以不加分号,如果有是为了程序的可读性*/
大家可以研究一下 还有那种方式可以生成宏程序表达式?