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プロシジャを実行する

  • この方法の利点と欠点

    利点 ・ SASデータセットのラベルを従来通り出力できる
    欠点
    Excel97/2000形式のファイルは出力できない
    ウィザードではなく、プログラムを作成して実行する
    SAS System 8の拡張点(変数名拡張、1変数あたりの最大文字数の拡張、および変数ラベルの長さ拡張等)を使用できない

  • DBLOADプロシジャのサンプルプログラム
    PROC DBLOAD DBMS=EXCEL DATA=SASUSER.CLASS ; /* データセット名 */
       PATH='c:\temp\class.xls';                 /* ファイル名     */
       PUTNAMES YES;
       LIMIT=0;
       LABEL;
       RESET ALL;
       LOAD;
    RUN;
    

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