SAS宏:在一个Excel文件中将表格导出到不同的工作表



SAS初学者。我做了一个宏,从不同库的数据集创建表(每年有一个库(。proc tabulate部分工作良好。我的问题是,我想将每个表导出到同一Excel文件中的一个工作表,并且每个工作表都标记有宏变量";年";。最后,我想要一个Excel文件,里面有20、19、18、17、16、15和14页。

我通过插入一个ods tagsets.excelxp命令来尝试这一点,因为这是导出命令,它也在语法的其余部分中使用;"继承";。结果是一个Excel文件,其中有一张名为"&年"(不是"14"(和来自上一次宏调用(第14年(的数据。

有人知道如何解决这个问题吗?此外,我也很乐意提出一种比调用宏7次更优雅的方式。就像在一张年份表上循环一样。

%macro MyMacro (year = );
%local indsn;
%let indsn=path&year..myfile1;

ods tagsets.excelxp File='P:FolderFolderFolderMyMacro.xls'  style=statistical options(sheet_name='&year.'); 
proc tabulate data=&indsn;
class var1 var2;
table var1 all, var2 all/printmiss;
title "var1 and var2, year: &year.";
run;
ods tagsets.excelxp close;

%mend MyMacro;

%MyMacro(year=20)
%MyMacro(year=19)
%MyMacro(year=18)
%MyMacro(year=17)
%MyMacro(year=16)
%MyMacro(year=15)
%MyMacro(year=14)

对于这类内容,通常使用BY语句。

proc sort data=sashelp.cars out=work.cars;
by origin;
run;
ods excel file="path/file.xlsx";
proc tabulate data=work.cars;
by origin;
class make type;
table make all, type all / printmiss;
run;
ods excel close;

ODS语句告诉SAS ODS输出的目的地。这取决于您的系统和许可证,您可以使用哪个excel导出。我选择了excel而不是excelxp,因为它生成的是xlsx而不是xls

BY语句将输出分组到不同的表中,并将输出写入不同的excel表中。

此外,宏并不是真正需要的。如果输入数据集的名称正确(例如basename_year(,您可以使用将所有数据集读取到一个数据集中

data all_years;
set basename_: indsname=dsn;
run;

然后如果CCD_ 11字符串不包含在每个单独的数据集中,则使用该字符串来提取年份。

最新更新