2009-03-05 22 views
3

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

すなわち:

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

本当にやりたいですか?既存のグローバルマクロ変数をローカルのマクロ変数と一緒に使用することができます。そしてあなたはこれを暗黙のうちに行う方法を求めています!マクロで使用するすべての変数を%LOCAL(never%GLOBAL)宣言することをお勧めします。 –

+3

私はチャンチョンさんと全く同意します。これを標準的な方法にすれば、あなた自身や他人のために簡単に問題を引き起こすことができます。絶対に行う必要がある場合は、偶然に上書きされないように接頭辞を使用して名前を付けるようにしてください。 –

答えて

5

時間のグローバル先駆けとして各マクロを宣言してから%のlet文を行うことなく、これを行うには、私は考えることができる唯一の方法でありますマクロを使用するには%letステートメントの代わりにを使用します。

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

例えば、

%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; 
+0

辞書テーブルを照会するのではなく、次のようにします。 %put _global_;または%put _local_;グローバルおよびローカルマクロ変数(およびその値)のリストを表示します。また、%put _user_;を実行することもできます。ユーザー定義のマクロ変数(および値)のみを表示します。 –

+1

確かに本当に本当です。この場合、辞書表を使用することを選んだのは、人々がこれらの表にあまり慣れていないことがわかったからであり、探索するために他の人に新しいことを与えてくれることを望んでいました。また、他のどの変数が定義されていても、出力の3つの変数を簡単に分離することができます。 – cmjohns

4

あなたが開いてコード内でマクロ変数を作成した場合、マクロ変数は自動的にグローバルマクロシンボルテーブルに追加されます。

%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; 
+1

'' g''パラメータで 'call symputx()'を使う方が良いでしょう。 –

3

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

グローバルマクロ変数を作成するために使用

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

+0

本当ですか?それを証明するコードを提供できますか? –

関連する問題