うまくいけば、これを明確に説明することができます。私は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 ;
投稿を更新しましたが、私はSAS 8.2を使用しています。 symputxオプションがなくなります。私が間違っていない限り、%letオプションはどちらもうまくいきませんでした。あなたが%create_varマクロの前に%letを持っている質問は、私もそれを設定していますか?私が好きなsqlオプションですが、私が投稿しなかったコードをさらに変更する必要があります。 – Tony
8.2でも、グローバルスコープのMacro-Varsを宣言できるはずです。あなたのマクロの始めに追加してください: '%GLOBAL op_var_name;' – Jetzler
答えに '%GLOBAL'を追加しました。 – Tom