2016-04-04 18 views
0

うまくいけば、これを明確に説明することができます。私はSAS 8.2(私の会社が使用しているもの)を使用していて、create_varマクロで作成された&のop_var_nameという変数名を取得しようとしています。これは、run_loopsマクロが実行されるたびに変更されます。例では、ds_split_listデータセットに基づいてlist_detail1、list_detail2およびlist_detail3を作成します。後でコードでこれらの変数を使用する必要があります。私はそれを動作させるようには見えません。 run_loopsとcreate_varマクロに%global & op_var_nameを追加しようとしました。ログにはrun_loopセクションのデータを含む変数が表示されますが、変数が参照されるときにコードの後ろにブランクが表示されます。SASネストマクロ、可変外部マクロの使用方法

%macro create_var(ds_in=, item_to_list=, op_var_name=); 

data &op_var_name; 
set &ds_in end=eof; 
length gen_list $30000.; 
retain gen_list; 
if not eof then do; 
    gen_list=trim(left(gen_list))||"'"||trim(left(&item_to_list))||"'"|| ","; 
end; 
if eof then do; 
    gen_list=trim(left(gen_list))||"'"||trim(left(&item_to_list))||"'"; 
    call symput("gen_name",trim(left(gen_list))); 
    output; 
end; 
run; 


%put &op_var_name=&gen_name ; 


%mend create_var; 

data _null_; 
set ds_split_list; 
call symput ('nobs', _n_); 
call symput ('ds_feed'||left(_n_),memname); 
call symput ('item_to_list', 'lotlabel'); 
call symput ('op_var_name'||left(_n_), 'list_detail'||left(_n_)); 
run; 


%macro run_loops; 
    /* &nobs and all the "&&var&i" variables defined above */ 
    %do i = 1 %to &nobs; 
     %create_var(ds_in=&&ds_feed&i, item_to_list=&&item_to_list, op_var_name=&&op_var_name&i); 
    %end; 
%mend run_loops; 

%run_loops; 


/* Later in the code is where I reference the variable created above. */ 

%get_oper(list=&list_detail1); 

ありがとう!

編集:Tomの応答からこのオプションを使用して終了しました。

または、サブマクロで変数を作成するときに変数をグローバルにすることができます。

%global &op_var_name; 
%let &op_var_name=&gen_name ; 

答えて

2

あなたは入力ミスや論理エラーがあるようです。入力ミスは、%LETステートメントではなく、%PUTステートメントが内部マクロにあることです。したがって、作成される唯一のマクロ変数は、GEN_NAMEという名前の変数であり、解析変数の名前が付けられた変数ではありません。この行に変更してください。

%let &op_var_name=&gen_name ; 

あなたが持っているロジックの問題は、それがローカルになってたときにマクロが終了消え、デフォルトではので、新しいマクロ変数へのあなたの最初の参照は、内部マクロ内であるということです。マクロを呼び出す前に、まずマクロ変数を定義することができます。

%let &&op_var_name&i=; 
%create_var(ds_in=&&ds_feed&i, item_to_list=&&item_to_list, op_var_name=&&op_var_name&i); 

サブマクロで作成した変数をグローバルにすることもできます。

%global &op_var_name; 
%let &op_var_name=&gen_name ; 

CALL SYMPUTX()を使用して、追加のGEN_NAMEマクロ変数を削除することもできます。

call symputx("&op_var_name",gen_list,'global'); 

マクロ変数に加えて、これらの個々のデータセットが本当に必要ですか?別のデータセットを作成せずに入力データセットから直接マクロ変数を作成するだけではどうですか?

proc sql noprint ; 
    select "'"||trim(left(&item_to_list))||"'" 
    into :&op_var_name separated by ',' 
    from &ds_in 
    ; 
quit; 
+0

投稿を更新しましたが、私はSAS 8.2を使用しています。 symputxオプションがなくなります。私が間違っていない限り、%letオプションはどちらもうまくいきませんでした。あなたが%create_varマクロの前に%letを持っている質問は、私もそれを設定していますか?私が好きなsqlオプションですが、私が投稿しなかったコードをさらに変更する必要があります。 – Tony

+0

8.2でも、グローバルスコープのMacro-Varsを宣言できるはずです。あなたのマクロの始めに追加してください: '%GLOBAL op_var_name;' – Jetzler

+0

答えに '%GLOBAL'を追加しました。 – Tom

0

マクロ変数スコープ。マクロの外側で使用する場合は、グローバルとして宣言します。 symputxにはスコープを指定する3番目のパラメータがあります。

関連する問題