宏处理器将所有内容都视为字符串。不能转换字符串
datelist{i}
变成日期值。
看起来您想要一个宏,它可以接受一个字符串列表作为输入,该字符串的格式可以转换为日期值,并使用这些字符串调用另一个宏。
%macro call(date_list);
%local i yrmon yr mon;
%do i=1 %to %sysfunc(countw(&date_list));
%let yrmon=%sysfunc(inputn(%scan(&date_list,&i),date11.),yymmn6.);
%let yr=%substr(&yrmon,1,4);
%let mon=%substr(&yrmon,5);
%datapull(&yrmon., &yr., &mon.);
%end;
%mend;
%call(31MAR2019 01JAN2019);
如果您希望从开始到结束每个月处理一次,那么您需要一个具有不同输入的不同宏。在这种情况下,您只需要两个输入,每个输入只能有一个值。
这次让我们对它进行编码,以便提供有效日期值的负担落在宏的调用方上,而不是接受需要转换为日期的字符串。
%macro call(start,end);
%local i yrmon yr mon;
%do i=0 %to %sysfunc(intck(month,&start,&end));
%let yrmon=%sysfunc(intnx(month,&start,&i),yymmn6.);
%let yr=%substr(&yrmon,1,4);
%let mon=%substr(&yrmon,5);
%datapull(&yrmon., &yr., &mon.);
%end;
%mend;
%call("01JAN2019"d,"31MAR2019"d);