如何在sas中使用连续的常数迭代地执行宏程序?

时间:2014-11-04 14:49:45

标签: sas sas-macro

我是宏的初学者。我修改了一个宏程序并且工作。 但是,我必须如下编写以下宏一百次。

%quint(dsn=cc1, var=MB, quintvar=MB5, num=111) ;    
%quint(dsn=cc1, var=MB, quintvar=MB5, num=112)  ;  
%quint(dsn=cc1, var=MB, quintvar=MB5, num=113) ;
-
- 
%quint(dsn=cc1, var=MB, quintvar=MB5, num=400)  ;  

每次我为这份工作制作一个程序时,num被识别为一个arugment而不是常数。 我怎样才能做到这一点简单易行?

2 个答案:

答案 0 :(得分:0)

您可以使用RETAIN语句和CALL EXECUTE。

%macro quint (dsn, var, quintvar, num);
    %put &dsn;
    %put &var;
    %put &quintvar;
    %put #
%mend;

data _null_;
    retain numv 111;
    do until (numv = 400);
        call execute ('%quint(cc1, MB, MB5,'||numv||')');
        numv+1;
    end;
run;

这很有效。

答案 1 :(得分:0)

使用调用执行通常是可以的,但它可能有点繁琐地使引用正确,我发现它有时无法正确处理复杂的宏。我更喜欢使用宏方法,通过重写原始宏来接受循环开始和结束的参数,或者通过编写包装宏,例如。

%macro quint (dsn, var, quintvar, num);
    %put &dsn;
    %put &var;
    %put &quintvar;
    %put #
%mend;

%macro run_quint(dsn, var, quintvar, num_from, num_to);
    %local i;
    %do i = &num_from %to &num_to;
        %quint(dsn=&dsn, var=&var, quintvar=&quintvar, num=&i)
    %end;
%mend;

%run_quint(dsn=cc1, var=MB, quintvar=MB5, num_from=111, num_to = 115);