SAS-使用宏将结果输出为excel

SAS-使用宏将结果输出为excel,excel,sas,output,Excel,Sas,Output,我使用以下代码将结果导出为excel文件。但是,每次结果都以文件类型输出。我必须手动将其类型更改为excel。我尝试将.xls放在&from.&memname&I之后,但SAS无法识别此格式。我假设可能的原因是.x,但我不知道如何解决这个问题 %macro tradetime(sourcelib=,from=,going=,dir=); proc sql noprint; /*read datasets in a library*/ create table mytables as s

我使用以下代码将结果导出为excel文件。但是,每次结果都以文件类型输出。我必须手动将其类型更改为excel。我尝试将
.xls
放在
&from.&memname&I
之后,但SAS无法识别此格式。我假设可能的原因是
.x
,但我不知道如何解决这个问题

%macro tradetime(sourcelib=,from=,going=,dir=);
proc sql noprint;  /*read datasets in a library*/
  create table mytables as
  select *
  from dictionary.tables
  where libname = &sourcelib
  order by memname ;

  select count(memname) 
  into:obs 
  from mytables;

  %let obs=&obs.;

  select memname
  into : memname1-:memname&obs.
  from mytables;
quit;

  %do i=1 %to &obs.;

  ods tagsets.excelxp file= "&Dir\&&memname&i" /*output the results to target file*/
  style=XLsansPrinter;
  ods listing close;
  ods results off;
  proc univariate data= &from.&&memname&i;
  var  time_l_ ;  
  run;
  quit;

  ods tagsets.excelxp close;
  ods listing ;
  ods results on;
%end;
%mend;

%tradetime(sourcelib='AXP',from=AXP.,going=AXP.,dir=D:\Data\description);

宏变量终止符可能有问题。如果您尝试:

&Dir\&&memname&i.xls
那是行不通的。点是宏变量的终止符,事实上,在您的例子中,您需要不止一个,因为您使用的是两个
&
-所以
&[i]。
是一个宏变量,然后您将
&[memname&i.]
作为第二个宏变量(第一个
&
消失)。因此,您需要:

&Dir\&&memname&i...xls
创建.xls扩展名

请注意,
tagsets.excelxp
不会创建本机excel文件。它创建excel可读的xml文件;因此,如果将
.xls
放在excel上,excel会给您带来一些麻烦(在某些情况下,它会打开,在某些情况下,它会拒绝打开,具体取决于您的设置和excel版本)。如果您支持
.xlsx
文件,并且具有SAS 9.4 TS1M1或更高版本,则最好使用
ods excel