Help us understand the problem. What is going on with this article?

【SAS】ods excel でエクセルのシート間区切り位置を設定する。

SAS のアウトプットウインドウに表示される内容をエクセルに吐き出したい状況は割とよくある。

DDEや proc exportでデータセットの出力をすることができるが、先述のアウトプットウインドウに近い出力は期待できない。

ではどうするか。

ods excel を使う。

2019/3月時点ではベスト。

ただしods excelを使う時の壁があり、それはシートをどこで区切るかを明示しなければならないことだ。

ods excel file='パス\アウトプット先エクセル.xlsx'    
    options(
        sheet_interval = 'proc'
    );

proc print data=sashelp.class(obs=5);
run;

ods excel close;

上記のsheet_intervalの設定だと、proc printでデータセットをエクセルに吐き出した直後でシートが切り替わる。

また、
(SHEET_INTERVAL= 'BYGROUP' | 'PAGE' | 'PROC' | 'NONE' | 'NOW' | TABLE’)が選択できる。

しかし、これだと毎回シート切り替えポジションを考慮しなくてはならず、マクロでシート毎に異なるアウトプットをしたい時に対応できない。

ダミーテーブルでシート切り替えを行う。

妥協案を探して見た結果がこれ。

アウトプットウインドウに表示されないテーブルを置く。
トリック臭い感は否めないがもっとも楽な対応だと思う。

詳細はこちら(英語)→ ODS excel & multiple sheets

ods excel options(sheet_interval="none");
 ・
 ・
 ・

/* Add dummy table start */
ods excel options(sheet_interval="table");
ods exclude all;
data _null_;
file print;
put _all_;
run;
ods select all;
/* Add dummy table end */

ods excel options(sheet_interval="none");
  ・
  ・
  ・
  1. sheet_interval='table'でシート切り替えポジションをテーブルに指定。
  2. ods exclude all; でアウトプットウインドウへ表示をオフ。
  3. data _null_; から run; は実際には表示されなくなる。内容はぶっちゃけなんでもいい。
  4. テーブル自体は作成されるので、テーブル直後で次のシートに切り替えが有効になっている。
  5. ods select all; で再度アウトプットウインドウへの表示をオン。

これでダミーテーブル前後のods excelsheet_intervalの設定がなんであろうと、ダミーテーブルがシート間を分けるポジションとなる。

終わりに

このダミーテーブルをマクロ化して置くと便利。
これで晴れてマクロ化ができたのでめでたしめでたし、、な訳あるかい。

ods excelは現状ベストだけど、まだまだ十分な機能が揃っているとは思えない。

あと公式ドキュメントももう少し図やコード増やしてわかりやすくして欲しい、、。

SASェ、、、。

質問、間違いなどがあればコメントください。

TakahiroNozawa
ビジネス寄りITエンジニア。データ処理がメインの仕事です。基本姿勢は課題・問題ありき。その解決に必要なスキルを必要なだけ取得することがポリシー。会社勤め&MillionTackles代表
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away