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



所以我正在尝试编写一个宏,将我的 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 ;

只需在写入数据的步骤中添加更多逻辑即可使其也写入名称。

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)" ;

相关内容

最新更新