Macros SAS中的宏Do直到循环

Macros SAS中的宏Do直到循环,macros,sas,sas-macro,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&am

我的循环只进行了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);

这是一个宏观变量范围的问题
qtr
是全局(第1行)和局部(作为宏参数)定义的,因此使用局部(空)参数

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

%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
语句)。

如果您为宏的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);

您必须将qtr声明为全局变量,然后只有if条件才会通过。

如何使它们存在于宏之外?现在就知道了!谢谢对不起,我想现在明白了!您发布的程序将永远不会运行%DO循环,因为%IF语句中的条件将为FALSE。很好的提示,我没有意识到关于位置参数!
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);