【问题标题】:Export one SAS table into multiple Excel worksheets based on field value根据字段值将一个 SAS 表导出到多个 Excel 工作表中
【发布时间】:2017-03-02 17:30:57
【问题描述】:

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

在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。 宏函数 %SCAN 的参数 2 不是数字。

%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;

【问题讨论】:

  • 您使用的是什么版本的 SAS。如果您使用的是当前版本,您可以尝试使用 ODS EXCEL 并在为每个 BY 组制作新工作表时进行调整。然后只需将 PROC PRINT 与 BY 语句一起使用。
  • 对不起,我应该提到这一点。我正在使用 SAS Enterprise Guide 7.11。
  • EG 会话连接到的 SAS 版本对于 EG 版本更为重要。
  • 我不确定。有没有简单的验证方法?
  • %put &sysvlong; 我说 9.04.01M3P062415

标签: excel sas


【解决方案1】:

您可以尝试使用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.

【讨论】:

  • 感谢您抽出宝贵时间提供帮助。运行此代码的第二部分后,我收到警告:EXCEL 目标不支持设备“ACTIVEX”。使用设备“ACTXIMG”。
  • 是否仍然制作 XLSX 文件?我认为这仅适用于您尝试制作图表的情况。也许您的 TITLE 或 FOOTNOTE 语句触发了该消息?
  • 它确实制作了一个 XLSX 文件,但它已损坏并且无法打开。
【解决方案2】:

这可能会有所帮助

%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;

【讨论】:

  • 奇怪的是,它运行得很快,只有一个注释,没有警告或错误:注意:编写 TAGSETS.SASREPORT13(EGSR) 正文文件:EGSR。没有创建文件。我错过了一行代码吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多