Hi,
as it has been said you do not Need a macro to perform this Kind of Operation.
For Demonstration purpose there are 2 ways to run a macro inside a data step: dosubl and call execute.
dosubl:
%macro valor (var_1, var_2);
%do i=1 %to %eval(&var_2);
%if &i=1 %then %let valor_final = &var_1. ;
%else %let valor_final = &valor_final., &var_1. ;
%end;
%put &=valor_final;
%let valor_final = %sysfunc(sum(&valor_final.));
%put &=valor_final;
%mend valor;
data test;
set sashelp.class;
valor_1=weight;
valor_2 = age;
rc = dosubl('%global valor_final; %valor('||put(valor_1,best.)||','||put(valor_2,best.)||')');
var_final=symget('valor_final');
rc = dosubl('%symdel valor_final');
keep va: rc:;
run;
proc print;run;
call execute:
%macro valor (var_1, var_2);
%local valor_final;
%do i=1 %to %eval(&var_2);
%if &i=1 %then %let valor_final = &var_1. ;
%else %let valor_final = &valor_final., &var_1. ;
%end;
%put &=valor_final;
%let valor_final = %sysfunc(sum(&valor_final.));
%put &=valor_final;
&valor_final.
%mend valor;
data test1;
set sashelp.class end=last;
valor_1=weight;
valor_2 = age;
if _N_ eq 1 then call execute('data test2;');
call execute('var_final=%nrstr(%valor('||put(valor_1,best.)||','||put(valor_2,best.)||'));output;');
if last then call execute('run;');
run;
proc print;run;
Give them a try and have fun with it 🙂
... View more