在SAS中宏直到循环

时间:2017-07-10 13:49:35

标签: macros sas sas-macro

我的循环只进行了1次迭代。我应该创建三个宏变量:var1 = Month1,var2 = Month2,如果qtr = qtr1,var3 = Month3。当我用Put语句检查时,我的循环只创建var1 = Month1和I = 1。它只进行一次迭代,所以我不确定我做错了什么。

%Let qtr = qtr1;

%Macro Firstqtr(qtr);

%Let I = 1;

%If &qtr = qtr1 %then %do %until (&I > 3);

%Let var&I = Month&I;

%let I = %eval(&I + 1);

%end;

%Mend Firstqtr;

%Firstqtr(qtr);

3 个答案:

答案 0 :(得分:0)

问题是宏变量范围之一。 qtr在全局(line1)和本地(作为宏参数)中定义,因此使用本地(空)字符。

尝试在参数中传递它,如下所示:

%Let qtr = qtr1;

%Macro Firstqtr(qtr);
  %Let I = 1;
  %If &qtr = qtr1 %then %do %until (&I > 3);
    %global var&i;
    %Let var&I = Month&I;
    %put var&i=&&var&i;
    %let I = %eval(&I + 1);
  %end;
%mend Firstqtr;

%Firstqtr(&qtr);

请注意,您正在创建的变量具有局部范围 - 要使它们成为全局变量,您可以将它们声明为(%global语句)。

答案 1 :(得分:0)

根据您为宏的QTR参数所做的输入,您的%DO循环将永远不会运行。您可以打开MLOGIC来查看此内容。

1228  options mlogic;
1229  %Firstqtr(qtr);
MLOGIC(FIRSTQTR):  Beginning execution.
MLOGIC(FIRSTQTR):  Parameter QTR has value qtr
MLOGIC(FIRSTQTR):  %LET (variable name is I)
MLOGIC(FIRSTQTR):  %IF condition &qtr = qtr1 is FALSE
MLOGIC(FIRSTQTR):  Ending execution.

如果要传入qtr1作为值,请在宏调用中对其进行硬编码。

%Firstqtr(qtr1);

或者您可以在之前定义的宏变量中调用您的调用。

%let qtr=qtr1;
%Firstqtr(&qtr);

如果使用命名参数调用宏,它可能会使参数值与具有相同名称的外部宏变量的值区分开来。 注意:即使对于在宏定义中定义为位置的参数,您也可以在宏调用中使用参数名称。

%Firstqtr(qtr=&qtr);

答案 2 :(得分:0)

option mprint;
%global qtr;
%Let qtr = qtr1;

%Macro Firstqtr(qtr);

%Let I = 1;

%If &qtr = &qtr  %then %do %until (&I > 3);

%Let var&I = Month&I;

%let I = %eval(&I + 1);

%end;
%put &var1 &var2 &var3;

%Mend Firstqtr;

%Firstqtr(qtr);

你必须将qtr声明为全局变量,然后只传递if条件。