2017-05-03 19 views
0

私はSASマクロの書き方が初めてで、次のインスタンスのコードを書くのに苦労しています。SAS:ifループ内の変数の定義

%let DateOfInterest= "15jul2016"d; 
%let yearyyyy=%sysfunc(putn(&DateOfInterest,year4.)); 
%let yearyyyy2=eval(yearyyyy+1); 


data _null_; 

if "01JAN2016"d<=&DateOfInterest<="31MAR2016"d then do; 
%let reportdate="31MAR2016"d; 
%let reportdate2="01APR2016"d; 
%let reportdate3="01JAN2016"d; 
%let QuarterOfInterest=Q1; 

if "31MAR2016"d<&DateOfInterest<="30JUN2016"d then do; 
%let reportdate="30JUN2016"d; 
%let reportdate2="01JUL2016"d; 
%let reportdate3="01APR2016"d; 
%let QuarterOfInterest=Q2; 

if "30JUN2016"d<&DateOfInterest<="30SEP2016"d then do; 
%let reportdate="30SEP2016"d; 
%let reportdate2="01OCT2016"d; 
%let reportdate3="01JUL2016"d; 
%let QuarterOfInterest=Q3; 

if "30SEP2016"d<&DateOfInterest<="31DEC2016"d then do; 
%let reportdate="31DEC2016"d; 
%let reportdate2="01JAN2017"d; 
%let reportdate3="01OCT2016"d; 
%let QuarterOfInterest=Q4; 
end; 
end; 
end; 
end; 
run; 

コードは問題なく実行されます。しかし、DateOfInterestを選択した場合、reportdate変数は最後のifループで指定された変数になります。 reportdatesをDateOfInterestに沿って可変にするためにコードを変更する方法はありますか?

ありがとうございました。

答えて

1

マクロをデータステップと組み合わせて動作させない方法です。マクロ言語とデータステップ言語は、基本的には無関係です。マクロ言語はデータステップコードを書くことができますが、その逆もありますが、お互いには一般的に影響しません。

特に、マクロセットは、データセットが開かれるか、データステップコードがコンパイルまたは実行される前に、まずコンパイルされて実行されます。これがポイントです。実際には、データストアコードの事前コンパイルを記述することができます。

だから

マクロ%レットが最初に発生するので、動作しません
if ... then do; 
    %let something 
end; 

、その後のデータのステップが起こります。

%if ... %then %do; 
    %let something 
%end; 

これはすべてマクロ言語であるため、動作します。一般に、開始時に%がない場合、それはマクロ文/関数ではなく、マクロ言語では機能しません。

あなたがやっていることはもう少し複雑です。 %ifを使用するにはマクロを使用する必要がありますが、スコープの問題もあります。

したがって、このような一般的な小さなマクロは次のようになります。それはグローバルではありませんので、あなたは、マクロ内の1行を必要とするので:

%global mval0 mval1 mval2; 

動作しません

%let mval=1; 
%macro set_things; 

    %if &mval=1 %then %do; 
    %let mval1=1; 
    %end; 

    %else %if &mval=2 %then %do; 
    %let mval2=1; 
    %end; 

    %else %do; 
    %let mval0=1; 
    %end; 
%mend; 

%set_things(); 

%put &=mval &=mval0 &=mval1 &=mval2; 

お知らせそれは、SASにグローバルエリアで利用可能にするよう指示します。

+0

こんにちは。あなたの応答のために多くのありがとう。 %グローバル式を正しく理解しているかどうかはわかりません。ただし、上記のサンプルを使用しても、最後のループ(%put&reportdate =&reportdate2 =&reportdate3 =; "31DEC2016" d = "01JAN2017" d = "01OCT2016" d =)で定義された値を使用します。私は、なぜレポートが正しいループに従わず、最後の可能な値をとるのか理解できません。これで私を助けてくれますか? – FioravanteL

関連する問題