質問
マクロ内で作成されたすべてのマクロ変数をスコープ内のグローバルにする簡単な方法はありますか?
ie:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
解決
各マクロを事前にグローバルとして宣言する必要なしにこれを実行し、%letステートメントを実行する唯一の方法は、 の代わりにマクロを使用することです %letステートメント。
以下のコードでは、%mylet というマクロを作成します。このマクロの唯一の目的は、引数として渡す名前と値を使用してグローバル変数を作成するタスクです。次に、グローバル変数を定義するすべての場所で、%letの代わりにこのマクロを使用します。
eg。
%global myvar;
%let myvar=2;
次のようになります...
%mylet(myvar、2);
/* Define a macro to declare variables as global */
%macro mylet(var,value);
%global &var;
%let &var.= &value ;
%mend;
/* Test macro */
%macro test;
%mylet(myvar,2);
%mylet(myvar2,12);
%mylet(myvar3,'string');
/* see that they are global inside the macro */
title "Macro scope inside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
%mend;
%test;
/* Check to see if they are still global outside the macro */
title "Macro scope outside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
他のヒント
オープンコード内でマクロ変数を作成すると、マクロ変数がグローバルマクロシンボルテーブルに自動的に追加されます。
%let x=1;
%let y=1;
%let z=1;
これは、より大きなマクロを作成する前 です。
%macro x;
<code here>
%mend x;
別の方法は、データステップを使用して変数を作成することです。
data _null_;
set LIB.DSET;
x = 1;
call symput('x',x);
run;
データステップ内にマクロ変数を作成し、そのデータステップがマクロ内にある場合、作成されるマクロ変数はデフォルトでそのマクロのスコープ内でローカルになります。
使用
call symputx('macvar',macval,'g');
グローバルマクロ変数を作成します。
所属していません StackOverflow