2017-07-10 99 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爲全局變量則只有當條件會通。