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");
・
・
・
-
sheet_interval='table'
でシート切り替えポジションをテーブルに指定。 -
ods exclude all;
でアウトプットウインドウへ表示をオフ。 -
data _null_;
からrun;
は実際には表示されなくなる。内容はぶっちゃけなんでもいい。 - テーブル自体は作成されるので、テーブル直後で次のシートに切り替えが有効になっている。
-
ods select all;
で再度アウトプットウインドウへの表示をオン。
これでダミーテーブル前後のods excel
のsheet_interval
の設定がなんであろうと、ダミーテーブルがシート間を分けるポジションとなる。
終わりに
このダミーテーブルをマクロ化して置くと便利。
これで晴れてマクロ化ができたのでめでたしめでたし、、な訳あるかい。
ods excelは現状ベストだけど、まだまだ十分な機能が揃っているとは思えない。
あと公式ドキュメントももう少し図やコード増やしてわかりやすくして欲しい、、。
SASェ、、、。
質問、間違いなどがあればコメントください。