proc sql noprint; select name into :vars from dictionary.columns where libname=upcase("&yourlibrary") and memname=upcase("&tbl") and name not in("OBS", "TIME");quit;
%macro aa(opt);
%let nvars=%sysfunc(count(&vars));
%do vi=1 %to &nvars;
%let var=%sysfunc(scan(&vars, &vi));
%do i=1 %to 40;
%do lagn=1 %to 12;
&var._&opt&lagn=lag&lagn(&var);
%end;
%end;
%end;
%mend;
proc sort data=a ; by obs;run;
data b;
set a;
%aa(lag);
run;
proc sort data=b; by obs descending;run;
data b;
set b;
%aa(lead);
run;