Макропроцессор рассматривает все как строку.Вы не можете преобразовать строку 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);