2016-06-08 100 views
0

我试图将变量值从数据集传递到宏,并在do循环中使用它。使用SYMGETN指定要在%DO语句中循环的次数

data work.b; 
    set work.a; 

    if _N_ = 1 then call symput('foo', foo_var); 
run; 

%macro bar(max_loop_count); 
    %do i = 1 %to &max_loop_count; 

     * Some data steps here ; 

    %end; 
%mend; 

%bar(symgetn('foo')); 

不过,我得到这个错误:

ERROR: Required operator not found in expression: &max_loop_count 
ERROR: The %TO value of the %DO I loop is invalid. 
ERROR: The macro BAR will stop executing. 

我在做什么错在这里?

+0

是否有一个特殊的原因,使用symgetn而不是&foo在macrocall? http://www.lexjansen.com/nesug/nesug04/pm/pm13.pdf在页面顶部它说:“相反,SYMGET是一种SAS语言 函数 ,它返回一个宏变量的 值到DATA步骤执行期间的DATA步骤“。我的猜测是symgetn函数只能在datastep中执行,所以你不能在宏调用中使用它。但是我不能用更多的参考来备份,所以我只发表这个评论。 – kl78

回答

2

您的宏调用将导致%DO循环具有此上限symgetn('foo')。你不能在宏代码中使用SYMGETN(),因为它是一个数据阶跃函数,所以这就是为什么你得到一个错误,即上界不是数字。

只需在宏调用中传递宏变量的值即可。

%bar(&foo); 
+0

是的,这是正确的答案。不能相信我错过了这一点。 –