Единственный способ, которым я могу придумать, это сделать без необходимости заранее объявлять каждый макрос глобальным, а затем выполнить оператор% 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;