如何通过DDE将Sas数据集标题导出到Excel工作表

时间:2018-05-06 10:45:41

标签: macros sas sas-macro dde

所以我正在尝试编写一个将我的sas数据集导出到现有excel表的宏。我正在使用以下代码,我在其中一篇SUGI论文中找到了这些代码。问题是以下代码成功完成了工作,但它无法复制将标题(变量名称)粘贴到excel并只粘贴所有观察结果。如何让我的代码也将标题(变量名称)粘贴到excel

%MACRO EXCELOUT(SDS=,XLSSHT=,XLSF=, ROW=,COL= ) ;

PROC CONTENTS DATA=&SDS NOPRINT OUT=CNT ;
RUN;
PROC SORT DATA=CNT ;
BY VARNUM ;
RUN;

PROC SQL NOPRINT;
SELECT NAME
INTO: VARS SEPARATED BY ' '
FROM CNT ;
SELECT COUNT(DISTINCT NAME)
INTO: COLS SEPARATED BY ' '
FROM CNT ;
SELECT NOBS
INTO: ROWS
FROM CNT
WHERE VARNUM = 1;
QUIT;

OPTIONS NOXWAIT NOXSYNC ;
X "&XLSF" ;

DATA _NULL_ ;
X=SLEEP(5);
RUN ;

FILENAME TEMP DDE "EXCEL|&XLSSHT.!R&ROW.C&COL.:R%TRIM(%EVAL(&ROWS+&ROW1))C%TRIM(%EVAL(&COLS+&COL)" ;

DATA _NULL_ ;
SET &SDS ;
FILE TEMP ;
PUT &VARS ;
RUN ;

FILENAME CMDS DDE 'EXCEL|SYSTEM' ;
DATA _NULL_ ;
FILE CMDS ;
PUT '[SAVE()]' ;
PUT '[QUIT()]' ;
RUN ;

%MEND EXCELOUT ;

1 个答案:

答案 0 :(得分:1)

只需在写入数据的步骤中添加一点逻辑,让它也写出名称。

data _null_ ;
  file temp ;
  if _n_=1 then do;
    do _n_=1 to &cols ;
      set cnt(keep=name rename=(name=__name__)) ;
      put __name__ @;
    end;
    put;
  end;
  set &sds ;
  put &vars ;
run ;

获取变量名称和计算行数和列数的代码也可以更简单。

proc sql noprint;
 select nobs
      , name
   into :rows trimmed
      , :vars separated by ' '
   from cnt
 ;
 %let cols = &sqlobs ;
quit;

您的FILENAME语句不需要%TRIM(),并且缺少为标题添加一行所需的+。使它看起来像引用&row1而不是&row

filename temp dde "excel|&xlssht.!r&row.c&col.:r%eval(&rows+&row+1)c%eval(&cols+&col)" ;