3

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

すなわち:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
4

3 に答える 3

5

各マクロを事前にグローバルとして宣言してから %let ステートメントを実行することなく、これを行う唯一の方法は、%let ステートメントの代わりにマクロを使用することです。

以下のコードでは、%myletというマクロを作成します。このマクロは、引数として渡す名前と値を使用してグローバル変数を作成するタスクを唯一の目的としています。次に、グローバル変数を定義したいすべての場所で %let の代わりにこのマクロを使用します。

例えば。

%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;
于 2009-03-06T00:34:56.410 に答える
4

オープン コード内でマクロ変数を作成すると、マクロ変数はグローバル マクロ シンボル テーブルに自動的に追加されます。

%let x=1;  
%let y=1;  
%let z=1; 

これは、より大きなマクロを作成するです。

%macro x;
  <code here>
%mend x;

もう 1 つの方法は、データ ステップを使用して変数を作成することです。

data _null_;
    set LIB.DSET;
    x = 1;
    call symput('x',x);
run;
于 2009-03-05T15:34:59.890 に答える
3

データステップ内にマクロ変数を作成し、そのデータステップがマクロ内にある場合、作成されたマクロ変数はデフォルトで、そのマクロのスコープ内でローカルになります。

使用する

call symputx('macvar',macval,'g'); 

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

于 2009-03-24T11:17:01.127 に答える