2011-08-10 15 views
2

私のコードでは、多くのレベルで多くのマクロが使用されています。マクロ変数の大部分は同じ(日付)ですが、異なる日付のマクロを実行したい場合があります。変数が衝突します。sasマクロですべての変数をローカルに作成する方法は?

マクロに表示されるすべての変数が、%ローカルを何度も使用せずにローカルでなければならないことをどのように記述できますか?ネストされたマクロの場合、より深いレベルの変数の値は、上位レベルの変数を感染させます。

+0

サンプルコードを記入してください。マクロがどのように作成されているかを表示すると、より多くのアドバイスを与えることができます。 –

答えて

1

毎回%ローカルで明示的にリストする必要があります。残念ながら、ショートカットはありません。

ネストされたマクロのトラブルシューティングで問題が発生した場合は、自分の標準を変更して、決してマクロの(入力)パラメータの値を変更しないでください。この単純な概念は、デバッグをはるかに簡単にします。

マクロに%includeステートメントがある場合、 'option source2'を追加すると、これらのソースコードもログに表示されます。

乾杯 ロブ

1

別のオプションは、マクロ文のライン上のマクロパラメータとして変数を定義することです。以下は、DATEという名前のグローバルマクロ変数を作成し、DATEという名前のマクロを定義する単純なプログラムです。さらに、マクロは異なる日付値(1)で自身を呼び出します。

options nosource nonotes; 
%let date = '01jan2011'd; 
%put Global DATE = &date; 

%******************************************************************************; 
%macro test_macro_level(date=,nest_level=); 

    %put INSIDE MACRO - Nest Level=&nest_level : DATE=&date; 

    %if %eval(&nest_level = 1) %then %do; 
     %test_macro_level(date='01mar2011'd,nest_level=2); 
     %put INSIDE MACRO, AFTER NESTING - Nest Level=&nest_level : DATE=&date; 
    %end; 

%mend test_macro_level; 
%******************************************************************************; 
%test_macro_level(date='01feb2011'd,nest_level=1); 

%put Return to Global: Date=&date; 

ログファイルは、読み取ります

Global DATE = '01jan2011'd 
INSIDE MACRO - Nest Level=1 : DATE='01feb2011'd 
INSIDE MACRO - Nest Level=2 : DATE='01mar2011'd 
INSIDE MACRO, AFTER NESTING - Nest Level=1 : DATE='01feb2011'd 
Return to Global: Date='01jan2011'd 

は、(1)は、反復マクロは参考用のみで、決して独自のコードを汚染しなければならないことに注意してください。

関連する問題