2017-07-10 98 views
0

我的循环只进行1次迭代。我应该创建三个宏变量:var1 = Month1,var2 = Month2,以及var3 = Month3 if qtr = qtr1。当我用Put语句检查它时,我的循环只创建var1 = Month1和I = 1。这只是一个迭代,所以我不知道我做错了什么。宏直到循环在SAS

%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); 
+0

您发布的程序将永远不会运行%DO循环,因为%IF语句中的条件将为FALSE。 – Tom

回答

0

您的%DO循环将永远不会运行给定您为宏指定的QTR参数的输入。你可以打开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); 
+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语句)。

+0

我可以做些什么来使它们在宏观之外存在? –

+0

另外,感谢您的帮助! –

+0

明白了!谢谢! –

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为全局变量则只有当条件会通。