質問

マクロ内で作成されたすべてのマクロ変数をスコープ内のグローバルにする簡単な方法はありますか?

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'); 

グローバルマクロ変数を作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top