Я считаю, что это, по сути, то, что вы ищете.Имейте в виду, что механизм EXCEL будет создавать листы и диапазоны указанных имен, но это обычно не имеет значения.
По сути, обрабатывая оба файла как библиотеки, можно перебирать элементы библиотеки во входном файле.(входная библиотека), воссоздавая их под тем же именем в выходном файле (выходная библиотека).
Имейте в виду, этот код не очень надежен и выдает ошибку, если выходной файл уже существует.Можно включить автоматическое удаление и создание нового файла, но, по-видимому, предпочтительнее ошибиться из-за осторожности.Кроме того, если имена листов содержат пробелы или специальные символы, это может вызвать некоторые проблемы с итерацией.Например, наличие листа с именем «Лист 1» приведет к тому, что «ii» будет выполнять итерации по «Листу» и «1» по отдельности.
%macro loop_over_sheets(in_file, out_file);
libname in_lib excel "&in_file.";
libname out_lib excel "&out_file.";
%local ii ds_name ds_names;
/* Get the dataset names. */
proc sql noprint;
select memname into :ds_names separated by ' '
from dictionary.members
where upcase(LIBNAME) = 'IN_LIB';
quit;
%do ii = 1 %to %sysfunc(countw(&ds_names.));
%let ds_name = %scan(&ds_names., &ii.);
data out_lib.&ds_name.;
set in_lib."&ds_name.$"n;
/* ... your code here ... */
run;
%end;
libname in_lib clear;
libname out_lib clear;
%mend loop_over_sheets;
%loop_over_sheets(&file., &filepath.cleaned.xlsx);
В последней строке используются указанные макропеременные file и filepath из вашегопример.Изменить по необходимости.