|
|
Windows版SAS 8.2にて、データセットをMS Excelに出力する際に変数ラベルを出力する
[OS]Windows
[リリース] 8.2
[キーワード] DBLOAD, DDE, MS-Excel
[質問]
Windows版SAS 8.2で、SASデータセットをMicrosoft Excel(以下 Excel)に出力しているのですが、Excelの先頭行に変数ラベルを出力することができません。SAS 6.12ではこの機能を設定するオプションが、書出しウイザードにあったのですが、どのようにすればできますか。
[回答]
SAS System 8から、「ファイル」→「データのエクスポート」においてラベルの書出しができなくなりました。変数ラベルをExcelに出力するには、下記の2つの方法があります。
A. 6.12の「書出し」で使用していたDBLOADプロシジャを実行する
B. DDE(Dynamic Data Exchange)を利用する
- この方法の利点と欠点
利点 |
・ | SASデータセットのラベルを従来通り出力できる |
・ | SAS System 8の拡張点を使用できる |
・ | Excel97/2000形式のファイルも出力できる |
|
欠点 |
・ | ウィザードではなく、プログラムを作成して実行する |
・ | EXCELを起動するため、PCのリソースを必要とする |
|
DDEを利用する場合は、実行するプログラムを作成する必要があります。参考のため、Base SAS のSASマクロ機能を利用するサンプルプログラムを以下に示します。
注: 下記の例では、EXCEL2000を使用しています。
%MACRO _sas2xls(dsn,xlsname);
OPTIONS NOXWAIT NOXSYNC;
x "start excel"; /* EXCELを起動 */
DATA _null_;
x=SLEEP(5); /* EXCELの起動を待つためにSASをSLEEP */
RUN;
PROC CONTENTS DATA=&dsn
OUT=_dde1(KEEP=name varnum label nobs)
NOPRINT;
RUN;
PROC SORT DATA=_dde1 OUT=_dde1(DROP=varnum);
BY varnum;
RUN;
DATA _dde1;
SET _dde1 END=last;
IF label=" " THEN label=name;
/* マクロ変数 _name1〜_nameN に変数名を格納 */
CALL SYMPUT('_name'||LEFT(PUT(_n_,8.)),LEFT(COMPRESS(name)));
/* マクロ変数 _lbl1〜_lblN にラベルを格納 */
CALL SYMPUT('_lbl'||LEFT(PUT(_n_,8.)),LEFT(COMPRESS(label)));
IF last=1 THEN DO;
/* マクロ変数 _last にOBS数を格納 */
CALL SYMPUT ('_last',LEFT(COMPRESS(PUT(_N_,8.))));
/* マクロ変数 _obsに元データセットのOBS数を格納 */
CALL SYMPUT('_obs',LEFT(PUT(nobs,8.)));
END;
RUN;
%LET _ddeobs=%EVAL(&_obs+1);
FILENAME export dde "EXCEL|Sheet1!r1c1:r&_ddeobs.c&_last" NOTAB;
DATA _null_;
SET &dsn;
FILE export;
IF _n_ = 1 THEN
PUT %DO num=1 %TO &_last; /* ラベルを出力 */
"&&_lbl&num"
%IF &num ne &_last %THEN %DO;
'09'x
%END;
%END;
;
PUT %DO num=1 %TO &_last; /* 変数値を出力 */
&&_name&num
%IF &num ne &_last %THEN %DO;
'09'x
%END;
%END;
;
RUN;
OPTIONS NOXWAIT XSYNC;
FILENAME data dde 'excel|system';
DATA _null_; /* シートに名前を付けて保存し、EXCELを終了 */
FILE data;
PUT "[SAVE.AS(""&xlsname"")]";
PUT "[QUIT()]";
RUN;
OPTIONS XWAIT XSYNC;
%MEND _sas2xls;
/* 実際の利用 %_sas2xls(データセット,EXCELのファイル名) ; */
%_sas2xls(sashelp.prdsale,c:\temp\test.xls);
|