根据字段值将一个SAS表导出到多个Excel工作表中

时间:2017-03-02 17:30:57

标签: excel sas

我尝试根据字段值(parent_account)将一个SAS表导出到多个Excel工作表中。我希望每个工作表的名称与parent_account相同。我使用了http://www.tek-tips.com/viewthread.cfm?qid=1335588中的以下代码,但我收到了以下错误消息:

在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。 参数2到宏功能%SCAN不是数字。

%macro export_to_excel();
%local varlist idx var;

proc sql noprint;
  select distinct parent_account into: varlist separated by '||'
  from todays_activity;
quit;

%let idx = 1;
%do %while ( %scan(&varlist, &idx, %str(||)) ne %str() ); 
    %let var=%scan(&varlist, &idx, %str(||));
    proc export data=sashelp.class (where=(parent_account="&var"))
       outfile='My file location\Report.xls'
   dbms=excel; 
   sheet="&var";
quit;
%let idx = %eval(&idx + 1);
%end;
%mend export_to_excel;

%export_to_excel;

2 个答案:

答案 0 :(得分:0)

您可以尝试使用ODS EXCEL。以下是使用SASHELP.CLASS数据集的示例。 首先确保数据按分组变量排序。

proc sort data=sashelp.class out=class ;
  by sex ;
run;

设置ODS以指向目标文件。告诉它为每个BY组创建一个新工作表。

ods excel file="&path/class.xlsx"  ;
ods excel options
(sheet_interval="bygroup"
 suppress_bylines="yes"
 sheet_name='GENDER'
);

您可能还想关闭其他输出目的地。 然后使用PAGEBY选项打印文件。并关闭ODS EXCEL目的地

proc print data=class noobs;
  by sex ;
  pageby sex ;
  var _all_;
run;
ods excel close;

要测试它,您可以尝试将其作为数据重新读取。但要注意它会创建带有嵌入空格的成员名称。

options validmemname=extend;
libname xx xlsx "&path/class.xlsx";
proc copy inlib=xx outlib=work; run;
libname xx clear ;

从SAS日志

NOTE: The data set WORK.GENDER has 9 observations and 5 variables.
NOTE: The data set WORK.'GENDER 2'n has 10 observations and 5 variables.

答案 1 :(得分:0)

这可能会有所帮助

%macro export_to_excel;
    proc sql noprint;
    select distinct parent_account into: varlist separated by '@' from todays_activity;
    select count(distinct parent_account) into:n from todays_activity;
    quit;
    %do i=1 %to &n;
    %let var= %scan(&varlist,&i,"@");
    proc export data=sashelp.class (where=(parent_account="&var"))
           outfile='Your file location\Report.xls'
       dbms=excel; 
       sheet="&var";
    run;
    %end;
    %mend export_to_excel;